
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.
A semantic, AI-optimized MCP server for Obsidian that consolidates 20 tools into 5 intelligent operations with contextual workflow hints.
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
, fragments
edit
- Smart content editing
window
(fuzzy match), append
, patch
, at_line
, from_buffer
view
- Content viewing and navigation
window
(with context), open_in_obsidian
workflow
- Get guided suggestions
suggest
system
- System operations
info
, commands
, fetch_web
fetch_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.json
MIT