ChirpieDocs
Guides

Cross-Post One Update to 8 Networks from Cursor

Configure the Chirpie MCP server in Cursor and fan a single announcement out to X, Bluesky, LinkedIn, Threads, Mastodon, Instagram, Facebook, and Telegram.

Updated September 2026

How do you cross-post to eight networks from Cursor?

Add the Chirpie MCP server to .cursor/mcp.json, connect your 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
ThreadsMeta OAuth
MastodonOAuth, any instance
InstagramInstagram Login
FacebookFacebook Login (Pages only)
TelegramBot token + chat ID

The number of accounts you can connect at once depends on your plan — an eight-network fan-out needs a plan with at least eight account slots. 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." Instagram gets 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), leave it whole for LinkedIn (3,000) and Facebook.
  3. Attach the image for Instagram, which requires media.
  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
Threads5001 image, no video
Mastodon500Up to 4 images or 1 video
Instagram2,200Image required; 2–10 for a carousel
Facebook63,206Up to 4 images; Pages only
Telegram4,096Up to 10 images or 1 video

Instagram will reject a text-only post. If you are fanning out to every account, either supply an image or tell the agent to skip Instagram.

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,
  threads: 500,
  mastodon: 500,
  instagram: 2200,
  facebook: 63206,
  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;

  const limit = 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: account.platform === "instagram" ? [image] : undefined,
    });
    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 — it already reflects X Premium.

Scheduling the fan-out

Add schedule_at to each call for a coordinated launch. Remember that posts on the same account must be at least five minutes apart; different accounts can share a timestamp.

await chirpie.createPost({
  account_id: account.id,
  text,
  schedule_at: "2026-10-01T15:00:00Z",
});

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 — 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 eight? Eight — quota is counted per platform post.

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 everywhere. X, Bluesky, Threads, Mastodon, and Telegram thread natively; LinkedIn, Instagram, and Facebook publish each item standalone.

Is there a rate limit? 60 requests per minute per API key, plus your monthly post quota. See rate limits.

Next steps

On this page