Skip to main content
Glama
AndekQR

Fitatu MCP Unofficial

Fitatu MCP Unofficial logo

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.

IMPORTANT

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.0

  • npm

  • 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 .env

Set FITATU_EMAIL and FITATU_PASSWORD in .env, then start the development server:

npm run dev

The default MCP endpoint is http://localhost:3000/mcp.

MCP client configuration

Choose one transport with MCP_TRANSPORT:

Transport

Best for

Process model

stdio

A local client that launches its own MCP server

One server process per client

http

A persistent server shared by one or more clients

Long-running server on /mcp

stdio

Build the server before configuring the client:

npm run build

Use 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 start

Clients with native Streamable HTTP support can connect directly to:

http://localhost:3000/mcp

For 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 inspector

Connect 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.dev
npm 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/mcp

  • Test: https://YOUR_NGROK_DOMAIN/test/mcp

Available tools

Tool

Purpose

get_current_user

Return a safe subset of the authenticated user profile.

get_body_measurement

Return the latest body measurement, or the complete entry for an optional YYYY-MM-DD date.

save_body_measurement

Partially update body measurements for a YYYY-MM-DD date using profile units.

get_user_settings

Return date-resolved energy, calculated, and water settings with requested and effective dates; date defaults to today in the Fitatu timezone.

update_user_settings

Set a manual or automatic energy target, update the water serving size, or apply both changes together.

get_day_plan_items

Return meals and food items for a YYYY-MM-DD date.

get_diet_summary

Summarize nutrition and energy for an inclusive date range.

search_food

Search Fitatu food catalogs and return mutation-ready identifiers.

search_food_by_barcodes

Search the public food catalog for up to 10 barcodes in parallel.

add_meal_items

Add products, recipes, or custom items to a meal.

update_meal_item

Update quantity, measure, or eaten state.

replace_meal_item

Replace one exact meal entry.

move_meal_item

Move an item to another meal, date, or both.

remove_meal_items

Atomically remove selected day-plan entries by UUID.

search_recipes

Search private recipes, public recipes, or both catalogs.

get_recipe

Return canonical per-serving recipe details.

create_recipe

Create a private recipe from product and measure identifiers.

update_recipe

Partially update an owned, editable recipe.

delete_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

FITATU_EMAIL

Yes

—

Fitatu account email address.

FITATU_PASSWORD

Yes

—

Fitatu account password.

FITATU_INTEGRATION_EMAIL

For integration tests and tunnel commands

—

Email address of a dedicated Fitatu test account.

FITATU_INTEGRATION_PASSWORD

For integration tests and tunnel commands

—

Password for the dedicated Fitatu test account.

MCP_TRANSPORT

No

http

MCP transport: http or stdio.

PORT

No

3000

HTTP port; unused in stdio mode.

HOST

No

0.0.0.0

HTTP bind address; unused in stdio mode. The tunnel launcher forces loopback.

NODE_ENV

No

development

development, production, or test.

SERVER_NAME

No

fitatu-mcp

Name reported by the MCP server.

SERVER_VERSION

No

3.0.0

Version reported by the MCP server.

LOG_LEVEL

No

info

silent, error, warn, info, or debug.

FITATU_USER_AGENT

No

Dart/3.10 (dart:io)

Fitatu mobile runtime user agent.

FITATU_APP_VERSION

No

4.14.4

Fitatu mobile application version.

FITATU_API_APK_UUID

No

BE4B.251210.005

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-mcp

The Dockerfile copies .env into the image. Treat the resulting image as sensitive; do not publish or share it.

Development

Task

Command

Development server

npm run dev

Both accounts with ngrok

npm run dev:all

Test account with ngrok

npm run dev:test-account

Production build

npm run build

Start built server

npm start

Type checking

npm run typecheck

Lint

npm run lint

Formatting check

npm run format:check

Unit tests with coverage

npm run test:ci

Local coverage report

npm run test:coverage

Integration tests

npm run test:integration

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 tools
add_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesTarget day in YYYY-MM-DD format where the meal items should be added.
itemsYesOne 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.
mealKeyYesFitatu 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

