The best time to write about a feature is the moment you finish it, and the worst place to do that is a browser tab with seven half-filled compose boxes. If you build in Cursor, the fix is one MCP entry: planpo.st becomes a set of tools your agent can call mid-session.
Free plan, no card: 2 accounts, 30 posts a month, your agent included. X needs a paid plan.
Connect Cursor
Sign in, no key
{
"mcpServers": {
"planpost": { "url": "https://mcp.planpo.st/mcp" }
}
}Global: ~/.cursor/mcp.json; per project: .cursor/mcp.json
You sign in, there is no key to paste. Its posts go out at the time the agent sets, unless you turn on approval when you connect.
Cursor's agent already knows what changed, it has the diff in front of it. Handing it a scheduler means the announcement gets drafted while the context is still warm. Links in posts are tracked, so on Pro you can see later whether that announcement sold anything.
Cursor is the AI code editor built on VS Code, and its agent mode has first-class MCP support with a JSON config per project or global. It is where a lot of indie products get built, which makes it a natural place for those products to get announced too.
Plain requests work. Each one below is something you could send today, and what happens next.
You say
Summarize this PR for a non-technical audience and schedule it as a post on X and LinkedIn tomorrow morning, link to the changelog.
What happens
The agent writes two versions sized to each network, the LinkedIn one with the changelog link and the X one without, since planpo.st keeps links off X, and calls create_post with a morning slot. Both carry a description that matches the diff, because the agent read the actual code.
You say
Draft a 5-post X thread about how we built the export feature, using the actual file names and numbers from this repo, schedule for Saturday.
What happens
Threads are a native post type on planpo.st, so the agent creates one thread with five segments, real details from the codebase and no link, since X posts go out without one. Saturday morning it goes out as a proper thread, not five loose posts.
You say
Did everything I scheduled this week go out? Fix what failed.
What happens
get_delivery_report lists the posts that failed or partly failed, with each network's error and the fix. retry_failed sends again the ones that failed for a passing reason, such as a rate limit, and the agent tells you which ones need you, such as an account to reconnect.
You say
Write a LinkedIn post about this branch and submit it for approval. Do not schedule it yourself.
What happens
create_post saves a draft and submit_for_approval returns an approve link plus an approval ID. Cursor can poll get_approval_status, and the post is scheduled only after a person approves.
You say
Write a follow-up to my launch post on X as a reply, with the one detail people asked about.
What happens
get_post returns the launch post with its X ID, and create_post with platformSettings.twitter.replyToId publishes the follow-up as a reply. It goes through the same 280-character and no-link checks, and waits for your approval if you turned that on.
You say
The release moved a week. Push every scheduled post in the v2-launch campaign by seven days.
What happens
list_posts filters by campaign, and update_post takes a schedule of "next week same time" for each one, anchored on the time it already had.
All 7 that planpo.st publishes to. Each network has its own rules, and each pairing has its own page with the settings table, three prompts and the limits that stop a post.
Short posts, 500 characters, one image or video, clickable links.
A Threads post is small enough to write between two edits. Cursor's agent takes the thing you just changed and says it in 500 characters or fewer.
Profile or company page, 3,000 characters, up to 9 images or one video.
Cursor already has the code and the PR description, which is most of a LinkedIn post about what you built. Ask for a first-person version for your profile and another for the company page, each on its own connection.
Feed posts, carousels up to 10, Reels and Stories. Media on every post.
Instagram from a code editor sounds odd until you remember it only needs an image. Cursor uploads the screenshot from the workspace, writes the caption from the change you just made and schedules it.
Posts and threads, 280 characters, images or video, no links.
You finish a feature in Cursor and the announcement is one prompt away in the same window. The diff is the source, and the X copy comes back without links because the API would reject them.
Page posts with link cards, photo sets, video and Reels.
Useful when the project has a Facebook Page you would otherwise forget. Cursor posts the changelog entry with its link and the Page gets a preview card without you opening Facebook.
Video uploads and Shorts with title, description, tags and visibility.
Screen recordings of a feature tend to live in the project folder. Cursor's agent uploads one from the workspace and fills in title, description and tags from the code it just wrote.
Video posts, 2,200 character captions, a privacy level on every post.
Short product clips from a build log work on TikTok. Cursor uploads the vertical file from the workspace and sets the privacy level TikTok insists on.
The same list on the hosted and the local server. Grouped by the job they do, with the ones Cursor reaches for most:
| Job | Tools | What that covers |
|---|---|---|
| Posts and scheduling | create_post, bulk_create_posts, update_post, preview_post, get_best_times, suggest_schedule | Draft, schedule and reschedule, one post or up to 50 in a call. Each network can get its own text, media and settings, and every post can wait for your approval if you turn that on. |
| What is queued and what failed | list_posts, get_post, list_campaigns, get_delivery_report, retry_failed, list_pending_approvals | Filter the queue by status, network or campaign. Failed posts come back with the error and the fix, and a passing failure can be sent again. |
| Analytics | get_analytics | Impressions, likes, comments and shares for published posts, on Creator and Pro. |
| Revenue | get_revenue_overview | Revenue totals, conversions and the trend from Stripe, Shopify or RevenueCat, on Creator and Pro. Revenue next to each post is on Pro. |
| Accounts | list_connections, get_connection_link, list_account_groups, get_account_group | Find the accounts to post to, and hand you the link to connect a new one. |
Every tool with its description is in the MCP tool reference.
Turn on approval. By default Cursor's posts go out at the time it sets. Switch on “Ask me before anything goes live” when you connect it, or any time on the Agent page, and every post it writes waits in Posts, under In review, until you approve it. With an API key, the switch is “Require approval before publishing”, in the key's row on the Agent page. Cursor cannot change either setting itself.
Ask for drafts, if you want less than that. A post created without a time is a draft, and nothing leaves planpo.st until it is scheduled.
Scope the key. With an API key, permissions such as posts:read and posts:write decide what it can touch, so a key without posts:write lets Cursor read the calendar and the numbers and change nothing.
It finds out when the post is created, not two weeks later when the slot arrives. Every post is checked against the rules of each network it targets: character limits, required media, the X rule against links, a TikTok privacy level, a connection that has lapsed.
A post that breaks one is saved as a draft and the tool result lists each issue with a code, the network and the fix in words. Cursor reads that, corrects the post with update_post, and it goes back on the schedule. Softer problems, such as a caption link that will not be clickable on Instagram or a missing YouTube title, come back as warnings and do not block anything.
When a post reaches some of its networks and fails on one, its status is partially_published, with a result per network, so a post is never reported as published while one network refused it.
Partly, and the rest is in the app. Cursor can read your revenue totals, the conversions and the trend through get_revenue_overview, on Creator and Pro. Which post each payment came from is on Pro, on the app's Revenue screen: links in your posts are tracked, and a payment from Stripe, Shopify or RevenueCat that follows a click is matched to the post that caused it.
It takes about a minute. The AI code editor. Config is per project or global. No API key is needed: add the hosted endpoint and sign in to planpo.st when the browser opens. With a key instead, add the server, hosted or local, and the tools appear.
Config location: Global: ~/.cursor/mcp.json; per project: .cursor/mcp.json
{
"mcpServers": {
"planpost": { "url": "https://mcp.planpo.st/mcp" }
}
}{
"mcpServers": {
"planpost": {
"url": "https://mcp.planpo.st/mcp",
"headers": { "Authorization": "Bearer pk_live_xxx" }
}
}
}{
"mcpServers": {
"planpost": {
"command": "npx",
"args": ["-y", "planpost-mcp"],
"env": { "PLANPOST_API_KEY": "pk_live_xxx" }
}
}
}For Cursor I would use the hosted sign-in entry in the global config. It holds no key, and if you ever switch to a key, remember the per project file is committed with the repo, and a key in git history is the mistake that is hard to undo. Use local when the team already runs MCP servers through npx and wants one pattern for all of them.
| Question | Hosted HTTP | Local npm (stdio) |
|---|---|---|
| What it is | Streamable HTTP to https://mcp.planpo.st/mcp | The planpost-mcp npm package over stdio, started with npx |
| What you install | Nothing | Node 18 or newer. npx fetches the package |
| How it signs in | You sign in to planpo.st in the browser, or send an API key in a header | An API key in an environment variable on your machine |
| Tools you get | All of them; signed in, all but image generation | All of them, the same list |
| Updates | Server side, nothing to do | Tied to the package version npx has cached |
| Choose it when | You want it working in a minute | The key should stay in your own environment |
Both reach the same tools, so switching later is a config change and nothing else. The Cursor setup guide has every variant.
Free plan, no card: 2 accounts, 30 posts a month, your agent included. X needs a paid plan.