Supertoinette

Leia as receitas do Supertoinette e reescala as quantidades com honestidade. Sem chave de API.

Documentação

mcp-supertoinette

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

Supertoinette é um site de culinária francês, um dos mais antigos ainda em atividade. Suas receitas trazem ingredientes, etapas, tempos de preparo, cozimento e descanso, o número de pessoas que servem e as fotografias do prato. Além das receitas, mantém um conjunto de páginas próprias sobre o que beber com um prato, combinando um vinho a ele e indicando a qual estilo ele pertence.

Este servidor conecta um cliente de chat a esse site. Você pode pesquisar suas receitas, ler uma com os ingredientes reescalados para o número de pessoas à sua mesa, percorrer suas categorias, ler uma categoria página por página e consultar o que ele sugere beber com um prato. 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 supertoinette -- npx -y mcp-supertoinette

Claude Desktop, Cursor e qualquer cliente que use o formato de configuração padrão

{
  "mcpServers": {
    "supertoinette": {
      "command": "npx",
      "args": ["-y", "mcp-supertoinette"]
    }
  }
}

Node 24 ou posterior é necessário, e nenhuma variável de ambiente precisa ser definida.

Com Docker

{
  "mcpServers": {
    "supertoinette": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-supertoinette:1.0.2"]
    }
  }
}

-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 www.supertoinette.com, e nada mais: sem volume, sem porta, sem credencial.

Pacote, sem npm

Baixe mcp-supertoinette-1.0.2.mcpb de o lançamento 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

  • « Trouve-moi une recette de blanquette de veau. »
  • "Leia essa receita para dez pessoas."
  • "Em quais categorias o site arquiva suas receitas?"
  • "Qual vinho combina com um boeuf bourguignon?"
  • "Reescala esta lista de ingredientes do caderno da minha avó por três."

Supertoinette é um site francês, então suas receitas são encontradas em francês. O caminho comum vai de uma busca a uma receita: uma linha carrega um id, e get_recipe recebe esse id.

Ferramentas

FerramentaO que faz
get_recipeLê uma receita, reescalada para um número de porções sob pedido.
search_recipesEncontra receitas por prato ou por ingrediente.
list_categoriesLê as categorias sob as quais o site arquiva suas receitas.
browse_recipesLê uma categoria, página por página.
get_wine_pairingsLê o que o site sugere beber com um prato.
scale_ingredientsReescala qualquer lista de ingredientes, sem consultar o site.

get_recipe

Lê uma receita por completo e reescala seus ingredientes quando um número de porções é fornecido.

ArgumentoTipoObrigatórioO que faz
idstring, 1 a 10 caracteressimO número no endereço de uma receita, como uma linha o carrega.
servingsinteiro, 1 a 1000nãoReescala os ingredientes para este número de porções.

Em retorno: title com o pictograma com o qual o site a abre removido, e title_as_published exatamente como o site a escreveu; url; description; published_at; intro, a prosa impressa acima do método; steps; prep_minutes, cook_minutes, rest_minutes e total_minutes; category; author; e rating, cada null onde a página não declara nada. yield diz para o que a receita foi escrita e para o que foi reescalada. ingredients carrega as linhas com os títulos sob os quais a página as agrupa, que é o que ingredient_count conta, e o scaling de cada linha lê scaled, rounded ou unscaled.

search_recipes

Pesquisa as receitas por um prato ou ingrediente, uma página por vez.

ArgumentoTipoObrigatórioO que faz
querystring, 1 a 120 caracteressimUm prato ou ingrediente, em francês.
limitinteiro, 1 a 39nãoLinhas a servir.
pageinteiro, 1 a 1000nãoQual página de resultados ler, a primeira por padrão.
categorystring, 1 a 60 caracteresnãoUma categoria, escrita como o facets de uma resposta anterior a escreveu.

Em retorno: linhas carregando id, que get_recipe recebe, title, title_as_published e url. Junto vêm page, last_page para a página mais alta que o site linka a partir desta, result_count, rows_published para as linhas que a página continha antes de qualquer renderização, total_available e facets, que publica as formulações de categoria que uma busca posterior recebe. Nunca construa uma formulação de categoria manualmente: o site responde a uma que não conhece com uma página que se lê como uma ausência.

list_categories

Lê as categorias sob as quais o site arquiva suas receitas. Não recebe argumento.

Em retorno: categories, com category_count para as entradas que as duas listas do site contêm, e o url do qual foram lidas. Passe uma categoria adiante para browse_recipes.

