obsidian-mcp-server

obsidian-mcp-server

Provides tools for searching and reading Obsidian notes, creating flashcards, generating summaries, and planning study schedules via the MCP protocol.

Category
访问服务器

README

obsidian-mcp-server

Ein MCP-Server (Model Context Protocol) für einen Obsidian-Studien-Vault. Gibt Claude Zugriff auf Notizsuche, Notizinhalte, Flashcard-Erstellung im Decks-Format und die Lernplanung des Lerntracker-Plugins.

Python, MCP SDK 2.x, stdio-Transport.

Zweck

Bisher lief die Logik in zwei Obsidian-Plugins:

  • Decks (Fremdplugin) rendert Flashcards, erzeugt sie aber nicht — die Karten wurden von Hand geschrieben.
  • Lerntracker (eigenes Plugin) verwaltet Lernfortschritt und Lernplan, verteilt den Stoff aber bewusst nicht automatisch auf Tage.

Dieser Server schließt beide Lücken: Claude kann Karten direkt im bestehenden Dateiformat anlegen und einen Lernplan berechnen, der in die data.json des Lerntrackers zurückgeschrieben wird.

Installation

cd ~/Projects/obsidian-mcp-server
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Konfiguration

Beide Pfade kommen aus Umgebungsvariablen — nichts ist hardcodiert.

Variable Default Bedeutung
OBSIDIAN_VAULT_PATH ~/Library/Mobile Documents/iCloud~md~obsidian/Documents/Sem_4 Wurzel des Vaults
LERNTRACKER_DATA_PATH $OBSIDIAN_VAULT_PATH/.obsidian/plugins/lerntracker/data.json Datenbank des Lerntrackers

Der Default für den Vault-Pfad passt zu einem iCloud-synchronisierten Obsidian; für ein anderes Setup genügt es, OBSIDIAN_VAULT_PATH zu setzen.

Der Lerntracker-Pfad ist separat einstellbar, weil Obsidian-Vaults verschachtelt sein können: liegt in einem Unterordner ein weiterer Vault, hat der eine eigene data.json. Der Default zeigt auf die des Hauptvaults.

Tools

Tool Wirkung
search_notes(query, limit=20) Sucht case-insensitiv in Dateinamen und Inhalten. Namenstreffer werden höher gewichtet; liefert Pfad + Textstellen. Read-only
get_note(path) Gibt den vollständigen Inhalt einer Notiz zurück. Read-only
create_flashcard(front, back, note_path, deck="") Schreibt. Hängt eine Karte an <Kurs>/Flashcards/<deck>.md an
generate_summary(note_path) Bereitet eine Notiz strukturiert auf. Read-only
save_summary(note_path, summary) Schreibt. Legt <Kurs>/Zusammenfassungen/<Notiz>.md an
generate_study_plan(courses, deadlines, hours_per_subtopic=1.5, dry_run=False) Schreibt. Verteilt offene Unterthemen auf Tage und trägt sie in data.json ein

Alle Schemas werden vom SDK aus Type Hints und Docstrings erzeugt — im Code steht kein handgeschriebenes JSON-Schema.

Flashcard-Format

create_flashcard schreibt exakt das Format, das die vorhandenen Karten im Vault benutzen (Header-Paragraph), erweitert um einen Wikilink auf die Quelle:

---
tags: [decks]
---

## Was ist ein Signal?

Eine zeitabhängige, messbare physikalische Größe.

Quelle: [[01_Physikalische_Schicht]]

Die Zieldatei ergibt sich aus dem Kursordner der Quellnotiz; deck überschreibt den Dateinamen. Existiert die Datei nicht, wird sie mit tags: [decks] angelegt. Eine Karte mit identischer Vorderseite wird übersprungen statt doppelt angelegt.

Der Lernstand von Decks liegt in einer SQLite-Datenbank, nicht in den Markdown-Dateien. Der Server fasst sie nicht an — die FSRS-Historie bleibt unberührt.

Warum generate_summary nicht selbst zusammenfasst

Der Server hat kein Sprachmodell. Er liefert die Notiz strukturiert zurück (Gliederung, Kennzahlen, Volltext); die Zusammenfassung schreibt das Modell auf der Client-Seite — also Claude Desktop. Gespeichert wird sie anschließend mit save_summary. Das ist die übliche MCP-Rollenverteilung: der Server liefert Kontext und führt Aktionen aus, das Modell formuliert.

Soll der Server stattdessen selbst zusammenfassen, müsste er die Anthropic-API aufrufen und bräuchte einen eigenen API-Key.

Lernplan-Logik

