Credential-free MCP for Substack RSS archives, immutable content history, and deterministic analytics.
Strong foundation with 12 well-named tools following verb_noun convention. All tools have descriptions (avg 156 chars, within 10-1024 baseline). Input schemas present and mostly complete with type constraints and enums. Tool annotations (readOnlyHint, destructiveHint, idempotentHint) correctly applied. Key gaps: output schemas not documented in code; some parameter descriptions lack format/range details; error handling guidance minimal; no confirmation pattern for destructive operations (sync_publication, record_metric_snapshot, create/update_local_draft).
Calculate correlations between performance and word count, title length, and UTC send hour. Requires at least three measured posts.
Rank posts using normalized, deterministic rates from each post's latest stored snapshot.
Show publication configuration, local ledger counts, and synchronization freshness.
Create local Markdown content in the immutable ledger. This never contacts or publishes to Substack.
Return the canonical record and latest immutable content version for a local id, remote id, slug, canonical URL, or exact title.
Return the latest derived performance rates plus every stored raw metric snapshot for one post.
Output schemas not documented. LLMs cannot infer what fields to expect from tool responses (e.g., what does connection_status return? What structure does compare_posts ranking use?). This forces agents to guess downstream field names and risks broken tool chains.
No confirmation or dry-run pattern for destructive operations. sync_publication (WRITE), record_metric_snapshot (WRITE), create_local_draft (WRITE), and update_local_draft (WRITE) lack a confirmation step. Agents can accidentally overwrite or delete content without user approval.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2025-06-18+ | v2 |
Return timestamped RSS imports and local content changes, optionally scoped to one post.
Return the stored content-version history for one post, newest first, including exact bodies and SHA-256 digests.
List canonical post records and content-version digests. This omits full bodies; use get_post for exact content.
Store timestamped metrics obtained from Substack's official MCP against an existing post. Never enter estimates.
Import the publication's public RSS archive into the local immutable ledger. No credentials are used.
Update selected local draft fields by appending an immutable version. Existing sent versions cannot be changed.
Error handling lacks recovery guidance. No visible error responses that tell LLMs what to do next (e.g., 'Post not found. Try list_posts() to find valid identifiers'). Raw errors or stack traces give agents nothing actionable.
Parameter descriptions lack format/range details. 'identifier' appears in 6 tools but descriptions don't specify: 'Accepts local id (UUID), remote id, slug, canonical URL, or exact title. Example: "my-post-slug" or "https://example.substack.com/p/my-post"'. LLMs must guess valid formats.
analyze_content_patterns requires 'at least three measured posts' but this constraint is buried in the description. No validation error message shown if fewer than 3 posts exist. LLMs cannot predict failure or handle it gracefully.