Implement v0.8.2: When get_lists() is called without a scope parameter,
it now fetches lists from ALL circles instead of only the primary circle.
Implementation:
- Login once, call famlistfamily to get all circle IDs
- For each circle, call taskgettasklists(scope=<circle_id>)
- Merge results and return all lists with circle_id field
All tests passed: test_multi circle creation, list creation in secondary
circle, get_lists() without scope returns lists from both circles.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- New tool: get_recipe_categories() lists available recipe category IDs
- Enhanced create_recipe and update_recipe with optional category_ids parameter
- Extended get_recipe and get_recipes to include category_ids in response
- Updated parse_recipe_full() to extract recipeCategoryIdList from API response
- Extended build_create_params() and build_update_params() to handle category_ids
Recipe categories are managed via recipe.recipeCategoryIdList in mprecipeput API.
Categories are represented as a list of category IDs (e.g. ["category/23431854_2"]).
No direct API endpoint exists for listing all categories; they are discovered from
existing recipes or must be known in advance.
Version: 0.7.5 → 0.8.0
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Adds isFirstFamily check to update_circle — mirrors the same guard
already present in delete_circle. Attempting to rename the primary
circle now returns a clear error instead of silently renaming it.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements accupdatefamily endpoint (verified via FW_DEBUG=1):
- Parameter 'scope' targets any circle (primary or secondary)
- Without scope: renames the primary circle (API default)
- Server always capitalises the first letter of the new name
- Verifies circle existence via famlistfamily in same session
- Response a00.r.r = full circle object with updated name
Also corrects SPEC.md: accupdatefamily with scope= works for any
circle, not just the primary (previous note was incomplete).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements taskupdatelist endpoint (verified via FW_DEBUG=1):
- Parameter 'metaId' (not 'id') identifies the list
- Partial update: only provided fields (name/color/emoji) are changed
- Reads rights.canUpdate before calling the endpoint (single session)
- System lists (canUpdate != 'true') are rejected with a clear error
- Scope derived from list metaId for secondary-circle support
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements `delete_circle(circle_id)` using the verified `adminwipefamily`
endpoint. Protects the primary circle via `isFirstFamily` check. Probe
circles family/23447370 and family/23447378 cleaned up during testing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
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>
- 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>