obsidian-cli-mcp
obsidian-cli-mcp
Ein MCP-Server, der Claude und anderen MCP-Clients die volle Kontrolle über einen laufenden Obsidian-Tresor über die offizielle Obsidian-CLI (Obsidian 1.12+) gibt, mit schnellen direkten Dateisystem-Lesevorgängen, wo die Korrektheit dies erlaubt.
Begleitprojekt zu things-for-mac-mcp.
Was macht dieses Projekt anders?
Die meisten Obsidian-MCP-Server kommunizieren entweder mit einem Community-REST-Plugin oder lesen direkt den Tresor-Ordner. Ersteres erfordert die Installation und das Vertrauen in ein Plugin. Letzteres bricht stillschweigend Wikilinks, sobald es eine Datei verschiebt oder umbenennt, weil nur Obsidian jeden Link, Alias und Embed kennt, der darauf verweist.
Dieser Server leitet jede Operation nach Fähigkeit weiter:
Typische reine Dateisystem-MCPs | obsidian-cli-mcp | |
Volltextsuche über Tausende von Notizen | Schnell | Schnell (Dateisystem) |
Verschieben oder Umbenennen einer Notiz | Unterbricht alle eingehenden Links | Linksicher (Obsidian CLI) |
Backlinks, Aliase, unaufgelöste Links | Schätzung | Obsidians eigener Resolver |
Bases-Abfragen, Template-Variablen | Unmöglich | Laufzeitauswertung über die App |
Schreibvorgänge landen in Obsidians Index und Dateiwiederherstellung | Nein | Ja |
iCloud-ausgelagerte Dateien | Als leere Notizen gelesen | Erkannt, über Obsidian gelesen |
Erfordert ein Community-Plugin | Manchmal | Nein |
Die Architektur spiegelt exakt das Schwesterprojekt wider:
things-for-mac-mcp | obsidian-cli-mcp | |
Schnelle Lesevorgänge | Direkt SQLite | Direkt Dateisystem |
Autoritative Schreibvorgänge | AppleScript | Obsidian CLI |
Bequeme Erstellvorgänge | URL-Schema | Obsidian CLI |
Die Regel hinter der Aufteilung: Massenlesevorgänge gehen an das Dateisystem, weil sie Durchsatz benötigen, und alles, was verschiebt, umbenennt, löscht oder von Linkauflösung oder App-Zustand abhängt, geht durch die CLI, weil es Obsidians Wissen benötigt. Der Dateisystem-Adapter kann strukturell den Tresor nicht verändern, er exportiert überhaupt keine Schreibfunktion.
Voraussetzungen
macOS-, Windows- oder Linux-Desktop mit Obsidian 1.12 oder neuer
Die Obsidian-CLI aktiviert: Obsidian, Einstellungen, Allgemein, Befehlszeilenschnittstelle
Obsidian muss laufen. Die CLI ist ein Client für die App, kein eigenständiges Binärprogramm. Dies ist nur für den Desktop, mobil wird nicht unterstützt.
Node.js 18 oder neuer
Installation
git clone https://github.com/jabaho9523/obsidian-cli-mcp.git
cd obsidian-cli-mcp
npm install
npm run buildMit einem MCP-Client verbinden
Claude (Desktop / Code)
Fügen Sie zu claude_desktop_config.json (Claude Desktop) hinzu oder führen Sie claude mcp add (Claude Code) aus:
{
"mcpServers": {
"obsidian": {
"command": "/absolute/path/to/node",
"args": ["/absolute/path/to/obsidian-cli-mcp/dist/index.js"],
"env": {
"OBSIDIAN_VAULT": "YourVaultName"
}
}
}
}Verwenden Sie den absoluten Pfad zu node, nicht das bloße Wort. Über die GUI gestartete Apps erben nicht das PATH Ihrer Shell, daher schlägt "command": "node" bei vielen Clients stillschweigend fehl. Finden Sie Ihren mit which node.
Setzen Sie OBSIDIAN_VAULT, wenn Sie mehr als einen Tresor haben. Andernfalls zielt die CLI auf den zuletzt fokussierten Tresor ab, was eine schreckliche Eigenschaft für automatisierte Schreibvorgänge ist. Bei einem einzelnen Tresor fixiert der Server ihn automatisch beim Start.
Konfiguration
Variable | Standardwert | Zweck |
|
| Pfad zur Obsidian-CLI-Binärdatei |
| automatisch fixiert, wenn genau ein Tresor existiert | Tresorname, auf den jeder Befehl abzielt |
| automatisch über die CLI erkannt | Tresor-Ordner für den Dateisystem-Adapter |
|
| Timeout pro Befehl in ms |
| nicht gesetzt | Auf |
| nicht gesetzt | Auf |
Schutzmaßnahmen
Drei Stufen, die durchgesetzt werden, bevor die Binärdatei überhaupt gestartet wird:
Stufe 1, kostenlos: Lesevorgänge, Suchen und additive Schreibvorgänge (
create_note,append_note,append_daily,set_property,update_task,capture).Stufe 2, erfordert
confirm: trueim Werkzeugaufruf:delete_note,move_note,rename_note,remove_property,run_obsidian_command, und über den Passthrough:history:restore,publish:*,plugin:enable/disable/reload,theme:*,snippet:*,sync,sync:restore,reload,template:insert,workspace:save/delete. Jeder Aufruf mit einemoverwrite- oderpermanent-Flag wird ebenfalls auf Stufe 2 hochgestuft.Stufe 3, blockiert, es sei denn, der Server läuft mit
OBSIDIAN_MCP_ALLOW_DANGEROUS=1:eval,restart,plugin:install,plugin:uninstall,plugins:restrict,devtools,dev:cdp,dev:debug,dev:mobile, unddelete_notemitpermanent: true.
Eine ehrliche Anmerkung, was diese sind. Stufe 2 ist eine Geschwindigkeitsschwelle gegen versehentliche Aufrufe, keine Sicherheit: das aufrufende Modell kann selbst confirm: true setzen. Stufe 3 ist eine echte Grenze, weil nur derjenige, der die Serverumgebung konfiguriert, sie freischalten kann. Wenn Sie einen autonomen Agenten auf einen Tresor richten, der Ihnen wichtig ist, führen Sie ihn mit OBSIDIAN_MCP_READONLY=1, das jeden mutierenden Befehl vor dem Versand ablehnt, unabhängig von der Stufe.
Linksichere Verschiebungen und Umbenennungen
Die wichtigste Regel in diesem Projekt: Dateien werden niemals über das Dateisystem verschoben, umbenannt oder gelöscht. Obsidian aktualisiert jeden Wikilink im Tresor, wenn es die Operation durchführt. Ein einfaches mv tut das nicht.
Vorher, mit Projects/Roadmap.md, verlinkt von drei Notizen:
Weekly Review.md: Progress on [[Roadmap]] is on track.
Team Notes.md: See [[Roadmap#Q3]] for the plan.
Index.md: - [[Roadmap|2026 roadmap]]Nach move_note mit to: "Archive/2026 Roadmap.md":
Weekly Review.md: Progress on [[2026 Roadmap]] is on track.
Team Notes.md: See [[2026 Roadmap#Q3]] for the plan.
Index.md: - [[2026 Roadmap|2026 roadmap]]Alle drei Links aktualisiert, einschließlich des Überschriftenankers und des Alias, weil Obsidian die Verschiebung durchgeführt hat. Eine Dateisystemverschiebung hätte drei defekte Links und keinen Fehler hinterlassen.
Warum hybrid? Die Leistungsbegründung
Jeder CLI-Aufruf ist eine vollständige IPC-Roundtrip durch die laufende Obsidian-App. Das ist korrekt, aber langsam: Das Lesen von 2.000 Notizen über obsidian read sind 2.000 Roundtrips, Minuten Echtzeit. Das Lesen von der Festplatte ist ein einziger Verzeichnisdurchlauf, weit unter einer Sekunde auf jeder SSD.
Daher gehen Massenlesevorgänge (Suche, Auflistungen, Tag- und Eigenschaftsscans, Exporte, Zusammenfassungen) an das Dateisystem, und die CLI ist reserviert für das, was nur Obsidian beantworten kann (Links, Aliase, Bases, Templates, App-Zustand) und für jeden Schreibvorgang. Um dies in Ihrem eigenen Tresor zu vergleichen, messen Sie die Zeit von search_notes gegen den Passthrough obsidian_cli mit ["search", "query=..."].
Fehlerbehebung
"Obsidian läuft nicht." Der häufigste Fehler. Die CLI benötigt die App geöffnet und vollständig geladen. Starten Sie Obsidian und versuchen Sie es erneut.
"Konnte die Obsidian-CLI-Binärdatei nicht finden." Aktivieren Sie die CLI in Obsidian unter Einstellungen, Allgemein, Befehlszeilenschnittstelle, oder setzen Sie OBSIDIAN_BIN auf die Binärdatei.
Timeouts beim ersten Befehl. Ein kalter Obsidian-Start kann die Standardeinstellung von 20s überschreiten. Erhöhen Sie OBSIDIAN_MCP_TIMEOUT.
Notizen werden als fehlend gelesen oder der Server fällt oft auf die CLI zurück. Wenn Ihr Tresor in iCloud mit aktiviertem "Mac-Speicher optimieren" liegt, existieren ausgelagerte Dateien nur als .name.icloud-Stubs. Der Server erkennt diese und liest sie über Obsidian, das sie erneut herunterlädt, anstatt leere Notizen zu melden. Massenscans überspringen ausgelagerte Dateien und geben dies in ihrer Ausgabe an.
Schreibvorgänge landen im falschen Tresor. Sie haben mehrere Tresore und kein OBSIDIAN_VAULT gesetzt. Der Server warnt darüber auf stderr beim Start. Legen Sie einen fest.
Werkzeuge erscheinen nicht im Client. Überprüfen Sie die MCP-Protokolle des Clients und prüfen Sie das Problem mit dem absoluten Node-Pfad oben.
Auf dem neuesten Stand bleiben
git pull && npm install && npm run buildDer Server sucht beim Start nach Updates, höchstens einmal alle 24 Stunden, und speichert das Ergebnis in ~/.config/obsidian-cli-mcp/update-check.json. Er schlägt offline stillschweigend fehl und gibt eine einzelne stderr-Zeile aus, wenn eine neuere Version existiert.
Werkzeuge (insgesamt 39)
Lesewerkzeuge (18)
Tool | Adapter | Beschreibung |
| Dateisystem, CLI-Fallback | Liest eine Notiz anhand eines Wikilink-artigen Namens oder exakten Pfads |
| Dateisystem | Volltextsuche mit Ordner-, Groß-/Kleinschreibungs-, Kontext- und Begrenzungsoptionen |
| Dateisystem | Listet Dateien, gefiltert nach Ordner und Erweiterung |
| Dateisystem | Listet Ordner |
| CLI | Pfad, Größe, Erstellungs- und Änderungsdaten |
| Dateisystem | Überschriftenbaum mit Zeilennummern |
| CLI | Eingehende Links, aufgelöst von Obsidian |
| CLI | Ausgehende Links |
| Dateisystem | Alle Tags mit Zählern, Frontmatter und Inline |
| Dateisystem | Tresorweite Frontmatter-Schlüssel mit Zählern |
| Dateisystem | Ein Frontmatter-Schlüssel auf einer Notiz |
| CLI | Tresorname, Pfad, Statistiken |
| CLI | Kürzlich geöffnete Dateien |
| CLI | Alle .base-Dateien |
| CLI | Führt eine Bases-Ansichtsabfrage aus, von der App ausgewertet |
| CLI | Vorlagen im konfigurierten Ordner |
| CLI | Vorlageninhalt, optional mit aufgelösten Variablen |
| Dateisystem | Wörter und Zeichen, ohne Frontmatter |
Schreibwerkzeuge (16)
Alle Schreibvorgänge gehen durch die CLI. Jeder erfordert ein explizites file- oder path-Ziel, keiner kann auf die aktuell aktive Datei zurückfallen.
Tool | Guard-Stufe | Beschreibung |
| 1, 2 mit | Erstellt eine Notiz, optional aus einer Vorlage |
| 1 | Inhalt anhängen |
| 1 | Inhalt vor dem Frontmatter einfügen |
| 1 | Heutige Tagesnotiz lesen |
| 1 | An die heutige Tagesnotiz anhängen |
| 1 | Vor die heutige Tagesnotiz einfügen |
| 1 | Pfad der heutigen Tagesnotiz |
| 1 | Eine Frontmatter-Eigenschaft setzen |
| 2 | Eine Frontmatter-Eigenschaft entfernen |
| 2 | Link-sicheres Verschieben |
| 2 | Link-sicheres Umbenennen |
| 2, 3 mit | In den Papierkorb verschieben oder dauerhaft löschen |
| 1 | Markdown-Aufgaben mit Referenzen auflisten |
| 1 | Aufgabenstatus per Referenz oder Zeile umschalten oder setzen |
| 1 | In der Obsidian-Oberfläche öffnen, nur Navigation |
| 2 zur Ausführung | Befehle der Befehlspalette auflisten oder ausführen, inklusive Plugin-Befehle |
run_obsidian_command ist die weiteste Tür im Server: Sie erreicht jede Aktion der Befehlspalette, einschließlich derer von Community-Plugins. Sie ist bewusst freigegeben und auf Stufe 2 abgesichert.
Workflow-Tools (4)
Tool | Beschreibung |
| Zeitgestempeltes Anhängen an die heutige Tagesnotiz, der häufigste Vorgang in der Praxis |
| Fasst einen Datumsbereich von Tagesnotizen in einem Dokument zusammen |
| Exportiert einen Ordner als JSON, Markdown oder CSV, inline oder in eine Datei außerhalb des Tresors |
| Verwaiste, tote Enden, unaufgelöste Links und leere Notizen in einem Bericht. Bewusst auf den Link-Graphen beschränkt |
Notausstieg (1)
Tool | Beschreibung |
| Führt einen beliebigen CLI-Befehl aus. Nimmt |
MCP-Ressourcen
Die Client-Unterstützung für Ressourcen variiert, Claude Desktop zeigt sie derzeit nicht an.
Ressource | Inhalt |
| Tresor-Informationen |
| Heutige Tagesnotiz |
| Alle Tags mit Anzahl |
| Zuletzt geöffnete Dateien |
| Notizen ohne eingehende Links |
| Beliebige Notiz per tresorrelativem Pfad |
MCP-Prompts
Prompt | Zweck |
| Eine Tagesnotiz zusammenfassen, offene Aufgaben anzeigen, Folgeaktionen vorschlagen |
| Den Tresor-Gesundheitsbericht durchgehen und link-sichere Korrekturen vorschlagen |
| Eingefügtes Material mithilfe einer vorhandenen Vorlage in eine Notiz umwandeln |
| Eine Woche Tagesnotizen in einer Übersichtsnotiz zusammenfassen |
Architektur
src/
├── index.ts MCP server entry, stdio transport
├── config.ts Environment configuration
├── adapters/
│ ├── cli.ts execFile wrapper, vault injection, error contract
│ └── filesystem.ts Read-only vault access, iCloud stub detection
├── tools/
│ ├── common.ts Shared note loading with CLI fallback
│ ├── read.ts 18 read tools
│ ├── write.ts 16 write tools
│ ├── workflow.ts 4 composite tools
│ └── passthrough.ts obsidian_cli escape hatch
├── resources/
│ └── vault.ts MCP resources
├── prompts/
│ └── workflows.ts MCP prompts
└── utils/
├── guardrails.ts Tier policy, readonly allowlist
├── markdown.ts Frontmatter, headings, tags, word counts
├── output.ts Truncation at 60,000 characters
└── update-check.ts Daily update checkTests laufen gegen eine Stub-Binärdatei, die ihr volles argv scannt und angewiesen werden kann, fehlzuschlagen, hängen zu bleiben oder übermäßig große Ausgaben zu erzeugen, sodass die gesamte Testsuite ohne installiertes Obsidian besteht:
npm testSupport
Probleme und Funktionsanfragen: GitHub Issues.
Mehr vom Autor
things-for-mac-mcp, der zugehörige MCP-Server für Things 3
Lizenz
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read and write your Fresh Jots notes from Claude, Cursor, and any MCP client.
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jabaho9523/obsidian-cli-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server