Obsidian + Web MCP + Claude.ai – DAS Trio für perfekte Notizen

Obsidian + Web MCP + Claude.ai – DAS Trio für perfekte Notizen

Ich nutze Obsidian seit einer Weile als zentrale Ablage und Wissensspeicher für meine Projekte. Dabei habe ich leider nicht die Disziplin, meine Notizen immer einheitlich zu erfassen und mit allen nötigen Metadaten anzureichern. Gerade wenn es schnell gehen muss, kommt leicht Chaos ins System.

Ich habe daher nach Wegen gesucht, wie mich KI bei der strukturierten Eingabe unterstützen kann. Am liebsten geräteneutral vom Browser oder Handy aus in meinem Vault lesen und schreiben, ohne dass dafür irgendwo ein Desktop-Client direkten Zugriff auf meine Dateien haben muss.

Die Lösung besteht aus zwei Teilen – einem headless laufenden Obsidian für den dauerhaften Sync und dem obsidian-web-mcp, der den Vault hinter einer ordentlichen Anmeldung von außen erreichbar macht.

Bei mir läuft das auf einer Ubuntu-26.04-VM im Heimnetz. Der Vault verlässt das Heimnetz nie – nach außen geht es nur über meinen vorhandenen Reverse Proxy (Caddy auf einem VPS), der per WireGuard ins Heimnetz routet. So sieht die Kette aus:

Netzwerkaufbau

Alle Domains und IP-Adressen hier sind Platzhalter – ersetze sie durch deine eigenen. Wichtig: Der MCP-Server muss auf derselben Maschine laufen wie der Vault.

Voraussetzungen

  • Eine Ubuntu-VM im Heimnetz (hier mit der LAN-IP 10.0.0.10)
  • Ein aktives Obsidian-Sync-Abo
  • Ein bereits eingerichteter Reverse Proxy, der ins Heimnetz routet
  • Eine Subdomain, die schon auf den Proxy zeigt (hier obsidian.example.com)
  • Ein eigener Benutzer für den Betrieb (hier obsidian); der Vault liegt unter /home/obsidian/obsidian-vault

1. Obsidian Headless installieren

Obsidian Headless ist ein Kommandozeilen-Client für Obsidian Sync und steckt aktuell in der offenen Beta. Vorausgesetzt wird Node.js 22 oder neuer – falls dein System eine ältere Version mitbringt, hol dir Node 22 über NodeSource:

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node --version

Dann das CLI global installieren:

sudo npm install -g obsidian-headless
which ob

Den Pfad aus which ob (bei mir /usr/local/bin/ob) brauchst du später für den systemd-Dienst.

Jetzt meldest du dich an. Mach das mit dem Linux-Benutzer, unter dem später auch der Dienst läuft (hier obsidian) – ob legt die Zugangsdaten in dessen Home ab. Meldest du dich aus Versehen als root an, findet der Dienst die Anmeldung nicht und der Sync bleibt stehen.

ob login

E-Mail und Passwort werden abgefragt, 2FA bei Bedarf automatisch. Danach verbindest du deinen Vault per Headless Sync mit dem Konto, sodass er unter /home/obsidian/obsidian-vault landet.

2. Den Sync als Dienst einrichten

Damit der Vault dauerhaft synchron bleibt, läuft ob sync --continuous als systemd-Dienst. Lege die Datei /etc/systemd/system/obsidian-sync.service an:

[Unit]
Description=Obsidian Headless Sync
After=network-online.target
Wants=network-online.target

[Service]
User=obsidian
Group=obsidian
ExecStart=/usr/local/bin/ob sync --continuous
WorkingDirectory=/home/obsidian/obsidian-vault
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Aktivieren und starten:

sudo systemctl daemon-reload
sudo systemctl enable --now obsidian-sync.service
systemctl status obsidian-sync.service

Ein Stolperstein, in den ich gelaufen bin: Startet der Dienst mit status=200/CHDIR, kommt systemd nicht ins WorkingDirectory. Bei mir lag’s daran, dass ich %h/obsidian-vault eingetragen hatte – %h zeigt bei System-Diensten aber auf /root, nicht auf das Home des angegebenen Users. Lösung: den absoluten Pfad eintragen, so wie oben.

3. obsidian-web-mcp installieren

Der MCP-Server ist in Python geschrieben und läuft mit uv. Erst die Abhängigkeiten:

curl -LsSf https://astral.sh/uv/install.sh | sh
sudo apt install -y ripgrep
which uv

ripgrep ist optional, macht aber die Volltextsuche im Vault deutlich schneller. Dann als Benutzer obsidian das Repo klonen und einrichten:

cd ~
git clone https://github.com/jimprosser/obsidian-web-mcp.git
cd obsidian-web-mcp
uv sync

Jetzt zwei Geheimnisse erzeugen – ein Token und ein Passwort für die spätere Anmeldung:

python3 -c "import secrets; print(secrets.token_hex(32))"
python3 -c "import secrets; print(secrets.token_urlsafe(24))"

Ohne gesetztes Passwort startet der Server bewusst nicht – das ist also Pflicht. Die Konfiguration läuft komplett über Umgebungsvariablen. Lege dafür eine Datei an, die nur root lesen kann:

sudo install -m 600 -o root -g root /dev/null /etc/obsidian-web-mcp.env
sudo nano /etc/obsidian-web-mcp.env

Inhalt (keine Anführungszeichen drumherum):

