diff --git a/SPEC.md b/SPEC.md index d22e552..19adeef 100644 --- a/SPEC.md +++ b/SPEC.md @@ -189,7 +189,7 @@ offener Punkte (z.B. `type`-Parameter beim Login, Kreis-Felder in Response). POST https://api.familywall.com/api/taskcreate2 Content-Type: application/x-www-form-urlencoded -**Body-Parameter (aus API-Pattern abgeleitet, zu verifizieren):** +**Body-Parameter (verifiziert):** | Parameter | Pflicht | Wert | |---|---|---| @@ -197,53 +197,74 @@ Content-Type: application/x-www-form-urlencoded | `text` | ja | Aufgabentitel | | `description` | nein | Optionale Beschreibung | -**Response-Struktur (zu verifizieren):** +**Response-Struktur (verifiziert):** ``` -a00.r.r.metaId → metaId der neu erstellten Task +a00.r.r → vollständiges Task-Objekt der neu erstellten Task + .metaId → eindeutige Task-ID (z.B. "task/23431854_726362809") + .taskListId → Listen-ID + .text → Titel + .complete → "false" (immer, direkt nach Erstellung) ``` ### `taskupdate2` – Task aktualisieren POST https://api.familywall.com/api/taskupdate2 Content-Type: application/x-www-form-urlencoded -**Body-Parameter (aus API-Pattern abgeleitet, zu verifizieren):** +**Body-Parameter (verifiziert):** | Parameter | Pflicht | Wert | |---|---|---| | `metaId` | ja | Task-ID aus `get_tasks` | | `text` | nein | Neuer Titel (mindestens `text` oder `description` erforderlich) | | `description` | nein | Neue Beschreibung | -| `taskListId` | unklar | Evtl. erforderlich – zu verifizieren | -**Response-Struktur:** kein spezifischer Rückgabewert erwartet (Erfolg = kein `ex`/`un`-Key) +Hinweis: `taskListId` ist **nicht** erforderlich (verifiziert – Update ohne `taskListId` funktioniert). + +**Response-Struktur:** kein spezifischer Rückgabewert – Erfolg = kein `ex`/`un`-Key auf Top-Level. ### `taskmark` – Task als erledigt/offen markieren POST https://api.familywall.com/api/taskmark Content-Type: application/x-www-form-urlencoded -**Body-Parameter (aus API-Pattern abgeleitet, zu verifizieren):** +**Body-Parameter (verifiziert):** | Parameter | Pflicht | Wert | |---|---|---| -| `metaId` | ja | Task-ID aus `get_tasks` | +| `taskId` | ja | Task-ID aus `get_tasks` (**WICHTIG: `taskId`, nicht `metaId`!**) | | `complete` | ja | `"true"` oder `"false"` (String, nicht Boolean!) | -**Response-Struktur:** kein spezifischer Rückgabewert erwartet (Erfolg = kein `ex`/`un`-Key) +**Achtung:** Der Endpoint heißt intern `taskId`, nicht `metaId`. +Falsche Parameter (`metaId`, `id`, `taskMetaId`) werden serverseitig ignoriert – +die API antwortet dann mit einem Fehler in `a00.un.un` (nicht Top-Level!), +der vom Standard-Error-Check im fw_client übersehen wird. -### `metadelete` – Objekt löschen (Task) +**Response-Struktur (verifiziert):** +``` +a00.r.r → vollständiges Task-Objekt mit aktuellem Stand (inkl. lastAction: "MARK_COMPLETED") +``` + +### `metadelete` – Objekt löschen POST https://api.familywall.com/api/metadelete Content-Type: application/x-www-form-urlencoded -**Body-Parameter (aus API-Pattern abgeleitet, zu verifizieren):** +**Body-Parameter (verifiziert):** | Parameter | Pflicht | Wert | |---|---|---| -| `metaId` | ja | Task-ID aus `get_tasks` | +| `id` | ja | Task-ID aus `get_tasks` (**WICHTIG: `id`, nicht `metaId`!**) | -Hinweis: `metadelete` ist ein generischer Lösch-Endpoint. Er löscht jedes Objekt -mit der angegebenen `metaId` – nicht nur Tasks. Entsprechend vorsichtig verwenden. +Hinweis: `metadelete` ist ein generischer Lösch-Endpoint für beliebige Objekte (Tasks, etc.). +Entsprechend vorsichtig verwenden. -**Response-Struktur:** kein spezifischer Rückgabewert erwartet (Erfolg = kein `ex`/`un`-Key) +**Response-Struktur (verifiziert):** +``` +a00.r.r → "true" (String) +``` + +**Fehlerverhalten:** Bei falschem Parameter-Namen (`metaId`, `taskId` etc.) antwortet die API +mit `{"a00": {"un": {"un": {"message": "missing value in: id"}}}}` auf Top-Level ohne `un`-Key +→ wird vom fw_client fälschlich als Erfolg interpretiert. Daher ist der korrekte Parameter-Name +kritisch. ## Noch zu verifizieren @@ -255,7 +276,7 @@ mit der angegebenen `metaId` – nicht nur Tasks. Entsprechend vorsichtig verwen - Kreis-Zuordnung in `accgetallfamily`-Response → noch offen - ~~Ob `partnerScope` / `withStateBean` benötigt werden~~ → nein (verifiziert) - Session-Lebensdauer (irrelevant da kein Caching) -- `taskcreate2`: genaue Response-Struktur (metaId-Pfad), ob weitere Pflichtfelder existieren -- `taskupdate2`: ob `taskListId` Pflichtfeld ist; Response-Struktur -- `taskmark`: Response-Struktur -- `metadelete`: Response-Struktur, welche Objekt-Typen unterstützt werden \ No newline at end of file +- ~~`taskcreate2`: Response-Struktur~~ → `a00.r.r` = vollständiges Task-Objekt (verifiziert) +- ~~`taskupdate2`: ob `taskListId` Pflichtfeld ist~~ → **nein**, nicht erforderlich (verifiziert) +- ~~`taskmark`: korrekter Parameter-Name~~ → **`taskId`** (nicht `metaId`!) (verifiziert) +- ~~`metadelete`: korrekter Parameter-Name + Response-Struktur~~ → **`id`**, Response `"true"` (verifiziert) \ No newline at end of file diff --git a/src/mcp_familywall/__init__.py b/src/mcp_familywall/__init__.py index 6a9beea..3d26edf 100644 --- a/src/mcp_familywall/__init__.py +++ b/src/mcp_familywall/__init__.py @@ -1 +1 @@ -__version__ = "0.4.0" +__version__ = "0.4.1" diff --git a/src/mcp_familywall/server.py b/src/mcp_familywall/server.py index 12e4869..0531834 100644 --- a/src/mcp_familywall/server.py +++ b/src/mcp_familywall/server.py @@ -428,7 +428,7 @@ def toggle_task(task_id: str, complete: bool) -> str: JSON success indicator or an error message. """ params: dict[str, Any] = { - "metaId": task_id, + "taskId": task_id, # verified: taskmark uses 'taskId', not 'metaId' "complete": "true" if complete else "false", } @@ -462,7 +462,9 @@ def delete_task(task_id: str) -> str: JSON success indicator or an error message. """ try: - _authenticated_call("metadelete", {"metaId": task_id}) + _authenticated_call( + "metadelete", {"id": task_id} + ) # verified: metadelete uses 'id', not 'metaId' except RuntimeError as exc: return f"Error: {exc}"