Skip to main content
Glama
sparkshare-mcp

sparkshare-mcp

sparkshare-mcp

MCP server for SparkShare: let Claude Code, Codex, Claude Desktop and other AI agents publish text, images and video to your LinkedIn profile, and queue posts for X that the SparkShare Chrome extension fills in for you. Facebook Pages and Instagram follow once Meta has approved SparkShare.

Your agent writes the post; SparkShare publishes it. The agent shows you the exact text for each platform and publishes only after you say yes.

Setup

  1. Create an account on SparkShare and connect LinkedIn in the dashboard. Facebook Pages and Instagram are connected there too once they are open to everyone (they wait for Meta's app review). X needs no connecting.

  2. Sign in on this computer (needs Node.js 18+):

    npx -y sparkshare-mcp login

    Your browser opens SparkShare; sign in with Google if asked and click Authorize (OAuth 2.1 with PKCE). A key is saved in ~/.sparkshare/credentials.json and every MCP client on this computer finds it, including desktop apps that do not see your shell's environment variables. Nothing to copy or paste; signing in again replaces this computer's previous key. Without a browser use --no-browser (prints the link) or --paste (paste a key created in the dashboard).

  3. Add the server to your agent:

    • Claude Code: claude mcp add sparkshare -- npx -y sparkshare-mcp or install the plugin, which also brings a skill with the publishing rules: /plugin marketplace add stimQQ/sparkshare-mcp then /plugin install sparkshare@sparkshare

    • Codex: codex mcp add sparkshare -- npx -y sparkshare-mcp or the plugin: codex plugin marketplace add stimQQ/sparkshare-mcp then codex plugin add sparkshare@sparkshare

    • Claude Desktop, Cursor and others:

      { "mcpServers": { "sparkshare": { "command": "npx", "args": ["-y", "sparkshare-mcp"] } } }

Then ask in plain words: "Write a LinkedIn post about this release and share the screenshot on Instagram and X."

Related MCP server: PostMCP MCP Server

Tools

Tool

What it does

list_accounts

The accounts you can post to, with their ids. x is always there.

publish_post

Publish one post (text, optional images or video from local paths, https URLs or upload ids, optional link) to some accounts, with optional per-account text. Every target is checked first; if any has a problem, nothing is published.

upload_media

Upload one image or video ahead of time and get its id; use it for videos so no single call runs long.

get_media

Whether an uploaded file is ready (videos are processed for a minute or two after uploading).

get_post

Status and links of a post, e.g. while a platform is still processing a video.

recent_posts

Your latest posts, so a failed call can be checked before retrying.

How X works

X's API charges per post, so SparkShare does not post to X for you. The post waits in the SparkShare Chrome extension: click it, choose Fill on X, and X's composer opens with the text, images and video in place; you check it and press Post. Without the extension, publish_post also returns a link that opens X with the text only.

Platform rules the server enforces

  • Media per post: X up to 4 images or 1 video; Facebook up to 10 images or 1 video; LinkedIn up to 20 images or 1 video; Instagram 1 to 10 images and videos (a carousel), images between 4:5 and 1.91:1.

  • Video: MP4 or MOV up to 300 MB and 30 minutes; SparkShare converts it to H.264 MP4 (up to 1920 px) for publishing. Instagram Reels 3 s to 15 min, LinkedIn 3 s to 30 min.

  • Text: Instagram captions up to 2,200 characters and 30 hashtags; LinkedIn up to 3,000; Facebook up to 63,206; X warns above 280 weighted characters (CJK and emoji count double, links 23).

  • Images up to 20 MB are converted to JPEG, at most 2048 px on the longer side (transparency becomes white).

  • Uploaded files are kept for 30 days.

Commands

sparkshare-mcp              run the MCP server on stdio
sparkshare-mcp login        authorize in the browser (--no-browser | --paste | --stdin)
sparkshare-mcp status       show which account the saved key belongs to
sparkshare-mcp logout       delete the saved key

Environment: SPARKSHARE_API_KEY (a sk_live_u_… key, used before the saved key), SPARKSHARE_CREDENTIALS_FILE, SPARKSHARE_URL (site URL; for local development http://localhost:3031).

Development

pnpm install && pnpm build
# against a local SparkShare (PUBLISH_DRY_RUN=true) on a local backend-hub, see ../README.md:
SPARKSHARE_URL=http://localhost:3031 pnpm smoke

This folder is part of the SparkShare repository (the site lives next to it in web/). The smoke test creates the dev user with ../web/scripts/dev-seed.ts, drives every tool, runs sparkshare-mcp login against the real sign-in (approving on the site the way a browser would) and deletes the dev user at the end.

Available Tools

6 tools
get_mediaGet mediaA
Read-onlyIdempotent

Check an uploaded image or video: whether it is ready to publish (videos are processed for a minute or two after upload_media), its size and length.

Inputs: media_id (required).

get_postGet postA
Read-onlyIdempotent

Show where a post went and the link to each published copy. Use it for targets publish_post reported as still publishing.

Inputs: post_id (required).

list_accountsList accountsA
Read-onlyIdempotent

List the accounts the user can publish to: the LinkedIn profiles (and Facebook Pages and Instagram professional accounts, where available) they connected on SparkShare, plus "x" (always available; the post waits for the user). Returns the ids publish_post needs.

Inputs: no named parameters.

publish_postPublish postA

Publish one post, optionally with images or a video, to some of the user's accounts. Facebook, Instagram and LinkedIn are published immediately and cannot be undone from here; X waits for the user (the SparkShare browser extension fills it in, or a compose link with the text). Only call this after the user has seen the exact text for each target and the media, and said yes. Every target is checked first: if any has a problem, nothing is published and the problems are listed.

Inputs: text (required), targets (required), link, media.

recent_postsRecent postsA
Read-onlyIdempotent

List the user's most recent posts with their status per account. Check it before retrying a publish_post that failed without a post id, so nothing is posted twice.

Inputs: limit.

upload_mediaUpload mediaA

Upload one image or video ahead of publish_post and get its id. Use it for videos and other large files, one call per file, so no single call runs long; then pass the ids in publish_post media. Nothing is posted. Uploaded files are kept for 30 days.

Inputs: file (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.3/5.0

    Scored across 6 tools

    Disambiguation5/5

    Each tool has a distinct role in the publish workflow: upload_media vs get_media split by action (upload vs status check), and publish_post vs get_post vs recent_posts split cleanly by intent (publish, look up by id, list when no id exists). The descriptions explicitly state when to prefer one over the other, leaving little room for misselection.

    Naming Consistency4/5

    Five of six tools follow a verb_noun pattern (upload_media, get_post, list_accounts, publish_post, get_media), but recent_posts breaks it by using an adjective_noun listing name instead of list_recent_posts. The deviation is minor and still readable, but it's a real inconsistency in an otherwise predictable scheme.

    Tool Count5/5

    Six tools is well-scoped for a social publishing server: two media tools, two discovery tools, one publish action, and one status check. Nothing appears redundant, and each tool maps to a step an agent would actually take.

    Completeness4/5

    The core lifecycle is covered: list accounts, upload and validate media, publish, then verify outcomes via get_post/recent_posts. Gaps remain around post management — no edit, delete, cancel, or scheduling tool — though the descriptions indicate published posts are intentionally irreversible from here, so these are minor workable gaps rather than dead ends.

    Maintenance

    ActivityMaintained
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      Official MCP server for PostEverywhere (posteverywhere.ai/social-media-scheduler). Let Claude, ChatGPT, Cursor or any MCP client schedule and publish posts to 13 platforms: Instagram, TikTok, YouTube, LinkedIn, Facebook, X, Threads, Pinterest, Bluesky, Telegram, Discord, WordPress and Google Business Profile. 40 tools: best-time scheduling, threads, cross-posting, campaigns, analytics.
      33
      289 npm
      7
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Enables AI assistants to manage social media publishing across platforms like LinkedIn, Twitter, Facebook, Instagram, Threads, and Bluesky.
      7
      54 npm
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Gives AI agents the ability to schedule and publish social media posts to Instagram, TikTok, YouTube, X, LinkedIn, Facebook, Pinterest, Threads, and Bluesky. Create, schedule, and bulk-plan posts with per-platform captions, then check per-platform results and retry failures.
      12
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to write, schedule, publish, and measure social media posts across LinkedIn, Bluesky, Mastodon, and YouTube, plus manage media and queue slots, through one OAuth URL with no install or API key. It also covers retrying, cancelling, restoring posts and reading analytics, with reversibility safeguards around irreversible publishing.
      MIT