Supertoinette
Leia as receitas do Supertoinette e reescala as quantidades com honestidade. Sem chave de API.
Documentação
mcp-supertoinette
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.
Instalação
Instalação em um clique
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
| Ferramenta | O que faz |
|---|---|
get_recipe | Lê uma receita, reescalada para um número de porções sob pedido. |
search_recipes | Encontra receitas por prato ou por ingrediente. |
list_categories | Lê as categorias sob as quais o site arquiva suas receitas. |
browse_recipes | Lê uma categoria, página por página. |
get_wine_pairings | Lê o que o site sugere beber com um prato. |
scale_ingredients | Reescala 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string, 1 a 10 caracteres | sim | O número no endereço de uma receita, como uma linha o carrega. |
servings | inteiro, 1 a 1000 | não | Reescala 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
query | string, 1 a 120 caracteres | sim | Um prato ou ingrediente, em francês. |
limit | inteiro, 1 a 39 | não | Linhas a servir. |
page | inteiro, 1 a 1000 | não | Qual página de resultados ler, a primeira por padrão. |
category | string, 1 a 60 caracteres | não | Uma 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
category | string, 1 a 80 caracteres | sim | Uma categoria, como list_categories a publicou. |
limit | inteiro, 1 a 30 | não | Linhas a servir. |
page | inteiro, 1 a 1000 | não | Qual 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string, 1 a 10 caracteres | um de dois | O número no endereço de um prato. |
page | inteiro, 1 a 100 | um de dois | Uma 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
ingredients | array de 1 a 200 strings, 1 a 300 caracteres | sim | As linhas a reescalar, como a receita as escreveu. |
factor | número, acima de 0 e até 100 | um de dois | Pelo que multiplicar as quantidades. |
from_servings | inteiro, 1 a 1000 | um de dois | Para quantas a lista foi escrita. |
to_servings | inteiro, 1 a 1000 | um de dois | Quantas 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ável | Padrão | O que faz |
|---|---|---|
STO_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo para o site, com um endereço onde uma pessoa pode ser alcançada. |
STO_MIN_INTERVAL_MS | 3000 | Intervalo entre duas solicitações, de 3000 a 60000. |
STO_TIMEOUT_MS | 20000 | Prazo para uma solicitação, de 1000 a 120000. |
STO_MAX_RETRIES | 3 | Tentativas após uma falha transitória, de 0 a 8. |
STO_CACHE_TTL_MS | 900000 | Quanto tempo uma página permanece na memória, de 0 a 86400000. |
STO_CACHE_MAX_ENTRIES | 200 | Páginas mantidas na memória de uma vez, de 1 a 5000. |
STO_LOG_LEVEL | error | silent, 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ódigo | O que aconteceu | O que fazer |
|---|---|---|
not_found | O site respondeu e não contém tal receita ou página. | Verifique o id 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 | O 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_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 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)
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
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
| Ferramenta | O que ela faz |
|---|---|
get_recipe | Lê uma receita, adaptada a um número de porções sob demanda. |
search_recipes | Encontra receitas por prato ou por ingrediente. |
list_categories | Lê as categorias sob as quais o site classifica suas receitas. |
browse_recipes | Lê uma categoria, página por página. |
get_wine_pairings | Lê o que o site propõe beber com um prato. |
scale_ingredients | Adapta 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.
| Argumento | Tipo | Obrigatório | O que ele faz |
|---|---|---|---|
id | string, 1 a 10 caracteres | sim | O número no endereço de uma receita, carregado por uma linha. |
servings | inteiro, 1 a 1000 | não | Adapta 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.
| Argumento | Tipo | Obrigatório | O que ele faz |
|---|---|---|---|
query | string, 1 a 120 caracteres | sim | Um prato ou um ingrediente, em francês. |
limit | inteiro, 1 a 39 | não | Linhas a servir. |
page | inteiro, 1 a 1000 | não | A página de resultados a ler, a primeira por padrão. |
category | string, 1 a 60 caracteres | não | Uma 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.
| Argumento | Tipo | Obrigatório | O que ele faz |
|---|---|---|---|
category | string, 1 a 80 caracteres | sim | Uma categoria, publicada por list_categories. |
limit | inteiro, 1 a 30 | não | Linhas a servir. |
page | inteiro, 1 a 1000 | não | A 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.
| Argumento | Tipo | Obrigatório | O que ele faz |
|---|---|---|---|
id | string, 1 a 10 caracteres | um dos dois | O número no endereço de um prato. |
page | inteiro, 1 a 100 | um dos dois | Uma 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.
| Argumento | Tipo | Exigência | O que faz |
|---|---|---|---|
ingredients | matriz de 1 a 200 strings, 1 a 300 caracteres | sim | As linhas a adaptar, como a receita as escreveu. |
factor | número, acima de 0 até 100 | um dos dois | Pelo que multiplicar as quantidades. |
from_servings | inteiro, 1 a 1000 | um dos dois | O número de porções da lista original. |
to_servings | inteiro, 1 a 1000 | um dos dois | O 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ável | Padrão | O que faz |
|---|---|---|
STO_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo junto ao site, com um endereço para contato. |
STO_MIN_INTERVAL_MS | 3000 | Intervalo entre duas requisições, de 3000 a 60000. |
STO_TIMEOUT_MS | 20000 | Tempo limite de uma requisição, de 1000 a 120000. |
STO_MAX_RETRIES | 3 | Tentativas após uma falha temporária, de 0 a 8. |
STO_CACHE_TTL_MS | 900000 | Duração durante a qual uma página permanece em memória, de 0 a 86400000. |
STO_CACHE_MAX_ENTRIES | 200 | Páginas mantidas em memória por vez, de 1 a 5000. |
STO_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 site respondeu e não tem nem esta receita nem esta página. | 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 | O site 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 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.