Ptitchef
Busca recetas de Ptitchef, lee una y reescala a cualquier número de porciones. Sin clave API.
Documentación
mcp-ptitchef
Ptitchef es un sitio de cocina francés donde cocineros caseros publican sus recetas. Cada una incluye sus ingredientes, sus pasos, a menudo fotografiados uno a uno, sus tiempos de preparación y cocción, su costo, sus cifras nutricionales y las valoraciones que dejaron sus lectores. El sitio archiva sus recetas bajo un árbol de familias de ingredientes, y publica muchas de ellas en varios idiomas.
Este servidor conecta un cliente de chat con ese sitio. Puedes recorrer el árbol de categorías, buscar recetas por plato o por ingrediente, navegar por una categoría o por una de las listas permanentes del sitio, preguntar qué se puede hacer con lo que hay en la nevera, leer una receta con sus ingredientes reescalados al número de personas en tu mesa, y encontrar los otros idiomas en los que se publicó una receta. No necesita clave de API ni cuenta.
Instalación
Instalación en un clic
Claude Code
claude mcp add ptitchef -- npx -y mcp-ptitchef
Claude Desktop, Cursor, y cualquier cliente que use el formato de configuración estándar
{
"mcpServers": {
"ptitchef": {
"command": "npx",
"args": ["-y", "mcp-ptitchef"]
}
}
}
Se requiere Node 24 o posterior, y no es necesario establecer ninguna variable de entorno.
Con Docker
{
"mcpServers": {
"ptitchef": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-ptitchef:1.0.1"]
}
}
}
-i mantiene abierto stdin, que es por donde viaja el protocolo, y -t se omite
porque un TTY reescribe el flujo. El contenedor necesita HTTPS saliente hacia
www.ptitchef.com, y nada más: sin volumen, sin puerto, sin credencial.
Paquete, sin npm
Descarga mcp-ptitchef-1.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, así que
no se descarga nada en el momento de la instalación.
Lo que puedes preguntar
- « Qu'est-ce que Ptitchef a comme recettes de chou kale ? »
- "What can I cook with courgettes, feta and mint?"
- "Read me that gratin for eight people."
- "Show me the highest rated recipes on the site."
- "Is that recipe published in Spanish too?"
Ptitchef es un sitio francés, así que sus recetas se encuentran en francés. El camino habitual
va de un listado a una receta: una fila lleva un id, y get_recipe toma
ese id.
Herramientas
| Herramienta | Qué hace |
|---|---|
list_categories | Recorre el árbol de familias de ingredientes bajo el que el sitio archiva. |
search_recipes | Encuentra recetas por plato o por ingrediente. |
browse_recipes | Lee una página de categoría página a página, o una lista permanente. |
search_by_ingredients | Responde qué se puede hacer con lo que un cocinero ya tiene. |
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. |
get_recipe_translations | Lista los otros idiomas en los que se publicó una receta. |
Empieza en list_categories. El sitio te da las direcciones correctas, lo que
evita construir una a mano: una dirección construida así aterriza en la página principal
del sitio.
list_categories
Lee el árbol bajo el que el sitio archiva sus recetas. Llamada sin argumentos, devuelve
las familias; pasa el slug de una familia de vuelta como family para leer lo que
contiene.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
family | cadena, de 1 a 80 caracteres | no | El slug de una familia, para leer las categorías bajo ella. |
limit | entero, de 1 a 200, por defecto 20 | no | Filas a servir. |
A cambio: filas que llevan slug, que vuelve como family o como
category; title en la propia redacción del sitio; url; description, que es
null donde la página no lleva ninguna; y sample_children para las categorías un
nivel más abajo.
search_recipes
Busca recetas por un plato o un ingrediente.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
query | cadena, de 1 a 120 caracteres | sí | Un plato o un ingrediente, en francés. |
limit | entero, de 1 a 100, por defecto 20 | no | Filas a servir. |
A cambio: results, filas que llevan id, title, url, image_url,
rating, rating_count y review_count, un contador para el que la página no imprime nada
siendo null. El sobre dice cómo respondió el sitio: kind lee
category cuando la respuesta vino de una página de categoría propia, cuyo
total_available cuenta toda esa categoría, y free_text cuando el sitio
respondió en sus propios términos en una sola página, donde el total cuenta las filas
servidas. Esos dos totales cuentan cosas diferentes. kind también lee guide para un
tema que el sitio escribió a mano, donde las filas llevan un nombre y una dirección y no existe
total. Junto vienen result_count, rows_seen, page, single_page y
url. Un listado marcado single_page cuyo total supera rows_seen tiene un
resto que el sitio cuenta y no sirve.
browse_recipes
Lee una página de categoría página a página, o una de las listas permanentes del sitio.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
category | cadena, de 1 a 120 caracteres | no | Un slug de categoría, como lo publicó list_categories. |
listing | latest, top_rated o most_viewed | no | Una lista permanente, leída en lugar de una categoría. |
page | entero, de 1 a 1000 | no | La página de una categoría a leer. Una lista permanente tiene una página. |
limit | entero, de 1 a 100, por defecto 20 | no | Filas a servir. |
A cambio: el sobre search_recipes vuelve, con kind leyendo
category, standing o topic. page es la página que sirvió el sitio, que es
la primera otra vez cuando la página pedida está más allá de la última.
search_by_ingredients
Responde qué se puede hacer con los ingredientes que un cocinero ya tiene.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
ingredients | matriz de 1 a 5 cadenas, de 1 a 60 caracteres | sí | Los ingredientes disponibles, en francés. |
limit | entero, de 1 a 100, por defecto 20 | no | Filas a servir. |
A cambio: el sobre que devuelven los otros listados, con kind leyendo
fridge. El sitio coincide con su propio vocabulario, así que un ingrediente que escribe
de manera diferente estrecha la respuesta en lugar de ampliarla.
get_recipe
Lee una receta completa y reescala sus ingredientes cuando se da un número de porciones.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
id | cadena, de 1 a 300 caracteres | sí | El id de una fila de una búsqueda o un listado. |
servings | entero, de 1 a 500 | no | Reescala los ingredientes a este número de porciones. |
A cambio: title, url, description, image_url, category, cuisine,
difficulty en la propia redacción del sitio, author, published, modified,
rating, rating_count, review_count, prep_minutes, cook_minutes,
total_minutes, nutrition tal como se publicó para el tamaño de porción que nombra,
estimated_cost, keywords, faq y translations, cada null donde la
página no indica nada. steps lleva el método con una línea por paso, y
illustrated_steps los mismos pasos con la fotografía que el sitio tomó de cada uno.
yield dice para qué se escribió la receta y a qué se reescaló. Cada
ingrediente lleva scaling, que se lee scaled, rounded o unscaled: léelo
antes de citar una cantidad, ya que rounded se movió para seguir siendo utilizable en una
cocina.
scale_ingredients
Aplica la misma aritmética a cualquier lista de líneas de ingredientes en francés, sin solicitar al sitio.
| 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, el ingredients reescalado en la forma
get_recipe que devuelve, y scaled_count, rounded_count y unscaled_count.
get_recipe_translations
Lista los otros idiomas en los que se publicó una receta, usando el emparejamiento que el sitio publica por sí mismo.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
id | cadena, de 1 a 300 caracteres | sí | El id de una fila de una búsqueda o un listado. |
A cambio: translations, cada una con la etiqueta language que el sitio
publica y el url de esa versión, con translation_count y el url
de la página francesa desde la que se leyeron.
Reescalado de las cantidades
Una cantidad se indica en la unidad que le conviene, así 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.
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 compartir. Una cantidad que aterriza
entre las dos se redondea, y la receta reescalada entonces se aparta un poco de
las proporciones de la original. La línea lleva rounded, y su note dice
qué se hizo.
Las cifras son la aritmética de este servidor, así que di que fueron recalculadas cuando las muestres. Una receta cuya página no indica número de raciones no puede adaptarse a un número de personas, y la respuesta lo dice.
Configuración
Todas las variables son opcionales. Configúralas en el bloque env de la configuración de tu cliente.
| Variable | Default | Qué hace |
|---|---|---|
PTC_USER_AGENT | la identidad del proyecto | Nombra tu aplicación al sitio, con una dirección donde se pueda contactar a una persona. |
PTC_MIN_INTERVAL_MS | 1500 | Intervalo entre dos solicitudes, de 1000 a 60000. |
PTC_TIMEOUT_MS | 20000 | Plazo para una solicitud, de 1000 a 120000. |
PTC_MAX_RETRIES | 3 | Intentos después de un fallo transitorio, de 0 a 8. |
PTC_CACHE_TTL_MS | 900000 | Cuánto tiempo permanece una página en memoria, de 0 a 86400000. |
PTC_CACHE_MAX_ENTRIES | 200 | Páginas mantenidas en memoria a la vez, de 1 a 5000. |
PTC_MAX_BODY_BYTES | 8000000 | La respuesta más grande leída completa, de 100000 a 64000000. |
PTC_BUDGET_MS | 60000 | El tiempo que una lectura debe una respuesta, incluidos reintentos y esperas, de 5000 a 600000. |
PTC_LOG_LEVEL | error | silent, error, info o debug, escritos en stderr. |
Un valor fuera de su rango vuelve al predeterminado, 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 indica el siguiente paso.
| Código | Qué pasó | Qué hacer |
|---|---|---|
not_found | El sitio respondió y no tiene tal receta o página. | Verifica el slug con list_categories, o el id con una búsqueda. |
invalid_input | Los argumentos fueron rechazados antes de que saliera cualquier solicitud. | Lee el mensaje, que nombra el argumento. |
rate_limited | El sitio pidió a este cliente que se ralentizara. | 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 el contenido esperado estaba ausente. | 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 o su presupuesto. | Aumenta PTC_TIMEOUT_MS o PTC_BUDGET_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 protocolo adjunto.
import { PtitchefClient } from "mcp-ptitchef/client";
const client = new PtitchefClient();
const { data, cached } = await client.listCategories();
console.log(data.results.length, cached);
listCategories, searchRecipes, browseRecipes, searchByIngredients y
getRecipe responden cada una a { 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 salen una a la vez con al menos un segundo y medio entre ellas, y
el mínimo de un segundo 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 pueda 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, títulos y categorías pertenecen a Ptitchef y a los cocineros que
los escribieron.
Este servidor MCP es un proyecto no oficial, sin afiliación con Ptitchef.
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.ptitchef.com y nada más, mantiene sus respuestas en memoria
mientras se ejecuta y no escribe nada en 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
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 Ptitchef y a sus autores.
mcp-ptitchef (français)
Ptitchef es un sitio de cocina francés donde los cocineros publican sus recetas. Cada una da sus ingredientes, sus pasos, a menudo fotografiados uno a uno, sus tiempos de preparación y cocción, su costo, sus valores nutricionales y las calificaciones dejadas por sus lectores. El sitio clasifica sus recetas en un árbol de familias de ingredientes, y publica muchas en varios idiomas.
Este servidor conecta un cliente de conversación a este sitio. Se puede recorrer el árbol de categorías, buscar recetas por plato o por ingrediente, leer una categoría o una de las listas permanentes del sitio, preguntar qué se puede hacer con lo que hay en el refrigerador, leer una receta con sus ingredientes adaptados al número de comensales, y encontrar los otros idiomas en los que se ha publicado una receta. Sin clave de API, sin cuenta.
Instalación
Instalación en un clic
Claude Code
claude mcp add ptitchef -- npx -y mcp-ptitchef
Claude Desktop, Cursor y cualquier cliente con formato de configuración estándar
{
"mcpServers": {
"ptitchef": {
"command": "npx",
"args": ["-y", "mcp-ptitchef"]
}
}
}
Se requiere Node 24 o más reciente, y no hay que configurar ninguna variable de entorno.
Con Docker
{
"mcpServers": {
"ptitchef": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-ptitchef:1.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.ptitchef.com, y nada más: sin volumen, sin puerto,
sin identificador.
Bundle, sin npm
Descargue mcp-ptitchef-1.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 que
nada se descarga en la instalación.
Lo que se puede pedir
- « ¿Qué recetas de col rizada tiene Ptitchef? »
- « ¿Qué puedo cocinar con calabacines, feta y menta? »
- « Léeme este gratinado para ocho personas. »
- « Muéstrame las recetas mejor calificadas del sitio. »
- « ¿Esta receta existe también en español? »
Ptitchef es un sitio francés, por lo que sus recetas se encuentran en francés. El
camino habitual va de una lista a una receta: una línea lleva un id, y
get_recipe retoma ese identificador.
Las herramientas
| Herramienta | Qué hace |
|---|---|
list_categories | Recorre el árbol de familias de ingredientes del sitio. |
search_recipes | Encuentra recetas por plato o por ingrediente. |
browse_recipes | Lee una categoría página por página, o una lista permanente. |
search_by_ingredients | Responde con lo que se puede hacer con lo que un cocinero ya tiene. |
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. |
get_recipe_translations | Lista los otros idiomas en los que se ha publicado una receta. |
Empiece por list_categories. El sitio le da las direcciones correctas,
lo que evita construir una a mano: una dirección construida así lleva a
la página de inicio del sitio.
list_categories
Lee el árbol bajo el cual el sitio clasifica sus recetas. Llamado sin argumento,
devuelve las familias; vuelva a dar el slug de una familia en family para leer lo que
contiene.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
family | cadena, 1 a 80 caracteres | no | El slug de una familia, para leer las categorías debajo. |
limit | entero, 1 a 200, defecto 20 | no | Líneas a servir. |
En retorno: líneas que llevan slug, que se vuelve a dar en family o en
category ; title en los términos del sitio ; url ; description, null donde
la página no lleva ninguna ; y sample_children para las categorías del nivel
inferior.
search_recipes
Busca recetas por plato o por ingrediente.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
query | cadena, 1 a 120 caracteres | sí | Un plato o un ingrediente, en francés. |
limit | entero, 1 a 100, defecto 20 | no | Líneas a servir. |
En retorno: results, líneas que llevan id, title, url, image_url,
rating, rating_count y review_count, un contador que la página no imprime
que vale null. El envoltorio dice cómo respondió el sitio: kind vale category
cuando la respuesta viene de una página de categoría, cuyo total_available cuenta
toda la categoría, y free_text cuando el sitio respondió a su manera en una
sola página, donde el total cuenta las líneas servidas. Estos dos totales cuentan
cosas diferentes. kind también vale guide para un dossier que el sitio ha
escrito a mano, donde las líneas llevan un nombre y una dirección sin que exista
ningún total. También vienen result_count, rows_seen, page, single_page y
url. Una lista marcada single_page cuyo total supera rows_seen tiene un
resto que el sitio cuenta y no sirve.
browse_recipes
Lee una categoría página por página, o una de las listas permanentes del sitio.
| Argumento | Tipo | Requisito | Qué hace |
|---|---|---|---|
category | cadena, de 1 a 120 caracteres | no | Un slug de categoría, publicado por list_categories. |
listing | latest, top_rated o most_viewed | no | Una lista permanente, leída en lugar de una categoría. |
page | entero, de 1 a 1000 | no | La página de categoría a leer. Una lista permanente solo tiene una. |
limit | entero, de 1 a 100, por defecto 20 | no | Líneas a servir. |
En retorno: el envoltorio que devuelve search_recipes, con kind valiendo
category, standing o topic. page es la página que el sitio ha servido, que
es la primera de nuevo cuando la página solicitada supera la última.
search_by_ingredients
Responde con lo que se puede hacer con los ingredientes que un cocinero ya tiene.
| Argumento | Tipo | Requisito | Qué hace |
|---|---|---|---|
ingredients | matriz de 1 a 5 cadenas, de 1 a 60 caracteres | sí | Los ingredientes disponibles, en francés. |
limit | entero, de 1 a 100, por defecto 20 | no | Líneas a servir. |
En retorno: el envoltorio de las otras listas, con kind valiendo fridge. El
sitio hace corresponder su propio vocabulario, por lo que un ingrediente que escribe
de otra manera reduce la respuesta en lugar de ampliarla.
get_recipe
Lee una receta completa y adapta sus ingredientes cuando se da un número de porciones.
| Argumento | Tipo | Requisito | Qué hace |
|---|---|---|---|
id | cadena, de 1 a 300 caracteres | sí | El id de una línea de búsqueda o de lista. |
servings | entero, de 1 a 500 | no | Adapta los ingredientes a este número de porciones. |
En retorno: title, url, description, image_url, category,
cuisine, difficulty en los términos del sitio, author, published,
modified, rating, rating_count, review_count, prep_minutes,
cook_minutes, total_minutes, nutrition tal como se publica para la porción
que nombra, estimated_cost, keywords, faq y translations, cada uno
null donde la página no indica nada. steps lleva el método una línea por
paso, y illustrated_steps los mismos pasos con la fotografía que el sitio ha
tomado de cada uno. yield dice para qué está escrita la receta y hacia qué se ha
adaptado. Cada ingrediente lleva scaling, que vale scaled, rounded o
unscaled: léalo antes de citar una cantidad, rounded habiendo sido movida
para seguir siendo utilizable en la cocina.
scale_ingredients
Aplica la misma aritmética a cualquier lista de ingredientes en francés, sin consulta al sitio.
| Argumento | Tipo | Requisito | Qué hace |
|---|---|---|---|
ingredients | matriz de 1 a 100 cadenas, hasta 300 caracteres | sí | Las líneas a adaptar, en francés. |
factor | número, mayor que 0 hasta 100 | uno de los dos | El multiplicador a aplicar. |
from_servings | número, mayor que 0 hasta 500 | uno de los dos | El número de porciones de la lista original. |
to_servings | número, mayor que 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.
get_recipe_translations
Lista los otros idiomas en los que se ha publicado una receta, según el emparejamiento que el propio sitio publica.
| Argumento | Tipo | Requisito | Qué hace |
|---|---|---|---|
id | cadena, de 1 a 300 caracteres | sí | El id de una línea de búsqueda o de lista. |
En retorno: translations, cada una llevando la etiqueta language que el
sitio publica y el url de esa versión, con translation_count y el url de
la página francesa de donde se han leído.
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 que la de la receta: 200 g
multiplicados por veinte dan 4 kg.
La fineza 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 los 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.
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 porciones no puede llevarse 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 | Por defecto | Qué hace |
|---|---|---|
PTC_USER_AGENT | la identidad del proyecto | Nombra su aplicación ante el sitio, con una dirección donde contactar a una persona. |
PTC_MIN_INTERVAL_MS | 1500 | Intervalo entre dos solicitudes, de 1000 a 60000. |
PTC_TIMEOUT_MS | 20000 | Tiempo de espera de una solicitud, de 1000 a 120000. |
PTC_MAX_RETRIES | 3 | Intentos después de un fallo pasajero, de 0 a 8. |
PTC_CACHE_TTL_MS | 900000 | Duración durante la cual una página permanece en memoria, de 0 a 86400000. |
PTC_CACHE_MAX_ENTRIES | 200 | Páginas guardadas en memoria a la vez, de 1 a 5000. |
PTC_MAX_BODY_BYTES | 8000000 | La respuesta más grande leída completa, de 100000 a 64000000. |
PTC_BUDGET_MS | 60000 | El tiempo en el que una lectura debe devolver una respuesta, reintentos y esperas incluidos, de 5000 a 600000. |
PTC_LOG_LEVEL | error | silent, error, info o debug, escrito en la salida de error. |
Un valor fuera de su rango vuelve al valor por defecto, 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 slug con list_categories, o el identificador con una búsqueda. |
invalid_input | Los argumentos han sido 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 ha cargado y el contenido esperado está ausente. | Infórmelo en el seguimiento de incidentes. |
network_error | La solicitud no ha llegado a buen término. | Reintente en breve. |
timeout | La solicitud ha superado su tiempo de espera o su presupuesto. | Aumente PTC_TIMEOUT_MS o PTC_BUDGET_MS, o solicite 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 { PtitchefClient } from "mcp-ptitchef/client";
const client = new PtitchefClient();
const { data, cached } = await client.listCategories();
console.log(data.results.length, cached);
listCategories, searchRecipes, browseRecipes, searchByIngredients y
getRecipe responden cada uno { data, cached }, y lanzan un error que lleva uno de
los seis códigos. El mínimo entre dos solicitudes también se aplica aquí.
Ritmo y atribución
Las solicitudes salen una a una con al menos un segundo y medio entre ellas, y
el mínimo de un segundo se mantiene independientemente de 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 ha leído, y source nombra el
sitio. Las recetas, los títulos y las categorías pertenecen a Ptitchef y a los
cocineros que las han escrito.
Este MCP es un proyecto no oficial, sin afiliación con Ptitchef.
Confidencialidad
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.ptitchef.com, guarda sus respuestas en memoria mientras
se ejecuta y no escribe nada en el disco. PRIVACY.md dice lo que una
solicitud lleva consigo 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 Ptitchef y a sus autores.