Local MCP server that turns AI conversations into polished ebooks and delivers them to Kindle or email
StewReads MCP has 6 tools with generally clear naming and actionable descriptions. All tools have non-empty descriptions and explicit input schemas. However, several critical gaps limit production readiness: (1) Output schemas are not formally documented, the tool descriptions mention what will be returned (e.g., 'Saved ebook...') but do not specify structured output field types, which LLMs need to plan chaining; (2) Parameters lack comprehensive constraint documentation (e.g., output_dir accepts any string with no validation guidance, markdown size limits unstated); (3) Error handling is present but inconsistent, some tools return structured error objects with error_code/message, others rely on exceptions; (4) Some parameters have weak descriptions (e.g., filename: 'Optional custom filename for the EPUB (without extension)', does not specify max length, character restrictions, or conflict handling); (5) Tool composition is reasonable but save_ebook conflates EPUB generation, file I/O, and optional background audio generation, makes the tool do multiple things; (6) No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present, which would clarify retry safety for agents.
Send an EPUB via Gmail SMTP using App Password auth. If ebook_path is omitted, the most recent EPUB in output_dir is attached. Requires config email.from_email and env STEWREADS_GMAIL_APP_PASSWORD.
Check whether Gmail email sending is configured. Requires from_email in config and STEWREADS_GMAIL_APP_PASSWORD in env.
Read current non-sensitive StewReads config status. Use this before save_ebook to confirm output_dir is configured.
Return the StewReads markdown generation prompt used for ebook creation.
Save completed ebook markdown as an EPUB file in the user's configured output directory. Use this after writing the full ebook content. If config is missing, ask the user for a directory and call save_stew_config first. Arguments: markdown, title, optional filename, optional original_prompt, optional create_audio (requires ELEVENLABS_API_KEY env var).
Save user-configurable non-sensitive StewReads settings. If output_dir is missing, ask the user for their preferred local folder and call this tool. Do not use for passwords or secrets.
Output schemas not formally documented. Tool descriptions mention return structure (e.g., 'Saved ebook as EPUB') but do not specify JSON schema or field types. LLMs cannot reliably chain tools when output format is implicit.
Parameters lack constraint documentation. output_dir, markdown, filename, email subject/body accept free-form strings with no documented limits (max length, character restrictions, validation rules). This invites hallucinated invalid values from LLMs.
save_ebook conflates multiple concerns: markdown→EPUB conversion, file I/O to output_dir, optional background audio generation via ElevenLabs. Should be split into save_ebook (EPUB only) and generate_audiobook (optional async step). Single-responsibility principle violation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 66 | 2026-07-28+ | v2 |
| 2026-03-09 | C | 60 | - | v1 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. Agents cannot determine which tools are safe to retry. save_ebook and email_ebook are idempotent-safe if filename collision is handled, but agents have no visibility into this.
Error handling is inconsistent. Some tools return structured error dicts with error_code/message, but others (e.g., if markdown param is empty) rely on exceptions that may not produce agent-friendly messages. No recovery guidance provided (e.g., 'Call save_stew_config first' is mentioned in description but not in error response).
Parameter descriptions lack actionable detail. filename: 'Optional custom filename for the EPUB (without extension)', does not specify max length, allowed characters, or conflict resolution. to_email and body in email_ebook lack validation hints (email format, max body length).