Skip to main content
Glama
smeet666

mcp-ptitchef

mcp-ptitchef

CI npm licence MIT

Un servidor MCP que lee recetas en Ptitchef. Solo lectura, sin clave de API, sin cuenta.

Versión francesa


Por qué existe

Ptitchef navega por sus recetas mediante un árbol de familias de ingredientes, y escribe la dirección de cada categoría libremente. Lo mismo aparece como chou-kale en una línea, como recette-de-petits-pois en la siguiente y como recettes-aux-feves en una tercera. No hay regla para derivar una a partir del nombre de un ingrediente.

Una dirección construida a mano, por tanto, falla, y el sitio responde al fallo enviando al lector a la raíz del árbol con HTTP 200 y las categorías de la propia raíz. Un modelo que adivinara un slug obtiene una respuesta completa y segura sobre un nivel que nunca pidió.

Este servidor publica el árbol, de modo que una categoría se abre por el nombre que le dio el sitio.

Related MCP server: France BOAMP MCP

Las herramientas

list_categories

Enumera las categorías por las que se navegan las recetas. Si se llama sin argumentos, devuelve las familias de ingredientes; pasa de vuelta el slug de una familia para enumerar lo que contiene.

Argumento

Tipo

Significado

family

cadena, opcional

El slug de una familia para abrir, de una llamada anterior. Omítelo para leer la raíz.

limit

entero, opcional

Entradas a mostrar, 50 por defecto, 200 como máximo.

{
  "family": null,
  "family_title": "Recettes de cuisine sur Ptitchef",
  "categories": [
    {
      "slug": "legume",
      "title": "Légume",
      "url": "https://www.ptitchef.com/recettes/cat/legume",
      "description": null,
      "sample_children": [
        {
          "slug": "pois-mange-tout",
          "title": "Pois mange-tout",
          "url": "https://www.ptitchef.com/recettes/pois-mange-tout"
        }
      ],
      "is_family": true
    }
  ],
  "category_count": 15,
  "categories_published": 15,
  "url": "https://www.ptitchef.com/recettes",
  "source": "Ptitchef",
  "notes": ["…"]
}

search_recipes

Busca por plato o ingrediente. El sitio responde de una de dos maneras, y kind indica cuál.

Argumento

Tipo

Significado

query

cadena

Un plato o un ingrediente, en francés.

limit

entero, opcional

Filas a mostrar, 20 por defecto, 100 como máximo.

Buscar puree de patate douce devuelve kind: "topic" con topic_slug: "puree-de-patates-douces": el sitio tiene una página para ello, envía la búsqueda allí, y el total cuenta lo que contiene esa página. Buscar soupe froide concombre menthe devuelve kind: "free_text": el sitio no tiene tal página, responde en sus propios términos, y el total es el número de filas que sirvió.

browse_recipes

Lee una categoría página a página, o una de las tres listas que el sitio mantiene fijas.

Argumento

Tipo

Significado

category

cadena, opcional

Un slug de list_categories, o el topic_slug de una búsqueda.

listing

latest | top_rated | most_viewed

Una de las listas fijas del sitio.

page

entero, opcional

La página de una categoría a leer.

limit

entero, opcional

Filas a mostrar, 20 por defecto.

search_by_ingredients

Lee la búsqueda de nevera del propio sitio: de uno a cinco ingredientes dentro, recetas que los contienen fuera.

Argumento

Tipo

Significado

ingredients

cadena[]

De uno a cinco ingredientes, en francés.

limit

entero, opcional

Filas a mostrar, 20 por defecto.

get_recipe

Lee una receta y reescala sus ingredientes si se le pide.

Argumento

Tipo

Significado

id

cadena

El id de una fila de una búsqueda o una lista.

servings

entero, opcional

Reescala los ingredientes a este número de raciones.

Cada línea lleva un scaling que indica qué hizo la aritmética: scaled es exacto, rounded se ajustó para seguir siendo utilizable, unscaled no lleva nada que pueda multiplicarse. Duplicar 1 oeuf da 2 oeufs; dividirlo a la mitad da 1 oeuf marcado como rounded, porque medio huevo no es una cantidad que una cocina mida.

scale_ingredients

La misma aritmética, sin conexión, sobre cualquier lista de ingredientes en francés, sea cual sea su origen.

Argumento

Tipo

Significado

ingredients

cadena[]

Las líneas a reescalar.

factor

número

El multiplicador a aplicar.

from_servings y to_servings

números

O el par del que se lee el factor.

get_recipe_translations

Enumera los otros idiomas en los que se publicó una receta. Ptitchef es la edición francesa de una red de sitios que publican las mismas recetas, y cada página nombra sus homólogas. Cuántas haya es asunto de la propia receta: una reciente nombra más de veinte, una más antigua no nombra ninguna, y la respuesta indica lo que la página contiene en lugar de un número fijado aquí.

Lo que las respuestas se niegan a exagerar

Un nivel que el sitio sustituyó no es el nivel que se pidió. Una familia desconocida se responde con HTTP 200 y la raíz del árbol, así que la dirección de la que provino la respuesta decide de qué nivel se trata. Una familia que no se tenía se informa como not_found, en lugar de mostrarse como las categorías que el sitio ofreció en su lugar.

Las entradas junto a una familia son un extracto. La raíz muestra tres de ellas seguidas de una elipsis que el propio sitio imprime. Se devuelven bajo sample_children y una nota dice qué son, porque mostrarlas como el contenido de la familia ofrecería una familia de noventa como una familia de tres.

