Native sync
Obsidian's official headless client keeps the vault current. The assistant's edits reach your phone and laptop like any other edit.
Without it a copy that drifts, or a desktop app that must stay awake.
Obsidian MCP server · self-hosted
Claude and ChatGPT read and write your Obsidian notes on your phone, on the web, and on every computer. One container, with sync, sign-in, and note tools built in.
01 Why Crystal Cove
An assistant needs three things at once to work well in a vault. Most setups give you two. Crystal Cove puts all three in one container.
Obsidian's official headless client keeps the vault current. The assistant's edits reach your phone and laptop like any other edit.
Without it a copy that drifts, or a desktop app that must stay awake.
OAuth, the sign-in flow Claude and ChatGPT connectors expect. Paste your URL, enter one password, and you are connected.
Without it the vault stays on your laptop.
Names, tags, links, backlinks, sections, and frontmatter. The assistant finds the right note and edits one part of it, with fewer tokens than reading raw files.
Without them an assistant that greps a folder.
02 In every app
Your phone, a browser, a laptop that isn't yours. The assistant works in the same vault you do, and its edits sync like yours.
Add “call the landlord” to my to-do note.
search_notes “to-do” 1 note
append_note To-do.md done
Added it to your To-do note. It's already on your other devices.
To-do
Synced
Works in claude.ai, the Claude apps, Claude Code, and ChatGPT.
03 Security
This server holds your whole knowledge base on a machine that faces the internet. Every design decision starts there.
Every request needs a token. There is no open mode. OAuth with PKCE, rotating refresh tokens, and a lockout after wrong passwords.
Paths cannot escape the vault, and symlinks cannot lead out of it. Tools touch notes only, never Obsidian's settings.
Writes never overwrite a sync change, and they wait while you type on another device. Deletes go to the trash. A read-only mode removes every write tool.
It runs as a non-root user, with a read-only filesystem and every Linux capability dropped.
Static analysis, fuzzing, secret scanning, and an image vulnerability scan run on every code change. Every published image is signed.
Check that an image came from this repo before you run it.
cosign verify ghcr.io/dakotahp/crystal-cove:latest \
--certificate-identity-regexp '^https://github.com/dakotahp/crystal-cove/\.github/workflows/(ci|release-please)\.yml@' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
We list the known limits too. Read them in SECURITY.md
04 Setup
You need an Obsidian Sync subscription, Docker, and a server with a domain name. Every command is here.
Make a folder and download the compose file.
mkdir crystal-cove && cd crystal-cove
curl -O https://raw.githubusercontent.com/dakotahp/crystal-cove/master/docker-compose.ymlSign in to Obsidian Sync, on the machine where the container will run. It asks for your email, password, and MFA code if you have one, then prints a token.
docker run --rm -it ghcr.io/dakotahp/crystal-cove:latest \
sh -c 'ob login && cat ~/.config/obsidian-headless/auth_token'List your vaults to get the name, exactly as Obsidian Sync spells it.
docker run --rm -e OBSIDIAN_AUTH_TOKEN=<your token> \
ghcr.io/dakotahp/crystal-cove:latest ob sync-list-remote.envCreate a .env file next to docker-compose.yml.
# The token from step 1.
OBSIDIAN_AUTH_TOKEN=
# The vault name from step 1.
OBSIDIAN_VAULTS=Personal
# The address your apps will use. HTTPS, with no path.
MCP_PUBLIC_URL=https://obsidian.example.com
# The password you enter when you connect. 16 characters or more.
MCP_OWNER_PASSWORD=End-to-end encrypted vault? Also set OBSIDIAN_VAULT_PASSWORD. The example file lists every option.
Put an HTTPS proxy in front of the container. With Caddy, this is the whole configuration. Any reverse proxy or a Cloudflare Tunnel works too.
obsidian.example.com {
reverse_proxy localhost:8080
}Start it, and wait for “Fully synced”.
docker compose up -d
docker compose logs -f # wait for "Fully synced", then Ctrl-CIn Claude or ChatGPT, add a custom connector with your URL. A Crystal Cove sign-in page opens. Enter your password, and you are back in the chat, connected.
Only want it on your laptop? It runs locally too.
Full setup guide05 Tools
Not raw files and folders. Names, sections, tags, and links, so the assistant asks for exactly what it needs.
read_noteread_notesget_sectionget_frontmatterlist_notesrecent_notessearch_notesfind_noteslist_tagsget_linksget_backlinksunresolved_linksorphanscreate_noteappend_noteedit_noteedit_sectionupdate_frontmattermove_notedelete_noteWant read-only? One setting removes every write tool. Every tool in detail
Free and open source, under the MIT License. If it earns a place on your server, a star helps other Obsidian users find it.