Pequerecetas

Lee recetas familiares españolas de Pequerecetas y reajusta sus cantidades de forma honesta. Sin clave API.

Documentación

mcp-pequerecetas

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

Pequerecetas es un sitio español de cocina casera escrito para familias. Contiene unos miles de recetas con sus ingredientes, sus pasos y sus fotografías, y clasifica cada una según la dieta que se adapta, el electrodoméstico en el que se cocina, la ocasión para la que se hace y la edad de quien lo come, desde los seis meses en adelante.

Este servidor conecta un cliente de chat a ese sitio. Puedes buscar sus recetas, leer una con sus cantidades reescaladas al número de personas en tu mesa, listar los valores que publica cada taxonomía, recorrer una taxonomía página por página y reescalar cualquier lista de ingredientes en español que ya tengas. 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 pequerecetas -- npx -y mcp-pequerecetas

Claude Desktop, Cursor y cualquier cliente que use el formato de configuración estándar

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

Se requiere Node 24 o posterior, y no es necesario establecer ninguna variable de entorno.

Con Docker

{
  "mcpServers": {
    "pequerecetas": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-pequerecetas:1.0.1"]
    }
  }
}

-i mantiene abierta la entrada estándar, que es por donde viaja el protocolo, y -t se omite porque una TTY reescribe el flujo. El contenedor necesita HTTPS saliente hacia www.pequerecetas.com, y nada más: sin volumen, sin puerto, sin credencial.

Paquete, sin npm

Descarga mcp-pequerecetas-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, por lo que no se descarga nada en el momento de la instalación.

Lo que puedes preguntar

  • « Búscame una receta de paella de marisco. »
  • "Read me that recipe for eight people."
  • "What can I cook in an air fryer on this site?"
  • "Show me the purées it files under six months."
  • "Scale this Spanish ingredient list by three."

Pequerecetas está escrito en español y su búsqueda coincide con las palabras con las que se escribió una página, por lo que las recetas se encuentran en español. El camino habitual va desde una búsqueda o una taxonomía hasta una receta: una fila lleva un id, y get_recipe toma ese id.

Herramientas

HerramientaQué hace
get_recipeLee una página de la sección de recetas, reescalada si se solicita.
search_recipesEncuentra recetas por plato o por ingrediente.
list_facetsLista los valores que publica cada taxonomía.
browse_recipesLee una taxonomía, página por página.
scale_ingredientsReescala cualquier lista de ingredientes en español, sin solicitar al sitio.

get_recipe

Lee una página de la sección de recetas y reescala sus cantidades cuando se da un número de raciones.

ArgumentoTipoObligatorioQué hace
idcadena, de 1 a 200 caracteresEl slug en la dirección de una receta, tal como lo lleva una fila.
servingsentero, de 1 a 1000noReescala las cantidades a este número.

A cambio: kind, que lee recipe o collection. El sitio publica ambos en este tipo de dirección y los describe de manera similar, por lo que esto es lo que los distingue: una colección es un artículo que reúne otras recetas, y regresa con headings y recipes, las filas a las que apunta, en lugar de los campos de una receta.

Una receta lleva source_shape, que lee structured cuando el bloque que la página publica para los motores de búsqueda contenía sus ingredientes y article cuando se leyeron del cuerpo de la página, que es donde la mayoría de las recetas de este sitio los guardan. Luego vienen title, url, description, published_at, modified_at, prep_minutes, cook_minutes, total_minutes, categories, cuisines, keywords, author, author_url, rating, nutrition y images, cada null o vacío donde la página no indica nada. yield dice para qué se escribió la receta y a qué se reescaló; una página que no indica número de raciones regresa con factor en 1 y una nota que explica por qué. Cada línea de ingredients lleva scaling, que lee scaled, rounded o unscaled, y is_equipment, que marca una línea que nombra una herramienta en lugar de algo que se come.

search_recipes

Busca las recetas por un plato o un ingrediente.

ArgumentoTipoObligatorioQué hace
querycadena, de 1 a 120 caracteresUn plato o un ingrediente, en español.
limitentero, de 1 a 60noFilas a devolver.

A cambio: filas que llevan id, que get_recipe toma, title, url y image_url. Junto a ellas vienen result_count para las filas devueltas y total_available, que siempre es null: el sitio no publica un recuento de lo que coincidió con una búsqueda. El sitio sirve su búsqueda en una sola página y responde a una solicitud de una segunda con la primera nuevamente, por lo que estas son todas las filas que ofrece para una consulta. Algunas filas son artículos que reúnen recetas, que get_recipe informa como collection.