Dos recuentos, porque responden a dos preguntas. categories_published es lo que la página enumeró y category_count es lo que la respuesta mostró. Difieren siempre que un límite cortó la lista, y la nota dice en cuánto, en lugar de dejar que una lista limitada se lea como una completa.

Una entrada sin dirección se aparta en lugar de mostrarse. Un encabezado que el sitio publicó sin enlace no lleva ningún slug que devolver, así que se descarta, se cuenta y se nombra en las notas.

Un texto promocional que la página no contiene es null, nunca una cadena vacía. Una descripción vacía ofrecería un texto que nunca se publicó.

Una lista tiene dos totales que cuentan cosas distintas, y la respuesta dice cuál llegó. Una búsqueda que el sitio envía a una página de categoría informa del total de esa categoría; una búsqueda que responde él mismo informa del número de filas que sirvió. Sumar ambos añadiría un catálogo a una página.

Una valoración es la cifra que el sitio calculó. Una fila indica 3.8 en su carga útil y dibuja cuatro estrellas. La cifra dibujada se deja como está.

Una página más allá de la última vuelve como la página que el sitio sirvió. El sitio responde con la primera página, así que informar del número que se pidió enviaría a quien llama a dar vueltas por las mismas filas para siempre.

La búsqueda de nevera cuenta mucho más allá de lo que sirve. Encuentra ochenta y nueve recetas para tres ingredientes, ofrece veinticuatro de ellas en una página y no enlaza ninguna otra. La respuesta indica ambas cifras y dice que el resto no se puede leer.

Una guía no es una lista, y la respuesta dice cuál llegó. Algunos temas se sirven como una guía escrita por el sitio: recetas agrupadas bajo encabezados propios, sin total, y filas que solo llevan un nombre y una dirección. kind dice guide allí, y browse_recipes sobre el mismo slug lee la lista completa del tema con su total: épinards vuelve como una guía de 32, y su lista contiene 736.

Otra receta servida en lugar de una se muestra como una ausencia. Las palabras de la dirección de una receta son decorativas y su número no lo es: pedir un número que el sitio no tiene trae de vuelta una receta no relacionada, en HTTP 200 y con detalle completo. El número que llegó se compara con el número pedido.

Nada se multiplica a ciegas. Una cosa contable cae en la porción más pequeña que un cocinero saca de una de ella: un entero cuando no se puede medir la mitad de uno, un huevo; una mitad cuando la mitad de uno se vierte o se divide, un sobre. Una masa pasa a una unidad más pequeña antes de redondearse, así que una cantidad inferior a uno nunca redondea a cero. Una pizca conserva su propio vocabulario y su recuento se multiplica, porque el tamaño de una es cosa del cocinero.

Una lista devuelta sin reescalar lo dice una vez, en lugar de línea por línea. Sin raciones pedidas no hay aritmética, y marcar cada línea unscaled afirmaría que ninguna de ellas lleva nada que multiplicar.

El coste que el sitio estima se repite, nunca se recalcula. Es la cifra del propio sitio, y los lectores del sitio la discuten por considerarla demasiado baja; la respuesta lo dice en lugar de transmitirla en silencio o descartarla sin más.

Instalación

npx mcp-ptitchef

Claude Code

claude mcp add ptitchef -- npx -y mcp-ptitchef

Cualquier cliente MCP

{
  "mcpServers": {
    "ptitchef": {
      "command": "npx",
      "args": ["-y", "mcp-ptitchef"]
    }
  }
}

Contenedor

docker build -t mcp-ptitchef .
docker run -i --rm mcp-ptitchef

El contenedor necesita alcanzar www.ptitchef.com y nada más. No recibe credenciales, porque no hay ninguna que recibir.

Ajustes

Cada ajuste es una variable de entorno, y ninguno es obligatorio. Un valor fuera de su rango se rechaza con una línea en stderr y el valor por defecto se mantiene: un ajuste que no puede tener efecto lo dice en lugar de ser recortado silenciosamente.

Variable

Por defecto

Rango

PTC_USER_AGENT

—

Tu propio identificador. El de este proyecto se mantiene añadido, para que el sitio pueda llegar a una persona.

PTC_MIN_INTERVAL_MS

1500

1000 a 60000

PTC_TIMEOUT_MS

20000

1000 a 120000

PTC_MAX_RETRIES

3

0 a 8

PTC_CACHE_TTL_MS

900000

0 a 86400000, 0 apaga el almacenamiento

PTC_CACHE_MAX_ENTRIES

200

1 a 5000

PTC_MAX_BODY_BYTES

8000000

100000 a 64000000. Más allá, una página se abandona en lugar de retenerse entera

PTC_BUDGET_MS

60000

5000 a 600000. Toda una lectura, sus reintentos y sus esperas incluidos

PTC_LOG_LEVEL

error

silent, error, info, debug

El límite mínimo de ritmo no se puede bajar desde fuera. El sitio es de lectura gratuita y no publica ningún retardo de rastreo, lo cual es una razón para ser cuidadoso, no una licencia para ir rápido.

Como biblioteca

La capa de lectura se publica por separado, con su ritmo, su almacenamiento y su vocabulario de errores y sin ningún protocolo adjunto:

import { PtitchefClient } from "mcp-ptitchef/client";

Errores

Seis códigos y no más. Quien llama decide según el código que abre el mensaje.

Code

Significado

not_found

