Model Context Protocol server for Obsidian.md vaults that provides knowledge base tools for searching personal wiki notes and the internet
The server has 4 tools with varying quality. web_research has an excellent description (184 chars, actionable guidance on when/how to use), but its schema is minimal (single string param with basic description). obsidian_search, obsidian_read_note, and obsidian_traverse_relations have adequate descriptions but lack parameter depth and output schema documentation. All tools are read-only (low risk), but descriptions for Obsidian tools lack the LLM-optimization seen in web_research. No error handling guidance, no output schemas documented, no parameter constraints (enums, ranges, formats). Naming is clear and verb-forward (search, read, traverse), but parameter descriptions lack detail on format/constraints expected by downstream tools (e.g., what format is 'note_name'? Does it include .md extension? Is it case-sensitive?).
Read the full text of a specific note from the Obsidian vault
Search the user's personal Obsidian vault for notes matching a query
Traverse typed relationships in the vault to find related notes (prerequisites, components, alternatives, tooling, etc.)
Use this tool to find information from the internet — including recent news, current pricing, live documentation, and anything that requires up-to-date data beyond your training knowledge. Trigger this tool when the user asks you to: - Look up, check, or fetch information from a specific website or URL - Find recent or current information (news, releases, changelogs, CVEs, announcements) - Compare or research topics that require browsing the web - Answer questions where the answer may have changed recently Provide a full sentence describing what to find, with as much context as possible (timeframe, specific site, etc.). Example: "Find the current Claude API pricing on Anthropic's website" rather than "claude pricing". You can include full url to read. Example: "How article https://archive.org/abs/1234 describes research methotology" Do NOT use this tool for tasks that only require reading local files, running code, or answering from existing context. Args: query (str): question to research Returns: str: answer found by the researcher agent
Output schemas not documented. The tool descriptions state what they return (e.g., 'answer found by the researcher agent', 'Search vault for notes matching a query'), but do not specify the structure, field names, or data types of the returned object. LLMs cannot plan downstream tool calls or extract data reliably without knowing the shape of the response.
Parameter descriptions lack constraint details. 'query' in web_research and obsidian_search accepts any string, but best practices require format guidance: 'Full sentence describing what to find, e.g., "Find the current Claude API pricing on Anthropic's website"' is provided for web_research but absent for obsidian_search. 'note_name' has no guidance on format (does it include .md? Is it case-sensitive? Does it support paths like 'folder/note'?). 'relation_types' array is undescribed, what relation types are valid?
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 61 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 33 | - | v1 |
No error handling guidance. If obsidian_read_note fails (note not found), or obsidian_search returns zero results, the descriptions do not advise the LLM what to do next. Should it try a different query? Call obsidian_traverse_relations? Suggest alternatives? Without recovery guidance, agents get stuck on ambiguous failures.
Parameter constraints not enforced. 'limit' in obsidian_search has no min/max bounds. Does limit=1000 work? Does it timeout? Does it waste tokens by returning too many results? Without documented ranges, LLMs guess and risk API abuse. 'depth' in obsidian_traverse_relations similarly lacks bounds.
Obsidian tools lack inter-tool chaining metadata. If obsidian_search returns matching notes, does it return 'note_name' fields that obsidian_read_note can immediately consume? If obsidian_traverse_relations returns related notes, are they in a format obsidian_read_note understands? Broken field naming between tools forces extra discovery calls.