browse_recipes

Lê uma categoria, página por página.

ArgumentoTipoObrigatórioO que faz
categorystring, 1 a 80 caracteressimUma categoria, como list_categories a publicou.
limitinteiro, 1 a 30nãoLinhas a servir.
pageinteiro, 1 a 1000nãoQual página ler, a primeira por padrão.

Em retorno: as linhas e o envelope que search_recipes retorna, com last_page dizendo até onde a listagem vai.

get_wine_pairings

Lê o que o site sugere beber com um prato, das páginas que escreveu sobre o assunto.

ArgumentoTipoObrigatórioO que faz
idstring, 1 a 10 caracteresum de doisO número no endereço de um prato.
pageinteiro, 1 a 100um de doisUma página da listagem própria de pratos do site.

Em retorno: entradas carregando o id, o dish sob o nome próprio do site para ele, e style, o estilo de vinho com o qual a página abre, que é null onde não escreveu nenhum.

scale_ingredients

Aplica a mesma aritmética a qualquer lista de linhas de ingredientes em francês, sem consultar o site.

ArgumentoTipoObrigatórioO que faz
ingredientsarray de 1 a 200 strings, 1 a 300 caracteressimAs linhas a reescalar, como a receita as escreveu.
factornúmero, acima de 0 e até 100um de doisPelo que multiplicar as quantidades.
from_servingsinteiro, 1 a 1000um de doisPara quantas a lista foi escrita.
to_servingsinteiro, 1 a 1000um de doisQuantas deve servir.

Passe factor, ou o par from_servings e to_servings.

Em retorno: as linhas reescaladas na forma que get_recipe retorna, cada uma com seu scaling.

Reescalando as quantidades

Uma quantidade é declarada na unidade que lhe convém, então uma linha pode voltar em uma unidade diferente da que a receita usou: 200 g multiplicado por vinte lê 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 reescalada então se afasta um pouco das proporções da original. A linha carrega rounded, e sua nota diz o que foi feito.

Os números são a aritmética deste servidor, então diga que foram recalculados quando você os mostrar. Uma receita cuja página não declara número de porções não pode ser ajustada a um número de pessoas, e a resposta diz isso.

Configuração

Toda variável é opcional. Defina-as no bloco env da configuração do seu cliente.

VariávelPadrãoO que faz
STO_USER_AGENTa identidade do projetoNomeia seu aplicativo para o site, com um endereço onde uma pessoa pode ser alcançada.
STO_MIN_INTERVAL_MS3000Intervalo entre duas solicitações, de 3000 a 60000.
STO_TIMEOUT_MS20000Prazo para uma solicitação, de 1000 a 120000.
STO_MAX_RETRIES3Tentativas após uma falha transitória, de 0 a 8.
STO_CACHE_TTL_MS900000Quanto tempo uma página permanece na memória, de 0 a 86400000.
STO_CACHE_MAX_ENTRIES200Páginas mantidas na memória de uma vez, de 1 a 5000.
STO_LOG_LEVELerrorsilent, error, info ou debug, escrito em stderr.

Um valor fora de seu intervalo volta ao padrão, e o motivo é escrito em stderr.

Erros

Toda falha carrega um de seis códigos, uma mensagem e, onde ajuda, uma dica nomeando o próximo passo.

CódigoO que aconteceuO que fazer
not_foundO site respondeu e não contém tal receita ou página.Verifique o id com search_recipes.
invalid_inputOs argumentos foram recusados antes de qualquer requisição ser enviada.Leia a mensagem, que nomeia o argumento.
rate_limitedO site 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_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 seu prazo.Aumente STO_TIMEOUT_MS, ou peça menos linhas.

Como biblioteca

A camada que lê o site é publicada separadamente, com seu ritmo, seu cache e seus erros, e sem protocolo anexado.

import { SupertoinetteClient } from "mcp-supertoinette/client";

const client = new SupertoinetteClient();
const { data, cached } = await client.getRecipe({ id: "10" });
console.log(data.title, data.ingredients.length, cached);

searchRecipes, browseRecipes, getRecipe e getPairings cada um responde { data, cached }, e lançam um erro carregando um dos seis códigos. O intervalo mínimo de três segundos entre duas requisições também se aplica aqui.

Ritmo e atribuição

As requisições saem uma de cada vez com pelo menos três segundos entre elas, e esse mínimo 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.

Cada resultado carrega o endereço da página de onde foi lido, e source nomeia o site. Receitas, títulos e fotografias pertencem à Supertoinette.