ParametersJSON Schema
NameRequiredDescription
dateYesDay where the new meal items were confirmed.
statusYesThe requested mutation was observed in the persisted Fitatu day plan.
mealKeyYesMeal containing the confirmed new items.
addedItemsYesConfirmed new items in input order.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNon-empty recipe name after trimming.
tagsNoComplete list of system or custom recipe tags. Omit to create the recipe without tags.
stepsNoOrdered 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.
sharedNoWhether the recipe may be visible in Fitatu's public catalog. Defaults to false (private).
servingsYesPositive integer number of portions produced by the recipe.
mealSchemaNoFitatu 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.
ingredientsYesProducts included in the recipe. Provide at least one validated product/measure selection.
cookingTimeMinutesNoNon-negative whole cooking time in minutes. Omit or use null when unknown.
preparationTimeMinutesNoNon-negative whole preparation time in minutes. Omit or use null when unknown.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesFitatu accepted the write and the service confirmed its observable effect.
detailsYesCanonical recipe details returned by a read-after-write request.
recipeIdYesCanonical id for subsequent operations. This is always identical to details.recipeId.
warningsYesNon-fatal write warnings; currently empty for validated recipe creation.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 RecipeA
Destructive

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 }.

ParametersJSON Schema
NameRequiredDescriptionDefault
recipeIdYesRaw Fitatu recipe id returned by a recipe-aware MCP tool.
expectedNameYesExact, 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

ParametersJSON Schema
NameRequiredDescription
nameYesExact name of the recipe that was deleted.
statusYesFitatu accepted the write and the service confirmed its observable effect.
deletedYesConfirmation that the recipe is observably deleted in Fitatu.
recipeIdYesCanonical id of the recipe that was deleted.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 MeasurementA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoOptional measurement date in YYYY-MM-DD format; defaults to the latest available entry.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateNoResolved measurement date in YYYY-MM-DD format. Omitted only when the latest measurement was requested and no history exists.
foundYesWhether Fitatu has a body measurement entry for the requested or latest date.
measurementNoComplete body measurement when found is true.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 UserA
Read-onlyIdempotent

Fetches the currently authenticated Fitatu user profile.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
userYesSafe subset of the authenticated Fitatu user profile.

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ItemsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDay to fetch in YYYY-MM-DD format. Defaults to today's local date when omitted.
withRatingNoWhether to ask Fitatu for rating-related day plan data when supported.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYesYYYY-MM-DD date of the returned day plan.
mealsNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SummaryA
Read-onlyIdempotent

Fetches the authenticated Fitatu user's nutrition and energy summary for an inclusive date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
toDateYesInclusive range end date in YYYY-MM-DD format.
fromDateYesInclusive range start date in YYYY-MM-DD format.

Output Schema

ParametersJSON Schema
NameRequiredDescription
energyYesEnergy totals and daily values from the energy summary endpoint.
periodYesDate range covered by this summary.
allNutrientsYesAll nutrients returned by Fitatu, normalized into a scannable list.
keyNutrientsYesHigh-signal nutrients selected for quick agent interpretation.

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 RecipeA
Read-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 }.

ParametersJSON Schema
NameRequiredDescriptionDefault
recipeIdYesRaw Fitatu recipe id returned by a recipe-aware MCP tool.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYesRecipe display name.
tagsYesComplete tag list; an empty array means the recipe has no tags.
stepsYesOrdered preparation steps parsed from Fitatu's newline-delimited recipe description; an empty array means no instructions are available.
sharedYesWhether Fitatu marks the recipe as shared with its public catalog.
userIdNoOwning Fitatu user id, when the upstream response exposes it.
deletedYesWhether Fitatu reports that the recipe has been deleted.
editableYesTrue only when this recipe is active and the authenticated user may currently update or delete it. Deleted and unowned recipes are false.
measuresYesMeasures accepted for this recipe by add_meal_items. Copy recipeId with one listed measureId; an empty array means Fitatu returned no usable measures.
recipeIdYesCanonical raw Fitatu recipe id for subsequent MCP operations.
servingsYesPositive integer number of servings produced by the recipe.
mealSchemaYesRaw 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.
ingredientsYesCanonical ingredient list; an empty array means Fitatu returned no usable ingredients.
weightPerServingGNoCalculated weight of one recipe serving in grams, when Fitatu provides it.
cookingTimeMinutesNoCooking time in whole minutes; omitted when unavailable.
nutritionPerServingNoNutrition calculated for one serving, omitted when Fitatu provides no nutrient values.
preparationTimeMinutesNoPreparation time in whole minutes; omitted when unavailable.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SettingsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoOptional settings date in YYYY-MM-DD format; defaults to today in Fitatu.