El sitio no tiene nada en esa dirección

invalid_input

Los argumentos no pudieron producir una solicitud

rate_limited

El sitio pidió a este cliente que fuera más lento. No dice nada sobre si hubo coincidencias

parse_failure

Llegó una respuesta en una forma que este servidor no puede leer

network_error

La solicitud no pudo completarse

timeout

No llegó ninguna respuesta dentro del plazo

Atribución

Las recetas, los títulos y las categorías pertenecen a Ptitchef. Cada respuesta lleva la fuente, y un listado mostrado a un lector debe acreditar al sitio y enlazar la página.

Contribuciones

Consulta CONTRIBUTING.md. Los tests van primero, la cobertura tiene un mínimo del 100%, y la regla que todo sigue es que el servidor nunca dice nada que los datos no contengan.

Licenciado bajo MIT.


mcp-ptitchef (español)

Un servidor MCP que lee las recetas de Ptitchef. De solo lectura, sin clave de API y sin cuenta.

Por qué existe

Ptitchef recorre sus recetas mediante un árbol de familias de ingredientes, y escribe libremente la dirección de cada categoría. El mismo tipo de cosa se llama chou-kale en una línea, recette-de-petits-pois en la siguiente y recettes-aux-feves en una tercera. Ninguna regla permite deducir una del nombre de un ingrediente.

Una dirección construida a mano falla por tanto, y el sitio responde mal devolviendo al lector a la raíz del árbol, con HTTP 200, con las categorías de la raíz. Un modelo que ha adivinado un slug recibe una respuesta completa y contundente sobre un nivel que nunca ha pedido.

Este servidor publica el árbol, para que una categoría se abra por el nombre que el sitio le ha dado.

Las herramientas

list_categories

Lista las categorías por las que se recorren las recetas. Llamado sin argumento devuelve las familias de ingredientes; pasándole de nuevo el slug de una familia devuelve lo que contiene.

Argumento

Tipo

Significado

family

cadena, opcional

El slug de una familia que abrir, procedente de una llamada anterior. Si falta, el árbol se lee desde su raíz.

limit

entero, opcional

Entradas devueltas, 20 por defecto, 200 como máximo.

search_recipes

Busca por plato o por ingrediente. El sitio responde de cinco maneras, y kind dice cuál: topic cuando envía la búsqueda a una página de categoría propia, free_text cuando responde según sus propios términos, guide cuando ha redactado una guía para ese tema, recipe cuando juzga las palabras lo bastante precisas para abrir una ficha, y unmatched cuando sirve su página de inicio por no haber entendido.

Argumento

Tipo

Significado

query

cadena

Un plato o un ingrediente, en francés.

limit

entero, opcional

Líneas devueltas, 20 por defecto, 100 como máximo.

browse_recipes

Recorre una categoría página a página, o una de las tres listas que el sitio mantiene al día.

Argumento

Tipo

Significado

category

cadena, opcional

Un slug de list_categories, o el topic_slug de una búsqueda.

listing

latest | top_rated | most_viewed

Una de las listas permanentes del sitio.

page

entero, opcional

La página de una categoría que leer.

limit

entero, opcional

Líneas devueltas, 20 por defecto.

search_by_ingredients

Lee la búsqueda de la nevera del sitio: de uno a cinco ingredientes de entrada, las recetas que los contienen de salida.

Argumento

Tipo

Significado

ingredients

cadena[]

De uno a cinco ingredientes, en francés.

limit

entero, opcional

Líneas devueltas, 20 por defecto.

get_recipe

Lee una receta y reescala sus ingredientes bajo petición.

Argumento

Tipo

Significado

id

cadena

El id de una línea devuelta por una búsqueda o una lista.

servings

entero, opcional

Reescala los ingredientes para ese número de raciones.

Cada línea lleva un scaling que dice lo que ha hecho la aritmética: scaled es exacto, rounded se ha ajustado para seguir siendo utilizable, unscaled no llevaba nada que multiplicar. Doblar 1 oeuf da 2 oeufs; dividirlo entre dos da 1 oeuf marcado como rounded, porque medio huevo no es una cantidad que una cocina mida.

scale_ingredients

La misma aritmética, sin conexión, sobre cualquier lista francesa sea cual sea su fuente.

Argumento

Tipo

Significado

ingredients

cadena[]

Las líneas que reescalar.

factor

número

El multiplicador que aplicar.

from_servings y to_servings

números

O el par del que se deduce el factor.

get_recipe_translations

Lista los otros idiomas en los que se ha publicado una receta. Ptitchef es la edición francesa de una red de sitios que publican las mismas recetas, y cada página nombra sus homólogas. Cuántas hay pertenece a la receta: una reciente nombra más de veinte, una antigua ninguna.

Lo que las respuestas se niegan a afirmar

Una guía no es una lista, y la respuesta dice cuál ha llegado. Algunos temas se sirven mediante una guía que redacta el sitio, sin total, cuyas líneas llevan un nombre, una dirección, una imagen y un número de votos. kind vale guide ahí, y browse_recipes sobre el mismo slug devuelve la lista completa del tema con su total: épinards devuelve una guía de 32 recetas, su lista contiene 736.

Una receta servida en lugar de otra se devuelve como una ausencia. Las palabras de una dirección de receta son decorativas y su número no lo es: pedir un número que el sitio no tiene devuelve una receta sin relación, con HTTP 200 y con detalle completo. El número devuelto se compara con el número pedido.

