Server has 9 tools with consistent naming (verb_noun pattern) and reasonable descriptions (avg ~180 chars). All tools have input schemas with type definitions. However, parameter descriptions are sparse or missing for optional fields, output schemas are undocumented, and error handling is absent. No tool annotations (readOnlyHint/destructiveHint). Composition is sound, tools chain well (list_recipes → get_recipe, list_grocery_lists → list_grocery_items). Security concern: credentials injected via environment but no audit logging visible.
Add a grocery item to a specific list. Requires list_uid. If ingredient is not provided, it defaults to name.lower().
Get meal plan entries for a specific date (YYYY-MM-DD). Returns meals scheduled on the given date with an added meal_type_name field.
Get full details for a specific recipe by its UID. Returns the complete recipe object including name, ingredients, directions, notes, nutrition, timing, rating, categories, source, and metadata.
Get sync status counters for all Paprika resource types. Returns change counters (not total counts) that increment on each modification. Useful for detecting which resource types have changed since the last sync.
List all recipe categories. Returns category uid, name, order_flag, and parent_uid (for nested categories). Recipe objects reference categories by name, not UID.
Output schemas undocumented. Tools return dicts/lists but LLM cannot infer field structure. E.g., get_recipe returns 'complete recipe object' but fields are not enumerated. Forces LLM to guess at response shape.
Optional parameters lack descriptions. E.g., list_meal_plans has start_date/end_date with type but no guidance on format validation, timezone handling, or behavior when both are omitted. add_grocery_item has 7 optional params with minimal guidance.
No error handling or recovery guidance. Tools return raw dicts on success but no documented error cases, status codes, or actionable error messages. E.g., get_recipe(uid) with invalid UID returns nothing, LLM cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
List grocery items for a specific grocery list. Returns items with name, quantity, ingredient, aisle, purchased status, recipe reference, and list membership.
List all grocery lists. Returns each list's uid, name, order_flag, is_default, and reminders_list fields. Use the uid from this response to filter grocery items by list.
List meal plan entries, optionally filtered by date range. Returns meal entries with name, date, meal type, and optional recipe reference. Each entry includes a human-readable meal_type_name field in addition to the numeric type field (0=Breakfast, 1=Lunch, 2=Dinner, 3=Snack).
List all recipes as lightweight {uid, hash} pairs. Returns only uid and hash for each recipe — not full recipe data. Use get_recipe(uid) to fetch complete details for a specific recipe. The hash field can be used to detect changes without re-fetching unchanged recipes.
No tool annotations. add_grocery_item is destructive (WRITE risk) but lacks destructiveHint. All read-only tools lack readOnlyHint. Agents cannot infer safety/idempotency without annotations.
Date parameter format not validated. list_meal_plans accepts start_date/end_date as strings but no regex pattern or format constraint. Code uses date.fromisoformat() which silently skips malformed dates. LLM may pass invalid formats.