Model Context Protocol server for Substack integration. Provides tools for creating, editing, and publishing Substack posts.
Server has 11 tools with complete input schemas and descriptions. Naming follows verb_noun convention (create_, update_, append_, add_, publish_, post_, get_, list_). However, descriptions are minimal (10-50 chars), lacking context on WHEN to use each tool or what happens on failure. Parameters are typed but many lack descriptions (e.g., 'draft_id' in substack_add_code_block has no description). Output schemas are not documented. Error handling is absent, no guidance on retryability or recovery. Live blogging tools (substack_live_blog_start, substack_live_blog_end) rely on global state, violating stateless design. No tool annotations (destructiveHint, readOnlyHint) despite clear risk levels (WRITE, IRREVERSIBLE). Schemas are present but sparse; descriptions fall short of the 50-200 char LLM-optimized baseline.
Add a code block to a draft
Add an image to a draft
Append content to an existing draft (for live blogging)
Create a new Substack draft post
List all drafts
List published posts
End the current live blogging session
Descriptions are too brief (10-50 chars) and lack context. LLMs need 50-200 char descriptions explaining WHAT the tool does, WHEN to use it, and what happens on error. E.g., 'substack_add_code_block' is described as 'Add a code block to a draft', no mention of supported languages, max size, or failure modes.
Many parameters lack descriptions. 'draft_id' appears in 5 tools but is never described. 'language' in substack_add_code_block has no description of valid values. LLMs cannot infer parameter meaning from names alone.
No output schemas documented. Tools return results but LLMs have no visibility into response structure. E.g., substack_get_drafts returns a list but the schema of each draft object is not specified. This forces LLMs to guess field names for downstream calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | 2026-07-28+ | v2 |
Start a live blogging session
Post a short note (like a tweet)
Publish a draft to your Substack
Update an existing draft's content
No error handling or recovery guidance. Tools have no documented error cases, retryability, or actionable error messages. If substack_publish fails, the LLM has no guidance on whether to retry, ask the user, or abort.
Live blogging tools (substack_live_blog_start, substack_live_blog_end) rely on global state variable 'live_session'. This violates stateless request handling and makes the server non-idempotent. Agents cannot safely retry or parallelize calls.