list_facets

Lista los valores por los que el sitio navega sus recetas, leídos del mapa del sitio que publica cada taxonomía.

ArgumentoTipoObligatorioQué hace
facetcadena, de 1 carácter en adelantenoUna taxonomía. Las ocho cuando se omite.

Las taxonomías son dieta, edad, ingrediente, ocasion, recetas-de, tecnica, tipo-de-cocina y tipo-plato: dieta, la edad de quien lo come, ingrediente principal, ocasión, momento del día, electrodoméstico, cocina y tipo de plato.

A cambio: facets, cada una con name, value_count y values, cuyo value es el slug que browse_recipes toma. Los valores mantienen el orden en que el sitio los publica. Leer las ocho cuesta una solicitud por taxonomía. Una taxonomía que no se pudo leer se nombra en notes y se omite de facets, por lo que una lista corta de una nunca se lee como un sitio que tiene siete.

browse_recipes

Lee una página de las recetas de una taxonomía.

ArgumentoTipoObligatorioQué hacer
facetcadena, de 1 carácter en adelanteLa taxonomía a navegar.
valuecadena, de 1 a 120 caracteresUn slug de list_facets, como thermomix.
pageentero, de 1 a 200noQué página leer, la primera por defecto.

A cambio: filas de la misma forma que search_recipes devuelve, con page_served para la página que el sitio realmente sirvió, has_more para si su propia paginación ofrece otra, y total_available, siempre null porque el sitio no imprime recuento en estas páginas. El sitio escribe sus propios slugs, por lo que uno construido a mano llega a una página que no tiene y regresa como not_found. Las taxonomías no se pueden combinar: el sitio no ofrece forma de pedir dos a la vez.

scale_ingredients

Reescala una lista de líneas de ingredientes en español. No llega a ningún sitio.

ArgumentoTipoObligatorioQué hace
ingredientsmatriz de 1 a 200 cadenasLas líneas a reescalar, tal como están escritas.
factornúmero, mayor que 0 hasta 1000uno dePor cuánto multiplicar las cantidades.
from_servingsentero, de 1 a 1000uno dePara cuántas personas se escribió la lista.
to_servingsentero, de 1 a 1000uno deA cuántas debería servir.

Da factor, o from_servings y to_servings juntos. Nombrar ambas formas a la vez se rechaza, porque pueden pedir cosas diferentes.

A cambio: cada línea con text tal como ahora se lee, original tal como se dio, amount, amount_max, unit y scaling, que lleva la honestidad de la respuesta: scaled cuando la aritmética aterrizó exactamente, rounded cuando el valor se movió para seguir siendo algo que una cocina puede medir, unscaled cuando la línea no lleva cantidad. is_equipment marca una línea que nombra una herramienta. Junto a ellas vienen scaled_count, rounded_count y unscaled_count. No se convierte nada entre sistemas de unidades, y una medida aproximada como un pizca mantiene el tamaño que el cocinero le da.

Configuración

VariablePredeterminadoLímitesQué hace
PQR_USER_AGENTsin establecerPrefijado al User-Agent propio de este servidor.
PQR_MIN_INTERVAL_MS30003000 a 60000Milisegundos entre dos solicitudes.
PQR_TIMEOUT_MS200001000 a 120000Cuánto puede tardar una solicitud.
PQR_MAX_RETRIES30 a 8Intentos de una solicitud que el sitio no respondió.
PQR_CACHE_TTL_MS9000000 a 86400000Cuánto tiempo se mantiene una lectura. Cero apaga el almacén.
PQR_CACHE_MAX_ENTRIES2001 a 5000Lecturas mantenidas a la vez.
PQR_LOG_LEVELerrorsilencioso, error, info, debugQué va a la salida de error.

El intervalo tiene un mínimo de 3000 milisegundos. Un valor inferior se rechaza y se mantiene el predeterminado, lo que se indica en la salida de error en lugar de aplicarse en silencio.

Errores

CódigoQué significaQué hacer
not_foundEl sitio no tiene nada en esa dirección.Comprueba el slug contra search_recipes.
invalid_inputLos argumentos no pueden producir una solicitud.El mensaje nombra el argumento.
rate_limitedEl sitio pidió a este cliente que fuera más lento.Espera y vuelve a preguntar. Lo que pediste sigue existiendo.
parse_failureUna página llegó en un formato que esto no puede leer.Repórtalo; el sitio puede haber cambiado.
network_errorLa solicitud no pudo completarse.Inténtalo de nuevo.
timeoutNo llegó ninguna respuesta a tiempo.Inténtalo de nuevo, o eleva PQR_TIMEOUT_MS.

