- get_lists(scope): API scope parameter now used server-side; accepts circle
metaId ("family/XXXX") or circle name; returns circle_id field per list
- create_list(circle_id): new optional param; passes as API scope param
- delete_list: derives circle from list metaId and passes scope for
secondary-circle lists
- Added _circle_id_from_list_id() helper (taskList/FAMNUM_LISTNUM -> family/FAMNUM)
- SPEC.md: documented scope param for taskgettasklists, taskcreatelist, taskdeletelist
- Verified: familyId/circleId/id params ignored by API, only scope works
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- acccreatefamily endpoint creates a new circle (returns numeric ID)
- accinvite endpoint invites new users by email (familyId, identifier, role, firstname)
- fw_client now detects a00.ex errors (was only checking a00.un before)
- New modules/circles.py with FamilyRoleTypeEnum constants
- SPEC.md updated with acccreatefamily, accinvite, accupdatefamily docs
- Note: circle deletion not supported by FW API (metadelete → "delete not supported")
- Note: accinvite only works for new (non-existing) FW accounts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extends the category_id parameter docstring with an explicit instruction
to always call get_categories first and assign the most fitting category
to every shopping list item, plus a concrete German-category mapping.
Uncategorized items are harder to find in the store.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bug fix: literal backslash-n sequences in ingredients/instructions are now
converted to real newline characters before sending to the API, so the server
correctly splits ingredient lines into ingredientsList[].
New tool: update_recipe — partial update via mprecipeput with recipe.metaId;
fetches current recipe in the same session to verify can_update and supply
name fallback. Verified: recipe.metaId triggers update (not create).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds 4 new MCP tools for the Family Wall recipe box:
- get_recipes: list all family recipes via metasync id='recipe'
- get_recipe: fetch full recipe detail by id (filters from metasync response)
- create_recipe: create a new recipe via mprecipeput (params use 'recipe.' prefix)
- delete_recipe: delete a recipe via metadelete (same endpoint as tasks)
Verified endpoints and parameter names via FW_DEBUG=1 probe scripts.
All 4 tools pass the create → read → get_single → delete integration test.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Documents the preferred format for quantities in shopping list tasks:
item name first, quantity in parentheses at the end.
Examples: "Äpfel (5x)", "Hackfleisch (500g)", "Joghurt (Erdbeere, 2x)".
No functional code changes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
get_lists now includes emoji and color fields per list entry.
create_list response also returns emoji and color from the API.
Field name verification (FW_DEBUG=1, 2026-04-16):
- emoji: API returns "" when unset -> normalised to null
- color: API omits key when unset -> normalised to null
- Both fields present in taskgettasklists and taskcreatelist responses
SPEC.md: taskgettasklists documented with full response structure
and emoji/color normalisation notes.
taskcreatelist response updated with emoji + color fields.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds two new MCP tools:
- create_list(name, list_type, shared_to_all, color, emoji)
POST taskcreatelist; returns full list object incl. metaId
- delete_list(list_id) – with canDelete safety guard
POST taskdeletelist; param 'id' (same pattern as metadelete)
Both endpoints verified via FW_DEBUG=1 on 2026-04-16.
SPEC.md and CLAUDE.md updated with verified parameter names
and response structures.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The Family Wall API (FiZ framework) uses the special string "\$empty"
to clear optional date fields. Sending dueDate=\$empty to taskupdate2
reliably removes the due date (verified via direct API probing).
- update_task(clear_due_date=True) now sends dueDate=\$empty instead
of returning an error
- Remove the "not supported" limitation message from the docstring
- Update SPEC.md, README.md, CLAUDE.md to document the discovery
- Bump version to 0.4.16
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- fw_client: detect nested a00.un errors (previously silent-failed as success)
- update_task: add clear_due_date=True parameter that returns a clear error
explaining the Family Wall API cannot clear dueDate once set
- SPEC.md: document all tested clearing candidates and their API responses,
add Fehlerstruktur-Varianten section
- Verified: dueDate cannot be removed via any form-encoded value; all invalid
date strings are rejected via a00.un.un (silently swallowed before this fix)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- create_task: new optional params due_date (ISO 8601) and assignee_ids (list[str])
- update_task: new optional params due_date, assignee_ids, and list_id (move task)
- get_tasks: returns due_date and assignee_ids fields per task
- API params verified via FW_DEBUG=1: dueDate, assignee, taskListId
- SPEC.md, README, CLAUDE.md updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously delete_category made two separate login cycles (accgetallfamily
to verify + taskcategorydelete to delete) = 6 HTTP calls. Now both happen
in one session = 4 HTTP calls. Halves latency and eliminates the risk of
a compounding timeout when the API is temporarily slow.
FW_DEBUG=1 investigation confirmed the API itself is fast (<1s); the
reported 4-min timeout was transient API slowness amplified by the double
session overhead.
Also recreated 'Obst & Gemüse' (emoji 🍎) as taskCategory/23431854_4956806
after it was accidentally consumed by the debug script.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Custom categories (rights.canDelete=true) have no locale field set by
the API and were silently excluded by the locale filter. They now bypass
both the locale and taskListType filters so they always appear in
get_categories output regardless of the locale parameter.
Also: deleted 7 test categories (TEmojiApple, Obst & Gemüse (old),
TestKategorie, ProbeKat2, [TEST]emoji=apple, ProbeKat1, TDelMeta)
and restored 'Obst & Gemüse' (emoji 🍎) as a clean custom category.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Verified via FW_DEBUG=1 + systematic param-name probing that the
correct parameter is `taskCategoryId` with value = full metaId from
get_categories (e.g. taskCategory/23431854_200). Numeric systemCategoryId
alone causes API error; full metaId is accepted and stored.
Changes:
- create_task: add optional category_id parameter → sent as taskCategoryId
- update_task: add optional category_id parameter → sent as taskCategoryId;
guard now accepts category_id-only updates
- get_tasks: expose category_id field in returned task objects
- get_categories: update docstring (param name now known)
- SPEC.md: document verified taskCategoryId param + clarify categories[]
vs taskCategoryId field distinction
- scripts/find_category_param.py: discovery script used to find param name
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bug 1: all 171 category locale variants were returned; now filtered by
locale parameter (default "de") → 13 German categories for shopping lists.
Bug 2: TODO lists returned 171 shopping categories because
sortingIndexByTaskList contains ALL list IDs regardless of type.
Fix: look up list's taskListType via taskgettasklists, then match against
category's taskListType. TODO lists (type=TODOS) return empty list since
all API categories are SHOPPING_LIST type.
sortingIndexByTaskList is explicitly documented as unreliable for type
filtering in both code comments and SPEC.md.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- get_categories(list_id): new tool filtering taskcategorysync by
sortingIndexByTaskList, returns {id, name, emoji} ordered by sort index
- get_activities: author IDs now resolved to display names (firstName) via
famlistfamily members; raw author_id preserved as separate field; member
lookup is non-fatal (falls back to raw ID on error)
- CLAUDE.md: tools table updated to reflect all implemented tools (v0.4.8)
- SPEC.md: full accgetallfamily response structure documented including
categories[] on tasks and category parameter investigation findings
- Category assignment in create/update task: all tested parameter names
ignored by API; still to verify (Service Worker blocks web inspection)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
famlistfamily response already contains members[] on each circle object.
get_members(circle_id=None) extracts id, name, email, role, right, color,
avatar, circle_id and circle_name. get_circles refactored to use the new
_famlistfamily() helper, eliminating duplicated auth/call/logout logic.
SPEC.md updated with full famlistfamily response structure.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
FW_DEBUG=1 investigation revealed:
- wallmood can silently fail (200 OK, frozen modifDate, no state change) due to
self-like restriction, unsupported post type (FAMILY_CREATED), or rate limit
- Response contains two complementary like indicators: moodStarShortcut (primary)
and moodMap (secondary) — both must be checked
- liked: false with like=True now surfaces a warning instead of silently
returning a misleading result
- SPEC.md documents silent-fail scenarios and dual indicator pattern
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extensive FW_DEBUG=1 testing revealed:
- wallmood with moodType=STAR is an idempotent SET operation, not a toggle
- Tested: all moodType variations, moodStarShortcut param, 9 alternative
endpoints — none could remove a like
- Service Worker in the web app prevents intercepting the real unlike payload
- like=False now returns a clear error; like=True continues to work correctly
- SPEC.md updated with full investigation notes and ruled-out approaches
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
FW_DEBUG=1 verification revealed:
- moodType "LIKE" was silently mapped to "STAR" server-side; use "STAR" directly
- Response a00.r.r contains full wall object with moodMap showing actual like state
- liked status now derived from moodMap rather than echoing the input bool
- SPEC.md updated with fully verified wallmood endpoint details
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
API error message confirmed the expected parameter is 'wall_message_id',
not 'wallId'. SPEC.md updated to reflect verified finding.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Verified via FW_DEBUG=1: taskmark expects 'taskId' (not 'metaId'),
metadelete expects 'id' (not 'metaId'). Wrong names caused silent
no-ops because the API wraps errors in a00.un.un instead of top-level
un/ex, bypassing the standard error check in fw_client.
Also documents verified response structures in SPEC.md.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements four new MCP write tools via taskcreate2, taskupdate2,
taskmark, and metadelete endpoints. Confirmation prompts noted in
docstrings for destructive/mutating operations. Body parameters
documented in SPEC.md as pending verification via FW_DEBUG=1.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>