Substack CLI + 26-tool MCP server. Your IDE drafts replies via propose_reply. No API keys.
Config is the same across clients — only the file and path differ.
{
"mcpServers": {
"io-github-06ketan-substack-ops": {
"command": "<see-readme>",
"args": []
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
Substack CLI + 26-tool MCP server. Your IDE drafts replies via propose_reply. No API keys.
No automated test available for this server. Check the GitHub README for setup instructions.
Five weighted categories — click any category to see the underlying evidence.
No known CVEs.
No package registry to scan.
This server is missing a description. Tools and install config are also missing.If you've used it, help the community.
Add informationBe the first to review
Have you used this server?
Share your experience — it helps other developers decide.
Sign in to write a review.
Others in other
Persistent memory using a knowledge graph
Privacy-first. MCP is the protocol for tool access. We're the virtualization layer for context.
Make HTTP requests and fetch web content
Read, write, and manage files on the local filesystem
MCP Security Weekly
Get CVE alerts and security updates for io.github.06ketan/substack-ops and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
Standalone Substack CLI + 26-tool MCP server. Your IDE drafts the replies. Zero AI API keys.
Site → substack-ops.chavan.in · Source → 06ketan/substack-ops
Posts, notes, comments, replies, reactions, restacks, recommendations, search, profiles, feeds, automations, MCP server, Textual TUI. One Python install, one binary, MIT licensed.
uvx substack-ops mcp install cursor # or claude-desktop, claude-code, print
# Restart your host. Then in chat:
# "list unanswered comments on post 193866852"
# "draft a warm reply to comment 12345"
# "post that draft"
Your host's LLM (Cursor's, Claude's) does the drafting via the
propose_reply / confirm_reply tools. No ANTHROPIC_API_KEY /
OPENAI_API_KEY needed.
git clone https://github.com/06ketan/substack-ops && cd substack-ops
uv sync
uv sync --extra mcp # mcp SDK for the MCP server (recommended)
uv sync --extra tui # textual for the TUI
uv sync --extra chrome # pycryptodome + keyring for Chrome cookie auto-grab
Auth defaults to ~/.cursor/mcp.json's mcpServers.substack-api.env. Override
with env or .env. Or use one of the auth flows in auth login / auth setup.
uv run substack-ops auth verify
uv run substack-ops quickstart # 20-step tour
Grouped by intent. Every write defaults to --dry-run; flip with
--no-dry-run (and --yes-i-mean-it for the irreversible ones). All writes
land in .cache/audit.jsonl and are dedup-checked against .cache/actions.db.
| Command | What it does |
|---|---|
auth verify | Confirm the cookie works; print authed user/pub. |
auth test | Same as verify, exit non-zero on failure (CI-friendly). |
auth login --browser chrome|brave | Auto-grab cookie from local Chromium browser via macOS Keychain. |
auth login --email me@x.com | Email magic-link → paste-the-link interactive flow. |
auth setup | Interactive paste of connect.sid cookie. |
| Command | What it does |
|---|---|
posts list [--pub] [--limit] [--sort new|top] | List posts from a publication (yours by default). |
posts show <id|slug> [--pub] | Post metadata (title, dates, reactions, comment count). |
posts get --slug <slug> [--pub] | Same as show but slug-only. |
posts content <id> [--md] [--pub] | HTML body (auth-aware for paywalled). --md converts to Markdown. |
posts stats <id> | Engagement counts — reactions, comments. |
posts search <query> [--pub] [--limit] | Substack-side full-text search. |
posts paywalled <id> [--pub] | Boolean: is this post paywalled? |
posts react <id> [--off] [--pub] | Add (or remove with --off) a reaction. Defaults to ❤. |
posts restack <id> [--off] | Restack a post (Substack does not support unrestack). |
| Command | What it does |
|---|---|
notes list [--limit] | Your published Notes. |
notes show <id> | One note + its reply tree. |
notes publish <body> [--no-dry-run] | Publish a top-level Note. |
notes react <id> [--off] | React on any Note. |
notes restack <id> [--off] | Restack a Note. |
| Command | Wha