posterly
Cursor MCP: Desktop stdio + Cloud Agents HTTP

Schedule social posts from Cursor

posterly is the publish layer. Cursor is the agent layer. Add local stdio in the editor, or hosted HTTP for Cloud Agents, then schedule across 18 platforms without leaving your IDE.

Hero prompt

Using posterly, list my accounts, then upload the local file at /Users/me/Desktop/launch.jpg with upload_media file_path (stdio) or create_signed_upload plus PUT on hosted HTTP. Draft LinkedIn, X, and Instagram captions, find the next Europe/London slot, validate_post, and wait for my yes before create_post.

Get Starter + API · $10/moCreate API key
Preview what is copied
# posterly for Cursor

posterly is the publish layer. Cursor is the agent layer. Use local stdio in the editor, or hosted HTTP for Cloud Agents.

posterly publishes to 18 platforms: Instagram, Facebook, TikTok, X, LinkedIn, YouTube, Pinterest, Threads, Google Business, Telegram, Bluesky, Discord, Slack, Mastodon, Dev.to, Hashnode, WordPress, Lemmy.

## Connect

Settings, MCP, Add new global MCP server. Files: .cursor/mcp.json (project) or ~/.cursor/mcp.json (global).

Local stdio: command npx, args ["-y", "posterly-mcp-server@latest"], env POSTERLY_API_KEY.

Cloud Agents: url https://www.poster.ly/api/mcp with headers Authorization: Bearer pst_live_your_key_here. OAuth is also supported.

Cursor asks before write tools unless you allowlist them.

## Are we connected yet?

1. Call `whoami` (no params). Confirm the user, scopes, and workspaces.
2. Call `list_accounts` (`workspace_id` optional). If none are connected, stop and send the user to connect social accounts in posterly. Do not invent account IDs.
3. Prefer `validate_post` before `create_post`. Show the preview. Wait for a clear yes.
4. Only then call `create_post` with `confirm: true`. Never publish or schedule live without that approval.
5. Prefer `scheduled_at` (ISO 8601 UTC) or `find_available_slot` (`account_ids`, `timezone`, `count`). Do not publish immediately unless the user asks.

## Rules

- posterly is the publish layer. This client is the chat or agent layer.
- Never collect card details, posterly passwords, or social-network passwords. Send the user to https://www.poster.ly/agents/signup or https://www.poster.ly/dashboard/api.
- Point to https://www.poster.ly/mcp for the rest of the 86 hosted HTTP MCP tools (89 on the local stdio package).
- After a post is created, send the View in posterly link. Avoid raw JSON dumps unless the user asks to debug.

## Media (honest)

Chat attachments never reach MCP. The paperclip in this chat does not give posterly the file.

The ~4MB limit is the **Vercel request body** on posterly API routes (`/api/mcp`, `POST /api/v1/media/upload`). It is not an MCP protocol cap and not the plan storage cap. Base64 inflates files, so hosted `upload_media` is small images only (relay cap 5MB decoded).

- Public HTTPS URL: `upload_media_from_url` (`url`, optional `filename`, `content_type`) or pass `media_url` / `media_urls` on `validate_post` / `create_post`. Server fetch: about 5MB relay, 60MB hard cap. Large R2/S3 URLs fail with `remote_media_too_large`.
- Hosted `upload_media`: required `filename` + `base64_data`. Optional `content_type`. Hits the 4MB Vercel body. JPEG, PNG, GIF, WebP, MP4, MOV, WebM. HEIC is unsupported.
- Laptop file in ChatGPT web or Claude.ai: `create_media_drop` (optional `filename`, optional `max_files`, default 10). Send the user `drop_url` (`https://www.poster.ly/drop/<token>`). They open it with no dashboard login and drop the file. Then `list_media` (`drop_session_id`) and pass `public_url` to `validate_post` / `create_post`. This is not the chat paperclip.
- Larger files, when this client can HTTP PUT: `create_signed_upload` (`filename`, `content_type`, `size`), PUT the raw bytes to the returned `upload_url` (object storage, not a posterly API route) with the returned headers, then pass `public_url` to `create_post`. That PUT does not hit the 4MB body. Plan video caps: Starter 500MB, Pro 750MB, Power 1GB, Agency 4GB.
- Stdio `upload_media` also accepts `file_path` when the user gives a real local filesystem path. The local server reads the disk and uses signed upload for large files, so this does not hit the Vercel 4MB body. Never guess paths. Chat attachments are not a file_path.