Como biblioteca

La capa de lectura se publica por sí sola, con su ritmo, su almacenamiento y su vocabulario de errores, y sin ningún protocolo adjunto.

import { PequerecetasClient } from "mcp-pequerecetas/client";

const client = new PequerecetasClient();
const read = await client.getRecipe("paella-de-marisco");

Construida sin nada, toma su configuración del entorno y envía sus diagnósticos a stderr. loadConfig y createLogger provienen del mismo punto de entrada para un llamador que prefiera configurarlos en código:

import { createLogger, loadConfig, PequerecetasClient } from "mcp-pequerecetas/client";

const client = new PequerecetasClient({
  config: { ...loadConfig(), minIntervalMs: 5000 },
  logger: createLogger("debug"),
});

Cada lectura devuelve { data, cached }, y cached indica si la respuesta provino del almacenamiento en lugar del sitio.

Ritmo y atribución

Una solicitud a la vez, con tres segundos de separación, y el intervalo se amplía cuando el sitio resiste. El User-Agent lleva el nombre del proyecto, su versión y una dirección donde se puede contactar a una persona.

Pequerecetas es de lectura gratuita y paga su propio alojamiento. Cuando muestres una receta a alguien, acredita el sitio y enlaza la página de donde proviene.

Este servidor no está afiliado con Pequerecetas.

Privacidad

No se recopila nada. El servidor lee www.pequerecetas.com y ningún otro host, mantiene lo que leyó en memoria durante quince minutos por defecto, no escribe nada en disco y envía sus diagnósticos a stderr. No lleva ninguna credencial, porque el sitio no pide ninguna. Ver PRIVACY.md.

Desarrollo

npm install
npm run build:fixtures
npm test
npm run coverage
npm run check

El corpus que lee la suite está escrito por scripts/build-fixtures.mjs y contiene recetas inventadas, por lo que no se almacena contenido de terceros aquí. Una suite en vivo se ejecuta detrás de PQR_LIVE=1, una solicitud por ruta.

Contribuciones

Las incidencias y las solicitudes de extracción son bienvenidas. Ver CONTRIBUTING.md.

Licencia

MIT. Ver LICENSE.


mcp-pequerecetas (francés)

Versión en inglés

Pequerecetas es un sitio español de cocina familiar. Contiene algunos miles de recetas con sus ingredientes, sus pasos y sus fotografías, y clasifica cada una según el régimen al que se adapta, el aparato que la cocina, la ocasión para la que se hace y la edad de quien la come, a partir de seis meses.

Este servidor conecta un cliente de conversación a este sitio. Se pueden buscar sus recetas, leer una con sus cantidades ajustadas al número de personas en la mesa, listar los valores que publica cada taxonomía, recorrer una taxonomía página por página y ajustar a escala cualquier lista de ingredientes española que ya se tenga. No requiere ni clave de API ni cuenta.

Instalación

Instalación en un clic

Install in Cursor Install in VS Code

Claude Code

claude mcp add pequerecetas -- npx -y mcp-pequerecetas

Claude Desktop, Cursor y cualquier cliente con formato de configuración estándar

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

Se requiere Node 24 o más reciente, y no hay ninguna variable de entorno que definir.

Con Docker

{
  "mcpServers": {
    "pequerecetas": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-pequerecetas:1.0.1"]
    }
  }
}

-i mantiene stdin abierto, por donde pasa el protocolo, y -t se deja de lado porque un TTY reescribe el flujo. El contenedor necesita conectarse a www.pequerecetas.com en HTTPS saliente, y a nada más: ningún volumen, ningún puerto, ningún identificador.

Bundle, sin npm

Descargar mcp-pequerecetas-1.0.1.mcpb desde la última publicación y abrirlo. Un cliente que gestione 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

  • «Búscame una receta de paella de marisco.»
  • «Léeme esta receta para ocho personas.»
  • «¿Qué puedo cocinar en la freidora de aire en este sitio?»
  • «Muéstrame los purés que clasifica bajo seis meses.»
  • «Multiplica esta lista de ingredientes española por tres.»

Pequerecetas está escrito en español y su búsqueda compara las palabras de las que una página está hecha, por lo tanto las recetas se encuentran en español. El camino ordinario va de una búsqueda o una taxonomía hacia una receta: una línea lleva un id, y get_recipe toma ese id.

Las herramientas

