Skip to main content
Glama
stimQQ

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.

NameRequiredDescriptionDefault
media_idYesThe id upload_media returned.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safe-read profile (readOnly, idempotent, non-destructive), and the description adds genuinely new behavioral context: video processing introduces an asynchronous delay before content is publishable. It does not discuss behavior for invalid or expired media IDs, so it is not fully complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact sentence that front-loads the action and the primary question (readiness), then adds the processing-timing caveat and the secondary return fields. No wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by naming what comes back (readiness, size, length). For a single-parameter read tool with strong annotations, that covers everything an agent needs to invoke it, though error/not-found behavior is unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter is documented as 'The id upload_media returned.' The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Check') and resource (an uploaded image or video) plus the fields inspected: readiness to publish, size, and length. It clearly differs from upload_media, though it does not explicitly contrast with get_post or recent_posts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when this is needed: after uploading, to confirm a video has finished processing ('a minute or two after upload_media'). It offers no explicit exclusions or named alternatives, which keeps it below a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
post_idYesThe id publish_post returned.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered; the description adds the useful behavioral fact that this resolves publish destinations and returns per-copy links. With no output schema, it also partially carries the return-shape burden, though it doesn't say what a still-pending or failed target looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the outcome stated first and the usage trigger second. Nothing could be removed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema, the description covers both what is returned (destinations and per-copy links) and when to call it. What it omits — how pending or failed targets are represented in the response — is a minor gap given annotations already establish the safety profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the sole parameter is already documented as 'the id publish_post returned'. The description reinforces the publish_post lineage but adds no syntax, format, or edge-case meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb (show) and a concrete result set (where a post went plus the link to each published copy), which separates it from siblings like publish_post and recent_posts. It is not a generic 'get a post' fetch, and the description makes that clear, though the name get_post still suggests a broader retrieval role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger: use it for targets that publish_post reported as still publishing. That is clear, actionable context. It does not state when not to use it or name an alternative for completed posts, which keeps it just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds genuinely non-obvious behavior: 'x' is always returned even when the user has not connected it, and posting to it 'waits for the user' — a quirk the agent could not infer from schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the account-type list and the x caveat both earn their place. The nested parenthetical '(and Facebook Pages and Instagram professional accounts, where available)' is slightly dense but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, no output schema and full annotation coverage, the description supplies exactly what is missing: what entities come back, the edge case of the always-present 'x' account, and the downstream consumer of the returned ids. Nothing needed to invoke it correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4 per the rubric. The description's only parameter-adjacent content is about the return value ('the ids publish_post needs'), which is useful since no output schema exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('List the accounts the user can publish to') and then enumerates the account types returned (LinkedIn profiles, Facebook Pages, Instagram professional accounts, plus 'x'). This is clearly distinct from siblings like publish_post or get_post, which operate on posts rather than account inventory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The final clause 'Returns the ids publish_post needs' tells the agent this is the prerequisite lookup step before calling publish_post. It stops short of stating exclusions (e.g., don't call this to verify a completed post), but the intended position in the workflow is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
linkNoOptional link. Facebook and LinkedIn add it to the post, X uses it as the link card, Instagram leaves it out because caption links are not clickable.
textYesThe post text exactly as it should appear, hashtags included. Used for every target without its own text.
mediaNoOptional images or one video, in order. Each item is an absolute local file path, a public https URL, or an id from upload_media. Several images or one video per post (Instagram: up to 10 of either as a carousel; X: up to 4 images). Images up to 20 MB become JPEG; MP4 or MOV video up to 300 MB, best uploaded first with upload_media.
targetsYesWhere to publish.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a non-read-only, non-idempotent, open-world action, but the description adds critical behavior beyond that: Facebook, Instagram, and LinkedIn publish immediately and cannot be undone; X waits for the user; all targets are validated first and nothing publishes if any target has a problem. This is exactly the kind of irreversible-action and atomic-validation context an agent needs before invoking a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, then moves through platform behavior, the confirmation precondition, and the atomic validation guarantee. Every clause carries useful operational information, and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description supplies the missing operational context: confirmation requirement, irreversibility on three platforms, deferred X behavior, and failure semantics where problems are listed and nothing is published. An agent has enough information to decide whether and how to call it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents parameters such as link, text, media, and targets. The description adds only general framing ('optionally with images or a video') and does not provide parameter-specific semantics beyond what the schema already says, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Publish one post') plus scope ('to some of the user's accounts') and optional media. It clearly distinguishes this from sibling tools like upload_media or get_post by describing an actual multi-account publishing action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit precondition: only call after the user has seen the exact text for each target and the media, and said yes. It also explains the platform-specific alternative behavior for X, where the extension fills it in or a compose link is used, so the agent knows what happens instead of immediate publishing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
limitNoHow many posts, newest first.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds real behavioral value beyond that: it discloses that results are per-account status snapshots and frames the tool as a duplicate-prevention check, though it says nothing about pagination or how far back 'recent' reaches.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste. The what (list recent posts with per-account status) is front-loaded and the operational guidance follows immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A one-parameter read tool needs little, and annotations plus the schema cover safety and input semantics; the description covers purpose and the key use case. With no output schema, the exact return shape (fields, ordering, whether account names or ids appear) is only sketched as 'status per account'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single 'limit' parameter is already documented as 'how many posts, newest first' with bounds and a default. The description adds no further meaning about ordering, defaults, or what happens at the maximum, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the user's most recent posts') plus the payload ('with their status per account'), which tells an agent what it gets back. It doesn't explicitly contrast with the closest sibling get_post, but 'most recent' versus a single-post fetch is reasonably inferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger condition ('before retrying a publish_post that failed without a post id') and the rationale ('so nothing is posted twice'), naming the sibling it complements. An agent knows exactly when to reach for this instead of blindly re-publishing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
fileYesAn absolute local file path or a public https URL. Images up to 20 MB: JPEG, PNG, WebP, GIF, AVIF, HEIC. Video up to 300 MB: MP4 or MOV.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavior beyond the annotations: 'Nothing is posted' clarifies the side effect, the 30-day retention states persistence, and 'one call per file' sets a batching constraint. These are meaningful operational details even though annotations already mark it as a non-destructive write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the core action and return, followed by sequencing, side-effect clarification, and retention. No sentence is redundant and the most important information comes first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still tells the agent what the call returns ('get its id') and how to use that result in publish_post. Combined with the detailed file schema and annotations, there are no material gaps for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the file parameter's path/URL forms, size limits, and formats are already documented. The description still adds value by clarifying one image or video per call and that the result id is passed to publish_post media, which the schema does not state.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Upload one image or video'), clarifies the return ('get its id'), and distinguishes the tool from publish_post by explaining the two-step flow. An agent can immediately tell this is the media-staging step rather than the publishing step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use the tool ahead of publish_post, for videos and other large files, one call per file, and then pass the ids into publish_post media. That gives both the sequencing and the alternative delivery path without requiring inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 6 tool updatesv0.1.0
    • First observedget_media
    • First observedget_post
    • First observedlist_accounts
    • First observedpublish_post
    • First observedrecent_posts
    • First observedupload_media

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
ResponsivenessNo issues

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
    126 npm
    5
    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
    19 npm
    MIT
  • A
    license
    A
    quality
    A
    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
    B
    maintenance
    Enables AI agents to post, schedule, thread, delete, and analyze social media posts across platforms like X, Bluesky, LinkedIn, and Instagram through a single MCP interface.
    241 npm
    MIT