## Starter tools

- `whoami` (none): Call first. Returns the authenticated user, API key scopes, and workspaces.
- `list_accounts` workspace_id?: Connected social accounts. Stop if this is empty and send the user to connect accounts in posterly.
- `validate_post` account_id or username+platform, caption, scheduled_at?, media_url?, media_urls?, post_type?, workspace_id?: Dry run. Does not create a post. Use this before showing a preview.
- `create_post` same as validate_post, plus confirm: true (required): Destructive write. Refuse unless the user clearly approved caption, account, media, and schedule.
- `upload_media` filename, base64_data (hosted). content_type optional. Stdio also accepts file_path.: Hosted path is base64 with a decoded file of 5MB or less. Chat paperclip files never arrive here.
- `upload_media_from_url` url (required), filename?, content_type?: Fetch a public HTTPS URL into posterly storage. Localhost and private IPs are blocked.
- `create_signed_upload` filename, content_type, size: Bypasses the Vercel ~4MB API body. Returns upload_url (object storage) and public_url. PUT raw bytes to upload_url, then pass public_url to create_post. Use this when the client can PUT (Cursor, Claude Code, Codex).
- `create_media_drop` filename?, max_files?: Creates a no-login page at https://www.poster.ly/drop/<token>. Send drop_url to the user. ChatGPT web and Claude.ai laptop files use this, then list_media. Not the chat paperclip.
- `list_media` limit?, drop_session_id?: Newest media assets. After create_media_drop, pass drop_session_id and use public_url on validate_post / create_post.
- `find_available_slot` account_ids?, timezone?, workspace_id?, count?: Always pass timezone explicitly (IANA, e.g. Europe/London). Respects a 1-hour gap.
- `generate_captions` platforms (required), brief?, tone?, count?, mode?, source_caption?: Returns caption options only. It does not schedule or publish.
- `list_posts` status?, platform?, account_id?, workspace_id?, limit?: Upcoming or recent posts. status is scheduled, published, failed, or draft.

## Example prompts

- Using posterly, run whoami and list_accounts. Confirm which YouTube, LinkedIn, and X accounts are connected.
- Upload the local file at /Users/me/Desktop/launch.jpg with upload_media file_path (stdio) or create_signed_upload plus PUT if this session is hosted HTTP. Then draft LinkedIn, X, and Instagram captions and wait.
- Find the next free slot in Europe/London, validate_post a LinkedIn image post that uses the uploaded public_url, and wait for my yes before create_post.
- Generate three caption options for X from this changelog, then schedule the one I pick.
- List failed or draft posts and tell me what is missing before we retry.
- Schedule the approved YouTube post for tomorrow morning. confirm true only after I say yes.
- If you only have a public HTTPS URL, use upload_media_from_url instead of inventing a file_path.

## Links

- Human landing: https://www.poster.ly/cursor
- MCP hub: https://www.poster.ly/mcp
- Cursor guide: https://www.poster.ly/guides/cursor-guide
- AI agents: https://www.poster.ly/agents
- Agent signup: https://www.poster.ly/agents/signup

Desktop and the local CLI can use stdio file_path. Cloud Agents need the hosted HTTP endpoint. Chat attachments still never reach MCP. Cursor asks before write tools unless you allowlist them.

What it looks like in chat

Draft, validate, then approve. Your AI never publishes until you say so.

your AI · connected to posterly MCP

Draft 3 LinkedIn posts for next week about our new MCP signup flow. Don't schedule until I approve.

Assistant

