Post to X from OpenClaw
OpenClaw is the agent you run yourself and talk to from your chat apps. Add calmposts' X (Twitter) MCP server to its Gateway, and a message like “post this to X tomorrow morning” becomes a scheduled post for X and Bluesky, waiting for your 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
- ~/.openclaw/openclaw.json, openclaw mcp set or Settings → MCP
What OpenClaw can do with calmposts
OpenClaw's Gateway owns the MCP connections and gives their tools to your agents, whichever chat app you reach them from. With calmposts connected, you can send a link or a thought from your phone and have the agent turn it into a post or a thread, fitted to each network, in your calmposts queue.
calmposts' tools go through OpenClaw's tool profiles and tool policy like any other, and OpenClaw passes the agent the instructions calmposts sends when it connects: list the accounts first, prefer the queue or a draft, never reply, follow or send DMs.
calmposts' X (Twitter) MCP server gives OpenClaw 11 tools, the same set every client gets:
| Tool | Does |
|---|---|
list_accounts | your channels and each network's rules; customer_id: one customer's |
list_customers | the customers (an agency's clients) with their channels' ids |
get_limits | plan usage, the workspace's time zone, network limits |
create_post | a post or a thread for the chosen accounts, wording per account, images by URL; when: draft, queue, at or now |
list_posts | posts by status, account, customer and time range |
get_post | one post with its channels, status and version |
update_post | edit or reschedule; what is left out stays |
delete_post | cancel and remove |
get_next_slot | where when=queue would put a post |
retry_post | send the failed channels again |
get_post_metrics | a published post's counts on each channel at 1 h, 24 h and 7 days (plans with analytics); read only |
Set up calmposts in OpenClaw
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: openclaw mcp set, with the key in .env
Two commands on the machine that runs the Gateway.
Create a key in calmposts under API & MCP and put it in ~/.openclaw/.env, which OpenClaw reads at start:
CALMPOSTS_API_KEY=cp_live_…Save the server with the key as a reference, not a literal. Keep transport: without it OpenClaw uses SSE.
openclaw mcp set calmposts '{"url":"https://calmposts.com/mcp","transport":"streamable-http","headers":{"Authorization":"Bearer ${CALMPOSTS_API_KEY}"}}'Check it live: doctor validates the entry, connects and lists calmposts' 11 tools.
openclaw mcp doctor calmposts --probe
Setup 2: Straight into openclaw.json
The same entry in the config file; the Gateway picks the change up with hot reload.
Add calmposts under mcp.servers in ~/.openclaw/openclaw.json:
{ "mcp": { "servers": { "calmposts": { "url": "https://calmposts.com/mcp", "transport": "streamable-http", "headers": {"Authorization": "Bearer ${CALMPOSTS_API_KEY}"} } } } }Run openclaw mcp doctor calmposts --probe. In the Control UI the server now shows under Settings → MCP, where you can switch it off or remove it.
Signing in: a key or OAuth
OpenClaw sends static headers with every request, and the Authorization header carries calmposts' key. Write it as Bearer ${CALMPOSTS_API_KEY}: OpenClaw substitutes the variable when it reads the config, and doctor does not warn about a reference the way it warns about a literal token.
Variable names must be upper case, as CALMPOSTS_API_KEY is. A missing variable stays unresolved and OpenClaw warns; calmposts then answers 401.
OpenClaw also supports OAuth for HTTP servers (auth: "oauth" and openclaw mcp login), and with it static Authorization headers are ignored. This page uses the key: that is the setup it was checked with.
Check that it works
- openclaw mcp doctor calmposts --probe reports the server reachable, with its 11 tools.
- openclaw mcp status --verbose shows calmposts enabled, with its URL and transport.
- Ask your agent “What are my calmposts limits today?”: it calls get_limits.
- Ask for a draft and find it under Posts in calmposts, with the source mcp.
Prompts to try
Ask in your own words and the agent picks the tools. A few that work well:
- “Put this link in my X queue for tomorrow morning with a one-line comment.”
- “Write an X and a Bluesky version of the note I just sent and save both as drafts in calmposts.”
- “What is scheduled in calmposts this week? Read me the list.”
- “Draft a short recap thread of what I posted this week and leave it for my approval.”
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).
Limits and costs
- Agents need a paid plan: the Free plan has no API keys and can't approve connected apps. API keys per plan: Pro 3 · Advanced 10 · Agency 25.
- Your agent's posts count the same as yours. Posts a day: Pro 20 · Advanced 100 · Agency 300. Posts with a link per month: Pro 30 · Advanced 300 · Agency 600. Each post in a thread counts.
- Posts with a link are counted separately because X charges every app $0.015 per post and $0.20 per post with a link. Your plan includes X's fees, so you don't need an X developer account or an X API bill of your own.
- Try it first: 7-day free trial. Card required. 5 posts with a link during the trial.
- Each key can make 60 requests a minute across MCP and REST; beyond that, the server returns 429 with Retry-After.
What to know about OpenClaw
- transport: "streamable-http" is required: without it OpenClaw connects over SSE, which calmposts does not offer.
- Keep the key out of openclaw.json: doctor warns about literal sensitive headers, while a reference such as ${CALMPOSTS_API_KEY} after the Bearer prefix passes.
- To give the agent only some tools, add toolFilter.include, for example ["list_*", "get_*", "create_post"], or deny single tools for a session under + → Connectors → Tool access.
- When calmposts cannot be reached, OpenClaw retries in the background, after 30 seconds at first and doubling up to 10 minutes; your agent's turns do not wait for it.
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"}}'Troubleshooting
The log says “authentication refused (401)”
The key did not arrive. Check that ~/.openclaw/.env holds CALMPOSTS_API_KEY and that the Gateway was restarted or reloaded after you added it.
An SSE error, or 405 from calmposts
transport is missing or set to sse, so OpenClaw opens a GET stream that calmposts answers with 405. Set transport to streamable-http.
doctor connects, but no tools appear
Check the server's toolFilter.include and toolFilter.exclude.
A change does not reach a running agent
openclaw mcp reload refreshes only the CLI's own runtimes; a Gateway running elsewhere needs its own reload or a restart.
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
Where does OpenClaw keep the connection?
In the Gateway, which owns the MCP connections of all your agents: add calmposts on the machine that runs it.
Do I need the calmposts-mcp program for OpenClaw?
No. OpenClaw connects to the hosted server over Streamable HTTP; no stdio entry is needed.
What can the agent see?
Everything in the workspace the key belongs to, within the key's permissions. For one client's channels only, ask it to pass customer_id.
Can OpenClaw post without asking me?
Only if the workspace and the key both let agents publish. Otherwise its posts wait for your approval in calmposts, in Telegram or by email.
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 OpenClaw docs this page follows
- OpenClaw docs: Connect MCP servers
- OpenClaw docs: Transports and OAuth
- OpenClaw docs: MCP client registry
- OpenClaw docs: Environment variables
calmposts is an independent service and is not affiliated with or endorsed by the makers of OpenClaw. Product names belong to their owners.
Let OpenClaw draft your posts, calmly
Start your free trial, connect your accounts, create a key and give OpenClaw the address.
Try it free