{"id":41648,"library":"obsidian-mcp-server","title":"Obsidian MCP Server","description":"An MCP-compliant server that provides tools for reading, writing, searching, and editing notes, tags, and frontmatter in Obsidian vaults. Version 3.2.4 requires Node >=24 or Bun >=1.3.11 and the Obsidian Local REST API plugin. Uses stdio or Streamable HTTP transport. Built in TypeScript with full type definitions. Differentiates from generic file-sys MCP servers by offering high-level operations (get note content, list vault files, append to notes, bulk create, search by content/tag, manage tags/frontmatter, batch delete) with a two-edit safety guard. The server enforces contextual editing to avoid data loss. Release cadence is active (multiple updates per month). Ships with a React-based MCP inspector for testing.","status":"active","version":"3.2.4","language":"javascript","source_language":"en","source_url":"https://github.com/cyanheads/obsidian-mcp-server","tags":["javascript","mcp","mcp-server","model-context-protocol","obsidian","obsidian-vault","knowledge-base","note-taking","ai-tools","typescript"],"install":[{"cmd":"npm install obsidian-mcp-server","lang":"bash","label":"npm"},{"cmd":"yarn add obsidian-mcp-server","lang":"bash","label":"yarn"},{"cmd":"pnpm add obsidian-mcp-server","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"required plugin in Obsidian; the server communicates with it","package":"obsidian-local-rest-api","optional":false}],"imports":[{"note":"Package exports a default export (the ObsidianMCPServer class) and named exports. ESM-only since v3.0; CommonJS require() will not work on Node >=24 without appropriate flags.","wrong":"const Server = require('obsidian-mcp-server').Server","symbol":"Server (class)","correct":"import { Server } from 'obsidian-mcp-server'"},{"note":"The default export is the ObsidianMCPServer class. The function `runStdioServer` is a named export that creates and runs a server via stdin/stdout. If you use the default import, you must instantiate the class manually.","wrong":"import ObsidianMCPServer from 'obsidian-mcp-server'","symbol":"runStdioServer","correct":"import { runStdioServer } from 'obsidian-mcp-server'"},{"note":"Available transports: TransportType.STDIO and TransportType.STREAMABLE_HTTP. Introduced in v3.0. If you are on an older version (<3.0), use Server class options directly.","wrong":null,"symbol":"TransportType enum","correct":"import { TransportType } from 'obsidian-mcp-server'"}],"quickstart":{"code":"import { runStdioServer } from 'obsidian-mcp-server';\n\n// The server reads required config from environment variables:\n// OBSIDIAN_API_URL (default: http://127.0.0.1:27124)\n// OBSIDIAN_API_KEY (the API key from the Local REST API plugin)\n\nconst apiKey = process.env.OBSIDIAN_API_KEY ?? 'your-api-key';\nconst apiUrl = process.env.OBSIDIAN_API_URL ?? 'http://127.0.0.1:27124';\n\nasync function main() {\n  const server = await runStdioServer({\n    apiUrl,\n    apiKey,\n    maxNoteSize: 1000000, // 1 MB limit for note content\n  });\n\n  console.log('Obsidian MCP server running on stdio');\n  // The server runs until process exit\n}\n\nmain().catch(console.error);","lang":"typescript","description":"Shows how to start the server over stdio transport, configure API URL and key, and set max note size. Replace the API key with a real one from the Local REST API plugin settings."},"warnings":[{"fix":"Upgrade Node to 24+ or use Bun 1.3.11+.","message":"Requires Node >= 24 or Bun >= 1.3.11. Older runtimes will fail to start.","severity":"breaking","affected_versions":">=3.0.0"},{"fix":"Use dynamic import() or switch to ESM (\"type\": \"module\" in package.json).","message":"The package is ESM-only from v3.0.0. CommonJS require() will not work.","severity":"breaking","affected_versions":">=3.0.0"},{"fix":"Install 'obsidian-local-rest-api' from Obsidian community plugins; set an API key in its settings; pass same key to server.","message":"Obsidian vault must have the Local REST API plugin installed and configured. The API key must match the one set in the plugin.","severity":"gotcha","affected_versions":">=1.0.0"},{"fix":"Design your workflow to call 'get_note' after every two edits, or use the 'two_edit_guard' option (if available) to disable it.","message":"Edits are guarded: a note can only be edited twice (two edits per note). Then you must re-read the note to continue editing. This prevents stale data overwrites.","severity":"gotcha","affected_versions":">=3.0.0"},{"fix":"Use stdio transport (TransportType.STDIO) when possible.","message":"Streamable HTTP transport is deprecated in favor of stdio in v3.2.0? Actual advice: stdio is recommended due to simpler setup.","severity":"deprecated","affected_versions":">=3.2.0"}],"env_vars":null,"search_vec":"'1.3.11':32 '24':29 '3.2.4':26 'activ':104 'ai':139 'ai-tool':138 'api':38 'append':73 'avoid':98 'base':114,134 'batch':83 'built':46 'bulk':76 'bun':31 'cadenc':102 'compliant':7 'content':69 'content/tag':80 'context':126 'contextu':95 'creat':77 'data':99 'definit':52 'delet':84 'differenti':53 'edit':17,89,96 'enforc':94 'file':57,72 'file-si':56 'frontmatt':21 'full':50 'generic':55 'get':67 'guard':91 'high':64 'high-level':63 'http':44 'inspector':116 'javascript':119 'knowledg':133 'knowledge-bas':132 'level':65 'list':70 'local':36 'loss':100 'manag':81 'mcp':2,6,59,115,120,122 'mcp-compliant':5 'mcp-server':121 'model':125 'model-context-protocol':124 'month':108 'multipl':105 'node':28 'note':18,68,75,136 'note-tak':135 'obsidian':1,23,35,128,130 'obsidian-vault':129 'offer':62 'oper':66 'per':107 'plugin':39 'protocol':127 'provid':10 'react':113 'react-bas':112 'read':13 'releas':101 'requir':27 'rest':37 'safeti':90 'search':15,78 'server':3,8,60,93,123 'ship':109 'stdio':41 'streamabl':43 'sys':58 'tag':19 'tags/frontmatter':82 'take':137 'test':118 'tool':11,140 'transport':45 'two':88 'two-edit':87 'type':51 'typescript':48,141 'updat':106 'use':40 'vault':24,71,131 'version':25 'write':14","created_at":"2026-06-04T18:53:25.915352+00:00","updated_at":"2026-06-04T18:53:25.915352+00:00","problems":[{"fix":"Use dynamic import() or set \"type\": \"module\" in package.json and use import syntax.","cause":"Using CommonJS require() with an ESM-only package (v3+).","error":"Error: ERR_REQUIRE_ESM: require() of ES Module [path] from [path] not supported."},{"fix":"Start Obsidian and ensure the Local REST API plugin is enabled. Verify the port (default 27124) and URL.","cause":"Obsidian Local REST API plugin is not running or the port is incorrect.","error":"Error: fetch failed: connect ECONNREFUSED 127.0.0.1:27124"},{"fix":"Set OBSIDIAN_API_KEY environment variable to the exact API key from Obsidian plugin settings.","cause":"OBSIDIAN_API_KEY is missing or does not match the key set in the Local REST API plugin.","error":"Error: 401 Unauthorized: invalid API key"}],"ecosystem":"npm","meta_description":null,"install_score":null,"quickstart_score":null,"quickstart_tag":null,"pypi_latest":null,"cli_name":null,"cli_version":null,"type":"library","homepage":"https://github.com/cyanheads/obsidian-mcp-server#readme","github":"https://github.com/cyanheads/obsidian-mcp-server","docs":null,"changelog":null,"pypi":null,"npm":"obsidian-mcp-server","openapi_spec":null,"status_page":null,"smithery":null,"categories":["productivity"],"base_url":null,"auth_type":null,"provenance":{"verified_status":null,"verified_at":null,"last_verified":"2026-06-04","next_check":"2026-09-02","install_tag":null}}