MCP server for interacting with Obsidian vaults, providing tools for searching, reading, creating, updating, and deleting notes, as well as discovering backlinks and managing tags
This server demonstrates basic MCP tool registration but falls significantly short of production quality standards. While all 8 tools are properly named with action verbs and include descriptions, the schemas visible in the code are incomplete, tool registrations in server.go show Tool objects with Name and Description fields but NO input schema definitions. The input types are defined in internal/note/types.go using Go structs with jsonschema tags, but these are NOT passed to mcp.AddTool() calls. This means the MCP protocol has no visibility into parameter schemas, forcing clients to infer structures. Descriptions are present but brief (20-180 chars), lacking the clarity needed for LLM selection in ambiguous scenarios. No output schemas are documented or visible in the MCP registration. Error handling is absent from the tool definitions, no guidance on retryability, user-fixable vs fatal errors, or recovery paths. The tool design itself is reasonable (single responsibility, appropriate naming), but the protocol implementation is incomplete.
Create a new note with YYYY-MM-DD_slug.md naming convention and YAML frontmatter. Supports tags and subfolder placement.
Delete a markdown note from the vault. Only .md files can be deleted.
Find all notes that link to a given note via [[wikilinks]]. Supports [[note]] and [[note|alias]] syntax.
List all tags found across the vault from YAML frontmatter and inline #tags. Optionally filter by prefix.
Read the content of one or more notes. Returns content with error handling per file.
Full-text search across note bodies. Returns matching file paths, line numbers, and snippets. Supports regex patterns.
Search for notes by filename using case-insensitive matching. Supports regex patterns.
NO INPUT SCHEMAS REGISTERED WITH MCP SERVER. Tools are registered with Name and Description only; input parameter schemas defined in Go structs are never passed to mcp.AddTool(). Clients cannot see parameter names, types, descriptions, or constraints. This violates MCP protocol spec and forces clients to guess required parameters.
NO OUTPUT SCHEMAS DOCUMENTED. Tool descriptions and type definitions include output structs (SearchNotesOutput, CreateNoteOutput, etc.) but MCP clients have zero visibility into return structure, field types, or semantics. LLMs cannot plan downstream tool calls without knowing what fields to expect.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 0 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 43 | - | v1 |
Update an existing note's content. Supports 'replace' (overwrite) and 'append' modes.
DESCRIPTIONS LACK RECOVERY GUIDANCE. Tool descriptions state what happens but do not guide error recovery. E.g. 'Search for notes' provides no hint on what to do if no results found, how to refine queries, or when to use search_content vs search_notes. Descriptions average 65 chars; LLM-optimized range is 50-200.
DESTRUCTIVE OPERATIONS LACK CONFIRMATION. delete_note can destroy files permanently with no dry-run, preview, or confirmation step. Agents cannot verify intent before execution. No mention of this risk in the tool description.
NO ERROR CLASSIFICATION OR ACTIONABLE ERROR MESSAGES. Tool definitions include no guidance on error codes, retryability, or user-fixable vs fatal errors. Handlers may throw raw exceptions instead of structured recovery hints.
MISSING PAGINATION GUIDANCE. search_notes and search_content may return large result sets but tool descriptions and schemas provide no limit, offset, or pagination support. No statement of result count cap. Risks context window exhaustion.
PARAMETER CONSTRAINTS NOT DOCUMENTED. create_note accepts 'folder' and 'tags' parameters with no validation rules stated in descriptions (e.g., max folder depth, tag naming rules, special characters). update_note 'mode' parameter lists 'replace' and 'append' options but they're not in an enum.