obsidian-mcp-server
[!NOTE] Dieses Repository ist die huaqing0 custom edition, basierend auf
cyanheads/obsidian-mcp-serverv3.5.0 unter der Apache-2.0-Lizenz. Es bewahrt den Upstream-Server und fügt den lokalen Arbeitsbereich, die Vault-Struktur und die native Excalidraw-Automatisierung hinzu, die in dieser Edition verwendet werden. Die npm- und MCPB-Installationslinks unten verweisen weiterhin auf die Upstream-Distribution; diese Custom Edition ist derzeit nur als Quellcode verfügbar.
Werkzeuge
Einunddreißig Werkzeuge decken Notizinhalt, Metadaten, Backlinks, native Excalidraw-Automatisierung und die vollständige Verwaltung der Vault-Struktur ab, plus einen geschützten Notausstieg für Obsidian-Befehlspaletten-Befehle.
Tool-Name | Beschreibung |
| Eine Notiz als Rohinhalt, vollständige strukturierte Form (Inhalt + Frontmatter + Tags + Stat, mit optionalen geschriebenen Links, aufgelösten Links und Backlinks), strukturelle Dokumentkarte oder einen einzelnen Abschnitt lesen. |
| Notizen und Unterverzeichnisse unter einem Vault-Pfad auflisten. Rekursiver Durchlauf (Standardtiefe 2, maximale Tiefe 20; 1000-Einträge-Obergrenze) mit optionalen |
| Vault-Tags mit Nutzungszählern auflisten, einschließlich hierarchischer Eltern. Absteigend nach Anzahl sortiert und auf |
| Obsidian-Befehlspaletten-Befehle auflisten, optional nach |
| Den Vault nach Text, JSONLogic oder BM25-bewerteter Omnisearch durchsuchen (wenn das Plugin erreichbar ist). Ergebnisse werden über undurchsichtige Cursor paginiert. |
| Kompakte semantische Zusammenfassungen aus einer nativen |
| Excalidraw-Parsing, stabile semantische IDs, Geometrie und Beziehungsreferenzen validieren. |
| Eine native Excalidraw-Zeichnung als einen semantischen Stapel aus Knoten, gebundenen Beziehungen und Rahmen erstellen. |
| Semantische Knoten, Beziehungen oder Rahmen idempotent zu einer bestehenden Zeichnung hinzufügen. |
| Verwaltete Zeichnungselemente anhand stabiler semantischer IDs chirurgisch aktualisieren. |
| Ausgewählte verwaltete Elemente löschen, während die Zeichnungsdatei und nicht zusammenhängende Inhalte erhalten bleiben. |
| Verwaltete Knoten in deterministische Beziehungstiefen-Ebenen anordnen. |
| Einen Obsidian-Link an einem verwalteten Zeichnungselement anhand stabiler semantischer ID anhängen oder ersetzen. |
| Ausgewählte semantische Elemente in der Live-Excalidraw-Ansicht fokussieren und umgebende Elemente dimmen oder wiederherstellen. |
| Eine native Excalidraw-Zeichnung über die Plugin-Export-API in eine begrenzte PNG-Vorschau rendern. |
| Eine validierte Excalidraw-Wiki-Einbettung idempotent an eine bestehende Markdown-Notiz anhängen. |
| Eine Notiz erstellen, einen einzelnen Abschnitt an Ort und Stelle ersetzen oder — mit |
| Inhalt an eine Notiz anhängen. Ohne |
| Chirurgisches |
| Suchen-und-Ersetzen innerhalb einer einzelnen Notiz, standardmäßig auf den Textkörper beschränkt. Literale oder Regex-Übereinstimmung mit Ganzwort-, Leerraum-flexiblen und Groß-/Kleinschreibungsoptionen; unterstützt Ersetzung mit Erfassungsgruppen. |
| Atomares |
| Tags hinzufügen, entfernen oder auflisten. Standardmäßig das Frontmatter- |
| Einen Vault-Ordner und alle fehlenden übergeordneten Ordner über Obsidian erstellen. |
| Eine Vault-Datei oder einen Vault-Ordner über den FileManager von Obsidian verschieben oder umbenennen, sodass interne Links an Linkaktualisierungen teilnehmen. |
| Eine Notiz dauerhaft löschen. Opt-in über |
| Einen Ordner und alle Unterelemente über den Obsidian-Papierkorb oder dauerhaft löschen. Opt-in über |
| Eine Datei in der Obsidian-App-Oberfläche öffnen, mit |
| Tabs, Bereiche, Seitenleisten, aktive Datei und Markdown-Editor-Modi untersuchen. |
| Seitenleisten, Tabs, Splits, Leaf-Fokus/-Schließen, Markdown-Editor-Modus und integrierte Suche über typisierte Aktionen steuern. |
| Das Obsidian-Fenster als begrenzten MCP-Bildblock für die visuelle Verifikation erfassen; verweigert, wenn ordnerspezifische Berechtigungen aktiv sind. |
| Einen Obsidian-Befehlspaletten-Befehl per ID ausführen. Opt-in über |
obsidian_get_note
Eine Notiz in einer von vier Projektionen lesen, adressiert über Vault-Pfad, die aktive Datei oder eine periodische Notiz (daily, weekly, monthly, quarterly, yearly).
format: "content"— roher Markdown-Textkörperformat: "full"— Inhalt, Frontmatter, Tags und Dateimetadaten;includeLinks: trueübergeben, um geschriebene ausgehende Referenzen sowie von Obsidian aufgelöste ausgehende Links und Backlinks einzuschließen (nur vault-intern — externe URLs werden herausgefiltert)format: "document-map"— Katalog von Überschriften, Blockverweisen und Frontmatter-Feldernformat: "section"— einzelner Überschriften-/Block-/Frontmatter-Abschnittswert (erfordertsection); Überschriftenabschnitte umfassen den vollständigen Unterbaum unter dieser Überschrift
Die Dokumentkarten-Projektion mit obsidian_patch_note kombinieren, um Bearbeitungsziele vor dem Patchen zu entdecken.
obsidian_search_notes
Bis zu drei Suchmodi, ausgewählt über mode:
text— Teilstring-Übereinstimmung mit umgebenden Kontextfenstern.contextLengthsteuert die Zeichen des Kontexts pro Seite jeder Übereinstimmung (Standard 100; erhöhen für mehr Kontext pro Treffer). OptionalerpathPrefix-Filter (nur Textmodus — die Übergabe vonpathPrefixin jedem anderen Modus wird mitpath_prefix_invalid_modeabgelehnt).jsonlogic— JSONLogic-Baum, ausgewertet gegenpath,content,frontmatter.<key>,tagsundstat.{ctime,mtime,size}; benutzerdefinierteglob- undregexp-Operatoren, die beide[PATTERN, VALUE]annehmen — zuerst das Muster, dann die Feldreferenz:{"glob": ["Projects/*.md", {"var": "path"}]}. Die umgekehrte Reihenfolge kompiliert das eigene Feld der Notiz als Muster:globstimmt dann mit nichts überein, undregexpschlägt sofort fehl, egal was das Feld ergibt. So werden auch Backlinks ausgedrückt, da es kein dediziertes Tool oder Upstream-Endpoint dafür gibt:{"regexp": ["\\[\\[Target Note(\\||#|\\]\\])", {"var": "content"}]}gibt jede Notiz zurück, deren Textkörper per Wikilink aufTarget Noteverweist.omnisearch— BM25-bewertete Suche über das Community-Plugin Omnisearch. Unterstützt in Anführungszeichen gesetzte Phrasen,-exclusion,path:/ext:-Filter, Tippfehlertoleranz, PDF- + OCR-Abdeckung (über Text Extractor) und visuelle Konzept-Bildübereinstimmungen, wenn die Indizierung von AI Image Analyzer aktiviert ist. Nur im Modus-Enum vorhanden, wenn der HTTP-Server des Plugins beim Start erreichbar ist; der Upstream begrenzt Ergebnisse hart auf 50 — die Abfrage eingrenzen, um mehr sichtbar zu machen (die Antwort enthälttruncated: true, wenn die Obergrenze wahrscheinlich erreicht wurde).
Die Ergebnisse werden gemäß der MCP-2025-11-25-Spezifikation über undurchsichtige Cursor paginiert: Lassen Sie cursor für die erste Seite weg und übergeben Sie dann nextCursor aus der vorherigen Antwort. Jedes Ergebnis enthält totalCount (nach Pfadrichtlinie, vor Paginierung); nextCursor wird auf der letzten Seite weggelassen. Treffer im Textmodus werden zusätzlich pro Datei auf maxMatchesPerHit (Standard 10) begrenzt, damit eine einzelne trefferlastige Notiz das Antwortbudget nicht sprengen kann – abgeschnittene Treffer tragen truncated: true und totalMatches.
obsidian_write_note
Erstellen oder chirurgisch ersetzen, mit einem schützenden Standard gegen versehentliches Überschreiben ganzer Dateien.
Ohne
section– vollständigesPUTder Datei. Weigert sich, eine vorhandene Datei zu überschreiben, es sei denn,overwrite: trueist gesetzt. Der Fehlerfile_exists(Conflict) schlägtobsidian_patch_note/obsidian_append_to_note/obsidian_replace_in_notefür In-Place-Bearbeitungen vor.Mit
section–PATCH-mit-Ersetzen gegen die benannte Überschrift/den Block/das Frontmatter-Feld, wobei der Rest der Datei unberührt bleibt. Das Flagoverwritewird im Abschnittsmodus ignoriert.
Die Ausgabe meldet created: true, wenn der Aufruf eine neue Datei ins Leben gerufen hat; false, wenn eine vorhandene Datei ersetzt oder ein Abschnitt angezielt wurde. Jedes mutierende Tool gibt außerdem previousSizeInBytes und currentSizeInBytes zurück, damit ein Agent versehentliche Überschreibungen, unerwartetes Upstream-Verhalten oder einen Tippfehlerpfad erkennen kann, der bei der falschen Datei gelandet ist.
obsidian_append_to_note
Ein kombiniertes Upsert- und Abschnitt-Anhängen-Primitiv, das das Verhalten der lokalen REST-API des Upstreams widerspiegelt:
Ohne
section–POSTan/vault/{path}. Hängt an, wenn die Datei existiert, erstellt die Datei mit Ihrem Inhalt als gesamten Textkörper, wenn sie nicht existiert. Dascreated: trueder Ausgabe kennzeichnet den zweiten Zweig, damit der Agent bemerken kann, wenn ein Tippfehlerpfad oder eine noch nicht erstellte Tagesnotiz stillschweigend zu einer brandneuen Datei wurde.Mit
section–PATCH-mit-Anhängen gegen die benannte Überschrift, den Blockverweis oder das Frontmatter-Feld. Die Datei muss existieren (sonst wirft der PATCH-Preflightnote_missing). Setzen SiecreateTargetIfMissing: true, um den Abschnitt selbst in einer vorhandenen Datei ins Leben zu rufen. Blockverweis-Ziele verketten sich ohne Trennzeichen neben der Blockzeile – fügen Sie ein führendes Zeilenumbruchzeichen incontentein, wenn Sie eines möchten.
previousSizeInBytes ist 0 auf dem Upsert-Erstellen-Zweig und andernfalls die tatsächliche Dateigröße; currentSizeInBytes ist die nach dem Schreiben vom Upstream gelesene Größe. Vergleichen Sie Deltas mit Buffer.byteLength(content), um automatische Zeilenumbruch-Injektion oder gleichzeitige Schreiber zu erkennen.
obsidian_patch_note
Chirurgische Bearbeitungen an einem einzelnen Dokumentziel.
operation: "append"fügt nach dem Abschnitt hinzuoperation: "prepend"fügt vor dem Abschnitt hinzuoperation: "replace"tauscht ihn ausZiele: Überschriftspfad, Blockverweis-ID oder Frontmatter-Feld
Überschriftziele akzeptieren entweder den vollständigen Parent::Child-Pfad oder einen bloßen Blattnamen. Ein bloßes Blatt, das genau einer Überschrift entspricht, wird vor dem Schreiben zu seinem vollständigen Pfad erweitert, und die Antwort gibt den Locator zurück, auf dem die Bearbeitung gelandet ist; ein Blatt, das mehreren Überschriften entspricht, wird mit ambiguous_section abgelehnt, dessen Fehlerdaten die Kandidatenpfade auflisten. Dieselbe Auflösung gilt für obsidian_write_note und obsidian_append_to_note mit section.
Verwenden Sie obsidian_get_note mit format: "document-map", um zu entdecken, welche Ziele vor dem Patchen existieren.
obsidian_replace_in_note
Suchen-und-Ersetzen für Bearbeitungen, die nicht zu den strukturellen Zielen von obsidian_patch_note passen. Die Notiz wird abgerufen, Ersetzungen werden sequenziell angewendet (jede sieht die vorherige Ausgabe), und das Ergebnis wird in einem einzigen PUT zurückgeschrieben.
scope wählt aus, worüber die Ersetzungen laufen:
body(Standard) – der Text nach dem YAML-Frontmatter-Block. Der Block wird aus den ursprünglichen Bytes wieder angehängt, sodass er byte-identisch zurückkommt.frontmatter– nur das YAML zwischen den----Begrenzern. Die Begrenzer selbst werden nie abgeglichen.both– jede Ersetzung läuft über das Frontmatter und dann über den Textkörper;perReplacement[]meldetbodyCountundfrontmatterCountgetrennt.
Mit dem Frontmatter im Geltungsbereich wird das umgeschriebene YAML vor dem Schreiben erneut geparst: Wenn es nicht mehr als Zuordnung von Eigenschaften parst, schlägt der Aufruf mit frontmatter_invalid fehl und die Notiz behält ihre ursprünglichen Bytes. Diese Prüfung fängt YAML, das bricht – ein nicht in Anführungszeichen gesetztes : in einem Skalar, ein Listenmarker, der in einen Alias umgeschrieben wurde, ein verirrtes Anführungszeichen. Sie kann keine Bearbeitung fangen, die wohlgeformt bleibt, während sie etwas anderes bedeutet, wie eine Teilzeichenfolgen-Kollision, die einen Schlüssel umbenennt, oder eine Ersetzung, die die Anführungszeichen eines Skalars entfernt und seinen Typ ändert. Bevorzugen Sie obsidian_manage_frontmatter für typisierte Bearbeitungen einer einzelnen Eigenschaft.
Optionen pro Ersetzung:
useRegex– behandeltsearchals ECMAScript-Regex. MituseRegex: trueberücksichtigt die Ersetzung$1/$&-Erfassungsgruppen-Referenzen.caseSensitive– beifalsewird ohne Beachtung der Groß-/Kleinschreibung abgeglichenwholeWord– umschließt das Muster mit\b…\b; funktioniert sowohl im Literal- als auch im Regex-ModusflexibleWhitespace– ersetzt jede Folge von Leerzeichen insearchdurch\s+. Nur Literal-Modus – hat keine Wirkung, wennuseRegex: trueist (drücken Sie es direkt aus).replaceAll– beifalsewird nur der erste Treffer ersetzt. Unterscope: 'both'geht diese eine Ersetzung an das Frontmatter, wenn sie dort übereinstimmt, und andernfalls an den Textkörper.
Der Literal-Modus bewahrt $1 / $& in der Ersetzung wörtlich – nur useRegex: true expandiert Erfassungsgruppen-Referenzen.
obsidian_manage_tags
Tags zu einer Notiz hinzufügen, entfernen oder auflisten. Arbeitet mit einer von zwei Darstellungen, standardmäßig mit dem kanonischen Obsidian-Frontmatter-Ort:
location: 'frontmatter'(Standard) – nur dastags:-Array im Frontmatter; der Notiztext bleibt unberührtlocation: 'inline'– nur Inline-#tag-Syntax im Textkörper;addhängt#tagam Dateiende anlocation: 'both'– opt-in Abgleich über beide Darstellungen
add stellt sicher, dass das Tag an den angeforderten Orten vorhanden ist; remove entfernt es; list ignoriert das Eingabe-tags-Array. Inline-#tag-Vorkommen innerhalb von Codeblöcken mit Begrenzern werden absichtlich unberührt gelassen.
Der Inline-Modus liest und schreibt nur den Notiztext – ein # innerhalb eines YAML-Skalars ist Frontmatter, wird also weder als Inline-Tag aufgelistet noch durch eine Entfernung umgeschrieben. Das Entfernen eines Inline-Tags nimmt genau ein angrenzendes horizontales Leerzeichen mit – das vor dem Tag oder das danach, wenn kein Leerzeichen davor steht; jedes andere Byte überlebt, einschließlich verschachtelter Listeneinrückung, um vier Leerzeichen eingerückter Codeblöcke, nachgestellter harter Zeilenumbrüche mit zwei Leerzeichen und Tabellenzellen-Padding.
obsidian_delete_note
Eine Notiz dauerhaft löschen. Standardmäßig deaktiviert. Setzen Sie OBSIDIAN_ENABLE_DELETE=true, um sie in tools/list verfügbar zu machen. Der erste Aufruf antwortet mit einer Bestätigungsanfrage statt einer Löschung – die Eingabeaufforderung enthält die Bytegröße der Datei, sodass der zerstörerische Wirkungsradius sichtbar ist, bevor der Benutzer bestätigt – und das Tool wird mit der Antwort erneut versucht. Ablehnen oder Abbrechen schlägt den Aufruf mit cancelled fehl und gibt kein DELETE aus; die destructiveHint-Annotation macht die Operation auch im Genehmigungsablauf des Hosts sichtbar. Die Ausgabe meldet previousSizeInBytes (Größe im Moment der Löschung) und currentSizeInBytes: 0.
Die Bestätigung ist nicht optional und hat keinen Fallback-Pfad: Ein Client, der den Eingabe-Roundtrip nicht bedienen kann, kann keine Löschung abschließen. Jedes andere Tool ist davon unberührt.
Vault-Struktur-Tools
obsidian_create_folder erstellt verschachtelte Ordner idempotent. obsidian_move_path verschiebt oder benennt entweder Dateien oder Ordner über den nativen FileManager von Obsidian um, erstellt fehlende Ziel-Eltern und erlaubt Obsidian, interne Links zu aktualisieren. obsidian_delete_folder entfernt einen Ordner rekursiv unter Verwendung des konfigurierten Papierkorb-Verhaltens von Obsidian standardmäßig oder dauerhaft, wenn explizit angefordert; es ist zusammen mit dem Löschen von Notizen durch OBSIDIAN_ENABLE_DELETE=true gesperrt.
obsidian_execute_command
Sendet einen Obsidian-Befehlspaletten-Befehl per ID (entdeckbar über obsidian_list_commands). Das Verhalten ist befehlsabhängig – einige Befehle öffnen die Benutzeroberfläche, andere löschen Dateien oder schließen den Vault.
Standardmäßig deaktiviert. Wenn OBSIDIAN_ENABLE_COMMANDS nicht gesetzt ist, werden sowohl obsidian_execute_command als auch sein Entdeckungspartner obsidian_list_commands mit disabledTool() umschlossen – abwesend aus tools/list (das LLM kann sie nicht aufrufen), aber weiterhin im bedienerorientierten Manifest mit einem Hinweis sichtbar, sie zu aktivieren.
Related MCP server: Obsidian Tools MCP Server
Pfadrichtlinie (ordnerbezogene Berechtigungen)
Drei optionale Umgebungsvariablen steuern, welche Vault-Pfade jedes Tool anzielen kann. Standard nicht gesetzt = voller Vault für sowohl Lese- als auch Schreibvorgänge – abwärtskompatibel.
Ziel | Konfiguration |
Standard (aktuelles Verhalten) | alle nicht gesetzt |
Überall lesen, nur in |
|
Nur |
|
Schreibgeschützte Bereitstellung – keine Schreibvorgänge |
|
Der Abgleich ist präfixbasiert mit impliziter Rekursion, ohne Beachtung der Groß-/Kleinschreibung, mit normalisierten nachgestellten Schrägstrichen. projects/ passt auf projects/a.md, projects/sub/b.md usw.
Schreibpfade sind implizit lesbar – Sie können nicht sinnvoll bearbeiten, was Sie nicht sehen können. Ein Lesevorgang besteht also, wenn das Ziel mit READ_PATHS oder WRITE_PATHS übereinstimmt.
OBSIDIAN_READ_ONLY=true greift vor den Pfadprüfungen – jedes Schreib-Tool und das Befehlspaletten-Paar werden beim Start mit disabledTool() umschlossen (abwesend aus tools/list), und jeder Schreibvorgang, der den Dienst dennoch erreicht, wird zur Laufzeit unabhängig von WRITE_PATHS verweigert.
Ablehnungen sind als path_forbidden (JSON-RPC-Code Forbidden) typisiert, wobei der aktive Geltungsbereich in data.recovery.hint und data.activeScope zurückgegeben wird, damit das LLM sich selbst korrigieren kann, ohne Serverprotokolle zu inspizieren. Suchergebnisse von obsidian_search_notes werden still gegen READ_PATHS gefiltert – das Anzeigen eines „wir haben N Treffer versteckt“-Indikators würde das Tor zunichtemachen.
Die Tag-Auflistung ist vaultweit. obsidian_list_tags und die Ressource obsidian://tags aggregieren Tag-Namen über den gesamten Vault und werden nicht durch OBSIDIAN_READ_PATHS eingeschränkt – sie nehmen keinen Pfad zum Sperren, sodass Tag-Namen (niemals Notizinhalte) von außerhalb des Lesebereichs auftauchen können.
Das Startbanner protokolliert den aktiven Geltungsbereich, damit Bediener ihre Konfiguration beim Booten überprüfen können.
Ressourcen
Typ | URI | Beschreibung |
Ressource |
| Eine Notiz im Vault – Inhalt, Frontmatter, Tags und Dateimetadaten. |
Ressource |
| Alle im Vault gefundenen Tags mit Nutzungszahlen. |
Ressource |
| Server-Erreichbarkeit, Authentifizierungsstatus, Plugin-/Obsidian-Versionsinformationen und das Plugin-Manifest. |
Alle Ressourcendaten sind auch über Tools erreichbar – obsidian_get_note für obsidian://vault/{+path}, obsidian_list_tags für obsidian://tags. Ressourcen existieren für Clients, die es bevorzugen, eine bestimmte Notiz oder einen Vault-Schnappschuss an ein Gespräch anzuhängen. Das Tag-Paar ist kein Spiegel: obsidian://tags behält Schnappschuss-Semantik und gibt die Upstream-Nutzlast ganz und unsortiert zurück, während obsidian_list_tags nach Anzahl ordnet und begrenzt.
Funktionen
Basiert auf @cyanheads/mcp-ts-core:
Deklarative Tool- und Ressourcendefinitionen – eine Datei pro Primitive, das Framework übernimmt Registrierung und Validierung
Einheitliche Fehlerbehandlung – Handler werfen, das Framework fängt, klassifiziert und formatiert. Tools geben ihre Fehlerfläche über typisierte
errors[]-Verträge an.Server-Level-
instructionsbeiinitialize– zeigt bereitstellungsspezifische Orientierung (aktive Pfadrichtlinie, Nur-Lese-Modus, Command-Palette-Umschalter) neben dem statischen Tool-/Ressourcenkatalog für spezifikationskonforme Clients an.Plug-in-fähige Authentifizierung auf dem HTTP-Transport:
none,jwt,oauthStrukturierte Protokollierung mit optionalem OpenTelemetry-Tracing
STDIO- und Streamable-HTTP-Transports
Der Server selbst ist zustandslos – jeder Tool-Aufruf trifft direkt auf die Local REST API. Die Speicher-Backends des Frameworks, Request-State-KV und Fortschritts-Streams werden hier nicht verwendet; Obsidian ist ein einzelner Vault und es gibt nichts, was zwischen Aufrufen persistiert werden müsste.
Obsidian-spezifisch:
Kapselt das Obsidian Local REST API-Plugin – typisierter Client, deterministisches Fehler-Mapping
Abschnittsbewusstes Bearbeiten über Überschriften, Blockreferenzen und Frontmatter-Felder mittels
PATCH-mit-Ziel-OperationenTag-Abgleich über beide Darstellungen: Frontmatter-
tags:-Array und Inline-#tag-Syntax (unter Überspringen von Codeblöcken mit Begrenzern)Suche über bis zu drei Modi: Text, JSONLogic und (wenn das Plugin erreichbar ist) BM25-bewertete Omnisearch – cursor-paginiert gemäß MCP-2025-11-25-Spezifikation, mit Begrenzung der Treffer pro Datei im Textmodus
Erforderliche Bestätigung durch einen Menschen für destruktive Löschungen – eine mehrstufige
input_required-Runde, die in beiden Protokollrevisionen angeboten wird, ohne unbestätigten Pfad durch das ToolNative Verwaltung der Vault-Struktur: Ordner erstellen, Dateien oder Ordner mit Obsidian-Link-Updates verschieben/umbenennen und Ordner über den Papierkorb oder dauerhaft löschen
Native Integration der Excalidraw Automation API: semantisches Erstellen/Lesen/Hinzufügen/Aktualisieren/Löschen, deterministisches Layout, Integritätsvalidierung, PNG-Vorschau-Export und idempotente Notiz-Einbettung
Ordnerbezogene Lese-/Schreibberechtigungen über
OBSIDIAN_READ_PATHS/OBSIDIAN_WRITE_PATHSund einen globalenOBSIDIAN_READ_ONLY-Kill-Switch – Ablehnungen sind alspath_forbiddentypisiert, wobei der aktive Geltungsbereich in den Fehlerdaten zurückgespiegelt wirdOpt-in-Befehlspaletten-Paar (
obsidian_list_commands+obsidian_execute_command) – nur registriert, wennOBSIDIAN_ENABLE_COMMANDS=trueNachsichtige Pfadauflösung bei
obsidian_get_noteundobsidian_open_in_ui– versucht stillschweigend Pfade mit falscher Groß-/Kleinschreibung gegen den kanonischen Dateinamen, wirftConflictbei mehrdeutigen Groß-/Kleinschreibungs-Treffern und reichertNotFoundmitMeinten Sie: …?-Vorschlägen an, wenn nur nahe Treffer existieren.obsidian_delete_noteist bewusst ausgenommen – eine destruktive Operation sollte den Zielpfad nicht stillschweigend umschreiben.
Erste Schritte
Fügen Sie Folgendes zu Ihrer MCP-Client-Konfigurationsdatei hinzu. Das Obsidian Local REST API Plugin muss in Ihrem Vault installiert und aktiviert sein – siehe Voraussetzungen.
{
"mcpServers": {
"obsidian-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["obsidian-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"OBSIDIAN_API_KEY": "your-local-rest-api-key"
}
}
}
}Oder mit npx (kein Bun erforderlich):
{
"mcpServers": {
"obsidian-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "obsidian-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"OBSIDIAN_API_KEY": "your-local-rest-api-key"
}
}
}
}Für Streamable HTTP setzen Sie den Transport und starten Sie den Server. Inline-Umgebungsvariablen funktionieren für einmalige Ausführungen; für wiederholte Nutzung kopieren Sie Werte in .env (siehe .env.example) und führen Sie bun run start:http aus.
MCP_TRANSPORT_TYPE=http OBSIDIAN_API_KEY=... bun run start:http
# Server listens at http://127.0.0.1:3010/mcp by defaultVoraussetzungen
Bun v1.3.0 oder höher (oder Node.js v24+).
Das Obsidian Local REST API-Plugin, v4.0.0 bis v5.x, installiert und aktiviert in Ihrem Vault. Generieren Sie einen API-Schlüssel unter Einstellungen → Community-Plugins → Local REST API und kopieren Sie ihn in
OBSIDIAN_API_KEY. Plugin v6.0 entfernt das Markdown-Patch-1.x-Wire-Format, das dieser Server für abschnittsgezielte Schreibvorgänge und die Dokumentkarte festlegt.Periodische Notiz-Ziele (
target: { "type": "periodic" }) benötigen zusätzlich Plugin v5.0.1 oder früher – v5.0.2 hat die eingebauten/periodic/-Routen entfernt. Alle anderen Zieltypen sind nicht betroffen.Ein MCP-Client, der eine Eingabeanfrage (Elicitation) beantworten kann.
obsidian_delete_notefragt vor dem Löschen immer nach Bestätigung, sodass ein Client ohne diese Unterstützung Notizen lesen und schreiben, aber keine löschen kann.Optional: das Obsidian Excalidraw-Plugin installiert und aktiviert, um die elf Zeichenwerkzeuge zu nutzen. Andere Notiz- und Vault-Tools benötigen es nicht.
Dieser Server verwendet standardmäßig
http://127.0.0.1:27123der Einfachheit halber. Aktivieren Sie „Non-encrypted (HTTP) Server“ in den Plugin-Einstellungen, um ihn zu nutzen. Um stattdessen den immer aktiven HTTPS-Port zu verwenden, setzen SieOBSIDIAN_BASE_URL=https://127.0.0.1:27124; das selbstsignierte Zertifikat des Plugins wird durchOBSIDIAN_VERIFY_SSL=false(Standard) behandelt.
Installation
Repository klonen:
git clone https://github.com/cyanheads/obsidian-mcp-server.gitIn das Verzeichnis wechseln:
cd obsidian-mcp-serverAbhängigkeiten installieren:
bun installUmgebung konfigurieren:
cp .env.example .env # edit .env and set OBSIDIAN_API_KEY
Konfiguration
Variable | Beschreibung | Standard |
| Erforderlich. Bearer-Token für das Obsidian Local REST API Plugin. | — |
| Basis-URL des Local REST API Plugins. Verwenden Sie |
|
| TLS-Zertifikat verifizieren. Standard |
|
| Timeout pro Anfrage in Millisekunden. |
|
| Ausführbare Datei der Obsidian-CLI für native Datei-/Ordnerstrukturoperationen. Sie wird direkt ohne Shell aufgerufen. |
|
| Optionaler exakter Vault-Name für CLI-Operationen. Wenn nicht gesetzt, wird der aktive Vault verwendet. | nicht gesetzt |
| Opt-in-Flag für das Befehlspaletten-Paar ( |
|
| Opt-in-Flag für das Löschen von Notizen und Ordnern. Standardmäßig deaktiviert, sodass beide Lösch-Tools in |
|
| Kommagetrennte, vault-relative Ordner-Allowlist für Leseoperationen. Präfixbasiert mit impliziter Rekursion; Groß-/Kleinschreibung wird ignoriert; abschließende Schrägstriche werden normalisiert. Nicht gesetzt = gesamter Vault. Schreibpfade sind implizit lesbar. | nicht gesetzt |
| Kommagetrennte, vault-relative Ordner-Allowlist für Schreiboperationen. Gleiche Syntax wie | nicht gesetzt |
| Globaler Kill-Switch. Wenn |
|
| Überschreibungs-URL für den HTTP-Server des Omnisearch Plugins. Wenn nicht gesetzt, wird sie vom | abgeleitet |
| Transport: |
|
| Host für den HTTP-Server. |
|
| Port für den HTTP-Server. |
|
| Endpunktpfad für den JSON-RPC-Handler. |
|
| Öffentlicher Origin-Override für TLS-terminierende Reverse-Proxy-Bereitstellungen (Landing Page, Server Card, RFC 9728-Metadaten). | nicht gesetzt |
| Auth-Modus: |
|
| Erforderlich bei | — |
| Wenn |
|
| Protokollstufe (RFC 5424). |
|
| Verzeichnis für Protokolldateien (nur Node.js). |
|
| OpenTelemetry-Instrumentierung aktivieren (Spans, Metriken, Abschlussprotokolle). |
|
Siehe .env.example für die vollständige Liste optionaler Überschreibungen.
Server ausführen
Lokale Entwicklung
Produktionsversion erstellen und ausführen:
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:httpPrüfungen und Tests ausführen:
bun run devcheck # Lint, format, typecheck, security, changelog sync
bun run test # Vitest test suite
bun run lint:mcp # Validate MCP definitions against specDocker
docker build -t obsidian-mcp-server .
docker run --rm -e OBSIDIAN_API_KEY=your-key -p 3010:3010 obsidian-mcp-serverDas Dockerfile verwendet standardmäßig HTTP-Transport, zustandslosen Sitzungsmodus und protokolliert nach /var/log/obsidian-mcp-server. OpenTelemetry-Peer-Abhängigkeiten werden standardmäßig installiert — bauen Sie mit --build-arg OTEL_ENABLED=false, um sie wegzulassen.
Das Image bindet innerhalb des Containers an 0.0.0.0 (erforderlich für Docker-Portzuordnung). Für jede Bereitstellung, die über Ihre eigene Maschine hinaus erreichbar ist, setzen Sie MCP_AUTH_MODE=jwt (mit MCP_AUTH_SECRET_KEY) oder oauth – andernfalls leitet der Listener Ihre OBSIDIAN_API_KEY im Namen jedes Aufrufers an den Tresor weiter.
Projektstruktur
Verzeichnis | Zweck |
|
|
| Serverspezifische Umgebungsvariablen-Analyse ( |
| Lokaler REST-API-Client, Frontmatter-Operationen, Abschnittsextraktor, Domänentypen. |
| Tool-Definitionen ( |
| Ressourcendefinitionen ( |
| Prompt-Definitionen (derzeit leer – CRUD/Suchform profitiert nicht von einer strukturierten Vorlage). |
| Vitest-Tests, die |
| Upstream-OpenAPI-Spezifikation für das Local-REST-API-Plugin und die generierte |
| Versionsspezifische Versionshinweise; |
Entwicklungsleitfaden
Siehe CLAUDE.md für Entwicklungsrichtlinien und Architekturregeln. Die Kurzfassung:
Handler werfen, Framework fängt – kein
try/catchin der Tool-LogikVerwenden Sie
ctx.logfür anforderungsbezogenes Logging,ctx.statefür mandantenbezogenen SpeicherRegistrieren Sie neue Tools und Ressourcen über die Barrels in
src/mcp-server/*/definitions/index.tsKapseln Sie externe API-Aufrufe: Rohdaten validieren → in Domänentyp normalisieren → Ausgabeschema zurückgeben; fehlende Felder niemals erfinden
Mitwirken
Fehler, Funktionsanfragen und Dokumentationslücken gehören in ein Issue – siehe CONTRIBUTING.md für das, was ein Issue umsetzbar macht, und CODE_OF_CONDUCT.md für unsere Zusammenarbeit. Sicherheitsmeldungen gehen über SECURITY.md, niemals über ein öffentliches Issue.
Pull Requests sind für kleine, in sich geschlossene Korrekturen willkommen. Führen Sie vor dem Einreichen Prüfungen und Tests aus:
bun run devcheck
bun run testLizenz
Apache-2.0 – siehe LICENSE für Details.
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 Servers
- AlicenseBqualityDmaintenanceEnables direct file system access to Obsidian vaults with auto-discovery, full-text search, and note operations. Supports reading, writing, and searching across Obsidian notes without requiring plugins or REST API.64,785MIT
- FlicenseAqualityDmaintenanceEnables comprehensive management of Obsidian vaults with full CRUD operations, advanced search, link/tag extraction, backlinks discovery, frontmatter editing, and template-based note creation through natural language.16
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI assistants to read, write, search, and navigate Obsidian vault notes with support for CRUD operations, full-text search, graph navigation, daily notes, and frontmatter management.4,785
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to manage Obsidian vaults through full CRUD operations, wikilink management, and section-level manipulation. It supports frontmatter editing, tag-based searching, and automated link updates to maintain vault integrity.MIT
Related MCP Connectors
Search your Obsidian vault to quickly find notes by title or keyword, summarize related content, a…
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Create, validate, edit, export (markdown/svg/png/mermaid), and search JSON Canvas files.
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/huaqing0/obsidian-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server