MCP server giving Claude end-to-end encrypted access to a Standard Notes vault (protocol 004, local stdio only)
mcp-standardnotes exhibits strong definition quality overall. All 16 tools are explicitly registered with descriptions and input schemas derived from Zod validators. Tool names follow verb_noun convention (notes_list, notes_create, tags_delete). Descriptions are clear and concise (avg ~120 chars), explaining what each tool does and when to use it. Schemas are complete with type definitions for all parameters. However, several parameter descriptions lack specificity about constraints, formats, and valid ranges. Error handling is implicit (wrapped in generic JSON responses) with no explicit recovery guidance. Output schemas are not formally documented, responses are JSON serialized but structure is inferred. The tool composition is solid: notes and tags are properly separated, pagination is supported, and batch operations exist (notes_create_many). Security is handled server-side via environment variables (SN_EMAIL, SN_SERVER_URL). Notable gaps: no tool annotations (readOnlyHint, destructiveHint, idempotentHint), no documented output schemas, and parameter descriptions could be more prescriptive about constraints.
Create a new note.
Create up to 50 notes in a single sync push. Returns the list of created uuid+title.
Trash a note (permanent=true purges irreversibly).
Fetch a single note's full content by UUID.
List notes (decrypted locally). Returns uuid/title/updatedAt/preview. Optional `tag` filters by tag UUID or title; set `includeDescendants: true` to also include notes filed under any child/grandchild tag (SN folder behavior).
Full-text search across decrypted notes.
Output schemas not documented. Tools return JSON-serialized results with wrap() helper, but structure is implicit. LLMs cannot reliably predict response shape for downstream composition without documented schemas (e.g., notes_list returns uuid/title/updatedAt/preview but this is not formally declared).
Tool annotations missing. destructiveHint not set on notes_delete, tags_delete. readOnlyHint not set on notes_list, notes_stats, notes_search, notes_get, tags_list, tags_get, sync. idempotentHint not set. These hints help LLMs reason about side effects, retry safety, and plan composition.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | <=2025-11-25 | v2 |
Vault statistics: counts (total/active/trashed), tags, byNoteType, sizes, oldest/newest/largest note.
Update an existing note by UUID.
Force a full sync with the server. Returns decrypted note/tag counts.
Attach an existing tag to a note.
Create a new tag. Pass `parent` (tag UUID) to nest it under a folder.
Delete a tag (permanent — tags have no trash state).
Remove a tag from a note.
Fetch a single tag (title, linked note UUIDs, parentUuid) by UUID.
List all tags (uuid, title, updatedAt, noteCount, parentUuid).
Rename a tag and/or move it in the folder hierarchy. `parent`: tag UUID to re-parent, null to detach, omit to leave unchanged.
Parameter descriptions lack constraint specificity. 'limit' and 'offset' parameters have no min/max bounds (notes_list, notes_search). 'tag' parameter description does not explain how to discover valid tag UUIDs or titles. Parameter format/length restrictions not specified.
Error handling not explicit. Tools wrap results in generic JSON responses with no error categorization, recovery guidance, or actionable messages. If a note UUID is invalid or a tag parent doesn't exist, the LLM receives only the exception message with no hint on how to recover.
Destructive operations lack confirmation/dry-run support. notes_delete and tags_delete execute immediately. For destructive operations, consider adding a 'confirm' step or dry-run mode to prevent accidental data loss.