Model Context Protocol server for Drafts app on macOS via AppleScript.
This server demonstrates good definition quality with strong naming conventions, comprehensive tool descriptions, and well-structured schemas. All 18 tools follow verb_noun naming pattern (list_, get_, create_, update_, add_, search_, run_, flag_, archive_, inbox_, trash_). Descriptions are clear and action-oriented, ranging from 40-180 chars. All tools have explicit input schemas with proper type definitions and parameter descriptions. Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present on most tools, supporting proper agent reasoning about safety. However, output schemas are not documented in the source code, the tool definitions show only input schemas. Parameter descriptions are good but could be more prescriptive about constraints and dependencies. Three tools (drafts_create_draft, drafts_update_draft, drafts_add_tags) lack proper error handling guidance in descriptions.
Add tags to an existing draft
Archive a draft
Create a new draft with content and optional tags
Flag or unflag a draft
Get the current draft open in Drafts
Get the current workspace in Drafts
Get a specific draft by its UUID
Output schemas not documented in tool definitions. The source code shows only input schemas; response structures are not specified. This forces LLMs to infer output fields and makes tool chaining error-prone.
Destructive operation (drafts_trash) lacks confirmation/dry-run pattern. Tools that permanently delete should support a confirmation step or explicit safety check before execution to prevent agent mistakes.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 76 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Get drafts with flexible filtering by content, folder, tag, flagged status, and dates. Returns summaries (no content) — use drafts_get_draft for full content.
Get a tag and its associated drafts. Returns summaries (no content) — use drafts_get_draft for full content.
Get drafts from a specific workspace, optionally filtered by folder. Returns summaries (no content) — use drafts_get_draft for full content.
Move a draft to inbox
List all available actions in Drafts
List all tags in Drafts
List all workspaces in Drafts
Run a Drafts action on a specific draft
Search for drafts using a query string. Returns summaries (no content) — use drafts_get_draft for full content.
Move a draft to trash
Update the content of an existing draft
Error handling guidance missing from descriptions. None of the tool descriptions indicate what errors might occur, how to recover, or what to do if a UUID is invalid, a tag doesn't exist, or an action fails. Descriptions like 'Run a Drafts action on a specific draft' do not mention error cases.
Query parameter in drafts_get_drafts lacks format constraints. The 'query' parameter accepts free-form text but does not document operator syntax (AND, OR, quotes, etc.) or length limits. This invites malformed queries.
Date parameters in drafts_get_drafts lack format specification. createdAfter, createdBefore, modifiedAfter, modifiedBefore accept strings but do not specify ISO 8601 or alternative formats. Example '2024-01-01' in description is helpful but not a formal constraint.
folder parameter enums not consistent across tools. drafts_get_workspace_drafts and drafts_get_drafts both have folder enum ['inbox', 'archive', 'trash'], but descriptions don't clarify whether folder filtering is optional or required, or what happens when omitted.