substack-publisher-mcp
This server provides read-only access to Substack publication data via MCP tools.
List configured publications – see which Substack publications your API keys cover.
List posts – retrieve published posts with filters (dates, type, sort, pagination).
Search posts – full-text search across published posts.
Get post details – fetch a specific post's metadata and body (Markdown, ProseMirror, or none) by URL slug.
Get post stats – view engagement metrics like opens, clicks, views, and subscriptions for a post.
Get subscriber counts – daily subscriber totals broken down by free/paid/trial/etc. over a date range.
Get subscriber – look up an individual subscriber by email and see their subscription details.
Multi-publication support – when multiple publications are configured, target a specific one with the
publicationparameter.
Provides tools for managing and analyzing Substack publications via the official Publisher API, including listing posts, retrieving subscriber counts, and fetching post engagement stats.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@substack-publisher-mcp Show my recent posts with stats"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
substack-publisher-mcp
MCP server for Substack's official Publisher API
Note: This is an unofficial, community-developed tool and is not affiliated with, endorsed by, or supported by Substack, Inc.
An MCP server for Substack's official Publisher API. Search and read posts, pull post analytics and subscriber counts, and look up subscribers from Claude, Cursor, or any MCP client. All tools are read-only.

Why this server?
substack-publisher-mcp | Other Substack MCP servers | |
API | Official Publisher API | Unofficial internal API |
Auth | API key (stable) | Browser cookies (fragile) |
Stability | Official, documented API | Breaks when Substack changes internals |
Multi-publication | Built-in support | Not available |
Related MCP server: substack-mcp
Prerequisites
Node.js 22+. Check with
node --version; install from nodejs.org if missing.Substack Publisher API key. Generate one from your publication's Substack dashboard. If you don't see a Publisher API option there, it may not be enabled for your publication yet; see the Publisher API docs for availability.
Quick Start
1. Install
git clone https://github.com/dkships/substack-publisher-mcp.git
cd substack-publisher-mcp
npm install && npm run build2. Configure your MCP client
Add to your client's MCP config file (create the file if it doesn't exist):
Client | Config file |
Claude Desktop (macOS) |
|
Claude Desktop (Windows) |
|
Claude Code |
|
Cursor |
|
{
"mcpServers": {
"substack": {
"command": "node",
"args": ["/path/to/substack-publisher-mcp/dist/index.js"],
"env": {
"SUBSTACK_API_KEY": "your-api-key-here"
}
}
}
}Claude Code users: Add
"type": "stdio"to the server config.
Restart your MCP client after editing the config — servers load at startup.
3. Start using it
Ask Claude (or your MCP client):
"Which Substack publications do I have configured?"
"Show me my posts from the last month"
"Find my posts about pricing"
"Pull up my post with the slug my-latest-post"
"How many opens and clicks did my latest post get?"
"What are my subscriber counts for the last 30 days?"
"Look up subscriber jane@example.com"
Installing through an AI agent or registry? See llms-install.md for a condensed, machine-readable setup guide.
Tools
Tool | Description | Key Parameters |
| List configured publications | None |
| List published posts |
|
| Full-text search across published posts |
|
| Get a post and its body by URL slug |
|
| Get engagement stats for a post |
|
| Get daily subscriber counts by type |
|
| Look up a subscriber by email |
|
All tools except list_publications accept an optional publication parameter when multiple publications are configured.
get_post returns the post body as Markdown by default. Substack sends it as a JSON-encoded ProseMirror document, typically about twice the size. Pass bodyFormat: "prosemirror" for the raw document or "none" for metadata only.
Date filters take YYYY-MM-DD. In list_posts, endDate is exclusive; in get_subscriber_counts, it is inclusive.
Example responses
[
{
"date": "2025-01-15",
"total_email_subscribers": 25000,
"paid_subscribers": 500,
"free_trial_subscribers": 10,
"comp_subscribers": 50,
"gift_subscribers": 15,
"lifetime_subscribers": 0,
"founding_subscribers": 25
}
]{
"clicks": 320,
"opens": 5400,
"post_id": 12345678,
"recipients": 10000,
"views": 6100,
"new_free_subscriptions": 80,
"new_paid_subscriptions": 5,
"estimated_revenue_increase": 400
}{
"posts": [
{
"post_id": 12345678,
"title": "My Latest Post",
"audience": "only_paid",
"subtitle": "A deep dive into the topic",
"postDate": "2025-01-15T12:00:00.000Z",
"urlSlug": "my-latest-post",
"coverImage": "https://substackcdn.com/image/..."
}
],
"next": "abc123cursor"
}next is null on the last page.
Multiple publications
If you manage multiple Substack publications, configure a separate API key for each using the SUBSTACK_API_KEY_<NAME> pattern:
{
"mcpServers": {
"substack": {
"command": "node",
"args": ["/path/to/substack-publisher-mcp/dist/index.js"],
"env": {
"SUBSTACK_API_KEY_MAIN": "your-main-blog-key",
"SUBSTACK_API_KEY_TECH": "your-tech-newsletter-key",
"SUBSTACK_API_KEY_COMPANY": "your-company-updates-key"
}
}
}
}Then specify which publication to query:
"Show me subscriber counts for main" "List recent posts from the tech publication"
Use list_publications to see all configured publication names.
Troubleshooting
Issue | Solution |
| Verify your API key is correct. The key goes directly in the |
| Two env vars map to the same publication name (names are case-insensitive, and |
Server won't start | Make sure you ran |
| Set |
Server doesn't appear in your client | Check the config file is valid JSON (no trailing commas), then restart the client. |
| Node.js isn't installed or isn't on your PATH. Check |
Still stuck | Check your client's MCP logs. Claude Desktop on macOS: |
API Reference
This server wraps the Substack Publisher API. See Substack's documentation for details on available data and rate limits.
Contributing
See CONTRIBUTING.md for guidelines.
License
MIT License. See LICENSE for details.
Substack is a trademark of Substack, Inc. This project is not affiliated with Substack, Inc. Use of the Substack name is for descriptive purposes only.
Available Tools
7 toolsget_postGet PostARead-onlyIdempotent
Get a post by its URL slug, including its full body. Returns post_id, title, subtitle, audience, postDate, urlSlug, coverImage, authors, and body (Markdown by default).
Inputs: urlSlug (required), bodyFormat, publication.
get_post_statsGet Post StatsARead-onlyIdempotent
Get engagement statistics for a post by its URL slug: recipients, opens, clicks, views, new free and paid subscriptions, and estimated revenue increase, plus podcast and video metrics when applicable.
Inputs: urlSlug (required), publication.
get_subscriberGet SubscriberARead-onlyIdempotent
Look up a subscriber by email address. Returns membershipType (paying, comp, free, gift), expiry, firstPaymentAt, nextChargeDate, subscription plan details, hasBounce, and social handles. Errors with 404 if the address is not a subscriber.
Inputs: email (required), publication.
get_subscriber_countsGet Subscriber CountsARead-onlyIdempotent
Get daily subscriber counts, newest first. Each row has date, total_email_subscribers (free + paid), paid_subscribers, and free_trial, comp, gift, lifetime, and founding counts. Free subscribers = total minus paid. Without dates, returns roughly the last year.
Inputs: endDate, startDate, publication.
list_postsList PostsARead-onlyIdempotent
List posts published by a Substack publication. Returns { posts, next }: each post has post_id, title, subtitle, audience, postDate, urlSlug, and coverImage. next is a cursor for the following page, or null on the last page. Use urlSlug with get_post or get_post_stats.
Inputs: next, type, sortBy, endDate, +3 more.
list_publicationsList PublicationsARead-onlyIdempotent
List all configured Substack publications and their names. Use these names as the 'publication' parameter in other tools.
Inputs: no named parameters.
search_postsSearch PostsARead-onlyIdempotent
Full-text search across a publication's published posts, ordered by relevance. Returns { posts } with the same fields as list_posts (no pagination).
Inputs: query (required), maxResults, publication.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 7 tools
Each tool has a clear, distinct purpose: search vs. list posts, get post vs. get stats, and subscriber counts vs. individual lookup. No tools overlap ambiguously.
All tool names follow a consistent verb_noun pattern (e.g., search_posts, list_publications, get_post) with uniform snake_case. No deviations.
Seven tools is well-scoped for a read-only Substack publisher API, covering post retrieval and subscriber metrics without unnecessary bloat.
The surface covers core read operations for posts and subscribers, but lacks bulk subscriber listing or publication-level analytics, which are minor gaps given the server's likely purpose.
Maintenance
Related MCP Connectors
Substack MCP server for ChatGPT, Claude and any AI agent: create post, schedule post, publish Note, reply to Notes, send direct message, moderate comments, list subscribers and get post stats in your own Substack account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Substack yourself; Cotlet does not store your password and you need no Substack API key. About the official Substack API: Substack has only a limited API (checked 11 Oct 2026). Its Developer API looks up public creator profiles after approval, and there is no public API to write posts or Notes, manage subscribers or send email. Setup and FAQ: https://cotlet.dev/integrations/substack-api-mcp-server
MCP server for interacting with the Supabase platform
MCP server for structured access to Lenny Rachitsky podcast transcripts. For content creators.
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceAn MCP server that enables AI assistants like Claude to interact with Substack newsletters, allowing for post retrieval, content searching, and author information access through a standardized interface.MIT
- AlicenseAqualityCmaintenanceMCP server for Substack that lets Claude Code create drafts, upload images, set cover thumbnails, schedule, and publish posts on your Substack publication.1116MIT
- AlicenseAqualityDmaintenanceA tool that connects to Substack's official Publisher API to access posts, newsletters, analytics, and subscribers, compatible with MCP clients like Claude and Cursor.63MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for Substack that enables reading articles, comments, feed, and subscriptions from AI clients like Cursor and Claude, with optional authentication for paid content.31 npm5MIT