Ptitchef
Pesquise receitas do Ptitchef, leia uma e reescalone para qualquer número de porções. Sem chave de API.
Documentação
mcp-ptitchef
Ptitchef é um site de culinária francês onde cozinheiros caseiros publicam suas receitas. Cada uma traz seus ingredientes, seus passos, frequentemente fotografados um a um, seus tempos de preparo e cozimento, seu custo, seus valores nutricionais e as avaliações deixadas pelos leitores. O site arquiva suas receitas em uma árvore de famílias de ingredientes e publica muitas delas em vários idiomas.
Este servidor conecta um cliente de chat a esse site. Você pode percorrer a árvore de categorias, pesquisar receitas por prato ou ingrediente, navegar por uma categoria ou por uma das listas fixas do site, perguntar o que pode ser feito com o que está na geladeira, ler uma receita com seus ingredientes reajustados para o número de pessoas à sua mesa e descobrir os outros idiomas em que uma receita foi publicada. Ele não exige chave de API nem conta.
Instalação
Instalação em um clique
Claude Code
claude mcp add ptitchef -- npx -y mcp-ptitchef
Claude Desktop, Cursor e qualquer cliente que use o formato de configuração padrão
{
"mcpServers": {
"ptitchef": {
"command": "npx",
"args": ["-y", "mcp-ptitchef"]
}
}
}
É necessário o Node 24 ou posterior, e nenhuma variável de ambiente precisa ser definida.
Com Docker
{
"mcpServers": {
"ptitchef": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-ptitchef:1.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.ptitchef.com, e nada mais: sem volume, sem porta, sem credencial.
Pacote, sem npm
Baixe mcp-ptitchef-1.0.1.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
- « Qu'est-ce que Ptitchef a comme recettes de chou kale ? »
- "O que posso cozinhar com abobrinha, feta e hortelã?"
- "Leia para mim esse gratinado para oito pessoas."
- "Mostre-me as receitas mais bem avaliadas do site."
- "Essa receita também é publicada em espanhol?"
Ptitchef é um site francês, então suas receitas são encontradas em francês. O caminho
comum vai de uma listagem a uma receita: uma linha carrega um id, e get_recipe recebe
esse id.
Ferramentas
| Ferramenta | O que ela faz |
|---|---|
list_categories | Percorre a árvore de famílias de ingredientes sob as quais o site arquiva. |
search_recipes | Encontra receitas por prato ou ingrediente. |
browse_recipes | Lê uma página de categoria por página, ou uma lista fixa. |
search_by_ingredients | Responde o que pode ser feito com o que um cozinheiro já tem. |
get_recipe | Lê uma receita, reajustada para um número de porções sob pedido. |
scale_ingredients | Reajusta qualquer lista de ingredientes, sem pedido ao site. |
get_recipe_translations | Lista os outros idiomas em que uma receita foi publicada. |
Comece em list_categories. O site fornece os endereços corretos, o que
evita construir um manualmente: um endereço construído assim cai na página
inicial do site.
list_categories
Lê a árvore sob a qual o site arquiva suas receitas. Chamado sem argumento, ele
retorna as famílias; passe o slug de uma família de volta como family para ler o que
ela contém.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
family | string, 1 a 80 caracteres | não | O slug de uma família, para ler as categorias sob ela. |
limit | inteiro, 1 a 200, padrão 20 | não | Linhas a servir. |
Em retorno: linhas carregando slug, que volta como family ou como
category; title na própria redação do site; url; description, que é
null onde a página não traz nenhuma; e sample_children para as categorias um
nível abaixo.
search_recipes
Pesquisa as receitas por um prato ou ingrediente.
| 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 100, padrão 20 | não | Linhas a servir. |
Em retorno: results, linhas carregando id, title, url, image_url,
rating, rating_count e review_count, um contador para o qual a página não imprime nada
por ser null. O envelope diz como o site respondeu: kind lê
category quando a resposta veio de uma página de categoria própria, cujo
total_available conta toda aquela categoria, e free_text quando o site
respondeu em seus próprios termos em uma única página, onde o total conta as linhas
servidas. Esses dois totais contam coisas diferentes. kind também lê guide para um
tópico escrito à mão pelo site, onde as linhas carregam um nome e um endereço e nenhum total
existe. Junto vêm result_count, rows_seen, page, single_page e
url. Uma listagem marcada como single_page cujo total excede rows_seen tem um
restante que o site conta e não serve.
browse_recipes
Lê uma página de categoria por página, ou uma das listas fixas do site.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
category | string, 1 a 120 caracteres | não | Um slug de categoria, como list_categories o publicou. |
listing | latest, top_rated ou most_viewed | não | Uma lista fixa, lida em vez de uma categoria. |
page | inteiro, 1 a 1000 | não | A página de uma categoria a ler. Uma lista fixa tem uma página. |
limit | inteiro, 1 a 100, padrão 20 | não | Linhas a servir. |
Em retorno: o envelope search_recipes retorna, com kind lendo
category, standing ou topic. page é a página que o site serviu, que é
a primeira novamente quando a página pedida está além da última.
search_by_ingredients
Responde o que pode ser feito com os ingredientes que um cozinheiro já tem.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
ingredients | array de 1 a 5 strings, 1 a 60 caracteres | sim | Os ingredientes disponíveis, em francês. |
limit | inteiro, 1 a 100, padrão 20 | não | Linhas a servir. |
Em retorno: o envelope que as outras listagens retornam, com kind lendo
fridge. O site faz a correspondência em seu próprio vocabulário, então um ingrediente que ele
escreve de forma diferente estreita a resposta em vez de ampliá-la.
get_recipe
Lê uma receita completa e reajusta seus ingredientes quando um número de porções é fornecido.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string, 1 a 300 caracteres | sim | O id de uma linha de uma pesquisa ou listagem. |
servings | inteiro, 1 a 500 | não | Reajusta os ingredientes para este número de porções. |
Em retorno: title, url, description, image_url, category, cuisine,
difficulty na própria redação do site, author, published, modified,
rating, rating_count, review_count, prep_minutes, cook_minutes,
total_minutes, nutrition como publicado para o tamanho de porção que ele nomeia,
estimated_cost, keywords, faq e translations, cada null onde a
página não declara nada. steps carrega o método uma linha por passo, e
illustrated_steps os mesmos passos com a fotografia que o site tirou de cada um.
yield diz para o que a receita foi escrita e para o que foi reajustada. Cada
ingrediente carrega scaling, que lê scaled, rounded ou unscaled: leia-o
antes de citar uma quantidade, já que rounded foi movido para permanecer utilizável em uma
cozinha.
scale_ingredients
Aplica a mesma aritmética a qualquer lista de linhas de ingredientes em francês, sem pedido ao site.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
ingredients | array de 1 a 100 strings, até 300 caracteres | sim | As linhas a reajustar, 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 reajustado na forma
get_recipe retorna, e scaled_count, rounded_count e unscaled_count.
get_recipe_translations
Lista os outros idiomas em que uma receita foi publicada, usando o pareamento que o site publica ele mesmo.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string, 1 a 300 caracteres | sim | O id de uma linha de uma pesquisa ou listagem. |
Em retorno: translations, cada um carregando a tag language que o site
publica e o url daquela versão, com translation_count e o url
da página francesa de onde foram lidos.
Reajustando as quantidades
Uma quantidade é declarada na unidade que lhe convém, então uma linha pode voltar em uma
unidade diferente daquela 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 reajustada então se afasta um pouco das
proporções do original. A linha carrega rounded, e seu note diz o que
foi feito.
As figuras são a aritmética deste servidor, então diga que foram recalculadas quando você as exibe. Uma receita cuja página não informa número de porções não pode ser adaptada para um número de pessoas, e a resposta diz isso.
Configuração
Todas as variáveis são opcionais. Defina-as no bloco env da configuração do seu cliente.
| Variável | Padrão | O que faz |
|---|---|---|
PTC_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo para o site, com um endereço onde uma pessoa pode ser contatada. |
PTC_MIN_INTERVAL_MS | 1500 | Intervalo entre duas requisições, de 1000 a 60000. |
PTC_TIMEOUT_MS | 20000 | Prazo para uma requisição, de 1000 a 120000. |
PTC_MAX_RETRIES | 3 | Tentativas após uma falha transitória, de 0 a 8. |
PTC_CACHE_TTL_MS | 900000 | Quanto tempo uma página permanece na memória, de 0 a 86400000. |
PTC_CACHE_MAX_ENTRIES | 200 | Páginas mantidas na memória de uma vez, de 1 a 5000. |
PTC_MAX_BODY_BYTES | 8000000 | A maior resposta lida por completo, de 100000 a 64000000. |
PTC_BUDGET_MS | 60000 | O tempo que uma leitura deve aguardar uma resposta, incluindo novas tentativas e esperas, de 5000 a 600000. |
PTC_LOG_LEVEL | error | silent, error, info ou debug, escrito em stderr. |
Um valor fora do intervalo cai para o padrão, e o motivo é escrito em stderr.
Erros
Toda falha carrega 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 site respondeu e não contém tal receita ou página. | Verifique o slug com list_categories, ou o id com uma busca. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição sair. | 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 prazo ou do orçamento. | Aumente PTC_TIMEOUT_MS ou PTC_BUDGET_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 { PtitchefClient } from "mcp-ptitchef/client";
const client = new PtitchefClient();
const { data, cached } = await client.listCategories();
console.log(data.results.length, cached);
listCategories, searchRecipes, browseRecipes, searchByIngredients e
getRecipe cada um responde { 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 saem uma de cada vez com pelo menos um segundo e meio entre elas, e
o mínimo de um 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.
Todo resultado carrega o endereço da página de onde foi lido, e source nomeia
o site. Receitas, títulos e categorias pertencem ao Ptitchef e aos cozinheiros que
os escreveram.
Este servidor MCP é um projeto não oficial, sem afiliação com o Ptitchef.
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.ptitchef.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 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 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 ao Ptitchef e aos seus autores.
mcp-ptitchef (francês)
Ptitchef é um site de culinária francês onde cozinheiros publicam suas receitas. Cada uma dá seus ingredientes, seus passos, frequentemente fotografados um a um, seus tempos de preparo e cozimento, seu custo, seus valores nutricionais e as notas deixadas por seus leitores. O site classifica suas receitas em uma árvore de famílias de ingredientes e publica muitas em vários idiomas.
Este servidor conecta um cliente de conversa a este site. Pode-se percorrer a árvore das categorias, buscar receitas por prato ou por ingrediente, ler uma categoria ou uma das listas permanentes do site, perguntar o que se pode fazer com o que há na geladeira, ler uma receita com seus ingredientes adaptados ao número de convidados e encontrar os outros idiomas nos quais uma receita foi publicada. Nenhuma chave de API, nenhuma conta.
Instalação
Instalação em um clique
Claude Code
claude mcp add ptitchef -- npx -y mcp-ptitchef
Claude Desktop, Cursor e qualquer cliente no formato de configuração padrão
{
"mcpServers": {
"ptitchef": {
"command": "npx",
"args": ["-y", "mcp-ptitchef"]
}
}
}
Node 24 ou mais recente é necessário, e nenhuma variável de ambiente precisa ser preenchida.
Com Docker
{
"mcpServers": {
"ptitchef": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-ptitchef:1.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.ptitchef.com, e nada mais: nenhum volume, nenhuma porta,
nenhum identificador.
Bundle, sem npm
Baixe mcp-ptitchef-1.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
- « O que o Ptitchef tem como receitas de couve kale? »
- « O que posso cozinhar com abobrinhas, feta e hortelã? »
- « Leia este gratinado para oito pessoas. »
- « Mostre-me as receitas mais bem avaliadas do site. »
- « Esta receita também existe em espanhol? »
Ptitchef é um site francês, então suas receitas são encontradas em francês. O
caminho comum vai de uma lista a uma receita: uma linha carrega um id, e
get_recipe retoma esse identificador.
As ferramentas
| Ferramenta | O que faz |
|---|---|
list_categories | Percorre a árvore das famílias de ingredientes do site. |
search_recipes | Encontra receitas por prato ou por ingrediente. |
browse_recipes | Lê uma categoria página por página, ou uma lista permanente. |
search_by_ingredients | Responde com o que se pode fazer com o que um cozinheiro já tem. |
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. |
get_recipe_translations | Lista os outros idiomas nos quais uma receita foi publicada. |
Comece por list_categories. O site dá os endereços corretos,
o que evita construir um manualmente: um endereço construído assim leva à
página inicial do site.
list_categories
Lê a árvore sob a qual o site classifica suas receitas. Chamado sem argumento, ele
retorna as famílias; forneça novamente o slug de uma família em family para ler o que
ela contém.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
family | string, 1 a 80 caracteres | não | O slug de uma família, para ler as categorias abaixo. |
limit | inteiro, 1 a 200, padrão 20 | não | Linhas a servir. |
Em retorno: linhas carregando slug, que se fornece novamente em family ou em
category ; title nos termos do site ; url ; description, null onde
a página não as carrega ; e sample_children para as categorias do nível
inferior.
search_recipes
Busca receitas por prato ou por ingrediente.
| 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 100, padrão 20 | não | Linhas a servir. |
Em retorno: results, linhas carregando id, title, url, image_url,
rating, rating_count e review_count, um contador que a página não imprime
valendo null. O envelope diz como o site respondeu: kind vale category
quando a resposta vem de uma página de categoria, cujo total_available conta
toda a categoria, e free_text quando o site respondeu à sua maneira em uma
única página, onde o total conta as linhas servidas. Esses dois totais contam
coisas diferentes. kind também vale guide para um dossiê que o site
escreveu manualmente, onde as linhas carregam um nome e um endereço sem que nenhum total
exista. Vêm também result_count, rows_seen, page, single_page e
url. Uma lista marcada single_page cujo total excede rows_seen tem um
resto que o site conta e não serve.
browse_recipes
Lê uma categoria página por página, ou uma das listas permanentes do site.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
category | string, 1 a 120 caracteres | não | Um slug de categoria, publicado por list_categories. |
listing | latest, top_rated ou most_viewed | não | Uma lista permanente, lida no lugar de uma categoria. |
page | inteiro, 1 a 1000 | não | A página da categoria a ser lida. Uma lista permanente tem apenas uma. |
limit | inteiro, 1 a 100, padrão 20 | não | Linhas a serem servidas. |
Em retorno: o envelope que search_recipes retorna, com kind valendo
category, standing ou topic. page é a página que o site serviu, que
é a primeira novamente quando a página solicitada ultrapassa a última.
search_by_ingredients
Responde com o que se pode fazer com os ingredientes que um cozinheiro já tem.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
ingredients | array de 1 a 5 strings, 1 a 60 caracteres | sim | Os ingredientes disponíveis, em francês. |
limit | inteiro, 1 a 100, padrão 20 | não | Linhas a serem servidas. |
Em retorno: o envelope das outras listas, com kind valendo fridge. O
site faz corresponder seu próprio vocabulário, portanto um ingrediente que ele escreve
de outra forma restringe a resposta em vez de ampliá-la.
get_recipe
Lê uma receita inteira e adapta seus ingredientes quando um número de porções é fornecido.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string, 1 a 300 caracteres | sim | O id de uma linha de pesquisa ou de lista. |
servings | inteiro, 1 a 500 | não | Adapta os ingredientes para esse número de porções. |
Em retorno: title, url, description, image_url, category,
cuisine, difficulty nos termos do site, author, published,
modified, rating, rating_count, review_count, prep_minutes,
cook_minutes, total_minutes, nutrition tal como publicada para a porção
que ela nomeia, estimated_cost, keywords, faq e translations, cada um
null onde a página não indica nada. steps traz o método uma linha por
etapa, e illustrated_steps as mesmas etapas com a fotografia que o site tirou
de cada uma. yield diz para o que a receita foi escrita e para o que foi
adaptada. Cada ingrediente traz scaling, que vale scaled, rounded ou
unscaled: leia-o antes de citar uma quantidade, rounded tendo sido movida
para permanecer utilizável na cozinha.
scale_ingredients
Aplica a mesma aritmética a qualquer lista de ingredientes em francês, sem consulta ao site.
| 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 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.
get_recipe_translations
Lista os outros idiomas nos quais uma receita foi publicada, com base no pareamento que o próprio site publica.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string, 1 a 300 caracteres | sim | O id de uma linha de pesquisa ou de lista. |
Em retorno: translations, cada uma trazendo o rótulo language que o
site publica e o url dessa versão, com translation_count e o url da
página francesa de onde foram lidas.
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 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 é, portanto, arredondada, e a receita adaptada se afasta então
um pouco das proporções da original. A linha traz rounded, e sua note diz
o que foi feito.
Os números são a aritmética deste servidor, portanto diga que foram recalculados quando você os mostrar. 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.
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 |
|---|---|---|
PTC_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo junto ao site, com um endereço para contatar uma pessoa. |
PTC_MIN_INTERVAL_MS | 1500 | Intervalo entre duas requisições, de 1000 a 60000. |
PTC_TIMEOUT_MS | 20000 | Tempo limite de uma requisição, de 1000 a 120000. |
PTC_MAX_RETRIES | 3 | Tentativas após uma falha temporária, de 0 a 8. |
PTC_CACHE_TTL_MS | 900000 | Duração durante a qual uma página permanece em memória, de 0 a 86400000. |
PTC_CACHE_MAX_ENTRIES | 200 | Páginas mantidas em memória por vez, de 1 a 5000. |
PTC_MAX_BODY_BYTES | 8000000 | A maior resposta lida por inteiro, de 100000 a 64000000. |
PTC_BUDGET_MS | 60000 | O tempo no qual uma leitura deve retornar uma resposta, incluindo repetições e esperas, de 5000 a 600000. |
PTC_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 traz 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 slug com list_categories, ou o identificador com uma pesquisa. |
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 ou seu orçamento. | Aumente PTC_TIMEOUT_MS ou PTC_BUDGET_MS, ou peça menos linhas. |
Como biblioteca
A camada que lê o site é publicada separadamente, com seu ritmo, seu cache e seus erros, sem protocolo anexado.
import { PtitchefClient } from "mcp-ptitchef/client";
const client = new PtitchefClient();
const { data, cached } = await client.listCategories();
console.log(data.results.length, cached);
listCategories, searchRecipes, browseRecipes, searchByIngredients 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 partem uma a uma com pelo menos um segundo e meio entre elas, e
o intervalo mínimo de um segundo se mantém independentemente da configuração. O User-Agent
sempre termina com a identidade do projeto e um endereço para contatar uma
pessoa.
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 categorias pertencem à Ptitchef e aos
cozinheiros que as escreveram.
Este MCP é um projeto não oficial, sem afiliação à Ptitchef.
Privacidade
Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda
na sua máquina, contata apenas www.ptitchef.com, mantém suas respostas em memória enquanto
roda e não escreve 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 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 concordar sobre a forma da mudança. Veja CONTRIBUTING.md.
Licença
MIT, veja LICENSE. As receitas pertencem à Ptitchef e aos seus autores.