Post to X from n8n
n8n runs your workflows on a trigger. Add calmposts' X (Twitter) MCP server and each new article, release or row can become a post for X and Bluesky, fitted to every network and waiting in the queue for your yes.
- 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
- an MCP Client Tool or MCP Client node
What n8n can do with calmposts
n8n starts workflows on a schedule, a webhook, a new item in an RSS feed or a row in a sheet. With calmposts behind an AI Agent node, a workflow turns each new item into an n8n Twitter (X) post, or a thread, and puts it in calmposts' queue, where it waits for your approval.
There are two ways in. The MCP Client Tool gives an AI Agent node calmposts' tools, and the model chooses them; the MCP Client node calls one tool as an ordinary step, with arguments mapped from earlier nodes and no model involved. Both take the key from an n8n credential, stored once and reused by every workflow.
calmposts' X (Twitter) MCP server gives n8n 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 n8n
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: An AI Agent with the MCP Client Tool
The agent reads the item, writes the post and picks the tool.
Create a key in calmposts under API & MCP. In n8n, create a Bearer Auth credential and paste the key as its Bearer Token, without “Bearer ”: n8n adds it.
In your workflow, open the AI Agent node's tools and add MCP Client Tool.
Fill it in:
Endpoint: https://calmposts.com/mcp Server Transport: HTTP Streamable Authentication: Bearer Auth Bearer Token: cp_live_… Tools to Include: AllSay in the agent's prompt what to do, for example “Write one X post about this article and save it in calmposts with when=queue”, run the workflow once and read the node's output.
Setup 2: A fixed step with the MCP Client node
No model: every run calls create_post with the fields you map.
Add an MCP Client node after your trigger and fill it in:
MCP Endpoint URL: https://calmposts.com/mcp Server Transport: HTTP Streamable Authentication: Bearer Auth Tool: create_post Input Mode: JSONPass the arguments as JSON, with fields from earlier nodes. ACCOUNT_ID comes from list_accounts: run that tool once in another MCP Client node to read it.
{ "text": "{{ $json.title }} {{ $json.link }}", "account_ids": ["ACCOUNT_ID"], "when": "queue" }
Signing in: a key or OAuth
The Bearer Auth credential sends Authorization: Bearer with your key on every request, which is what calmposts expects. A key does not expire, so it suits workflows that run at night.
If you pick Header Auth instead, set the name to Authorization and the value to Bearer cp_live_…, with the space.
n8n also has an MCP OAuth2 credential that registers itself (Dynamic Client Registration is on by default). calmposts accepts its redirect URL when your n8n is served over https or from localhost; for a workflow that runs unattended, a key is simpler.
Create a separate key for n8n with only the permissions it needs (accounts:read, posts:read, posts:write), so you can revoke it without touching your other agents.
Check that it works
- In an MCP Client node, the Tool list fills with calmposts' 11 tools: the endpoint and the key work.
- Run the AI Agent with a test item: its log shows calls to list_accounts and create_post.
- The new post is under Posts in calmposts, as a draft or in the queue, with the source mcp.
Prompts to try
Ask in your own words and the agent picks the tools. A few that work well:
- “For each new RSS item, write one X post under 280 characters with the link and save it in calmposts with when=queue for my X account.”
- “Turn this release note into a short thread for X and Bluesky and save it as a draft.”
- “Call get_limits first; if fewer than 3 posts are left today, save the post as a draft instead of queueing it.”
- “Never use when=now. If calmposts answers duplicate_recent, rewrite the post once and try again.”
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 n8n
- n8n's docs page for the MCP Client Tool still calls the field SSE Endpoint, which belongs to the node's first version. Current versions have Endpoint and a Server Transport choice: pick HTTP Streamable. calmposts has no SSE endpoint.
- An RSS workflow puts a link in every post, and posts with a link have their own monthly number on each plan, because X charges more for them. Check that number before you switch the workflow on.
- The nodes' Timeout option is 60 seconds by default, far more than calmposts needs; a create_post with images takes longest, while calmposts downloads them.
- A workflow that posts for several clients can pass customer_id to list_accounts and list_posts to stay within one client's channels.
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 node fails with 401 missing_api_key
The credential is empty, or Header Auth was set without “Bearer ”. Use Bearer Auth and paste only the key.
The node fails with an SSE error
Server Transport is set to Server Sent Events (Deprecated), or the node is the old version with an SSE Endpoint field. Pick HTTP Streamable, adding the node again if needed.
The agent finishes, but no post appears
Read the tool's answer in the agent's log: calmposts names the problem, such as no_targets (no account picked), too_long or quota_exceeded. Give the prompt an account id, or tell it to call list_accounts first.
MCP OAuth2 stops at an invalid redirect
calmposts accepts https redirect URLs, or http only on localhost. Serve n8n over https, or use a key.
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 it work on n8n Cloud and on self-hosted n8n?
Yes: the nodes reach calmposts over the internet. For OAuth your n8n must be on https or localhost; a key works anywhere.
MCP Client Tool or MCP Client?
The tool node when a model should decide what to write; the plain node when the workflow already has the text and only needs to queue it.
Is there a calmposts node for n8n?
There is no dedicated node: the MCP nodes cover it, and the HTTP Request node can call the REST API below with the same credential.
Can a workflow publish at once?
Only with when=now and with the workspace and the key both set to publish. Otherwise the post waits for approval, which suits an automated workflow.
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 n8n docs this page follows
- n8n docs: MCP Client Tool node
- n8n docs: MCP Client node
- n8n docs: MCP credentials
- n8n docs: HTTP Request credentials (bearer auth)
- n8n source: the MCP Client Tool node
calmposts is an independent service and is not affiliated with or endorsed by the makers of n8n. Product names belong to their owners.
Let n8n draft your posts, calmly
Start your free trial, connect your accounts, create a key and give n8n the address.
Try it free