Una página cuya lista es ilegible no es una ausencia. Un título que lleva un recuento y ninguna lista legible es una página que este servidor no sabe leer, y es lo que devuelve en lugar de «ninguna receta, el sitio dice que tiene 3200».

Una nota es la cifra que el sitio ha calculado. Una línea anuncia 3,8 en su carga y dibuja cuatro estrellas; es la cifra calculada la que se publica, y una guía que no calcula ninguna no publica ninguna.

Lo que cuenta un total se lee en la respuesta. Una búsqueda que el sitio envía a una página de categoría devuelve el total de esa categoría; una búsqueda que él mismo procesa devuelve lo que ha contado, que a veces supera las líneas servidas. La nota solo lo dice allí donde ambas cifras lo establecen.

Nada se multiplica a ciegas. Un elemento contable cae en la porción más pequeña que un cocinero toma de uno solo: un entero allí donde la mitad de uno no se mide, un huevo; una mitad allí donde se vierte o se corta, un sobre. Una masa baja de unidad antes de redondearse, por lo que una cantidad por debajo de la unidad nunca cae a cero. Una pizca conserva su propio vocabulario y ve multiplicado su recuento, porque el tamaño de una es el del cocinero.

Una lista devuelta sin reescalado lo dice una vez, en lugar de línea por línea. Sin servings no hay aritmética, y marcar cada línea como unscaled afirmaría que ninguna lleva nada que multiplicar.

El coste estimado se repite, nunca se recalcula. Es la cifra del sitio, publicada para el número de raciones que anuncia la página, y la respuesta dice cuál.

Una dirección leída en una página no sale de este sitio. Una línea que apunta a otro lugar se descarta en lugar de publicarse bajo la etiqueta «la página pública de la receta».

Instalación

npx mcp-ptitchef

Claude Code

claude mcp add ptitchef -- npx -y mcp-ptitchef

Cualquier cliente MCP

{
  "mcpServers": {
    "ptitchef": {
      "command": "npx",
      "args": ["-y", "mcp-ptitchef"]
    }
  }
}

Contenedor

docker build -t mcp-ptitchef .
docker run -i --rm mcp-ptitchef

El contenedor debe poder conectar con www.ptitchef.com y nada más. No toma ningún identificador, ya que no hay ninguno que tomar.

Ajustes

Cada ajuste es una variable de entorno, y ninguna es obligatoria. Un valor fuera de los límites se rechaza con una línea en stderr y el valor por defecto se mantiene: un ajuste que no puede aplicarse lo dice en lugar de ser devuelto en silencio a los límites.

Variable

Defecto

Límites

PTC_USER_AGENT

—

Tu identificador. El del proyecto se sigue añadiendo, para que el sitio pueda contactar con una persona.

PTC_MIN_INTERVAL_MS

1500

1000 a 60000

PTC_TIMEOUT_MS

20000

1000 a 120000

PTC_MAX_RETRIES

3

0 a 8

PTC_CACHE_TTL_MS

900000

0 a 86400000, 0 apaga el almacenamiento

PTC_CACHE_MAX_ENTRIES

200

1 a 5000

PTC_LOG_LEVEL

error

silent, error, info, debug

El ritmo mínimo no se reduce desde fuera. El sitio es libre de leer y no publica ningún intervalo de exploración, lo cual es una razón para ser prudente.

Como biblioteca

La capa de lectura se publica sola, con su ritmo, su almacenamiento y su vocabulario de errores, sin protocolo adjunto:

import { PtitchefClient } from "mcp-ptitchef/client";

Errores

Seis códigos y no uno más. Un llamante se conecta al código que abre el mensaje.

Code

Lo que significa

not_found

El sitio no tiene nada en esta dirección

invalid_input

Los argumentos no podían producir una solicitud

rate_limited

El sitio ha pedido a este cliente que vaya más despacio. Eso no dice nada sobre lo que contiene

parse_failure

Una respuesta llegó en un formato que este servidor no sabe leer

network_error

La solicitud no pudo completarse

timeout

No llegó ninguna respuesta dentro del plazo

Atribución

Las recetas, los títulos y las categorías pertenecen a Ptitchef. Cada respuesta lleva la fuente, y una lista mostrada a un lector debe acreditar al sitio y enlazar la página.

Contribuir

Ver CONTRIBUTING.md. Los tests primero, la cobertura tiene un mínimo del 100 %, y la regla que todo sigue es que un servidor nunca dice algo que los datos no contengan.

Bajo licencia MIT.

Available Tools

7 tools
browse_recipesBrowse a category or a standing listA
Read-onlyIdempotent

