Sasan Sotoodehfar1k downloadsChat with Claude inside your vault, generate gallery-grade interactive planning artifacts, and sync everything Claude produces back into your notes.
Chat with Claude inside your Obsidian vault — notes as
context, interactive claude-html artifacts, agent mode with reviewable
writes, CLI-first Claude Code workflows, and an optional local MCP bridge for
Claude Desktop and advanced live-vault tools. Your
vault stays the single source of truth.

Bring your own credential. Companion for Claude talks to the Anthropic Messages API with your credential — nothing is sent anywhere else. On desktop, direct network access is required for Claude and the local MCP bridge; on mobile, chat, artifacts, and semantic search all work, with only the MCP bridge and session import gated off (desktop/Electron only). Three auth modes:
- API key (default, recommended) — a standard
sk-ant-api…key from console.anthropic.com. This is the mode used for community-store builds.- Long-term OAuth token (power users) — paste a token from
claude setup-token(sk-ant-oat…) to authenticate as your Claude subscription; usage draws on your plan rather than pay-as-you-go API credit.- Import from environment — read
ANTHROPIC_API_KEY/ANTHROPIC_AUTH_TOKEN(+ANTHROPIC_BASE_URL) from the environment, the way the CLI does.An optional base URL override points any mode at a gateway/proxy. The key stays the default so the plugin remains community-store eligible; the token and environment modes are clearly marked as power-user options.
@-mention notes, folders, or the whole vault;
toggle context pills for your active note, the current selection,
linked & backlinked notes, or a vault search. Keyword search by
default; semantic search is on by default and fuses with keywords, using
a built-in on-device model (one-time ~45MB model + ~23MB ONNX
runtime download from huggingface.co / cdn.jsdelivr.net, offered on first
run, cached and fully offline afterwards) or a local Ollama server. Search
stays keyword-only until the model is downloaded. The index also covers
vault PDFs — text is extracted with pdf.js and every chunk keeps its page
number, so results cite the page. The ONNX runtime
(ort-wasm-simd-threaded.asyncify.wasm) is fetched once during that same
consented download and cached with the model; inference itself is on-device./ in the composer for a fuzzy palette:
summarize, ask, improve, artifact, plan, canvas, workflows, capture, build,
research, and more. A run shows as a compact command chip, not a wall of
prompt text.The artifact design system takes its aesthetic cues from Thariq Shihipar's
“unreasonable effectiveness of HTML”
gallery (vendored as a pinned submodule at the monorepo root) — an original
reformulation, not a copy — so the plans, reports, and dashboards Claude
generates look gallery-grade. See the
NOTICE for full
attribution.
claude-html block;
Companion renders it inline in a sandboxed iframe, opens it in your browser,
or saves it as a note that stays interactive and portable./canvas (or just ask): Claude searches your vault
and builds a native Obsidian Canvas — file nodes wired to your real
notes, labeled edges, labeled groups that cluster related nodes,
auto-layout. A write like any other: gated and confirmed before the .canvas
file is created. Also available to advanced MCP clients.title, tags, summary, type) so they index in the tag pane, search,
and Dataview, with optional local-model auto-tagging.claude-html progress board) and hand it to Claude Code.Use /research in the Companion composer to open the native Research Desk.
This guided daily view selects one active project, shows its stage and document
progress, explains the deterministic next best action, and keeps a focused
attention queue. Guidance can be pinned or dismissed, and no model request is
made merely by opening or navigating the Desk.
Use Open advanced research workbench from the command palette for the full record-level interface. Its grouped Build, Write, Assure, and Expand navigation covers Overview, Sources, Evidence, Claims, Outline, Draft, Audit, Intelligence, and Discover. Getting started is guided rather than blank:
research/<theme> tag, and writes a Clippings/Triage.md board with
wikilinks, source URLs, and a potential project per theme.The end-to-end workflow is:
zotero_key
resolves full bibliographic metadata from your library when you set a Zotero
user id in settings), or existing vault notes.The vault's Markdown records are canonical and remain readable without the plugin. Only reviewed, locatable, non-stale evidence linked to a valid source counts as trusted support; proposed evidence never satisfies a claim. Revision responses that lose required claims, introduce unsupported citations, use stale grounding, or violate the structured response contract are blocked before any document write.
A claude-html artifact rendered inline — interactive, sandboxed, and saved as a plain Markdown note.
One agent, three surfaces: agent mode in chat (everywhere), the MCP bridge for Claude Code (desktop), and cloud sessions (mobile-friendly) — same vault, same confirm-before-write guardrails, wherever you are.
![]() |
![]() |
|---|---|
| A prioritized roadmap artifact, produced by an advisor persona surveying the vault over the bridge. | A generated working map — a canvas-style overview built from real notes. |
Clippings/) and enrich new clips with typed frontmatter
(article, video, dataset) from per-type schemas. Auto-enrichment asks for
one-time consent first (it sends each new inbox file to your utility model);
the Enrich note as source command works manually either way. Enrichment
preserves the Markdown body and existing metadata, unions tags, and validates
the final title, summary, schema fields, and source provenance before the
atomic vault write.<Organized folder>/<domain>/ (default Library/),
collision-safe, with links updated.Ontology/ folder define note types and typed wikilink relations; on
first run Companion offers to create the default schemas (or run
Seed ontology any time), and notes Claude creates conform to your
schemas (advisory, never blocking). Configure under Vault ontology in
settings.From the community store (recommended): Settings → Community plugins → Browse → search Companion for Claude → Install → Enable, or use this direct link. Then open Settings → Companion for Claude and paste your Anthropic API key.
From source (development):
cd obsidian-plugin && pnpm install && pnpm run buildmain.js, manifest.json, and styles.css into
<your-vault>/.obsidian/plugins/claude-companion/.For active development use pnpm run dev (esbuild watch) and symlink the plugin
folder into a test vault.
Companion, its in-app agent, and ordinary Claude Code workflows do not require MCP. From Options → Desktop integrations on any Companion page:
claude and official obsidian CLIs,
then can add cavi-ai/plugins and install obsidian-agent@cavi-ai at user
scope after explicit confirmation. Claude Code uses the official Obsidian CLI
by default.MCP remains optional for Claude Desktop and advanced clients that need
Companion-specific live research, semantic-search, ontology, or controlled-write
tools. It is off by default; the build handoff uses the official obsidian CLI
whenever the bridge is disabled.
Enable it in Settings → Companion for Claude → Agent bridge — MCP server (desktop). The server binds to 127.0.0.1 only (never the network), requires a bearer token, and shows ready-to-paste connection snippets for both clients.
| Read tools (always exposed) | Write tools (require Allow writes) |
|---|---|
vault_search |
note_create |
note_read |
note_append |
list_recent |
note_update |
vault_tags |
update_frontmatter |
list_titles |
note_move |
get_backlinks |
base_create |
get_outgoing_links |
canvas_create |
frontmatter_query |
research_project_create |
research_project_read |
research_source_import |
research_audit |
research_evidence_capture |
research_evidence_review |
|
research_claim_create |
|
research_claim_link |
|
research_outline_generate |
That is 10 always-available read/audit tools and 14 write-gated mutation tools
(24 advertised tools when writes are enabled), plus the optional web_search
and web_fetch read tools when enabled in settings. Research Workbench reads
and audits remain available with writes disabled. Creating projects, importing
sources, capturing or reviewing evidence, creating or linking claims, and
generating outlines requires Allow writes; agent mode also keeps its normal
per-action confirmation gate. Evidence review applies only to evidence records
and accepts reviewed or rejected.
Permanent legacy aliases remain callable for compatibility, but are intentionally not advertised as user-facing commands. This does not change the bridge security boundary: it remains loopback-only and requires a non-empty bearer token.
With Vault ontology enabled, note_create also accepts type / properties
for schema-conformant typed notes.
Advanced Claude Code MCP connection:
claude mcp add --transport http obsidian-vault \
http://127.0.0.1:22360/mcp --header "Authorization: Bearer <token>"
Claude Desktop (claude_desktop_config.json, via mcp-remote):
{
"mcpServers": {
"obsidian-vault": {
"command": "npx",
"args": ["-y", "mcp-remote", "http://127.0.0.1:22360/mcp",
"--header", "Authorization: Bearer <token>"]
}
}
}
Now ask Claude Code "search my vault for X" or "create a note summarizing this" and it operates directly on your Obsidian notes.
Every request below is triggered by something you do — there is no telemetry, no analytics, and no background polling of any third party.
| Destination | Sent when | Carries |
|---|---|---|
api.anthropic.com (or your API base URL override) |
every chat, agent, and utility turn | your prompt, attached vault context, and the system prompt |
| your Ollama host / OpenAI-compatible endpoint | only while a local backend is selected | the same request, to a server you run |
huggingface.co and cdn.jsdelivr.net |
the one-time built-in embedding download, after you click Download | nothing but the model and ONNX-runtime requests; cached and offline afterwards |
your routine fire URL (an api.anthropic.com endpoint by default) |
the Send to cloud Claude session command, when cloud dispatch is on | your prompt and attached note context |
api.github.com |
Cloud replies pull, and only with a token you set | repo, branch, and folder you configured |
api.openalex.org, api.crossref.org, export.arxiv.org, api.zotero.org |
an explicit Discover action in the Research Workbench | your search terms, plus the OpenAlex contact email if you set one |
| the page you ask to capture | web capture and the agent's web_fetch tool |
the URL you gave |
html.duckduckgo.com (or api.search.brave.com) |
the agent's web_search tool, when enabled |
your search query |
| an MCP server you configure yourself | tool calls you confirm | the tool arguments |
Web capture uses the bundled defuddle extractors, which reach two extra
site-specific endpoints when you capture from those sites: c2.com (wiki page
source) and youtube.com (transcript API).
WebAssembly. Two families ship inside main.js. ort-wasm-simd-threaded*.wasm
is the ONNX runtime behind built-in embeddings — fetched from cdn.jsdelivr.net
during the consented model download and cached in the Cache API. qcms_bg.wasm,
jbig2.wasm, and openjpeg.wasm belong to pdfjs-dist; Companion loads PDFs with
getDocument({ data }) and never sets wasmUrl, so those image-decode paths have
no URL to fetch and no external host.
Base64. One runtime atob in the plugin's own code, decoding GitHub's
base64-encoded file payloads when pulling cloud replies. Other occurrences belong
to bundled dependencies.
Shell execution. Desktop only, always execFile/spawn with an argument
array — never a shell string: opening an artifact in your chosen browser, running
stdio MCP servers you configure, and the Obsidian / Claude CLI used by Desktop
integrations. All of it is disabled on mobile.
Your vault. Semantic search and vault search enumerate every file to build a
local index; nothing about that index leaves the device. Copy buttons write to
the system clipboard. Credentials live in Obsidian's encrypted secret storage,
never in data.json.
When Claude returns a fenced ```claude-html block, Companion renders
the document inside a **sandboxed** iframe (allow-scripts but **not**
allow-same-origin) — interactions and scripts run, but the artifact can't
touch your vault or cookies. A restrictive iframe CSP also blocks network calls
and form submissions. Set a height per-block with ```claude-html height=720.
Saving an artifact writes a Markdown note containing that same block, so the artifact lives in your vault, renders in Reading view, and travels with your notes.
claude-html blockYou can author these by hand too:
```claude-html height=600
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Hello</title></head>
<body style="font-family:ui-serif;background:#FAF9F5;padding:40px">
<h1 style="color:#141413">It renders inline.</h1>
</body></html>
```
The Obsidian-free logic (SSE parsing, artifact extraction, search scoring) is factored into pure modules so it can be unit-tested without a running app.
pnpm run typecheck # tsc --noEmit
pnpm run lint # eslint
pnpm test # vitest (unit tests in test/)
pnpm run build # typecheck + production bundle
CI runs all four on every push/PR (Node 20 & 22) in the
monorepo. A manual smoke-test
checklist lives in CONTRIBUTING.md.
| Store listing | Companion for Claude (claude-companion) |
| Source of truth | cavi-ai/claude-obsidian monorepo, obsidian-plugin/ |
| Release repo | cavi-ai/companion-for-claude — built main.js, manifest.json, styles.css attached per release |
| Versioning | manifest.json = versions.json = package.json = git tag (exact version, no v prefix) |
Releases are cut by the monorepo's release workflow, which runs the release gate (typecheck, lint, tests, build) and the version-lockstep check, mirrors the plugin to the release repo, and publishes the tagged GitHub release the store serves.
MIT — see LICENSE.