substack-mcp
MCP server for Substack — read publication data, manage drafts. Posts are draft-only by design; only short-form Notes publish. Proportionate review as trust infrastructure for agents.
How to read this: tool names here are observed from a live tools/list handshake. The Risk label is a heuristic inferred from the tool name (write/destructive verbs), not from executing the tool — a conservative guess, not a verified capability. We never escalate risk from a description. Found one that's wrong? Tell us — we fix on report.
| Tool | Risk | Side effects | Approval |
|---|---|---|---|
| list_drafts List draft posts. Returns title, creation date, and audience for each draft. | read | false | unknown |
| get_sections List your publication's sections (categories). Returns each section's id and name. Use a section id as `section_id` when creating or updating a draft to file it under that section. | read | false | unknown |
| list_published_posts List published posts with pagination. Returns title, date, slug, and URL for each post. | read | false | unknown |
| get_post_comments Get comments on a published post. Returns commenter name, comment body, date, and reaction counts. | write | true | unknown |
| get_draft Get the full content of a draft post by ID. Returns title, body, metadata. | read | false | unknown |
| list_scheduled_posts List posts scheduled for future publication, soonest first. Read-only visibility into what's queued — scheduling itself is done in Substack's editor (this server does not schedule, publish, or delete long-form posts). Returns id, title, audience, and scheduled time (`trigger_at`). | read | false | unknown |
| get_subscriber_count Get the current subscriber count for your Substack publication. Returns `precision`: 'exact' when the API reports a true count, 'approximate' when only Substack's rounded value is available (the real number is that or higher — render it hedged, e.g. '1,000+'), or 'unavailable' with count -1. Never treat an approximate value as exact. | read | false | unknown |
| get_post Get the full content of a published post by ID. Returns title, body HTML, metadata. | write | true | unknown |
| get_post_analytics Get performance stats (views, emails sent/delivered/opened, signups, subscribes, estimated value, comments, reactions) for a published post by ID. Substack has no per-post stats endpoint, so this searches your 500 most recent published posts for the ID; returns a not-found note if it isn't among them. | write | true | unknown |
| create_draft Create a new draft post. Accepts markdown body which is converted to Substack's format. Does NOT publish — creates a draft only. | write | true | unknown |
| create_note_with_link Create a Substack Note with a link attachment, displayed as a rich card below the note text. PUBLISHES IMMEDIATELY to your public Notes feed — same caveats as create_note: no draft state, no undo from this server. | write | true | unknown |
| update_draft Update an existing draft post. Only works on unpublished drafts. Accepts markdown body. | write | true | unknown |
| upload_image Upload an image to Substack's CDN. Provide exactly one of `image_base64` (a base64 data URI) or `image_path` (a local file path). Returns a hosted image URL that is publicly fetchable by anyone with the link (an unlisted asset — not attributed to you or added to your feed). | write | true | unknown |
| create_note Create a Substack Note (short-form content). Accepts markdown text. PUBLISHES IMMEDIATELY to your public Notes feed — Notes have no draft state on Substack, and this server has no delete tools, so there is no undo from here. | write | true | unknown |
- repohttps://github.com/conorbronsdon/substack-mcp
- homepagehttps://chainofthought.show/go/substack-mcp
- licenseMIT
- adoption19 stars · 5 forks
The access this server can exercise, inferred from its verified tools — not a declared OAuth scope.
Add the “as seen on MCPExplorer” badge to your README.
This is one server. A loadout combines the right servers, governance, and proven plays for a whole job — assembled deliberately, not tool-dumped.
Explore loadouts →