Read the recipes under one category of Ptitchef, page by page, or one of the lists the site keeps standing. Pass 'category' with a slug from list_categories or from a search's 'topic_slug', or pass 'listing' for one of: latest, top_rated, most_viewed. Never build a category slug by hand: the site writes them freely and answers an address it does not hold by serving another page. The page in the answer is the one the site served, which is the first page again when the page asked for is past the last one.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoThe page of a category to read. A standing list has one page only.
limitNoRows to render, 20 by default.
listingNoOne of the site's standing lists, read instead of a category.
categoryNoA category slug: one from list_categories whose 'is_family' is false, or the 'topic_slug' a search answered with. A family's slug belongs to list_categories instead.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesThe address the listing was read from.
kindYesHow the listing came to be, which decides what its total counts. 'topic' means the site answered a search from a page of its own; 'free_text' means it answered on its own terms.
pageYesThe page that was read, which is the one the site served.
askedYesWhat was asked for: a search, a category, or a list of ingredients. 'query' carries the same value under the name every source of recipes publishes it in.
notesYesWhat qualifies this answer: what its total counts, what it left out, and where the site answered from an address other than the one asked for. Read these before quoting a figure.
queryYesWhat was asked for, under the name a search publishes it in.
titleYesThe site's own heading for the listing.
foldedYesRows naming a recipe already held. A guide lists one recipe under two headings where it belongs to both; such a row is counted in 'rows_seen' and rendered once.
sourceYesThe site this answer was read from. Credit it when showing a row.
resultsYes
rows_seenYesRows the site served on this page, before any were set aside.
topic_slugYesThe category page this listing was served from. Pass it to browse_recipes as 'category' to read the topic's further pages, and its total where this answer carries none.
single_pageYesTrue when the site serves this listing on one page and offers no further one.
result_countYesRows rendered here.
total_availableYesRecipes the site says this listing holds. Null when it published no figure.

TDQS

A4.7/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 a non-obvious behavioral quirk: the site serves another page when it does not hold the address, and pages past the last one silently return the first page. This is exactly the kind of edge-case behavior an agent needs before invoking the tool.

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, and each earns its place: the core operation, the two input modes, the slug-authoring warning, and the pagination fallback behavior. The main purpose is front-loaded and the caveats are placed after the primary semantics.

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 paginated browsing tool with rich schema descriptions and an output schema, the definition covers the dangerous non-obvious behaviors that could otherwise cause an agent to misread results: slug tolerance and page wrapping. Nothing essential for correct invocation 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 schema already documents all parameters at 100% coverage, but the description adds usable guidance about where category slugs come from, that listing values are mutually exclusive with category, and the warning against hand-built slugs. It reinforces but does not deeply extend the schema's parameter descriptions, so a 4 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 opens with a specific verb and resource: 'Read the recipes under one category of Ptitchef, page by page, or one of the lists the site keeps standing.' It clearly states both operating modes and distinguishes this from siblings like list_categories (which returns categories) and search_recipes (which returns search results).

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 explicit input-selection rules: pass 'category' with a slug from list_categories or a search's 'topic_slug', or pass 'listing' with one of the named standing lists. It also gives a strong exclusion: never hand-build a category slug. It does not explicitly name the sibling tools to use instead, 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_recipeRead one recipeA
Read-onlyIdempotent

Read one Ptitchef recipe: its ingredients, method, times, rating, nutrition and the cost the site estimates for it. Pass the 'id' of a row from search_recipes, browse_recipes or search_by_ingredients. Give 'servings' to rescale the ingredients, and read each line's 'scaling' before quoting a quantity: 'scaled' is exact arithmetic, 'rounded' was moved to stay usable, and 'unscaled' carries nothing that could be multiplied. A time or a figure the site publishes none of comes back null, never zero.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe 'id' of a row from a search or a listing, which is the recipe's own page path.
servingsNoRescale the ingredients to this many servings. Left out, the ingredients come back as published.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
faqYes
urlYesThe public page. Show this when citing the recipe.
notesYesWhat qualifies this answer: what the arithmetic did, what it could not do, and what the site states rather than this server. Read these before quoting a quantity or a cost.
stepsYesThe method, one line per step, in the shape every source of recipes publishes it in. 'illustrated_steps' carries the same lines beside the photograph the site took of each.
titleYes
yieldYes
authorYes
ratingYes1 to 5, as the site states it.
sourceYesThe site this recipe was read from. Credit it when showing it.
cuisineYes
categoryYes
keywordsYes
modifiedYes
image_urlYes
nutritionYesAs published, per the serving size it names.
publishedYes
author_urlYes
difficultyYesThe site's own wording, such as 'facile'.
attributionYes
descriptionYes
ingredientsYesThe lines as published where no servings were asked for, in which case 'yield.factor' is null and each line's 'scaling' describes no arithmetic. Pass 'servings' to rescale them.
cook_minutesYes
prep_minutesYes
rating_countYes
review_countYes
translationsYesThe other languages this recipe was published in, which get_recipe_translations answers on its own for a caller who wants nothing else.
total_minutesYes
estimated_costYesWhat the site estimates the ingredients cost, with the currency it names. Repeated as published: it is the site's figure and readers of the site dispute it.
illustrated_stepsYes
steps_are_one_blockYesTrue when the site published its method as one block of prose, so the single step above is that block rather than the first of several.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, open-world, idempotent, and non-destructive behavior. The description adds valuable behavioral detail beyond that: it explains the 'scaling' field's values ('scaled', 'rounded', 'unscaled') and their meaning for quoting quantities, and states that absent site figures come back null, never zero. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place: scope, id sourcing, servings, and output semantics. It is dense but front-loaded with the core purpose, and no sentence is filler.

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?

With an output schema present and annotations covering the safety profile, the description provides enough context for correct invocation. It handles id provenance, optional servings, scaling nuances, and null semantics; minor omissions like invalid-id behavior are not critical.

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 both parameters. The description adds value by specifying that valid 'id' values come from rows of three sibling tools and clarifies that 'servings' rescales ingredients, echoing the schema in more actionable terms.

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 ('Read'), a unique resource ('one Ptitchef recipe'), and enumerates what is returned (ingredients, method, times, rating, nutrition, cost). It also differentiates from search siblings by instructing the agent to pass an id from search_recipes, browse_recipes, or search_by_ingredients.

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?