Este servidor MCP é um projeto não oficial, sem afiliação com a Supertoinette.

Privacidade

Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda na sua máquina, contata www.supertoinette.com 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 gerados 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 a o 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, veja LICENSE. As receitas pertencem à Supertoinette e aos seus autores.


mcp-supertoinette (francês)

Versão em inglês

Supertoinette é um site de culinária francês, um dos mais antigos ainda de pé. Suas receitas fornecem seus ingredientes, seus passos, seus tempos de preparo, cozimento e descanso, o número de convivas que alimentam e as fotografias do prato. Além das receitas, ele mantém um conjunto de páginas sobre o que beber com um prato, que associam um vinho e dizem de que estilo ele é.

Este servidor conecta um cliente de conversa a este site. Pode-se buscar receitas, ler uma com seus ingredientes adaptados ao número de convivas, percorrer suas categorias, ler uma categoria página por página e consultar o que ele propõe beber com um prato. 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 supertoinette -- npx -y mcp-supertoinette

Claude Desktop, Cursor e qualquer cliente no formato de configuração padrão

{
  "mcpServers": {
    "supertoinette": {
      "command": "npx",
      "args": ["-y", "mcp-supertoinette"]
    }
  }
}

Node 24 ou mais recente é necessário, e nenhuma variável de ambiente precisa ser preenchida.

Com Docker

{
  "mcpServers": {
    "supertoinette": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-supertoinette:1.0.2"]
    }
  }
}

-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.supertoinette.com, e nada mais: nenhum volume, nenhuma porta, nenhum identificador.

Bundle, sem npm

Baixe mcp-supertoinette-1.0.2.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 blanquette de vitela. »
  • « Leia-me esta receita para dez pessoas. »
  • « Sob quais categorias o site classifica suas receitas? »
  • « Qual vinho com um boeuf bourguignon? »
  • « Multiplique por três esta lista de ingredientes do caderno da minha avó. »

Supertoinette é um site francês, portanto suas receitas são encontradas em francês. O caminho comum vai de uma busca a uma receita: uma linha carrega um id, e get_recipe retoma esse identificador.

As ferramentas

FerramentaO que ela faz
get_recipeLê uma receita, adaptada a um número de porções sob demanda.
search_recipesEncontra receitas por prato ou por ingrediente.
list_categoriesLê as categorias sob as quais o site classifica suas receitas.
browse_recipesLê uma categoria, página por página.
get_wine_pairingsLê o que o site propõe beber com um prato.
scale_ingredientsAdapta qualquer lista de ingredientes, sem requisição ao site.

get_recipe

Lê uma receita inteira e adapta seus ingredientes quando um número de porções é dado.

ArgumentoTipoObrigatórioO que ele faz
idstring, 1 a 10 caracteressimO número no endereço de uma receita, carregado por uma linha.
servingsinteiro, 1 a 1000nãoAdapta os ingredientes a esse número de porções.

Em retorno: title sem o pictograma pelo qual o site a abre, e title_as_published exatamente como o site a escreveu; url; description; published_at; intro, a prosa impressa acima do método; steps; prep_minutes, cook_minutes, rest_minutes e total_minutes; category; author; e rating, cada um null onde a página não indica nada. yield diz para o que a receita é escrita e para o que foi adaptada. ingredients carrega as linhas com os subtítulos sob os quais a página as agrupa, o que conta ingredient_count, e o scaling de cada linha vale scaled, rounded ou unscaled.

search_recipes

Busca receitas por prato ou por ingrediente, uma página por vez.

ArgumentoTipoObrigatórioO que ele faz
querystring, 1 a 120 caracteressimUm prato ou um ingrediente, em francês.
limitinteiro, 1 a 39nãoLinhas a servir.
pageinteiro, 1 a 1000nãoA página de resultados a ler, a primeira por padrão.
categorystring, 1 a 60 caracteresnãoUma categoria, escrita como os facets de uma resposta anterior.

Em retorno: linhas carregando id, que get_recipe retoma, title, title_as_published e url. Vêm também page, last_page para a página mais distante que o site vincula a partir desta, result_count, rows_published para as linhas que a página continha antes de qualquer renderização, total_available e facets, que publica as formulações de categoria que uma busca seguinte retoma. Nunca construa uma formulação manualmente: o site responde à que não conhece com uma página que se lê como uma ausência.

list_categories

Lê as categorias sob as quais o site classifica suas receitas. Ele não aceita nenhum argumento.

