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.
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
MCPAssistant
Three short captions in your brand voice, via generate_captions. Next I will call validate_post, then wait.
1 · Tue 9:00
Your AI can now schedule social posts. You still approve every one.
2 · Wed 9:00
MCP signup is live. Connect Claude, ChatGPT, or Grok Bot in a few minutes.
3 · Thu 9:00
Validate first, then publish. That is the whole workflow.
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 posterlyWorks 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.
Enable API and MCP access
Buy Starter + API in one checkout, then create an API key in Dashboard, API and MCP.
Open API dashboardAdd 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 hubApprove tools, then schedule
Ask Cursor to run whoami and list_accounts. Prefer validate_post. Cursor asks before writes unless you allowlist the server.
Cursor walkthroughWhat 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.jsonApplies to that repository only. Teammates only see it if the file is committed and they trust the source.
Global config
~/.cursor/mcp.jsonAvailable in every project on this machine.
Hosted URL
https://www.poster.ly/api/mcpUse 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_postswhoami(none): Call first. Returns the authenticated user, API key scopes, and workspaces.list_accountsworkspace_id?: Connected social accounts. Stop if this is empty and send the user to connect accounts in posterly.validate_postaccount_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_postsame as validate_post, plus confirm: true (required): Destructive write. Refuse unless the user clearly approved caption, account, media, and schedule.upload_mediafilename, 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_urlurl (required), filename?, content_type?: Fetch a public HTTPS URL into posterly storage. Localhost and private IPs are blocked.create_signed_uploadfilename, 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_dropfilename?, 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_medialimit?, 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_slotaccount_ids?, timezone?, workspace_id?, count?: Always pass timezone explicitly (IANA, e.g. Europe/London). Respects a 1-hour gap.generate_captionsplatforms (required), brief?, tone?, count?, mode?, source_caption?: Returns caption options only. It does not schedule or publish.list_postsstatus?, 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.
Post to 18 platforms
Cursor can schedule through posterly to every supported social platform.
Related setup guides
Cursor is one route into the same API and MCP layer. These pages pair well with it.
MCP setup guide
The hub for hosted HTTP MCP, local stdio, OAuth metadata, and the full tool list.
Cursor guide (long read)
mcp.json locations, Cloud Agents, OAuth, and Grok Bot overlap.
AI agents overview
How posterly connects to any agent that speaks MCP or REST, plus the agent signup flow.
Claude setup
Custom connector plus Claude Code, using the same posterly key.
ChatGPT setup
Custom MCP app on ChatGPT web, Codex stdio for local files.
Grok Bot setup
Hosted HTTP MCP for xAI Grok Bot, which can inherit Cursor MCP policy on teams.
Pricing
One Stripe subscription: your plan plus API & MCP. Charged now, no free trial.
API, MCP & Agent Access
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
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.