It gives clear context: use with an id coming from the three listed search tools, and optionally pass servings to rescale. It names the upstream tools that produce valid ids, but doesn't explicitly state when not to use it (e.g., when scale_ingredients might be more appropriate), so it stops short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recipe_translationsFind a recipe in the other languages it was published inA
Read-onlyIdempotent

List the other languages a Ptitchef recipe was published in, with the page of each. get_recipe already carries this list under 'translations', so call this one only where the rest of the recipe is not wanted. Pass the 'id' of a row from a search or a listing. The pairing is the site's own: each page names its counterparts, and this repeats those names rather than matching titles. How many there are belongs to the recipe: a recent one names more than twenty, from German to Hindi, and an older one names none. An empty list is what the site published, and the read succeeded.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe 'id' of a row from a search or a listing, which is the recipe's own page path.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlYesThe French page these counterparts were read from.
notesYes
titleYes
sourceYes
translationsYes
translation_countYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, open-world, and non-destructive behavior. The description adds meaningful nuanced behavior: the translation pairing is site-defined and repeated rather than title-matched, the count varies by recipe, and an empty list still means the read succeeded. This goes well beyond the annotation hints.

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 purpose and is not padded. A few repeated details from the schema and the illustrative language examples add length, but each sentence contributes useful operational or interpretive context for an agent.

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 single-parameter read tool with an output schema and strong annotations, the description is complete: it explains when to use this tool instead of get_recipe, how to source the id, what the result represents, how size varies, and how to interpret an empty list.

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 already explains that 'id' is 'The id of a row from a search or a listing, which is the recipe's own page path.' The description repeats this same guidance without adding substantial new parameter semantics, 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?

Description names a specific verb and resource: 'List the other languages a Ptitchef recipe was published in, with the page of each.' It explicitly contrasts with the sibling get_recipe, which already contains this list, so an agent can immediately distinguish this tool from the main recipe-fetching tool.

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 a clear when-to-use rule: call this only when the rest of the recipe is not wanted, because get_recipe already carries the translations list. It also tells the agent exactly what input to pass: the 'id' of a row from a search or listing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_categoriesList the categories recipes are browsed byA
Read-onlyIdempotent

List the categories Ptitchef browses its recipes by. Called without arguments it returns the families of ingredients; pass a family's slug as 'family' to list the categories it holds. Read this before building an address by hand: the site writes its slugs freely, so the same vegetable appears as 'chou-kale' on one line and as 'recette-de-petits-pois' on the next, and a slug that was guessed lands on a page the site does not hold. Each entry carries the slug to pass back and the page to open.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoEntries to render, 20 by default and 200 at most. A level holding more than this says so, and 'categories_published' always states what the page listed.
familyNoThe slug of a family to open, taken from a previous call. Leave it out to read the families themselves, which is where the tree starts.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesThe page these categories were read from.
notesYes
familyYesThe family that was opened, or null for the root.
sourceYes
categoriesYes
family_titleYesThe site's own heading for this level. Null when the page carries none.
category_countYesEntries rendered here.
categories_publishedYesEntries the page listed, before any were rendered.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is read-only, idempotent, non-destructive, and open-world. The description adds valuable behavioral context beyond those annotations by warning that slugs are written freely by the site, that guessed slugs land on non-existent pages, and that entries carry the slug to pass back. This directly addresses the open-world nature of the catalog and prevents a common failure mode.

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 compact and front-loaded: the core action and the two-mode behavior appear first, followed by a necessary warning about slug instability. Every sentence contributes either to correct invocation or to avoiding an error, with no filler or repetition of schema 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?

Given the tool's two-level hierarchy, optional parameters, rich annotations, and existing output schema, the description covers everything an agent needs: how to start, how to descend, and why slug guessing is unsafe. Pagination and return details are already handled by the schema and output schema, 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%, so the schema fully documents 'limit' and 'family.' The description reinforces that 'family' should come from a previous call and that omitting it reads the families, but it does not add meaning significantly beyond the schema. Baseline 3 is appropriate because the schema carries the parameter documentation burden.

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 and resource: 'List the categories Ptitchef browses its recipes by.' It also clarifies the hierarchical relationship between families of ingredients and categories, which separates it from sibling tools like search_recipes, browse_recipes, and get_recipe. The two-call pattern (no argument for families, family slug for categories) makes the tool's purpose 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 gives explicit instructions for both usage modes: called without arguments it returns families, and passing a family's slug as 'family' returns its categories. It also warns against hand-building slugs. It does not explicitly name sibling alternatives or state when to prefer this tool over search/browse tools, but the context is clear enough for an agent to select it for category-tree navigation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scale_ingredientsRescale an ingredient listA
Read-onlyIdempotent

Rescale a list of ingredient lines to a different number of servings, without contacting any website. Give either 'factor' directly, or 'from_servings' and 'to_servings' and the factor is computed. Works on any French ingredient list, whatever its source, so it also serves a recipe pasted in by hand. Quantities in grams or millilitres are multiplied and rounded to readable values; a countable thing lands on a half when half of one can be poured, weighed or cut, as a boîte, a sachet, a feuille de gélatine or a cuillère can, and on a whole one when it cannot, as an oeuf, a jaune or a blanc; approximate measures such as a pinch or a handful have their count multiplied in whole units and stay in their own vocabulary. A line writing an article where a digit would go, as in 'un bouchon de rhum' or 'une pincée de sel', is read as one of that measure. Lines carrying no quantity are returned untouched and flagged. Prefer this over doing the arithmetic yourself.

