{
  "schemaVersion": "2025-06-18",
  "serverInfo": {
    "name": "posterly",
    "version": "0.20.6",
    "title": "posterly",
    "description": "Schedule and publish social media posts to LinkedIn, Instagram, X, YouTube, Facebook, Threads, TikTok, Pinterest, and Google Business Profile from any MCP-compatible AI client.",
    "vendor": "posterly",
    "homepage": "https://www.poster.ly",
    "documentation": "https://www.poster.ly/mcp",
    "repository": "https://www.npmjs.com/package/posterly-mcp-server"
  },
  "transports": [
    {
      "type": "http",
      "url": "https://www.poster.ly/api/mcp",
      "wire_format": "json-rpc",
      "auth": "bearer",
      "documentation": "https://www.poster.ly/mcp"
    },
    {
      "type": "stdio",
      "install": {
        "command": "npx",
        "args": [
          "-y",
          "posterly-mcp-server@latest"
        ],
        "env": {
          "POSTERLY_API_KEY": {
            "description": "Optional for public signup tools. Required for authenticated tools after the user completes paid signup.",
            "required": false,
            "acquisition_url": "https://www.poster.ly/agents/signup"
          }
        }
      },
      "pre_auth_tools": [
        "get_agent_signup_info",
        "start_signup",
        "get_signup_session",
        "get_mcp_status"
      ],
      "documentation": "https://www.poster.ly/mcp"
    }
  ],
  "auth": {
    "type": "bearer",
    "protected_resource_metadata": "https://www.poster.ly/.well-known/oauth-protected-resource",
    "token_acquisition_url": "https://www.poster.ly/dashboard/api",
    "requires_subscription": true,
    "subscription_url": "https://www.poster.ly/dashboard/api?upgrade=api_addon"
  },
  "capabilities": {
    "tools": [
      {
        "name": "get_mcp_status",
        "description": "Report the hosted Posterly MCP server version, latest npm version for local app clients, MCP endpoint health, API auth health, and update guidance."
      },
      {
        "name": "whoami",
        "description": "Return the authenticated user, API key scopes, and accessible workspaces. Call this first to confirm auth before any other tool."
      },
      {
        "name": "create_api_key",
        "description": "Create a new Posterly API key for the authenticated user. SECRET-CREATING WRITE: only use after explicit user confirmation. The new key can only request scopes already present on the calling dashboard-created API key; OAuth and managed assistant tokens cannot mint keys."
      },
      {
        "name": "list_accounts",
        "description": "List connected social media accounts. Returns platform, username, account ID, and workspace ID for each."
      },
      {
        "name": "disconnect_account",
        "description": "Disconnect a connected social account from posterly. DESTRUCTIVE and IRREVERSIBLE: this removes the account connection, emits account.disconnected webhooks, and may transfer Instagram scheduled posts to a replacement account. Always call list_accounts first, show the user the exact account/platform/workspace, and get explicit confirmation before calling."
      },
      {
        "name": "get_connect_link",
        "description": "List dashboard handoff links/readiness for connecting accounts, or get one platform connection URL. For a guided user flow with pollable status, call create_connect_session next."
      },
      {
        "name": "create_connect_session",
        "description": "Create a short-lived dashboard handoff session for connecting a social account. Open connect_session.connect_url for the user, then poll get_connect_session so you can narrate progress."
      },
      {
        "name": "get_connect_session",
        "description": "Poll a connect session created by create_connect_session. Read status_message to tell the user what is happening; stop when status is connected, failed, cancelled, or expired."
      },
      {
        "name": "list_oauth_clients",
        "description": "List self-serve OAuth developer clients owned by the user. These are public PKCE clients for third-party app integrations."
      },
      {
        "name": "create_oauth_client",
        "description": "Create a public OAuth 2.1 + PKCE developer client. WRITE: confirm app name, redirect URIs, and scopes with the user before calling."
      },
      {
        "name": "update_oauth_client",
        "description": "Update a self-serve OAuth developer client. WRITE: confirm changed redirect URIs, scopes, and active state before calling."
      },
      {
        "name": "delete_oauth_client",
        "description": "Delete a self-serve OAuth developer client. DESTRUCTIVE: prevents new authorizations for that client_id; existing access tokens remain revocable as API keys."
      },
      {
        "name": "list_platforms",
        "description": "List posterly platform integrations and their posting capabilities, content limits, media limits, settings schemas, helper tools, and analytics support."
      },
      {
        "name": "get_platform_schema",
        "description": "Get the platform schema for a platform or a specific connected account. Use this before creating posts with platform-specific settings."
      },
      {
        "name": "trigger_platform_helper",
        "description": "Run a platform helper for account-specific discovery, such as pinterest.boards, tiktok.creator_info, linkedin.recent_mentions, or x.quota."
      },
      {
        "name": "list_brands",
        "description": "List brands/clients the caller can access. Returns each brand ID, name, workspace ID, source, and how many social accounts are assigned to it."
      },
      {
        "name": "get_brand",
        "description": "Get one brand/client by ID. Returns its workspace, source, linked legacy brand group if present, and the number of social accounts assigned to it."
      },
      {
        "name": "list_brand_accounts",
        "description": "List the connected social accounts assigned to a brand/client. Use this when the user refers to a brand rather than a raw account handle."
      },
      {
        "name": "get_brand_profile",
        "description": "Get the extended brand profile for a brand/client. Returns voice/tone guidance, audience, keywords, dos and don’ts, visual notes, and other saved brand context."
      },
      {
        "name": "list_posts",
        "description": "List upcoming or recent posts. Filter by status (scheduled, published, failed, draft), platform, account_id, or workspace_id."
      },
      {
        "name": "get_post",
        "description": "Get details of a specific post by ID. Returns caption, status, scheduled time, media, and platform info."
      },
      {
        "name": "get_post_missing",
        "description": "Inspect whether a post is missing required content, media, account, platform settings, or metadata before it can publish. Use this to repair failed or imported posts."
      },
      {
        "name": "ask_support",
        "description": "Ask Posterly Support AI an authenticated question using Posterly docs plus read-only account/post diagnostics for the caller workspace. Requires API auth and accounts:read + posts:read scopes. Human ticket creation is a side effect and requires request_human=true and confirm_escalation=true after explicit user confirmation."
      },
      {
        "name": "find_available_slot",
        "description": "Find available time slots for posting. Respects a 1-hour gap between posts and preferred hours. Always pass timezone explicitly (default is America/New_York)."
      },
      {
        "name": "create_post",
        "description": "Schedule or immediately publish one social media post. DESTRUCTIVE WRITE that creates content on the user's connected social account. Always confirm caption + scheduled_at + account_id/workspace with the user before calling. For multiple posts, prefer create_posts_batch after confirming every item."
      },
      {
        "name": "create_posts_batch",
        "description": "Create 1-25 scheduled or immediate social posts in one API request. DESTRUCTIVE WRITE: show the user every post's account/platform, caption or thread text, scheduled time, media, settings, and workspace, then get explicit confirmation for the whole batch before calling. Partial success is possible; failed items return their array index."
      },
      {
        "name": "update_post",
        "description": "Update a scheduled or draft post. DESTRUCTIVE WRITE - overwrites the existing post's caption/media/schedule. Cannot edit published posts. Show the user a side-by-side of CURRENT vs PROPOSED before calling."
      },
      {
        "name": "update_post_status",
        "description": "Pause, resume/schedule, or move a post back to draft. DESTRUCTIVE WRITE: changes whether content will publish. Always fetch with get_post first, show the current status and proposed status/scheduled_at, and get explicit confirmation before calling."
      },
      {
        "name": "update_post_release_id",
        "description": "Set or repair an external release_id and optional group_id on a post. WRITE: call get_post first, show the target post and release/group IDs, then pass confirm=true only after explicit confirmation."
      },
      {
        "name": "delete_post",
        "description": "Delete a scheduled or draft post. DESTRUCTIVE and IRREVERSIBLE. Cannot delete published posts. Always fetch with get_post first and confirm what will be deleted before calling."
      },
      {
        "name": "delete_post_group",
        "description": "Delete every draft/scheduled/failed/paused post matching a caller-defined group_id, post_group_id, api_group_id, or release_id. DESTRUCTIVE: inspect the group first, list affected posts, and pass confirm=true only after explicit confirmation."
      },
      {
        "name": "get_x_posting_quota",
        "description": "Get managed X posting quota, usage, remaining posts, URL-blocking status, and add-on plan info for a workspace."
      },
      {
        "name": "upload_media",
        "description": "Upload an image or video to posterly storage. Returns a URL usable with create_post. Supports JPEG, PNG, GIF, WebP, MP4, MOV, WebM. Images <=10MB, videos <=50MB. Counts against the user's storage quota but does not publish anywhere - that's create_post's job."
      },
      {
        "name": "upload_media_from_url",
        "description": "Fetch an image or video from a public HTTPS URL into posterly storage. Returns a URL usable with create_post. SSRF protections block localhost/private IP targets."
      },
      {
        "name": "create_signed_upload",
        "description": "Create a signed upload URL for a larger image or video. Upload the binary to upload_url; the API validates actual bytes before storage, then public_url can be used with create_post."
      },
      {
        "name": "get_video_options",
        "description": "List read-only Veo video generation options, input modes, durations, resolutions, aspect ratios, and credit-cost estimates. Does not generate video or spend credits."
      },
      {
        "name": "run_video_function",
        "description": "Run a read-only Veo video helper function before generation, such as list_input_modes, estimate_cost, or validate_request. Does not generate video or spend credits."
      },
      {
        "name": "generate_video",
        "description": "Queue a Veo AI video generation job. COSTS VEO CREDITS - confirm prompt, model, duration, resolution, aspect ratio, audio choice, and credit cost with the user before calling. Poll get_video_job for status and final video_url."
      },
      {
        "name": "get_video_job",
        "description": "Get one Veo video job by ID, or list recent video jobs when job_id is omitted. Use after generate_video to poll for completed video_url."
      },
      {
        "name": "generate_captions",
        "description": "Generate or adapt AI caption suggestions for one or more social platforms. Uses AI Caption Assist quota and returns options only; it does not create, draft, schedule, or publish posts."
      },
      {
        "name": "generate_image",
        "description": "Generate an AI image via posterly's Nano Banana (Gemini) integration. Returns a URL usable with create_post. COSTS CREDITS - confirm subject + style + aspect_ratio with the user before calling."
      },
      {
        "name": "get_account_analytics",
        "description": "Get daily analytics snapshots and a period summary for a connected social account. Supports Instagram, LinkedIn, Google Business Profile, and Pinterest. Uses API-provided display_metrics for platform-native dashboard labels. presentation controls output: compact for Telegram/mobile, table for Markdown clients, json for custom chart/card renderers."
      },
      {
        "name": "get_post_analytics",
        "description": "Get per-post engagement metrics (likes, comments, reach, impressions, saves, shares, plays) for a connected account. Supports Instagram, LinkedIn, Google Business Profile, and Pinterest. Most recent posts first. presentation controls output: compact for Telegram/mobile, table for Markdown clients, json for custom chart/card renderers."
      },
      {
        "name": "list_google_business_reviews",
        "description": "List Google Business Profile reviews for one location/account or every accessible GBP location. Supports rating and unanswered-only filters."
      },
      {
        "name": "get_google_business_review_link",
        "description": "Get the direct public Google review link for a connected Google Business Profile location. Requires account_id or location_id."
      },
      {
        "name": "audit_google_business_profile",
        "description": "Run a live local-profile audit for a connected Google Business Profile location, including completeness, categories, media, attributes, reviews, and recommendations."
      },
      {
        "name": "suggest_google_business_review_reply",
        "description": "Generate short, brand-aware AI reply suggestions for a Google review. Uses the AI Caption Assist allowance; does not post the reply."
      },
      {
        "name": "reply_google_business_review",
        "description": "Post or update the owner reply on a Google Business Profile review. WRITE: show the review, location, and exact reply text to the user, then pass confirm=true only after explicit confirmation."
      },
      {
        "name": "delete_google_business_review_reply",
        "description": "Delete the owner reply from a Google Business Profile review. DESTRUCTIVE: confirm the review and location with the user, then pass confirm=true only after explicit confirmation."
      },
      {
        "name": "list_activity",
        "description": "List recent activity and publish events for posts, including status changes, publish attempts, failures, and retries. Use this as the agent notifications feed."
      },
      {
        "name": "list_webhooks",
        "description": "List API webhook subscriptions, their event filters, active state, and most recent delivery status."
      },
      {
        "name": "create_webhook",
        "description": "Create a webhook subscription for post/account/analytics events. WRITE WITH OUTBOUND SIDE EFFECTS: show the user the target URL, workspace, events, and active state, then get explicit confirmation before calling. The response includes the signing secret once."
      },
      {
        "name": "update_webhook",
        "description": "Update a webhook URL, events, workspace, description, or active state. WRITE WITH OUTBOUND SIDE EFFECTS: list the current webhook first and get explicit confirmation before calling."
      },
      {
        "name": "delete_webhook",
        "description": "Delete a webhook subscription. DESTRUCTIVE: list the webhook first, show the user its URL/events/workspace, and get explicit confirmation before calling."
      },
      {
        "name": "test_webhook",
        "description": "Send a signed webhook.test delivery to a webhook URL. OUTBOUND SIDE EFFECT: get explicit confirmation before sending a test request."
      }
    ],
    "resources": false,
    "prompts": false,
    "sampling": false
  },
  "rate_limits": {
    "scope": "per_api_key",
    "posts_create_per_hour": 100,
    "media_write_per_hour": 120,
    "read_requests_per_hour": 300
  },
  "legal": {
    "terms": "https://www.poster.ly/terms",
    "privacy": "https://www.poster.ly/privacy",
    "fair_usage": "https://www.poster.ly/fair-usage"
  }
}