calmposts

Post to X from Codex CLI

Codex works in your terminal and your editor. Point it at calmposts' X (Twitter) MCP server and it can write the release thread, the launch post or the changelog summary for X and Bluesky, then leave it in your calmposts queue for approval.

Connection
Remote MCP server over Streamable HTTP: nothing to install
Sign-in
API key in the Authorization header
Server address
https://calmposts.com/mcp
Where you set it up
~/.codex/config.toml, via codex mcp add

What Codex CLI can do with calmposts

Codex reads your repository, runs commands and edits files. With calmposts as an MCP server it can also announce the work: a thread when a pull request lands, a short post for each release, a draft for every item in the changelog.

Codex reads the instructions calmposts sends when it connects and follows them alongside the tools: check the accounts and the limits first, prefer the queue or a draft, never reply, follow or send DMs. The same config.toml serves the Codex CLI, the IDE extension and the ChatGPT desktop app, so you set calmposts up once.

calmposts' X (Twitter) MCP server gives Codex CLI 11 tools, the same set every client gets:

ToolDoes
list_accountsyour channels and each network's rules; customer_id: one customer's
list_customersthe customers (an agency's clients) with their channels' ids
get_limitsplan usage, the workspace's time zone, network limits
create_posta post or a thread for the chosen accounts, wording per account, images by URL; when: draft, queue, at or now
list_postsposts by status, account, customer and time range
get_postone post with its channels, status and version
update_postedit or reschedule; what is left out stays
delete_postcancel and remove
get_next_slotwhere when=queue would put a post
retry_postsend the failed channels again
get_post_metricsa published post's counts on each channel at 1 h, 24 h and 7 days (plans with analytics); read only

Set up calmposts in Codex CLI

Check the key before you start

Create a key in calmposts under API & MCP (it's shown only once), then ask the server for its tools. A list of 11 tools means the address and the key are right; a 401 means the key is wrong or was sent without “Bearer ”.

curl -s https://calmposts.com/mcp \
  -H "Authorization: Bearer cp_live_…" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
# 200 {"jsonrpc":"2.0","id":1,"result":{"tools":[…]}}

Setup 1: One command, with the key in an environment variable

Codex stores only the variable's name; the key stays in your shell.

  1. Create a key in calmposts under API & MCP and export it in the shell you start Codex from, for example in ~/.zshrc:

    export CALMPOSTS_API_KEY=cp_live_…
  2. Add the server. Codex sends the variable's value as a Bearer token:

    codex mcp add calmposts --url https://calmposts.com/mcp --bearer-token-env-var CALMPOSTS_API_KEY
  3. Check it: calmposts is listed with its URL. In the Codex TUI, /mcp shows it with its tools.

    codex mcp list

Setup 2: Straight into config.toml

The same entry by hand, in ~/.codex/config.toml or in a trusted project's .codex/config.toml.

  1. Add the table. The last line is optional: writes makes Codex ask before any tool that isn't marked read-only, and calmposts marks list_* and get_* read-only.

    [mcp_servers.calmposts]
    url = "https://calmposts.com/mcp"
    bearer_token_env_var = "CALMPOSTS_API_KEY"
    default_tools_approval_mode = "writes"
  2. Start codex and run /mcp: calmposts is listed with its 11 tools.

Signing in: a key or OAuth

bearer_token_env_var names an environment variable, and Codex sends its value as Authorization: Bearer with every request. If the variable isn't set where Codex starts, no key goes out and calmposts answers 401 missing_api_key.

Codex can also sign in to MCP servers with OAuth (codex mcp login calmposts), but that path hasn't been tested with calmposts yet. The key is the setup this page was checked with.

Give Codex a key of its own, with only the permissions it needs, so you can revoke it in API & MCP without touching your other agents.

Check that it works

Prompts to try

Ask in your own words and the agent picks the tools. A few that work well:

Networks, threads and approval

Posts go to X and Bluesky. A thread goes out as a reply chain on X and Bluesky. Coming soon: Threads and LinkedIn.

Write once, post everywhere: your agent sends one text for every account it picks. If the text is longer than a network allows, calmposts posts it there as a thread, splitting at a paragraph break, then at the end of a sentence, then at a space, with nothing numbered or added. calmposts checks each network's rules and your plan's limits before it saves the post and names the field that's wrong, so the agent can fix the text and try again.

By default your agent's posts wait for you. They come back as pending_approval, and you approve or reject each one in the app, in Telegram or from the email calmposts sends. The workspace owner can let agents publish on their own, but only when both the workspace and the API key are set to publish. X expects an account that posts automatically to carry its Automated label (Settings → Your account → Account information → Automation).

Which networks work today

Limits and costs

Pricing

What to know about Codex CLI

Without MCP: the REST API

Everything the tools do is also a REST call under /api/v1 with the same key, which suits a script or a workflow step that only speaks HTTP. calmposts posts through its own approved X app, so you don't need X API keys of your own.

export CALMPOSTS_API_KEY=cp_live_…
curl -H "Authorization: Bearer $CALMPOSTS_API_KEY" https://calmposts.com/api/v1/accounts
curl -X POST https://calmposts.com/api/v1/posts \
  -H "Authorization: Bearer $CALMPOSTS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"parts":[{"text":"Calm posts, scheduled."}],"targets":[{"account_id":"ACCOUNT_ID"}],"schedule":{"mode":"queue"}}'

REST API docs

Troubleshooting

calmposts answers 401 missing_api_key

CALMPOSTS_API_KEY is empty in the environment Codex started from. Export it in your shell profile, open a new terminal and start Codex again.

codex mcp list shows calmposts, but its tools never appear

Run /mcp verbose for the server's diagnostics: a 401 is the key; a timeout is the network between you and calmposts.

Codex asks before every calmposts call

That's the approval mode. Set default_tools_approval_mode = "writes" to be asked only before the tools that change posts.

401 missing_api_key

The request came without a key, or without “Bearer ” in front of it. Send Authorization: Bearer cp_live_…, with the space.

401 invalid_api_key, api_key_revoked or api_key_inactive

The key is mistyped, was revoked, or its creator is no longer in the workspace. Create a new key in API & MCP and put it in place of the old one.

401 invalid_token

An OAuth connection's access token expired or was disconnected. Clients refresh it on their own; if that fails, sign in again.

402 quota_exceeded

A plan limit is reached, and field names it: api_keys means the plan has no agents (Free); posts_per_day and link_posts_per_month free up the next day or month, or with a bigger plan.

403 insufficient_scope

The key lacks a permission the tool needs; field names it (posts:write to create posts). Create a key that has it.

429 rate_limited

More than 60 requests a minute came from this key. Wait for the seconds in Retry-After.

The tool answers duplicate_recent

The same text went to the same account in the last 7 days. Ask for a new wording.

The post is pending_approval

That is not an error: the post waits for your yes in calmposts. Approve it there, or let agents publish (the owner sets it on the workspace and on the key).

The account needs_reconnect

The network took back calmposts' access. Reconnect the account under Accounts in the app.

Questions

Does the same setup work in the Codex IDE extension and the ChatGPT desktop app?

Yes. They share config.toml with the CLI, so calmposts appears in all three once it's configured.

Do I need the calmposts-mcp program?

No. Codex connects to the hosted server over Streamable HTTP; there's nothing to install.

Where does Codex keep the key?

Nowhere: config.toml holds only the variable's name, and the key stays in your environment.

Can Codex publish right away?

Only when you ask it to post now and both your workspace and the key let agents publish. Otherwise the post waits for your approval.

Can the agent reply, follow or send DMs?

No. There are no tools for that: X forbids automating them, and calmposts only writes and schedules your own posts.

Do I need my own X API keys?

No. calmposts publishes through its own approved X app, and X's per-post fees are part of the plan's price.

The Codex CLI docs this page follows

calmposts is an independent service and is not affiliated with or endorsed by the makers of Codex CLI. Product names belong to their owners.

Let Codex CLI draft your posts, calmly

Start your free trial, connect your accounts, create a key and give Codex CLI the address.

Try it free