Skip to main content
Glama

Obsidian Semantic MCP Server

README.md•12.8 kB
# Obsidian Semantic MCP Server > šŸŽ‰ **Exciting News!** We've taken everything we learned from this project and created something even better! Check out the new [**Obsidian MCP Plugin**](https://github.com/aaronsb/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! [![npm version](https://badge.fury.io/js/obsidian-semantic-mcp.svg)](https://www.npmjs.com/package/obsidian-semantic-mcp) A semantic, AI-optimized MCP server for Obsidian that consolidates 20 tools into 5 intelligent operations with contextual workflow hints. --- ## šŸš€ Try Our New Native Plugin! This MCP server taught us valuable lessons about AI integration with Obsidian. We've applied these insights to create the **[Obsidian MCP Plugin](https://github.com/aaronsb/obsidian-mcp-plugin)**, which offers: - **Native Integration**: Runs directly inside Obsidian (no external dependencies!) - **Better Performance**: Direct vault access without REST API overhead - **Easier Setup**: Install like any Obsidian plugin - no API keys or external servers - **Enhanced Features**: Full access to Obsidian's internal APIs and search capabilities - **Improved Reliability**: No more connection issues or timeouts šŸ‘‰ **[Get the Obsidian MCP Plugin](https://github.com/aaronsb/obsidian-mcp-plugin)** --- <a href="https://glama.ai/mcp/servers/@aaronsb/obsidian-semantic-mcp"> <img width="380" height="200" src="https://glama.ai/mcp/servers/@aaronsb/obsidian-semantic-mcp/badge" alt="Obsidian Semantic Server MCP server" /> </a> ## Prerequisites - [Obsidian](https://obsidian.md/) installed on your computer - [Local REST API](https://github.com/coddingtonbear/obsidian-local-rest-api) plugin installed in your Obsidian vault - [Claude Desktop](https://claude.ai/download) app ## Installation ```bash npm install -g obsidian-semantic-mcp ``` Or use directly with npx (recommended): ```bash npx obsidian-semantic-mcp ``` View on npm: https://www.npmjs.com/package/obsidian-semantic-mcp ## Quick Start 1. **Install the Obsidian Plugin:** - Open Obsidian Settings → Community Plugins - Browse and search for "Local REST API" - Install the [Local REST API](https://github.com/coddingtonbear/obsidian-local-rest-api) plugin by Adam Coddington - Enable the plugin - In the plugin settings, copy your API key (you'll need this for configuration) 2. **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): ```json { "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" } } } } ``` ## Features 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. ### Key Benefits - **Simplified Interface**: 5 semantic operations instead of 21+ individual tools - **Contextual Workflows**: Intelligent hints guide AI agents to the next logical action - **State Tracking**: Token-based system prevents invalid operations - **Error Recovery**: Smart recovery hints when operations fail - **Fuzzy Matching**: Resilient text editing that handles minor variations - **Fragment Retrieval**: Automatically returns relevant sections from large files to conserve tokens ### Why Semantic Operations? Traditional MCP servers expose many granular tools (20+), which can overwhelm AI agents and lead to inefficient tool selection. Our semantic approach: - **Consolidates 20 tools into 5 semantic operations** based on intent - **Provides contextual workflow hints** to guide next actions - **Tracks state with tokens** (inspired by Petri nets) to prevent nonsensical suggestions - **Offers recovery hints** when operations fail ### The 5 Semantic Operations 1. **`vault`** - File and folder operations - Actions: `list`, `read`, `create`, `update`, `delete`, `search`, `fragments` 2. **`edit`** - Smart content editing - Actions: `window` (fuzzy match), `append`, `patch`, `at_line`, `from_buffer` 3. **`view`** - Content viewing and navigation - Actions: `window` (with context), `open_in_obsidian` 4. **`workflow`** - Get guided suggestions - Actions: `suggest` 5. **`system`** - System operations - Actions: `info`, `commands`, `fetch_web` - Note: `fetch_web` fetches and converts web content to markdown (uses only `url` parameter) ### Example Usage Instead of choosing between `get_vault_file`, `get_active_file`, `read_file_content`, etc., you simply use: ```json { "operation": "vault", "action": "read", "params": { "path": "daily-notes/2024-01-15.md" } } ``` The response includes intelligent workflow hints: ```json { "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" } ] } } ``` ### State-Aware Suggestions The system tracks context tokens to provide relevant suggestions: - After reading a file with `[[links]]`, it suggests following them - After a failed edit, it offers buffer recovery options - After searching, it suggests refining or reading results ### Advanced Features #### Content Buffering The `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: ```json { "operation": "edit", "action": "from_buffer", "params": { "path": "notes/meeting.md" } } ``` #### Fuzzy Window Editing The semantic editor uses fuzzy matching to find and replace content: ```json { "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 } } ``` #### Smart PATCH Operations Target specific document structures: ```json { "operation": "edit", "action": "patch", "params": { "path": "projects/todo.md", "operation": "append", "targetType": "heading", "target": "## In Progress", "content": "- [ ] New task" } } ``` #### Fragment Retrieval for Large Documents The system automatically uses intelligent fragment retrieval when reading files, significantly reducing token consumption while maintaining relevance: ```json { "operation": "vault", "action": "read", "params": { "path": "large-document.md" } } ``` Returns relevant fragments instead of the entire file: ```json { "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:** - **adaptive** - TF-IDF keyword matching (default for short queries) - **proximity** - Finds fragments where query terms appear close together - **semantic** - Chunks documents into meaningful sections You can explicitly search for fragments across your vault: ```json { "operation": "vault", "action": "fragments", "params": { "query": "project roadmap timeline", "maxFragments": 10, "strategy": "proximity" } } ``` To retrieve the full file (when needed), use: ```json { "operation": "vault", "action": "read", "params": { "path": "document.md", "returnFullFile": true } } ``` ### Workflow Examples #### Daily Note Workflow 1. Create today's note → 2. Add template → 3. Link yesterday's note #### Research Workflow 1. Search topic → 2. Read results → 3. Create synthesis note → 4. Link sources #### Refactoring Workflow 1. Find all mentions → 2. Update links → 3. Rename/merge notes ### Configuration The semantic workflow hints are defined in `src/config/workflows.json` and can be customized for your workflow preferences. #### Fragment Retrieval Configuration The fragment retrieval system automatically activates when reading files to conserve tokens. You can control this behavior: - **Default behavior**: Returns up to 5 relevant fragments when reading files - **Full file access**: Use `returnFullFile: true` parameter to get complete content - **Strategy selection**: The system auto-selects based on query length, or you can specify: - `adaptive` for keyword matching (1-2 word queries) - `proximity` for finding related terms together (3-5 word queries) - `semantic` for conceptual chunking (longer queries) ### Error Recovery When operations fail, the semantic interface provides intelligent recovery hints: ```json { "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')" } ] } } ``` ## Environment Variables The server automatically loads environment variables from a `.env` file if present. Variables can be set in order of precedence: 1. Existing environment variables (highest priority) 2. `.env` file in current working directory 3. `.env` file in the server directory Required variables: - `OBSIDIAN_API_KEY` - Your API key from the Local REST API plugin Optional variables: - `OBSIDIAN_API_URL` - API URL (default: https://localhost:27124) - Supports both HTTP (port 27123) and HTTPS (port 27124) - HTTPS uses self-signed certificates which are automatically accepted - `OBSIDIAN_VAULT_NAME` - Vault name for context Example `.env` file: ``` OBSIDIAN_API_KEY=your-api-key-here OBSIDIAN_API_URL=http://127.0.0.1:27123 OBSIDIAN_VAULT_NAME=MyVault ``` ## PATCH Operations 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 references - `frontmatter`: Target frontmatter fields - **Operations:** - `append`: Add content after the target - `prepend`: Add content before the target - `replace`: Replace the target content Example: Append content under a specific heading: ```json { "operation": "append", "targetType": "heading", "target": "Daily Notes::Today", "content": "- New task added" } ``` ## Development ```bash # 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 ``` ### Architecture The semantic system consists of: - **Semantic Router** (`src/semantic/router.ts`) - Routes operations to handlers - **State Tokens** (`src/semantic/state-tokens.ts`) - Tracks context state - **Workflow Config** (`src/config/workflows.json`) - Defines hints and suggestions - **Core Utilities** (`src/utils/`) - Shared functionality like file reading and fuzzy matching ### Testing The project includes comprehensive Jest tests for the semantic system: ```bash npm test # Run all tests npm test semantic-router # Test routing logic npm test semantic-tools # Test integration ``` ## Known Issues - **Search functionality**: The search operation may occasionally timeout on large vaults due to API limitations in the Obsidian Local REST API plugin. ## Contributing Contributions are welcome! Areas of interest: - Additional workflow patterns in `workflows.json` - New semantic operations - Enhanced state tracking - Integration with Obsidian plugins ## License MIT

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/aaronsb/obsidian-semantic-mcp'

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