MCP server for publishing Markdown to Booklet from AI assistants and agents
Booklet MCP server demonstrates solid definition quality with all 5 tools featuring explicit names, descriptions, and JSON Schema input definitions. Tool names follow verb_noun convention (publish_page, update_page, get_page, list_pages, delete_page), making intent clear. All parameter descriptions are present. However, output schemas are not explicitly documented in the source code visible, and error handling descriptions lack recovery guidance. The server properly declares tool risks (WRITE, READ_ONLY, DESTRUCTIVE) via annotations, which is a positive pattern match. Tool descriptions are well-crafted (100-150 chars average), explaining WHAT the tool does and WHEN to use it. Parameters include appropriate enums (visibility), optional/required semantics, and sensible defaults (limit=20, offset=0). Main gaps: (1) output schema documentation is absent; (2) no recovery guidance in error descriptions; (3) no dependency hints between multi-step operations (e.g., 'use list_pages to find ID before delete').
Permanently delete a Booklet page. Cannot be undone — the URL stops working immediately. Use list_pages to confirm the ID first.
Retrieve metadata and (for pages under 8,000 characters) the raw Markdown of a specific page you own. Larger pages return metadata plus a resource link instead of the full body — follow up with resources/read to fetch it.
List Booklet pages owned by your account, with pagination via limit/offset.
Publish a new Booklet page from Markdown. Returns a permanent, public URL.
Update an existing Booklet page's content or metadata. The URL stays the same. Use list_pages to find page IDs.
Output schemas are not documented. LLMs cannot anticipate response structure for planning downstream calls. Each tool must declare what fields are returned (e.g., publish_page returns {url, id, created_at}), especially for tools that chain (publish_page → get_page).
Error handling descriptions lack recovery guidance. get_page states 'Larger pages return metadata plus a resource link' but does not say what error occurs if the page does not exist or if the user lacks permission. delete_page warns 'Cannot be undone' but does not guide what to do if deletion fails or if the page ID is wrong.
Missing dependency hints in descriptions. delete_page says 'Use list_pages to confirm the ID first', this is good. However, update_page also references 'Use list_pages to find page IDs' but only in the description text, not enforced. get_page could hint that after listing, use get_page to fetch full content before updating.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | A | 84 | 2026-07-28+ | v2 |
No confirmation mechanism for destructive operations. delete_page is marked DESTRUCTIVE but offers no dry-run, confirmation step, or undo option. Agents may inadvertently delete pages in retry loops.
list_pages pagination does not document total count or next_cursor. The description mentions 'pagination via limit/offset' but does not specify whether the response includes a total_pages or has_more field. Without this, LLMs cannot determine if more results exist.
Parameter constraints not fully formalized. list_pages accepts limit and offset but no min/max ranges are specified in the visible schema. If limit can be 1-100, 1-1000, or unlimited, that should be explicit in the parameter description.