obsidian
Access the user's Obsidian vault via the Local REST API plugin.
Actions
read— read a single file. Needspath. Returns the file's markdown content. Whole vault in scope.search— find notes by query. Needsquery. Filename matches first, then content matches. Whole vault in scope.write— create or overwrite a file inside your own area. Needspathandcontent. Optionalfrontmatterprepended as YAML.list— list directory contents. Needspath(directory, e.g."KnowledgeBases/"). Whole vault in scope.
Dated paths
A path may contain {today}, which is replaced with the current date in
YYYY-MM-DD form before the vault is touched — Security/{today}-patrol.md
becomes Security/2026-08-14-patrol.md. Pass the token literally; don't
substitute the date yourself. It works for every action, so reading back
today's note uses the same path you wrote it with. For any other date, write
it out in full.
Write scope
Writes are fenced to CW/<agent-name>/. The path you supply is interpreted
relative to that area: asking to write Security/patrol.md as Sentinel puts
the note at CW/Sentinel/Security/patrol.md. This is not an error and needs
no special path prefix from you — just write where you mean to, and read the
returned path to know where it landed.
You cannot write outside your own area, including into another agent's. A path naming somewhere else in the vault nests under your area rather than reaching it. To get something to another agent, message them directly instead of leaving it in the vault.
Required environment
OBSIDIAN_URL(defaulthttp://127.0.0.1:27123) — Local REST API endpointOBSIDIAN_API_KEY— API key for the Local REST API plugin
Examples
{"thought": "look up the transformers note", "tool": "obsidian", "action": "read", "path": "KnowledgeBases/Transformers/_index.md"}
{"thought": "search for notes about attention mechanisms", "tool": "obsidian", "action": "search", "query": "attention mechanism"}
{"thought": "save the synthesis from the previous step", "tool": "obsidian", "action": "write", "path": "Clippings/2026-05-21-synthesis.md", "content": "$step2"}
{"thought": "see what's in the AI knowledge base", "tool": "obsidian", "action": "list", "path": "KnowledgeBases/AI/"}
Notes
- Large content is best passed via a
$stepNbinding rather than inlined into the action — keeps the tool call small. writeis destructive within your own area (overwrites if the file exists there). Read first if you want to preserve existing content.- Note names are preserved exactly on read; spaces in a filename are normal and need no escaping. Names of files you create have spaces replaced with underscores.