Are you the author? Sign in to claim
Local-first MCP server for Obsidian vaults — no plugins, no API keys, with schema-validated Bases (.base) support.
Local-first MCP server for working with an Obsidian vault.
This is for people who want MCP clients to work directly with markdown files on disk.
Independent open-source project. Not affiliated with Obsidian, Anthropic, OpenAI, or any MCP client.
It lets MCP clients work with your vault to:
.base files) with schema validationAll directly against your local markdown files.
.base) from an agentThere are already a handful of Obsidian MCP servers. Many depend on the Obsidian Local REST API plugin or run as an Obsidian plugin. This project is intentionally simpler:
.base) support with schema validation — a differentiator: almost no other Obsidian MCP server can create or edit Bases, and this one validates them against the official schema so it never writes a file Obsidian would silently reject| Need | This project |
|---|---|
| Use Obsidian with any MCP client | Yes — Claude Code, Claude Desktop, Cursor, Cline, Codex, Grok |
| Config format | JSON or TOML, per client (examples for each) |
| Require an Obsidian plugin | No |
| Require an API key | No |
| Require Obsidian to be open | No |
| Read/write markdown files directly | Yes |
Create and edit Obsidian Bases (.base) | Yes, with schema validation |
| Work over a remote HTTP API | No, local stdio MCP only |
Designed to be useful without being reckless:
configure_vault - set or change the vault pathget_note - read one markdown note by vault-relative pathcreate_note - create a new markdown note with optional metadataupdate_note - update note content and/or frontmatterdelete_note - delete a markdown notelist_notes - list notes in the vault or a foldersearch_notes - search note title, content, and tagsget_all_tags - list unique tags from frontmatter and inline tagsget_backlinks - find notes that link to a noteget_note_links - extract wikilinks from a notecreate_folder - create a folder inside the vaultget_folder_structure - return the vault folder tree.base files)First-class, schema-validated support for Obsidian Bases — database-like views over your notes. Very few Obsidian MCP servers support these.

create_base - create a .base file, validated against the Bases schema before writingupdate_base - merge changes into a base (update a view by name, add/remove views, change filters/formulas/properties)get_base - read a .base as parsed structure + raw YAML; tolerant of imperfect fileslist_bases - list .base files in the vault or a folder, with their view namesdelete_base - delete a .base file
All four Obsidian view modes are supported — table, list, cards, and map — and any of them can be mixed in a single base. Map views (from the Maps community plugin) round-trip cleanly too: their marker and zoom settings are preserved on read and re-write.
See docs/bases-examples.md for copyable examples of each view mode.

