New MCP for Obsidian: richer tools for tags, links, frontmatter, and search

Hey everyone,

Posting here to share a [new local mcp connector I made](git path = /dp-veritas/mcp-obsidian-tools), in case it is of use for others.

I’ve been using Obsidian for years now across multiple roles and companies, for personal research projects, a master’s degree, a doctorate, etc.

Throughout all of these contexts, Obsidian has been invaluable for my process of cataloguing, capturing and organizing knowledge. But I’ve always felt like there was a missing piece: the ability to query and apply my vault’s accumulated knowledge in other workflows and tools (I tried bridging this gap with apps like Pieces, but nothing quite solved the problem the way I wanted), so I built my own MCP server with more comprehensive tooling than what I found scattered across GitHub.

I’ve been experimenting with MCP clients like Cursor and Claude. What I really wanted was a way to query my Obsidian vault as a proper knowledge base, but in a way that understands Obsidian’s patterns: tags, wikilinks, backlinks, frontmatter, and the relationships between/across notes.

Instead of just exposing basic “read this file” or “search this folder” functionality, my MCP provides a suite of obsidian_ tools that understand how Obsidian vaults actually work:

  • obsidian_search_notes: Search notes by filename with simple regex/wildcards, returning relative paths

  • obsidian_read_notes: Read the contents of multiple notes by path, with per-note error reporting

  • obsidian_list_tags and obsidian_notes_by_tag: Scan frontmatter tags and inline #tags, list tag counts, and fetch notes by tag (match any/all)

  • obsidian_get_frontmatter: Return YAML frontmatter as JSON so MCP clients can leverage metadata like author, tags, created, etc.

  • obsidian_backlinks: List all notes that link to a given note (both Obsidian wikilinks and standard Markdown links)

  • obsidian_search_content: Full-text search inside note contents, optionally returning snippets with context

  • obsidian_query: Natural-language query across the vault, with optional date filters based on frontmatter dates

All tools are read-only and locked to the vault directory for safety.


Here’s a real example of how this unlocked new insights for me:

I asked Claude (connected via MCP) to analyze the files in my bachelors thesis folder from undergrad, regarding public opinion on nuclear deterrence in the 1980s.

Then I asked: “How did this research feed into other projects in my vault?”

The MCP tools searched through my vault, found my Masters dissertation on the European Green Deal, and identified a connection I had never consciously made: both projects examine how external pressures drove large-scale institutional transformation. In 2014, I studied media-driven public opinion pressuring Reagan’s foreign policy shift. In 2021, I studied regulatory frameworks pressuring corporate and national energy transition behavior.

Same underlying mechanism, different domains, seven years apart. The tools surfaced this by understanding the content + relationships, not just file names or folder structures.


The server is written in Node and works with any directory of Markdown files:

  • Example configs for Cursor and Claude are included in the repo

A few things to be aware of:

  • Markdown-only searching: The obsidian_search_notes tool is specifically designed to search for Markdown (.md) files. If you have PDFs, images, or other attachments in your vault directory, they won’t appear in search results. This is intentional—the server focuses on the note content itself rather than treating the vault as a general file browser. However, if there’s demand for attachment discovery, I’m open to adding that.

  • Read-only by design: All tools are strictly read-only. The server won’t modify, create, or delete notes. This keeps things safe but means you can’t use it for automated note creation or updates through your MCP client.

  • Performance on large vaults: Some operations (like obsidian_list_tags or full-text obsidian_search_content) scan the entire vault. On very large vaults (thousands of notes), these may take a moment. There’s room for caching optimizations if this becomes a bottleneck.


This started as a way for me to query my own curated notes and combine that context with external information in Claude/Cursor. It’s already changed how I reuse old thinking in new projects, and I’d love to hear from other Obsidian + MCP users:

  • Are there other Obsidian-aware tools you’d want?
1 Like

I tried it, and found it easy to install (I’m on Cursor). Thanks for the tool and write-up.

I had pretty good results finding stuff and relationships with normal chat in Cursor. How to maximize the potential of using this server over what was okay with vanilla Cursor?

