Co-written with Claude Desktop + Obsidian MCP
Updated: Aug 9, 2025 8:35am
The Problem
I wanted Claude to open my daily note in Obsidian. Sounds simple, right? Claude could create files and search my vault through the MCP tools, but it couldn't invoke the "Daily notes: Open today's daily note" command that respects my plugin settings and templates.
When Claude tried the obvious approach - creating a file with today's date - it used the wrong naming format and put it in the wrong folder. My daily notes live in DailyNotes/
with YYYY.MM.DD.md
format, not the root folder with YYYY-MM-DD.md
.
The Hunt
I had this hunch: if I can run commands in Obsidian's developer console, maybe Claude could too. We tested it manually:
app.commands.executeCommandById("daily-notes")
It worked. The command exists, it's accessible, and it respects all my settings.
But here's the catch: Claude was trying to execute JavaScript in Chrome, not Obsidian. Different apps, different contexts. The MCP tools can read and write files, but they can't execute commands within Obsidian itself.
The Insight
This revealed a fundamental gap. The Obsidian MCP integration can manipulate files but can't invoke the rich command ecosystem that makes Obsidian powerful. Every plugin command, every template action, every workflow automation - all inaccessible to external tools.
The solution isn't a workaround. It's extending the MCP tools to include command execution. The API exists (app.commands.executeCommandById
), it just needs to be exposed through the MCP interface.
What I Learned About Claude
Claude doesn't learn between conversations. I pointed out a formatting error (missing newlines when appending to files), Claude fixed it, but it won't remember this lesson tomorrow. Each conversation starts fresh. If you want consistent behavior, create reference materials or give explicit reminders.
Claude is methodical when it has the right tools. It systematically explored the vault structure, identified the naming patterns, and proposed a solid technical solution. But when the tools don't exist, it can't magic them into being.
Integration gaps are valuable discoveries. What started as "help me open a daily note" became a clear project plan for enhancing Obsidian's automation capabilities.
The Discovery Method That Actually Works
Here's something crucial I learned: don't read the code to understand what an MCP server provides - talk to it directly.
I could have spent hours parsing TypeScript files trying to figure out what tools were available. Instead, one JSON-RPC call told me everything:
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}' | mcp-server | jq -r '.result.tools[].name'
This revealed 18 available tools - the actual runtime capabilities, not what the code suggested might exist. MCP servers are dynamic systems. They assemble their tool manifests at runtime based on:
- Which plugins are loaded
- What APIs are available
- Environmental conditions
- Dynamic capability detection
The available tools aren't a static list in the code - they're the result of all the registration code executing. Runtime introspection beats static analysis every time for understanding dynamic systems.
The Takeaway
Sometimes the best outcome isn't solving the original problem - it's understanding why it can't be solved and what needs to be built. I now have a roadmap for adding command execution to Obsidian's MCP tools, which will unlock much richer automation possibilities.
But more importantly: when working with dynamic systems, talk to them directly. The runtime truth is the only truth that matters.
The daily note thing? I'll just press Cmd+P and run the command manually. For now.