VAULT_PATH=/home/obsidian/obsidian-vault
VAULT_MCP_TOKEN=<dein-token>
VAULT_OAUTH_USERNAME=obsidian
VAULT_OAUTH_PASSWORD=<dein-passwort>
VAULT_MCP_HOST=10.0.0.10
VAULT_MCP_PORT=8420
VAULT_MCP_ALLOWED_HOSTS=obsidian.example.com
VAULT_MCP_PUBLIC_URL=https://obsidian.example.com
VAULT_MCP_FORWARDED_ALLOW_IPS=10.0.0.20

VAULT_MCP_HOST steht auf der LAN-IP statt auf 127.0.0.1, weil mein Reverse Proxy auf einer anderen Maschine läuft und Localhost der VM nicht erreichen würde. ALLOWED_HOSTS und PUBLIC_URL tragen deine öffentliche Subdomain ein, damit Anfragen über den Proxy akzeptiert werden. Was hinter FORWARDED_ALLOW_IPS gehört, ermitteln wir im nächsten Schritt.

Dann der Dienst selbst, /etc/systemd/system/obsidian-web-mcp.service:

[Unit]
Description=Obsidian Web MCP Server
After=network-online.target
Wants=network-online.target

[Service]
User=obsidian
Group=obsidian
WorkingDirectory=/home/obsidian/obsidian-web-mcp
EnvironmentFile=/etc/obsidian-web-mcp.env
ExecStart=/home/obsidian/.local/bin/uv run vault-mcp
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Den uv-Pfad in ExecStart an deine Ausgabe von which uv anpassen. Starten und kurz lokal testen:

sudo systemctl daemon-reload
sudo systemctl enable --now obsidian-web-mcp.service
curl -s http://10.0.0.10:8420/.well-known/oauth-authorization-server

4. Über den Reverse Proxy erreichbar machen

Ich gehe davon aus, dass dein Proxy steht und schon andere Heimdienste ausliefert. Dann fehlt nur ein neuer Block – bei Caddy auf dem VPS sieht das so aus:

obsidian.example.com {
    reverse_proxy 10.0.0.10:8420
}

TLS holt sich Caddy automatisch über Let’s Encrypt; ins Heimnetz geht es danach durch den WireGuard-Tunnel.

Eine Sache muss man kurz herausfinden: Mit welcher Quell-IP kommt der Proxy auf der VM an? Davon hängt ab, was in VAULT_MCP_FORWARDED_ALLOW_IPS gehört. Statt zu raten, lauschst du auf der VM kurz mit:

sudo tcpdump -ni any tcp port 8420

Dann rufst du https://obsidian.example.com einmal von außen auf und schaust, welche IP im Mitschnitt als Quelle auftaucht – bei mir war das 10.0.0.20, die LAN-Adresse meines WireGuard-Gateways. Genau die trägst du in die Env-Datei ein.

Da der Server jetzt auf der LAN-IP lauscht, sperre ich ihn per Firewall zusätzlich auf den Proxy ein:

sudo ufw allow from 10.0.0.20 to any port 8420 proto tcp

Zum Abschluss neu starten und von außen testen:

sudo systemctl restart obsidian-web-mcp.service
curl -s https://obsidian.example.com/.well-known/oauth-authorization-server

Kommt hier die Antwort des Servers zurück, steht die Verbindung.

5. In Claude verbinden

In Claude unter Einstellungen → Connectors → Connector hinzufügen gehen und nur die Server-URL eintragen:

https://obsidian.example.com

Claude kümmert sich um den Rest, öffnet ein Browserfenster und fragt nach Benutzername und Passwort – das sind die Werte aus VAULT_OAUTH_USERNAME und VAULT_OAUTH_PASSWORD. Danach hat Claude Zugriff auf den Vault: lesen, schreiben, suchen, verschieben und so weiter.

Wo ich beim Verbinden hängengeblieben bin

Bei mir lief der letzte Schritt erst beim dritten Anlauf. Zweimal bekam ich dieselbe Meldung:

{ "error": "invalid_client", "error_description": "Unknown client; register via /oauth/register first." }

Dahinter steckten zwei Ursachen. Beim ersten Mal hatte ich beim Anlegen des Connectors zusätzlich zur URL eine Client-ID eingetippt – nämlich meinen Benutzernamen. Das ist falsch: Der Benutzername ist nur für die Anmeldung im Browser gedacht, die Client-ID vergibt der Server selbst. Lösung: Connector löschen, neu anlegen und wirklich nur die URL eintragen.

Die zweite Ursache ist gut zu wissen: Der Server merkt sich angemeldete Clients nur im Arbeitsspeicher. Jeder Neustart des Dienstes oder Reboot der VM löscht diese Liste – danach muss man den Connector in Claude einmal neu autorisieren.

Wenn es hakt, hilft ein Blick ins Log während des Verbindens:

journalctl -u obsidian-web-mcp -f

Dort sollte beim Verbinden ein Aufruf von /oauth/register mit Status 200 auftauchen und die Client-ID in der /oauth/authorize-Zeile ein langer Zufallsstring sein – nicht dein Benutzername.

Fazit

Das eigentliche Setup ist überschaubar: zwei Dienste, ein Proxy-Block, eine Handvoll Variablen. Die meiste Zeit ging bei mir in die zwei kleinen Fallstricke oben drauf. Dafür kann ich jetzt von überall in meinem Vault arbeiten lassen, ohne dass dafür je ein Desktop-Client offen sein muss.