Postgale MCP server

Postgale runs a hosted Model Context Protocol server so AI agents (Claude, Cursor, VS Code and other MCP clients) can draft, schedule and publish posts to your connected Reddit, Instagram, Facebook Pages, Threads and TikTok accounts, moderate comments, answer direct messages, send WhatsApp messages and read analytics. It exposes the same operations as the REST API(OpenAPI spec), with the same permissions, rate limits and approval rules.

Endpoint and authentication

Connect a client

Cursor and most clients that accept an mcpServers file:

mcp.json
{
  "mcpServers": {
    "postgale": {
      "url": "https://postgale.com/mcp",
      "headers": {
        "Authorization": "Bearer sk_…"
      }
    }
  }
}

Claude Code:

Terminal
claude mcp add --transport http postgale https://postgale.com/mcp --header "Authorization: Bearer sk_…"

Claude Desktop, through the mcp-remote bridge (keep the key in the environment so it is not split on the space):

claude_desktop_config.json
{
  "mcpServers": {
    "postgale": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://postgale.com/mcp",
        "--header",
        "Authorization:${POSTGALE_AUTH}"
      ],
      "env": {
        "POSTGALE_AUTH": "Bearer sk_…"
      }
    }
  }
}

VS Code:

.vscode/mcp.json
{
  "servers": {
    "postgale": {
      "type": "http",
      "url": "https://postgale.com/mcp",
      "headers": {
        "Authorization": "Bearer sk_…"
      }
    }
  }
}

Raw HTTP, to check a key:

POST/mcp
curl https://postgale.com/mcp \
  -H 'Authorization: Bearer sk_…' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}'

curl https://postgale.com/mcp \
  -H 'Authorization: Bearer sk_…' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'Mcp-Protocol-Version: 2025-06-18' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

Tools

68 tools. Each declares MCP annotations (read-only, destructive, open-world) so clients can ask for confirmation before writes; the kind below follows them.

ToolWhat it doesKind
Accounts & connect
get_api_key_infoThe key in use, its organization and the effective approval policyRead-only
list_accountsConnected social accounts (ids for create_post), optionally by externalIdRead-only
connect_accountOAuth link a human opens to connect Reddit, Instagram, Facebook Pages, Threads, TikTok or WhatsApp (Embedded Signup)Write
select_connectionList pending connections (no pendingId), the options of one (e.g. Facebook Pages), and connect the chosen onesWrite
get_account_healthToken validity, granted scopes, missingPermissions, publishing limit and recommendationsRead-only
update_accountSet or clear the customer reference (externalId) of an accountWrite
Media
list_mediaRecent uploaded mediaRead-only
get_mediaOne media fileRead-only
upload_mediaImport an image or video from a URL or base64; returns its publicUrlWrite
Posts
list_postsRecent posts, optionally by statusRead-only
get_postOne post with per-platform status, URLs and errorsRead-only
create_postDraft, schedule or publish a post (publishNow publishes live)Destructive
update_postReplace the text of an unpublished postDestructive
delete_postDelete a post from Postgale (not from the platforms)Destructive
publish_postPublish a draft, scheduled or failed post live nowDestructive
manage_published_postEdit (Facebook) or delete (Facebook, Threads) a live post; turn Instagram comments on or offDestructive
Comments & mentions
list_post_commentsComments on the published targets of a postRead-only
reply_to_commentPublish a reply to a comment (Reddit, Instagram, Facebook, Threads)Write
list_commentsComments and replies on Instagram, Facebook and Threads posts, by post or by accountRead-only
moderate_commentComment, reply, hide/unhide, delete; like/unlike on FacebookDestructive
list_mentionsMedia the Instagram account was tagged inRead-only
list_inbound_eventsEvents received from Meta webhooks: comments, replies, mentions, Page feed changes, direct messagesRead-only
Direct messages
list_conversationsInstagram, Messenger, WhatsApp and X conversations, latest first, with unread counts and the messaging windowRead-only
get_conversation_messagesOne conversation (incl. messagingWindow) and its messages, oldest to newestRead-only
send_messageSend a live DM (text or one attachment; WhatsApp: also templates, interactive, location, reactions) to the participant, within the messaging window; tag HUMAN_AGENTWrite
mark_conversation_readMark read in Postgale and as seen on Instagram/MessengerWrite
sync_conversationsBackfill conversations of an account (or one conversation) from Meta or XWrite
start_conversationX only: send the first live DM to someone (@username or user id)Write
X
x_engagementRepost, like, bookmark or follow (and undo) as the X account; liveWrite
x_search_postsRecent search (last 7 days) with X search syntaxRead-only
x_lookupOne X post (id or URL) or one user (@username)Read-only
WhatsApp
whatsapp_connect_numberConnect a number with an existing token (stored encrypted) instead of Embedded SignupWrite
whatsapp_get_phone_numberDisplay number, verified name, quality rating, messaging limit and onboarding state; refresh from MetaRead-only
whatsapp_register_numberRegister or re-register the number for the Cloud API (6-digit PIN)Write
whatsapp_send_messageSend a live text, media, template, interactive, location or reaction message; outside 24 hours only templatesWrite
whatsapp_mark_readMark an inbound message read, optionally with a typing indicatorWrite
whatsapp_list_templatesMessage templates of the WhatsApp Business Account, with statusRead-only
whatsapp_get_templateOne template with its componentsRead-only
whatsapp_create_templateSubmit a template for Meta’s reviewWrite
whatsapp_delete_templateDelete a template (one language or all)Destructive
whatsapp_upload_mediaUpload a Postgale media or public URL to WhatsApp; returns the id to sendWrite
whatsapp_get_mediaMIME type, size and sha256 of a WhatsApp media id (download through the REST API)Read-only
whatsapp_search_numbersNumbers Postgale can buy for WhatsApp, with the monthly price (when the instance sells numbers)Read-only
whatsapp_buy_numberBuy a number and connect it to the WABA of a connected WhatsApp account (code captured by Postgale)Write
whatsapp_list_numbersNumbers bought for the organization, with status and the limitRead-only
whatsapp_get_numberOne bought number; the code captured in the last 10 minutesRead-only
whatsapp_release_numberRelease a bought number (returned to the carrier; its account stops working)Destructive
TikTok (see /docs/tiktok)
tiktok_get_creator_infoCreator nickname, allowed privacy levels, disabled interactions and max video length; required before every TikTok postRead-only
tiktok_get_profileProfile and lifetime stats: followers, following, likes, public videosRead-only
tiktok_list_videosPublic videos with views, likes, comments and shares (paged), or specific video idsRead-only
Meta Ads (see /docs/ads)
ads_list_ad_accountsAd accounts the connected Facebook user can manageRead-only
ads_listCampaigns, ad sets, ads, creatives or custom audiences of an ad accountRead-only
ads_getOne campaign, ad set, ad, creative or audienceRead-only
ads_boost_postBoost a published Facebook/Instagram post (PAUSED by default, needs confirm)Write
ads_create_campaignCreate a campaign (PAUSED by default, needs confirm)Write
ads_create_ad_setCreate an ad set: targeting, budget, schedule (PAUSED, needs confirm)Write
ads_create_creativeCreate a creative from a post or a new link adWrite
ads_create_adCreate an ad from an ad set and a creative (PAUSED, needs confirm)Write
ads_updateRename, pause, activate or change budget/bid/schedule/targeting (spend changes need confirm)Destructive
ads_create_audienceCreate a customer-list custom audienceWrite
ads_add_audience_usersAdd hashed emails or phones to a custom audienceWrite
ads_get_insightsImpressions, reach, clicks, spend, CPC, CPM, CTRRead-only
ads_search_targetingSearch interests, locations and other targeting optionsRead-only
Analytics
get_analyticsPost and account insights, demographics, online followers, best posting times, publishing limitRead-only
Webhooks
list_webhooksWebhook endpointsRead-only
create_webhookRegister an HTTPS endpoint; returns the signing secret onceWrite
webhook_deliveriesList deliveries, redeliver one, or send a webhook.test eventWrite
delete_webhookRemove a webhook endpointDestructive

Publishing

Direct messages

WhatsApp

Approval gate

Errors

Tool errors carry the same message as the REST API, with the error code appended in parentheses, e.g. … Reconnect the account. (reconnect_required). A missing_permission error means the account must be reconnected after the Meta app has been granted that permission; get_account_health lists the account's missingPermissions and the features they block.

CodeMeaning
approval_requiredApproval applies to this key, organization or account; comment moderation, changes to published posts and send_message are refused
missing_permissionThe account did not grant the permission this needs: add it to the Meta app, then reconnect the account
reconnect_requiredThe token is no longer valid; the account is flagged needs_reconnect and must be reconnected
rate_limitedThe platform rate-limited the request; retry later
not_supportedThe platform does not offer this feature (e.g. deleting Instagram posts)
invalid_requestThe platform rejected the input
platform_errorAny other platform failure
outside_messaging_windowsend_message outside Meta’s window: 24 hours after the person’s last message, 7 days with tag HUMAN_AGENT. Nothing was sent
recipient_unavailableThe person cannot receive messages from this account right now
sync_requiredsync_conversations with a conversationId needs a previous sync of the account
pending_expiredThe pending connection expired (30 minutes) or was already completed
template_errorWhatsApp: Meta rejected the template name, language, parameters or status
recipient_not_allowedWhatsApp test number: the recipient is not in the allowed list
phone_number_not_registeredWhatsApp: call whatsapp_register_number first
account_restrictedWhatsApp: the business account is restricted or has a payment issue

Post state conflicts are reported the same way, e.g. (APPROVAL_REQUIRED), (ALREADY_PUBLISHED), (NOT_EDITABLE).

Limitations

For plain HTTP integrations, webhook payloads and signature verification, see the REST API reference.