substack-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SUBSTACK_SESSION_TOKEN | No | The substack.sid session token. Alternative to config file. | |
| SUBSTACK_PUBLICATION_URL | No | The URL of your Substack publication (e.g., https://example.substack.com). Alternative to config file. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_draftA | Create a new Substack draft post from Markdown. Args:
title: Post title (max 280 chars).
content_markdown: Body in Markdown. Supports headings, bold/italic, links,
bullet lists, blockquotes, code blocks, and images ( Returns: Summary including post_id, title, edit_url. |
| update_draftA | Update an existing draft. Provide only the fields you want to change. Args: post_id: Draft ID returned by create_draft or list_drafts. title: New title (optional). subtitle: New subtitle (optional). content_markdown: New body in Markdown (optional, replaces full body). audience: New audience setting (optional). Returns: Updated draft summary. |
| upload_imageA | Upload an image to Substack's CDN and return its public URL. Args: image_path: Local file path (e.g., /Users/foo/cover.png) or remote URL. Returns:
{url, id, width, height} — pass |
| set_cover_imageA | Set the cover (thumbnail) image for a draft. The cover image is shown on the publication homepage, in social shares, and as the email header. Use upload_image first to get a CDN URL. Args: post_id: Draft ID. image_url: Substack CDN URL from upload_image, or any public image URL. Returns: Updated draft summary. |
| publish_draftA | Publish a draft immediately. Args: post_id: Draft ID. send_email: If True (default), send the post as an email to subscribers. If False, publish to web only without emailing. share_automatically: If True, auto-share to Substack social channels. Returns: {post_id, title, public_url, post_date, send_email} |
| schedule_draftA | Schedule a draft to publish at a future datetime. Args: post_id: Draft ID. iso_datetime: ISO 8601 datetime, e.g., '2026-05-15T09:00:00+09:00' for JST or '2026-05-15T00:00:00Z' for UTC. Returns: {post_id, scheduled_for} |
| unschedule_draftB | Cancel a scheduled publish, keeping the post as a draft. Args: post_id: Draft ID. Returns: {post_id} |
| list_draftsA | List recent drafts (unpublished posts). Args: limit: Max number of drafts to return (1-50). Default 10. Returns: List of draft summaries with post_id, title, edit_url, etc. |
| get_draftA | Get full details of a specific draft, including the body content. Args: post_id: Draft ID. Returns: Full draft data including draft_body (ProseMirror JSON). |
| delete_draftA | Permanently delete a draft. This cannot be undone. Args: post_id: Draft ID. Returns: {post_id, deleted: true} |
| post_noteA | Post a Note (Substack's short-form, X/Threads-like post) to the public feed. Notes are different from Posts:
Use Notes for:
Args: text: Plain text body. Use \n\n to separate paragraphs and \n for soft line breaks. Max 4000 chars (Substack's practical Notes limit). Returns: {note_id, url, raw} |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
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/nanameru/substack-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server