Package Exports
- @abanoub-ashraf/substack-mcp-plus
- @abanoub-ashraf/substack-mcp-plus/src/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@abanoub-ashraf/substack-mcp-plus) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Substack MCP Plus
An MCP server for Substack that lets AI clients work with your publication and research public Substack content.
It supports:
- authenticated account tools for drafts, publishing, scheduling, previews, sections, and post analytics
- public research tools for finding, analyzing, and studying Substack posts and publications
- content strategy tools for ideas, hooks, repurposing, gap analysis, and series planning
This project is unofficial and is not affiliated with Substack Inc.
What You Can Do
With your own Substack account:
- create formatted drafts
- update drafts
- publish immediately
- schedule future posts
- list drafts, published posts, and scheduled posts
- preview drafts
- upload images
- inspect sections
- read post content
- get post analytics
With public Substack content:
- research a topic across Substack
- analyze a public post URL
- analyze a publication URL
- create a study plan around a topic
- extract coding lessons from public posts
For strategy:
- analyze your own posts
- generate post ideas
- repurpose posts into other formats
- run content gap analysis
- improve titles and hooks
- plan a series
Requirements
Node.js >= 16Python >= 3.10- a Substack publication URL such as
https://yourpublication.substack.com
Install
Install globally with npm:
npm install -g @abanoub-ashraf/substack-mcp-plusThis installs two commands:
substack-mcp-plus
substack-mcp-plus-setupFirst-Time Setup
Run the setup wizard:
substack-mcp-plus-setupThe setup flow will:
- open a browser
- let you sign in to Substack
- handle CAPTCHA/manual login flow
- store an encrypted browser session locally for later use
The local auth file lives at ~/.substack-mcp-plus/auth.json. The setup stores
the browser session cookie jar after login, not your Substack password.
If Substack sends an email sign-in link, open or paste that link in the same
browser window opened by substack-mcp-plus-setup. That same-browser step is
what lets the setup capture the final authenticated session.
If your client later says authentication failed, run the setup again.
MCP Client Config
Use this server in any MCP client that supports a stdio server definition.
Server block:
{
"mcpServers": {
"substack-mcp-plus": {
"command": "substack-mcp-plus",
"env": {
"SUBSTACK_PUBLICATION_URL": "https://YOUR_PUBLICATION.substack.com"
}
}
}
}If your GUI client does not inherit your shell PATH, use an absolute path instead:
which substack-mcp-plusThen replace "substack-mcp-plus" with the full path to the binary.
Client Notes
Claude Desktop Config file locations:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\\Claude\\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
- macOS:
Claude Code Add the same
mcpServers.substack-mcp-plusblock to~/.claude.json.Codex Add this to
~/.codex/config.toml:[mcp_servers.substack-mcp-plus] command = "substack-mcp-plus" [mcp_servers.substack-mcp-plus.env] SUBSTACK_PUBLICATION_URL = "https://YOUR_PUBLICATION.substack.com"Cursor Add the same server block anywhere Cursor expects MCP server JSON.
Antigravity Add the same server block anywhere Antigravity expects MCP server JSON.
Windsurf Add the same server block anywhere Windsurf expects MCP server JSON.
Generic MCP client Use the same stdio definition if the client supports
command+env.
After updating the config, fully restart the client.
Tool List
Publishing and Account Tools
create_formatted_postupdate_postpublish_postschedule_postlist_draftslist_publishedlist_scheduled_postsget_post_contentget_post_analyticsduplicate_postpreview_draftupload_imagedelete_draftget_sectionsget_subscriber_count
Public Research Tools
research_substackresearch_substack_postresearch_substack_publicationstudy_topic_on_substackextract_coding_lessons
Strategy Tools
analyze_my_postsgenerate_post_ideasrepurpose_postcontent_gap_analysistitle_and_hook_optimizerseries_planner
Example Prompts
Account Workflows
List my latest draftsShow me my scheduled postsGet the content of draft 123456Create a draft titled "Why SwiftUI image caching matters" with markdown contentSchedule draft 123456 for 2026-03-12T09:00:00ZShow analytics for published post 123456
Research Workflows
Research Substack for swiftui image cachingResearch this Substack post: https://www.oneusefulthing.org/p/change-blindnessResearch this publication: https://oneusefulthing.substack.comStudy SwiftUI performance on SubstackExtract coding lessons from https://example.substack.com/p/some-post
Strategy Workflows
Analyze my postsGenerate post ideas for indie iOS app marketingRepurpose my latest draft into a Twitter threadImprove the title and hook for post 123456Plan a 5-part series on Swift concurrency
Notes About Confirmation
Some write actions are intentionally confirmation-oriented. For high-impact actions like create, update, publish, schedule, duplicate, and delete, the client should confirm before the final action is sent.
Known Limitations
These are the current honest limits, not marketing wallpaper:
get_subscriber_countmay return an unavailable state if Substack does not expose a reliable count through publication metadata, page markup, or section data.- Public research works best on focused queries such as
swiftui image cachingorios concurrencyrather than very broad topics. - Broad-topic discovery can still have lower recall than niche queries.
study_topic_on_substackandextract_coding_lessons(query=...)depend on the quality of the underlying discovery results.- Public research tools only work on public pages that are reachable and parseable.
Troubleshooting
Command not found
Your client may not inherit your shell PATH.
Find the installed binary:
which substack-mcp-plusThen use the absolute path in the client config.
Authentication failed
Run setup again:
substack-mcp-plus-setupIf Substack sent a sign-in email, paste the email link into the same setup browser window before closing it.
MCP shows connected but tools do not appear
This is usually a client session cache issue.
Do this:
- fully quit the MCP client
- reopen it
- start a fresh session
Research results are weak or empty
Try a narrower query.
Better:
swiftui image loadingswiftui asyncimageios monetization
Usually weaker:
AI for workcodingproductivity
GUI client still cannot launch the server
Use an absolute command path instead of substack-mcp-plus.
Development
Install editable Python dependencies in the project venv:
./venv/bin/python -m pip install -e '.[dev]'Run tests:
./venv/bin/python -m pytest -qRun the server directly:
node src/index.jsSecurity
- Do not commit tokens, passwords, or private keys.
- Prefer interactive setup over hardcoded credentials.
- Stored browser session data is encrypted under
~/.substack-mcp-plus/. - Use obvious placeholders in configs and examples.
- Re-run authentication if a stored Substack session expires.
See SECURITY.md for project security notes.