Cross-Post One Update to 5 Networks from Cursor
Configure the Chirpie MCP server in Cursor and fan a single announcement out to X, Bluesky, LinkedIn, Mastodon, and Telegram in one pass.
Updated October 2026
How do you cross-post to X, Bluesky, LinkedIn, Mastodon and Telegram from Cursor?
Add the Chirpie MCP server to .cursor/mcp.json, connect your five accounts once, then ask Cursor's agent to post the same update everywhere. It calls chirpie_list_accounts to get the account UUIDs, then chirpie_post once per account, adapting the text to each platform's character limit along the way.
Step 1: Connect your accounts
Connect each network once from the accounts dashboard:
| Platform | How it connects |
|---|---|
| X (Twitter) | OAuth 2.0 + PKCE |
| Bluesky | App password |
| OAuth 2.0 | |
| Mastodon | OAuth, any instance |
| Telegram | Bot token + chat ID |
Threads, Instagram and Facebook are coming soon.
The number of accounts you can connect at once depends on your plan, and a fan-out needs a plan with at least as many account slots as the accounts you post to. See rate limits and quotas.
Step 2: Configure Cursor
Create .cursor/mcp.json in your project (or ~/.cursor/mcp.json to have it everywhere).
{
"mcpServers": {
"chirpie": {
"url": "https://chirpie.ai/mcp",
"headers": {
"Authorization": "Bearer ${env:CHIRPIE_API_KEY}"
}
}
}
}Cursor resolves ${env:...} in url and headers, so the key stays out of the file. Export it in your shell:
export CHIRPIE_API_KEY=chirpie_sk_YOUR_KEY{
"mcpServers": {
"chirpie": {
"type": "stdio",
"command": "npx",
"args": ["@chirpie/mcp"]
}
}
}Authenticate once and the server reads the saved credentials:
npm install -g chirpie
chirpie loginNothing sensitive ends up in .cursor/mcp.json, so it is safe to commit.
Reload Cursor and check that the Chirpie tools show up in the MCP settings panel.
Step 3: Fan one update out
Post this to every connected account, adapting the length for each platform: "Chirpie v2.4 is out. Scheduled threads now publish atomically, retries back off, and media is stored at schedule time." Attach
https://cdn.example.com/v24.pngas the image.
The agent will:
- Call
chirpie_list_accountsand readplatformplusmax_post_lengthfor each. - Trim the text for X (280) and Bluesky (300), and leave it whole for LinkedIn (3,000), Mastodon (500) and Telegram (1,024 with an image).
- Attach the same image to every post.
- Call
chirpie_postonce per account.
Character limits the agent works within
| Platform | Max length | Media notes |
|---|---|---|
| X | 280 (25,000 on Premium) | Up to 4 images or 1 video |
| Bluesky | 300 | Up to 4 images, no video |
| 3,000 | Up to 4 images, no video | |
| Mastodon | 500 | Up to 4 images or 1 video |
| Telegram | 4,096 | Up to 10 images or 1 video |
A Telegram message that carries an image takes a 1,024 character caption rather than 4,096. max_post_length reports 4,096, so trim to 1,024 yourself when you attach media.
Scripting it instead
If you want the fan-out to run in CI rather than a chat, the SDK does the same thing in a dozen lines:
import { ChirpieClient, ChirpieApiError } from "@chirpie/sdk";
const chirpie = new ChirpieClient({ apiKey: process.env.CHIRPIE_API_KEY! });
const LIMITS: Record<string, number> = {
x: 280,
bluesky: 300,
linkedin: 3000,
mastodon: 500,
telegram: 4096,
};
const message =
"Chirpie v2.4 is out. Scheduled threads publish atomically, retries back off, and media is stored at schedule time.";
const image = "https://cdn.example.com/v24.png";
const accounts = await chirpie.listAccounts();
for (const account of accounts) {
if (!account.is_active) continue;
// A Telegram message with an image takes a 1,024 character caption.
const limit =
account.platform === "telegram"
? 1024
: (account.max_post_length ?? LIMITS[account.platform] ?? 280);
const text = message.length > limit ? `${message.slice(0, limit - 1)}…` : message;
try {
const post = await chirpie.createPost({
account_id: account.id,
text,
media_urls: [image],
});
console.log(`${account.platform}: ${post.id}`);
} catch (err) {
if (err instanceof ChirpieApiError) {
console.error(`${account.platform} failed: ${err.code} (${err.message})`);
continue;
}
throw err;
}
}Prefer account.max_post_length over a hard-coded table, because it already reflects X Premium. Telegram is the one exception here, because every post in this script carries an image.
Scheduling the fan-out
Add schedule_at to the createPost call inside the loop above for a coordinated launch. The time must be in the future. Remember that posts on the same account must be at least five minutes apart; different accounts can share a timestamp.
// Inside the for loop, in place of the createPost call above
const post = await chirpie.createPost({
account_id: account.id,
text,
media_urls: [image],
// Tomorrow at this time. Any future ISO 8601 instant works.
schedule_at: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
});Troubleshooting
Tools do not appear. Reload Cursor after editing .cursor/mcp.json, and check the MCP panel for a connection error.
unauthorized. For the hosted endpoint, confirm CHIRPIE_API_KEY is exported in the shell Cursor launched from. For the local server, run chirpie whoami.
One platform fails and the rest succeed. That is expected, because each post is an independent call. Catch ChirpieApiError and keep going, as the script above does.
FAQ
Does one API key cover every network? Yes. One key, one account list, every platform.
Can I post different text per network?
Yes. Just make separate calls with different text. Ask the agent for a per-platform rewrite if you want tone to vary, not only length.
Does a cross-post count as one post or several? One per account. Quota is counted per platform post, so five accounts cost five posts.
Can I do this from Claude Code instead? Yes, the same server works. See Post to X from Claude.
What about threads across networks?
chirpie_thread works on all five. X, Bluesky, Mastodon, and Telegram thread natively; LinkedIn publishes each item as a standalone post.
Is there a rate limit?
Yes, a per-minute burst limit on each API key, plus your monthly post quota. The burst ceiling comes from your plan. See rate limits for the table, and pace on the X-RateLimit-Remaining header rather than a hard-coded number.
Next steps
Give Your OpenClaw Agent a Social Media Account
Install the Chirpie skill in OpenClaw, or connect the MCP server, so your agent can post to X, Bluesky, LinkedIn, Mastodon and more.
Build a Telegram Announcement Bot with the SDK
Use @chirpie/sdk to push deploy notices, changelogs, and release announcements into a Telegram channel from your own code.