Marmiton

Pesquise receitas do Marmiton, leia ingredientes e etapas, e ajuste as quantidades para qualquer número de porções.

Documentação

mcp-marmiton

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

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.

Versão francesa


Instalação

Instalação em um clique

Install in Cursor Install in VS Code

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

FerramentaO que faz
search_recipesEncontra receitas por prato ou ingrediente.
get_recipeLê uma receita, redimensionada para um número de porções sob pedido.
scale_ingredientsRedimensiona 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.

ArgumentoTipoObrigatórioO que faz
querystring, até 200 caracteressimO que pesquisar, em francês.
limitinteiro, 1 a 30, padrão 10nãoReceitas 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.

ArgumentoTipoObrigatórioO que faz
idstring de dígitosum de doisO id da receita no Marmiton, como search_recipes o retornou.
urluma URL marmiton.orgum de doisO endereço da receita, usado quando id está ausente.
servingsnúmero, acima de 0 e até 500nãoRedimensiona 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.

ArgumentoTipoObrigatórioO que faz
ingredientsarray de 1 a 100 strings, até 300 caracteressimAs linhas a redimensionar, em francês.
factornúmero, acima de 0 e até 100um de doisO multiplicador a aplicar.
from_servingsnúmero, acima de 0 e até 500um de doisPara quantas porções a lista foi escrita.
to_servingsnúmero, acima de 0 e até 500um de doisQuantas 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.

SinalizadorSignificadoExemplo
scaledO valor é o produto em si.3 oeufs ×2 → 6 oeufs
roundedO valor foi ajustado para continuar utilizável.25 cl de lait ×0,667 → 17 cl de lait
unscaledNã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ávelPadrãoO que faz
MARMITON_USER_AGENTa identidade do projetoNomeia seu aplicativo para o Marmiton, com um endereço onde uma pessoa possa ser contatada.
MARMITON_MIN_INTERVAL_MS1000Intervalo entre duas requisições, de 500 a 60000. Um valor abaixo do mínimo é recusado e este é usado.
MARMITON_TIMEOUT_MS15000Prazo para uma requisição, de 1000 a 120000.
MARMITON_MAX_RETRIES3Tentativas após uma falha transitória, de 0 a 10.
MARMITON_CACHE_TTL_MS900000Por quanto tempo uma página permanece na memória, de 0 a 86400000.
MARMITON_CACHE_MAX_ENTRIES200Páginas mantidas na memória de uma vez, de 0 a 10000.
MARMITON_LOG_LEVELerrorsilent, 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ódigoO que aconteceuO que fazer
not_foundO Marmiton respondeu e não tem tal receita.Verifique o id com search_recipes.
invalid_inputOs argumentos foram recusados antes de qualquer requisição sair.Leia a mensagem, que nomeia o argumento.
rate_limitedO 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_failureA página carregou e o conteúdo esperado estava ausente.Reporte em o rastreador de problemas.
network_errorA requisição não foi concluída.Tente novamente em breve.
timeoutA 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)

Versão em inglê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

Install in Cursor Install in VS Code

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

FerramentaO que faz
search_recipesEncontra receitas por prato ou ingrediente.
get_recipeLê uma receita, adaptada a um número de porções sob demanda.
scale_ingredientsAdapta 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.

ArgumentoTipoObrigatórioO que faz
querystring, até 200 caracteressimO que se busca, em francês.
limitinteiro, 1 a 30, padrão 10nãoReceitas 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.

ArgumentoTipoObrigatórioO que faz
idstring de dígitosum dos doisO identificador Marmiton retornado por search_recipes.
urlum endereço marmiton.orgum dos doisO endereço da receita, usado na falta de id.
servingsnúmero, acima de 0 até 500nãoAdapta 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.

ArgumentoTipoObrigatórioO que faz
ingredientsarray de 1 a 100 strings, até 300 caracteressimAs linhas a adaptar, em francês.
factornúmero, acima de 0 até 100um dos doisO multiplicador a aplicar.
from_servingsnúmero, acima de 0 até 500um dos doisO número de porções para o qual a lista é escrita.
to_servingsnúmero, acima de 0 até 500um dos doisO 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.

MarcadorO que significaExemplo
scaledO valor é o próprio produto.3 oeufs ×2 → 6 oeufs
roundedO valor foi deslocado para continuar utilizável.25 cl de lait ×0,667 → 17 cl de lait
unscaledNã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ávelPadrãoO que faz
MARMITON_USER_AGENTa identidade do projetoNomeia seu aplicativo junto ao Marmiton, com um endereço onde contatar uma pessoa.
MARMITON_MIN_INTERVAL_MS1000Intervalo entre duas requisições, de 500 a 60000. Um valor abaixo do piso é recusado em favor deste.
MARMITON_TIMEOUT_MS15000Tempo limite de uma requisição, de 1000 a 120000.
MARMITON_MAX_RETRIES3Tentativas após uma falha passageira, de 0 a 10.
MARMITON_CACHE_TTL_MS900000Duração durante a qual uma página permanece na memória, de 0 a 86400000.
MARMITON_CACHE_MAX_ENTRIES200Páginas mantidas na memória por vez, de 0 a 10000.
MARMITON_LOG_LEVELerrorsilent, 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ódigoO que aconteceuO que fazer
not_foundMarmiton respondeu e não tem essa receita.Verifique o identificador com search_recipes.
invalid_inputOs argumentos foram recusados antes de qualquer requisição.Leia a mensagem, que nomeia o argumento.
rate_limitedMarmiton pede que este cliente desacelere.Aguarde os segundos indicados e chame novamente com os mesmos argumentos. A receita ainda está lá.
parse_failureA página carregou e o conteúdo esperado está ausente.Reporte em o rastreador de incidentes.
network_errorA requisição não foi concluída.Tente novamente em breve.
timeoutA 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.