Post to X from Claude Desktop
In Claude Desktop you talk a post through with Claude, and it lands in calmposts fitted to X and Bluesky and waiting for your yes. calmposts connects as a custom connector: you sign in with OAuth, and there is no key to copy.
- Connection
- Remote MCP server over Streamable HTTP: nothing to install
- Sign-in
- OAuth: you sign in to calmposts and approve, no key; API key in the Authorization header
- Server address
https://calmposts.com/mcp- Where you set it up
- Customize → Connectors in Claude
What Claude Desktop can do with calmposts
Claude Desktop is where you think out loud: paste notes, a link or a rough draft, ask for a post or a thread, and keep refining it in the chat. With calmposts connected, Claude sees which accounts you have and how long each network lets a post be, and saves the result as a draft, in the queue or at the time you name.
The connector lives in your Claude account, not on this computer, so the same calmposts connection works in Claude on the web and in the mobile apps too. Claude reaches calmposts from Anthropic's servers; calmposts is on the public internet, so nothing needs opening on your side.
calmposts' X (Twitter) MCP server gives Claude Desktop 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 Claude Desktop
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: A custom connector with OAuth, no key
Claude registers itself with calmposts, and you approve it once.
In Claude Desktop, open Customize → Connectors, click + Add, then Add custom connector.
Name the connector and paste the server's address:
Name: calmposts URL: https://calmposts.com/mcpKeep the sign-in Claude detects, calmposts' OAuth. Where the dialog asks, choose:
Authentication: Sign in now OAuth client: Register automaticallyClick Add and sign in when Claude asks: calmposts opens, you sign in as the workspace's owner and click Allow.
In a chat, open + → Connectors and switch calmposts on for that conversation.
Setup 2: A fixed key in a request header (beta)
Where your organization has Claude's request headers, the connector can send a calmposts key instead of signing in. Claude marks the feature beta and offers it to some organizations only.
Create an API key in calmposts under API & MCP.
Add the custom connector with the same address, and choose:
Authentication: No sign-in Request headers: authorization = Bearer cp_live_…Click Add. Claude stores the value, never shows it again and sends it with every request.
Signing in: a key or OAuth
With OAuth, Claude registers itself with calmposts (Dynamic Client Registration), sends you to calmposts' consent page and exchanges the code with PKCE. Only the workspace's owner can approve, and only on a plan with agents.
The connection then holds a one-hour access token and a 30-day refresh token that is replaced each time it is used, so you sign in once. It is listed in calmposts under API & MCP → Connected apps; disconnecting it there ends Claude's access at once.
A connector follows the workspace's approval setting: its posts wait for approval unless the workspace lets agents publish. A key in a request header also follows that key's own setting.
On Team and Enterprise plans an Owner adds calmposts under Organization settings → Connectors (Add → Custom → Web), and each member then connects with their own calmposts account. A key in a request header there is shared by everyone who uses the connector: give it only the permissions they all should have.
Check that it works
- Customize → Connectors shows calmposts as connected.
- In calmposts, API & MCP → Connected apps lists Claude with the day you connected it.
- Ask “Which accounts do I have in calmposts?”: Claude asks to use list_accounts and answers with your channels.
- 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:
- “Here are my notes from today's talk. Turn them into an X thread and a Bluesky post, and save both in calmposts as drafts.”
- “Rewrite this announcement so it fits one X post without the link, and schedule it for tomorrow at 9 a.m. my time.”
- “What is in my calmposts queue this week? Is anything there twice?”
- “Make a Bluesky version of my last scheduled post and put it in the queue.”
- “Which of last week's posts did best? Write two more in that style as drafts.” (plans with analytics)
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 Claude Desktop
- Custom connectors are on every Claude plan; the Free plan allows one.
- A connector's sign-in cannot be changed later: to move from OAuth to a header, or back, remove calmposts and add it again.
- Claude Desktop does not read remote servers from claude_desktop_config.json; that file starts local programs. Add calmposts under Connectors.
- Claude's published identity needs a Client ID Metadata Document, which calmposts does not offer; Claude then registers automatically, as Claude's docs describe.
- Under Customize → Connectors you can set a tool, delete_post for example, to Blocked. Choose Allow always only for tools you are happy to see run unsupervised.
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
“Only the workspace's owner can connect apps.”
Sign in to calmposts as the workspace's owner, or ask the owner to connect Claude.
“Your plan does not include access for AI agents”
The workspace is on the Free plan or has none. Start the trial or upgrade, then connect again.
Claude says it couldn't reach the MCP server
Check that the address is exactly https://calmposts.com/mcp, with https. calmposts answers a request without a token with 401 and the metadata Claude needs to sign in.
There is no Request headers section in the dialog
Your organization does not have Claude's request headers yet: use OAuth.
too_many_connections
A workspace holds up to 25 connected apps. Disconnect old ones under API & MCP → Connected apps.
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
Do I need an API key for Claude Desktop?
No. With OAuth you sign in to calmposts and approve; keys are for clients that send a header.
Does the connector work in claude.ai and on my phone?
Yes. Connectors belong to your Claude account, so the one you add in Claude Desktop also appears in Claude on the web and in the mobile apps.
Can I use claude_desktop_config.json instead?
Not for a remote server: Claude Desktop connects to remote servers only through Connectors. The config file starts local programs.
How do I disconnect Claude?
In calmposts, open API & MCP → Connected apps and click Disconnect, or remove the connector in Claude.
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 Claude Desktop docs this page follows
- Claude Help Center: Get started with custom connectors using remote MCP
- Claude docs: Add a connector that isn't in the directory
- Claude docs: Authentication for connectors
calmposts is an independent service and is not affiliated with or endorsed by the makers of Claude Desktop. Product names belong to their owners.
Let Claude Desktop draft your posts, calmly
Start your free trial, connect your accounts, create a key and give Claude Desktop the address.
Try it free