HerramientaLo que hace
get_recipeLee una página de la sección de recetas, ajustada a escala si se pide.
search_recipesEncuentra recetas por plato o por ingrediente.
list_facetsLista los valores que publica cada taxonomía.
browse_recipesLee una taxonomía, página por página.
scale_ingredientsAjusta a escala una lista de ingredientes española, sin solicitud.

get_recipe

Lee una página de la sección de recetas y ajusta sus cantidades a escala cuando se da un número de porciones.

ArgumentoTipoRequeridoLo que hace
idcadena, de 1 a 200 caracteresEl slug en la dirección de una receta.
servingsentero, de 1 a 1000noAjusta las cantidades a escala de ese número.

A cambio: kind, que vale recipe o collection. El sitio publica ambos en este tipo de dirección y los describe de manera similar, por lo tanto esto es lo que los distingue: una colección es un artículo que reúne otras recetas, y vuelve con headings y recipes, las líneas que designa, en lugar de los campos de una receta.

Una receta lleva source_shape, que vale structured cuando el bloque que la página publica para los motores de búsqueda llevaba sus ingredientes, y article cuando fueron leídos en el cuerpo de la página, donde la mayoría de las recetas de este sitio los guarda. Vienen después title, url, description, published_at, modified_at, prep_minutes, cook_minutes, total_minutes, categories, cuisines, keywords, author, author_url, rating, nutrition y images, cada uno null o vacío donde la página no enuncia nada. yield dice para cuántos fue escrita la receta y hacia cuántos fue llevada; una página que no enuncia ningún número de porciones vuelve con factor a 1 y una nota que lo dice. Cada línea de ingredients lleva scaling, que vale scaled, rounded o unscaled, y is_equipment, que marca una línea que nombra un utensilio en lugar de algo que se come.

search_recipes

Busca las recetas por plato o por ingrediente.

ArgumentoTipoRequeridoLo que hace
querycadena, de 1 a 120 caracteresUn plato o un ingrediente, en español.
limitentero, de 1 a 60noLíneas a devolver.

A cambio: líneas que llevan id, que toma get_recipe, title, url y image_url. Al lado vienen result_count para las líneas devueltas y total_available, siempre null: el sitio no publica ningún recuento de lo que una búsqueda encontró. El sitio sirve su búsqueda en una sola página y responde a una solicitud de segunda página con la primera idéntica, por lo tanto esas son todas las líneas que ofrece para esa consulta. Algunas líneas son artículos que reúnen recetas, lo que get_recipe devuelve como un collection.

list_facets

Lista los valores por los que el sitio recorre sus recetas, leídos en el mapa del sitio que cada taxonomía publica.

ArgumentoTipoRequeridoLo que hace
facetcadena, de 1 carácter y másnoUna taxonomía. Las ocho cuando falta.

Las taxonomías son dieta, edad, ingrediente, ocasion, recetas-de, tecnica, tipo-de-cocina y tipo-plato: el régimen, la edad de quien come, el ingrediente principal, la ocasión, el momento del día, el aparato, la cocina y el tipo de plato.

A cambio: facets, llevando cada una name, value_count y values, de las cuales value es el slug que toma browse_recipes. Los valores mantienen el orden en el que el sitio los publica. Leer las ocho cuesta una solicitud por taxonomía. Una taxonomía que no pudo ser leída se nombra en notes y se deja fuera de facets, para que una lista amputada de una taxonomía no se lea como un sitio que tuviera siete.

browse_recipes

Lee una página de las recetas de una taxonomía.

ArgumentoTipoRequeridoLo que hace
facetcadena, de 1 carácter y másLa taxonomía a recorrer.
valuecadena, de 1 a 120 caracteresUn slug de list_facets, como thermomix.
pageentero, de 1 a 200noLa página a leer, la primera por defecto.

A cambio: líneas de la forma que devuelve search_recipes, con page_served para la página que el sitio sirvió, has_more para saber si su paginación ofrece otra, y total_available, siempre null porque el sitio no imprime ningún recuento en estas páginas. El sitio escribe sus propios slugs, por lo tanto un slug construido a mano alcanza una página que no tiene y vuelve en not_found. Las taxonomías no se cruzan: el sitio no ofrece ningún medio para pedir dos a la vez.

scale_ingredients

Ajusta a escala una lista de líneas de ingredientes españolas. No se conecta a ningún sitio.

