Skip to main content
Glama
TheOutcastVirus

Obsidian Knowledge Management MCP Server

Obsidian Knowledge Management MCP Server

A local MCP (Model Context Protocol) server that provides stateless I/O access to Obsidian vaults. This server enables LLMs to read, analyze, and manage Obsidian markdown files, YAML frontmatter, and wikilinks.

Key Features

  • Stateless I/O Layer: Pure data access and atomic operations - no semantic analysis

  • 35+ MCP Tools: Comprehensive vault management across 5 categories

  • Frontmatter Management: Parse, update, and validate YAML metadata

  • Wikilink Operations: Extract, analyze, and manipulate [[wikilinks]]

  • Graph Operations: Build link graphs, find backlinks, identify orphan notes

  • Full-Text Search: Literal and regex pattern matching across vault

  • Security: Path validation prevents directory traversal attacks

Installation

npm install npm run build

Configuration

Create a .env file based on .env.example:

VAULT_PATH=./Test Vault LOG_LEVEL=info MAX_CONCURRENT_OPS=10

Or set environment variables when running:

VAULT_PATH="./Test Vault" node dist/index.js

Usage

Running the Server

The server uses stdio transport for MCP communication:

VAULT_PATH="./Test Vault" node dist/index.js

Claude Desktop Integration

Add to your Claude Desktop MCP configuration:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

{ "mcpServers": { "obsidian-knowledge": { "command": "node", "args": ["/absolute/path/to/obsidian-knowledge-mcp/dist/index.js"], "env": { "VAULT_PATH": "/absolute/path/to/your/vault" } } } }

Available Tools (Phase 1 - Navigation)

1. list_notes

List all notes with optional filtering.

Arguments:

  • folder (optional): Filter by folder path

  • tags (optional): Array of tags (note must have all)

  • dateRange (optional): { start, end } in ISO format

  • offset (optional): Skip N notes for pagination

  • limit (optional): Return max N notes

Example:

{ "folder": "Studies/MATH 31AH", "tags": ["MATH31AH"], "limit": 10 }

Returns: Array of NoteMetadata with path, title, created date, tags, modified date, size.

2. read_note

Read a note with full metadata.

Arguments:

  • path (required): Vault-relative path (e.g., "Studies/MATH 31AH/Vectors.md")

Returns:

  • content: Full markdown content

  • frontmatter: Parsed YAML (or null if missing/malformed)

  • frontmatterError: Parse error message if YAML is malformed

  • outgoingLinks: Array of wikilinks with target, alias, heading, line, column

  • headings: Array of headings with level, text, line, id

  • stats: Line count, character count, modified timestamp

3. read_notes_batch

Read multiple notes in one call.

Arguments:

  • paths (required): Array of vault-relative paths

Returns: Array of ReadNoteResult (same as read_note)

4. search_notes

Full-text search across vault.

Arguments:

  • pattern (required): Search string or regex

  • isRegex (optional): Treat pattern as regex (default: false)

  • folder (optional): Limit search to folder

  • limit (optional): Max occurrences per note (default: 10)

Returns: Array of SearchResult with path, match count, and occurrences (with line, column, context).

5. get_vault_structure

Get folder hierarchy with note counts.

Arguments: None

Returns: FolderNode tree with path, name, note count, and children.

Architecture

┌─────────────────────────────────────────┐ │ MCP Server (index.ts) │ │ - Tool registration │ │ - Request routing │ └─────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ Tool Handlers (tools/*.ts) │ │ - navigation.ts - list, read, search │ │ - notes.ts - create, update, move │ │ - frontmatter.ts - get, update, bulk │ │ - links.ts - get links, backlinks │ │ - stats.ts - tags, titles │ └─────────────────────────────────────────┘ ↓ ┌──────────────────┬──────────────────────┐ │ Vault (vault.ts)│ Parser (parser.ts) │ │ - Path security │ - Frontmatter parse │ │ - File I/O │ - Wikilink extract │ │ - Validation │ - Heading extract │ └──────────────────┴──────────────────────┘

Error Handling

The server returns structured errors with actionable suggestions:

{ "success": false, "error": { "code": "FILE_NOT_FOUND", "message": "File not found: nonexistent.md", "context": { "path": "nonexistent.md" }, "actionable": "Use list_notes or get_note_titles to find available notes" } }

Error Codes:

  • PATH_OUTSIDE_VAULT: Path contains .. or escapes vault

  • FILE_NOT_FOUND: File does not exist

  • FILE_LOCKED: File in use by another process

  • INVALID_FRONTMATTER: YAML parse error

  • INVALID_PATH: Path contains illegal characters

Development

Building

npm run build # Compile TypeScript npm run dev # Watch mode

Testing

npm test # Run all tests npm run test:unit # Unit tests only npm run test:integration # Integration tests with Test Vault

Linting

npm run lint

Roadmap

Phase 1: Foundation & Navigation (Completed)

  • MCP server initialization

  • Vault access with path security

  • Frontmatter and wikilink parsing

  • 5 navigation tools (list, read, search, structure)

Phase 2: Note Management (Planned)

  • create_note - Create with content + frontmatter

  • update_note - Replace or patch sections

  • move_note - Relocate + update backlinks

  • delete_note - Remove + clean dangling references

Phase 3: Frontmatter Operations (Planned)

  • get_frontmatter - Parse metadata

  • update_frontmatter - Modify fields

  • bulk_update_frontmatter - Update across multiple notes

  • audit_frontmatter - Validate against schema

  • get_links - Outgoing wikilinks

  • get_backlinks - Incoming links

  • get_all_links - Complete link graph

  • insert_link - Add wikilink

  • get_orphan_notes - Notes with no links

  • get_headings - Heading structure

  • find_text_occurrences - Pattern matching

Phase 5: Statistics & Polish (Planned)

  • get_tag_list - All tags with counts

  • get_note_titles - All titles + aliases

  • Comprehensive documentation

  • Integration tests

  • Performance optimization

Design Principles

  1. Stateless: No caching, each call is independent

  2. Security: Path validation prevents escapes

  3. Rich Metadata: Include line numbers and positions for precise edits

  4. Graceful Degradation: Malformed frontmatter returns with error flag

  5. SOLID Principles: Clean separation of vault, parser, and tool layers

License

MIT

Contributing

Contributions welcome! This project follows SOLID principles and maintains a strict separation between the I/O layer (server) and intelligence layer (LLM).

-
security - not tested
F
license - not found
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TheOutcastVirus/obsidian-knowledge-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server