Marmiton
Busca recetas de Marmiton, lee ingredientes y pasos, y ajusta las cantidades a cualquier número de porciones.
Documentación
mcp-marmiton
Marmiton es el sitio de cocina francés más grande, donde los cocineros caseros publican sus recetas desde 1999. Cada una incluye sus ingredientes con sus cantidades, los pasos a seguir, los tiempos de preparación y cocción, el número de porciones para el que está escrita y las valoraciones que las personas que la hicieron dejaron atrás.
Este servidor conecta un cliente de chat a ese sitio. Puedes buscar sus recetas por plato o por ingrediente, leer una completa con sus ingredientes y sus pasos, y reescalar las cantidades al número de personas en tu mesa, con cada línea diciendo si la cifra es exacta o fue ajustada para seguir siendo utilizable en una cocina. No necesita clave de API ni cuenta.
Instalación
Instalación en un clic
Claude Code
claude mcp add marmiton -- npx -y mcp-marmiton
Claude Desktop, Cursor y cualquier cliente que use el formato de configuración estándar
{
"mcpServers": {
"marmiton": {
"command": "npx",
"args": ["-y", "mcp-marmiton"]
}
}
}
Se requiere Node 24 o posterior, y no es necesario establecer ninguna variable de entorno.
Con Docker
{
"mcpServers": {
"marmiton": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-marmiton:2.0.1"]
}
}
}
-i mantiene stdin abierto, que es por donde viaja el protocolo, y -t se omite
porque una TTY reescribe el flujo. El contenedor necesita HTTPS saliente hacia
www.marmiton.org, y nada más: sin volumen, sin puerto, sin credencial.
Paquete, sin npm
Descarga mcp-marmiton-2.0.1.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 incluye sus dependencias, por lo que
no se descarga nada en el momento de la instalación.
Lo que puedes pedir
- « Trouve-moi une recette de tarte aux pommes. »
- "Léeme esa receta para seis personas en lugar de cuatro."
- "¿Qué puedo hacer con calabacines y chèvre?"
- "Aquí tienes una receta que copié de un libro, escálala por 1.5 para mí."
- "¿Cuánto tarda en cocinarse la segunda?"
Marmiton es un sitio francés, por lo que sus recetas se encuentran en francés: tarte aux pommes, poulet curry coco. El camino habitual va de una búsqueda a una lectura:
search_recipes nombra un id, y get_recipe toma ese id.
Herramientas
| Herramienta | Qué hace |
|---|---|
search_recipes | Encuentra recetas por plato o por ingrediente. |
get_recipe | Lee una receta, reescalada a un número de porciones si se pide. |
scale_ingredients | Reescala cualquier lista de ingredientes, sin solicitar al sitio. |
El servidor solo lee. No publica nada en Marmiton.
search_recipes
Busca las recetas por un plato o un ingrediente. Marmiton coincide con las letras iniciales de una palabra, por lo que una consulta devuelve lo que el sitio clasificó para ella, y la respuesta indica cuando los títulos no contienen ninguna de las palabras solicitadas.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
query | cadena, hasta 200 caracteres | sí | Qué buscar, en francés. |
limit | entero, de 1 a 30, por defecto 10 | no | Recetas a servir de esta página de resultados. |
A cambio: filas que llevan id, que get_recipe toma; title; url; y
image_url, que es null para una receta publicada sin foto. Junto a
ellas vienen result_count y total_available, las recetas en esta página antes de
aplicar limit. El robots.txt de Marmiton no permite paginar a través de los resultados de
búsqueda, por lo que una página es lo que una búsqueda lee: afina la consulta para ver otras
recetas.
get_recipe
Lee una receta completa y reescala sus cantidades cuando se da un número de porciones.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
id | cadena de dígitos | uno de dos | El id de la receta de Marmiton, como lo devolvió search_recipes. |
url | una URL de marmiton.org | uno de dos | La dirección de la receta, usada cuando id está ausente. |
servings | número, mayor que 0 y hasta 500 | no | Reescala las cantidades a este número de porciones. |
A cambio: title, url, ingredients, steps, prep_minutes,
cook_minutes, total_minutes, category, author, rating y nutrition,
cada uno null cuando la página no publica ninguno. yield dice para qué fue escrita la
receta y a qué fue reescalada: original_count, original_text,
requested, unit para lo que se cuenta, y factor para el multiplicador
aplicado. Cada ingrediente lleva original, text, amount, amountMax para un
rango, unit, y scaling, que se lee scaled, rounded o unscaled. Las
cifras son aritmética de este servidor, así que di que fueron recalculadas cuando las muestres.
nutrition describe la receta tal como fue publicada, en su propio número de
porciones.
scale_ingredients
Aplica la misma aritmética a cualquier lista de líneas de ingredientes, sin solicitar al sitio, por lo que funciona con una receta copiada de un libro o de un cuaderno familiar.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
ingredients | matriz de 1 a 100 cadenas, hasta 300 caracteres | sí | Las líneas a reescalar, en francés. |
factor | número, mayor que 0 y hasta 100 | uno de dos | El multiplicador a aplicar. |
from_servings | número, mayor que 0 y hasta 500 | uno de dos | Para cuántas porciones está escrita la lista. |
to_servings | número, mayor que 0 y hasta 500 | uno de dos | Cuántas porciones se desean. |
Pasa factor, o el par from_servings y to_servings.
A cambio: el factor usado, los ingredients reescalados en la forma
que get_recipe devuelve, y scaled_count, rounded_count y unscaled_count,
que cuentan las líneas cuyo valor el redondeo movió.
Escalado de las cantidades
Cada ingrediente vuelve con una marca scaling que dice qué pudo hacer el reescalado
con su cantidad.
| Marca | Significado | Ejemplo |
|---|---|---|
scaled | El valor es el producto en sí. | 3 oeufs ×2 → 6 oeufs |
rounded | El valor se movió para seguir siendo utilizable. | 25 cl de lait ×0.667 → 17 cl de lait |
unscaled | No lleva cantidad, por lo que se deja tal como está escrito. | sel, coriandre |
Una cantidad se expresa en la unidad que le conviene, por lo que una línea puede volver en una
unidad diferente de la que usó la receta: 200 g multiplicados por veinte se leen
4 kg.
Lo finamente que 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 compartir. Una cantidad que cae
entre los dos se redondea, y la receta reescalada se aleja entonces un poco de
las proporciones del original. La línea lleva rounded, y su note dice
qué se hizo.
Configuración
Toda variable es opcional. Establécelas en el bloque env de la configuración de tu cliente.
| Variable | Por defecto | Qué hace |
|---|---|---|
MARMITON_USER_AGENT | la identidad del proyecto | Nombra tu aplicación ante Marmiton, con una dirección donde se pueda contactar a una persona. |
MARMITON_MIN_INTERVAL_MS | 1000 | Intervalo entre dos solicitudes, de 500 a 60000. Una cifra por debajo del mínimo se rechaza y se usa esta. |
MARMITON_TIMEOUT_MS | 15000 | Plazo para una solicitud, de 1000 a 120000. |
MARMITON_MAX_RETRIES | 3 | Intentos tras un fallo transitorio, de 0 a 10. |
MARMITON_CACHE_TTL_MS | 900000 | Cuánto tiempo permanece una página en memoria, de 0 a 86400000. |
MARMITON_CACHE_MAX_ENTRIES | 200 | Páginas retenidas en memoria a la vez, de 0 a 10000. |
MARMITON_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é pasó | Qué hacer |
|---|---|---|
not_found | Marmiton respondió y no tiene tal receta. | Comprueba el id con search_recipes. |
invalid_input | Los argumentos fueron rechazados antes de enviar cualquier solicitud. | Lee el mensaje, que nombra el argumento. |
rate_limited | Marmiton pidió a este cliente que se ralentizara. | Espera el número de segundos que nombra la pista y vuelve a llamar con los mismos argumentos. La receta sigue ahí. |
parse_failure | La página se cargó y faltaba el contenido esperado. | Repórtalo en el rastreador de problemas. |
network_error | La solicitud no se completó. | Inténtalo de nuevo en breve. |
timeout | La solicitud superó su plazo. | Aumenta MARMITON_TIMEOUT_MS. |
Como biblioteca
La capa que lee Marmiton se publica por separado, con su ritmo, su caché y sus errores, y sin ningún protocolo adjunto.
import { MarmitonClient } from "mcp-marmiton/client";
const client = new MarmitonClient();
const { data, cached } = await client.getRecipe({ id: "18257" });
console.log(data.title, data.ingredients.length, cached);
search y getRecipe responden cada uno { data, cached }, y lanzan un error
que lleva uno de los seis códigos. El intervalo mínimo entre dos solicitudes también se aplica aquí.
Ritmo y atribución
Las solicitudes se envían de una en una con un intervalo mínimo 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. Todo se lee
del schema.org JSON-LD que Marmiton publica para máquinas, y las rutas que su
robots.txt prohíbe se dejan intactas.
Cada resultado incluye el título y la dirección de la receta, y get_recipe
incluye el autor cuando la página lo nombra, junto con attribution, el título
y la dirección escritos en una sola línea.
Las recetas pertenecen a Marmiton y a los cocineros que las escribieron. Este servidor MCP es un proyecto no oficial, sin afiliación con Marmiton.
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.marmiton.org 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 accesorios generados y no hacen ninguna solicitud de red. El conjunto en vivo,
npm run test:live, hace una solicitud por ruta y se ejecuta cada noche contra el
sitio mismo.
Contribuciones
Errores, preguntas e ideas van en el rastreador de problemas. Las solicitudes de extracción son bienvenidas; abrir un problema primero ayuda a acordar la forma del cambio. Ver CONTRIBUTING.md.
Licencia
MIT, ver LICENSE. Las recetas pertenecen a Marmiton y a sus autores.
mcp-marmiton (francés)
Marmiton es el sitio de cocina francés más grande, donde cocineros publican sus recetas desde 1999. Cada una da sus ingredientes con sus cantidades, los pasos a seguir, los tiempos de preparación y cocción, el número de porciones para el que está escrita, y las calificaciones dejadas por quienes la han hecho.
Este servidor conecta un cliente de conversación a este sitio. Se pueden buscar recetas por plato o por ingrediente, leer una completa con sus ingredientes y sus pasos, y adaptar las cantidades al número de comensales, cada línea diciendo si el número es exacto o si se ha desplazado para seguir siendo utilizable en la cocina. Sin clave de API, sin cuenta.
Instalación
Instalación en un clic
Claude Code
claude mcp add marmiton -- npx -y mcp-marmiton
Claude Desktop, Cursor, y cualquier cliente con formato de configuración estándar
{
"mcpServers": {
"marmiton": {
"command": "npx",
"args": ["-y", "mcp-marmiton"]
}
}
}
Se requiere Node 24 o más reciente, y no hay ninguna variable de entorno que rellenar.
Con Docker
{
"mcpServers": {
"marmiton": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-marmiton:2.0.1"]
}
}
}
-i mantiene la entrada estándar abierta, que es el canal del protocolo, y -t se
omite porque un TTY reescribe el flujo. El contenedor necesita acceso HTTPS
saliente a www.marmiton.org, y nada más: sin volúmenes, sin puertos,
sin identificadores.
Bundle, sin npm
Descargue mcp-marmiton-2.0.1.mcpb desde
la última publicación
y ábralo. 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 tanto
nada se descarga en la instalación.
Lo que se puede pedir
- «Encuéntrame una receta de tarta de manzana.»
- «Léeme esta receta para seis personas en lugar de cuatro.»
- «¿Qué puedo hacer con calabacines y queso de cabra?»
- «Aquí hay una receta copiada de un libro, multiplícala por 1,5.»
- «¿Cuánto tiempo de cocción para la segunda?»
Marmiton es un sitio francés, por lo tanto sus recetas se encuentran en francés: tarte aux pommes, poulet curry coco. El camino habitual va de una búsqueda a una
lectura: search_recipes nombra un id, y get_recipe retoma ese
identificador.
Las herramientas
| Herramienta | Lo que hace |
|---|---|
search_recipes | Encuentra recetas por plato o por ingrediente. |
get_recipe | Lee una receta, adaptada a un número de porciones si se pide. |
scale_ingredients | Adapta cualquier lista de ingredientes, sin consulta al sitio. |
El servidor solo lee. No publica nada en Marmiton.
search_recipes
Busca recetas por plato o por ingrediente. Marmiton hace coincidir las primeras letras de una palabra, por lo tanto una consulta devuelve lo que el sitio ha clasificado para ella, y la respuesta señala cuando los títulos no llevan ninguna de las palabras pedidas.
| Argumento | Tipo | Requerido | Lo que hace |
|---|---|---|---|
query | cadena, hasta 200 caracteres | sí | Lo que se busca, en francés. |
limit | entero, 1 a 30, defecto 10 | no | Recetas a servir desde esta página de resultados. |
En retorno: líneas que llevan id, que get_recipe retoma; title;
url; y image_url, null para una receta publicada sin foto. Vienen
también result_count y total_available, las recetas de esta página antes
de la aplicación de limit. El robots.txt de Marmiton prohíbe paginar los
resultados de búsqueda, por lo tanto una búsqueda lee una página: afine la consulta
para ver otras recetas.
get_recipe
Lee una receta completa, y adapta sus cantidades cuando se da un número de porciones.
| Argumento | Tipo | Requerido | Lo que hace |
|---|---|---|---|
id | cadena de dígitos | uno de los dos | El identificador Marmiton devuelto por search_recipes. |
url | una dirección marmiton.org | uno de los dos | La dirección de la receta, usada a falta de id. |
servings | número, más de 0 hasta 500 | no | Adapta las cantidades a este número de porciones. |
En retorno: title, url, ingredients, steps, prep_minutes,
cook_minutes, total_minutes, category, author, rating y nutrition,
cada uno null cuando la página no publica ninguno. yield dice para qué está escrita la receta
y hacia qué se ha adaptado: original_count, original_text,
requested, unit para lo que se cuenta, y factor para el multiplicador
aplicado. Cada ingrediente lleva original, text, amount, amountMax para
un intervalo, unit, y scaling, que vale scaled, rounded o unscaled.
Los números son la aritmética de este servidor, por lo tanto diga que han sido
recalculados cuando los muestre. nutrition describe la receta tal como
fue publicada, para su propio número de porciones.
scale_ingredients
Aplica la misma aritmética a cualquier lista de ingredientes, sin consulta al sitio, por lo tanto a una receta copiada de un libro o de un cuaderno familiar.
| Argumento | Tipo | Requerido | Lo que hace |
|---|---|---|---|
ingredients | matriz de 1 a 100 cadenas, hasta 300 caracteres | sí | Las líneas a adaptar, en francés. |
factor | número, más de 0 hasta 100 | uno de los dos | El multiplicador a aplicar. |
from_servings | número, más de 0 hasta 500 | uno de los dos | El número de porciones para el que está escrita la lista. |
to_servings | número, más de 0 hasta 500 | uno de los dos | El número de porciones deseado. |
Pase factor, o el par from_servings y to_servings.
En retorno: el factor empleado, los ingredients adaptados en la forma que
devuelve get_recipe, y scaled_count, rounded_count y unscaled_count, que
cuentan las líneas cuyo redondeo ha desplazado el valor.
La adaptación de las cantidades
Cada ingrediente vuelve con una bandera scaling que dice lo que la adaptación ha
podido hacer con su cantidad.
| Bandera | Lo que significa | Ejemplo |
|---|---|---|
scaled | El valor es el producto mismo. | 3 oeufs ×2 → 6 oeufs |
rounded | El valor se ha desplazado para seguir siendo utilizable. | 25 cl de lait ×0,667 → 17 cl de lait |
unscaled | No lleva ninguna cantidad, se deja tal cual. | sel, coriandre |
Una cantidad se expresa en la unidad que le conviene. Después de la adaptación, una
línea puede aparecer en otra unidad que la de la receta: 200 g
multiplicados por veinte dan 4 kg.
La finura con la que un ingrediente se corta 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 las dos se redondea, y la receta adaptada se aleja entonces
un poco de las proporciones de la original. La línea lleva rounded, y su note dice
lo que se ha hecho.
Configuración
Cada variable es opcional. Se colocan en el bloque env de la
configuración del cliente.
| Variable | Defecto | Lo que hace |
|---|---|---|
MARMITON_USER_AGENT | la identidad del proyecto | Nombra su aplicación ante Marmiton, con una dirección donde contactar a una persona. |
MARMITON_MIN_INTERVAL_MS | 1000 | Intervalo entre dos solicitudes, de 500 a 60000. Un valor por debajo del mínimo se rechaza en favor de este. |
MARMITON_TIMEOUT_MS | 15000 | Tiempo de espera de una solicitud, de 1000 a 120000. |
MARMITON_MAX_RETRIES | 3 | Intentos después de un fallo pasajero, de 0 a 10. |
MARMITON_CACHE_TTL_MS | 900000 | Duración durante la cual una página permanece en memoria, de 0 a 86400000. |
MARMITON_CACHE_MAX_ENTRIES | 200 | Páginas guardadas en memoria a la vez, de 0 a 10000. |
MARMITON_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 sucedió | Qué hacer |
|---|---|---|
not_found | Marmiton respondió y no tiene esta receta. | 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 | Marmiton 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 cargó y el contenido esperado está ausente. | Repórtelo en el seguimiento de incidentes. |
network_error | La solicitud no se completó. | Reintente en breve. |
timeout | La solicitud superó su tiempo de espera. | Aumente MARMITON_TIMEOUT_MS. |
Como biblioteca
La capa que lee Marmiton se publica por separado, con su ritmo, su caché y sus errores, sin protocolo adjunto.
import { MarmitonClient } from "mcp-marmiton/client";
const client = new MarmitonClient();
const { data, cached } = await client.getRecipe({ id: "18257" });
console.log(data.title, data.ingredients.length, cached);
search y getRecipe responden cada uno { data, cached }, y lanzan un error con uno de los seis códigos. El intervalo mínimo entre dos solicitudes también se aplica aquí.
Ritmo y atribución
Las solicitudes se envían una a una con un intervalo mínimo entre ellas, y este mínimo se mantiene independientemente de la configuración. El User-Agent siempre termina con la identidad del proyecto y una dirección para contactar a una persona. Todo se lee del JSON-LD schema.org que Marmiton publica para las máquinas, y las rutas que su robots.txt prohíbe se dejan en paz.
Cada resultado incluye el título y la dirección de la receta, y get_recipe incluye el autor cuando la página lo nombra, así como attribution, el título y la dirección escritos en una línea.
Las recetas pertenecen a Marmiton y a los cocineros que las escribieron. Este MCP es un proyecto no oficial, sin afiliación con Marmiton.
Privacidad
Este servidor no recopila nada sobre usted y no envía nada a su autor. Se ejecuta en su máquina, solo se conecta a www.marmiton.org, 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 sitio mismo.
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 acordar la forma del cambio. Ver CONTRIBUTING.md.
Licencia
MIT, ver LICENSE. Las recetas pertenecen a Marmiton y a sus autores.