generate_study_plan verteilt jedes offene Unterthema auf konkrete Tage:

  1. Kurse werden nach Klausurdatum sortiert — die früheste Klausur zuerst.
  2. Lernschluss = examDate − bufferDays; die Puffertage bleiben für Wiederholung frei.
  3. Lerntage kommen aus settings.weeklyHours (0 = Sonntag … 6 = Samstag). Tage mit 0 Stunden und alle blockedDates werden übersprungen.
  4. Jedes Unterthema kostet hours_per_subtopic (Default 1,5 h) und wird in den frühesten Tag mit Restkapazität gelegt. Passt es nicht in einen Tag, wird es über mehrere Tage gesplittet — das Plugin unterstützt mehrere dates.
  5. Bereits abgehakte Unterthemen und solche mit vorhandenen dates bleiben unangetastet.
  6. Was nicht mehr vor den Lernschluss passt, wird als Warnung gemeldet statt still verworfen.

Vor jedem Schreibvorgang entsteht ein Backup neben der Datei (data.backup-<Zeitstempel>.json); geschrieben wird atomar über eine Temp-Datei. dry_run=True zeigt nur den Plan.

Nach dem Schreiben in Obsidian Cmd+R drücken, damit das Plugin neu lädt.

Resources

URI Inhalt
vault://structure Ordnerbaum des Vaults mit Notizanzahl je Ordner
note://{+path} Inhalt einer einzelnen Notiz, read-only

Das Template nutzt bewusst {+path} (Reserved Expansion) statt {path}. Normale Template-Variablen matchen keine Slashes — mit {path} würde jede Notiz in einem Unterordner stillschweigend nicht gefunden, und im Vault liegt praktisch jede Notiz in einem Kursordner.

Lokal testen mit dem MCP Inspector

Der Inspector wird über die CLI des SDK gestartet und öffnet eine Weboberfläche, in der sich Tools und Resources einzeln aufrufen lassen. Er braucht npx (Node.js) und uv.

source .venv/bin/activate && mcp dev main.py

Der Befehl gibt eine URL wie http://localhost:6274 aus (mit angehängtem Session-Token). Im Browser öffnen, links auf Connect, dann:

  • Reiter Tools → List Tools → ein Tool wählen, Argumente eintragen, Run Tool
  • Reiter Resources → List Resources → vault://structure anklicken
  • Für die templated Resource den URI direkt eingeben, nach dem Muster note://<Kursordner>/Flashcards/<Datei>.md

Mit abweichendem Vault:

OBSIDIAN_VAULT_PATH="$HOME/Pfad/zu/deinem/Vault" mcp dev main.py

Zum Ausprobieren der schreibenden Tools lohnt sich ein Wegwerf-Vault:

OBSIDIAN_VAULT_PATH=/tmp/testvault mcp dev main.py

Anbindung an Claude Desktop

Konfigurationsdatei: ~/Library/Application Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "obsidian-vault": {
      "command": "/Users/DEIN_NAME/Projects/obsidian-mcp-server/.venv/bin/python",
      "args": ["/Users/DEIN_NAME/Projects/obsidian-mcp-server/main.py"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/Users/DEIN_NAME/Pfad/zu/deinem/Vault"
      }
    }
  }
}

Wichtig: absolute Pfade verwenden — ~ und $HOME werden hier nicht expandiert. Als command das Python aus dem venv angeben: Claude Desktop startet den Server ohne aktivierte Umgebung, ein bloßes "python3" fände das mcp-Paket nicht.

Existiert die Datei schon, nur den Eintrag "obsidian-vault" in das vorhandene mcpServers-Objekt einfügen. Danach Claude Desktop komplett beenden und neu starten; der Server erscheint dann im Werkzeug-Menü des Eingabefelds.

Sicherheit

Jeder Pfad aus einem Tool- oder Resource-Aufruf wird gegen den Vault geprüft: absolute Pfade und ..-Traversal werden abgelehnt, und das aufgelöste Ziel muss innerhalb von OBSIDIAN_VAULT_PATH liegen. .obsidian, .git, .trash, .claude und node_modules sind von Suche und Strukturauflistung ausgenommen — Plugin-Bundles würden die Ergebnisse sonst überschwemmen.

save_summary überschreibt keine existierende Datei, create_flashcard legt keine doppelte Karte an, und generate_study_plan sichert data.json, bevor es schreibt.

Getestet

Gegen mcp 2.0.0 auf Python 3.14: Tool-Schemas, Resource-Templates, stdio-Handshake mit einem echten ClientSession, Pfad-Guards, sowie die schreibenden Tools gegen einen Wegwerf-Vault (inklusive Mehrtages-Split, blockierten Tagen, Nullstunden-Wochentagen und dem Überlauffall).

Lizenz

MIT — siehe LICENSE.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选