MCP server for interacting with Cookidoo platform to authenticate, retrieve recipe details, generate recipe structures, and upload custom recipes
Server has 4 tools with visible definitions, descriptions, and input schemas. Naming follows verb_noun convention (connect_to, get_, generate_, upload_). However, significant gaps exist: (1) No output schemas documented for any tool, responses are strings, not structured objects, violating pattern:response-shaper; (2) Stateful design using module-level globals (_cookidoo_service, _cookidoo_api) violates statelessness principle and creates multi-request coupling; (3) Descriptions are adequate (100-250 chars) but lack WHEN/WHY guidance; (4) Parameters mostly have descriptions and types, but some lack constraints (recipe_id format, time ranges for prep_time/total_time); (5) Error handling returns text messages without actionable recovery steps or categorization; (6) No permission checks, rate limits, or audit logging; (7) No idempotency markers or confirmation patterns for destructive operations (upload_custom_recipe). Per-tool average: 58 (connect_to_cookidoo: 60, get_recipe_details: 55, generate_recipe_structure: 62, upload_custom_recipe: 53).
Authenticate with Cookidoo and store the session. This tool must be called before using other Cookidoo tools. It will: 1. Load your Cookidoo credentials from the .env file 2. Authenticate with the Cookidoo platform 3. Store the authenticated session for use by other tools
Generate and validate a recipe structure ready for upload to Cookidoo. This tool helps you structure your recipe data properly before uploading. It validates all fields and returns a JSON structure that can be used with the upload_custom_recipe tool.
Get detailed information about a specific recipe by its ID. Use this tool to get full details about a recipe for inspiration before creating your own custom recipe. You must be connected first using connect_to_cookidoo.
Upload a custom recipe to your Cookidoo account. This tool creates a brand new recipe from scratch on your Cookidoo account. Use 'generate_recipe_structure' first to validate your recipe data, then pass the resulting JSON to this tool.
No output schemas documented. All tools return plain strings instead of structured objects. LLMs cannot parse fields or extract values for downstream calls.
Stateful design using module-level globals (_cookidoo_service, _cookidoo_api). MCP protocol is stateless; each request must be self-contained. State persists across calls, creating tight coupling and preventing concurrent request handling.
Parameter constraints missing or under-specified. recipe_id accepts any string (should specify format like 'r[0-9]{5,6}'). prep_time and total_time lack min/max bounds; servings range stated in description but not enforced in schema.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 48 | - | v1 |
Error handling returns generic text messages without actionable recovery guidance. 'Failed to get recipe details: [error]' tells LLM nothing. Should categorize errors (retryable, user-fixable, fatal) and provide next steps.
No confirmation or dry-run support for write operations. upload_custom_recipe is destructive (creates recipe on account) but requires no confirmation. Agents make mistakes, pattern:confirmation-request not implemented.
No security declarations. Tools accept credentials via .env (good) but do not declare permissions/scopes (read:recipes, write:recipes). No audit logging. Missing pattern:scope-declaration.
Descriptions lack WHEN/WHY context. 'Get detailed information about a specific recipe' doesn't explain: When should LLM call this vs generate_recipe_structure? What should it do with the results? Dependencies and use-case ordering missing.