ParametersJSON Schema
NameRequiredDescriptionDefault
factorNoMultiplier to apply. Use this or the from/to pair.
ingredientsYesIngredient lines, for example ['200 g de farine', '3 oeufs', 'sel'].
to_servingsNoHow many servings are wanted.
from_servingsNoHow many servings the list is written for.

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesYes
factorYes
ingredientsYes
scaled_countYes
rounded_countYesLines whose value rounding moved away from the exact product, not lines that could have been rounded.
unscaled_countYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnly, idempotent, and non-destructive behavior, but the description goes far beyond them: it explains rounding to readable values, the half/whole rounding rule based on countable items, treatment of approximate measures, parsing of articles as one unit, and that unquantified lines are returned untouched and flagged. This is rich behavioral disclosure with no contradiction to the 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?

The opening sentence front-loads the core purpose and the no-network constraint. The following sentences pack dense but relevant detail: parameter alternatives, French-list applicability, rounding rules with concrete examples, edge-case handling, and a closing usage preference. Every clause earns its place; there is no filler.

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 complexity, the description covers domain scope, parameter alternatives, rounding rules, approximate measures, and unquantified lines. An output schema exists, so return-value details are not required. The only notable omission is the fallback or error behavior when no scale parameter is provided, since the schema does not enforce one of factor/from_servings/to_servings.

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 describes every parameter, so the baseline is 3. The description adds meaning by explaining the relationship between factor and from_servings/to_servings, stating that the factor is computed from the serving pair. It also gives concrete ingredient-line examples. A minor gap is that it does not explicitly state what happens if neither factor nor the from/to pair is supplied, though the schema only requires ingredients.

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 and resource: 'Rescale a list of ingredient lines to a different number of servings,' and adds the key constraint 'without contacting any website.' This clearly distinguishes it from sibling recipe browsing and search tools, which focus on finding or retrieving recipes rather than transforming ingredient lines.

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?

Gives clear context: it works on any French ingredient list, including pasted recipes, and explicitly says 'Prefer this over doing the arithmetic yourself.' It does not name a competing sibling tool or state explicit exclusions, but no sibling targets the same operation, so the guidance is adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_by_ingredientsFind recipes from the ingredients a cook hasA
Read-onlyIdempotent

Find Ptitchef recipes from the ingredients a cook already has. Give one to 5 ingredients in French, as a cook would name them ("poulet", "citron"). The site counts every recipe it finds and serves one page of them, so 'total_available' can be far larger than the rows returned, and the rest cannot be reached. A longer list than the site's own form reads is refused rather than sent and silently cut.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows to render, 20 by default.
ingredientsYesOne to 5 ingredients, in French. The site reads no more than that.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesThe address the listing was read from.
kindYesHow the listing came to be, which decides what its total counts. 'topic' means the site answered a search from a page of its own; 'free_text' means it answered on its own terms.
pageYesThe page that was read, which is the one the site served.
askedYesWhat was asked for: a search, a category, or a list of ingredients. 'query' carries the same value under the name every source of recipes publishes it in.
notesYesWhat qualifies this answer: what its total counts, what it left out, and where the site answered from an address other than the one asked for. Read these before quoting a figure.
queryYesWhat was asked for, under the name a search publishes it in.
titleYesThe site's own heading for the listing.
foldedYesRows naming a recipe already held. A guide lists one recipe under two headings where it belongs to both; such a row is counted in 'rows_seen' and rendered once.
sourceYesThe site this answer was read from. Credit it when showing a row.
resultsYes
rows_seenYesRows the site served on this page, before any were set aside.
topic_slugYesThe category page this listing was served from. Pass it to browse_recipes as 'category' to read the topic's further pages, and its total where this answer carries none.
single_pageYesTrue when the site serves this listing on one page and offers no further one.
result_countYesRows rendered here.
total_availableYesRecipes the site says this listing holds. Null when it published no figure.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint, openWorldHint, and idempotentHint annotations, it discloses non-obvious behaviors: the site counts all matches but serves only one page, the rest cannot be reached, and an over-long ingredient list is refused rather than silently truncated. This is exactly the kind of behavioral context annotations do not capture.

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 short sentences with the purpose first, then instructions, then boundary behaviors. Every sentence earns its place and there is no filler or repetition of annotation data.

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 rich annotations and output schema, the description covers everything an agent needs to invoke it correctly: ingredient count, language, refusal behavior, and pagination limitations. The only minor gap is not explicitly routing to sibling search_recipes, but the ingredient-based purpose makes that choice obvious.

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 input schema already has 100% coverage, including the French requirement, one-to-five item bounds, and per-string length limits. The description adds helpful cook-friendly examples, but it largely restates the schema rather than adding deeper semantic meaning, so the 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 opens with a specific verb-resource pair ('Find Ptitchef recipes') and narrows the scope to ingredients a cook already has, which distinguishes it from sibling search_recipes, browse_recipes, and list_categories. It also clarifies the input language and gives examples, making the tool's identity unmistakable.

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?

It gives actionable usage instructions: one to five ingredients, in French, using natural cook phrasing with examples. It doesn't explicitly say when not to use this tool or name an alternative, so it stops short of a 5, but the context is clear enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_recipesSearch recipesA
Read-onlyIdempotent

