MCP server for newsletter creators — save sources, organize notes, draft articles with AI
Inkwell MCP has 18 tools with complete JSON Schema definitions and descriptions for all tools and most parameters. However, there are systematic quality issues: (1) Many parameter descriptions are generic and lack actionable constraint details (e.g., 'Optional filter by source type' without explaining what type values are valid). (2) Output schemas are entirely undocumented, the tool definitions show input schemas only; return structures are never defined. (3) Some descriptions are under 100 characters and lack situational context (e.g., 'List editorial notes, optionally filtered by type, status, priority, or target article', 91 chars, no guidance on when to call this). (4) Several tools accept free-form string enums (e.g., 'status' in list_sources accepts 'active' or 'inactive' but this is stated only in the description, not enforced via schema enum). (5) The 'enrich_article' tool is vague about what 'auto-enrich' means and what side effects occur. (6) No error handling documentation or recovery guidance anywhere. (7) Parameters like 'apiKey' in 'import_newsletter' expose sensitive credentials as tool parameters, violating secret injection patterns. Overall: solid schema structure, but descriptions are underspecified for LLM use, output contracts are missing, and security/error handling are absent.
Create a new article (edition, analysis, or special) with optional title, subtitle, content, and metadata
Create a new expert record with name, affiliation, expertise areas, and tier
Auto-enrich an article: detect tags via patterns, link experts by name, determine signal (bullish/bearish/neutral), extract TL;DR
Retrieve a single article by ID with all metadata (experts, tags, sources, notes)
Import articles from an external newsletter platform (Beehiiv, Kit, Ghost, or Substack)
List articles, optionally filtered by status, type, or publication date range
List experts, optionally filtered by tier or sorted by citation count
No output schemas documented for any tool. All tool definitions show input schemas only; return value structures are never specified. LLMs cannot plan downstream tool calls or extract required fields when the shape of returned data is unknown.
Credentials (apiKey) exposed as tool parameters in import_newsletter. Tool parameters are logged and may appear in traces/context, secrets must be injected server-side via environment variables or vault.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 49 | 2024-11-05+ | v1 |
List editorial notes, optionally filtered by type, status, priority, or target article
List all editorial sources, optionally filtered by status, type, or target article
List all tags, optionally filtered by category
Save an editorial note (idea, angle, quote, fact, todo, outline) for newsletter writing
Save a source (article, video, social post, etc.) with optional notes, tags, and selected text for newsletter article preparation
Full-text search across article titles, content, and subtitles
Full-text search across editorial source titles, descriptions, and URLs
Update an article (title, content, status, metadata)
Update an expert record (name, affiliation, expertise, tier, notes)
Update an editorial note (content, status, priority, target article)
Update an editorial source (description, status, target article, etc.)
Enum values stated only in descriptions, not enforced via JSON Schema. E.g., 'status' in list_sources described as 'active' or 'inactive' but schema defines it as plain string type. LLMs cannot be certain which values are valid and may hallucinate options.
Parameter descriptions lack actionable constraint details. E.g., 'Optional filter by source type' (list_sources) does not explain valid type values (article, report, dataset, interview, video, podcast, social, other). LLMs must guess or read the create_article tool to infer the enum.
No error handling or recovery guidance. Tools have no documented error cases, no recovery suggestions, and no actionable error messages. E.g., if import_newsletter fails due to invalid API key, what should the LLM do next?
enrich_article description (48 chars: 'Auto-enrich an article: detect tags via patterns, link experts by name, determine signal (bullish/bearish/neutral), extract TL;DR') is vague about side effects. Does this tool modify the article in place? What if tagging fails, is enrichment partial or all-or-nothing?
Several list_* tools (list_sources, list_notes, list_articles, list_experts) accept limit and offset for pagination but output schema never specifies whether total count or next_cursor is returned. LLMs cannot determine if more results exist without seeing the response structure.
import_newsletter parameter descriptions are generic. E.g., 'Optional API base URL (for Ghost Content API)' does not explain format (http vs https, with/without trailing slash). 'Optional publication ID (for Beehiiv)' does not explain how to find it.
Tool names are consistent and verb-driven (save_, list_, update_, create_, search_, get_), which is excellent. However, no tool provides idempotency guarantees or confirmation patterns for destructive operations. If an agent retries save_source with duplicate content, will it create duplicates?