Wikibooks Cookbook
Pesquise no Wikibooks Cookbook, leia uma receita e redimensione-a para qualquer número de porções.
Documentação
mcp-wikibooks-cookbook
O Cookbook é a coleção de receitas do Wikibooks em inglês, um projeto da Wikimedia. Milhares de receitas são escritas e mantidas lá de forma aberta, cada uma com seus ingredientes, os equipamentos necessários, seus passos, as dicas e variações que seus autores adicionaram e as categorias em que se enquadra: uma culinária, um tipo de prato, um ingrediente principal. As páginas são publicadas sob a licença Creative Commons Atribuição-CompartilhaIgual 4.0.
Este servidor conecta um cliente de chat a essa coleção. Você pode pesquisar as receitas por prato ou por ingrediente, listá-las por culinária, tipo de prato ou ingrediente principal, ler uma com os ingredientes redimensionados para o número de pessoas à sua mesa e redimensionar qualquer lista de ingredientes sua. Ele não precisa de chave de API nem de conta.
Instalação
Instalação com um clique
Claude Code
claude mcp add wikibooks-cookbook -- npx -y mcp-wikibooks-cookbook
Claude Desktop, Cursor e qualquer cliente que use o formato de configuração padrão
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "npx",
"args": ["-y", "mcp-wikibooks-cookbook"]
}
}
}
É necessário o Node 24 ou posterior, e nenhuma variável de ambiente precisa ser definida.
Com Docker
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-wikibooks-cookbook:2.0.1"]
}
}
}
-i mantém o stdin aberto, que é por onde o protocolo trafega, e -t é omitido
porque um TTY reescreve o fluxo. O contêiner precisa de HTTPS de saída para
api.wikimedia.org e nada mais: sem volume, sem porta, sem credencial.
Pacote, sem npm
Baixe mcp-wikibooks-cookbook-2.0.1.mcpb de
a versão mais recente
e abra-o. Um cliente que suporte pacotes MCP o instala por conta própria, sem npm
e sem arquivo de configuração para editar. O pacote carrega suas dependências,
então nada é baixado no momento da instalação.
O que você pode perguntar
- "Encontre uma receita de carbonara no Cookbook."
- "Leia para seis pessoas em vez de quatro."
- "Quais sopas tailandesas a coleção possui?"
- "Quais receitas são feitas com lentilha?"
- "Redimensione esta lista de ingredientes por 2,5 para mim."
O caminho comum vai de uma pesquisa a uma leitura: uma linha carrega um id, a
chave da página, e get_recipe usa essa chave.
Ferramentas
| Ferramenta | O que faz |
|---|---|
search_recipes | Encontra receitas por prato ou por ingrediente. |
get_recipe | Lê uma receita, redimensionada para um número de porções sob solicitação. |
scale_ingredients | Redimensiona qualquer lista de ingredientes, sem solicitação ao wiki. |
list_recipes | Lista receitas por culinária, tipo de prato ou ingrediente principal. |
search_recipes
Pesquisa o Cookbook, seja em todo o texto das páginas ou apenas nos títulos.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
query | string, de 1 a 300 caracteres | sim | Um prato, como carbonara, ou um ingrediente, como guanciale. |
search | text ou title, padrão text | não | text lê a página inteira; title corresponde apenas ao nome da página. |
limit | inteiro, de 1 a 50, padrão 10 | não | Linhas a serem retornadas. |
Em retorno: linhas com id, a chave da página que get_recipe usa; title;
url; image_url; description, o resumo curto que o wiki mantém para uma página; e
excerpt, a passagem correspondente com a marcação de destaque removida. Cada uma das
três últimas é null quando a pesquisa não ofereceu nenhuma. total_available é sempre
null: a rota de pesquisa não publica total nem paginação, então result_count
conta as linhas que esta chamada retornou.
get_recipe
Lê uma receita e redimensiona seus ingredientes quando um número de porções é fornecido.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string, de 1 a 300 caracteres | sim | A chave da página, como Cookbook:Spaghetti_alla_Carbonara. |
servings | inteiro, de 1 a 500 | não | Redimensiona os ingredientes para este número de porções. |
max_description_chars | inteiro, de 100 a 20000, padrão 1200 | não | Quanto do texto da página deve ser retornado. |
Em retorno: title, url, ingredients, equipment, steps, tips para
as notas e variações que a página publica, prep_minutes, cook_minutes,
total_minutes, time_text nas próprias palavras da página, time_phases, category
e categories para cada categoria em que a página se enquadra. Um valor que a
página não informa é null. id nomeia a página que foi lida, que
difere da chave solicitada após um redirecionamento, e redirected_from então nomeia
a chave que levou até lá. yield informa para o que a receita foi escrita e para o que
foi redimensionada, e cada ingrediente carrega scaling, lendo scaled,
rounded ou unscaled.
scale_ingredients
Aplica a mesma aritmética a qualquer lista de linhas de ingredientes, sem solicitação ao wiki.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
ingredients | array de 1 a 100 strings, até 300 caracteres | sim | As linhas a redimensionar. |
factor | número, acima de 0 e até 100 | um de dois | O multiplicador a aplicar. |
from_servings | número, acima de 0 e até 500 | um de dois | Para quantas porções a lista foi escrita. |
to_servings | número, acima de 0 e até 500 | um de dois | Quantas porções são desejadas. |
Passe factor, ou o par from_servings e to_servings.
Em retorno: o factor usado, o ingredients redimensionado no formato
que get_recipe retorna, e scaled_count, rounded_count e unscaled_count.
list_recipes
Lista receitas ao longo das categorias em que o Cookbook as arquiva. Os argumentos se combinam, e a resposta informa qual pesquisa foi construída a partir deles.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
cuisine | string, até 80 caracteres | não | Uma culinária ou um país, como Italian ou Thai. |
dish_type | string, até 80 caracteres | não | Um tipo de prato, como soup, dessert ou bread. |
main_ingredient | string, até 80 caracteres | não | O ingrediente no qual uma receita se baseia. |
limit | inteiro, de 1 a 50, padrão 15 | não | Linhas a serem retornadas. |
Em retorno: as linhas que search_recipes retorna, com query nomeando a pesquisa
que este servidor construiu a partir dos argumentos, e cada argumento ecoado de volta ou null
quando foi omitido.
Redimensionando as quantidades
Uma quantidade é expressa na unidade que lhe convém, então uma linha pode voltar em uma
unidade diferente da que a receita usou: 200 g multiplicados por vinte leem
4 kg.
O quão finamente um ingrediente pode ser dividido depende do que ele é. Um pão pode ser cortado
em dois, em três ou em quatro; um ovo não pode ser repartido. Uma quantidade que cai
entre os dois é arredondada, e a receita redimensionada então se afasta um pouco das
proporções da original. A linha carrega rounded, e sua nota informa o que foi feito.
Os valores são a aritmética deste servidor, então diga que foram recalculados quando você os exibir. Uma receita cuja página não informa número de porções não pode ser adaptada a um número de pessoas, e a resposta informa isso.
Licença e atribuição
As páginas do Cookbook são publicadas sob
Creative Commons Atribuição-CompartilhaIgual 4.0.
Repetir uma receita significa creditar o Wikibooks e a página de onde ela veio, e
compartilhar o que for construído sobre ela sob a mesma licença. get_recipe retorna tanto
license quanto a página url, então uma resposta carrega o crédito consigo.
Configuração
Toda variável é opcional. Defina-as no bloco env da configuração do seu cliente.
| Variável | Padrão | O que faz |
|---|---|---|
WB_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo para a Wikimedia, com um endereço onde uma pessoa pode ser contatada. |
WB_MIN_INTERVAL_MS | 1000 | Intervalo entre duas solicitações, de 500 a 60000. |
WB_TIMEOUT_MS | 20000 | Prazo para uma solicitação, de 1000 a 120000. |
WB_MAX_RETRIES | 3 | Tentativas após uma falha transitória, de 0 a 8. |
WB_CACHE_TTL_MS | 900000 | Por quanto tempo uma página permanece na memória, de 0 a 86400000. |
WB_CACHE_MAX_ENTRIES | 200 | Páginas mantidas na memória de uma vez, de 1 a 5000. |
WB_LOG_LEVEL | error | silent, error, info ou debug, escrito em stderr. |
Um valor fora do intervalo volta ao padrão, e o motivo é escrito em stderr.
Erros
Toda falha carrega um de seis códigos, uma mensagem e, quando ajuda, uma dica nomeando o próximo passo.
| Código | O que aconteceu | O que fazer |
|---|---|---|
not_found | O wiki respondeu e não contém essa página. | Verifique a chave da página com search_recipes. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição ser enviada. | Leia a mensagem, que nomeia o argumento. |
rate_limited | A Wikimedia pediu que este cliente diminuísse o ritmo. | Aguarde o número de segundos que a dica indica e chame novamente com os mesmos argumentos. A receita ainda está lá. |
parse_failure | A página carregou e o conteúdo esperado estava ausente. | Reporte em o rastreador de problemas. |
network_error | A requisição não foi concluída. | Tente novamente em breve. |
timeout | A requisição passou do prazo. | Aumente WB_TIMEOUT_MS, ou peça menos linhas. |
Como biblioteca
A camada que lê o wiki é publicada separadamente, com seu ritmo, seu cache e seus erros, e sem protocolo anexado.
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 e getRecipe cada um responde a { data, cached }, e lançam um erro
carregando um dos seis códigos. O intervalo entre duas requisições também se aplica aqui.
Ritmo e atribuição
As requisições saem uma de cada vez com pelo menos um segundo entre elas, e o intervalo
de meio segundo se mantém independentemente de como o servidor está configurado. O User-Agent sempre
termina com a identidade do projeto e um endereço onde uma pessoa pode ser contatada.
As leituras vão para api.wikimedia.org, o host que a Wikimedia documenta e mantém para
desenvolvedores. Cada resultado carrega o endereço da página de onde foi lido, e
a licença sob a qual é publicado.
Este servidor MCP é um projeto não oficial, sem afiliação com a Wikimedia ou com a comunidade Wikibooks.
Privacidade
Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda
na sua máquina, contata api.wikimedia.org e nada mais, mantém suas respostas na memória
enquanto roda e não grava nada em disco.
PRIVACY.md declara o que uma requisição carrega e quais configurações alteram
qualquer parte disso.
Desenvolvimento
npm install
npm run build:fixtures
npm test
npm run check
Os testes rodam contra fixtures geradas e não fazem nenhuma requisição de rede. A suíte ao vivo,
npm run test:live, faz uma requisição por rota e roda todas as noites contra o
próprio serviço.
Contribuindo
Bugs, perguntas e ideias pertencem ao rastreador de problemas. Pull requests são bem-vindos; abrir uma issue primeiro ajuda a concordar sobre a forma da mudança. Veja CONTRIBUTING.md.
Licença
MIT para o código próprio deste servidor, veja LICENSE. As páginas do Cookbook pertencem aos seus autores e à comunidade Wikibooks, sob CC BY-SA 4.0.
mcp-wikibooks-cookbook (français)
O Cookbook é a coleção de receitas dos Wikibooks anglófonos, um projeto Wikimedia. Milhares de receitas são escritas e mantidas abertamente, cada uma com seus ingredientes, o equipamento que exige, seus passos, as dicas e variantes que seus autores adicionaram, e as categorias sob as quais se classifica: uma cozinha, um tipo de prato, um ingrediente principal. As páginas são publicadas sob Creative Commons Atribuição-CompartilhaIgual 4.0.
Este servidor conecta um cliente de conversa a essa coleção. Pode-se buscar receitas por prato ou ingrediente, listá-las por cozinha, tipo de prato ou ingrediente principal, ler uma com seus ingredientes adaptados ao número de convivas, e adaptar qualquer lista de ingredientes. Nenhuma chave de API, nenhuma conta.
Instalação
Instalação em um clique
Claude Code
claude mcp add wikibooks-cookbook -- npx -y mcp-wikibooks-cookbook
Claude Desktop, Cursor, e qualquer cliente no formato de configuração padrão
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "npx",
"args": ["-y", "mcp-wikibooks-cookbook"]
}
}
}
Node 24 ou mais recente é necessário, e nenhuma variável de ambiente precisa ser preenchida.
Com Docker
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-wikibooks-cookbook:2.0.1"]
}
}
}
-i mantém a entrada padrão aberta, que é o canal do protocolo, e -t é
omitido porque um TTY reescreve o fluxo. O contêiner precisa de acesso HTTPS
de saída para api.wikimedia.org, e nada mais: nenhum volume, nenhuma porta,
nenhuma credencial.
Bundle, sem npm
Baixe mcp-wikibooks-cookbook-2.0.1.mcpb de
a última publicação
e abra-o. Um cliente que gerencia bundles MCP o instala sozinho, sem npm e
sem arquivo de configuração para modificar. O bundle carrega suas dependências, portanto
nada é baixado na instalação.
O que se pode pedir
- « Encontre-me uma receita de carbonara no Cookbook. »
- « Leia-a para seis pessoas em vez de quatro. »
- « Quais sopas tailandesas a coleção contém? »
- « Quais receitas são baseadas em lentilhas? »
- « Multiplique esta lista de ingredientes por 2,5. »
O caminho comum vai de uma busca a uma leitura: uma linha carrega um id,
a chave da página, e get_recipe retoma essa chave.
As ferramentas
| Ferramenta | O que faz |
|---|---|
search_recipes | Encontra receitas por prato ou ingrediente. |
get_recipe | Lê uma receita, adaptada a um número de porções sob demanda. |
scale_ingredients | Adapta qualquer lista de ingredientes, sem consulta ao wiki. |
list_recipes | Lista receitas por cozinha, tipo de prato ou ingrediente principal. |
search_recipes
Busca no Cookbook, seja em todo o texto de suas páginas, seja apenas em seus títulos.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
query | string, 1 a 300 caracteres | sim | Um prato, como carbonara, ou um ingrediente, como guanciale. |
search | text ou title, padrão text | não | text lê a página inteira; title corresponde apenas ao nome da página. |
limit | inteiro, 1 a 50, padrão 10 | não | Linhas a servir. |
Em retorno: linhas carregando id, a chave da página que get_recipe
retoma; title; url; image_url; description, a breve glosa que o
wiki mantém para uma página; e excerpt, o trecho correspondente sem
sua marcação de destaque. Cada um dos três últimos vale null onde a
busca não propôs nenhum. total_available vale sempre null: a rota
de busca não publica nem total nem paginação, portanto result_count conta as
linhas renderizadas por esta chamada.
get_recipe
Lê uma receita e adapta seus ingredientes quando um número de porções é dado.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string, 1 a 300 caracteres | sim | A chave da página, como Cookbook:Spaghetti_alla_Carbonara. |
servings | inteiro, 1 a 500 | não | Adapta os ingredientes a esse número de porções. |
max_description_chars | inteiro, 100 a 20000, padrão 1200 | não | A quantidade de prosa da página a servir. |
Em retorno: title, url, ingredients, equipment, steps, tips para
as notas e variantes que a página publica, prep_minutes, cook_minutes,
total_minutes, time_text nos termos da página, time_phases,
category e categories para cada categoria sob a qual a página se classifica.
Um número que a página não indica vale null. id nomeia a página que foi
lida, que difere da chave solicitada após um redirecionamento, e redirected_from
nomeia então a chave que levou a ela. yield diz para quantas porções a receita é escrita e
para quantas foi adaptada, e cada ingrediente carrega scaling, valendo
scaled, rounded ou unscaled.
scale_ingredients
Aplica a mesma aritmética a qualquer lista de ingredientes, sem consulta ao wiki.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
ingredients | array de 1 a 100 strings, até 300 caracteres | sim | As linhas a adaptar. |
factor | número, acima de 0 até 100 | um dos dois | O multiplicador a aplicar. |
from_servings | número, acima de 0 até 500 | um dos dois | O número de porções da lista original. |
to_servings | número, acima de 0 até 500 | um dos dois | O número de porções desejado. |
Passe factor, ou o par from_servings e to_servings.
Em retorno: o factor usado, os ingredients adaptados na forma que
get_recipe retorna, e scaled_count, rounded_count e unscaled_count.
list_recipes
Lista receitas segundo as categorias sob as quais o Cookbook as classifica. Os argumentos se combinam, e a resposta diz qual busca foi construída a partir deles.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
cuisine | string, até 80 caracteres | não | Uma cozinha ou um país, como Italian ou Thai. |
dish_type | string, até 80 caracteres | não | Um tipo de prato, como soup, dessert ou bread. |
main_ingredient | string, até 80 caracteres | não | O ingrediente sobre o qual uma receita é baseada. |
limit | inteiro, 1 a 50, padrão 15 | não | Linhas a servir. |
Em retorno: as linhas que search_recipes retorna, com query que nomeia a
busca construída por este servidor a partir dos argumentos, e cada argumento repetido
ou null onde foi omitido.
A adaptação das quantidades
Uma quantidade é expressa na unidade que lhe convém. Após a adaptação, uma
linha pode, portanto, aparecer em outra unidade que não a da receita: 200 g
multiplicados por vinte dão 4 kg.
A fineza com que um ingrediente é cortado depende de sua natureza. Um pão se
corta em dois, em três ou em quatro; um ovo não se divide. Uma quantidade
que fica entre os dois é então arredondada, e a receita adaptada se afasta
um pouco das proporções da original. A linha traz rounded, e sua nota diz
o que foi feito.
Os números são a aritmética deste servidor, então diga que eles foram recalculados quando você os mostra. Uma receita cuja página não indica nenhum número de porções não pode ser ajustada para um número de convidados, e a resposta diz isso.
A licença e a atribuição
As páginas do Cookbook são publicadas sob
Creative Commons Atribuição-CompartilhaIgual 4.0.
Reutilizar uma receita exige creditar a Wikibooks e a página de onde ela vem,
e compartilhar o que se constrói sobre ela sob a mesma licença. get_recipe devolve ao
mesmo tempo license e a url da página, então uma resposta carrega o crédito com
ela.
Configuração
Cada variável é opcional. Elas são definidas no bloco env da
configuração do cliente.
| Variável | Padrão | O que ela faz |
|---|---|---|
WB_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo junto à Wikimedia, com um endereço para contato com uma pessoa. |
WB_MIN_INTERVAL_MS | 1000 | Intervalo entre duas requisições, de 500 a 60000. |
WB_TIMEOUT_MS | 20000 | Tempo limite de uma requisição, de 1000 a 120000. |
WB_MAX_RETRIES | 3 | Tentativas após uma falha temporária, de 0 a 8. |
WB_CACHE_TTL_MS | 900000 | Duração durante a qual uma página permanece na memória, de 0 a 86400000. |
WB_CACHE_MAX_ENTRIES | 200 | Páginas mantidas na memória por vez, de 1 a 5000. |
WB_LOG_LEVEL | error | silent, error, info ou debug, escrito na saída de erro. |
Um valor fora de seu intervalo cai no padrão, e o motivo é escrito na saída de erro.
Erros
Cada falha carrega um dos seis códigos, uma mensagem e, quando ajuda, uma indicação do próximo passo.
| Código | O que aconteceu | O que fazer |
|---|---|---|
not_found | O wiki respondeu e não tem essa página. | Verifique a chave da página com search_recipes. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição. | Leia a mensagem, que nomeia o argumento. |
rate_limited | A Wikimedia pede que este cliente desacelere. | Aguarde os segundos indicados e chame novamente com os mesmos argumentos. A receita continua lá. |
parse_failure | A página carregou e o conteúdo esperado está ausente. | Reporte em o rastreador de incidentes. |
network_error | A requisição não foi concluída. | Tente novamente em breve. |
timeout | A requisição excedeu seu tempo limite. | Aumente WB_TIMEOUT_MS, ou peça menos linhas. |
Como biblioteca
A camada que lê o wiki é publicada sozinha, com seu ritmo, seu cache e seus erros, sem protocolo anexado.
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 e getRecipe respondem cada um { data, cached }, e levantam um erro
com um dos seis códigos. O intervalo mínimo entre duas requisições também se aplica aqui.
Ritmo e atribuição
As requisições saem uma a uma com pelo menos um segundo entre elas, e o
intervalo mínimo de meio segundo vale independentemente da configuração. O
User-Agent sempre termina com a identidade do projeto e um endereço para
contato com uma pessoa.
As leituras vão para api.wikimedia.org, o host que a Wikimedia documenta e
mantém para desenvolvedores. Cada resultado traz o endereço da página de onde
foi lido e a licença sob a qual ela é publicada.
Este MCP é um projeto não oficial, sem afiliação à Wikimedia nem à comunidade Wikibooks.
Privacidade
Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda na
sua máquina, anexa apenas api.wikimedia.org, mantém suas respostas na memória enquanto
roda e não grava nada no disco. PRIVACY.md diz o que uma
requisição carrega e quais ajustes mudam isso.
Desenvolvimento
npm install
npm run build:fixtures
npm test
npm run check
Os testes são executados em fixtures geradas e não emitem nenhuma requisição.
A suíte ao vivo, npm run test:live, emite uma requisição por rota e roda
todas as noites contra o próprio serviço.
Contribuir
Anomalias, perguntas e ideias têm seu lugar em o rastreador de incidentes. Propostas de modificação são bem-vindas; abrir um ticket primeiro ajuda a alinhar a forma da mudança. Veja CONTRIBUTING.md.
Licença
MIT para o código deste servidor, veja LICENSE. As páginas do Cookbook pertencem aos seus autores e à comunidade Wikibooks, sob CC BY-SA 4.0.