@sfroment/pi-obsidian
Pi extension for the Obsidian CLI — search, read, browse, and edit an Obsidian vault via a typed tool (direct CLI, not MCP).
Package details
Install @sfroment/pi-obsidian from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@sfroment/pi-obsidian- Package
@sfroment/pi-obsidian- Version
1.0.5- Published
- Aug 5, 2026
- Downloads
- 190/mo · 190/wk
- Author
- sfroment
- License
- GPL-3.0
- Types
- extension
- Size
- 62.7 KB
- Dependencies
- 0 dependencies · 3 peers
Pi manifest JSON
{
"extensions": [
"./index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-obsidian
A Pi extension for the Obsidian CLI — search, read, browse, and edit an Obsidian vault through a typed tool that calls the local obsidian CLI directly (not via an MCP server).
Why
Pi can already shell out to the obsidian CLI via bash, but a bare skill describing CLI flags is easy to misuse: the model reaches for the mcp gateway (there is no obsidian MCP server), forgets to set format=json, or runs delete permanent by accident. This extension packages the CLI behind a typed tool with:
- a
commandenum so the model can't typo a subcommand - an
argsmap that serializes to the CLI'skey=valuetoken format (booleans → bare flags, no shell quoting needed) - prompt guidance injected when a prompt mentions obsidian / vault / notes
- a bundled skill documenting every command
- safety guards — refuses
delete permanent, detects "CLI not enabled" and returns actionable fallback guidance - output truncation consistent with Pi's built-in tools
Requirements
- The
obsidianCLI on yourPATH(Settings > General > Advanced > Enable Command Line Interface) - The Obsidian desktop app running with the CLI enabled
When the CLI is unavailable, the skill instructs the agent to fall back to rg over the vault folder.
Install
As a Pi package (recommended)
pi install npm:@sfroment/pi-obsidian
Or pin a version:
pi install npm:@sfroment/pi-obsidian@1.0.0
Then /reload in Pi. The package appears in the pi.dev gallery because it's tagged pi-package on npm.
From git
pi install git:github.com:sfroment/pi-obsidian@v1.0.0
Manually
Copy or symlink this directory into ~/.pi/agent/extensions/obsidian/, then /reload.
Tool reference
The obsidian tool takes:
| param | type | description |
|---|---|---|
command |
enum (required) | CLI subcommand: search, search:context, read, files, folders, outline, tags, properties, property:read, property:set, backlinks, links, orphans, deadends, unresolved, create, append, prepend, move, rename, delete, daily:read, daily:append, tasks, vaults, vault, … |
args |
object | Key/value flags. Booleans become bare flags ({counts: true} → counts). Strings/numbers become key=value tokens. Use \n for newlines and \t for tabs inside content. |
vault |
string | Target vault by name. Defaults to the active vault. |
timeoutSeconds |
int | Default 30, max 120. |
Examples
// search notes
{ "command": "search", "args": { "query": "mistral", "format": "json", "limit": 10 } }
// read a note (wikilink-style name resolution)
{ "command": "read", "args": { "file": "My Note" } }
// backlinks with counts
{ "command": "backlinks", "args": { "file": "My Note", "counts": true, "format": "json" } }
// append to today's daily note
{ "command": "daily:append", "args": { "content": "- did a thing\n" } }
Develop
git clone git@github.com:sfroment/pi-obsidian.git
cd pi-obsidian
bun install
bun test
The tests mock only the system boundary (pi.exec) via dependency injection — runObsidian(params, exec) takes the exec function as a parameter, so tests pass a fake that records argv and returns canned results. Internal helpers (buildArgv, assertSafeCommand, formatOutput) are pure and tested directly.
The pretest script (scripts/link-pi-deps.sh) symlinks the pi runtime packages (@earendil-works/pi-coding-agent, @earendil-works/pi-ai, typebox) into node_modules/ so Bun can resolve the extension's imports during tests.
License
Licensed under the GNU General Public License v3.0.