Wikibooks Cookbook
Busca en el Wikibooks Cookbook, lee una receta y reescala a cualquier número de porciones.
Documentación
mcp-wikibooks-cookbook
El Cookbook es la colección de recetas de los Wikilibros en inglés, un proyecto de Wikimedia. Miles de recetas están escritas y mantenidas allí de forma abierta, cada una con sus ingredientes, el equipo que requiere, sus pasos, los consejos y variaciones que sus autores añadieron, y las categorías bajo las que se archiva: una cocina, un tipo de plato, un ingrediente principal. Las páginas se publican bajo Creative Commons Attribution-ShareAlike 4.0.
Este servidor conecta un cliente de chat con esa colección. Puedes buscar las recetas por plato o por ingrediente, listarlas por cocina, tipo de plato o ingrediente principal, leer una con sus ingredientes reescalados al número de personas en tu mesa, y reescalar cualquier lista de ingredientes propia. No necesita clave de API ni cuenta.
Instalación
Instalación en un clic
Claude Code
claude mcp add wikibooks-cookbook -- npx -y mcp-wikibooks-cookbook
Claude Desktop, Cursor, y cualquier cliente que use el formato de configuración estándar
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "npx",
"args": ["-y", "mcp-wikibooks-cookbook"]
}
}
}
Se requiere Node 24 o posterior, y no es necesario establecer ninguna variable de entorno.
Con Docker
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-wikibooks-cookbook: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
api.wikimedia.org, y nada más: sin volumen, sin puerto, sin credencial.
Paquete, sin npm
Descarga mcp-wikibooks-cookbook-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, así que
no se descarga nada en el momento de la instalación.
Lo que puedes preguntar
- "Encuéntrame una receta de carbonara en el Cookbook."
- "Léela para seis personas en lugar de cuatro."
- "¿Qué sopas tailandesas tiene la colección?"
- "¿Qué recetas están basadas en lentejas?"
- "Escala esta lista de ingredientes por 2.5 para mí."
El camino habitual va de una búsqueda a una lectura: una fila lleva un id, la
clave de página, y get_recipe toma esa clave.
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 wiki. |
list_recipes | Lista recetas por cocina, tipo de plato o ingrediente principal. |
search_recipes
Busca en el Cookbook, ya sea en todo el texto de sus páginas o solo en sus títulos.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
query | cadena, de 1 a 300 caracteres | sí | Un plato, como carbonara, o un ingrediente, como guanciale. |
search | text o title, por defecto text | no | text lee toda la página; title coincide solo con el nombre de la página. |
limit | entero, de 1 a 50, por defecto 10 | no | Filas a servir. |
A cambio: filas que llevan id, la clave de página que get_recipe toma; title;
url; image_url; description, la breve glosa que el wiki mantiene para una página; y
excerpt, el pasaje coincidente con el marcado de resaltado eliminado. Cada uno de los
últimos tres es null cuando la búsqueda no ofreció ninguno. total_available es siempre
null: la ruta de búsqueda no publica total ni paginación, así que result_count
cuenta las filas que esta llamada devolvió.
get_recipe
Lee una receta y reescala sus ingredientes cuando se da un número de porciones.
| Argumento | Tipo | Obligatorio | Qué hacer |
|---|---|---|---|
id | cadena, de 1 a 300 caracteres | sí | La clave de página, como Cookbook:Spaghetti_alla_Carbonara. |
servings | entero, de 1 a 500 | no | Reescala los ingredientes a este número de porciones. |
max_description_chars | entero, de 100 a 20000, por defecto 1200 | no | Cuánta prosa de la página servir. |
A cambio: title, url, ingredients, equipment, steps, tips para
las notas y variaciones que la página publica, prep_minutes, cook_minutes,
total_minutes, time_text en las propias palabras de la página, time_phases, category
y categories para cada categoría bajo la que la página se archiva. Una cifra que la
página no indica es null. id nombra la página que se leyó, que
difiere de la clave solicitada después de una redirección, y redirected_from entonces nombra
la clave que llevó allí. yield dice para qué fue escrita la receta y a qué
fue reescalada, y cada ingrediente lleva scaling, que lee scaled,
rounded o unscaled.
scale_ingredients
Aplica la misma aritmética a cualquier lista de líneas de ingredientes, sin solicitar al wiki.
| Argumento | Tipo | Obligatorio | Qué hacer |
|---|---|---|---|
ingredients | matriz de 1 a 100 cadenas, hasta 300 caracteres | sí | Las líneas a reescalar. |
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
que get_recipe devuelve, y scaled_count, rounded_count y unscaled_count.
list_recipes
Lista recetas según las categorías bajo las que el Cookbook las archiva. Los argumentos se combinan, y la respuesta dice qué búsqueda se construyó a partir de ellos.
| Argumento | Tipo | Obligatorio | Qué hacer |
|---|---|---|---|
cuisine | cadena, hasta 80 caracteres | no | Una cocina o un país, como Italian o Thai. |
dish_type | cadena, hasta 80 caracteres | no | Un tipo de plato, como soup, dessert o bread. |
main_ingredient | cadena, hasta 80 caracteres | no | El ingrediente en el que se basa una receta. |
limit | entero, de 1 a 50, por defecto 15 | no | Filas a servir. |
A cambio: las filas que search_recipes devuelve, con query nombrando la búsqueda
que este servidor construyó a partir de los argumentos, y cada argumento repetido o null
donde se omitió.
Reescalado de las cantidades
Una cantidad se expresa 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 hogaza se puede cortar
en dos, en tres o en cuatro; un huevo no se puede compartir. Una cantidad que cae
entre ambos se redondea, y la receta reescalada se aparta entonces un poco de
las proporciones del original. La línea lleva rounded, y su nota dice
qué se hizo.
Las cifras son la aritmética de este servidor, así que di que se recalcularon cuando las muestres. Una receta cuya página no indica ningún número de porciones no se puede ajustar a un número de personas, y la respuesta lo dice.
Licencia y atribución
Las páginas del Cookbook se publican bajo
Creative Commons Attribution-ShareAlike 4.0.
Repetir una receta significa acreditar a Wikilibros y la página de la que proviene, y
compartir lo que se construye sobre ella bajo la misma licencia. get_recipe devuelve tanto
license como la página url, así que una respuesta lleva el crédito consigo.
Configuración
Cada variable es opcional. Establécelas en el bloque env de la configuración de tu cliente.
| Variable | Por defecto | Qué hace |
|---|---|---|
WB_USER_AGENT | la identidad del proyecto | Nombra tu aplicación a Wikimedia, con una dirección donde se pueda contactar a una persona. |
WB_MIN_INTERVAL_MS | 1000 | Intervalo entre dos solicitudes, de 500 a 60000. |
WB_TIMEOUT_MS | 20000 | Plazo para una solicitud, de 1000 a 120000. |
WB_MAX_RETRIES | 3 | Intentos después de un fallo transitorio, de 0 a 8. |
WB_CACHE_TTL_MS | 900000 | Cuánto tiempo permanece una página en memoria, de 0 a 86400000. |
WB_CACHE_MAX_ENTRIES | 200 | Páginas mantenidas en memoria a la vez, de 1 a 5000. |
WB_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 paso.
| Código | Qué ocurrió | Qué hacer |
|---|---|---|
not_found | El wiki respondió y no contiene esa página. | Comprueba la clave de página con search_recipes. |
invalid_input | Los argumentos fueron rechazados antes de enviar ninguna solicitud. | Lee el mensaje, que nombra el argumento. |
rate_limited | Wikimedia pidió a este cliente que fuera más lento. | Espera el número de segundos que indica la pista y vuelve a llamar con los mismos argumentos. La receta sigue ahí. |
parse_failure | La página se cargó y el contenido esperado estaba ausente. | Repórtalo en el rastreador de incidencias. |
network_error | La solicitud no se completó. | Inténtalo de nuevo en breve. |
timeout | La solicitud superó su plazo. | Aumenta WB_TIMEOUT_MS, o pide menos filas. |
Como biblioteca
La capa que lee el wiki se publica por separado, con su ritmo, su caché y sus errores, y sin ningún protocolo adjunto.
import { WikibooksClient } from "mcp-wikibooks-cookbook/client";
const client = new WikibooksClient();
const { data, cached } = await client.getRecipe("Cookbook:Spaghetti_alla_Carbonara");
console.log(data.title, data.ingredients.length, cached);
search y getRecipe responden cada uno 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 de una en una con al menos un segundo entre ellas, y el intervalo
de medio 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 puede contactar a una persona.
Las lecturas van a api.wikimedia.org, el host que Wikimedia documenta y mantiene para
desarrolladores. Cada resultado lleva la dirección de la página desde la que se leyó y
la licencia bajo la que se publica.
Este servidor MCP es un proyecto no oficial, sin afiliación con Wikimedia ni con la comunidad de Wikibooks.
Privacidad
Este servidor no recopila nada sobre ti y no envía nada a su autor. Se ejecuta
en tu máquina, contacta a api.wikimedia.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. La suite en vivo,
npm run test:live, hace una solicitud por ruta y se ejecuta cada noche contra el
propio servicio.
Contribuciones
Errores, preguntas e ideas van en el rastreador de incidencias. Las solicitudes de extracción son bienvenidas; abrir una incidencia primero ayuda a acordar la forma del cambio. Consulta CONTRIBUTING.md.
Licencia
MIT para el código propio de este servidor, consulta LICENSE. Las páginas del Cookbook pertenecen a sus autores y a la comunidad de Wikibooks, bajo CC BY-SA 4.0.
mcp-wikibooks-cookbook (français)
El Cookbook es la colección de recetas de los Wikibooks en inglés, un proyecto de Wikimedia. Miles de recetas están escritas y mantenidas abiertamente, cada una con sus ingredientes, el equipo que requiere, sus pasos, los consejos y variantes que sus autores han añadido, y las categorías bajo las que se clasifica: una cocina, un tipo de plato, un ingrediente principal. Las páginas se publican bajo Creative Commons Atribución-CompartirIgual 4.0.
Este servidor conecta un cliente de conversación con esta colección. Se pueden buscar recetas por plato o por ingrediente, listarlas por cocina, tipo de plato o ingrediente principal, leer una con sus ingredientes adaptados al número de comensales, y adaptar cualquier lista de ingredientes. Sin clave de API, sin cuenta.
Instalación
Instalación en un clic
Claude Code
claude mcp add wikibooks-cookbook -- npx -y mcp-wikibooks-cookbook
Claude Desktop, Cursor y cualquier cliente con formato de configuración estándar
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "npx",
"args": ["-y", "mcp-wikibooks-cookbook"]
}
}
}
Se requiere Node 24 o más reciente, y no hay que configurar ninguna variable de entorno.
Con Docker
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-wikibooks-cookbook: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 api.wikimedia.org, y nada más: sin volúmenes, sin puertos,
sin identificadores.
Paquete, sin npm
Descarga mcp-wikibooks-cookbook-2.0.1.mcpb desde
la última publicación
y ábrelo. Un cliente que gestiona paquetes MCP lo instala solo, sin npm y
sin modificar ningún archivo de configuración. El paquete incluye sus dependencias, por lo que
no se descarga nada durante la instalación.
Lo que se puede pedir
- «Encuéntrame una receta de carbonara en el Cookbook.»
- «Léela para seis personas en lugar de cuatro.»
- «¿Qué sopas tailandesas contiene la colección?»
- «¿Qué recetas están basadas en lentejas?»
- «Multiplica esta lista de ingredientes por 2,5.»
El camino habitual va de una búsqueda a una lectura: una línea lleva un id,
la clave de página, y get_recipe retoma esa clave.
Las herramientas
| Herramienta | Qué 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 consultar al wiki. |
list_recipes | Lista recetas por cocina, tipo de plato o ingrediente principal. |
search_recipes
Busca en el Cookbook, ya sea en todo el texto de sus páginas o solo en sus títulos.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
query | cadena, de 1 a 300 caracteres | sí | Un plato, como carbonara, o un ingrediente, como guanciale. |
search | text o title, por defecto text | no | text lee toda la página; title solo coincide con el nombre de la página. |
limit | entero, de 1 a 50, por defecto 10 | no | Líneas a servir. |
A cambio: líneas que llevan id, la clave de página que get_recipe
retoma; title; url; image_url; description, la breve glosa que el
wiki guarda para una página; y excerpt, el pasaje correspondiente sin
su marcado de resaltado. Cada uno de los tres últimos vale null donde la
búsqueda no ha propuesto ninguno. total_available siempre vale null: la ruta
de búsqueda no publica ni total ni paginación, por lo que result_count cuenta las
líneas devueltas por esta llamada.
get_recipe
Lee una receta y adapta sus ingredientes cuando se da un número de porciones.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
id | cadena, de 1 a 300 caracteres | sí | La clave de página, como Cookbook:Spaghetti_alla_Carbonara. |
servings | entero, de 1 a 500 | no | Adapta los ingredientes a este número de porciones. |
max_description_chars | entero, de 100 a 20000, por defecto 1200 | no | La cantidad de prosa de la página a servir. |
A cambio: title, url, ingredients, equipment, steps, tips para
las notas y variantes que la página publica, prep_minutes, cook_minutes,
total_minutes, time_text en los términos de la página, time_phases,
category y categories para cada categoría bajo la que se clasifica la página.
Un número que la página no indica vale null. id nombra la página que se ha
leído, que difiere de la clave solicitada después de una redirección, y redirected_from
nombra entonces la clave que llevó a ella. yield dice para qué está escrita la receta y
hacia qué se ha adaptado, y cada ingrediente lleva scaling, que vale
scaled, rounded o unscaled.
scale_ingredients
Aplica la misma aritmética a cualquier lista de ingredientes, sin consultar al wiki.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
ingredients | matriz de 1 a 100 cadenas, hasta 300 caracteres | sí | Las líneas a adaptar. |
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. |
Pasa factor, o el par from_servings y to_servings.
A cambio: el factor utilizado, los ingredients adaptados en la forma que
devuelve get_recipe, y scaled_count, rounded_count y unscaled_count.
list_recipes
Lista recetas según las categorías bajo las que el Cookbook las clasifica. Los argumentos se combinan, y la respuesta dice qué búsqueda se ha construido a partir de ellos.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
cuisine | cadena, hasta 80 caracteres | no | Una cocina o un país, como Italian o Thai. |
dish_type | cadena, hasta 80 caracteres | no | Un tipo de plato, como soup, dessert o bread. |
main_ingredient | cadena, hasta 80 caracteres | no | El ingrediente sobre el que se basa una receta. |
limit | entero, de 1 a 50, por defecto 15 | no | Líneas a servir. |
A cambio: las líneas que devuelve search_recipes, con query que nombra la
búsqueda construida por este servidor a partir de los argumentos, y cada argumento repetido
o null donde se ha omitido.
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 una unidad diferente a la de la receta: 200 g
multiplicados por veinte dan 4 kg.
La finesse à laquelle un ingrédient se coupe dépend de sa nature. Un pain se
coupe en deux, en trois ou en quatre ; un oeuf ne se partage pas. Une quantité
qui tombe entre les deux est donc arrondie, et la recette adaptée s'écarte alors
un peu des proportions de l'originale. La ligne porte rounded, et sa note dit
ce qui a été fait.
Les chiffres sont l'arithmétique de ce serveur, donc dites qu'ils ont été recalculés quand vous les montrez. Une recette dont la page n'indique aucun nombre de parts ne peut pas être portée à un nombre de convives, et la réponse le dit.
La licence et l'attribution
Les pages du Cookbook sont publiées sous
Creative Commons Attribution-Partage dans les mêmes conditions 4.0.
Reprendre une recette demande de créditer Wikibooks et la page d'où elle vient,
et de partager ce qu'on bâtit dessus sous la même licence. get_recipe rend à la
fois license et l'url de la page, donc une réponse emporte le crédit avec
elle.
Configuration
Chaque variable est facultative. Elles se posent dans le bloc env de la
configuration du client.
| Variable | Défaut | Ce qu'elle fait |
|---|---|---|
WB_USER_AGENT | l'identité du projet | Nomme votre application auprès de Wikimedia, avec une adresse où joindre une personne. |
WB_MIN_INTERVAL_MS | 1000 | Écart entre deux requêtes, de 500 à 60000. |
WB_TIMEOUT_MS | 20000 | Délai d'une requête, de 1000 à 120000. |
WB_MAX_RETRIES | 3 | Tentatives après un échec passager, de 0 à 8. |
WB_CACHE_TTL_MS | 900000 | Durée pendant laquelle une page reste en mémoire, de 0 à 86400000. |
WB_CACHE_MAX_ENTRIES | 200 | Pages gardées en mémoire à la fois, de 1 à 5000. |
WB_LOG_LEVEL | error | silent, error, info ou debug, écrit sur la sortie d'erreur. |
Une valeur hors de sa plage retombe sur le défaut, et la raison est écrite sur la sortie d'erreur.
Erreurs
Chaque échec porte un des six codes, un message, et quand cela aide une indication du geste suivant.
| Code | Ce qui s'est passé | Que faire |
|---|---|---|
not_found | Le wiki a répondu, et n'a pas cette page. | Vérifiez la clé de page avec search_recipes. |
invalid_input | Les arguments ont été refusés avant toute requête. | Lisez le message, qui nomme l'argument. |
rate_limited | Wikimedia demande à ce client de ralentir. | Attendez les secondes indiquées et rappelez avec les mêmes arguments. La recette est toujours là. |
parse_failure | La page a chargé et le contenu attendu est absent. | Signalez-le sur le suivi d'incidents. |
network_error | La requête n'a pas abouti. | Réessayez sous peu. |
timeout | La requête a dépassé son délai. | Augmentez WB_TIMEOUT_MS, ou demandez moins de lignes. |
Comme bibliothèque
La couche qui lit le wiki est publiée seule, avec son rythme, son cache et ses erreurs, sans protocole attaché.
import { WikibooksClient } from "mcp-wikibooks-cookbook/client";
const client = new WikibooksClient();
const { data, cached } = await client.getRecipe("Cookbook:Spaghetti_alla_Carbonara");
console.log(data.title, data.ingredients.length, cached);
search et getRecipe répondent chacun { data, cached }, et lèvent une erreur
portant un des six codes. Le plancher entre deux requêtes tient également ici.
Rythme et attribution
Les requêtes partent une à une avec au moins une seconde entre elles, et le
plancher d'une demi-seconde tient quelle que soit la configuration. Le
User-Agent se termine toujours par l'identité du projet et une adresse où
joindre une personne.
Les lectures vont vers api.wikimedia.org, l'hôte que Wikimedia documente et
maintient pour les développeurs. Chaque résultat porte l'adresse de la page d'où
il a été lu, et la licence sous laquelle elle est publiée.
Ce MCP est un projet non officiel, sans affiliation à Wikimedia ni à la communauté Wikibooks.
Confidentialité
Ce serveur ne collecte rien sur vous et n'envoie rien à son auteur. Il tourne sur
votre machine, ne joint que api.wikimedia.org, garde ses réponses en mémoire le temps qu'il
tourne, et n'écrit rien sur le disque. PRIVACY.md dit ce qu'une
requête emporte et quels réglages changent cela.
Développement
npm install
npm run build:fixtures
npm test
npm run check
Les tests s'exécutent sur des fixtures engendrées et n'émettent aucune requête.
La suite en direct, npm run test:live, émet une requête par route et tourne
chaque nuit contre le service lui-même.
Contribuer
Les anomalies, les questions et les idées ont leur place dans le suivi d'incidents. Les propositions de modification sont bienvenues ; ouvrir un ticket d'abord aide à s'accorder sur la forme du changement. Voir CONTRIBUTING.md.
Licence
MIT pour le code de ce serveur, voir LICENSE. Les pages du Cookbook appartiennent à leurs auteurs et à la communauté Wikibooks, sous CC BY-SA 4.0.