obsidian-mcp-server
Read, search and edit notes, headings, tags and frontmatter in an Obsidian vault
Self-hosted server for Markdown and Obsidian-style vaults, with a browser UI and an MCP endpoint
By BatterWorks Rust Local · Streamable HTTP Knowledge and memoryProductivity
39 popularity score ★ 73 ⇣ 10k pulls
Opens the app, which asks before it adds the server.
claude mcp add --transport http hatchdoor http://127.0.0.1:42824/mcp{
"mcpServers": {
"hatchdoor": {
"url": "http://127.0.0.1:42824/mcp"
}
}
}{
"servers": {
"hatchdoor": {
"type": "http",
"url": "http://127.0.0.1:42824/mcp"
}
}
}[mcp_servers.hatchdoor]
url = "http://127.0.0.1:42824/mcp"gemini mcp add --scope user --transport http hatchdoor http://127.0.0.1:42824/mcpHATCHDOOR_WEB_BEARER_TOKEN |
Required: Web UI token. The server refuses to start on a non-loopback bind (as under Docker Compose) without it and prints a fresh one. |
|---|---|
HOST_VAULT_PATH |
Optional: Host folder of Markdown notes mounted into the container; Compose mounts an empty vault folder by default. |
HATCHDOOR_MCP_ENABLED |
Optional: Turns on the /mcp endpoint; off by default, can also be set in Settings. |
HATCHDOOR_MCP_BEARER_TOKEN |
Optional: MCP password clients send as a bearer token; can also be generated in Settings. |
HATCHDOOR_MCP_WRITE_ENABLED |
Optional: Allows the write tools; off by default. |
HATCHDOOR_MCP_RATE_LIMITS_ENABLED |
Optional: Turns the per-token and concurrency limits on or off. |
HATCHDOOR_PUBLIC_URL |
Optional: Address used in upload and download links when behind a proxy. |
HATCHDOOR_DEMO_MODE |
Optional: Read-only, unauthenticated public mode. |
HATCHDOOR_USAGE_REPORT_ENABLED |
Optional: Daily setup report to the maintainer; off unless set to true. |
Hatchdoor is a self-hosted Rust service that serves one or more folders of Markdown notes, such as Obsidian vaults, without Obsidian or any plugin running. People use its web UI to browse, search and edit notes. AI agents connect to the same vaults through an MCP endpoint built into the service at /mcp, over Streamable HTTP, on port 42824 by default.
Through MCP an agent can list vaults, run semantic or keyword search, read whole notes or just chosen sections, follow wikilinks and backlinks, select notes by tag, path or frontmatter property, and fetch attachments. With write mode turned on it can also create, edit, move, rename, archive and trash notes, rename or remove a tag across a vault, upload attachments and manage vault definitions and their Git sync. Writes use a content hash for optimistic concurrency. Deleted notes go to a .hatchdoor-trash folder, and each vault can commit and push changes to Git if you set it up that way. The Markdown files stay the source of truth: search, links and stats come from a SQLite cache that Hatchdoor rebuilds when it is deleted.
The tools reference lists 51 MCP tools, batch included. In v2.8.2, src/mcp/limits.rs caps each bearer token at 120 tool calls per rolling minute, allows 8 calls to run at once across the server (only 2 of them semantic searches), and limits one batch call to 50 read items or 20 write items. Calls over the limit get HTTP 429 with a Retry-After header. HATCHDOOR_MCP_RATE_LIMITS_ENABLED turns these limits off for setups that run behind their own gateway.
Docker with Docker Compose, or Podman with the podman-latest image tag. Running from source needs a Rust toolchain plus Node.js and npm to build the frontend. You need a folder of Markdown notes, or an empty one. On first launch you pick a search model for Hatchdoor to download: Gemma, which needs its terms accepted, or Nomic Embed Text v1.5. Vault features stay off until that download finishes. The state directory has to be owned by UID 65532. Then turn on MCP in Settings and make an MCP password. Your client must speak Streamable HTTP and send an Authorization header.
MCP and write mode are both off by default. A pull-only Git vault, or a vault that is not ready yet, refuses writes. After setup you cannot change the search model. The server assumes one trusted user: anyone with the web token or the MCP password can reach every vault it serves. Multi-account permission scoping is planned for v3 and not released. An install from 2.4.x or earlier has to go through a 2.5 to 2.7 release before upgrading, or it will not start. Demo mode has no rate limiting of its own. It is not a sync service and does not replace Obsidian.
A good fit if you keep notes as Markdown files on a home server or NAS and want both a browser view and agent access on an always-on machine, across several vaults, with Git history as a safety net. It runs on your hardware and can start read-only. If you only work inside the Obsidian desktop app and want a small bridge to it, the README points to plugin-based tools such as mcp-obsidian, which need Obsidian and its Local REST API plugin running. If you want a stdio server you can launch from a single client config, pick something else: Hatchdoor is a service you deploy and keep running.
get_model_setup_statusaccept_gemma_termsdecline_gemma_termsread_docssearch_docslist_vaultscreate_vaultedit_vaultenable_vaultdisable_vaultdisconnect_vaultsync_vaultretry_vaultpublish_recovery_branchrefresh_vaultsearch_notesget_noteget_note_outlineget_note_sectionget_note_linksresolve_wikilinkget_treeget_statsget_graphget_frontmatterrecently_modifiedquery_notesfind_textevaluate_saved_querylist_note_attachmentsget_attachmentget_attachment_import_configcreate_noteupdate_noteappend_to_noteedit_notereplace_sectionupdate_frontmatterrename_notemove_notemove_rename_notearchive_notedelete_noterename_tagdelete_tagimport_attachmentcreate_upload_linkmove_attachmentrename_attachmentdelete_attachmentbatch