Unofficial Substack MCP server. Born from frustration, built with AI. 12 tools, browser auth, rich text support. Not affiliated with Substack Inc.
Mixed quality across 14 tools. Strengths: all tools have descriptions (194 char avg meets baseline); most parameters typed; confirmation patterns on destructive ops (create_formatted_post, update_post, publish_post, schedule_post, delete_draft). Weaknesses: descriptions are verbose and repetitive rather than LLM-optimized (many exceed 300 chars with redundant warnings); output schemas completely undocumented, no tool declares what fields it returns; error handling absent, no recovery guidance or actionable error messages; several tools (research_topic, generate_post_ideas, format_content, analyze_post_performance) lack implementation visibility, making schema verification impossible; parameter descriptions sometimes generic ('The topic to research' vs 'Topic for web search (2-100 chars, e.g., "AI trends 2026")'); no pagination guidance on list_drafts/list_published_posts despite baseline requiring it.
Analyze the performance metrics of published posts
Convert markdown content to HTML for preview or export
Create a new formatted draft post on Substack. Supports full markdown formatting. IMPORTANT: You MUST ALWAYS ask the user to confirm creation in a follow-up message BEFORE calling this tool with confirm_create=true. Never set confirm_create=true on the first request, even if the user explicitly asks to create. This ensures users have time to review the content before creating.
Delete a draft post permanently
Format and enhance content with rich text styling and structure
Generate creative post ideas based on a topic or theme
Output schemas completely undocumented. No tool declares return type, field names, or structure. LLMs cannot plan downstream calls or extract required data (e.g., post_id from create_formatted_post). Violates pattern:tool and pattern:response-shaper.
Descriptions are verbose (many 200-400+ chars) with repetitive warnings ('IMPORTANT: You MUST ALWAYS ask...') rather than LLM-optimized. Baseline is 194 chars avg; these waste tokens on boilerplate. Confirmation logic should be enforced server-side, not repeated in every description.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | <=2025-11-25 | v2 |
Get the full content of a specific draft post for reading or editing
List recent draft posts from your Substack publication
List recently published posts from your Substack publication
Publish a draft post immediately to your Substack publication. This makes the post publicly visible to subscribers and sends it via email if enabled. IMPORTANT: You MUST ALWAYS ask the user to confirm publishing in a follow-up message BEFORE calling this tool with confirm_publish=true. Never set confirm_publish=true on the first request, even if the user explicitly asks to publish. This action cannot be easily undone.
Research a topic using web search and summarize findings
Schedule a draft post for future publication on Substack. IMPORTANT: You MUST ALWAYS ask the user to confirm scheduling in a follow-up message BEFORE calling this tool with confirm_schedule=true. Never set confirm_schedule=true on the first request.
Update an existing Substack draft post. WARNING: This tool COMPLETELY REPLACES the specified fields - it does NOT make partial edits. If you provide content, it will REPLACE ALL existing content. To make small edits, first use get_post_content to read the current content, make your changes, then provide the ENTIRE updated content. IMPORTANT: You MUST ALWAYS ask the user to confirm updates in a follow-up message BEFORE calling this tool with confirm_update=true. Never set confirm_update=true on the first request.
Upload an image to Substack CDN and get an optimized URL
No error handling or recovery guidance. Tools lack actionable error messages. E.g., if upload_image fails, LLM gets no hint to retry, check file format, or call a different tool. Violates pattern:recovery-guide.
list_drafts and list_published_posts lack pagination guidance. No mention of limit behavior, total count, or next_cursor. Baseline requires pagination for list tools. If 100+ drafts exist, LLM gets only 10 with no way to fetch more.
Implementation visibility missing for 5 tools (research_topic, generate_post_ideas, convert_markdown_to_html, format_content, analyze_post_performance). Source code not provided; schemas inferred only from JSON.