Fitatu MCP Unofficial
This server provides an unofficial Model Context Protocol (MCP) interface to your Fitatu account, enabling read and write operations on your personal nutrition data.
Profile & Settings: View your user profile, retrieve date-resolved energy/water settings, and update energy targets or water serving size.
Body Measurements: Get latest or date-specific measurements (weight, circumferences, body fat) and partially update them for a specific date.
Day Plan & Nutrition: Fetch meals and items for a date, and get nutrition/energy summaries over a date range.
Food Search: Search Fitatu's user and public food catalogs by text or barcodes, returning product/recipe IDs and measures for mutations.
Meal Item Mutations: Add, update, replace, move, or remove meal items (products, recipes, or custom items) with confirmation of persistence.
Recipe Management: Create, inspect, search, update, and soft-delete recipes, including ingredient lists, steps, tags, and per-serving measures.
Transports: Run over stdio or Streamable HTTP, with optional Docker and ngrok remote access.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Fitatu MCP Unofficialshow me today's meal plan"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.

Fitatu MCP Unofficial
Unofficial Model Context Protocol (MCP) server for accessing and updating data in your own Fitatu account. It provides typed tools for profile data, meal plans, nutrition summaries, food search, and recipe management over stdio or Streamable HTTP.
This project is not affiliated with, endorsed by, or sponsored by Fitatu. Use it only with your own account and treat Fitatu credentials and account data as sensitive.
Features
Profile, day-plan, and nutrition summary queries.
Latest or date-specific body measurement lookup and partial updates for explicit calendar dates.
Food and recipe search with identifiers required by mutation tools.
Meal item creation, update, replacement, movement, and removal.
Recipe creation, inspection, update, and deletion.
MCP transports for local stdio and Streamable HTTP clients.
Local development and Docker workflows.
Related MCP server: fitatu-wrapper
Requirements
Node.js
>=22.18.0npm
A Fitatu account
Docker and ngrok are optional and required only for their respective workflows.
Quick start
Install dependencies and create the local configuration file:
npm install
cp .env.example .envSet FITATU_EMAIL and FITATU_PASSWORD in .env, then start the development server:
npm run devThe default MCP endpoint is http://localhost:3000/mcp.
MCP client configuration
Choose one transport with MCP_TRANSPORT:
Transport | Best for | Process model |
| A local client that launches its own MCP server | One server process per client |
| A persistent server shared by one or more clients | Long-running server on |
stdio
Build the server before configuring the client:
npm run buildUse absolute paths to the repository's .env and dist/index.js files:
{
"mcpServers": {
"fitatu": {
"command": "node",
"args": [
"--env-file=/absolute/path/to/fitatu-mcp-unofficial/.env",
"/absolute/path/to/fitatu-mcp-unofficial/dist/index.js"
],
"env": {
"MCP_TRANSPORT": "stdio"
}
}
}
}The client starts and stops the server. In stdio mode, logs are written to stderr because stdout is reserved for the JSON-RPC stream.
Streamable HTTP
Start the server with npm run dev, or build and run it with:
npm run build
npm startClients with native Streamable HTTP support can connect directly to:
http://localhost:3000/mcpFor a client that launches remote MCP connections through a command, use mcp-remote:
{
"mcpServers": {
"fitatu": {
"command": "npx",
"args": ["mcp-remote", "http://localhost:3000/mcp"]
}
}
}To inspect the local server interactively:
npm run inspectorConnect the Inspector to http://localhost:3000/mcp.
Remote MCP access with ngrok
Install and authenticate ngrok. In .env, configure two different Fitatu accounts using FITATU_* and
FITATU_INTEGRATION_*, then add your assigned domain:
NGROK_DOMAIN=your-assigned-domain.ngrok-free.devnpm run dev:all # Both accounts and the tunnel
npm run dev:test-account # Test account only (alternative)In any MCP client that supports remote Streamable HTTP connections, use one of these URLs without authentication:
Personal:
https://YOUR_NGROK_DOMAIN/personal/mcpTest:
https://YOUR_NGROK_DOMAIN/test/mcp
Available tools
Tool | Purpose |
| Return a safe subset of the authenticated user profile. |
| Return the latest body measurement, or the complete entry for an optional |
| Partially update body measurements for a |
| Return date-resolved energy, calculated, and water settings with requested and effective dates; date defaults to today in the Fitatu timezone. |
| Set a manual or automatic energy target, update the water serving size, or apply both changes together. |
| Return meals and food items for a |
| Summarize nutrition and energy for an inclusive date range. |
| Search Fitatu food catalogs and return mutation-ready identifiers. |
| Search the public food catalog for up to 10 barcodes in parallel. |
| Add products, recipes, or custom items to a meal. |
| Update quantity, measure, or eaten state. |
| Replace one exact meal entry. |
| Move an item to another meal, date, or both. |
| Atomically remove selected day-plan entries by UUID. |
| Search private recipes, public recipes, or both catalogs. |
| Return canonical per-serving recipe details. |
| Create a private recipe from product and measure identifiers. |
| Partially update an owned, editable recipe. |
| Soft-delete a recipe after exact-name confirmation. |
Configuration
Runtime configuration is read from environment variables and validated at startup.
Variable | Required | Default | Description |
| Yes | — | Fitatu account email address. |
| Yes | — | Fitatu account password. |
| For integration tests and tunnel commands | — | Email address of a dedicated Fitatu test account. |
| For integration tests and tunnel commands | — | Password for the dedicated Fitatu test account. |
| No |
| MCP transport: |
| No |
| HTTP port; unused in stdio mode. |
| No |
| HTTP bind address; unused in stdio mode. The tunnel launcher forces loopback. |
| No |
|
|
| No |
| Name reported by the MCP server. |
| No |
| Version reported by the MCP server. |
| No |
|
|
| No |
| Fitatu mobile runtime user agent. |
| No |
| Fitatu mobile application version. |
| No |
| Fitatu mobile build identifier. |
Do not commit .env. The mobile client profile defaults match Fitatu 4.14.4 traffic captured on 2026-07-30 and can be overridden without changing code.
Docker
The current image build requires a configured .env file:
cp .env.example .env
docker build -t fitatu-mcp .
docker run --name fitatu-mcp -p 3000:3000 fitatu-mcpThe Dockerfile copies .env into the image. Treat the resulting image as sensitive; do not publish or share it.
Development
Task | Command |
Development server |
|
Both accounts with ngrok |
|
Test account with ngrok |
|
Production build |
|
Start built server |
|
Type checking |
|
Lint |
|
Formatting check |
|
Unit tests with coverage |
|
Local coverage report |
|
Integration tests |
|
npm run test:ci is deterministic and does not load Fitatu credentials. Integration tests use the dedicated Fitatu test account described above and may
mutate its meal-plan, recipe, and body-measurement data.
See ARCHITECTURE.md for layer boundaries and design rules, and CONTRIBUTING.md for contribution guidelines.
License
Licensed under the MIT License.
Available Tools
19 toolsadd_meal_itemsAdd Fitatu Meal ItemsA
Validates, submits, and confirms products, recipes, or fallback one-off custom items in a Fitatu meal. Prefer a catalog product or recipe: search with search_food or search_recipes first, then provide productId and measureId for a product or raw recipeId and measureId for a recipe. Custom items are not preferred; use name and nutrition values only when no suitable catalog match exists. The id field selects the variant. Deleted recipes and mismatched measures are rejected before synchronization. Returns { status: 'confirmed', date, mealKey, addedItems: [{ inputIndex, itemId }] }; each itemId is persisted and ready for later meal-item mutations.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Target day in YYYY-MM-DD format where the meal items should be added. | |
| items | Yes | One or more strict variants. Prefer {productId, measureId, ...} or {recipeId, measureId, ...} selected through search_food or search_recipes. The {name, energyKcal, ...} custom variant is a fallback only when no suitable product or recipe exists. | |
| mealKey | Yes | Fitatu meal key to add items into. Use mealKey values returned by get_day_plan_items. Typical keys are breakfast, second_breakfast, lunch, snack, supper, but accounts with renamed or additional meals may use other keys such as dinner. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | Day where the new meal items were confirmed. |
| status | Yes | The requested mutation was observed in the persisted Fitatu day plan. |
| mealKey | Yes | Meal containing the confirmed new items. |
| addedItems | Yes | Confirmed new items in input order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnly=false, openWorld=true, idempotent=false, and destructive=false, so the description carries the behavioral burden. It adds meaningful detail: validation happens before synchronization, rejected inputs are called out, results include a confirmed status, and returned itemIds are persisted and ready for later meal-item mutations. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then gives usage priorities, rejection behavior, and the result shape. It is longer than minimal but each sentence earns its place, except for the vague 'id field selects the variant' sentence, which adds little clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the three-way variant complexityholo, the description is complete: it explains how to choose among product, recipe, and custom variants, what identifiers to provide, what validation risks exist, and what the caller can expect in the response. Combined with the fully documented schema, an agent has enough to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter. The description still adds value beyond the schema by explaining preference ordering, specifying raw recipeId, and noting that custom items should only be used when no catalog match exists. The phrase 'The id field selects the variant' is slightly vague and does not map cleanly to a named schema property, which keeps this from a perfect score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-plus-resource statement: it validates, submits, and confirms products, recipes, or custom items in a Fitatu meal. It clearly distinguishes the three item variants and differentiates this tool from the surrounding meal-mutation siblings by emphasizing that it adds new items rather than updating, replacing, or removing them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage direction: search_food or search_recipes should be used first, catalog products or recipes are preferred, and custom items are a fallback only when no suitable match exists. It also explains preconditions such as using raw recipeId and measureId and warns that deleted recipes and mismatched measures are rejected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_recipeCreate Fitatu RecipeA
Creates and confirms a Fitatu recipe from validated products selected with search_food. A non-empty name, at least one ingredient, and a positive whole number of servings are required. Pass preparation instructions as steps with one step per array item so Fitatu displays separate step fields. Ingredient quantities must be positive finite numbers. For custom tags use RECIPE_TAG_USERS_TYPE. Recipes are private unless shared=true. Returns { status, recipeId, details, warnings }; details.measures contains measureId values accepted by add_meal_items, recipeId is canonical, and repeating the same request creates another recipe.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Non-empty recipe name after trimming. | |
| tags | No | Complete list of system or custom recipe tags. Omit to create the recipe without tags. | |
| steps | No | Ordered preparation steps without numeric prefixes. Put exactly one step in each string; Fitatu displays every array item as a separate step field. Omit or use [] when no instructions are available. | |
| shared | No | Whether the recipe may be visible in Fitatu's public catalog. Defaults to false (private). | |
| servings | Yes | Positive integer number of portions produced by the recipe. | |
| mealSchema | No | Fitatu meal keys for which the recipe is suggested: breakfast, second_breakfast, lunch, snack, supper. Omit for no suggestions. Use only this declared enum; raw public catalog values returned by get_recipe may not be valid mutation inputs. | |
| ingredients | Yes | Products included in the recipe. Provide at least one validated product/measure selection. | |
| cookingTimeMinutes | No | Non-negative whole cooking time in minutes. Omit or use null when unknown. | |
| preparationTimeMinutes | No | Non-negative whole preparation time in minutes. Omit or use null when unknown. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Fitatu accepted the write and the service confirmed its observable effect. |
| details | Yes | Canonical recipe details returned by a read-after-write request. |
| recipeId | Yes | Canonical id for subsequent operations. This is always identical to details.recipeId. |
| warnings | Yes | Non-fatal write warnings; currently empty for validated recipe creation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false, and the description amplifies these by explicitly stating 'repeating the same request creates another recipe'. It also discloses the privacy default ('private unless shared=true') and the return contract (status, recipeId, details, warnings) with a pointer to add_meal_items. This is rich behavioral context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is seven sentences, which is on the longer side, but every sentence earns its place: purpose, required fields, step formatting, numeric validation, tag guidance, privacy default, and return behavior. The main purpose is front-loaded, and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter creation tool, the description is remarkably complete. It covers prerequisites, validation rules, preparation steps semantics, tag handling, visibility default, return structure, downstream compatibility, and non-idempotency. The output schema exists, so the return-value details do not need full enumeration, but the description still provides the critical integration points.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining the 'why' behind step arrays ('one step per array item so Fitatu displays separate step fields'), reinforcing numeric constraints ('positive finite numbers'), and directing custom tags to RECIPE_TAG_USERS_TYPE. These clarifications exceed what the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Creates and confirms a Fitatu recipe') and immediately names the source of validated products ('selected with search_food'). This distinguishes it from siblings like update_recipe, get_recipe, and delete_recipe without needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states clear prerequisites: products must be validated via search_food, required fields (name, ingredients, servings), and downstream integration ('measureId values accepted by add_meal_items'). It does not explicitly say 'use update_recipe to modify an existing recipe', but the creation context and non-idempotency warning make the intended use unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_recipeDelete Fitatu RecipeADestructive
Soft-deletes and confirms deletion of an owned active recipe definition identified by a raw recipeId after exact-name confirmation. It disappears from recipe searches, but existing day-plan entries remain historical snapshots and must be removed separately with remove_meal_items mealKey and itemId targets. Returns { status, recipeId, name, deleted }.
| Name | Required | Description | Default |
|---|---|---|---|
| recipeId | Yes | Raw Fitatu recipe id returned by a recipe-aware MCP tool. | |
| expectedName | Yes | Exact, case-sensitive current recipe name used as a destructive-action confirmation. Obtain it from get_recipe and do not trim or normalize it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Exact name of the recipe that was deleted. |
| status | Yes | Fitatu accepted the write and the service confirmed its observable effect. |
| deleted | Yes | Confirmation that the recipe is observably deleted in Fitatu. |
| recipeId | Yes | Canonical id of the recipe that was deleted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' destructiveHint, the description adds crucial behavioral nuance: the deletion is soft, the recipe disappears from searches, existing day-plan entries remain as historical snapshots, and the operation requires exact-name confirmation. It also states the return shape. This exceeds what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and information-rich without filler. Each sentence covers a distinct need: what is deleted, what persists, how to remove the remaining artifacts, and what the response contains.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's destructiveness and confirmation requirement, the description fully covers behavior, parameter sourcing, side effects, and return value. The output schema and sibling context complement it, so an agent has everything needed to invoke it safely and correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema: recipeId must be a raw id from a recipe-aware MCP tool, and expectedName is an untrimmed, case-sensitive confirmation value obtained from get_recipe. This reinforces and extends the schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('soft-deletes') and a precise resource ('owned active recipe definition identified by a raw recipeId after exact-name confirmation'). It clearly distinguishes this deletion from removing meal-plan entries, which is handled by remove_meal_items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when the tool applies (owned active recipes with exact-name confirmation) and explicitly tells the agent that day-plan entries are not removed and must be handled separately via remove_meal_items. This prevents a common misuse without ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_body_measurementGet Fitatu Body MeasurementARead-onlyIdempotent
Gets the authenticated Fitatu user's body measurement for an optional calendar date. When date is omitted, returns the most recent measurement across weight, circumference, and body-fat history.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Optional measurement date in YYYY-MM-DD format; defaults to the latest available entry. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | No | Resolved measurement date in YYYY-MM-DD format. Omitted only when the latest measurement was requested and no history exists. |
| found | Yes | Whether Fitatu has a body measurement entry for the requested or latest date. |
| measurement | No | Complete body measurement when found is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations by explaining the date-omission fallback and the scope across weight, circumference, and body-fat history.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary operation and resource are front-loaded, and the second sentence clarifies the optional-date behavior. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one optional parameter, a complete schema, rich annotations, and an output schema. The description covers the only meaningful behavioral nuance (default date selection). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the only parameter, date, is already described with format and optionality. The description adds the defaulting behavior ('defaults to the latest available entry') but does not need to explain the parameter further, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Gets'), the resource ('the authenticated Fitatu user's body measurement'), and the optional date scope. It avoids tautology by adding the default behavior, and the read/write distinction from save_body_measurement is evident from the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to call the tool: retrieving a body measurement for an optional date, with the latest measurement returned when date is omitted. It does not explicitly name sibling alternatives or state when not to use it, but the read-only verb and the write-focused sibling save_body_measurement make the intended use reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_userGet Current Fitatu UserARead-onlyIdempotent
Fetches the currently authenticated Fitatu user profile.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| user | Yes | Safe subset of the authenticated Fitatu user profile. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, covering safety and side-effect behavior. The description adds the 'authenticated' qualifier, which clarifies that the tool operates on the user in the current session – a meaningful contextual detail. However, it does not disclose error behavior (e.g., if no user is authenticated) or any rate-limit considerations, but given the annotation coverage, a 3 is justified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence with no redundant words. It front-loads the verb and resource immediately, conveying the core action without fluff. Every word contributes to the meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description, combined with the output schema (which is present) and annotations (readOnly, idempotent, openWorld), fully covers what an agent needs to know to invoke it correctly. There is no missing information about parameters, return values (handled by output schema), or side effects (handled by annotations).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema provides no parameter details. According to the rubric, a baseline of 4 is appropriate for 0-parameter tools. The description adds nothing about parameters because none exist, and no further semantics are required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('fetches'), a clear resource ('currently authenticated Fitatu user'), and a result ('profile'). It distinguishes from all sibling tools, which handle meal items, recipes, body measurements, and settings – none of which are about retrieving the current user. This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly indicates the tool is for retrieving the current user's profile, which is distinct from other tools like get_user_settings or get_diet_summary. It does not explicitly name alternatives or state when not to use it, but the purpose is so unambiguous that an agent would naturally select it for that action. A slight deduction for not explicitly mentioning exclusions, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_day_plan_itemsGet Fitatu Day Plan ItemsARead-onlyIdempotent
Fetches Fitatu meals and concrete day-plan entries. Copy the exact mealKey with itemId to update_meal_item, move_meal_item, or remove_meal_items; productId and raw recipeId identify food definitions, not removable entries. Defaults to today's local date.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Day to fetch in YYYY-MM-DD format. Defaults to today's local date when omitted. | |
| withRating | No | Whether to ask Fitatu for rating-related day plan data when supported. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | YYYY-MM-DD date of the returned day plan. |
| meals | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, idempotentHint, and openWorldHint, lowering the bar. The description still adds value beyond annotations by revealing the default local-date behavior and by clarifying how returned identifiers map to fixable/removable entries versus food definitions. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first defines purpose, the second gives actionable ID-handling guidance for sibling tools, and the third states the default date. The most important scoping information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only, optional-parameter fetch with a rich output schema, this definition is highly complete. Annotations cover safety and open-world behavior, the schema documents both parameters, and the description supplies the critical cross-tool usage guidance. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description only repeats the date default already stated in the schema and adds nothing about withRating. It doesn't harm, but it doesn't enhance parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Fetches Fitatu meals and concrete day-plan entries." It clearly differentiates this retrieval tool from the mutation siblings (add_meal_items, update_meal_item, remove_meal_items, etc.) by explaining what the returned IDs mean and which ones should be passed to those mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear downstream context: it tells the agent to copy mealKey with itemId into update/move/remove tools and warns that productId/raw recipeId are not removable entries. It also explains the default-date behavior. It does not explicitly state when not to use this tool or name alternative fetch tools, so it misses the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_diet_summaryGet Fitatu Diet SummaryARead-onlyIdempotent
Fetches the authenticated Fitatu user's nutrition and energy summary for an inclusive date range.
| Name | Required | Description | Default |
|---|---|---|---|
| toDate | Yes | Inclusive range end date in YYYY-MM-DD format. | |
| fromDate | Yes | Inclusive range start date in YYYY-MM-DD format. |
Output Schema
| Name | Required | Description |
|---|---|---|
| energy | Yes | Energy totals and daily values from the energy summary endpoint. |
| period | Yes | Date range covered by this summary. |
| allNutrients | Yes | All nutrients returned by Fitatu, normalized into a scannable list. |
| keyNutrients | Yes | High-signal nutrients selected for quick agent interpretation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and open-world behavior. The description adds the authenticated-user scope and clarifies that the date range is inclusive, which is useful context. It does not add auth requirements, rate limits, or other behavioral details, but the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single 15-word sentence that front-loads the verb and resource and includes the key scope (authenticated user, inclusive date range). There is no fluff, repetition of the title, or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, two-parameter fetch with an output schema and safety annotations, the description plus schema fully specify how to call it. User scope and date inclusivity are stated, and the output schema covers return values, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both fromDate and toDate have format and meaning descriptions, and the schema-level description states the fromDate <= toDate ordering constraint. The tool description adds no parameter-specific detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetches') and a specific resource ('authenticated Fitatu user's nutrition and energy summary'), plus the inclusive date-range scope. This clearly distinguishes it from sibling getters like get_day_plan_items or get_body_measurement without requiring a schema read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case: retrieve a nutrition/energy summary for a date range. However, it never explicitly states when to use this tool vs. alternatives or mentions any exclusions, leaving the routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recipeGet Fitatu RecipeARead-onlyIdempotent
Gets canonical per-serving details and add_meal_items measures for a raw recipeId returned by a recipe-aware MCP tool. Soft-deleted recipes remain readable with deleted=true and editable=false. Raw productId and recipeId spaces may overlap, so the recipeId field determines how the supplied value is interpreted. Returns canonical recipe details { recipeId, name, servings, shared, editable, deleted, mealSchema, tags, ingredients, nutritionPerServing, measures, ...optionalFields }.
| Name | Required | Description | Default |
|---|---|---|---|
| recipeId | Yes | Raw Fitatu recipe id returned by a recipe-aware MCP tool. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Recipe display name. |
| tags | Yes | Complete tag list; an empty array means the recipe has no tags. |
| steps | Yes | Ordered preparation steps parsed from Fitatu's newline-delimited recipe description; an empty array means no instructions are available. |
| shared | Yes | Whether Fitatu marks the recipe as shared with its public catalog. |
| userId | No | Owning Fitatu user id, when the upstream response exposes it. |
| deleted | Yes | Whether Fitatu reports that the recipe has been deleted. |
| editable | Yes | True only when this recipe is active and the authenticated user may currently update or delete it. Deleted and unowned recipes are false. |
| measures | Yes | Measures accepted for this recipe by add_meal_items. Copy recipeId with one listed measureId; an empty array means Fitatu returned no usable measures. |
| recipeId | Yes | Canonical raw Fitatu recipe id for subsequent MCP operations. |
| servings | Yes | Positive integer number of servings produced by the recipe. |
| mealSchema | Yes | Raw Fitatu meal keys stored with the recipe. Public catalog values such as dinner are preserved and are not the accepted input enum for recipe mutations. |
| ingredients | Yes | Canonical ingredient list; an empty array means Fitatu returned no usable ingredients. |
| weightPerServingG | No | Calculated weight of one recipe serving in grams, when Fitatu provides it. |
| cookingTimeMinutes | No | Cooking time in whole minutes; omitted when unavailable. |
| nutritionPerServing | No | Nutrition calculated for one serving, omitted when Fitatu provides no nutrient values. |
| preparationTimeMinutes | No | Preparation time in whole minutes; omitted when unavailable. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds substantial behavioral context beyond that: soft-deleted recipes remain readable with deleted=true and editable=false, and overlapping productId/recipeId spaces are resolved by the recipeId field. These details inform the agent about edge-case behavior and result interpretation, going well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: the main purpose is front-loaded, followed by key edge-case behaviors, and finally the return structure. Every sentence adds necessary information—no filler. The length is justified by the technical complexity (ID-space overlap, soft-delete handling) and is still concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single parameter, a full input schema description, and an output schema (indicated by the return structure), the description covers all essential aspects: what it does, when to use it, input constraints, edge cases, and the shape of the result. It does not need to restate return values since an output schema exists. Nothing critical for an agent to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes recipeId as 'Raw Fitatu recipe id returned by a recipe-aware MCP tool,' giving 100% coverage. The description adds further semantic value by explaining that 'Raw productId and recipeId spaces may overlap, so the recipeId field determines how the supplied value is interpreted.' This clarifies ambiguity that the schema alone does not address, making the parameter semantics richer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Gets canonical per-serving details and add_meal_items measures for a raw recipeId.' It further narrows the input to IDs 'returned by a recipe-aware MCP tool,' distinguishing this read tool from siblings like search_recipes (query-based) and create/update/delete mutations. The term 'canonical' reinforces its role as the authoritative recipe detail fetcher.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the input is a raw recipeId from a recipe-aware MCP tool, which tells an agent when to use it (when it already holds such an ID). It also notes soft-deleted recipes remain readable with deleted=true and editable=false, providing context about behavior in that edge case. However, it does not explicitly name alternative tools or give a 'when not to use' clause, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_settingsGet Fitatu User SettingsARead-onlyIdempotent
Gets the authenticated Fitatu user's date-resolved energy, calculated, and water settings. When date is omitted, today is resolved in the user's Fitatu timezone.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Optional settings date in YYYY-MM-DD format; defaults to today in Fitatu. |
Output Schema
| Name | Required | Description |
|---|---|---|
| settings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds meaningful behavioral context beyond annotations: date resolution defaults to today in the user's Fitatu timezone, which is a non-obvious behavior an agent needs to know. This is valuable added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler. The core action is front-loaded, and the optional-date behavior is stated succinctly. Every sentence earns its place; nothing is redundant or verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter and an output schema (which covers return values), the description is complete. It explains the primary function and the date-resolution behavior, and the annotations cover safety and idempotency. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the date parameter is fully documented in the schema, including its format and default behavior. The description repeats this information without adding new meaning, so it does not compensate beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('gets'), the resource ('the authenticated Fitatu user's ... settings'), and the specific settings types (energy, calculated, water). It distinguishes itself from siblings like update_user_settings (a setter) and get_current_user (user profile, not settings) without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage as the read operation for user settings, but it does not explicitly contrast it with alternatives or state when not to use it. The date-resolution behavior is described, but no explicit when-to-use vs. other tools guidance is provided; the guidance is mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_meal_itemMove Fitatu Meal ItemA
Moves and confirms one existing Fitatu meal item selected by its exact source date, mealKey, and itemId. Provide a destination date, mealKey, or both that differs from the source. Fitatu creates a new item id during a valid move. Returns { status: 'confirmed', fromDate, fromMealKey, previousItemId, toDate, toMealKey, itemId }; use the returned itemId for later mutations.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | Meal item id to move. Use itemId returned by get_day_plan_items. | |
| toDate | No | Destination day in YYYY-MM-DD format. Omit when moving only to a different meal on the same date. | |
| fromDate | Yes | Current day containing the item to move, in YYYY-MM-DD format. | |
| toMealKey | No | Destination meal key. Omit only when moving to the same meal on a different date. Do not omit both toDate and toMealKey. | |
| fromMealKey | Yes | Current meal key containing the item. Use mealKey values returned by get_day_plan_items. Typical keys are breakfast, second_breakfast, lunch, snack, supper, but accounts with renamed or additional meals may use other keys such as dinner. |
Output Schema
| Name | Required | Description |
|---|---|---|
| itemId | Yes | Persisted meal item id to use in later update, move, replace, or remove operations. |
| status | Yes | The requested mutation was observed in the persisted Fitatu day plan. |
| toDate | Yes | Current day of the moved item. |
| fromDate | Yes | Previous day of the moved item. |
| toMealKey | Yes | Current meal key of the moved item. |
| fromMealKey | Yes | Previous meal key of the moved item. |
| previousItemId | Yes | Previous item id confirmed absent from the source meal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the critical side effect that Fitatu creates a new item id during a valid move — information absent from the annotations, which only carry readOnlyHint/idempotentHint/destructiveHint. It then instructs the agent to 'use the returned itemId for later mutations,' preventing a likely follow-up error of reusing the stale id. Including the exact return shape reinforces confirmation behavior beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with the verb+resource action front-loaded, followed by the constraint, side-effect warning, and follow-up guidance — each sentence earns its place. There is no filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation with a non-obvious side effect, the description covers selection criteria, destination constraints, item-id recreation, return shape, and post-call usage. The annotations and output schema cover the safety profile and return structure, so nothing essential an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters; baseline is 3. The description adds cross-parameter coordination by tying together the source triad (fromDate, fromMealKey, itemId) and the at-least-one-destination constraint, but this largely mirrors the schema's own description. No new per-parameter facts are introduced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Moves and confirms') with a resource ('Fitatu meal item') and exact selection criteria (source date, mealKey, itemId). The verb 'moves' clearly distinguishes it from sibling meal-item tools like update_meal_item, replace_meal_item, and remove_meal_items, which perform different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Sets clear preconditions: 'Provide a destination date, mealKey, or both that differs from the source,' which tells the agent exactly what inputs satisfy a valid move. It does not explicitly name alternatives or state when not to use this tool, so an agent must infer the choice against update/replace/remove siblings from the verb and operation semantics alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_meal_itemsRemove Fitatu Meal ItemsADestructive
Atomically removes and confirms exact Fitatu day-plan entries of any food type. Copy each mealKey and itemId pair from get_day_plan_items; do not pass productId or recipeId. If any requested active item is missing from its declared meal context, nothing is synchronized. Returns { status: 'confirmed', date, removedItems: [{ inputIndex, mealKey, itemId }] } after every selected item is absent from the persisted active day plan.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Day containing the exact meal items to remove. | |
| items | Yes | Unique mealKey and itemId pairs copied from get_day_plan_items. Each identifies one exact PRODUCT, RECIPE, or CUSTOM_ITEM entry; productId and recipeId are not accepted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | Day from which the meal items were removed. |
| status | Yes | The requested mutation was observed in the persisted Fitatu day plan. |
| removedItems | Yes | Items confirmed absent from the day plan. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include destructiveHint=true, readOnlyHint=false, and idempotentHint=false. The description adds meaningful behavioral detail: atomicity ('Atomically removes'), failure semantics ('If any requested active item is missing... nothing is synchronized'), and a defined success condition ('Returns { status: 'confirmed' ... } after every selected item is absent'). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The core action is front-loaded, followed by input sourcing instructions, then atomic behavior and return shape. Every sentence carries essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive operation with annotations and an output schema, the description is complete: it covers what the tool does, where to obtain the required IDs, what not to pass, atomic rollback behavior, and the confirmed return payload. The output schema handles return structure; no critical calling information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions already explain date, items, the source of mealKey/itemId pairs, and the rejection of productId/recipeId. The description restates those points but adds little new parameter meaning beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb and resource: 'Atomically removes and confirms exact Fitatu day-plan entries of any food type.' It clearly distinguishes from siblings (add, update, replace, move) by focusing on removal, and even clarifies the input form ('mealKey and itemId pair').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit operational guidance: 'Copy each mealKey and itemId pair from get_day_plan_items; do not pass productId or recipeId.' This names the source read tool and a negative constraint. It doesn't explicitly contrast with alternative mutation tools like update_meal_item or replace_meal_item, but the action is clear enough that selection is straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_meal_itemReplace Fitatu Meal ItemADestructive
Replaces and confirms one existing Fitatu meal item. Select the existing entry by its exact date, mealKey, and itemId, then provide replacement using the same strict PRODUCT, RECIPE, or fallback CUSTOM_ITEM payload accepted by add_meal_items. If replacement.eaten is omitted, the existing eaten state is preserved. Replacing a PRODUCT or RECIPE with the same catalog definition is rejected; use update_meal_item for quantity, measure, or eaten changes. Returns { status: 'confirmed', date, mealKey, previousItemId, itemId }; use the returned itemId for later mutations. The new item remains in the same meal, but item order is not part of the contract.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Day containing the item to replace, in YYYY-MM-DD format. | |
| itemId | Yes | Existing meal item id. Use itemId returned by get_day_plan_items. | |
| mealKey | Yes | Meal key containing the item. Use mealKey values returned by get_day_plan_items. Typical keys are breakfast, second_breakfast, lunch, snack, supper, but accounts with renamed or additional meals may use other keys such as dinner. | |
| replacement | Yes | New meal item using the same payload as one entry in add_meal_items.items. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | Day containing the confirmed replacement item. |
| itemId | Yes | Persisted meal item id to use in later update, move, replace, or remove operations. |
| status | Yes | The requested mutation was observed in the persisted Fitatu day plan. |
| mealKey | Yes | Meal containing the confirmed replacement item. |
| previousItemId | Yes | Previous item id confirmed absent after replacement. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing key behaviors: replacement is confirmatory, omitted eaten state is preserved, same-catalog replacements are rejected, the exact return shape is provided, and item order is not part of the contract. No contradiction with destructiveHint=true or readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, each carrying essential information: action, identification, eaten semantics, rejection/alternative, return value, and ordering caveat. Front-loaded with the core purpose and free of redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a mutation tool with a nested replacement payload. The description covers identification, payload contract, edge-case rejection, output format, and post-return usage. The schema and output schema provide the remaining structural detail, so nothing an agent needs to invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters and the three replacement variants. The description adds meaningful semantics beyond the schema by stating that replacement uses the same payload contract as add_meal_items, that eaten defaults to preservation, and that the returned itemId should be used for later mutations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Replaces and confirms'), a resource ('one existing Fitatu meal item'), and the selection criteria (date, mealKey, itemId). It clearly distinguishes itself from update_meal_item by noting that same-catalog-definition swaps are rejected and should use update_meal_item instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names an alternative tool and the condition that selects it: 'use update_meal_item for quantity, measure, or eaten changes.' It also instructs how to identify the target entry and which payload variant to prefer (PRODUCT/RECIPE before CUSTOM_ITEM), giving unambiguous when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_body_measurementSave Fitatu Body MeasurementADestructiveIdempotent
Partially updates the authenticated Fitatu user's body measurement for an explicit date. Omitted values remain unchanged, and existing values cannot be cleared with this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| calf | No | Calf circumference in the profile's size unit. | |
| date | Yes | Measurement date in YYYY-MM-DD format. | |
| hips | No | Hip circumference in the profile's size unit. | |
| neck | No | Neck circumference in the profile's size unit. | |
| chest | No | Chest circumference in the profile's size unit. | |
| thigh | No | Thigh circumference in the profile's size unit. | |
| waist | No | Waist circumference in the profile's size unit. | |
| biceps | No | Upper-arm circumference in the profile's size unit. | |
| weight | No | Body weight in the profile's weight unit. | |
| stomach | No | Abdominal circumference in the profile's size unit. | |
| fatPercentage | No | Body fat percentage. |
Output Schema
| Name | Required | Description |
|---|---|---|
| measurement | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful PATCH semantics not present in the annotations: omitted values stay unchanged and existing values cannot be cleared. It also notes the authenticated-user requirement. The destructiveHint=true annotation is not contradicted because overwriting an existing measurement is still a mutation, even though values cannot be nulled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler. The primary verb and scope are front-loaded, and the key exception ('cannot be cleared') is placed at the end without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, full schema, and output schema together cover most of what an agent needs to call this correctly. The only notable gap is whether a measurement record must already exist for the date or whether the call can create one, since 'save' and 'partially updates' leave this slightly ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents every parameter with 100% coverage, but the description adds global parameter behavior: omitted optional values remain unchanged and clearing is impossible. This is important semantic information that cannot be inferred from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Partially updates the authenticated Fitatu user's body measurement for an explicit date.' This clearly distinguishes it from the sibling get_body_measurement and other update tools. It is not a tautology of the name or title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for use: it is for partial updates to a body measurement on a specific date, and omitted values remain unchanged. It also implies a when-not case by stating existing values cannot be cleared, though it does not explicitly name alternatives like get_body_measurement for reading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_foodSearch Fitatu FoodARead-onlyIdempotent
Searches Fitatu catalogs for products and recipes. The server does not infer brand or retailer aliases; provide alternative phrases together in queries when needed. Each query returns separate userItems and publicItems lists in Fitatu's order; the server does not merge or deduplicate candidates across those sources. Set includeDetails=true only when an alternative or missing measure is needed. A candidate has exactly one definition id: productId means use the PRODUCT meal-item variant; raw recipeId means use the RECIPE variant. Copy that id with a listed measureId. Do not send foodType.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date context for Fitatu's authenticated user search. Defaults to today's local date. | |
| limit | No | Maximum candidates per query per source. Defaults to 5. | |
| locale | No | Fitatu search locale. Defaults to pl_PL. | pl_PL |
| queries | Yes | One or more independent food search phrases. When a description is ambiguous or may use a retailer, producer, or private-label name, submit plausible query variants together in one call. Results remain grouped by input query. | |
| detailsLimit | No | Total number of top candidates per query to enrich with product or recipe details and measures across both source lists. User candidates consume the quota first. Use 0 to skip details. | |
| includeDetails | No | Whether to fetch additional product or recipe information and available measures. Leave false when the candidate's default measure is sufficient; enable it when the default measure is missing or an alternative measure is needed. Defaults to false. | |
| includeUserFood | No | Whether to use Fitatu's authenticated user search source. Its exact composition and ordering are determined by Fitatu. | |
| includePublicFood | No | Whether to search Fitatu's public food catalog. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Search results grouped by input query, with separate user and public source lists. |
| warnings | No | Non-fatal warnings produced while searching or fetching details. |
| queryCount | Yes | Number of search queries processed by this call. |
| resultCount | Yes | Total number of returned user and public candidate items across all queries. |
| warningDetails | No | Structured details for non-fatal warnings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and idempotentHint. The description adds crucial behavioral traits: no alias inference, separate userItems/publicItems lists not merged/deduplicated, candidate id semantics (productId vs recipeId), and constraint on foodType. Contradicts nothing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tightly packed sentences, all informative, front-loaded with the core search function and caveats. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all behavioral caveats an agent needs: alias handling, result grouping, id selection, detail toggling, and forbidden fields. Output schema exists for return format; no gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant meaning beyond the schema: explains query variant grouping, details quota consumption order (user first), and candidate id usage. Enriches parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Searches'), resource ('Fitatu catalogs for products and recipes'), and explicitly contrasts with the sibling search_food_by_barcodes (barcode vs. phrase search). Clear differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to use includeDetails (only when alternative/missing measure needed), how to construct queries (provide alternative phrases together), and what not to send ('Do not send foodType'). Includes exclusions and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_food_by_barcodesSearch Fitatu Food by BarcodesARead-onlyIdempotent
Searches Fitatu's public food catalog for up to 10 GTIN barcodes in parallel. Returns one minimal result group per input barcode in input order, including duplicates. Copy a selected productId and measureId to add_meal_items. This tool only searches and never adds food.
| Name | Required | Description | Default |
|---|---|---|---|
| barcodes | Yes | One to ten GTIN-8, UPC-A, EAN-13, or GTIN-14 barcode strings. | |
| detailsLimit | No | Maximum candidates to enrich per barcode. Defaults to 3. | |
| includeDetails | No | Whether to enrich top candidates with product details and available measures. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | One result group for every input barcode, preserving input order and duplicates. |
| warnings | No | Non-fatal warnings produced by barcode searches or enrichment. |
| warningDetails | No | Structured details for non-fatal barcode search warnings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/non-destructive annotations, the description discloses parallel execution, the 10-item cap, one minimal result group per input barcode, input-order preservation, and duplicate handling. This gives an agent accurate expectations about behavior and output shape without contradicting any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences cover scope, return behavior, and workflow, with no filler or repetition. The core action and constraints are front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given rich annotations, full schema coverage, and an output schema, the description supplies the missing behavioral context: parallel lookup, ordering, duplicates, and the handoff to add_meal_items. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all three parameters clearly, so the description adds little per-parameter detail. It usefully explains that results are grouped per barcode, but this is return-shape guidance rather than new parameter semantics; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Searches'), a precise resource ('Fitatu's public food catalog'), and concrete constraints ('up to 10 GTIN barcodes in parallel'). It also deliberately separates this from add_meal_items by stating it 'only searches and never adds food,' making the tool's identity unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly locates the tool in a workflow: search first, then copy productId and measureId into add_meal_items. It explicitly excludes the adding behavior, but it does not name the sibling search_food as the alternative for non-barcode queries, so the guidance is clear though not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_recipesSearch Fitatu RecipesARead-onlyIdempotent
Searches active recipes by a trimmed, case-insensitive name substring and returns raw recipeId values. Set includeDetails=true to include additional recipe information and available measures. These details can be useful when adding a selected recipe to a day plan. Empty or whitespace-only query lists recipes. scope=all combines catalogs and returns partial results with warnings when one catalog or individual recipe details are unavailable. Returns { query, scope, page, limit, count, items, warnings }.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | One-based result page number. Defaults to 1. | |
| limit | No | Maximum recipes returned on this page, from 1 to 50. Defaults to 20. | |
| query | No | Optional case-insensitive substring matched against recipe names. Omit or use an empty string to list recipes. | |
| scope | No | Catalog scope: "mine" searches owned recipes, "public" searches Fitatu, and "all" combines both. Defaults to "mine". | mine |
| includeDetails | No | Whether to include canonical recipe details and available measures. These details can be useful when adding a selected recipe to a day plan. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | One-based page number returned. |
| count | Yes | Number of recipes in items on this page, not the total number of matching recipes. Always equals items.length. |
| items | Yes | Deduplicated recipes on this page. With includeDetails=true, successful detail lookups add canonical fields and measures at the top level. |
| limit | Yes | Maximum number of recipes requested for this page. |
| query | Yes | Normalized search phrase used for the request; empty when listing. |
| scope | Yes | Catalog scope used for this result page. |
| warnings | Yes | Non-fatal source or recipe-detail failures; empty when every requested operation succeeded. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, giving a safety profile. The description adds meaningful behavior beyond that: trimming of query, case-insensitivity, returning raw recipeId values, empty/whitespace query listing all recipes, and the partial-results-with-warnings behavior for scope=all. No contradictions with annotations; the description enhances the behavioral understanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient and front-loaded with the core search behavior, then adds optional flags and edge cases. It covers a lot in a compact text without redundancy. Slightly dense, but each sentence adds information. It doesn't waste words, though it could be split into clearer paragraphs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema clarifying the return structure, the description focuses on behavior. It covers all key edge cases: empty queries, scope combinations, warnings, and the optional details flag. Given the tool's moderate complexity and the presence of a rich schema, the description is complete for an agent to correctly invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds crucial semantics: 'trimmed' for the query, the raw recipeId return, and the warning behavior for scope=all. These details are not present in the schema and directly inform parameter usage. The description also clarifies the purpose of includeDetails in the day-plan context, which is not captured in the schema's parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('searches') and resource ('active recipes'), and defines the matching semantics (trimmed, case-insensitive name substring) and the output (raw recipeId values). This is unambiguous and distinct from sibling tools like search_food or search_food_by_barcodes, which target food items rather than recipes. No confusion about what is being searched.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical guidance: it notes that includeDetails=true provides details useful for adding a recipe to a day plan, and explains the distinction of scope=all (combines catalogs, returns partial results with warnings). While it doesn't explicitly name alternatives like get_recipe or search_food, it provides enough contextual cues for an agent to decide when this tool is appropriate, especially with the sibling list available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_meal_itemUpdate Fitatu Meal ItemA
Updates and confirms one existing Fitatu meal item selected by its exact date, mealKey, and itemId. PRODUCT and RECIPE quantity or measure changes require a measure belonging to that food definition. For CUSTOM_ITEM entries, only the name, calories, protein, fat, carbohydrates, or eaten flag can be updated; their technical measure fields are immutable. Returns { status: 'confirmed', date, mealKey, itemId } after every requested field is observed in the persisted day plan.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Day containing the item to update, in YYYY-MM-DD format. | |
| fatG | No | New non-negative fat total in grams. Accepted only for a CUSTOM_ITEM. | |
| name | No | New non-empty name. Accepted only for an existing CUSTOM_ITEM. | |
| eaten | No | Whether Fitatu should mark the item as eaten. | |
| itemId | Yes | Meal item id to update. Use itemId returned by get_day_plan_items. | |
| mealKey | Yes | Meal key containing the item. Use mealKey values returned by get_day_plan_items. Typical keys are breakfast, second_breakfast, lunch, snack, supper, but accounts with renamed or additional meals may use other keys such as dinner. | |
| proteinG | No | New non-negative protein total in grams. Accepted only for a CUSTOM_ITEM. | |
| measureId | No | New measure id for the item. Use measureId values returned by search_food when changing measures. | |
| energyKcal | No | New non-negative calorie total. Accepted only for an existing CUSTOM_ITEM. | |
| carbohydrateG | No | New non-negative carbohydrate total in grams. Accepted only for a CUSTOM_ITEM. | |
| measureQuantity | No | New positive quantity for the item's current or selected measure. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | Day where the updated meal item was confirmed. |
| itemId | Yes | Persisted meal item id to use in later update, move, replace, or remove operations. |
| status | Yes | The requested mutation was observed in the persisted Fitatu day plan. |
| mealKey | Yes | Meal containing the confirmed updated item. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals key behaviors: PRODUCT/RECIPE measure changes require compatible measures, CUSTOM_ITEM updates are restricted to specific fields with immutable technical measures, and the tool returns a confirmed status only after persistence is observed. These are material behavioral details not visible in the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences each carry essential information: core action and identity, item-type constraints, and return/confirmation behavior. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core behavior, item-type restrictions, measure compatibility, and confirmation semantics, which is substantial for an 11-parameter tool. It could be slightly stronger with an explicit statement of when to choose this over replace_meal_item, but the existing identity-based selection and 'updates' wording largely cover that context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema already documents individual parameters. The description adds cross-parameter and type-specific semantics, such as which fields are valid for CUSTOM_ITEM entries and that PRODUCT/RECIPE quantity/measure changes require a measure belonging to the food definition. This goes beyond the schema's per-property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states a specific verb ('Updates and confirms'), the resource ('one existing Fitatu meal item'), and the exact selection key (date, mealKey, itemId). This clearly differentiates it from sibling operations like add, replace, remove, or move.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when this tool is appropriate: updating an existing meal item with exact identity fields. It does not explicitly name alternatives or exclusion conditions, but the 'existing' and 'exact date, mealKey, itemId' framing implicitly separates it from adding or replacing operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_recipeUpdate Fitatu RecipeADestructive
Partially updates and confirms an owned active recipe identified by a raw recipeId. The same create limits apply. Pass preparation instructions as steps with one step per array item so Fitatu displays separate step fields. Omitted fields, including steps and mealSchema, are preserved; null clears nullable time fields, and [] clears lists. Raw public mealSchema values returned by get_recipe are not necessarily accepted mutation inputs. Tag categories must be RECIPE_TAG_USERS_TYPE or already present on this recipe. Fitatu may replace the identity; always use the returned recipeId. Returns { status, previousRecipeId, recipeId, identityChanged, details, warnings }; details.measures contains measureId values accepted by add_meal_items.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Replacement recipe name. Omit to preserve the current name. | |
| tags | No | Complete replacement tag list. Omit to preserve current tags; use [] to remove all tags. | |
| steps | No | Complete replacement preparation steps without numeric prefixes. Put one step in each string; omit to preserve the current steps and use [] to clear them. | |
| shared | No | Replacement sharing setting. Omit to preserve the current value. | |
| recipeId | Yes | Raw Fitatu recipe id returned by a recipe-aware MCP tool. | |
| servings | No | Replacement positive integer serving count. Omit to preserve the current value. | |
| mealSchema | No | Complete replacement list of suggested Fitatu meal keys using only this declared enum. Omit to preserve the stored value, including raw public catalog values; use [] to remove all suggestions. | |
| ingredients | No | Complete replacement ingredient list. Omit to preserve current ingredients; at least one ingredient is required when provided. | |
| cookingTimeMinutes | No | Replacement cooking time in whole minutes. Omit to preserve; use null to clear. | |
| preparationTimeMinutes | No | Replacement preparation time in whole minutes. Omit to preserve; use null to clear. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Fitatu accepted the write and the service confirmed its observable effect. |
| details | Yes | Canonical details for the updated recipe, read using the resulting recipeId. |
| recipeId | Yes | Canonical id to use after the update. This is always identical to details.recipeId. |
| warnings | Yes | Non-fatal write warnings; currently empty for validated recipe updates. |
| identityChanged | Yes | Whether Fitatu replaced the recipe id: true exactly when recipeId differs from previousRecipeId. |
| previousRecipeId | Yes | Recipe id targeted by the update. It may become obsolete when identityChanged is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds rich behavioral detail beyond annotations: omitted fields are preserved, null clears time fields while [] clears lists, identity may be replaced, and returned details.measures are accepted by add_meal_items. It also warns that raw public mealSchema values from get_recipe may not be valid mutation inputs. This substantially exceeds what destructiveHint/readOnlyHint convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries critical information. It front-loads the core purpose, then covers mutation semantics, identity replacement, tag constraints, and the return contract without redundancy. Length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a partial-update mutating tool with 10 parameters, an output schema, and known sibling tools, the description covers the essential behavioral contract, return shape, and edge cases like identity changes and invalid raw mealSchema values. The provided output schema supplies formal return details, so the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds semantic value by explaining update semantics: null clears, [] clears lists, one step per array item, and tag category constraints. It also clarifies that returned mealSchema values are not necessarily valid inputs. This goes beyond the schema's per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: 'Partially updates and confirms an owned active recipe identified by a raw recipeId.' This clearly distinguishes the tool from siblings like create_recipe, delete_recipe, and get_recipe by identifying both the operation and the target resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong usage context: it applies to owned active recipes, uses a raw recipeId from a recipe-aware tool, and references 'the same create limits' from the create path. It does not explicitly list alternatives or when not to use this tool, but the context is clear enough to guide selection among sibling recipe tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_user_settingsUpdate Fitatu User SettingsADestructiveIdempotent
Partially updates the authenticated Fitatu user's supported settings. Accepts a complete manual energy target, switches energy calculation back to Fitatu automatic mode, changes the water serving size, or combines energy and water in one update. Omitted supported settings and all unsupported settings are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| energyTarget | No | Optional manual or automatic daily energy target update. | |
| waterServingSizeMl | No | Positive whole-number default water serving size in millilitres. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| settings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, destructiveHint=true, and idempotentHint=true. The description adds valuable context: it mentions partial updates, the ability to combine energy and water, and that omitted supported settings and all unsupported settings are preserved. This goes beyond the annotations by clarifying the non-destructive nature to unaffected settings. It does not contradict the annotations; destructiveHint refers to modifying target values, which is consistent with the update behavior described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, each earning its place. The first sentence states the core purpose; the second enumerates capabilities; the third clarifies preservation behavior. It is front-loaded with the main action and avoids redundant details that are already in the schema. No fluff or extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (partial updates, multiple optional parameters, two modes), the description covers the essential aspects: what it updates, how modes work, and that omitted settings are preserved. The schema provides detailed field-level info, and an output schema exists, so the description does not need to explain return values. It lacks explicit mention that at least one parameter is required, but the schema's minProperties=1 covers that. Overall, it is sufficiently complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents each field. However, the description adds semantic value beyond the schema: it clarifies that energyTarget can be a 'complete manual energy target' or switch to 'automatic mode', and explicitly states that energy and water can be combined in one update. It also explains preservation of omitted settings, which is not in the schema. This meaningful addition justifies a score above the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('updates') and resource ('authenticated Fitatu user's supported settings'), and lists distinct capabilities (manual energy target, automatic mode, water serving size, combined updates). It clearly differentiates from the sibling get_user_settings, which reads settings, while this tool updates them. The phrasing is unambiguous and leaves no room for confusion about the tool's role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating it updates settings and enumerates what it can change, making it obvious this is the tool to use for modifying Fitatu user settings. It does not explicitly mention when not to use it or name alternatives, but given the sibling list, there is no other update-settings tool. The context is clear, though it could explicitly state 'use this to change settings' rather than leaving it implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
19 tool updates
v1.0.0- First observed
add_meal_items - First observed
create_recipe - First observed
delete_recipe - First observed
get_body_measurement - First observed
get_current_user - First observed
get_day_plan_items - First observed
get_diet_summary - First observed
get_recipe - First observed
get_user_settings - First observed
move_meal_item - First observed
remove_meal_items - First observed
replace_meal_item - First observed
save_body_measurement - First observed
search_food - First observed
search_food_by_barcodes - First observed
search_recipes - First observed
update_meal_item - First observed
update_recipe - First observed
update_user_settings
TDQS
Scored across 19 tools
Each tool targets a distinct resource and action: meal items (add, update, remove, move, replace), food search (text and barcode), recipe lifecycle (create, get, search, update, delete), body measurements (get/save), and user settings (get/update). Even similar tools like search_food and search_food_by_barcodes differ clearly by input type. No two tools appear to do the same thing.
All tools follow a consistent verb_noun pattern (e.g., get_day_plan_items, add_meal_items, create_recipe, delete_recipe). Names are clear and predictable, with no mixing of camelCase or inconsistent verb styles. The pattern allows an agent to infer functionality from names alone.
With 19 tools, the server is above the typical 3-15 well-scoped range, entering the 'heavy' category. However, each tool serves a distinct purpose across multiple domains (meal management, recipes, body measurements, user settings), so the count is justified but still on the higher side for optimal agent usability.
The tool surface covers CRUD for recipes, full meal item lifecycle (add, update, replace, move, remove), food and barcode search, body measurement retrieval/saving, and user settings. Minor gaps include lack of a dedicated tool to list body measurements over time (only most recent or specific date) and no bulk operations for day plans, but these are workable for agents.
Maintenance
Related MCP Connectors
- mcpOAuthcom.zomato
An MCP server that exposes functionalities to use Zomato's services.
MCP server exposing supplements database used by iNutriPlan.com
Unlock the power of food transparency with our Open Food Facts MCP server. Easily look up any food
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for managing Yazio user & nutrition data (unofficial)15337 npm63MIT
- AlicenseCqualityCmaintenanceEnables programmatic access to Fitatu nutrition tracking via MCP tools for login, food search, product lookup, daily nutrition read, and adding entries.9MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for USDA nutrition data lookup, meal logging, and daily macro tracking.41 npmMIT
- AlicenseBqualityDmaintenanceUnofficial read-only MCP server to log into Kanpla and read canteen menus using your account credentials.33 npmMIT