Supertoinette

Lee las recetas de Supertoinette y reescala sus cantidades de manera honesta. Sin clave API.

Documentación

mcp-supertoinette

npm CI license MCP Registry Glama M8ven LobeHub Install in Cursor Install in VS Code

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.

Versión francesa


Instalación

Instalación en un clic

Install in Cursor Install in VS Code

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

HerramientaQué hace
get_recipeLee una receta, reescalada a un número de raciones si se pide.
search_recipesEncuentra recetas por plato o por ingrediente.
list_categoriesLee las categorías bajo las que el sitio archiva sus recetas.
browse_recipesLee una categoría, página a página.
get_wine_pairingsLee lo que el sitio sugiere beber con un plato.
scale_ingredientsReescala 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.

ArgumentoTipoObligatorioQué hace
idstring, de 1 a 10 caracteresEl número en la dirección de una receta, tal como lo lleva una fila.
servingsentero, de 1 a 1000noReescala 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.

ArgumentoTipoObligatorioQué hacer
querystring, de 1 a 120 caracteresUn plato o un ingrediente, en francés.
limitentero, de 1 a 39noFilas a servir.
pageentero, de 1 a 1000noQué página de resultados leer, la primera por defecto.
categorystring, de 1 a 60 caracteresnoUna 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.

ArgumentoTipoObligatorioQué hacer
categorystring, de 1 a 80 caracteresUna categoría, tal como la publicó list_categories.
limitentero, de 1 a 30noFilas a servir.
pageentero, de 1 a 1000noQué 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.

ArgumentoTipoObligatorioQué hacer
idstring, de 1 a 10 caracteresuno de dosEl número en la dirección de un plato.
pageentero, de 1 a 100uno de dosUna 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.

ArgumentoTipoObligatorioQué hacer
ingredientsarray de 1 a 200 strings, de 1 a 300 caracteresLas líneas a reescalar, tal como las escribió la receta.
factornúmero, mayor que 0 y hasta 100uno de dosPor qué multiplicar las cantidades.
from_servingsentero, de 1 a 1000uno de dosPara cuántos se escribió la lista.
to_servingsentero, de 1 a 1000uno de dosA 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.

VariablePor defectoQué hace
STO_USER_AGENTla identidad del proyectoNombra tu aplicación al sitio, con una dirección donde se pueda contactar a una persona.
STO_MIN_INTERVAL_MS3000Intervalo entre dos peticiones, de 3000 a 60000.
STO_TIMEOUT_MS20000Plazo para una petición, de 1000 a 120000.
STO_MAX_RETRIES3Intentos tras un fallo transitorio, de 0 a 8.
STO_CACHE_TTL_MS900000Cuánto tiempo permanece una página en memoria, de 0 a 86400000.
STO_CACHE_MAX_ENTRIES200Páginas retenidas en memoria a la vez, de 1 a 5000.
STO_LOG_LEVELerrorsilent, 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ódigoQué ocurrióQué hacer
not_foundEl sitio respondió y no contiene tal receta ni página.Comprueba el id con search_recipes.
invalid_inputLos argumentos fueron rechazados antes de enviar ninguna solicitud.Lee el mensaje, que nombra el argumento.
rate_limitedEl 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_failureLa página cargó y faltaba el contenido esperado.Repórtalo en el rastreador de incidencias.
network_errorLa solicitud no se completó.Inténtalo de nuevo en breve.
timeoutLa 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)

Versión en inglés

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

Install in Cursor Install in VS Code

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

HerramientaQué hace
get_recipeLee una receta, adaptada a un número de porciones si se pide.
search_recipesEncuentra recetas por plato o por ingrediente.
list_categoriesLee las categorías bajo las que el sitio clasifica sus recetas.
browse_recipesLee una categoría, página por página.
get_wine_pairingsLee lo que el sitio propone beber con un plato.
scale_ingredientsAdapta 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.

ArgumentoTipoRequeridoQué hace
idcadena, 1 a 10 caracteresEl número en la dirección de una receta, llevado por una línea.
servingsentero, 1 a 1000noAdapta 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.

ArgumentoTipoRequeridoQué hace
querycadena, 1 a 120 caracteresUn plato o un ingrediente, en francés.
limitentero, 1 a 39noLíneas a servir.
pageentero, 1 a 1000noLa página de resultados a leer, la primera por defecto.
categorycadena, 1 a 60 caracteresnoUna 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.

ArgumentoTipoRequeridoQué hace
categorycadena, 1 a 80 caracteresUna categoría, publicada por list_categories.
limitentero, 1 a 30noLíneas a servir.
pageentero, 1 a 1000noLa 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.

ArgumentoTipoRequeridoQué hacer
idcadena, 1 a 10 caracteresuno de los dosEl número en la dirección de un plato.
pageentero, 1 a 100uno de los dosUna 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.

ArgumentoTipoRequisitoLo que hace
ingredientsmatriz de 1 a 200 cadenas, de 1 a 300 caracteresLas líneas a adaptar, tal como las escribió la receta.
factornúmero, mayor que 0 hasta 100uno de los dosPor lo que multiplicar las cantidades.
from_servingsentero, de 1 a 1000uno de los dosEl número de comensales de la lista original.
to_servingsentero, de 1 a 1000uno de los dosEl 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.

VariableValor predeterminadoLo que hace
STO_USER_AGENTla identidad del proyectoNombra su aplicación ante el sitio, con una dirección donde contactar a una persona.
STO_MIN_INTERVAL_MS3000Intervalo entre dos solicitudes, de 3000 a 60000.
STO_TIMEOUT_MS20000Tiempo límite de una solicitud, de 1000 a 120000.
STO_MAX_RETRIES3Intentos después de un fallo temporal, de 0 a 8.
STO_CACHE_TTL_MS900000Duración durante la cual una página permanece en memoria, de 0 a 86400000.
STO_CACHE_MAX_ENTRIES200Páginas guardadas en memoria a la vez, de 1 a 5000.
STO_LOG_LEVELerrorsilent, 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ódigoLo que ha sucedidoQué hacer
not_foundEl sitio ha respondido y no tiene ni esta receta ni esta página.Verifique el identificador con search_recipes.
invalid_inputLos argumentos fueron rechazados antes de cualquier solicitud.Lea el mensaje, que nombra el argumento.
rate_limitedEl 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_failureLa página se cargó y falta el contenido esperado.Repórtelo en el seguimiento de incidentes.
network_errorLa solicitud no se completó.Vuelva a intentarlo en breve.
timeoutLa 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.