Substack MCP Server
Allows reading posts and publication info from Substack, and optionally creating drafts and notes using session cookie authentication.
Click on "Install 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 MCP Serverlist my recent posts"
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 MCP Server
A Model Context Protocol server that lets Claude read from — and optionally draft to — a Substack publication.
Substack has no official public API. This server uses the same unofficial JSON endpoints the Substack website itself calls, plus the public RSS feed. That has two consequences worth knowing up front:
Read tools work with no login and are reliable.
Writing (drafts) needs your session cookie, and because it rides on undocumented endpoints, treat
create_draftas experimental — Substack can change these endpoints without notice.
Tools
Tool | Auth? | What it does |
| no | Connection check; publication name, URL, latest post. |
| no | Recent posts, newest first, with free/paid flag. |
| no | Keyword search across your posts. |
| no | Full content of one post by slug (API, RSS fallback). |
| yes | Creates a draft (never publishes). Attaches your author byline. Needs |
| yes | Lists your unpublished drafts with edit URLs. |
| yes | Publishes a plain-text Note. Live/public — no draft step. |
| yes | Publishes a Note with a link-preview card. Live/public. |
| yes | Publishes a Note with an uploaded image. Live/public. |
A local .env file (next to server.py) is loaded automatically, so you can
keep SUBSTACK_PUBLICATION / SUBSTACK_SID there for local runs instead of
exporting them by hand. Copy .env.example to .env to start.
Related MCP server: Substack MCP Server
Setup
cd substack-mcp
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txtSet your publication (subdomain only):
export SUBSTACK_PUBLICATION=your-subdomain
python server.py # should start and wait silently on stdioCtrl-C to stop. If it exits with an error about SUBSTACK_PUBLICATION, that
variable isn't set.
Connect it to Claude Code
From the repo directory:
claude mcp add substack \
--scope user \
--env SUBSTACK_PUBLICATION=your-subdomain \
-- /absolute/path/to/substack-mcp/.venv/bin/python /absolute/path/to/substack-mcp/server.pyThen claude mcp get substack should show ✔ Connected. The write tools read
SUBSTACK_SID from your local .env (see below), so it never lands in config.
Connect it to Claude Desktop
Edit your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add (use absolute paths, and your venv's python if you made one):
{
"mcpServers": {
"substack": {
"command": "/absolute/path/to/substack-mcp/.venv/bin/python",
"args": ["/absolute/path/to/substack-mcp/server.py"],
"env": {
"SUBSTACK_PUBLICATION": "your-subdomain",
"SUBSTACK_SID": ""
}
}
}
}Fully quit and reopen Claude Desktop. You should see the substack tools appear.
Try: "Use the substack tools to list my 5 most recent posts."
Enabling the write tools (optional)
The write tools (create_draft, create_note, create_note_with_link,
create_note_with_image, list_drafts) act on your behalf, so they need proof
you're logged in. There's no API key, so it uses your browser session cookie:
Log into Substack in your browser.
Open DevTools → Application (Chrome) / Storage (Firefox) → Cookies →
https://substack.com.Copy the value of the
substack.sidcookie.Copy
.env.exampleto.envand paste it afterSUBSTACK_SID=.
Security notes: this cookie is equivalent to your login — anyone with it can
act as you. It lives only in your local .env (git-ignored). Don't commit it,
don't paste it into chats, and rotate it (log out / back in) if it leaks. It
expires periodically; when a write tool starts returning auth errors, refresh it.
⚠️ Notes publish immediately.
create_draftonly ever makes a draft you publish yourself, butcreate_note*post to your public Notes feed the moment they run — there is no draft step. Treat them as a real send.
Limitations & notes
Draft and note bodies convert plain paragraphs (blank-line separated) into Substack's editor format — no bold/italic/headings yet. Drafts are meant to seed a post you finish in the editor.
Paywalled post bodies only come through in full when authenticated; otherwise you get the free preview.
The unofficial endpoints can change without notice. If a read tool starts failing, the
/api/v1/archiveshape or/feedis the first thing to check.
Extending it
Natural next tools: list_comments(slug), delete_note(id), scheduling, or
richer Markdown→ProseMirror conversion (bold/italic/links/headings). Each is a
new @mcp.tool() function in server.py.
Disclaimer
This project is not affiliated with or endorsed by Substack. It uses undocumented endpoints that may change or break at any time. Use at your own risk, and in line with Substack's terms of service.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/thenewrhythm/substack-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server