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
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.
Sign in on this computer (needs Node.js 18+):
npx -y sparkshare-mcp loginYour browser opens SparkShare; sign in with Google if asked and click Authorize (OAuth 2.1 with PKCE). A key is saved in
~/.sparkshare/credentials.jsonand 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).Add the server to your agent:
Claude Code:
claude mcp add sparkshare -- npx -y sparkshare-mcpor install the plugin, which also brings a skill with the publishing rules:/plugin marketplace add stimQQ/sparkshare-mcpthen/plugin install sparkshare@sparkshareCodex:
codex mcp add sparkshare -- npx -y sparkshare-mcpor the plugin:codex plugin marketplace add stimQQ/sparkshare-mcpthencodex plugin add sparkshare@sparkshareClaude 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 |
| The accounts you can post to, with their ids. |
| 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 one image or video ahead of time and get its id; use it for videos so no single call runs long. |
| Whether an uploaded file is ready (videos are processed for a minute or two after uploading). |
| Status and links of a post, e.g. while a platform is still processing a video. |
| 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 keyEnvironment: 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 smokeThis 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 toolsget_mediaGet mediaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| media_id | Yes | The id upload_media returned. |
TDQS
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.
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.
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.
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.
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.
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 postARead-onlyIdempotent
Show where a post went and the link to each published copy. Use it for targets publish_post reported as still publishing.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | The id publish_post returned. |
TDQS
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.
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.
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.
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.
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.
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 accountsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | Optional 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. | |
| text | Yes | The post text exactly as it should appear, hashtags included. Used for every target without its own text. | |
| media | No | Optional 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. | |
| targets | Yes | Where to publish. |
TDQS
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.
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.
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.
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.
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.
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 postsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many posts, newest first. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | An 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
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.
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.
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.
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.
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.
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.
6 tool updates
v0.1.0- First observed
get_media - First observed
get_post - First observed
list_accounts - First observed
publish_post - First observed
recent_posts - First observed
upload_media
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
- StatuzOAuthapp.statuz
Schedule and publish posts to X, Bluesky, Mastodon, LinkedIn and Reddit from your agent.
Post, schedule, and track social posts on X, Bluesky, LinkedIn, Instagram and more from AI agents.
Draft, schedule and publish social posts to nine platforms from any AI agent.
Draft, schedule and publish social media posts from any AI agent.
Related MCP Servers
- AlicenseAqualityBmaintenanceOfficial 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.33126 npm5MIT

PostMCP MCP Serverofficial
AlicenseAqualityBmaintenanceEnables AI assistants to manage social media publishing across platforms like LinkedIn, Twitter, Facebook, Instagram, Threads, and Bluesky.719 npmMIT
AdaptlyPostofficial
AlicenseAqualityAmaintenanceGives 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.12MIT- AlicenseNot gradedqualityBmaintenanceEnables 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 npmMIT