Three short captions in your brand voice, via generate_captions. Next I will call validate_post, then wait.

  1. 1 · Tue 9:00

    Your AI can now schedule social posts. You still approve every one.

  2. 2 · Wed 9:00

    MCP signup is live. Connect Claude, ChatGPT, or Grok Bot in a few minutes.

  3. 3 · Thu 9:00

    Validate first, then publish. That is the whole workflow.

whoamivalidate_postcreate_post
Approval requiredschedule · gated

Schedule 3 posts · Tue to Thu 9:00 Asia/Dubai

LinkedIn @Acme

Waiting for approval. Nothing will be scheduled until you approve.

Never posts without approval · validate_post before create_post

View in posterly

Works with Claude, Cursor, ChatGPT, OpenClaw, Hermes, Grok Bot, Poke, and any MCP client.

Get Cursor connected in three steps

Create a posterly API key, add an MCP server in Cursor settings or mcp.json, then verify with whoami.

1

Enable API and MCP access

Buy Starter + API in one checkout, then create an API key in Dashboard, API and MCP.

Open API dashboard
2

Add the MCP server

Settings, MCP, Add new global MCP server. Project file: .cursor/mcp.json. Global file: ~/.cursor/mcp.json. Use stdio locally, or url plus headers for Cloud Agents.

MCP hub
3

Approve tools, then schedule

Ask Cursor to run whoami and list_accounts. Prefer validate_post. Cursor asks before writes unless you allowlist the server.

Cursor walkthrough

What to put in mcp.json

Cursor reads .cursor/mcp.json for one project and ~/.cursor/mcp.json for every project. Cloud Agents cannot see your local npx process, so they need the hosted URL.

Fields

Project config

.cursor/mcp.json

Applies to that repository only. Teammates only see it if the file is committed and they trust the source.

Global config

~/.cursor/mcp.json

Available in every project on this machine.

Hosted URL

https://www.poster.ly/api/mcp

Use url plus Authorization Bearer header for Cloud Agents, Automations, and the Slack bot.

Local stdio (Desktop and CLI)

Cursor launches the npm package as a subprocess. This is the path that can read a real file_path.

{
  "mcpServers": {
    "posterly": {
      "command": "npx",
      "args": ["-y", "posterly-mcp-server@latest"],
      "env": {
        "POSTERLY_API_KEY": "pst_live_your_key_here"
      }
    }
  }
}

Node.js must be installed for npx. A stray comma in mcp.json disables every server in that file.

Hosted HTTP (Cloud Agents)

Cloud Agents run in a VM that does not have your local stdio process. Use the public endpoint.

{
  "mcpServers": {
    "posterly": {
      "url": "https://www.poster.ly/api/mcp",
      "headers": {
        "Authorization": "Bearer pst_live_your_key_here"
      }
    }
  }
}

OAuth is also supported. Cursor documents browser OAuth and static headers. SSE is not the posterly v1 transport.

What Cursor can do once connected

Start with these tools. The rest of the 86 hosted HTTP MCP tools live on the MCP hub. Prefer validate_post, then wait for a clear yes before create_post with confirm true.

Starter tools

whoamilist_accountsvalidate_postcreate_postupload_mediaupload_media_from_urlcreate_signed_uploadcreate_media_droplist_mediafind_available_slotgenerate_captionslist_posts
  • whoami (none): Call first. Returns the authenticated user, API key scopes, and workspaces.
  • list_accounts workspace_id?: Connected social accounts. Stop if this is empty and send the user to connect accounts in posterly.
  • validate_post account_id or username+platform, caption, scheduled_at?, media_url?, media_urls?, post_type?, workspace_id?: Dry run. Does not create a post. Use this before showing a preview.
  • create_post same as validate_post, plus confirm: true (required): Destructive write. Refuse unless the user clearly approved caption, account, media, and schedule.
  • upload_media filename, base64_data (hosted). content_type optional. Stdio also accepts file_path.: Hosted path is base64 with a decoded file of 5MB or less. Chat paperclip files never arrive here.
  • upload_media_from_url url (required), filename?, content_type?: Fetch a public HTTPS URL into posterly storage. Localhost and private IPs are blocked.
  • create_signed_upload filename, content_type, size: Bypasses the Vercel ~4MB API body. Returns upload_url (object storage) and public_url. PUT raw bytes to upload_url, then pass public_url to create_post. Use this when the client can PUT (Cursor, Claude Code, Codex).
  • create_media_drop filename?, max_files?: Creates a no-login page at https://www.poster.ly/drop/<token>. Send drop_url to the user. ChatGPT web and Claude.ai laptop files use this, then list_media. Not the chat paperclip.
  • list_media limit?, drop_session_id?: Newest media assets. After create_media_drop, pass drop_session_id and use public_url on validate_post / create_post.
  • find_available_slot account_ids?, timezone?, workspace_id?, count?: Always pass timezone explicitly (IANA, e.g. Europe/London). Respects a 1-hour gap.
  • generate_captions platforms (required), brief?, tone?, count?, mode?, source_caption?: Returns caption options only. It does not schedule or publish.
  • list_posts status?, platform?, account_id?, workspace_id?, limit?: Upcoming or recent posts. status is scheduled, published, failed, or draft.
