substack-insights-mcp
Provides tools for archiving and analyzing Substack publication content and metrics, including syncing the public RSS archive, maintaining immutable content versions, recording metric snapshots from Substack's official analytics, comparing post performance, and analyzing content patterns.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@substack-insights-mcpShow me my top 5 posts by subscriptions per 1,000 delivered"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
This is an independent, unofficial project. It never signs in to Substack, accepts no Substack cookies, calls no private endpoints, and cannot publish. Use it only with a publication you own, administer, or have permission to archive.
Why this exists
An RSS feed tells you what went out. Substack's official MCP can tell you how it performed. Neither gives your assistant a durable, versioned memory that it can query next month.
Substack Insights MCP joins those pieces locally:
flowchart LR
RSS[Public RSS archive] -->|exact HTML + text| LEDGER[(SQLite ledger)]
OFFICIAL[Substack official MCP] -->|timestamped metric snapshot| LEDGER
DRAFT[Local Markdown] -->|immutable versions| LEDGER
LEDGER --> ANALYTICS[Deterministic analytics]
ANALYTICS --> MCP[12 MCP tools]
MCP --> CLIENT[Codex · Claude · Cursor · any MCP client]Everything important is stored as a fact: exact content, SHA-256 digests, capture times, metric sources, and raw snapshot values. The model can interpret the results; it cannot silently invent the arithmetic.
Related MCP server: substack-mcp
What you get
Archive | Analytics | Trust boundary |
Exact RSS HTML and searchable text | Open rate and normalized conversion rates | No credentials or private APIs |
Immutable local Markdown versions | Post rankings on comparable metrics | SQLite stays on your machine |
SHA-256 content fingerprints | Word-count, title-length, and send-hour correlations | Missing metrics remain missing |
Timestamped audit trail | Full metric history instead of latest-value overwrite | No remote writes—ever |
Quick start
Requirements: Node.js 22.5 or newer.
git clone https://github.com/jakewlittle-cs/substack-insights-mcp.git
cd substack-insights-mcp
npm ci
cp .env.example .envSet your publication origin in .env:
SUBSTACK_PUBLICATION_URL=https://your-publication.substack.com
SUBSTACK_INSIGHTS_DB_PATH=./data/substack-insights.sqliteThen build, test, and import the public archive:
npm run check
npm test
npm run build
node dist/src/cli.js syncAdd it to Codex
Use absolute paths for the executable and database:
codex mcp add substack_insights \
--env SUBSTACK_PUBLICATION_URL=https://your-publication.substack.com \
--env SUBSTACK_INSIGHTS_DB_PATH=/absolute/path/substack-insights.sqlite \
-- node /absolute/path/substack-insights-mcp/dist/src/cli.js serveFor another client, configure the equivalent stdio command:
{
"command": "node",
"args": ["/absolute/path/substack-insights-mcp/dist/src/cli.js", "serve"],
"env": {
"SUBSTACK_PUBLICATION_URL": "https://your-publication.substack.com",
"SUBSTACK_INSIGHTS_DB_PATH": "/absolute/path/substack-insights.sqlite"
}
}Pair it with Substack's official MCP
Substack's official MCP exposes private publication analytics through OAuth for eligible publication admins. Install it beside this server:
codex mcp add substack_official --url https://mcp.substack.com/api/v1/mcp
codex mcp login substack_officialThen ask your agent:
Using
substack_official, get the latest metrics for my recent posts. Match each result to the local archive and save every observed value withsubstack_insights.record_metric_snapshot. Then rank posts by subscriptions per 1,000 delivered and explain the strongest content patterns.
The agent is the bridge: it reads authoritative values from the official connector and records them here with source official_mcp and a capture timestamp. This project never receives or stores the official connector's OAuth token. See the snapshot workflow.
The toolbox
Tool | Purpose |
| Configuration, ledger counts, and sync freshness |
| Import the public RSS archive |
| Browse canonical post records and latest digests |
| Retrieve exact latest content for one post |
| Inspect immutable version history |
| Review imports and local content changes |
| Persist values observed through the official MCP |
| Get raw history plus derived rates |
| Rank comparable posts deterministically |
| Calculate content/performance correlations |
| Start versioned local Markdown—without publishing |
| Append a new immutable local version |
Analytics that show their work
open_rate: supplied value, or opens divided by delivered when absent.subscriptions_per_1000: signups—or free plus paid subscriptions—per 1,000 delivered.views_per_1000: views per 1,000 delivered.engagement_rate: likes plus comments plus shares, divided by views.content_patterns: Pearson correlations against word count, title length, and UTC send hour, with an explicit causation warning.
Comparisons use each post's latest stored snapshot. For sound conclusions, compare similar audiences at similar measurement ages.
Design promises
Local first. SQLite is the system of record and its file is restricted to the current user.
Immutable history. New content creates a version; it does not rewrite what was previously observed.
Provenance always. Metrics carry a source and capture time. Unknown stays
null.Deterministic math. Rankings and rates are ordinary code, covered by tests.
A narrow network boundary. The only Substack request is a public RSS
GET.
Read the architecture, operations guide, and security model for details.
Project status
v0.1.0 is the first public release. The storage format and MCP tool contracts are intentionally small and tested, but pre-1.0 APIs may evolve with release notes and migrations.
Contributions are welcome. Start with CONTRIBUTING.md, report security issues through SECURITY.md, and see the roadmap for good first directions.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server for Substack's official Publisher API that enables querying post analytics, subscriber counts, and publication data through natural language from MCP clients.65MIT
- Alicense-qualityAmaintenanceRead-only MCP server for accessing Substack content including publications, posts, comments, author profiles, recommendations, and Notes feed using your own session token.262MIT
- Alicense-qualityCmaintenanceMCP server for Substack that enables reading articles, comments, feed, and subscriptions from AI clients like Cursor and Claude, with optional authentication for paid content.342MIT
- AlicenseAqualityAmaintenanceA local MCP server for managing saved Substack posts. Enables offline reading, searching, bookmarking, and unbookmarking of Substack content via CLI or MCP clients.10MIT
Related MCP Connectors
AI Reasoning Cache & Consensus Layer with 11 MCP tools via Streamable HTTP.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Hosted MCP for X/Twitter and Reddit. 12 read-only tools, no API keys, free during beta.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/jakewlittle-cs/substack-insights-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server