Supertoinette
Lee las recetas de Supertoinette y reescala sus cantidades de manera honesta. Sin clave API.
Documentación
mcp-supertoinette
Supertoinette es un sitio de cocina francés, uno de los más antiguos que siguen en pie. Sus recetas dan sus ingredientes, sus pasos, sus tiempos de preparación, cocción y reposo, el número de personas a las que alimentan y las fotografías del plato. Además de las recetas, mantiene un conjunto de páginas propias sobre qué beber con un plato, maridando un vino con él y diciendo a qué estilo pertenece.
Este servidor conecta un cliente de chat con ese sitio. Puedes buscar sus recetas, leer una con sus ingredientes reescalados al número de personas en tu mesa, recorrer sus categorías, leer una categoría página a página, y consultar qué sugiere beber con un plato. No necesita clave API ni cuenta.
Instalación
Instalación en un clic
Claude Code
claude mcp add supertoinette -- npx -y mcp-supertoinette
Claude Desktop, Cursor, y cualquier cliente que use el formato de configuración estándar
{
"mcpServers": {
"supertoinette": {
"command": "npx",
"args": ["-y", "mcp-supertoinette"]
}
}
}
Se requiere Node 24 o posterior, y no hay que establecer ninguna variable de entorno.
Con Docker
{
"mcpServers": {
"supertoinette": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-supertoinette:1.0.2"]
}
}
}
-i mantiene stdin abierto, que es por donde viaja el protocolo, y -t se omite
porque un TTY reescribe el flujo. El contenedor necesita HTTPS saliente hacia
www.supertoinette.com, y nada más: sin volumen, sin puerto, sin credencial.
Paquete, sin npm
Descarga mcp-supertoinette-1.0.2.mcpb desde
la última versión
y ábrelo. Un cliente que admita paquetes MCP lo instala por sí solo, sin npm
y sin archivo de configuración que editar. El paquete lleva sus dependencias, así que
no se descarga nada en el momento de la instalación.
Lo que puedes preguntar
- « Trouve-moi une recette de blanquette de veau. »
- "Read me that recipe for ten people."
- "What categories does the site file its recipes under?"
- "What wine goes with a beef bourguignon?"
- "Scale this ingredient list from my grandmother's notebook by three."
Supertoinette es un sitio francés, así que sus recetas se encuentran en francés. El camino
habitual va de una búsqueda a una receta: una fila lleva un id, y get_recipe
toma ese id.
Herramientas
| Herramienta | Qué hace |
|---|---|
get_recipe | Lee una receta, reescalada a un número de raciones si se pide. |
search_recipes | Encuentra recetas por plato o por ingrediente. |
list_categories | Lee las categorías bajo las que el sitio archiva sus recetas. |
browse_recipes | Lee una categoría, página a página. |
get_wine_pairings | Lee lo que el sitio sugiere beber con un plato. |
scale_ingredients | Reescala cualquier lista de ingredientes, sin pedir nada al sitio. |
get_recipe
Lee una receta completa y reescala sus ingredientes cuando se da un número de raciones.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
id | string, de 1 a 10 caracteres | sí | El número en la dirección de una receta, tal como lo lleva una fila. |
servings | entero, de 1 a 1000 | no | Reescala los ingredientes a este número de raciones. |
A cambio: title con el pictograma con el que el sitio la abre quitado, y
title_as_published exactamente como la escribió el sitio; url; description;
published_at; intro, la prosa impresa sobre el método; steps;
prep_minutes, cook_minutes, rest_minutes y total_minutes; category;
author; y rating, cada null donde la página no indica nada. yield dice
para qué se escribió la receta y a qué se reescaló. ingredients
lleva las líneas con los encabezados bajo los que la página las agrupa, que es lo que
ingredient_count cuenta, y el scaling de cada línea lee scaled, rounded o
unscaled.
search_recipes
Busca las recetas por un plato o un ingrediente, una página a la vez.
| Argumento | Tipo | Obligatorio | Qué hacer |
|---|---|---|---|
query | string, de 1 a 120 caracteres | sí | Un plato o un ingrediente, en francés. |
limit | entero, de 1 a 39 | no | Filas a servir. |
page | entero, de 1 a 1000 | no | Qué página de resultados leer, la primera por defecto. |
category | string, de 1 a 60 caracteres | no | Una categoría, escrita como la escribió el facets de una respuesta anterior. |
A cambio: filas que llevan id, que get_recipe toma, title,
title_as_published y url. Junto a ellas vienen page, last_page para la
página más alta a la que el sitio enlaza desde esta, result_count, rows_published
para las filas que la página tenía antes de que se mostrara alguna, total_available y
facets, que publica las redacciones de categoría que una búsqueda posterior toma. Nunca
construyas una redacción de categoría a mano: el sitio responde a una que no conoce con
una página que se lee como una ausencia.
list_categories
Lee las categorías bajo las que el sitio archiva sus recetas. No toma ningún argumento.
A cambio: categories, con category_count para las entradas que las dos
listas del sitio contienen, y el url del que se leyeron. Pasa una categoría a
browse_recipes.
browse_recipes
Lee una categoría, página a página.
| Argumento | Tipo | Obligatorio | Qué hacer |
|---|---|---|---|
category | string, de 1 a 80 caracteres | sí | Una categoría, tal como la publicó list_categories. |
limit | entero, de 1 a 30 | no | Filas a servir. |
page | entero, de 1 a 1000 | no | Qué página leer, la primera por defecto. |
A cambio: las filas y el sobre que search_recipes devuelve, con
last_page diciendo hasta dónde llega el listado.
get_wine_pairings
Lee lo que el sitio sugiere beber con un plato, de las páginas que escribió sobre el tema.
| Argumento | Tipo | Obligatorio | Qué hacer |
|---|---|---|---|
id | string, de 1 a 10 caracteres | uno de dos | El número en la dirección de un plato. |
page | entero, de 1 a 100 | uno de dos | Una página del listado propio de platos del sitio. |
A cambio: entradas que llevan el id, el dish bajo el nombre propio del sitio
para él, y style, el estilo de vino con el que la página abre, que es null donde
no escribió ninguno.
scale_ingredients
Aplica la misma aritmética a cualquier lista de líneas de ingredientes en francés, sin pedir nada al sitio.
| Argumento | Tipo | Obligatorio | Qué hacer |
|---|---|---|---|
ingredients | array de 1 a 200 strings, de 1 a 300 caracteres | sí | Las líneas a reescalar, tal como las escribió la receta. |
factor | número, mayor que 0 y hasta 100 | uno de dos | Por qué multiplicar las cantidades. |
from_servings | entero, de 1 a 1000 | uno de dos | Para cuántos se escribió la lista. |
to_servings | entero, de 1 a 1000 | uno de dos | A cuántos debería alimentar. |
Pasa factor, o el par from_servings y to_servings.
A cambio: las líneas reescaladas en la forma que get_recipe devuelve, cada una con
su scaling.
Reescalado de las cantidades
Una cantidad se indica en la unidad que le conviene, así que una línea puede volver en
una unidad distinta de la que usó la receta: 200 g multiplicados por veinte leen
4 kg.
Con qué finura se puede dividir un ingrediente depende de qué es. Una baguette se puede
cortar en dos, en tres o en cuatro; un huevo no se puede repartir. Una cantidad que cae
entre las dos se redondea, y la receta reescalada se aparta entonces un poco de
las proporciones de la original. La línea lleva rounded, y su nota dice qué se hizo.
Las cifras son la aritmética de este servidor, así que di que se recalcularon cuando las muestres. Una receta cuya página no indica ningún número de raciones no se puede poner a un número de personas, y la respuesta lo dice.
Configuración
Toda variable es opcional. Establécelas en el bloque env de la configuración de tu cliente.
| Variable | Por defecto | Qué hace |
|---|---|---|
STO_USER_AGENT | la identidad del proyecto | Nombra tu aplicación al sitio, con una dirección donde se pueda contactar a una persona. |
STO_MIN_INTERVAL_MS | 3000 | Intervalo entre dos peticiones, de 3000 a 60000. |
STO_TIMEOUT_MS | 20000 | Plazo para una petición, de 1000 a 120000. |
STO_MAX_RETRIES | 3 | Intentos tras un fallo transitorio, de 0 a 8. |
STO_CACHE_TTL_MS | 900000 | Cuánto tiempo permanece una página en memoria, de 0 a 86400000. |
STO_CACHE_MAX_ENTRIES | 200 | Páginas retenidas en memoria a la vez, de 1 a 5000. |
STO_LOG_LEVEL | error | silent, error, info o debug, escritos en stderr. |
Un valor fuera de su rango vuelve al valor por defecto, y la razón se escribe en stderr.
Errores
Cada fallo lleva uno de seis códigos, un mensaje y, donde ayuda, una pista que nombra el siguiente movimiento.
| Código | Qué ocurrió | Qué hacer |
|---|---|---|
not_found | El sitio respondió y no contiene tal receta ni página. | Comprueba el id con search_recipes. |
invalid_input | Los argumentos fueron rechazados antes de enviar ninguna solicitud. | Lee el mensaje, que nombra el argumento. |
rate_limited | El sitio pidió a este cliente que fuera más lento. | Espera el número de segundos que indica la pista y vuelve a llamar con los mismos argumentos. La receta sigue ahí. |
parse_failure | La página cargó y faltaba el contenido esperado. | Repórtalo en el rastreador de incidencias. |
network_error | La solicitud no se completó. | Inténtalo de nuevo en breve. |
timeout | La solicitud superó su plazo. | Aumenta STO_TIMEOUT_MS, o pide menos filas. |
Como biblioteca
La capa que lee el sitio se publica por separado, con su ritmo, su caché y sus errores, y sin ningún protocolo adjunto.
import { SupertoinetteClient } from "mcp-supertoinette/client";
const client = new SupertoinetteClient();
const { data, cached } = await client.getRecipe({ id: "10" });
console.log(data.title, data.ingredients.length, cached);
searchRecipes, browseRecipes, getRecipe y getPairings responden cada uno
a { data, cached }, y lanzan un error con uno de los seis códigos. El
mínimo de tres segundos entre dos solicitudes también se aplica aquí.
Ritmo y atribución
Las solicitudes salen de una en una con al menos tres segundos entre ellas, y ese
mínimo se mantiene sin importar cómo esté configurado el servidor. El User-Agent siempre termina con
la identidad del proyecto y una dirección donde se puede contactar a una persona.
Cada resultado lleva la dirección de la página de la que se leyó, y source nombra
el sitio. Las recetas, los títulos y las fotografías pertenecen a Supertoinette.
Este servidor MCP es un proyecto no oficial, sin afiliación con Supertoinette.
Privacidad
Este servidor no recopila nada sobre ti y no envía nada a su autor. Se ejecuta
en tu máquina, contacta a www.supertoinette.com y nada más, guarda sus respuestas en memoria
mientras se ejecuta y no escribe nada en el disco.
PRIVACY.md indica qué lleva una solicitud y qué ajustes cambian
cualquier parte de ello.
Desarrollo
npm install
npm run build:fixtures
npm test
npm run check
Las pruebas se ejecutan contra fixtures generados y no hacen ninguna solicitud de red. La suite en vivo,
npm run test:live, hace una solicitud por ruta y se ejecuta cada noche contra el
propio sitio.
Contribuciones
Los errores, preguntas e ideas van en el rastreador de incidencias. Las solicitudes de extracción son bienvenidas; abrir una incidencia primero ayuda a acordar la forma del cambio. Consulta CONTRIBUTING.md.
Licencia
MIT, consulta LICENSE. Las recetas pertenecen a Supertoinette y a sus autores.
mcp-supertoinette (français)
Supertoinette es un sitio de cocina francés, uno de los más antiguos que siguen en pie. Sus recetas dan sus ingredientes, sus pasos, sus tiempos de preparación, cocción y reposo, el número de comensales que alimentan y las fotografías del plato. Además de las recetas, mantiene un conjunto de páginas sobre qué beber con un plato, que le asocian un vino y dicen de qué estilo es.
Este servidor conecta un cliente de conversación con este sitio. Se pueden buscar recetas, leer una con sus ingredientes adaptados al número de comensales, recorrer sus categorías, leer una categoría página por página y consultar qué propone beber con un plato. Sin clave de API, sin cuenta.
Instalación
Instalación en un clic
Claude Code
claude mcp add supertoinette -- npx -y mcp-supertoinette
Claude Desktop, Cursor y cualquier cliente con formato de configuración estándar
{
"mcpServers": {
"supertoinette": {
"command": "npx",
"args": ["-y", "mcp-supertoinette"]
}
}
}
Se necesita Node 24 o más reciente, y no hay que rellenar ninguna variable de entorno.
Con Docker
{
"mcpServers": {
"supertoinette": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-supertoinette:1.0.2"]
}
}
}
-i mantiene abierta la entrada estándar, que es el canal del protocolo, y -t se
omite porque un TTY reescribe el flujo. El contenedor necesita acceso HTTPS
saliente a www.supertoinette.com, y nada más: sin volúmenes, sin
puertos, sin identificadores.
Bundle, sin npm
Descarga mcp-supertoinette-1.0.2.mcpb desde
la última publicación
y ábrelo. Un cliente que gestiona bundles MCP lo instala solo, sin npm y
sin archivo de configuración que modificar. El bundle lleva sus dependencias, por lo que
no se descarga nada en la instalación.
Qué se puede pedir
- «Encuéntrame una receta de blanquette de ternera.»
- «Léeme esta receta para diez personas.»
- «¿Bajo qué categorías clasifica el sitio sus recetas?»
- «¿Qué vino con un boeuf bourguignon?»
- «Multiplica por tres esta lista de ingredientes del cuaderno de mi abuela.»
Supertoinette es un sitio francés, por lo que sus recetas están en francés. El
camino habitual va de una búsqueda a una receta: una línea lleva un id, y
get_recipe retoma ese identificador.
Las herramientas
| Herramienta | Qué hace |
|---|---|
get_recipe | Lee una receta, adaptada a un número de porciones si se pide. |
search_recipes | Encuentra recetas por plato o por ingrediente. |
list_categories | Lee las categorías bajo las que el sitio clasifica sus recetas. |
browse_recipes | Lee una categoría, página por página. |
get_wine_pairings | Lee lo que el sitio propone beber con un plato. |
scale_ingredients | Adapta cualquier lista de ingredientes, sin consultar al sitio. |
get_recipe
Lee una receta completa y adapta sus ingredientes cuando se da un número de porciones.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
id | cadena, 1 a 10 caracteres | sí | El número en la dirección de una receta, llevado por una línea. |
servings | entero, 1 a 1000 | no | Adapta los ingredientes a este número de porciones. |
A cambio: title sin el pictograma con el que el sitio la abre, y
title_as_published exactamente como el sitio la escribió; url; description;
published_at; intro, la prosa impresa sobre el método; steps;
prep_minutes, cook_minutes, rest_minutes y total_minutes; category;
author; y rating, cada uno null donde la página no indica nada. yield dice
para qué está escrita la receta y hacia qué se ha adaptado. ingredients
lleva las líneas con los subtítulos bajo los que la página las agrupa, lo que
cuenta ingredient_count, y el scaling de cada línea vale scaled,
rounded o unscaled.
search_recipes
Busca recetas por plato o por ingrediente, una página a la vez.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
query | cadena, 1 a 120 caracteres | sí | Un plato o un ingrediente, en francés. |
limit | entero, 1 a 39 | no | Líneas a servir. |
page | entero, 1 a 1000 | no | La página de resultados a leer, la primera por defecto. |
category | cadena, 1 a 60 caracteres | no | Una categoría, escrita como los facets de una respuesta anterior. |
A cambio: líneas que llevan id, que get_recipe retoma, title,
title_as_published y url. También vienen page, last_page para la página más
lejana que el sitio enlaza desde esta, result_count,
rows_published para las líneas que la página contenía antes de cualquier renderizado,
total_available y facets, que publica las formulaciones de categoría que una
búsqueda posterior retoma. Nunca construyas una formulación a mano: el
sitio responde a la que no conoce con una página que se lee como una
ausencia.
list_categories
Lee las categorías bajo las que el sitio clasifica sus recetas. No toma ningún argumento.
A cambio: categories, con category_count para las entradas que las dos
listas del sitio contienen, y la url de donde se leyeron. Una categoría se
vuelve a dar a browse_recipes.
browse_recipes
Lee una categoría, página por página.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
category | cadena, 1 a 80 caracteres | sí | Una categoría, publicada por list_categories. |
limit | entero, 1 a 30 | no | Líneas a servir. |
page | entero, 1 a 1000 | no | La página a leer, la primera por defecto. |
A cambio: las líneas y el envoltorio que devuelve search_recipes, con
last_page que dice hasta dónde llega la lista.
get_wine_pairings
Lee lo que el sitio propone beber con un plato, según las páginas que ha escrito sobre el tema.
| Argumento | Tipo | Requerido | Qué hacer |
|---|---|---|---|
id | cadena, 1 a 10 caracteres | uno de los dos | El número en la dirección de un plato. |
page | entero, 1 a 100 | uno de los dos | Una página de la lista de platos del sitio. |
A cambio: entradas que llevan la id, el dish bajo el nombre que el sitio le
da, y style, el estilo de vino con el que la página se abre, null donde no
ha escrito ninguno.
scale_ingredients
Aplica la misma aritmética a cualquier lista de ingredientes en francés, sin consultar al sitio.
| Argumento | Tipo | Requisito | Lo que hace |
|---|---|---|---|
ingredients | matriz de 1 a 200 cadenas, de 1 a 300 caracteres | sí | Las líneas a adaptar, tal como las escribió la receta. |
factor | número, mayor que 0 hasta 100 | uno de los dos | Por lo que multiplicar las cantidades. |
from_servings | entero, de 1 a 1000 | uno de los dos | El número de comensales de la lista original. |
to_servings | entero, de 1 a 1000 | uno de los dos | El número de comensales deseado. |
Pase factor, o el par from_servings y to_servings.
A cambio: las líneas adaptadas en la forma que devuelve get_recipe, cada una
con su scaling.
La adaptación de las cantidades
Una cantidad se expresa en la unidad que le conviene. Después de la adaptación, una
línea puede aparecer en otra unidad distinta a la de la receta: 200 g
multiplicados por veinte dan 4 kg.
La finura con la que se corta un ingrediente depende de su naturaleza. Una baguette se
corta en dos, en tres o en cuatro; un huevo no se divide. Una cantidad
que cae entre ambos se redondea, y la receta adaptada se aleja entonces
un poco de las proporciones de la original. La línea lleva rounded, y su nota dice
lo que se ha hecho.
Los números son la aritmética de este servidor, así que diga que han sido recalculados cuando los muestre. Una receta cuya página no indica ningún número de raciones no puede adaptarse a un número de comensales, y la respuesta lo dice.
Configuración
Cada variable es opcional. Se colocan en el bloque env de la
configuración del cliente.
| Variable | Valor predeterminado | Lo que hace |
|---|---|---|
STO_USER_AGENT | la identidad del proyecto | Nombra su aplicación ante el sitio, con una dirección donde contactar a una persona. |
STO_MIN_INTERVAL_MS | 3000 | Intervalo entre dos solicitudes, de 3000 a 60000. |
STO_TIMEOUT_MS | 20000 | Tiempo límite de una solicitud, de 1000 a 120000. |
STO_MAX_RETRIES | 3 | Intentos después de un fallo temporal, de 0 a 8. |
STO_CACHE_TTL_MS | 900000 | Duración durante la cual una página permanece en memoria, de 0 a 86400000. |
STO_CACHE_MAX_ENTRIES | 200 | Páginas guardadas en memoria a la vez, de 1 a 5000. |
STO_LOG_LEVEL | error | silent, error, info o debug, escrito en la salida de error. |
Un valor fuera de su rango vuelve al valor predeterminado, y la razón se escribe en la salida de error.
Errores
Cada fallo lleva uno de los seis códigos, un mensaje y, cuando ayuda, una indicación del siguiente paso.
| Código | Lo que ha sucedido | Qué hacer |
|---|---|---|
not_found | El sitio ha respondido y no tiene ni esta receta ni esta página. | Verifique el identificador con search_recipes. |
invalid_input | Los argumentos fueron rechazados antes de cualquier solicitud. | Lea el mensaje, que nombra el argumento. |
rate_limited | El sitio pide a este cliente que reduzca la velocidad. | Espere los segundos indicados y vuelva a llamar con los mismos argumentos. La receta sigue ahí. |
parse_failure | La página se cargó y falta el contenido esperado. | Repórtelo en el seguimiento de incidentes. |
network_error | La solicitud no se completó. | Vuelva a intentarlo en breve. |
timeout | La solicitud superó su tiempo límite. | Aumente STO_TIMEOUT_MS, o pida menos líneas. |
Como biblioteca
La capa que lee el sitio se publica sola, con su ritmo, su caché y sus errores, sin protocolo adjunto.
import { SupertoinetteClient } from "mcp-supertoinette/client";
const client = new SupertoinetteClient();
const { data, cached } = await client.getRecipe({ id: "10" });
console.log(data.title, data.ingredients.length, cached);
searchRecipes, browseRecipes, getRecipe y getPairings responden cada uno
{ data, cached }, y lanzan un error con uno de los seis códigos. El mínimo de
tres segundos entre dos solicitudes también se aplica aquí.
Ritmo y atribución
Las solicitudes salen una a una con al menos tres segundos entre ellas, y este
mínimo se mantiene sin importar la configuración. El User-Agent termina
siempre con la identidad del proyecto y una dirección donde contactar a una persona.
Cada resultado lleva la dirección de la página de donde se leyó, y source nombra el
sitio. Las recetas, los títulos y las fotografías pertenecen a
Supertoinette.
Este MCP es un proyecto no oficial, sin afiliación con Supertoinette.
Privacidad
Este servidor no recopila nada sobre usted y no envía nada a su autor. Se ejecuta en
su máquina, solo adjunta www.supertoinette.com, guarda sus respuestas en memoria mientras
se ejecuta y no escribe nada en el disco. PRIVACY.md dice qué
lleva una solicitud y qué ajustes cambian eso.
Desarrollo
npm install
npm run build:fixtures
npm test
npm run check
Las pruebas se ejecutan sobre fixtures generados y no emiten ninguna solicitud.
La suite en vivo, npm run test:live, emite una solicitud por ruta y se ejecuta
cada noche contra el propio sitio.
Contribuir
Las anomalías, las preguntas y las ideas tienen su lugar en el seguimiento de incidentes. Las propuestas de modificación son bienvenidas; abrir un ticket primero ayuda a ponerse de acuerdo sobre la forma del cambio. Ver CONTRIBUTING.md.
Licencia
MIT, ver LICENSE. Las recetas pertenecen a Supertoinette y a sus autores.