Marmiton
Pesquise receitas do Marmiton, leia ingredientes e etapas, e ajuste as quantidades para qualquer número de porções.
Documentação
mcp-marmiton
Marmiton é o maior site de culinária francês, onde cozinheiros caseiros publicam suas receitas desde 1999. Cada uma traz seus ingredientes com quantidades, os passos a seguir, os tempos de preparo e cozimento, o número de porções para o qual foi escrita e as avaliações deixadas por quem a preparou.
Este servidor conecta um cliente de chat a esse site. Você pode pesquisar receitas por prato ou ingrediente, ler uma receita completa com ingredientes e passos, e redimensionar as quantidades para o número de pessoas à sua mesa, com cada linha indicando se o valor é exato ou foi ajustado para continuar utilizável na cozinha. Não exige chave de API nem conta.
Instalação
Instalação em um clique
Claude Code
claude mcp add marmiton -- npx -y mcp-marmiton
Claude Desktop, Cursor e qualquer cliente que use o formato de configuração padrão
{
"mcpServers": {
"marmiton": {
"command": "npx",
"args": ["-y", "mcp-marmiton"]
}
}
}
Node 24 ou posterior é necessário, e nenhuma variável de ambiente precisa ser definida.
Com Docker
{
"mcpServers": {
"marmiton": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-marmiton:2.0.1"]
}
}
}
-i mantém o stdin aberto, que é por onde o protocolo trafega, e -t fica de fora
porque um TTY reescreve o fluxo. O contêiner precisa de HTTPS de saída para
www.marmiton.org, e nada mais: sem volume, sem porta, sem credencial.
Pacote, sem npm
Baixe mcp-marmiton-2.0.1.mcpb de
o lançamento mais recente
e abra-o. Um cliente que suporta 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 pedir
- « Trouve-moi une recette de tarte aux pommes. »
- "Leia essa receita para seis pessoas em vez de quatro."
- "O que posso fazer com abobrinha e chèvre?"
- "Aqui está uma receita que copiei de um livro, redimensione por 1,5 para mim."
- "Quanto tempo leva a segunda para cozinhar?"
Marmiton é um site francês, então suas receitas são encontradas em francês: tarte aux pommes, poulet curry coco. O caminho comum vai de uma busca a uma leitura:
search_recipes nomeia um id, e get_recipe recebe esse id.
Ferramentas
| Ferramenta | O que faz |
|---|---|
search_recipes | Encontra receitas por prato ou ingrediente. |
get_recipe | Lê uma receita, redimensionada para um número de porções sob pedido. |
scale_ingredients | Redimensiona qualquer lista de ingredientes, sem consultar o site. |
O servidor apenas lê. Ele não publica nada no Marmiton.
search_recipes
Pesquisa as receitas por um prato ou ingrediente. O Marmiton faz correspondência pelas letras iniciais de uma palavra, então uma consulta traz o que o site classificou para ela, e a resposta avisa quando os títulos não contêm nenhuma das palavras pedidas.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
query | string, até 200 caracteres | sim | O que pesquisar, em francês. |
limit | inteiro, 1 a 30, padrão 10 | não | Receitas a servir desta página de resultados. |
Em retorno: linhas com id, que get_recipe recebe; title; url; e
image_url, que é null para uma receita publicada sem foto. Junto
vêm result_count e total_available, as receitas nesta página antes
de limit ser aplicado. O robots.txt do Marmiton desautoriza a paginação pelos resultados
de busca, então uma página é o que uma busca lê: restrinja a consulta para ver outras
receitas.
get_recipe
Lê uma receita completa e redimensiona suas quantidades quando um número de porções é informado.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string de dígitos | um de dois | O id da receita no Marmiton, como search_recipes o retornou. |
url | uma URL marmiton.org | um de dois | O endereço da receita, usado quando id está ausente. |
servings | número, acima de 0 e até 500 | não | Redimensiona as quantidades para este número de porções. |
Em retorno: title, url, ingredients, steps, prep_minutes,
cook_minutes, total_minutes, category, author, rating e nutrition,
cada null quando a página não publica nenhum. yield diz para quantas pessoas a receita foi
escrita e para quantas foi redimensionada: original_count, original_text,
requested, unit para o que está sendo contado, e factor para o multiplicador
aplicado. Cada ingrediente traz original, text, amount, amountMax para um
intervalo, unit, e scaling, que lê scaled, rounded ou unscaled. Os
valores são aritmética deste servidor, então diga que foram recalculados ao mostrá-los. nutrition descreve a receita como publicada, no seu próprio número de
porções.
scale_ingredients
Aplica a mesma aritmética a qualquer lista de linhas de ingredientes, sem consultar o site, então funciona em uma receita copiada de um livro ou de um caderno de família.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
ingredients | array de 1 a 100 strings, até 300 caracteres | sim | As linhas a redimensionar, em francês. |
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,
que contam as linhas cujo valor o arredondamento alterou.
Redimensionando as quantidades
Cada ingrediente volta com um sinalizador scaling dizendo o que o redimensionamento pôde
fazer com sua quantidade.
| Sinalizador | Significado | Exemplo |
|---|---|---|
scaled | O valor é o produto em si. | 3 oeufs ×2 → 6 oeufs |
rounded | O valor foi ajustado para continuar utilizável. | 25 cl de lait ×0,667 → 17 cl de lait |
unscaled | Não traz quantidade, então fica exatamente como escrito. | sel, coriandre |
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 é. Uma baguete pode ser
cortada 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 do original. A linha traz rounded, e seu note diz
o que foi feito.
Configuração
Toda variável é opcional. Defina-as no bloco env da configuração do seu cliente.
| Variável | Padrão | O que faz |
|---|---|---|
MARMITON_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo para o Marmiton, com um endereço onde uma pessoa possa ser contatada. |
MARMITON_MIN_INTERVAL_MS | 1000 | Intervalo entre duas requisições, de 500 a 60000. Um valor abaixo do mínimo é recusado e este é usado. |
MARMITON_TIMEOUT_MS | 15000 | Prazo para uma requisição, de 1000 a 120000. |
MARMITON_MAX_RETRIES | 3 | Tentativas após uma falha transitória, de 0 a 10. |
MARMITON_CACHE_TTL_MS | 900000 | Por quanto tempo uma página permanece na memória, de 0 a 86400000. |
MARMITON_CACHE_MAX_ENTRIES | 200 | Páginas mantidas na memória de uma vez, de 0 a 10000. |
MARMITON_LOG_LEVEL | error | silent, error, info ou debug, escritos em stderr. |
Um valor fora do intervalo volta ao padrão, e o motivo é escrito em stderr.
Erros
Toda falha traz um de seis códigos, uma mensagem e, quando ajuda, uma dica indicando o próximo passo.
| Código | O que aconteceu | O que fazer |
|---|---|---|
not_found | O Marmiton respondeu e não tem tal receita. | Verifique o id com search_recipes. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição sair. | Leia a mensagem, que nomeia o argumento. |
rate_limited | O Marmiton pediu que este cliente diminuísse o ritmo. | Aguarde o número de segundos que a dica nomeia 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 MARMITON_TIMEOUT_MS. |
Como biblioteca
A camada que lê o Marmiton é publicada separadamente, com seu ritmo, seu cache e seus erros, e sem protocolo anexado.
import { MarmitonClient } from "mcp-marmiton/client";
const client = new MarmitonClient();
const { data, cached } = await client.getRecipe({ id: "18257" });
console.log(data.title, data.ingredients.length, cached);
search e getRecipe respondem cada uma com { data, cached }, e lançam um erro
carregando 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 são enviadas uma de cada vez com um intervalo mínimo entre elas, e esse piso
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. Tudo é lido
do schema.org JSON-LD que o Marmiton publica para máquinas, e os caminhos que o
robots.txt dele desautoriza são deixados de lado.
Cada resultado traz o título e o endereço da receita, e get_recipe
traz o autor quando a página o nomeia, junto com attribution, o título
e o endereço escritos em uma única linha.
As receitas pertencem ao Marmiton e aos cozinheiros que as escreveram. Este servidor MCP é um projeto não oficial, sem afiliação com o Marmiton.
Privacidade
Este servidor não coleta nada sobre você e não envia nada ao autor. Ele roda
na sua máquina, contata www.marmiton.org e nada mais, mantém as 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 site.
Contribuindo
Bugs, perguntas e ideias pertencem ao rastreador de issues. Pull requests são bem-vindos; abrir uma issue primeiro ajuda a concordar sobre o formato da mudança. Veja CONTRIBUTING.md.
Licença
MIT, veja LICENSE. As receitas pertencem ao Marmiton e aos seus autores.
mcp-marmiton (francês)
Marmiton é o maior site de culinária francês, onde cozinheiros publicam suas receitas desde 1999. Cada uma traz seus ingredientes com as quantidades, os passos a seguir, os tempos de preparo e de cozimento, o número de porções para o qual foi escrita e as notas deixadas por quem a fez.
Este servidor conecta um cliente de conversa a esse site. É possível buscar receitas por prato ou ingrediente, ler uma inteira com seus ingredientes e passos, e adaptar as quantidades ao número de convidados, cada linha dizendo se o número é exato ou se foi deslocado para continuar utilizável na cozinha. Nenhuma chave de API, nenhuma conta.
Instalação
Instalação em um clique
Claude Code
claude mcp add marmiton -- npx -y mcp-marmiton
Claude Desktop, Cursor e qualquer cliente no formato de configuração padrão
{
"mcpServers": {
"marmiton": {
"command": "npx",
"args": ["-y", "mcp-marmiton"]
}
}
}
Node 24 ou mais recente é necessário, e nenhuma variável de ambiente precisa ser preenchida.
Com Docker
{
"mcpServers": {
"marmiton": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-marmiton: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 www.marmiton.org, e nada mais: nenhum volume, nenhuma porta,
nenhum identificador.
Bundle, sem npm
Baixe mcp-marmiton-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, então
nada é baixado na instalação.
O que se pode pedir
- "Encontre uma receita de torta de maçã."
- "Leia esta receita para seis pessoas em vez de quatro."
- "O que posso fazer com abobrinha e queijo de cabra?"
- "Aqui está uma receita copiada de um livro, multiplique por 1,5."
- "Quanto tempo de cozimento para a segunda?"
Marmiton é um site francês, então suas receitas estão em francês: tarte aux pommes, poulet curry coco. O caminho comum vai de uma busca a uma
leitura: search_recipes nomeia um id, e get_recipe retoma esse
identificador.
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 requisição ao site. |
O servidor apenas lê. Ele não publica nada no Marmiton.
search_recipes
Busca receitas por prato ou ingrediente. Marmiton faz correspondência das primeiras letras de uma palavra, então uma consulta traz o que o site classificou para ela, e a resposta sinaliza quando os títulos não trazem nenhuma das palavras pedidas.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
query | string, até 200 caracteres | sim | O que se busca, em francês. |
limit | inteiro, 1 a 30, padrão 10 | não | Receitas a servir desta página de resultados. |
Em retorno: linhas com id, que get_recipe retoma; title;
url; e image_url, null para uma receita publicada sem foto. Vêm
também result_count e total_available, as receitas desta página antes
da aplicação de limit. O robots.txt do Marmiton proíbe paginar os
resultados de busca, então uma busca lê uma página: restrinja a consulta
para ver outras receitas.
get_recipe
Lê uma receita inteira e adapta suas quantidades quando um número de porções é dado.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string de dígitos | um dos dois | O identificador Marmiton retornado por search_recipes. |
url | um endereço marmiton.org | um dos dois | O endereço da receita, usado na falta de id. |
servings | número, acima de 0 até 500 | não | Adapta as quantidades a esse número de porções. |
Em retorno: title, url, ingredients, steps, prep_minutes,
cook_minutes, total_minutes, category, author, rating e nutrition,
cada um null quando a página não publica. yield diz para quantas porções a receita é
escrita e para quantas foi adaptada: original_count, original_text,
requested, unit para o que é contado, e factor para o multiplicador
aplicado. Cada ingrediente traz original, text, amount, amountMax para
um intervalo, unit, e scaling, que vale scaled, rounded ou unscaled.
Os números são a aritmética deste servidor, então diga que foram
recalculados quando você os mostrar. nutrition descreve a receita como
publicada, para seu próprio número de porções.
scale_ingredients
Aplica a mesma aritmética a qualquer lista de ingredientes, sem requisição ao site, portanto em uma receita copiada de um livro ou de um caderno de família.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
ingredients | array de 1 a 100 strings, até 300 caracteres | sim | As linhas a adaptar, em francês. |
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 para o qual a lista é escrita. |
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, que
contam as linhas cujo arredondamento deslocou o valor.
A adaptação das quantidades
Cada ingrediente volta com um marcador scaling que diz o que a adaptação
pôde fazer com sua quantidade.
| Marcador | O que significa | Exemplo |
|---|---|---|
scaled | O valor é o próprio produto. | 3 oeufs ×2 → 6 oeufs |
rounded | O valor foi deslocado para continuar utilizável. | 25 cl de lait ×0,667 → 17 cl de lait |
unscaled | Não traz quantidade, deixado como está. | sel, coriandre |
Uma quantidade é expressa na unidade que lhe convém. Após a adaptação, uma
linha pode 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 se corta depende de sua natureza. Uma baguete se
corta em dois, em três ou em quatro; um ovo não se divide. Uma quantidade
que cai 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 note diz
o que foi feito.
Configuração
Cada variável é opcional. Elas se colocam no bloco env da
configuração do cliente.
| Variável | Padrão | O que faz |
|---|---|---|
MARMITON_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo junto ao Marmiton, com um endereço onde contatar uma pessoa. |
MARMITON_MIN_INTERVAL_MS | 1000 | Intervalo entre duas requisições, de 500 a 60000. Um valor abaixo do piso é recusado em favor deste. |
MARMITON_TIMEOUT_MS | 15000 | Tempo limite de uma requisição, de 1000 a 120000. |
MARMITON_MAX_RETRIES | 3 | Tentativas após uma falha passageira, de 0 a 10. |
MARMITON_CACHE_TTL_MS | 900000 | Duração durante a qual uma página permanece na memória, de 0 a 86400000. |
MARMITON_CACHE_MAX_ENTRIES | 200 | Páginas mantidas na memória por vez, de 0 a 10000. |
MARMITON_LOG_LEVEL | error | silent, error, info ou debug, escrito na saída de erro. |
| Um valor fora do 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 | Marmiton respondeu e não tem essa receita. | Verifique o identificador com search_recipes. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição. | Leia a mensagem, que nomeia o argumento. |
rate_limited | Marmiton pede que este cliente desacelere. | Aguarde os segundos indicados e chame novamente com os mesmos argumentos. A receita ainda está 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 o tempo limite. | Aumente MARMITON_TIMEOUT_MS. |
Como biblioteca
A camada que lê Marmiton é publicada sozinha, com seu ritmo, seu cache e seus erros, sem protocolo anexado.
import { MarmitonClient } from "mcp-marmiton/client";
const client = new MarmitonClient();
const { data, cached } = await client.getRecipe({ id: "18257" });
console.log(data.title, data.ingredients.length, cached);
search e getRecipe respondem cada um { data, cached }, e lançam 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 um intervalo mínimo entre elas, e esse piso
vale independentemente da configuração. O User-Agent sempre termina com
a identidade do projeto e um endereço para contatar uma pessoa. Tudo é lido no
JSON-LD schema.org que Marmiton publica para máquinas, e os caminhos que
seu robots.txt proíbe são deixados em paz.
Cada resultado traz o título e o endereço da receita, e get_recipe traz
o autor quando a página o nomeia, além de attribution, o título e o endereço
escritos em uma linha.
As receitas pertencem a Marmiton e aos cozinheiros que as escreveram. Este MCP é um projeto não oficial, sem afiliação com Marmiton.
Privacidade
Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda na
sua máquina, junta apenas www.marmiton.org, mantém suas respostas em memória enquanto
roda, e não grava nada no disco. PRIVACY.md diz o que uma
requisição leva e quais configurações 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 site.
Contribuindo
Anomalias, perguntas e ideias têm seu lugar em o rastreador de incidentes. As 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, veja LICENSE. As receitas pertencem a Marmiton e aos seus autores.