Marcus Breiden106 downloadsSecurity-first MCP gateway with default-deny permissions and audit logging.
Security-first Model Context Protocol server plugin for Obsidian. Gives AI assistants controlled, granular access to your vault through five tools: kado-read, kado-write, kado-delete, kado-search, and kado-open-notes.
Part of the MiYo family. The plugin is referred to as MiYo Kado in the Obsidian community-plugin index and in the settings UI; "Kado" alone is used as a short form throughout this README and the source.
Letting an AI assistant talk to your vault sounds great until you realize most integrations give the assistant everything -- every note, every file, full read/write. Kado is built around the opposite default:
127.0.0.1 by default. No cloud, no telemetry, no third party.If you've ever wanted to say "this assistant can read my project notes but not my journal, and can delete drafts but never touch archived material", Kado is for you. For a deeper look at why AI permissioning matters for PKM workflows -- and why guardrails are not the same as real permissions -- see Permissioning your AI.
| Document | Audience | Content |
|---|---|---|
| Installation | Everyone | Community Plugins, BRAT, manual install |
| Configuration Guide | Vault owners | Settings UI, security setup, API key management |
| Client Setup | Vault owners | Claude Code, Claude Desktop, Cursor, Windsurf |
| How It Works | Vault owners | Architecture, security model, enforcement logic, audit log |
| Example Configurations | Vault owners | Common setups with permission matrices |
| API Reference | MCP client developers | Tool schemas, parameters, examples, error codes |
| Development Guide | Contributors | Build, test, lint, architecture, live testing |
| Permissioning your AI | PKM practitioners | Why AI permissioning matters, guardrails vs enforcement |
Atlas, key only sees Atlas/People).kado-read. First ~1000 words with a hint that more exists.CONFLICT error and shows a Notice ("Kado wanted to modify <note> ..."). Your typing always wins. The AI client sees the same conflict signal used for any concurrent change and is expected to re-read and retry, so once you pause typing (~2 s Obsidian autosave) and it retries, its write is applied on top of your latest edits.notes/, projects/, or ** for full vault){
"mcpServers": {
"kado": {
"type": "http",
"url": "http://127.0.0.1:23026/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
General tab -- server status, port, audit logging.
Global Security tab -- whitelist of paths and tags that any key may reference. Permissions are set per data type (Notes, Frontmatter, Dataview, Files) for each path.
API Key tab -- per-key access. Each key has its own access mode, paths, tags, and permission matrix, all constrained by the global security scope.
Every request passes through five gates in order. The first denial stops the chain. For the full enforcement logic, see How It Works.
| # | Gate | Purpose |
|---|---|---|
| 0 | authenticate | Bearer token must match an enabled API key |
| 1 | global-scope | Path must be inside the global whitelist (or outside the blacklist) |
| 2 | key-scope | Path must be inside the key's own scope |
| 3 | datatype-permission | Key must have the required CRUD flag for the data type |
| 4 | path-access | Final path-traversal and validation check |
MCP Client -> [MCP API Handler] -> [Kado Core] -> [Obsidian Interface] -> Vault
Kado is part of MiYo, a small family of Obsidian-adjacent tools focused on giving you control over what your assistants can see and do. MiYo Kado is the gateway component -- the piece that turns your vault into a properly-scoped MCP server. More tools are in the works.
Live issues and upstream references live in GitHub Issues and docs/ai/memory/troubleshooting.md. No open issues at the time of this release.
If MiYo Kado is useful to you and you want to help me keep building, you can support development via:
Issues and pull requests are also very welcome.
Contributions are welcome. The short version:
master. Use a descriptive branch name (e.g. fix/search-tag-case, feat/granular-scopes).npm run build, npm test, and npm run lint before pushing.feat:, fix:, docs:, refactor:. Release notes are generated from commit history.master and reference the issue. Small, reviewable diffs get merged fastest.For security issues, please do not open a public issue -- email [email protected] instead.