posterly-mcp-server
v0.30.0
Published
MCP server for posterly: schedule and publish social media posts across 18 platforms from any MCP client (Claude, ChatGPT, Cursor, Windsurf, Cline, and more)
Maintainers
Readme
posterly MCP Server
Use Posterly from any MCP-compatible AI client.
This package gives Claude Desktop, Cursor, Windsurf, Cline, and other local MCP clients a stdio server that can:
- start paid Posterly signup before an API key exists
- poll signup progress while the user completes checkout and password setup
- list connected social accounts
- resolve brands/clients into the right accounts
- schedule and manage posts
- upload media
- generate captions
- generate images
- read account and post analytics
Posterly also exposes the same authenticated toolset over HTTP at poster.ly/mcp, but this npm package is the local stdio connection for desktop AI clients.
Public discovery
- Hosted Streamable HTTP endpoint:
https://www.poster.ly/api/mcp - Server card:
https://www.poster.ly/.well-known/mcp/server-card.json - OpenAPI:
https://www.poster.ly/api/openapi - Agent skills:
https://www.poster.ly/.well-known/agent-skills/index.json - Agent reference:
https://www.poster.ly/llms-full.txt - Signup and API-key acquisition:
https://www.poster.ly/agents/signup - Smithery:
https://smithery.ai/servers/awpthorp/posterly - Source:
https://github.com/awpthorp/posterly/tree/main/mcp-server
The official MCP Registry metadata is in server.json. Its canonical registry
name is io.github.awpthorp/posterly, matching this package's mcpName.
Requirements
- Node.js
20+ - No API key is required for the public setup tools:
get_mcp_status,get_agent_signup_info,start_signup, andget_signup_session - A Posterly account, API add-on, and API key are required for authenticated tools like
whoami,list_accounts,create_connect_session, andcreate_post
Install
Recommended: use it via npx in your MCP config so your client runs the current server without a global install.
To let an AI agent start signup before a Posterly API key exists, install the server without POSTERLY_API_KEY:
{
"mcpServers": {
"posterly": {
"command": "npx",
"args": ["-y", "posterly-mcp-server@latest"]
}
}
}After paid signup is complete and Posterly shows an API key, add POSTERLY_API_KEY to unlock the authenticated tools:
{
"mcpServers": {
"posterly": {
"command": "npx",
"args": ["-y", "posterly-mcp-server@latest"],
"env": {
"POSTERLY_API_KEY": "pst_live_your_key_here"
}
}
}
}Quick setup
- Add the Posterly MCP server to your AI client.
- If you do not have Posterly yet, ask the AI to call
start_signup. - Pay in Stripe Checkout and set your Posterly password in the browser.
- When Posterly shows your API key, add it as
POSTERLY_API_KEY. - Restart your AI client.
- Ask the AI to call
get_mcp_status, thenwhoami, then continue by connecting your first social account.
The signup and connect tools return user-facing next steps by default, so agents should report progress in plain language instead of showing raw curl, HTTP payloads, or JSON. Pass debug: true to start_signup, get_signup_session, get_connect_link, create_connect_session, or get_connect_session only when troubleshooting.
Post tools return View in Posterly dashboard links. After scheduling, listing, reading, or deleting posts, share the returned link with the user. Current-month scheduled posts open in Calendar with the post selected; broader/future post views use Table.
Example configs
Claude Desktop
Add this to your Claude Desktop MCP config:
{
"mcpServers": {
"posterly": {
"command": "npx",
"args": ["-y", "posterly-mcp-server@latest"],
"env": {
"POSTERLY_API_KEY": "pst_live_your_key_here"
}
}
}
}Cursor
Add the same server definition to your Cursor MCP settings:
{
"mcpServers": {
"posterly": {
"command": "npx",
"args": ["-y", "posterly-mcp-server@latest"],
"env": {
"POSTERLY_API_KEY": "pst_live_your_key_here"
}
}
}
}Available tools
[email protected] exposes 76 tools.
Public setup tools work before POSTERLY_API_KEY exists:
get_mcp_status(show the installed server version, latest npm version, MCP endpoint health, API auth health, and update guidance)get_agent_signup_infostart_signup(start paid signup and return a Posterly checkout handoff URL)get_signup_session(poll checkout, payment, password, and agent-access status)
Authenticated tools require POSTERLY_API_KEY:
whoamilist_accountsdisconnect_account(disconnect a connected social account after explicit confirmation)get_connect_linkcreate_connect_session(create a guided browser handoff for connecting a social account)get_connect_session(poll connection progress while the user approves OAuth or enters credentials)create_api_key(create a new API key after explicit confirmation; scopes cannot exceed the calling dashboard key)delete_api_key(revoke a user-created API key after explicit confirmation)get_subscription(read subscription status, tier, and cancel/pause state; requiresbilling:read)cancel_subscription(cancel after explicit confirmation; the agent must ask for areasonfirst; requiresbilling:write)pause_subscription(pause 30 days, one per 90-day cooldown, after confirmation; requiresbilling:write)resume_subscription(resume a paused subscription; requiresbilling:write)downgrade_subscription(downgrade one tier at next renewal after confirmation; requiresbilling:write)list_oauth_clientscreate_oauth_client(create a public PKCE client after explicit confirmation)update_oauth_client(update redirect URIs/scopes after explicit confirmation)delete_oauth_client(delete a developer client after explicit confirmation)list_platformsget_platform_schematrigger_platform_helperlist_brandsget_brandlist_brand_accountsget_brand_profileget_learned_voice(read the voice learned from one account's real published captions)list_postsget_postget_post_missingask_support(authenticated docs-backed support with read-only account/post diagnostics; human tickets require explicit confirmation)create_post(supportsthread_posts: string[]for X / Threads reply chains, plusplatform_settingsfor platform-specific composer controls)validate_post(checks and normalizes a post without creating it; call before requesting confirmation forcreate_post)submit_agent_feedback(writes bounded private operational telemetry after a real workflow outcome; never include secrets, prompts, captions, media URLs, or personal data)create_posts_batch(create up to 25 confirmed posts in one API request)update_post(also acceptsplatform_settings)update_post_status(pause, resume, schedule, or draft a post after confirmation)update_post_release_id(set/repair external release/group metadata after confirmation)delete_postdelete_post_group(delete grouped draft/scheduled posts after confirmation)upload_mediaupload_media_from_urlcreate_signed_uploadfind_available_slotgenerate_captionsgenerate_imageget_video_optionsrun_video_function(read-only Veo helpers for cost estimation and request validation)generate_video(queues a cost-guarded Veo video job)get_credits(read-only AI credit balance)get_video_job(poll one job or list recent jobs)get_account_analyticsget_post_analyticsget_performance_profile(read an account's 90-day performance profile: top formats, timing, caption-length patterns, engagement-rate trend, narrative summary)get_post_insights(list per-post feedback-loop insights: performance tier, diagnosis, next action, metrics, baseline)list_post_suggestions(list evidence-based weekly post drafts in the account's learned voice, each with a rationale)dismiss_suggestion(dismiss a post suggestion after confirmation; never touches one already scheduled)list_google_business_reviewsget_google_business_review_linkaudit_google_business_profilesuggest_google_business_review_replyreply_google_business_review(post/update a public GBP review reply after explicit confirmation)delete_google_business_review_reply(delete a GBP review reply after explicit confirmation)list_google_business_media(list the photos/videos on a GBP profile gallery)add_google_business_media(add a photo/video to a GBP profile gallery from a public URL, after explicit confirmation)delete_google_business_media(remove a photo/video from a GBP profile gallery after explicit confirmation)
Google Business tip: pass
account_id(the integeridfromlist_accounts) to every GBP tool. If you uselocation_idinstead, it is the numericlocation_idfromlist_accounts(the GBP location id), not theChIJ...Place ID thatget_google_business_review_linkreturns. Passing the Place ID resolves to no account and returns "Google Business Profile account not found".
list_activityget_updates(read the latest posterly product updates and news)list_webhookscreate_webhook(create a webhook after explicit confirmation)update_webhook(update a webhook after explicit confirmation)delete_webhook(delete a webhook after explicit confirmation)test_webhook(send a signed test delivery after explicit confirmation)get_x_posting_quota
Analytics tools currently support Instagram, Facebook Pages, LinkedIn, Google Business Profile, Pinterest, YouTube, and Threads.
Media uploads
This npm/stdio server can read local file paths. When upload_media receives a larger local file, it automatically requests a signed upload URL and uploads the raw bytes before returning the public media URL.
The hosted HTTP MCP endpoint cannot do that for local files by itself because MCP tool calls are JSON-only. On hosted HTTP MCP, upload_media is for small base64 uploads up to 5MB decoded. For larger media there, use upload_media_from_url for public direct media URLs, or call create_signed_upload only from clients that can also PUT the raw file bytes to the returned upload_url.
What the brand tools are for
Posterly workspaces often have multiple connected accounts under one client or brand.
The brand tools let an assistant work at the same level a human does:
list_brandslets the agent see clients/brands in the workspaceget_brandreturns summary info for one brandlist_brand_accountsresolves a brand into the actual connected accountsget_brand_profilereturns saved brand guidance like tone, audience, keywords, dos and don'ts, and visual notes
This makes prompts like:
- "How is Grassroots doing on Instagram?"
- "Write a post for the Posterly brand voice"
- "Schedule something for our Dubai dental client"
much more reliable than forcing the agent to guess from raw account handles alone.
Example prompts
What Posterly accounts do I have connected?Disconnect the old Instagram account after I confirm the exact account IDList my brands in PosterlyShow me the brand profile for GrassrootsFind the next 3 posting slots for my LinkedIn accountSchedule a post for tomorrow at 9am for the Posterly Instagram accountPause post 971 after I confirm it is the right scheduled postSchedule this as an Instagram Story with a first comment and @partner as collaboratorSchedule this YouTube video as unlisted, add the thumbnail URL, and put it in our launch playlistPost this TikTok with direct-post privacy set to public and stitch disabledSchedule these 5 photos as a TikTok(image posts auto-detect as a photo slideshow of 1 to 35 images, no post type needed)How did Grassroots perform on Instagram in the last 30 days?Ask posterly support why post 3041 failed, but do not raise a human ticket unless I confirm
Pricing
This package uses the Posterly API/MCP add-on:
$3/monthadd-on100 create-post requests/hourper API key, with separate media/read limits- user-created API keys per plan: Starter 1, Pro 2, Power 3, Agency 4
- works across all 18 supported platforms: Instagram, Facebook, TikTok, X, LinkedIn, YouTube, Pinterest, Threads, Google Business, Telegram, Bluesky, Discord, Slack, Mastodon, Dev.to, Hashnode, WordPress, and Lemmy
Each API call counts as one request, so use create_posts_batch when you need to schedule multiple posts in one confirmed operation.
Details: poster.ly/dashboard/api
Links
- Docs: poster.ly/mcp
- OpenClaw skill: poster.ly/openclaw
- API add-on: poster.ly/dashboard/api
- MCP server card: /.well-known/mcp/server-card.json
- OAuth authorization server metadata: /.well-known/oauth-authorization-server
- OAuth protected resource metadata: /.well-known/oauth-protected-resource/api/mcp
Development
From the mcp-server directory:
npm install
npm run build
npm startThe package reads:
- optional
POSTERLY_API_KEYfor authenticated Posterly tools - optional
POSTERLY_URLif you need to point at a non-production environment