Output Schema

ParametersJSON Schema
NameRequiredDescription
settingsYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemIdYesMeal item id to move. Use itemId returned by get_day_plan_items.
toDateNoDestination day in YYYY-MM-DD format. Omit when moving only to a different meal on the same date.
fromDateYesCurrent day containing the item to move, in YYYY-MM-DD format.
toMealKeyNoDestination meal key. Omit only when moving to the same meal on a different date. Do not omit both toDate and toMealKey.
fromMealKeyYesCurrent 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

ParametersJSON Schema
NameRequiredDescription
itemIdYesPersisted meal item id to use in later update, move, replace, or remove operations.
statusYesThe requested mutation was observed in the persisted Fitatu day plan.
toDateYesCurrent day of the moved item.
fromDateYesPrevious day of the moved item.
toMealKeyYesCurrent meal key of the moved item.
fromMealKeyYesPrevious meal key of the moved item.
previousItemIdYesPrevious item id confirmed absent from the source meal.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ItemsA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDay containing the exact meal items to remove.
itemsYesUnique 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

ParametersJSON Schema
NameRequiredDescription
dateYesDay from which the meal items were removed.
statusYesThe requested mutation was observed in the persisted Fitatu day plan.
removedItemsYesItems confirmed absent from the day plan.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ItemA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDay containing the item to replace, in YYYY-MM-DD format.
itemIdYesExisting meal item id. Use itemId returned by get_day_plan_items.
mealKeyYesMeal 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.
replacementYesNew meal item using the same payload as one entry in add_meal_items.items.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYesDay containing the confirmed replacement item.
itemIdYesPersisted meal item id to use in later update, move, replace, or remove operations.
statusYesThe requested mutation was observed in the persisted Fitatu day plan.
mealKeyYesMeal containing the confirmed replacement item.
previousItemIdYesPrevious item id confirmed absent after replacement.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 MeasurementA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
calfNoCalf circumference in the profile's size unit.
dateYesMeasurement date in YYYY-MM-DD format.
hipsNoHip circumference in the profile's size unit.
neckNoNeck circumference in the profile's size unit.
chestNoChest circumference in the profile's size unit.
thighNoThigh circumference in the profile's size unit.
waistNoWaist circumference in the profile's size unit.
bicepsNoUpper-arm circumference in the profile's size unit.
weightNoBody weight in the profile's weight unit.
stomachNoAbdominal circumference in the profile's size unit.
fatPercentageNoBody fat percentage.

Output Schema

ParametersJSON Schema
NameRequiredDescription
measurementYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 FoodA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate context for Fitatu's authenticated user search. Defaults to today's local date.
limitNoMaximum candidates per query per source. Defaults to 5.
localeNoFitatu search locale. Defaults to pl_PL.pl_PL
queriesYesOne 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.
detailsLimitNoTotal 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.
includeDetailsNoWhether 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.
includeUserFoodNoWhether to use Fitatu's authenticated user search source. Its exact composition and ordering are determined by Fitatu.
includePublicFoodNoWhether to search Fitatu's public food catalog.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYesSearch results grouped by input query, with separate user and public source lists.
warningsNoNon-fatal warnings produced while searching or fetching details.
queryCountYesNumber of search queries processed by this call.
resultCountYesTotal number of returned user and public candidate items across all queries.
warningDetailsNoStructured details for non-fatal warnings.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 BarcodesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
barcodesYesOne to ten GTIN-8, UPC-A, EAN-13, or GTIN-14 barcode strings.
detailsLimitNoMaximum candidates to enrich per barcode. Defaults to 3.
includeDetailsNoWhether to enrich top candidates with product details and available measures.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYesOne result group for every input barcode, preserving input order and duplicates.
warningsNoNon-fatal warnings produced by barcode searches or enrichment.
warningDetailsNoStructured details for non-fatal barcode search warnings.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 RecipesA
Read-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 }.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoOne-based result page number. Defaults to 1.
limitNoMaximum recipes returned on this page, from 1 to 50. Defaults to 20.
queryNoOptional case-insensitive substring matched against recipe names. Omit or use an empty string to list recipes.
scopeNoCatalog scope: "mine" searches owned recipes, "public" searches Fitatu, and "all" combines both. Defaults to "mine".mine
includeDetailsNoWhether 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

