Safe Substack draft automation from Markdown with Python, CLI, and MCP.
Install the optional dependency and start the stdio server:
pip install "python-substack[mcp]"
substack-mcp
Equivalent Python entry point:
python -c "from substack_mcp.mcp_server import main; main()"
The server uses the same EMAIL, PASSWORD, PUBLICATION_URL,
COOKIES_PATH, and COOKIES_STRING environment variables as the SDK.
The server exposes tools for reading content, managing drafts, and publishing.
Read Operations (Safe to run automatically):
get_status() - Verify authentication and get basic user/publication information.list_publications() - List all publications you have access to.list_drafts(filter="draft", offset=0, limit=25) - View recent drafts.get_draft(draft_id) - Read the content and metadata of a specific draft.Draft Creation and Reversible Writes:
post_draft_from_markdown(...) - Creates an unpublished draft from Markdown.put_draft(draft_id, update_payload) - Update draft metadata (e.g. slug).add_tags(draft_id, tags) - Attach tags to a draft.prepublish_draft(draft_id) - Run Substack’s pre-publication checks on a draft.schedule_draft(draft_id, at) - Schedule a draft for publication at an ISO timestamp.unschedule_draft(draft_id) - Remove a publication schedule from a draft.Publishing Operations (Use with caution):
publish_draft_checked(draft_id, confirm=False, send=False, share_automatically=False) - Recommended. A safer publishing path that requires explicit confirmation (confirm=True), runs prepublish checks automatically, and defaults to not sending emails.publish_draft(draft_id, send=True, share_automatically=False) - Legacy compatibility interface. Publishes immediately and defaults to sending email.You can configure Claude Desktop to use python-substack as an MCP server by adding it to your claude_desktop_config.json:
{
"mcpServers": {
"substack": {
"command": "substack-mcp",
"env": {
"EMAIL": "your-email@example.com",
"PASSWORD": "your-password"
}
}
}
}
If you prefer to use session cookies instead of a password, use the COOKIES_STRING variable:
{
"mcpServers": {
"substack": {
"command": "substack-mcp",
"env": {
"COOKIES_STRING": "cookie1=value1; cookie2=value2"
}
}
}
}