{"_id":"@connorbritain/obsidian-mcp-server","_rev":"6-06c8104df03389a99381e96fc6ce52f0","name":"@connorbritain/obsidian-mcp-server","dist-tags":{"latest":"0.2.3"},"versions":{"0.1.0":{"name":"@connorbritain/obsidian-mcp-server","version":"0.1.0","keywords":["mcp","obsidian","model-context-protocol","ai","llm","knowledge-management","graph-analysis","semantic-search"],"author":{"name":"Connor Britain"},"license":"MIT","_id":"@connorbritain/obsidian-mcp-server@0.1.0","maintainers":[{"name":"connorbritain","email":"connor.r.england@gmail.com"}],"homepage":"https://github.com/ConnorBritain/obsidian-mcp-server#readme","bugs":{"url":"https://github.com/ConnorBritain/obsidian-mcp-server/issues"},"bin":{"obsidian-mcp":"dist/index.js"},"dist":{"shasum":"a60a7282c1a91e81078030b72ff6c8b93fa66734","tarball":"https://registry.npmjs.org/@connorbritain/obsidian-mcp-server/-/obsidian-mcp-server-0.1.0.tgz","fileCount":5,"integrity":"sha512-JCTsWdQF24zmvlfRWCfHJxXKdV9jJMqeTEOe2O5DUwCRMTcWQ2sriblV71NlhkWRJcbT3OKy8i5LlFETO8L8mg==","signatures":[{"sig":"MEYCIQCVVB6kYT+I27/iVcPRYkrbTxMFs9Wz6Cl8+rUgWRtFfwIhAIxkp7pj6XGboznGRjDqRQbmVC3Qx8B5nm6munIYW/JO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150586},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"d48c82125c0fa589f7bd8f11ec8b2592e53c2a50","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint .","build":"tsup","start":"node dist/index.js","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"connorbritain","email":"connor.r.england@gmail.com"},"repository":{"url":"git+https://github.com/ConnorBritain/obsidian-mcp-server.git","type":"git"},"_npmVersion":"11.6.1","description":"TypeScript MCP server for Obsidian with core tools, graph analytics, and semantic search","directories":{},"_nodeVersion":"24.11.0","dependencies":{"zod":"^3.23.8","axios":"^1.7.7","lru-cache":"^11.0.1","graphology":"^0.25.4","graphology-utils":"^2.3.1","graphology-metrics":"^2.3.0","graphology-traversal":"^0.3.1","graphology-shortest-path":"^2.1.0","@modelcontextprotocol/sdk":"^0.4.0","graphology-communities-louvain":"^2.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","tsup":"^8.1.0","eslint":"^9.12.0","typescript":"^5.6.3","@types/node":"^20.11.30","eslint-plugin-n":"^17.10.3","eslint-plugin-jsonc":"^2.15.0","eslint-plugin-import":"^2.29.1","eslint-plugin-promise":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/obsidian-mcp-server_0.1.0_1765190548737_0.16328580206076726","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@connorbritain/obsidian-mcp-server","version":"0.1.1","keywords":["mcp","obsidian","model-context-protocol","ai","llm","knowledge-management","graph-analysis","semantic-search"],"author":{"name":"Connor Britain"},"license":"MIT","_id":"@connorbritain/obsidian-mcp-server@0.1.1","maintainers":[{"name":"connorbritain","email":"connor.r.england@gmail.com"}],"homepage":"https://github.com/ConnorBritain/obsidian-mcp-server#readme","bugs":{"url":"https://github.com/ConnorBritain/obsidian-mcp-server/issues"},"bin":{"obsidian-mcp":"dist/index.js"},"dist":{"shasum":"9b764c6db353cbb5c10c5ecb4642ab80ea8efedd","tarball":"https://registry.npmjs.org/@connorbritain/obsidian-mcp-server/-/obsidian-mcp-server-0.1.1.tgz","fileCount":5,"integrity":"sha512-1mI/4taYvRlfvV18Q0yx2pisNhzIvQ8MvM687Xc+iOLq6GxNUVdIahk40xaqTTu2QZOwCoNtNctG/L1l4ZGeXg==","signatures":[{"sig":"MEYCIQDgGiwbVXgVUkLYV+nhU63eQz8qhVlaX9PFi98rx+9/IQIhAIXHIbExEYvG8pHo/IOr5Bd54ZJ2/3OP4XXv9r5JqvBn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152001},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"c7cf9c0a8eb0a719727f9fde0e19e406b52c65dc","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint .","build":"tsup","start":"node dist/index.js","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"connorbritain","email":"connor.r.england@gmail.com"},"repository":{"url":"git+https://github.com/ConnorBritain/obsidian-mcp-server.git","type":"git"},"_npmVersion":"11.6.1","description":"TypeScript MCP server for Obsidian with core tools, graph analytics, and semantic search","directories":{},"_nodeVersion":"24.11.0","dependencies":{"zod":"^3.23.8","axios":"^1.7.7","lru-cache":"^11.0.1","graphology":"^0.25.4","graphology-utils":"^2.3.1","graphology-metrics":"^2.3.0","graphology-traversal":"^0.3.1","graphology-shortest-path":"^2.1.0","@modelcontextprotocol/sdk":"^1.12.0","graphology-communities-louvain":"^2.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","tsup":"^8.1.0","eslint":"^9.12.0","typescript":"^5.6.3","@types/node":"^20.11.30","eslint-plugin-n":"^17.10.3","eslint-plugin-jsonc":"^2.15.0","eslint-plugin-import":"^2.29.1","eslint-plugin-promise":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/obsidian-mcp-server_0.1.1_1765192954919_0.2507572341067297","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@connorbritain/obsidian-mcp-server","version":"0.2.0","keywords":["mcp","obsidian","model-context-protocol","ai","llm","knowledge-management","graph-analysis","semantic-search"],"author":{"name":"Connor Britain"},"license":"MIT","_id":"@connorbritain/obsidian-mcp-server@0.2.0","maintainers":[{"name":"connorbritain","email":"connor.r.england@gmail.com"}],"homepage":"https://github.com/ConnorBritain/obsidian-mcp-server#readme","bugs":{"url":"https://github.com/ConnorBritain/obsidian-mcp-server/issues"},"bin":{"obsidian-mcp":"dist/index.js"},"dist":{"shasum":"b6f378f5b13044097048f47bacb4a3fb59dbbc70","tarball":"https://registry.npmjs.org/@connorbritain/obsidian-mcp-server/-/obsidian-mcp-server-0.2.0.tgz","fileCount":5,"integrity":"sha512-Xgl7VDxFzJHs3A+uOCmA08CWC3HSt2Rv9cI2BRzR3Ay+7VsOnGnNXBHiZl2SP8hbiDPnCJAzF2RZnl7odRJd6A==","signatures":[{"sig":"MEQCIGvNjq5QFoqjXP4XnmtAK+pJG3vLIUtjXfu7jFUBIl03AiApLkvcGh1Fk2Dp6mP5i3xzJnKDqz+Af8caMKCsXXX//A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172567},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"924ebc24cf0fb25812b362c6be18a9cb6e34c243","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint .","build":"tsup","start":"node dist/index.js","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"connorbritain","email":"connor.r.england@gmail.com"},"repository":{"url":"git+https://github.com/ConnorBritain/obsidian-mcp-server.git","type":"git"},"_npmVersion":"11.6.1","description":"TypeScript MCP server for Obsidian with core tools, graph analytics, and semantic search","directories":{},"_nodeVersion":"24.11.0","dependencies":{"zod":"^3.23.8","axios":"^1.7.7","lru-cache":"^11.0.1","graphology":"^0.25.4","graphology-utils":"^2.3.1","graphology-metrics":"^2.3.0","graphology-traversal":"^0.3.1","graphology-shortest-path":"^2.1.0","@modelcontextprotocol/sdk":"^1.12.0","graphology-communities-louvain":"^2.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","tsup":"^8.1.0","eslint":"^9.12.0","typescript":"^5.6.3","@types/node":"^20.11.30","eslint-plugin-n":"^17.10.3","eslint-plugin-jsonc":"^2.15.0","eslint-plugin-import":"^2.29.1","eslint-plugin-promise":"^7.1.0","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.50.1","@typescript-eslint/eslint-plugin":"^8.50.1"},"_npmOperationalInternal":{"tmp":"tmp/obsidian-mcp-server_0.2.0_1766999767810_0.44483193717962055","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@connorbritain/obsidian-mcp-server","version":"0.2.1","keywords":["mcp","obsidian","model-context-protocol","ai","llm","knowledge-management","graph-analysis","semantic-search"],"author":{"name":"Connor Britain"},"license":"MIT","_id":"@connorbritain/obsidian-mcp-server@0.2.1","maintainers":[{"name":"connorbritain","email":"connor.r.england@gmail.com"}],"homepage":"https://github.com/ConnorBritain/obsidian-mcp-server#readme","bugs":{"url":"https://github.com/ConnorBritain/obsidian-mcp-server/issues"},"bin":{"obsidian-mcp":"dist/index.js"},"dist":{"shasum":"7475c02e267368566e226a59aa79cd3299763395","tarball":"https://registry.npmjs.org/@connorbritain/obsidian-mcp-server/-/obsidian-mcp-server-0.2.1.tgz","fileCount":5,"integrity":"sha512-OhwthMfTysQqyPSocz7P+NIGOIxIICSJQnC3KGM3stb/dL7c8Uedl00WuicZ4ihczHARjJ/81vJZSodjLCMK2g==","signatures":[{"sig":"MEYCIQD3RMR+S9zpDnJLwIJD71J+pQzror6O4j8Ooo4mYB1vNwIhAKAJgLEe6u/YPxvjV9repmBB8Lv4+bkrLK1dM2Tg4Ra0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175791},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"c2e39cb33a1c7473cb63713d5cea2a93ed4378b8","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint .","build":"tsup","start":"node dist/index.js","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"connorbritain","email":"connor.r.england@gmail.com"},"repository":{"url":"git+https://github.com/ConnorBritain/obsidian-mcp-server.git","type":"git"},"_npmVersion":"11.6.1","description":"TypeScript MCP server for Obsidian with core tools, graph analytics, and semantic search","directories":{},"_nodeVersion":"24.11.0","dependencies":{"zod":"^3.23.8","axios":"^1.7.7","lru-cache":"^11.0.1","graphology":"^0.25.4","graphology-utils":"^2.3.1","graphology-metrics":"^2.3.0","graphology-traversal":"^0.3.1","graphology-shortest-path":"^2.1.0","@modelcontextprotocol/sdk":"^1.12.0","graphology-communities-louvain":"^2.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","tsup":"^8.1.0","eslint":"^9.12.0","typescript":"^5.6.3","@types/node":"^20.11.30","eslint-plugin-n":"^17.10.3","eslint-plugin-jsonc":"^2.15.0","eslint-plugin-import":"^2.29.1","eslint-plugin-promise":"^7.1.0","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.50.1","@typescript-eslint/eslint-plugin":"^8.50.1"},"_npmOperationalInternal":{"tmp":"tmp/obsidian-mcp-server_0.2.1_1767026089024_0.5943697533691961","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@connorbritain/obsidian-mcp-server","version":"0.2.2","keywords":["mcp","obsidian","model-context-protocol","ai","llm","knowledge-management","graph-analysis","semantic-search"],"author":{"name":"Connor Britain"},"license":"MIT","_id":"@connorbritain/obsidian-mcp-server@0.2.2","maintainers":[{"name":"connorbritain","email":"connor.r.england@gmail.com"}],"homepage":"https://github.com/ConnorBritain/obsidian-mcp-server#readme","bugs":{"url":"https://github.com/ConnorBritain/obsidian-mcp-server/issues"},"bin":{"obsidian-mcp":"dist/index.js"},"dist":{"shasum":"134d958bb7f532c01fa713c87efa11287d20768f","tarball":"https://registry.npmjs.org/@connorbritain/obsidian-mcp-server/-/obsidian-mcp-server-0.2.2.tgz","fileCount":5,"integrity":"sha512-G+B6YV34xJVR4CzHWnVZuQU1tzaDA7f0QTIP91IAeySYn9LLKOm9iMpetjkbq1MWGrVoXOmJ8DldMpF7Gv9sQA==","signatures":[{"sig":"MEYCIQDvnh22D1DvrPBuFnDPwGYaiwCzqa4iLbnQfT91b24XwAIhAN9pcwnjefpkF3jrM0Lhieav3DaR5gmbVrYNoCfVF7x1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175769},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"c9bc6f02f8994774d1b61b613b64ffed6440d58d","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint .","build":"tsup","start":"node dist/index.js","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"connorbritain","email":"connor.r.england@gmail.com"},"repository":{"url":"git+https://github.com/ConnorBritain/obsidian-mcp-server.git","type":"git"},"_npmVersion":"11.6.1","description":"TypeScript MCP server for Obsidian with core tools, graph analytics, and semantic search","directories":{},"_nodeVersion":"24.11.0","dependencies":{"zod":"^3.23.8","axios":"^1.7.7","lru-cache":"^11.0.1","graphology":"^0.25.4","graphology-utils":"^2.3.1","graphology-metrics":"^2.3.0","graphology-traversal":"^0.3.1","graphology-shortest-path":"^2.1.0","@modelcontextprotocol/sdk":"^1.12.0","graphology-communities-louvain":"^2.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","tsup":"^8.1.0","eslint":"^9.12.0","typescript":"^5.6.3","@types/node":"^20.11.30","eslint-plugin-n":"^17.10.3","eslint-plugin-jsonc":"^2.15.0","eslint-plugin-import":"^2.29.1","eslint-plugin-promise":"^7.1.0","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.50.1","@typescript-eslint/eslint-plugin":"^8.50.1"},"_npmOperationalInternal":{"tmp":"tmp/obsidian-mcp-server_0.2.2_1767026552645_0.07852690430373332","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@connorbritain/obsidian-mcp-server","version":"0.2.3","description":"TypeScript MCP server for Obsidian with core tools, graph analytics, and semantic search","type":"module","main":"dist/index.js","types":"dist/index.d.ts","bin":{"obsidian-mcp":"dist/index.js"},"repository":{"type":"git","url":"git+https://github.com/ConnorBritain/obsidian-mcp-server.git"},"keywords":["mcp","obsidian","model-context-protocol","ai","llm","knowledge-management","graph-analysis","semantic-search"],"author":{"name":"Connor Britain"},"license":"MIT","bugs":{"url":"https://github.com/ConnorBritain/obsidian-mcp-server/issues"},"homepage":"https://github.com/ConnorBritain/obsidian-mcp-server#readme","publishConfig":{"access":"public"},"scripts":{"build":"tsup","dev":"tsx watch src/index.ts","start":"node dist/index.js","lint":"eslint .","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"dependencies":{"@modelcontextprotocol/sdk":"^1.12.0","axios":"^1.7.7","graphology":"^0.25.4","graphology-communities-louvain":"^2.0.1","graphology-metrics":"^2.3.0","graphology-shortest-path":"^2.1.0","graphology-traversal":"^0.3.1","graphology-utils":"^2.3.1","lru-cache":"^11.0.1","zod":"^3.23.8"},"devDependencies":{"@types/node":"^20.11.30","@typescript-eslint/eslint-plugin":"^8.50.1","@typescript-eslint/parser":"^8.50.1","eslint":"^9.12.0","eslint-config-prettier":"^9.1.0","eslint-plugin-import":"^2.29.1","eslint-plugin-jsonc":"^2.15.0","eslint-plugin-n":"^17.10.3","eslint-plugin-promise":"^7.1.0","tsup":"^8.1.0","tsx":"^4.16.0","typescript":"^5.6.3"},"engines":{"node":">=18"},"gitHead":"71c434c6fc425cc63d4f09a45a8bcbb54727ff25","_id":"@connorbritain/obsidian-mcp-server@0.2.3","_nodeVersion":"24.11.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-5csMk+7i4s3/jq8BQWmk7YplMCNl+Ggk7gpkYHE3krdslp86ItTbkY9R1nUK3dt4q5RsoOTBapT7DCP+b4dugA==","shasum":"267c3675f126ed6e6d4f3b863318e9e65bd53210","tarball":"https://registry.npmjs.org/@connorbritain/obsidian-mcp-server/-/obsidian-mcp-server-0.2.3.tgz","fileCount":5,"unpackedSize":177894,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIARxUbCZyRjrAumXUVZBE9SRy/TqUk30Xv9YgvmTmoWWAiEAnmK0BXA4w8t55GxaoLnoaHjysHXoFFHYudLLSsI8jSc="}]},"_npmUser":{"name":"connorbritain","email":"connor.r.england@gmail.com"},"directories":{},"maintainers":[{"name":"connorbritain","email":"connor.r.england@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/obsidian-mcp-server_0.2.3_1767030038901_0.10141154171520173"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-08T10:42:28.683Z","modified":"2025-12-29T17:40:39.234Z","0.1.0":"2025-12-08T10:42:28.883Z","0.1.1":"2025-12-08T11:22:35.055Z","0.2.0":"2025-12-29T09:16:07.973Z","0.2.1":"2025-12-29T16:34:49.159Z","0.2.2":"2025-12-29T16:42:32.810Z","0.2.3":"2025-12-29T17:40:39.050Z"},"bugs":{"url":"https://github.com/ConnorBritain/obsidian-mcp-server/issues"},"author":{"name":"Connor Britain"},"license":"MIT","homepage":"https://github.com/ConnorBritain/obsidian-mcp-server#readme","keywords":["mcp","obsidian","model-context-protocol","ai","llm","knowledge-management","graph-analysis","semantic-search"],"repository":{"type":"git","url":"git+https://github.com/ConnorBritain/obsidian-mcp-server.git"},"description":"TypeScript MCP server for Obsidian with core tools, graph analytics, and semantic search","maintainers":[{"name":"connorbritain","email":"connor.r.england@gmail.com"}],"readme":"# Obsidian MCP Server\r\n\r\n[![npm version](https://img.shields.io/npm/v/@connorbritain/obsidian-mcp-server.svg)](https://www.npmjs.com/package/@connorbritain/obsidian-mcp-server)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n\r\nTypeScript MCP server for Obsidian with core vault operations, graph analytics, and semantic search.\r\n\r\n## Features\r\n\r\n- **Core Tools**: Read, write, search, append, delete files in your Obsidian vault\r\n- **Periodic Notes**: Access daily, weekly, monthly notes and recent changes\r\n- **Advanced Search**: JsonLogic queries for complex filtering\r\n- **Graph Tools**: Orphan detection, centrality analysis, cluster detection, path finding\r\n- **Semantic Search**: Smart Connections integration for concept-based search\r\n\r\n## Prerequisites\r\n\r\n- Node.js 18+\r\n- [Obsidian](https://obsidian.md/) with [Local REST API plugin](https://github.com/coddingtonbear/obsidian-local-rest-api) installed and enabled\r\n- (Optional) [Dataview plugin](https://github.com/blacksmithgu/obsidian-dataview) for `get_recent_changes`\r\n- (Optional) [Periodic Notes plugin](https://github.com/liamcain/obsidian-periodic-notes) for periodic note tools\r\n- (Optional) [Smart Connections plugin](https://github.com/brianpetro/obsidian-smart-connections) for semantic search\r\n\r\n## Installation\r\n\r\n### From npm\r\n\r\n```bash\r\nnpm install -g @connorbritain/obsidian-mcp-server\r\n```\r\n\r\n### From source\r\n\r\n```bash\r\ngit clone https://github.com/ConnorBritain/obsidian-mcp-server.git\r\ncd obsidian-mcp-server\r\nnpm install\r\nnpm run build\r\n```\r\n\r\n## Configuration\r\n\r\nSet the following environment variables:\r\n\r\n| Variable | Required | Default | Description |\r\n|----------|----------|---------|-------------|\r\n| `OBSIDIAN_API_KEY` | Yes* | - | API key from Local REST API plugin settings (used when multi-vault JSON is not supplied) |\r\n| `OBSIDIAN_HOST` | No | `127.0.0.1` | Obsidian REST API host |\r\n| `OBSIDIAN_PORT` | No | `27124` | Obsidian REST API port |\r\n| `OBSIDIAN_PROTOCOL` | No | `https` | `http` or `https` |\r\n| `OBSIDIAN_VAULT_PATH` | No | - | Path to vault (required for graph tools) |\r\n| `SMART_CONNECTIONS_PORT` | No | - | Port for Smart Connections API |\r\n| `GRAPH_CACHE_TTL` | No | `300` | Graph cache TTL in seconds |\r\n| `OBSIDIAN_VAULTS_JSON` | No | - | JSON string describing one or more vaults. Overrides the single `OBSIDIAN_API_KEY` style config. |\r\n| `OBSIDIAN_VAULTS_FILE` | No | - | Path to a JSON file describing one or more vaults (same shape as `OBSIDIAN_VAULTS_JSON`). |\r\n| `OBSIDIAN_DEFAULT_VAULT` | No | first defined | Name/ID of the vault to use when a tool call omits `vaultId`. |\r\n\r\n> **Multi-vault note:** If neither `OBSIDIAN_VAULTS_JSON` nor `OBSIDIAN_VAULTS_FILE` is provided, the legacy single-vault env vars (`OBSIDIAN_API_KEY`, `OBSIDIAN_HOST`, etc.) are used to create a `default` vault entry automatically.\r\n\r\n### Example `OBSIDIAN_VAULTS_JSON`\r\n\r\n```json\r\n[\r\n  {\r\n    \"id\": \"work\",\r\n    \"apiKey\": \"work-api-key\",\r\n    \"host\": \"127.0.0.1\",\r\n    \"port\": 27124,\r\n    \"protocol\": \"https\",\r\n    \"vaultPath\": \"C:/Users/you/Obsidian/work\",\r\n    \"smartConnectionsPort\": 29327\r\n  },\r\n  {\r\n    \"id\": \"personal\",\r\n    \"apiKey\": \"personal-api-key\",\r\n    \"vaultPath\": \"C:/Users/you/Obsidian/personal\"\r\n  }\r\n]\r\n```\r\n\r\nEach tool in the MCP server now accepts an optional `vaultId` argument. When omitted, the server uses `OBSIDIAN_DEFAULT_VAULT` (or the first defined vault). This allows a single MCP session to read/write multiple vaults just by specifying which vault to target in the tool call.\r\n\r\n### Multi-Vault Port Configuration\r\n\r\n> **Important:** When running multiple Obsidian vaults simultaneously, each vault's Local REST API plugin must listen on a **unique port**. By default, all vaults use port `27124`, which causes conflicts—only one vault can bind to a port at a time, and requests to other vaults will fail with authorization errors.\r\n\r\n#### Step 1: Assign Unique Ports in Obsidian\r\n\r\nFor each vault, open **Settings → Community Plugins → Local REST API** and scroll to **Advanced Settings**:\r\n\r\n1. Set **Encrypted (HTTPS) Server Port** to a unique value (e.g., `27124`, `27125`, `27126`, `27127`)\r\n2. Toggle the plugin off and back on (or restart Obsidian) to apply the change\r\n3. Copy the **API Key** shown in the plugin settings\r\n\r\n#### Step 2: Update Your Vaults JSON\r\n\r\nIn your `obsidian-vaults.json` file (or `OBSIDIAN_VAULTS_JSON` env var), specify the `port` for each vault to match what you configured in the plugin:\r\n\r\n```json\r\n[\r\n  {\r\n    \"id\": \"vault_one\",\r\n    \"apiKey\": \"your-api-key-for-vault-one\",\r\n    \"port\": 27124,\r\n    \"vaultPath\": \"C:/Users/you/Obsidian/vault_one\"\r\n  },\r\n  {\r\n    \"id\": \"vault_two\",\r\n    \"apiKey\": \"your-api-key-for-vault-two\",\r\n    \"port\": 27125,\r\n    \"vaultPath\": \"C:/Users/you/Obsidian/vault_two\"\r\n  },\r\n  {\r\n    \"id\": \"vault_three\",\r\n    \"apiKey\": \"your-api-key-for-vault-three\",\r\n    \"port\": 27126,\r\n    \"vaultPath\": \"C:/Users/you/Obsidian/vault_three\"\r\n  }\r\n]\r\n```\r\n\r\n#### Step 3: Restart Your MCP Client\r\n\r\nAfter updating the JSON file, restart your MCP client (Windsurf, Claude Desktop, etc.) so it reloads the configuration with the new ports.\r\n\r\n#### Verifying Connectivity\r\n\r\nYou can test each vault's API directly with curl:\r\n\r\n```bash\r\n# Replace PORT and API_KEY for each vault\r\ncurl -k -H \"Authorization: Bearer YOUR_API_KEY\" https://127.0.0.1:PORT/vault/\r\n```\r\n\r\nA successful response returns a JSON object with the vault's file listing. If you receive `40101 Authorization required`, the API key doesn't match. If you receive `40400 Not Found`, the plugin isn't fully initialized on that port—try toggling it off/on or restarting the vault.\r\n\r\n## MCP Client Configuration\r\n\r\n### Using npx (Recommended)\r\n\r\nUse `npx` for the simplest setup:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"obsidian\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"@connorbritain/obsidian-mcp-server\"],\r\n      \"env\": {\r\n        \"OBSIDIAN_API_KEY\": \"your-api-key-here\",\r\n        \"OBSIDIAN_VAULT_PATH\": \"/path/to/your/vault\",\r\n        \"OBSIDIAN_VAULTS_FILE\": \"C:/path/to/vaults.json\",\r\n        \"OBSIDIAN_DEFAULT_VAULT\": \"work\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### Using Local Build (Development)\r\n\r\nIf running from source:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"obsidian\": {\r\n      \"command\": \"node\",\r\n      \"args\": [\"/absolute/path/to/obsidian-mcp-server/dist/index.js\"],\r\n      \"env\": {\r\n        \"OBSIDIAN_API_KEY\": \"your-api-key-here\",\r\n        \"OBSIDIAN_VAULT_PATH\": \"/path/to/your/vault\",\r\n        \"OBSIDIAN_VAULTS_JSON\": \"[{\\\"id\\\":\\\"work\\\",\\\"apiKey\\\":\\\"...\\\",\\\"vaultPath\\\":\\\"/work\\\"}]\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### Config File Locations\r\n\r\n| Client | Config Path |\r\n|--------|-------------|\r\n| **Claude Desktop (Windows)** | `%APPDATA%\\Claude\\claude_desktop_config.json` |\r\n| **Claude Desktop (Mac/Linux)** | `~/.config/claude/claude_desktop_config.json` |\r\n| **Windsurf** | `~/.windsurf/mcp_config.json` |\r\n| **Cursor** | `~/.cursor/mcp_config.json` |\r\n\r\n## Available Tools\r\n\r\nAll tools accept an optional `vaultId` argument. If omitted, the server uses the default vault from your configuration. This lets you read/write multiple Obsidian vaults within the same MCP session.\r\n\r\n### Vault Management\r\n\r\n| Tool | Description |\r\n|------|-------------|\r\n| `list_vaults` | List all configured vaults with their IDs, capabilities, and connection info |\r\n\r\n### Core File Operations\r\n\r\n| Tool | Description |\r\n|------|-------------|\r\n| `list_files_in_vault` | List all files/directories in vault root |\r\n| `list_files_in_dir` | List files in a specific directory |\r\n| `get_file_contents` | Read a single file |\r\n| `batch_get_file_contents` | Read multiple files concatenated with headers |\r\n| `delete_file` | Delete file or directory |\r\n\r\n### Write Operations\r\n\r\n| Tool | Description |\r\n|------|-------------|\r\n| `append_content` | Append to file (creates if missing) |\r\n| `put_content` | Overwrite file content |\r\n| ~~`patch_content`~~ | ⚠️ **Disabled**: Insert content relative to heading/block (awaiting Obsidian REST API fix - [see issue #146](https://github.com/coddingtonbear/obsidian-local-rest-api/issues/146)) |\r\n\r\n> **Note**: The `patch_content` tool is currently disabled due to known bugs in the Obsidian Local REST API plugin. Use the read-modify-write pattern with `get_file_contents` + `put_content` as a reliable alternative.\r\n\r\n### Search\r\n\r\n| Tool | Description |\r\n|------|-------------|\r\n| `search` | Keyword search across vault |\r\n| `complex_search` | JsonLogic query search (glob, regexp support) |\r\n| `pattern_search` | Regex pattern extraction with context *(requires vault path)* |\r\n\r\n### Periodic Notes & Recent Changes\r\n\r\n| Tool | Description |\r\n|------|-------------|\r\n| `get_periodic_note` | Get current daily/weekly/monthly/quarterly/yearly note |\r\n| `get_recent_periodic_notes` | Get recent periodic notes with optional content |\r\n| `get_recent_changes` | Get recently modified files (requires Dataview) |\r\n\r\n### Obsidian Integration\r\n\r\n| Tool | Description |\r\n|------|-------------|\r\n| `get_active_file` | Get the currently active file in Obsidian |\r\n| `open_file` | Open a file in Obsidian |\r\n| `list_commands` | List all available Obsidian commands |\r\n| `execute_command` | Execute one or more Obsidian commands |\r\n\r\n### Graph Tools *(requires OBSIDIAN_VAULT_PATH)*\r\n\r\n| Tool | Description |\r\n|------|-------------|\r\n| `get_vault_stats` | Overview stats (notes, links, orphans, clusters) |\r\n| `find_orphan_notes` | Notes with no incoming/outgoing links |\r\n| `get_note_connections` | Incoming/outgoing links + tags for a note |\r\n| `find_path_between_notes` | Shortest link path between two notes |\r\n| `get_most_connected_notes` | Top notes by link count or PageRank |\r\n| `detect_note_clusters` | Community detection via graph analysis |\r\n| `get_vault_structure` | Folder tree structure of vault |\r\n\r\n### Semantic Tools *(requires Smart Connections plugin)*\r\n\r\n| Tool | Description |\r\n|------|-------------|\r\n| `semantic_search` | Conceptual search via Smart Connections |\r\n| `find_similar_notes` | Find semantically similar notes\r\n\r\n## Development\r\n\r\n```bash\r\n# Watch mode\r\nnpm run dev\r\n\r\n# Type check\r\nnpm run typecheck\r\n\r\n# Build\r\nnpm run build\r\n```\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}