MCP server for Obsidian MCP Web Agent. Drives Obsidian's built-in Web viewer via Chrome DevTools Protocol. Pairs with the Obsidian plugin of the same name.
13 tools with complete schemas and descriptions, but descriptions are terse (avg 50 chars, well below 194-char baseline). All tools have input schemas with proper types. Naming follows verb_noun pattern consistently (obsidian_list, obsidian_navigate, etc.). No parameter descriptions beyond the schema, LLMs must infer meaning from names alone. Output schemas undocumented. Error handling minimal (no recovery guidance, no categorization). No tool annotations (readOnlyHint/destructiveHint). Risk metadata present but not integrated into descriptions.
Click an element in a Web viewer tab by CSS selector
Evaluate JavaScript code in the context of a Web viewer tab
Focus an element in a Web viewer tab by CSS selector
List all open Web viewer tabs in Obsidian
Navigate the active Web viewer tab to a URL
Open a new Web viewer tab with the given URL
Press a keyboard key in a Web viewer tab
Descriptions are terse (avg 50 chars vs 194-char baseline). 'Evaluate JavaScript code in the context of a Web viewer tab' lacks WHEN to use, prerequisites, or return value structure. LLMs cannot determine tool selection confidence.
No output schemas documented. LLMs cannot plan downstream calls or extract return values. E.g., obsidian_read_text returns text content, but max length, encoding, and structure are undocumented.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Risk metadata exists (READ_ONLY, WRITE) but is not exposed to the LLM via MCP tool annotations. LLMs cannot infer safety properties.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Query elements in a Web viewer tab using CSS selectors
Read the current state of a Web viewer tab (URL, title, content length, ready state)
Read the visible text content from a Web viewer tab
Capture a screenshot of a Web viewer tab
Scroll a Web viewer tab by a specified amount
Type text into a focused element or a selector-targeted element in a Web viewer tab
Error handling is minimal. Code shows generic CDP timeouts and 'No Web viewer tab matched' but no recovery guidance. E.g., 'No Web viewer tab open' should suggest 'Call obsidian_new_tab(url) to open one.'
Parameter 'tab' accepts number|string|null but descriptions do not explain the three modes clearly. LLMs may pass wrong types. Should document: 'Tab index (0-based number), URL fragment substring (string), or null for first tab.'