Full-length clip: Obsidian + MCP demo
Requirements:
git clone https://github.com/aka-kika/kika-obsidian-mcp.git
cd kika-obsidian-mcp
./install.sh /absolute/path/to/your/obsidian-vault
install.sh creates a local virtualenv, installs dependencies, verifies against your vault, then prints ready-to-paste config for the client you choose (--client claude|claude-desktop|codex|cursor|cline|grok, default: all).
Prefer to do it by hand? The manual steps are:
python3 -m venv .venv
.venv/bin/python -m pip install --upgrade pip
.venv/bin/python -m pip install -r requirements.txt
OBSIDIAN_VAULT_PATH="/absolute/path/to/your/vault" .venv/bin/python test_server.py
The server is a local stdio MCP server, so any MCP-capable client can run it. Point the client at your virtualenv's Python and server.py, and set the vault path via env. Then restart or reconnect the client.
claude mcp add kika-obsidian \
--env OBSIDIAN_VAULT_PATH="/absolute/path/to/your/obsidian-vault" \
--env OBSIDIAN_READ_ONLY="false" \
--env OBSIDIAN_BACKUP_ON_WRITE="true" \
-- /absolute/path/to/kika-obsidian-mcp/.venv/bin/python \
/absolute/path/to/kika-obsidian-mcp/server.py
Add this to the client's MCP config (claude_desktop_config.json, or the equivalent mcpServers block):
{
"mcpServers": {
"kika-obsidian": {
"command": "/absolute/path/to/kika-obsidian-mcp/.venv/bin/python",
"args": ["/absolute/path/to/kika-obsidian-mcp/server.py"],
"env": {
"OBSIDIAN_VAULT_PATH": "/absolute/path/to/your/obsidian-vault",
"OBSIDIAN_READ_ONLY": "false",
"OBSIDIAN_BACKUP_ON_WRITE": "true"
}
}
}
}
Add this to ~/.codex/config.toml (or ~/.grok/config.toml):
[mcp_servers.kika-obsidian]
command = "/absolute/path/to/kika-obsidian-mcp/.venv/bin/python"
args = ["/absolute/path/to/kika-obsidian-mcp/server.py"]
enabled = true
[mcp_servers.kika-obsidian.env]
OBSIDIAN_VAULT_PATH = "/absolute/path/to/your/obsidian-vault"
OBSIDIAN_READ_ONLY = "false"
OBSIDIAN_BACKUP_ON_WRITE = "true"
For a safer read/search-only setup, set OBSIDIAN_READ_ONLY="true" (TOML: OBSIDIAN_READ_ONLY = "true").
| Variable | Required | Default | Description |
|---|---|---|---|
OBSIDIAN_VAULT_PATH | yes | none | Absolute path to the vault folder. |
OBSIDIAN_READ_ONLY | no | false | When true, create/update/delete/folder creation tools refuse writes. |
OBSIDIAN_BACKUP_ON_WRITE | no | false | When true, copies existing notes into .obsidian-mcp-backups/ before update/delete. |
OBSIDIAN_VAULT_PATH.../ path traversal are rejected.OBSIDIAN_READ_ONLY=true (this also blocks create_base, update_base, and delete_base)..base files can be copied to .obsidian-mcp-backups/ before update/delete with OBSIDIAN_BACKUP_ON_WRITE=true.delete_note only removes markdown (.md) notes and delete_base only removes Bases (.base) files. Neither can touch other file types..base paths and note tools only .md paths, so the two never cross-contaminate.Run the local test script:
OBSIDIAN_VAULT_PATH="/absolute/path/to/your/vault" .venv/bin/python test_server.py
Start the MCP server:
OBSIDIAN_VAULT_PATH="/absolute/path/to/your/vault" .venv/bin/python server.py
Generate a daily project status report from your vault:
OBSIDIAN_VAULT_PATH="/absolute/path/to/your/vault" .venv/bin/python scripts/daily_status_report.py --folder "Projects"
Write the report back into Obsidian:
OBSIDIAN_VAULT_PATH="/absolute/path/to/your/vault" .venv/bin/python scripts/daily_status_report.py \
--folder "Projects" \
--write "Reports/Daily Project Status.md"
The script reports recent notes, markdown checkbox tasks, and top tags. It uses backup-on-write when updating an existing report note.
See docs/common-workflows.md for practical examples:
Copyable Obsidian note templates live in docs/templates:
This repo includes lightweight agent workflow skills:
skills/obsidian-vault-workflow/SKILL.md
skills/release-note-captain/SKILL.md
Use them as guidance for agents that work with this MCP server. They cover safe vault exploration, editing discipline, daily status reports, vault triage, project catch-up prompts, and release-note capture after a project ships.
Yes. It is a local MCP server for Obsidian vaults. It exposes tools for notes, tags, backlinks, wikilinks, folders, search, and optional writes.
Any client that can run a local stdio MCP server — Claude Code, Claude Desktop, Cursor, Cline, Codex, and Grok are all covered with copy-paste config above. It is just a local Python process, so anything that speaks MCP over stdio can use it. Run ./install.sh --client <name> /path/to/vault to print the exact config for your client.
Yes, with dedicated schema-validated tools. create_base, update_base, get_base, list_bases, and delete_base let MCP clients build and edit .base files directly on disk. Every write is validated against the official Bases schema first, so it never writes a file Obsidian would silently reject, and errors name the exact offending path (for example, views[0].groupBy missing 'property' key). get_base is tolerant of imperfect files: if the YAML cannot be parsed it returns the raw content with a parse_error flag instead of failing. All four view modes — table, list, cards, and map — are supported, and map bases from the Maps community plugin round-trip without losing their marker/zoom settings. This is a differentiator — almost no other Obsidian MCP server can create or edit Bases. See docs/bases-examples.md.
No. It reads and writes markdown files directly from the vault folder.
No. Because this server works on local files, Obsidian does not need to be open.
Yes. Set OBSIDIAN_READ_ONLY=true to allow search and inspection while refusing create, update, delete, and folder creation tools.
MIT
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows