Substack Reader MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SUBSTACK_SID | No | Session cookie value. Overrides the saved session, for containers or CI | |
| SUBSTACK_COOKIE | No | A full `Cookie:` header to take `substack.sid` from | |
| SUBSTACK_USERNAME | No | When logged out, `list_subscriptions` shows this user's *public* subscriptions | |
| SUBSTACK_READER_HOME | No | Config directory (default `~/.config/substack-reader`) | ~/.config/substack-reader |
| SUBSTACK_BROWSER_PATH | No | A Chromium-based browser for `login`, if Chrome and Edge aren't installed | |
| SUBSTACK_COOKIES_PATH | No | A Cookie-Editor export from the original Python version, read as a fallback |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| auth_statusA | Check whether a Substack session is configured and still valid, and which account it belongs to. |
| list_subscriptionsA | List every newsletter the logged-in user subscribes to (including subscriptions hidden from their public profile), with URL and membership state. |
| get_feedA | Recent posts across all subscriptions, newest first. |
| get_recent_postsC | Recent posts from one publication. |
| search_postsB | Search one publication's archive by keyword. |
| read_postA | Read the full content of a Substack post as Markdown. Paid posts are returned in full when the logged-in account has access. Long posts are paged: pass |
| list_chatsA | The user's Substack chat inbox: publication chats they belong to and direct messages, most recent first, with unread state. Use the returned id with get_chat_threads (publication_chat) or read_dm (direct_message). |
| get_chat_threadsA | Threads in a publication's chat, newest first, with reply counts. Pass |
| read_chat_threadB | A chat thread with its replies (and replies to replies) as a readable transcript. |
| read_dmA | Messages in one of the user's direct-message conversations. Only use when the user asks about their DMs. |
| subscribeA | Free-subscribe the logged-in account to a publication. Never starts a paid plan. Does nothing if already subscribed. Only use when the user explicitly asks to subscribe. |
| unsubscribeA | Remove one of the logged-in account's FREE subscriptions. Refuses paid subscriptions. Only use when the user explicitly asks to unsubscribe; if the name is ambiguous, ask them which one they mean. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 12 tools
Most tools map to distinct resources and actions: subscription management, feed reading, post retrieval, and chat/DMs. The only real confusion risk is get_feed versus get_recent_posts, though their descriptions clearly separate 'all subscriptions' from 'one publication.'
The naming convention is largely verb_noun: list_subscriptions, get_feed, search_posts, read_post, subscribe, unsubscribe. Minor deviations such as auth_status instead of get_auth_status and the abbreviated read_dm prevent a perfect score.
Twelve tools is well within the ideal range and each tool covers a distinct reader workflow: authentication, subscription management, post discovery/reading, and chat/DMs. No tool feels redundant or unnecessary.
The toolset covers the full Substack reader lifecycle: auth status, listing/subscribing/unsubscribing, feed and publication browsing, archive search, full post reading, and chat/DM threads. There are no obvious dead ends for the stated reader-focused purpose.