Obsidian Semantic
STDIOAI-optimized semantic MCP server for Obsidian with 5 intelligent operations replacing 20 tools.
AI-optimized semantic MCP server for Obsidian with 5 intelligent operations replacing 20 tools.
🎉 Exciting News! We've taken everything we learned from this project and created something even better! Check out the new Obsidian MCP Plugin - a native Obsidian plugin that runs directly inside your vault with improved performance, simplified setup, and enhanced features. We encourage you to try it out!
A semantic, AI-optimized MCP server for Obsidian that consolidates 20 tools into 5 intelligent operations with contextual workflow hints.
This MCP server taught us valuable lessons about AI integration with Obsidian. We've applied these insights to create the Obsidian MCP Plugin, which offers:
npm install -g obsidian-semantic-mcp
Or use directly with npx (recommended):
npx obsidian-semantic-mcp
View on npm: https://www.npmjs.com/package/obsidian-semantic-mcp
Install the Obsidian Plugin:
Configure Claude Desktop:
The npx command is automatically used in the Claude Desktop configuration. Add this to your Claude Desktop config (usually found at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{ "mcpServers": { "obsidian": { "command": "npx", "args": ["-y", "obsidian-semantic-mcp"], "env": { "OBSIDIAN_API_KEY": "your-api-key-here", "OBSIDIAN_API_URL": "https://127.0.0.1:27124", "OBSIDIAN_VAULT_NAME": "your-vault-name" } } } }
This server consolidates traditional MCP tools into an AI-optimized semantic interface that makes it easier for AI agents to understand and use Obsidian operations effectively.
Traditional MCP servers expose many granular tools (20+), which can overwhelm AI agents and lead to inefficient tool selection. Our semantic approach:
vault - File and folder operations
list, read, create, update, delete, search, fragmentsedit - Smart content editing
window (fuzzy match), append, patch, at_line, from_bufferview - Content viewing and navigation
window (with context), open_in_obsidianworkflow - Get guided suggestions
suggestsystem - System operations
info, commands, fetch_webfetch_web fetches and converts web content to markdown (uses only url parameter)Instead of choosing between get_vault_file, get_active_file, read_file_content, etc., you simply use:
{ "operation": "vault", "action": "read", "params": { "path": "daily-notes/2024-01-15.md" } }
The response includes intelligent workflow hints:
{ "result": { /* file content */ }, "workflow": { "message": "Read file: daily-notes/2024-01-15.md", "suggested_next": [ { "description": "Edit this file", "command": "edit(action='window', path='daily-notes/2024-01-15.md', ...)", "reason": "Make changes to content" }, { "description": "Follow linked notes", "command": "vault(action='read', path='{linked_file}')", "reason": "Explore connected knowledge" } ] } }
The system tracks context tokens to provide relevant suggestions:
[[links]], it suggests following themThe window edit action automatically buffers your new content before attempting the edit. If the edit fails or you want to refine it, you can retrieve from buffer:
{ "operation": "edit", "action": "from_buffer", "params": { "path": "notes/meeting.md" } }
The semantic editor uses fuzzy matching to find and replace content:
{ "operation": "edit", "action": "window", "params": { "path": "daily/2024-01-15.md", "oldText": "meting notes", // typo will be fuzzy matched "newText": "meeting notes", "fuzzyThreshold": 0.8 } }
Target specific document structures:
{ "operation": "edit", "action": "patch", "params": { "path": "projects/todo.md", "operation": "append", "targetType": "heading", "target": "## In Progress", "content": "- [ ] New task" } }
The system automatically uses intelligent fragment retrieval when reading files, significantly reducing token consumption while maintaining relevance:
{ "operation": "vault", "action": "read", "params": { "path": "large-document.md" } }
Returns relevant fragments instead of the entire file:
{ "result": { "content": [ { "id": "file:large-document.md:frag0", "content": "Most relevant section...", "score": 0.95, "lineStart": 145, "lineEnd": 167 } ], "fragmentMetadata": { "totalFragments": 5, "strategy": "adaptive", "originalContentLength": 135662 } } }
Fragment Search Strategies:
You can explicitly search for fragments across your vault:
{ "operation": "vault", "action": "fragments", "params": { "query": "project roadmap timeline", "maxFragments": 10, "strategy": "proximity" } }
To retrieve the full file (when needed), use:
{ "operation": "vault", "action": "read", "params": { "path": "document.md", "returnFullFile": true } }
The semantic workflow hints are defined in src/config/workflows.json and can be customized for your workflow preferences.
The fragment retrieval system automatically activates when reading files to conserve tokens. You can control this behavior:
returnFullFile: true parameter to get complete contentadaptive for keyword matching (1-2 word queries)proximity for finding related terms together (3-5 word queries)semantic for conceptual chunking (longer queries)When operations fail, the semantic interface provides intelligent recovery hints:
{ "error": { "code": "FILE_NOT_FOUND", "message": "File not found: daily/2024-01-15.md", "recovery_hints": [ { "description": "Create this file", "command": "vault(action='create', path='daily/2024-01-15.md')" }, { "description": "Search for similar files", "command": "vault(action='search', query='2024-01-15')" } ] } }
The server automatically loads environment variables from a .env file if present. Variables can be set in order of precedence:
.env file in current working directory.env file in the server directoryRequired variables:
OBSIDIAN_API_KEY - Your API key from the Local REST API pluginOptional variables:
OBSIDIAN_API_URL - API URL (default: https://localhost:27124)
OBSIDIAN_VAULT_NAME - Vault name for contextExample .env file:
OBSIDIAN_API_KEY=your-api-key-here
OBSIDIAN_API_URL=http://127.0.0.1:27123
OBSIDIAN_VAULT_NAME=MyVault
The PATCH operations (patch_active_file and patch_vault_file) allow sophisticated content manipulation:
Target Types:
heading: Target content under specific headings using paths like "Heading 1::Subheading"block: Target specific block referencesfrontmatter: Target frontmatter fieldsOperations:
append: Add content after the targetprepend: Add content before the targetreplace: Replace the target contentExample: Append content under a specific heading:
{ "operation": "append", "targetType": "heading", "target": "Daily Notes::Today", "content": "- New task added" }
# Clone and install git clone https://github.com/aaronsb/obsidian-semantic-mcp.git cd obsidian-semantic-mcp npm install # Development mode npm run dev # Testing npm test # Run all tests npm run test:coverage # With coverage report # Build npm run build # Build the server npm run build:full # Test + Build # Start npm start # Start the server
The semantic system consists of:
src/semantic/router.ts) - Routes operations to handlerssrc/semantic/state-tokens.ts) - Tracks context statesrc/config/workflows.json) - Defines hints and suggestionssrc/utils/) - Shared functionality like file reading and fuzzy matchingThe project includes comprehensive Jest tests for the semantic system:
npm test # Run all tests npm test semantic-router # Test routing logic npm test semantic-tools # Test integration
Contributions are welcome! Areas of interest:
workflows.jsonMIT