ArgumentoTipoRequeridoLo que hace
ingredientsmatriz de 1 a 200 cadenasLas líneas a ajustar a escala.
factornúmero, mayor que 0 hasta 1000unoPor lo que multiplicar las cantidades.
from_servingsentero, de 1 a 1000unoPara cuántos fue escrita la lista.
to_servingsentero, de 1 a 1000unoPara cuántos debe servir.
Dar factor, o from_servings y to_servings juntos. Nombrar ambas
maneras a la vez es rechazado, porque pueden pedir dos cosas
diferentes.

A cambio: cada línea con text tal como se lee ahora, original tal como fue dada, amount, amount_max, unit, y scaling, que lleva la honestidad de la respuesta: scaled cuando la aritmética acertó, rounded cuando el valor se movió para seguir siendo una cantidad que una cocina mide, unscaled cuando la línea no lleva ninguna cantidad. is_equipment marca una línea que nombra un utensilio. Al lado vienen scaled_count, rounded_count y unscaled_count. Nada se convierte de un sistema de unidades a otro, y una medida aproximada como una pizca conserva el tamaño que le da el cocinero.

Configuración

VariablePredeterminadoLímitesLo que hace
PQR_USER_AGENTno definidoSe antepone al User-Agent del servidor.
PQR_MIN_INTERVAL_MS30003000 a 60000Milisegundos entre dos solicitudes.
PQR_TIMEOUT_MS200001000 a 120000Duración máxima de una solicitud.
PQR_MAX_RETRIES30 a 8Intentos en una solicitud sin respuesta.
PQR_CACHE_TTL_MS9000000 a 86400000Duración de conservación de una lectura. Cero apaga la caché.
PQR_CACHE_MAX_ENTRIES2001 a 5000Lecturas guardadas a la vez.
PQR_LOG_LEVELerrorsilent, error, info, debugLo que sale por stderr.

El intervalo tiene un mínimo de 3000 milisegundos. Un valor por debajo es rechazado y se aplica el predeterminado, lo cual se dice por stderr en lugar de aplicarse en silencio.

Errores

CódigoLo que significaEl siguiente paso
not_foundEl sitio no tiene nada en esa dirección.Verificar el slug con search_recipes.
invalid_inputLos argumentos no pueden producir una solicitud.El mensaje nombra el argumento.
rate_limitedEl sitio ha pedido que se vaya más despacio.Esperar y volver a pedir. Lo solicitado sigue existiendo.
parse_failureUna página llegó en una forma ilegible.Reportarlo; el sitio puede haber cambiado.
network_errorLa solicitud no se completó.Reintentar.
timeoutNinguna respuesta llegó a tiempo.Reintentar, o ampliar PQR_TIMEOUT_MS.

Como biblioteca

La capa de lectura se publica sola, con su ritmo, su caché y su vocabulario de errores, sin protocolo adjunto.

import { PequerecetasClient } from "mcp-pequerecetas/client";

const client = new PequerecetasClient();
const read = await client.getRecipe("paella-de-marisco");

Construido sin nada, toma sus ajustes del entorno y envía sus diagnósticos por stderr. loadConfig y createLogger vienen del mismo punto de entrada para quien prefiera fijarlos en el código:

import { createLogger, loadConfig, PequerecetasClient } from "mcp-pequerecetas/client";

const client = new PequerecetasClient({
  config: { ...loadConfig(), minIntervalMs: 5000 },
  logger: createLogger("debug"),
});

Toda lectura devuelve { data, cached }, y cached dice si la respuesta viene de la caché en lugar del sitio.

Ritmo y atribución

Una solicitud a la vez, tres segundos de diferencia, y el intervalo se amplía cuando el sitio pide espacio. El User-Agent lleva el nombre del proyecto, su versión y una dirección donde contactar a una persona.

Pequerecetas se lee gratuitamente y paga su alojamiento. Cuando se muestra una receta a alguien, se acredita al sitio y se enlaza la página de donde viene.

Este servidor no está afiliado a Pequerecetas.

Privacidad

Nada se recopila. El servidor lee www.pequerecetas.com y ningún otro host, guarda lo que ha leído en memoria quince minutos por defecto, no escribe nada en disco, y envía sus diagnósticos por stderr. No lleva ningún identificador, ya que el sitio no pide ninguno. Ver PRIVACY.md.

Desarrollo

npm install
npm run build:fixtures
npm test
npm run coverage
npm run check

El corpus que lee la suite está escrito por scripts/build-fixtures.mjs y contiene recetas inventadas, por lo que ningún contenido de terceros se almacena aquí. Una suite en directo corre detrás de PQR_LIVE=1, una solicitud por ruta.

Contribuir

Las issues y las pull requests son bienvenidas. Ver CONTRIBUTING.md.

Licencia

MIT. Ver LICENSE.