Pequerecetas
Lee recetas familiares españolas de Pequerecetas y reajusta sus cantidades de forma honesta. Sin clave API.
Documentación
mcp-pequerecetas
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.
Instalación
Instalación en un clic
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
| Herramienta | Qué hace |
|---|---|
get_recipe | Lee una página de la sección de recetas, reescalada si se solicita. |
search_recipes | Encuentra recetas por plato o por ingrediente. |
list_facets | Lista los valores que publica cada taxonomía. |
browse_recipes | Lee una taxonomía, página por página. |
scale_ingredients | Reescala 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.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
id | cadena, de 1 a 200 caracteres | sí | El slug en la dirección de una receta, tal como lo lleva una fila. |
servings | entero, de 1 a 1000 | no | Reescala 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.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
query | cadena, de 1 a 120 caracteres | sí | Un plato o un ingrediente, en español. |
limit | entero, de 1 a 60 | no | Filas 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.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
facet | cadena, de 1 carácter en adelante | no | Una 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.
| Argumento | Tipo | Obligatorio | Qué hacer |
|---|---|---|---|
facet | cadena, de 1 carácter en adelante | sí | La taxonomía a navegar. |
value | cadena, de 1 a 120 caracteres | sí | Un slug de list_facets, como thermomix. |
page | entero, de 1 a 200 | no | Qué 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.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
ingredients | matriz de 1 a 200 cadenas | sí | Las líneas a reescalar, tal como están escritas. |
factor | número, mayor que 0 hasta 1000 | uno de | Por cuánto multiplicar las cantidades. |
from_servings | entero, de 1 a 1000 | uno de | Para cuántas personas se escribió la lista. |
to_servings | entero, de 1 a 1000 | uno de | A 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
| Variable | Predeterminado | Límites | Qué hace |
|---|---|---|---|
PQR_USER_AGENT | sin establecer | Prefijado al User-Agent propio de este servidor. | |
PQR_MIN_INTERVAL_MS | 3000 | 3000 a 60000 | Milisegundos entre dos solicitudes. |
PQR_TIMEOUT_MS | 20000 | 1000 a 120000 | Cuánto puede tardar una solicitud. |
PQR_MAX_RETRIES | 3 | 0 a 8 | Intentos de una solicitud que el sitio no respondió. |
PQR_CACHE_TTL_MS | 900000 | 0 a 86400000 | Cuánto tiempo se mantiene una lectura. Cero apaga el almacén. |
PQR_CACHE_MAX_ENTRIES | 200 | 1 a 5000 | Lecturas mantenidas a la vez. |
PQR_LOG_LEVEL | error | silencioso, error, info, debug | Qué 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ódigo | Qué significa | Qué hacer |
|---|---|---|
not_found | El sitio no tiene nada en esa dirección. | Comprueba el slug contra search_recipes. |
invalid_input | Los argumentos no pueden producir una solicitud. | El mensaje nombra el argumento. |
rate_limited | El sitio pidió a este cliente que fuera más lento. | Espera y vuelve a preguntar. Lo que pediste sigue existiendo. |
parse_failure | Una página llegó en un formato que esto no puede leer. | Repórtalo; el sitio puede haber cambiado. |
network_error | La solicitud no pudo completarse. | Inténtalo de nuevo. |
timeout | No 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)
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
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
| Herramienta | Lo que hace |
|---|---|
get_recipe | Lee una página de la sección de recetas, ajustada a escala si se pide. |
search_recipes | Encuentra recetas por plato o por ingrediente. |
list_facets | Lista los valores que publica cada taxonomía. |
browse_recipes | Lee una taxonomía, página por página. |
scale_ingredients | Ajusta 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.
| Argumento | Tipo | Requerido | Lo que hace |
|---|---|---|---|
id | cadena, de 1 a 200 caracteres | sí | El slug en la dirección de una receta. |
servings | entero, de 1 a 1000 | no | Ajusta 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.
| Argumento | Tipo | Requerido | Lo que hace |
|---|---|---|---|
query | cadena, de 1 a 120 caracteres | sí | Un plato o un ingrediente, en español. |
limit | entero, de 1 a 60 | no | Lí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.
| Argumento | Tipo | Requerido | Lo que hace |
|---|---|---|---|
facet | cadena, de 1 carácter y más | no | Una 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.
| Argumento | Tipo | Requerido | Lo que hace |
|---|---|---|---|
facet | cadena, de 1 carácter y más | sí | La taxonomía a recorrer. |
value | cadena, de 1 a 120 caracteres | sí | Un slug de list_facets, como thermomix. |
page | entero, de 1 a 200 | no | La 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.
| Argumento | Tipo | Requerido | Lo que hace |
|---|---|---|---|
ingredients | matriz de 1 a 200 cadenas | sí | Las líneas a ajustar a escala. |
factor | número, mayor que 0 hasta 1000 | uno | Por lo que multiplicar las cantidades. |
from_servings | entero, de 1 a 1000 | uno | Para cuántos fue escrita la lista. |
to_servings | entero, de 1 a 1000 | uno | Para 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
| Variable | Predeterminado | Límites | Lo que hace |
|---|---|---|---|
PQR_USER_AGENT | no definido | Se antepone al User-Agent del servidor. | |
PQR_MIN_INTERVAL_MS | 3000 | 3000 a 60000 | Milisegundos entre dos solicitudes. |
PQR_TIMEOUT_MS | 20000 | 1000 a 120000 | Duración máxima de una solicitud. |
PQR_MAX_RETRIES | 3 | 0 a 8 | Intentos en una solicitud sin respuesta. |
PQR_CACHE_TTL_MS | 900000 | 0 a 86400000 | Duración de conservación de una lectura. Cero apaga la caché. |
PQR_CACHE_MAX_ENTRIES | 200 | 1 a 5000 | Lecturas guardadas a la vez. |
PQR_LOG_LEVEL | error | silent, error, info, debug | Lo 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ódigo | Lo que significa | El siguiente paso |
|---|---|---|
not_found | El sitio no tiene nada en esa dirección. | Verificar el slug con search_recipes. |
invalid_input | Los argumentos no pueden producir una solicitud. | El mensaje nombra el argumento. |
rate_limited | El sitio ha pedido que se vaya más despacio. | Esperar y volver a pedir. Lo solicitado sigue existiendo. |
parse_failure | Una página llegó en una forma ilegible. | Reportarlo; el sitio puede haber cambiado. |
network_error | La solicitud no se completó. | Reintentar. |
timeout | Ninguna 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.