A monorepo containing multiple MCP servers for productivity tools: Apple Notes, Obsidian, and TextEdit
26 tools across 4 packages with complete JSON schemas and basic descriptions. However, descriptions are minimal (avg ~60 chars, well below 194-char baseline), many lack actionable context for LLM selection, and parameter descriptions are sparse or missing. No error handling guidance, no output schema documentation, and no tool annotations. Naming is verb-first and clear, but composition issues exist (e.g., notes_create vs notes_create_dated_topic are near-duplicates). Security concerns: path parameters (textedit_open, write_note) accept absolute paths with only weak root validation. No idempotency guarantees documented.
Hängt Text an eine Markdown-Notiz an.
Listet Markdown-Notizen unter einem optionalen Unterordner (relativ zum Vault).
Listet die zuletzt geänderten Markdown-Dateien (mtime), neueste zuerst.
Verschiebt eine Markdown-Notiz in einen anderen Vault-Unterordner (relativ).
Text an den Body anhängen.
Neue Notiz in einem Ordner (Titel + Body).
Neue Notiz mit Titel YYYY-MM-DD — <Thema> (Datum = heute, ISO-Kalendertag UTC).
Descriptions are minimal (avg ~60 chars vs 194-char baseline). Most lack context for LLM selection, prerequisites, or when to use vs similar tools. E.g., 'Neue Notiz in einem Ordner' does not explain when to use notes_create vs notes_create_dated_topic.
Parameter descriptions are missing or generic. 'folder' appears in 11 tools but is never described (is it required? what is the default? what format?). 'name' in notes_rename lacks context (exact title match? case-sensitive?). LLMs cannot infer parameter semantics from names alone.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | 2026-07-28+ | v2 |
Volltext einer Notiz (Ordner + exakter Titel).
Alle Ordnernamen (flach).
Notizen eines Ordners: Name<TAB>Modifikationsdatum pro Zeile.
Notiz in einen anderen Ordner verschieben.
Titel mit YYYY-MM-DD aus dem Änderungsdatum präfixen (wenn noch nicht vorhanden); optional Thema anhängen.
Notiz umbenennen. Achtung: bei doppelten Titeln greift first note whose name.
Body vollständig ersetzen.
Einfache Suche (ignoriert Groß/Klein) in Titel oder Body-Ausschnitt (erste 2000 Zeichen).
Liest eine Notiz-Datei relativ zum Vault (Markdown).
Benennt eine Markdown-Notiz um (relativ im Vault, nur Zielname ändern).
Einfache Volltextsuche (Teilstring, case-insensitive) über Markdown-Dateien.
Schließt das vorderste Dokument (mit oder ohne Speichern).
Liest den Text des vordersten TextEdit-Dokuments.
Neues leeres TextEdit-Dokument.
Öffnet eine Datei in TextEdit (macOS). Pfad muss absolut sein und unter TEXTEDIT_ALLOWED_ROOT liegen (Standard: $HOME).
Speichert das vorderste Dokument unter einem absoluten Pfad (muss unter TEXTEDIT_ALLOWED_ROOT liegen).
Setzt den Text des vordersten TextEdit-Dokuments.
Zeigt den konfigurierten Obsidian-Vault-Pfad (aus OBSIDIAN_VAULT_PATH) und ob er existiert.
Schreibt oder überschreibt eine Markdown-Datei im Vault. Optional werden fehlende Verzeichnisse angelegt.
No output schema documentation. Tools return text responses but LLMs do not know the structure (e.g., does notes_list_notes return tab-separated lines? JSON? What fields?). Agents cannot reliably parse or chain results.
Path traversal risk in textedit_open, write_note, move_note, textedit_save_front_to. Descriptions mention TEXTEDIT_ALLOWED_ROOT and OBSIDIAN_VAULT_PATH validation, but no evidence of actual path sanitization in handlers.ts (file truncated). LLMs can be tricked into passing '../../../etc/passwd'.
No error handling guidance. Handlers catch errors and return 'Fehler: <message>' but do not classify errors (retryable vs user-fixable vs fatal) or suggest recovery steps. LLMs cannot decide whether to retry, ask the user, or abort.