See all MCP tools

Example prompts

  • Using posterly, run whoami and list_accounts. Confirm which YouTube, LinkedIn, and X accounts are connected.
  • Upload the local file at /Users/me/Desktop/launch.jpg with upload_media file_path (stdio) or create_signed_upload plus PUT if this session is hosted HTTP. Then draft LinkedIn, X, and Instagram captions and wait.
  • Find the next free slot in Europe/London, validate_post a LinkedIn image post that uses the uploaded public_url, and wait for my yes before create_post.
  • Generate three caption options for X from this changelog, then schedule the one I pick.
  • List failed or draft posts and tell me what is missing before we retry.
  • Schedule the approved YouTube post for tomorrow morning. confirm true only after I say yes.
  • If you only have a public HTTPS URL, use upload_media_from_url instead of inventing a file_path.

Post to 18 platforms

Cursor can schedule through posterly to every supported social platform.

InstagramFacebookTikTokXLinkedInYouTubePinterestThreadsGoogle BusinessTelegramBlueskyDiscordSlackMastodonDev.toHashnodeWordPressLemmy

Related setup guides

Cursor is one route into the same API and MCP layer. These pages pair well with it.

Pricing

One Stripe subscription: your plan plus API & MCP. Charged now, no free trial.

API, MCP & Agent Access

$10/month

Starter $7 + API $3, charged now. No free trial on this path.

  • Cursor Desktop stdio and Cloud Agents HTTP
  • OAuth or Bearer on the hosted endpoint
  • Same key for MCP and REST
  • 86 hosted HTTP MCP tools for status checks, scoped API keys, schemas, scheduling, support, media, brands, analytics, webhooks, OAuth, connect sessions, subscription management, and GBP
  • 100 create-post requests/hour plus separate media/read limits
  • All 18 supported platforms
Get Starter + API · $10/mo

Cursor questions

Where does Cursor store MCP config?+

.cursor/mcp.json in a project, or ~/.cursor/mcp.json for every project. You can also add a server from Settings, MCP.

Should I use stdio or HTTP?+

Stdio on your laptop (Desktop and local CLI) so file_path uploads work. Hosted HTTP for Cloud Agents, Automations, and Slack, because those run in a VM without your local npx process.

Can Cursor upload a file from disk?+

Yes, on local stdio: upload_media with file_path when you give a real path. On hosted HTTP, use create_signed_upload then PUT, or a public URL. Chat attachments still never reach MCP.

Does Cursor ask before publishing?+

Yes by default. Keep that on. posterly also requires confirm true on create_post after you clearly approve.

What can Cursor schedule?+

All 18 posterly platforms: Instagram, Facebook, TikTok, X, LinkedIn, YouTube, Pinterest, Threads, Google Business, Telegram, Bluesky, Discord, Slack, Mastodon, Dev.to, Hashnode, WordPress, Lemmy.

Ready to connect Cursor?

Pay for Starter + API in one checkout, create a key, then add stdio or the hosted URL in mcp.json.