Verified via systematic FW_DEBUG=1 probing: - taskcategoryput: requires 'name'; optional 'emoji' (Unicode or string code) accepted as-is. 'listId' param has no per-list effect — categories are family-wide. - taskcategorydelete: uses 'id' param (not 'metaId'), returns r='true'. Changes: - create_category(list_id, name, icon=None): creates custom category via taskcategoryput; icon maps to 'emoji' API param - delete_category(category_id): safety check via accgetallfamily looks up rights.canDelete='true'; system categories (rights.canDelete=null) are refused with a clear error - get_categories: now exposes 'custom' bool field (rights.canDelete='true') so callers can identify deletable categories - SPEC.md: document taskcategoryput + taskcategorydelete params, responses, error formats, and system-category protection behaviour Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5.2 KiB
mcp-familywall
Kontext
Dieses Projekt entwickelt mcp-familywall – einen MCP-Server für den Lesezugriff
auf Family Wall (familywall.com). Der MCP-Server läuft lokal und wird in Claude Desktop
eingebunden.
Infrastruktur
| Family Wall API | https://api.familywall.com/api |
| Gitea | https://gitea.gecheckt.de/marcus/mcp-familywall |
| Lokaler Code | D:\Dev\Projects\mcp-familywall |
| Sprache | Python 3.12+, uv, MCP SDK, httpx, keyring, click, rich |
Deploy-Workflow (nach jeder Code-Änderung)
- Claude Code committet und pusht (bei Berechtigungsfehler: bis zu 2 Retries, je 1s warten)
Aktueller Stand
Implementierte Tools (v0.4.11)
| Kategorie | Tools |
|---|---|
| Kreise | get_circles, get_members |
| Listen | get_lists |
| Tasks (Lesen) | get_tasks (inkl. category_id), get_categories (inkl. custom-Flag) |
| Wall | get_activities, like_post |
| Tasks (Schreiben) | create_task (inkl. category_id), update_task (inkl. category_id), toggle_task, delete_task |
| Kategorien (Schreiben) | create_category (inkl. icon), delete_category (System-Kategorien geschützt) |
Roadmap
- v0.x: Erweiterter Lese- + Schreibzugriff ← aktuell
- Offen: Unlike (
like_post(like=False))
Referenzprojekt
Im Ordner reference/ liegen Dateien aus einem anderen MCP-Server-Projekt
als Orientierung für Struktur und Patterns:
| Datei | Zweck |
|---|---|
reference/pyproject.toml |
Projektstruktur, Dependencies, Entry-Points, Build-System |
reference/config.py |
Config-Pattern: YAML laden, validieren, speichern |
reference/auth.py |
Keyring-Integration, Credential-Resolution-Reihenfolge |
reference/cli.py |
Setup-Wizard, check, serve – CLI-Struktur |
Wichtig: Diese Dateien sind Referenz, kein Copy-Paste. Alle Synology/DSM-spezifischen Teile werden nicht übernommen. Family Wall nutzt ein anderes Auth-Schema – siehe SPEC.md.
Architektur-Entscheidungen
Session-Strategie
Kein Session-Caching. Jeder Tool-Call führt Login → API-Call → Logout durch.
Credentials liegen im OS Keyring (nur email + password), kein session_id.
Kreise (Scopes)
Family Wall kennt mehrere Kreise (z.B. Familie, erweiterter Familienkreis).
get_lists unterstützt optionalen scope-Parameter zur Filterung.
Ohne scope werden alle Kreise zurückgegeben.
Listen-Namen
Systembezeichnungen (z.B. SYS-CAT-SHOPPINGLIST) werden in deutsche
Klarnamen übersetzt. Mapping-Tabelle in modules/lists.py.
Claude Code – Implementierungsregeln
- Keine destruktiven Operationen in v1.0 → kein Confirmation-Pattern erforderlich
- Fehlerbehandlung: API-Fehler als verständliche Meldung zurückgeben, keine Stacktraces
- Keine Secrets in stderr-Ausgaben (Passwort bei Debug-Logging maskieren)
- Type Hints und Docstrings konsequent verwenden
- Formatter:
ruff format, Linter:ruff check, Tests:pytest - Alle Texte (Docstrings, Kommentare, README): Englisch
- Debug-Logging via
FW_DEBUG=1Umgebungsvariable - Nach jeder Aufgabe: git commit + push. Bei Berechtigungsfehler: 1s warten, bis zu 2 Retries
- .gitignore eigenständig pflegen (Credentials, pycache, .venv, .env, *.pyc etc.)
- README.md im Projekt-Root pflegen und bei jedem Aufruf aktualisieren
Implementierungsreihenfolge
Gruppe 1 – Projektgerüst + Auth + CLI ✦ Prio: hoch
pyproject.toml: Packagemcp-familywall, Entry-Pointmcp-familywallsrc/mcp_familywall/config.py:~/.config/mcp-familywall/config.yaml, schema_version 1src/mcp_familywall/auth.py: Keyring-Servicemcp-familywall, Keys:email,password. Credential-Resolution:- Umgebungsvariablen
FW_EMAIL,FW_PASSWORD - OS Keyring
- Umgebungsvariablen
src/mcp_familywall/fw_client.py: HTTP-Client mithttpx. Methoden:login(),logout(),call(endpoint, params). Debug-Logging wennFW_DEBUG=1(Passwort maskieren).src/mcp_familywall/cli.py:setup: fragt E-Mail + Passwort, führt Login/Logout durch, speichert Credentials im Keyring, gibt Claude-Desktop-Snippet auscheck: testet Auth und API-Erreichbarkeitserve: startet MCP-Server
Config-Datei enthält nur:
schema_version: 1
Gruppe 2 – MCP Tools ✦ Prio: hoch
src/mcp_familywall/server.py + src/mcp_familywall/modules/lists.py
get_circles
- Ruft
famlistfamilyauf - Gibt alle Kreise zurück:
id,name - Confirmation: nein
get_lists
- Signatur:
get_lists(scope: str = None) -> str - Ruft
accgetallfamilyauf (Parameter:a01call=taskcategorysync,a02call=tasksync) - Gibt zurück:
id(metaId),name(übersetzt),type, offene Einträge, Gesamteinträge, Kreis-Name - Ohne
scope: alle Kreise; mitscope: nur dieser Kreis - Confirmation: nein
get_tasks
- Signatur:
get_tasks(list_id: str, only_open: bool = True) -> str list_id: metaId ausget_lists- Gibt zurück:
id,text,description,completed - Confirmation: nein
Test-Credentials (nur für Entwicklung)
marcus@gecheckt.de |
|
| Passwort | Lasdas1234 |
Hintergrund
Marcus ist Senior Software Engineer (Java, Jakarta EE). Präferenz: State-of-the-Art, Best Practices, saubere Architektur. Automatisierung spart Zeit für die Familie. 🌱