Search recipes on Ptitchef by dish or ingredient. The site answers in one of two ways and the answer says which: it either sends the search to a category page of its own, whose total counts what that category holds, or it answers on its own terms on a single page whose total is the number of rows served. When a category answered, 'topic_slug' names it and browse_recipes reads its further pages. Some topics come back as a guide the site wrote instead, grouped under headings of its own and carrying no total; browse_recipes on the same 'topic_slug' reads their full listing. A search the site matched nothing for comes back with no row and a total of zero, which is an absence the site stated.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows to render, 20 by default. 'rows_seen' states what the page served.
queryYesA dish or an ingredient, in French, as a reader of the site would type it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesThe address the listing was read from.
kindYesHow the listing came to be, which decides what its total counts. 'topic' means the site answered a search from a page of its own; 'free_text' means it answered on its own terms.
pageYesThe page that was read, which is the one the site served.
askedYesWhat was asked for: a search, a category, or a list of ingredients. 'query' carries the same value under the name every source of recipes publishes it in.
notesYesWhat qualifies this answer: what its total counts, what it left out, and where the site answered from an address other than the one asked for. Read these before quoting a figure.
queryYesWhat was asked for, under the name a search publishes it in.
titleYesThe site's own heading for the listing.
foldedYesRows naming a recipe already held. A guide lists one recipe under two headings where it belongs to both; such a row is counted in 'rows_seen' and rendered once.
sourceYesThe site this answer was read from. Credit it when showing a row.
resultsYes
rows_seenYesRows the site served on this page, before any were set aside.
topic_slugYesThe category page this listing was served from. Pass it to browse_recipes as 'category' to read the topic's further pages, and its total where this answer carries none.
single_pageYesTrue when the site serves this listing on one page and offers no further one.
result_countYesRows rendered here.
total_availableYesRecipes the site says this listing holds. Null when it published no figure.

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a wealth of behavioral detail far beyond what annotations provide. It explains the two distinct response modes (category pages vs. single pages), the meaning of the total (category count vs. row count), the existence of topic_slug, the guide case with no total, and the zero-result case as an explicit absence. This is precisely the kind of non-obvious behavior an agent needs to know before calling the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

While the purpose is front-loaded in the opening sentence, the remainder is a long, winding explanation of response behavior packed into a single run-on paragraph. It lacks clear structure and could be shortened or bullet-pointed. The complexity is high, but the description is not concise; several sentences could be consolidated without losing information. This makes it harder for an agent to quickly extract the key points.

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 search tool with rich behavioral nuances, the description covers all essential aspects: response variants, total semantics, topic_slug usage, guides, and the no-result case. It also routes to browse_recipes for pagination. Since an output schema exists, the description need not explain return values, and it already explains the meaning of fields like rows_seen and total as they appear in responses. No critical missing context is apparent.

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 input schema already covers both parameters with clear descriptions (query in French, limit with default and meaning of rows_seen). The description adds no additional parameter-specific meaning, which is acceptable given 100% schema coverage. Baseline 3 is appropriate; the description does not need to repeat schema content.

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 first sentence clearly states a specific verb and resource: 'Search recipes on Ptitchef by dish or ingredient.' It also distinguishes itself from the sibling 'browse_recipes' by explaining that browse_recipes reads further pages of a category topic. This gives an agent a precise initial understanding of what the tool does and how it differs from a closely related tool.

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 provides explicit guidance on when to follow up with 'browse_recipes' (when a category answers or a guide is returned), which is a form of usage routing. However, it never mentions the alternative 'search_by_ingredients' or states when to choose this tool over it. It also does not explicitly state when NOT to use search_recipes, so the guidance is partial and relies on inference.

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. 7 tool updatesv1.0.0
    • First observedbrowse_recipes
    • First observedget_recipe
    • First observedget_recipe_translations
    • First observedlist_categories
    • First observedscale_ingredients
    • First observedsearch_by_ingredients
    • First observedsearch_recipes

TDQS

A4.4/5.0

Scored across 7 tools

Disambiguation4/5

Each tool targets a distinct action—listing, searching, browsing, reading, scaling, translating—but search_recipes and search_by_ingredients overlap conceptually, and get_recipe's built-in rescaling partially duplicates scale_ingredients. The descriptions are detailed enough to separate them, though an agent could still pause between those pairs.

Naming Consistency5/5

All tool names follow a clear snake_case verb_noun pattern: list_, search_, browse_, get_, scale_. The one longer name, search_by_ingredients, still fits predictably and does not break the convention.

Tool Count5/5

Seven tools is a well-scoped set for a recipe site: discovery, browsing, retrieval, scaling, and translations are each represented without unnecessary duplication. Each tool earns its place in the workflow.

Completeness5/5

The read-side recipe workflow is fully covered: find categories, search, browse, search by ingredients, read a recipe, rescale ingredients, and access translations. There are no dead ends, and CRUD operations are not relevant to this domain.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    C
    quality
    D
    maintenance
    Enables management of culinary recipes through web scraping from sites like Marmiton.org, recipe generation, ingredient management, and querying a MongoDB database of recipes, comments, users, and utensils.
    18
    -
  • A
    license
    A
    quality
    B
    maintenance
    MCP server that searches French recipes from Marmiton, reads ingredients and steps, and rescales quantities to any number of servings without requiring an API key.
    3
    136 npm
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables read-only recipe search and filtering on BBC Good Food by exposing available filter axes with counts, requiring no API key.
    4
    114 npm
    MIT