Em retorno: categories, com category_count para as entradas que as duas listas do site contêm, e o url de onde foram lidas. Uma categoria se devolve a browse_recipes.

browse_recipes

Lê uma categoria, página por página.

ArgumentoTipoObrigatórioO que ele faz
categorystring, 1 a 80 caracteressimUma categoria, publicada por list_categories.
limitinteiro, 1 a 30nãoLinhas a servir.
pageinteiro, 1 a 1000nãoA página a ler, a primeira por padrão.

Em retorno: as linhas e o envelope que search_recipes retorna, com last_page que diz até onde vai a lista.

get_wine_pairings

Lê o que o site propõe beber com um prato, de acordo com as páginas que ele escreveu sobre o assunto.

ArgumentoTipoObrigatórioO que ele faz
idstring, 1 a 10 caracteresum dos doisO número no endereço de um prato.
pageinteiro, 1 a 100um dos doisUma página da lista de pratos do site.

Em retorno: entradas carregando o id, o dish sob o nome que o site lhe dá, e style, o estilo de vinho pelo qual a página se abre, null onde ela não escreveu nenhum.

scale_ingredients

Aplica a mesma aritmética a qualquer lista de ingredientes em francês, sem requisição ao site.

ArgumentoTipoExigênciaO que faz
ingredientsmatriz de 1 a 200 strings, 1 a 300 caracteressimAs linhas a adaptar, como a receita as escreveu.
factornúmero, acima de 0 até 100um dos doisPelo que multiplicar as quantidades.
from_servingsinteiro, 1 a 1000um dos doisO número de porções da lista original.
to_servingsinteiro, 1 a 1000um dos doisO número de porções desejado.

Passe factor, ou o par from_servings e to_servings.

Em retorno: as linhas adaptadas na forma que get_recipe retorna, cada uma com seu scaling.

A adaptação das quantidades

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 resultam em 4 kg.

A fineza com que um ingrediente é cortado 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 então 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 foram recalculados quando você os mostra. Uma receita cuja página não indica nenhum número de porções não pode ser adaptada para um número de convidados, e a resposta diz isso.

Configuração

Cada variável é opcional. Elas são definidas no bloco env da configuração do cliente.

VariávelPadrãoO que faz
STO_USER_AGENTa identidade do projetoNomeia seu aplicativo junto ao site, com um endereço para contato.
STO_MIN_INTERVAL_MS3000Intervalo entre duas requisições, de 3000 a 60000.
STO_TIMEOUT_MS20000Tempo limite de uma requisição, de 1000 a 120000.
STO_MAX_RETRIES3Tentativas após uma falha temporária, de 0 a 8.
STO_CACHE_TTL_MS900000Duração durante a qual uma página permanece em memória, de 0 a 86400000.
STO_CACHE_MAX_ENTRIES200Páginas mantidas em memória por vez, de 1 a 5000.
STO_LOG_LEVELerrorsilent, 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ódigoO que aconteceuO que fazer
not_foundO site respondeu e não tem nem esta receita nem esta página.Verifique o identificador com search_recipes.
invalid_inputOs argumentos foram recusados antes de qualquer requisição.Leia a mensagem, que nomeia o argumento.
rate_limitedO site 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 seu tempo limite.Aumente STO_TIMEOUT_MS, ou peça menos linhas.

Como biblioteca

A camada que lê o site é publicada sozinha, com seu ritmo, seu cache e seus erros, sem protocolo anexado.

import { SupertoinetteClient } from "mcp-supertoinette/client";

const client = new SupertoinetteClient();
const { data, cached } = await client.getRecipe({ id: "10" });
console.log(data.title, data.ingredients.length, cached);

searchRecipes, browseRecipes, getRecipe e getPairings respondem cada um { data, cached }, e levantam um erro com um dos seis códigos. O mínimo de três segundos entre duas requisições também se aplica aqui.

Ritmo e atribuição

As requisições saem uma a uma com pelo menos três segundos entre elas, e esse mínimo vale independentemente da configuração. O User-Agent termina sempre com a identidade do projeto e um endereço para contato.

Cada resultado traz o endereço da página de onde foi lido, e source nomeia o site. As receitas, os títulos e as fotografias pertencem à Supertoinette.

Este MCP é um projeto não oficial, sem afiliação à Supertoinette.

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 www.supertoinette.com, guarda suas respostas em memória enquanto roda e não escreve nada no disco. PRIVACY.md diz o que uma requisição leva 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 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 à Supertoinette e a seus autores.