ParametersJSON Schema
NameRequiredDescription
pageYesOne-based page number returned.
countYesNumber of recipes in items on this page, not the total number of matching recipes. Always equals items.length.
itemsYesDeduplicated recipes on this page. With includeDetails=true, successful detail lookups add canonical fields and measures at the top level.
limitYesMaximum number of recipes requested for this page.
queryYesNormalized search phrase used for the request; empty when listing.
scopeYesCatalog scope used for this result page.
warningsYesNon-fatal source or recipe-detail failures; empty when every requested operation succeeded.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDay containing the item to update, in YYYY-MM-DD format.
fatGNoNew non-negative fat total in grams. Accepted only for a CUSTOM_ITEM.
nameNoNew non-empty name. Accepted only for an existing CUSTOM_ITEM.
eatenNoWhether Fitatu should mark the item as eaten.
itemIdYesMeal item id to update. Use itemId returned by get_day_plan_items.
mealKeyYesMeal 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.
proteinGNoNew non-negative protein total in grams. Accepted only for a CUSTOM_ITEM.
measureIdNoNew measure id for the item. Use measureId values returned by search_food when changing measures.
energyKcalNoNew non-negative calorie total. Accepted only for an existing CUSTOM_ITEM.
carbohydrateGNoNew non-negative carbohydrate total in grams. Accepted only for a CUSTOM_ITEM.
measureQuantityNoNew positive quantity for the item's current or selected measure.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYesDay where the updated meal item was confirmed.
itemIdYesPersisted meal item id to use in later update, move, replace, or remove operations.
statusYesThe requested mutation was observed in the persisted Fitatu day plan.
mealKeyYesMeal containing the confirmed updated item.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 RecipeA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoReplacement recipe name. Omit to preserve the current name.
tagsNoComplete replacement tag list. Omit to preserve current tags; use [] to remove all tags.
stepsNoComplete replacement preparation steps without numeric prefixes. Put one step in each string; omit to preserve the current steps and use [] to clear them.
sharedNoReplacement sharing setting. Omit to preserve the current value.
recipeIdYesRaw Fitatu recipe id returned by a recipe-aware MCP tool.
servingsNoReplacement positive integer serving count. Omit to preserve the current value.
mealSchemaNoComplete 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.
ingredientsNoComplete replacement ingredient list. Omit to preserve current ingredients; at least one ingredient is required when provided.
cookingTimeMinutesNoReplacement cooking time in whole minutes. Omit to preserve; use null to clear.
preparationTimeMinutesNoReplacement preparation time in whole minutes. Omit to preserve; use null to clear.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesFitatu accepted the write and the service confirmed its observable effect.
detailsYesCanonical details for the updated recipe, read using the resulting recipeId.
recipeIdYesCanonical id to use after the update. This is always identical to details.recipeId.
warningsYesNon-fatal write warnings; currently empty for validated recipe updates.
identityChangedYesWhether Fitatu replaced the recipe id: true exactly when recipeId differs from previousRecipeId.
previousRecipeIdYesRecipe id targeted by the update. It may become obsolete when identityChanged is true.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SettingsA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
energyTargetNoOptional manual or automatic daily energy target update.
waterServingSizeMlNoPositive whole-number default water serving size in millilitres.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
settingsYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 19 tool updatesv1.0.0
    • First observedadd_meal_items
    • First observedcreate_recipe
    • First observeddelete_recipe
    • First observedget_body_measurement
    • First observedget_current_user
    • First observedget_day_plan_items
    • First observedget_diet_summary
    • First observedget_recipe
    • First observedget_user_settings
    • First observedmove_meal_item
    • First observedremove_meal_items
    • First observedreplace_meal_item
    • First observedsave_body_measurement
    • First observedsearch_food
    • First observedsearch_food_by_barcodes
    • First observedsearch_recipes
    • First observedupdate_meal_item
    • First observedupdate_recipe
    • First observedupdate_user_settings

TDQS

A4.3/5.0

Scored across 19 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    C
    maintenance
    Enables programmatic access to Fitatu nutrition tracking via MCP tools for login, food search, product lookup, daily nutrition read, and adding entries.
    9
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Unofficial read-only MCP server to log into Kanpla and read canteen menus using your account credentials.
    3
    3 npm
    MIT