ChirpieDocs
Guides

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:

PlatformHow it connects
X (Twitter)OAuth 2.0 + PKCE
BlueskyApp password
LinkedInOAuth 2.0
MastodonOAuth, any instance
TelegramBot 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 login

Nothing 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.png as the image.

The agent will:

  1. Call chirpie_list_accounts and read platform plus max_post_length for each.
  2. 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).
  3. Attach the same image to every post.
  4. Call chirpie_post once per account.

Character limits the agent works within

PlatformMax lengthMedia notes
X280 (25,000 on Premium)Up to 4 images or 1 video
Bluesky300Up to 4 images, no video
LinkedIn3,000Up to 4 images, no video
Mastodon500Up to 4 images or 1 video
Telegram4,096Up 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

On this page