obsidian-playwright-mcp
by smrik
README.md
# obsidian-playwright-mcp
**MCP server that lets AI assistants "see" and interact with the Obsidian app itself — not just read vault files.**
## Why This Exists
Obsidian plugins are debugged by AI today by reading source files, but that's blind. This server connects to Obsidian's Electron process via Chrome DevTools Protocol (CDP), letting Claude/any agent:
- **Screenshot** the app to see what's actually rendering
- **Execute JavaScript** in the running app context to query plugin state, trigger commands, inspect the DOM
- **Capture console logs** to see errors in real time
- **Automate UI actions** for testing plugins or validating layouts
Perfect for debugging why a plugin isn't rendering, testing UI state changes, or verifying behavior end-to-end.
## Gotchas
- **Obsidian must launch with `--remote-debugging-port=8315`** — standard startup doesn't enable CDP
- **Single connection at a time** — only one agent can connect per Obsidian instance
- **Console logs captured only after connect** — startup logs are missed
- Requires **Node.js v18+** and Windows (Obsidian.exe path is hardcoded)
## Quick Start
1. Launch Obsidian with debug port:
```powershell
Start-Process "C:\Users\patri\AppData\Local\Programs\Obsidian\Obsidian.exe" -ArgumentList "--remote-debugging-port=8315"
```
2. Configure MCP (`.claude/mcp_config.json`):
```json
{
"mcpServers": {
"obsidian-automation": {
"command": "node",
"args": ["C:/Projects/02-Dormant-or-Ideas/obsidian-playwright-mcp/obsidian-mcp-server.js"]
}
}
}
```
## Tools
| Tool | Purpose |
|------|---------|
| `connect_to_obsidian` | Establish CDP connection (run first) |
| `execute_in_renderer` | Run JavaScript: `app.commands.executeCommandById('...'), app.vault.read(...), app.plugins.plugins[...]` |
| `take_screenshot` | Capture current window state |
| `get_console_logs` | Fetch console output (filter by type: `"error"`, `"warning"`, etc.) |
| `get_page_info` | Get vault name, active file, window title |
| `disconnect` | Close connection |
## Example: Debug a Plugin
```javascript
// Connect
connect_to_obsidian()
// Returns: { success: true, title: "Home - MyVault - Obsidian v1.x" }
// Is the plugin loaded?
execute_in_renderer({ code: `!!app.plugins.plugins['my-plugin']` })
// Returns: { success: true, result: true }
// What's in the console?
get_console_logs({ filter: "error", limit: 5 })
// Returns: { logs: [{ type: "error", text: "Plugin init failed: ..." }] }
// Screenshot the error state
take_screenshot({ filename: "error-state.png" })
```
## Tech Stack
- Node.js + Playwright (CDP connectivity)
- @modelcontextprotocol/sdk (MCP protocol)
**Status**: Dormant (Jan 2026). See `SKILL.md` for detailed examples.
## Screenshots
_TODO (Patrik): add screenshots here._
This server cannot be deployed
Maintenance
ActivityStale
ResponsivenessNo issues