Gathering info here form other users as well, who will be hopefully vocal.
@PaulDickson from this thread I’d be interested to hear from.

Cheers

Working on this n8n mcp Insights workflow atm, it uses the n8n mcp connector or webhook so not exactly the same as the solution above but I can achieve something very similar without giving Claude Full Access to my Vault.

Works with the Post Webhook Community Plugin or Claude Desktop + n8n mcp connector
(video coming soon)

Workflow Purpose

This workflow automatically processes your AI chat conversations (Claude, ChatGPT, Gemini, etc.) and creates structured insight files in your Obsidian vault. When you trigger it via webhook from Obsidian, it:

  1. Receives the AI conversation content via webhook

  2. Analyzes the conversation using Gemini AI to extract structured insights

  3. Creates a formatted markdown file in your vault at 04 VAULT/AI/Insights/

Key Features

  • AI-Powered Analysis: Uses Gemini 2.5 Flash to extract:

    • Main topic and key takeaway

    • Emotional arc (for personal reflections) with emoji states

    • Key insights (3-5 minimum)

    • Action items and unresolved threads

    • Coping strategies and resources mentioned

    • Technical details (code, configs)

    • Related topics and tags

  • Conversation Type Detection: Handles different types:

    • Personal reflection

    • Technical problem-solving

    • Productivity/planning

    • Creative/research

    • Learning sessions

  • Smart Categorization: Automatically categorizes conversations and adds appropriate tags

  • Time Context: Identifies when the conversation happened (morning check-in, evening reflection, crisis moment, etc.)


    MARDOWN TEMPLATE

    tags:

    • Source/AI/[AI-Source
    • N8N/Automation
      Insight: [Category]
      Processed-Date: [Date]
      Created-Date: [Date]
      Source-AIChat: “[[Original-Filename]]”
      Source-Filepath: “[Original-Path]”
      Source-URL: [URL or null]
      AI-Source: [Claude/ChatGPT/Gemini]
      Category: “[[Category]]”
      Time-Context: [Morning-Checkin/Evening-Reflection/etc]
      Topics:

    Source AI Conversation

    [[Original-Filename]]

    File Path: [Original-Path]
    Original URL: [Link] (if applicable)


    Summary

    [One sentence summary of core theme]

    [!summary] Key Takeaway
    [The single most important insight from this conversation]

    Emotional Arc (for personal reflections)

    [Emoji journey: :anxious_face_with_sweat::thinking::relieved_face:]

    [2-3 sentence narrative of emotional journey]

    Key Insights

    • [Insight 1]
    • [Insight 2]
    • [Insight 3]
    • [Insight 4]
    • [Insight 5]

    Next Actions

    • [Action item 1]
    • [Action item 2]
    • Follow-up: [Unresolved thread 1]

    Coping Strategies (if applicable)

    • [Strategy 1]
    • [Strategy 2]

    Resources Mentioned (if applicable)

    • [Resource 1]
    • [Resource 2]

    Technical Details (if applicable)

    [Code snippets, configurations, technical solutions]
    

    Related Topics

    • [[Topic-1]]
    • [[Topic-2]]

    Auto-generated on [Date] by n8n workflow

Thanks for the feedback! To your point on maximizing potential, I have 2 replies:

  1. For me, I have a lot of rule files to handle a fairly varied set of professional responsibilities. In some cases, I want to use the perplexity/comet search api, in some cases the Pieces recap, and in other cases my Vault. To handle this, I wrote a sort of meta-rule that I pass in new chats for cursor’s plan mode - this is basically an intent agent that then will call upon other rules based on whatever i’m working on in that specific flow (ie some will use Notion/Jira/Obsidian/Mongo, while others will use Pieces/Asana/Obsidian/Figma, in some order of my choosing). Because there are pretty specific guardrails, I’ve got a sort of ranking system of which tools to leverage in which order. I realize this is very specific, but also that is imo the magic of obsidian in the first place; everyone’s real-world usage is quite bespoke. Hoping this is a good and general baseline for others to make it their own in practice.
  2. vanilla cursor on opus4.5 is pretty impressive, to your point I did not a/b test these side by side (with and without mcp tools loaded). the level of ‘okayness’ is probably also directly correlated to how tidy and well-linked one’s notes are, so also a big caveat on the utility.

Thanks again.

Thanks for sharing this description and diagram, Paul! It sounds like a very useful and practical application. One differentiator here is that the connector I developed above only has read access.

I also fully acknowledge some users would benefit from write tools, such as the one you are developing; personally I am strongly in the camp that one’s vault should be a repo of self-curated and written discover/knowledge (though I see the limitations of that stance too).

Thanks both, it’s good to be learning new things. Retrieval of semantic relationships is so essential and little details how to fine-tune tools to get the most out of them.

1 Like

I would say that I’m in the self-curated camp for 90% of notes in my Vault.
The goal system of the workflow above is to convert a raw AI Conversation into a Distill Insights Markdown file for review. I find it useful for when you have large conversations with LLMs and want to extract key insights without using too much cognitive effort. This allows the brain to scan a smaller concise insight note which can be distilled further or expanded on.

Its something I have been playing with to see if it works any better than me just copy pasting from an AI chat or forgetting what it was I discovered.

It does fall down though in the RAG department as it only processes one conversation at a time.

2 Likes

Seems as if some models will have problems creating the (order of) parameters when one uses natural language or a foreign language in natural language.
Then turning off the server may help.

May depend on model, language being used, workspace index shortage/failure, who knows…?
Turning the serve off and saying “try again”, worked straight away, giving me roughly what I wanted (I knew what I was looking for and where they ought to be found; it was live test).

Granted, the model’s internal murmur can be read like so:
I'm also limited by the tool's simple string/wildcard query. Given this, I'll need to explore different permutations and potential synonyms within the constraints.

I didn’t realize before that the server’s search function is not up to par…

Any thoughts? I see you’ve been editing files in your repo just now…

Hi, yes I have been doing some more stress testing for different use cases and trying to retrofit over the weekend. if you’re running up against some issues, please do share as find them and I’ll address.

Thanks also for flagging regarding this use case; I just did some testing on my end with non-English queries to investigate. (One caveat is that I have a very thorough set of rules set up governing the use/sequence of the tools)

I found the tools to be functioning with non-English input, but complex queries required more iterations (a non-english query took 16 tool calls, including a few dead ends, and a cross-referencing follow-up took 32 ;; while the same query in english only required 6 & 11 calls respectively), but it ultimately surfaced exactly what I was testing for.

I’ve updated the repo with your feedback, adding a “Model Compatibility” section to the readme, documenting some guidance on tool calling quality and non-english inputs.

Thanks again for the feedback!

1 Like

I appreciate this line; it resonates!

I have yet to find any ai, be it via prompt or mcp, that can train content I’ve captured & propertied, notes I’ve created, or my thoughts embedded in annotations to all of it - in a manner anywhere close to what I can do myself with core search and bases.

Over time I get to know my vault and, as a result, it gets better each day; via my own slant. That is a familiarity and context you cannot yet achieve or train via ai.

I’m not sold, yet, on having this personal analysis and insight replaced by ai. There is still merit in the act of ponder and the value in “slow work”.

When using Claude Desktop (with MCP) or Claude Code the pain points are

  1. Waiting for Claude to Respond
  2. Consistency in Responses
  3. Privacy Concerns (I don’t want you to read my whole vault) which can be controlled but becomes another thing to micro manage

This workflow was fun to make https://youtu.be/DyRGQ4dTLrg and I’m finding it useful to review my conversations with AI. It also only analyses one markdown conversation from the web clipper which means I can control it a bit more. I do know that these models are using our data for training and over time will build a profile on you similar to what Google does with your browsing habits.

I had a recommendation today for a new AI plugin inside of Obsidian which supports

  • Text

  • ImageGen

  • Speech

Going to have a play and see if it’s worth sharing :slight_smile:

1 Like