Codex CLI is OpenAI's terminal agent, and if it is already in your shell finishing tasks, the announcement of those tasks is one MCP server away. Two lines of TOML and planpo.st's tools show up next to everything else Codex can do.
Free plan, no card: 2 accounts, 30 posts a month, your agent included. X needs a paid plan.
Connect OpenAI Codex CLI
Hosted
[mcp_servers.planpost]
url = "https://mcp.planpo.st/mcp"
bearer_token_env_var = "PLANPOST_API_KEY"~/.codex/config.toml, or .codex/config.toml in a trusted project
Create an API key on the Agent page in planpo.st and put it where the config says. Its posts go out at the time the agent sets, unless you turn on approval for the key.
It works like every client here: the agent drafts and schedules, you approve if you turned approval on, the post goes out. Links in posts are tracked, so on Pro a payment that follows a click shows up next to the post that caused it.
Codex CLI is OpenAI's open-source coding agent for the terminal, configured in TOML at ~/.codex/config.toml. It supports MCP servers over both stdio and streamable HTTP, and codex mcp add does the config edit interactively if you prefer.
Plain requests work. Each one below is something you could send today, and what happens next.
You say
Summarize what we shipped this week from the git log and schedule it as a LinkedIn post Friday 4pm.
What happens
Codex reads the log, writes a shipping update that sounds like a person, and create_post books it for Friday. The changelog link is tracked, so on Pro a payment that follows a click shows up next to that post.
You say
Take RELEASENOTES.md and schedule versions for X, LinkedIn and Threads tomorrow morning.
What happens
Three drafts, each inside its platform's limit (280, 3,000 and 500 characters), the link on LinkedIn and Threads and none on X, one morning slot each. preview_post shows what each network will receive before anything is booked.
You say
How much revenue came in last week, compared with the week before?
What happens
get_revenue_overview answers with the total, the conversions and the change. If the answer is zero, that is worth knowing too, and it is a real zero from payment data rather than a shrug.
You say
Attach docs/img/export.png to the release post.
What happens
upload_media returns an upload URL, Codex sends the file with one shell command, and the returned asset goes into the post's media. LinkedIn, Threads and X show it.
You say
The hotfix is live. Publish the draft about it right away.
What happens
list_posts finds the draft and publish_post sends it to every connected network on it immediately. The result reports each network separately, so a failure on one is visible.
You say
Post this to X, Threads and LinkedIn, each in the length that network takes.
What happens
A single create_post with platformContent holding a 280-character cut for X, a 500-character one for Threads and the long version for LinkedIn. preview_post confirms each count before the slot.
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 one-line prompt after a merge is enough for a Threads post: what shipped, in plain words, under 500 characters.
Profile or company page, 3,000 characters, up to 9 images or one video.
The agent that merged the change can explain it on LinkedIn, with room for 3,000 characters and a link that stays clickable.
Feed posts, carousels up to 10, Reels and Stories. Media on every post.
Codex CLI runs the upload from your shell, so an image in the repo becomes an Instagram post without a visit to the dashboard.
Posts and threads, 280 characters, images or video, no links.
Codex CLI finishes the task, then writes the post about it. On X that means 280 characters and no URL.
Page posts with link cards, photo sets, video and Reels.
Release notes to the Page. Codex CLI reads RELEASE_NOTES.md and schedules a post with the link to the full version.
Video uploads and Shorts with title, description, tags and visibility.
Codex CLI uploads the demo file from disk and fills the YouTube fields from the code it has been working in all session.
Video posts, 2,200 character captions, a privacy level on every post.
Codex CLI uploads the clip and schedules it, and it is told at create time, not at publish time, when the privacy level is missing.
The same list on the hosted and the local server. Grouped by the job they do, with the ones Codex CLI 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 Codex CLI'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. Codex CLI 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 Codex CLI 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. Codex CLI 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. Codex CLI 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. OpenAI's terminal agent. Configured in TOML rather than JSON. Create an API key on the Agent page in planpo.st, add the server, hosted or local, and the tools appear.
Config location: ~/.codex/config.toml, or .codex/config.toml in a trusted project
[mcp_servers.planpost]
url = "https://mcp.planpo.st/mcp"
bearer_token_env_var = "PLANPOST_API_KEY"[mcp_servers.planpost]
command = "npx"
args = ["-y", "planpost-mcp"]
[mcp_servers.planpost.env]
PLANPOST_API_KEY = "pk_live_xxx"For Codex CLI I would use hosted with bearer_token_env_var, since the config file then holds no secret and can be shared. Use local when you would sooner keep the key in the config file's env table than in your shell profile.
| 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 | An API key in an Authorization header | An API key in an environment variable on your machine |
| Tools you get | All of them | 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 Codex CLI setup guide has every variant.
Free plan, no card: 2 accounts, 30 posts a month, your agent included. X needs a paid plan.