SpicyAPI MCP (spicyapi.ai)
Servidor MCP oficial da SpicyAPI (spicyapi.ai): navegue pelo catálogo ao vivo de modelos de imagem, vídeo e texto, consulte preços, crie e aguarde tarefas de geração, envie entradas e busque saídas. Executa localmente com npx --yes --package=@spicyapi/mcp spicyapi-mcp.
Documentação
@spicyapi/mcp
O servidor MCP local oficial para SpicyAPI. Ele permite que o assistente de IA que você já usa — Claude Desktop, Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI ou qualquer cliente MCP — navegue pelo catálogo de modelos ao vivo, compare preços, crie tarefas de geração e colete resultados, com cada etapa cobrável confirmada por você.
Este pacote instala spicyapi-mcp (stdio) e spicyapi-mcp-http (Streamable HTTP somente
loopback). Ele não contém a CLI ou a Agent Skill.
Guia completo e amigável para iniciantes: docs.spicyapi.ai/docs/mcp.
O que ele faz, em palavras simples
MCP (Model Context Protocol) é um padrão aberto para dar habilidades extras aos assistentes de IA. Uma vez que este servidor é adicionado ao seu assistente, você pode pedir em linguagem comum — "faça um vídeo de cinco segundos a partir desta foto" — e o assistente:
- encontra um modelo adequado no catálogo ao vivo e lê o que ele aceita;
- envia seu arquivo local, se houver um;
- obtém uma cotação exata em USD e para para perguntar a você antes que qualquer coisa seja cobrada;
- inicia a tarefa, aguarda e fornece o link do resultado.
O servidor roda no seu próprio computador. Seu aplicativo assistente o inicia quando necessário; não há nada para hospedar.
Requisitos
- Node.js 22.13 ou posterior (
node --version).npxacompanha o Node.js. - Uma chave de API SpicyAPI (abaixo) e fundos na conta para tarefas pagas. Navegar, cotar e ler resultados são gratuitos.
- Um cliente MCP. Criar, tentar novamente e purgar tarefas adicionalmente exigem um cliente que
suporte elicitação de formulário MCP (a forma do protocolo de fazer uma pergunta ao usuário).
Em um cliente sem isso, essas três ferramentas retornam um erro, geralmente contendo
did not declare the required capability. Nada é criado, reservado, cobrado ou destruído: a criação buscou apenas sua cotação gratuita até então, e tentar novamente e purgar não enviaram nenhuma solicitação. As ferramentas somente leitura ainda funcionam.
Obtenha uma chave primeiro
- Crie uma conta em spicyapi.ai/register — se os cadastros estiverem pausados, essa página mostra como entrar na lista de espera.
- Na página API keys, escolha Create key. Dê um nome de acordo com o
assistente que a usará. Em Advanced, você pode definir um limite diário, orçamento mensal,
limite vitalício, modelos permitidos, lista de permissão de IP e expiração; novas chaves sempre
recebem o limite diário padrão da plataforma, a menos que você insira
0para sem limite. - Copie a chave. Ela começa com
sk-spicy-e é mostrada apenas uma vez. - Para as configurações baseadas em terminal abaixo, exporte-a no terminal a partir do qual você executará o comando de configuração:
export SPICY_API_KEY="sk-spicy-..." # paste your own key
No Windows PowerShell: $env:SPICY_API_KEY = "sk-spicy-...".
Adicione ao seu cliente
Cada cliente abaixo executa o mesmo servidor stdio: npx --yes --package=@spicyapi/mcp spicyapi-mcp.
Você nunca executa este servidor você mesmo — seu cliente MCP o inicia. Iniciado manualmente, ele
apenas aguarda silenciosamente no stdin, o que parece um travamento. E ele precisa de
--package=@spicyapi/mcp antes do nome do binário, porque este pacote inclui dois deles; npx @spicyapi/mcp
puro falha com could not determine executable to run.
Claude Desktop
- Abra Settings → Developer → Edit Config. O arquivo é
~/Library/Application Support/Claude/claude_desktop_config.jsonno macOS e%APPDATA%\Claude\claude_desktop_config.jsonno Windows. - Cole o bloco abaixo (ou adicione a entrada
spicyapia ummcpServersexistente) e substituaYOUR_SPICY_API_KEY. - Saia completamente do Claude Desktop e reabra — ele lê este arquivo apenas na inicialização.
{
"mcpServers": {
"spicyapi": {
"command": "npx",
"args": ["--yes", "--package=@spicyapi/mcp", "spicyapi-mcp"],
"env": { "SPICY_API_KEY": "YOUR_SPICY_API_KEY" }
}
}
}
Claude Code
claude mcp add spicyapi \
-e SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
O escopo padrão é o projeto atual; adicione --scope user para todos os projetos. Não use
--scope project, que grava a chave em um .mcp.json dentro do repositório. Verifique com
claude mcp list ou /mcp. No Windows nativo, se o servidor falhar ao iniciar, use
-- cmd /c npx --yes --package=@spicyapi/mcp spicyapi-mcp.
Codex
codex mcp add spicyapi \
--env SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
Isso grava ~/.codex/config.toml, que o Codex CLI, a extensão do IDE e o aplicativo de desktop do
ChatGPT leem — configure uma vez e todos os três o detectam. Verifique com codex mcp list ou
/mcp.
Ambos os comandos de terminal copiam SPICY_API_KEY do seu shell atual para a configuração local
desse cliente, então execute-os em um terminal onde a chave já esteja exportada. Se não estiver,
remova o servidor (claude mcp remove spicyapi / codex mcp remove spicyapi) e adicione novamente.
Cursor, Windsurf e Gemini CLI
Cursor (~/.cursor/mcp.json), Windsurf (~/.codeium/windsurf/mcp_config.json) e Gemini
CLI (~/.gemini/settings.json) compartilham o mesmo formato do Claude Desktop:
{
"mcpServers": {
"spicyapi": {
"command": "npx",
"args": ["--yes", "--package=@spicyapi/mcp", "spicyapi-mcp"],
"env": { "SPICY_API_KEY": "YOUR_SPICY_API_KEY" }
}
}
}
No Windows, eles ficam em %USERPROFILE%. Se um arquivo já tiver outras configurações, mescle
mcpServers nele — o arquivo inteiro deve permanecer JSON válido, sem comentários ou vírgulas
finais. Reinicie o cliente se as ferramentas não aparecerem (Gemini CLI: /mcp as lista).
Esses são arquivos de nível de usuário fora do seu repositório. Nunca copie esse bloco, com uma
chave real, para um arquivo de projeto que seja commitado — como um .cursor/mcp.json de nível de
projeto.
VS Code
.vscode/mcp.json é commitado com seu repositório, então deixe o VS Code solicitar a chave e
mantê-la em seu próprio armazenamento secreto:
{
"inputs": [
{
"id": "spicyapi-key",
"type": "promptString",
"description": "SpicyAPI key",
"password": true
}
],
"servers": {
"spicyapi": {
"type": "stdio",
"command": "npx",
"args": ["--yes", "--package=@spicyapi/mcp", "spicyapi-mcp"],
"env": { "SPICY_API_KEY": "${input:spicyapi-key}" }
}
}
}
Inicie pela lente de código acima da entrada ou MCP: List Servers, cole a chave quando solicitado e use as ferramentas do Chat no modo Agent.
Qualquer outro cliente MCP
Use os mesmos command, args e env. Cada cliente possui sua
própria localização e formato de configuração, e ambos mudam entre versões — a documentação deles
é a autoridade.
Verifique se funciona
Pergunte ao seu assistente, em ordem:
- "Verifique o status do serviço SpicyAPI." —
spicyapi_service_statusnão precisa de chave, então isso prova que o servidor inicia. - "Qual é o meu saldo SpicyAPI?" —
spicyapi_balance_getprova que a chave alcança o servidor. - "Quais ferramentas SpicyAPI você tem?" — espere 15 ferramentas prefixadas com
spicyapi_.
Nenhuma dessas ações custa nada.
Então peça algo real
Use SpicyAPI para listar os modelos de imagem que posso chamar, escolha um barato, gere um retrato noturno cinematográfico e me dê o link do resultado quando terminar.
O agente lê o catálogo, busca o schema do modelo, obtém uma cotação exata e para para sua confirmação antes que qualquer coisa seja cobrada.
Mais prompts para experimentar:
- "Quanto saldo SpicyAPI eu tenho e quanto gastei esta semana?" — saldo e uso, grátis.
- "Encontre modelos SpicyAPI que transformam uma imagem em vídeo e compare quanto custa um clipe de 5 segundos em cada um." — catálogo mais cotações, grátis.
- "Transforme /Users/me/Desktop/portrait.jpg em um vídeo de 5 segundos com um push-in lento." — upload, depois uma tarefa confirmada.
- "Mostre minhas tarefas SpicyAPI dos últimos três dias que falharam e por quê." — histórico de tarefas, grátis; uma nova tentativa depois pede confirmação.
IDs de modelos sempre vêm do catálogo ao vivo. Qualquer espaço reservado como MODEL_ID_FROM_CATALOG na
documentação SpicyAPI significa um ID exato selecionado desse catálogo, não um valor literal.
Ferramentas
| Ferramenta | Propósito | Somente leitura | Cobrável | Confirmação |
|---|---|---|---|---|
spicyapi_service_status | Saúde e prontidão públicas; sem necessidade de chave | Sim | Não | Não |
spicyapi_docs_search | Buscar no índice de documentação de primeira parte incluído; sem chave | Sim | Não | Não |
spicyapi_models_list | Modelos habilitados e preços específicos da conta | Sim | Não | Não |
spicyapi_model_get | Um modelo e seu schema de entrada atual | Sim | Não | Não |
spicyapi_balance_get | Saldo disponível, retido e total | Sim | Não | Não |
spicyapi_usage_get | Uso em USD liquidado para a chave atual | Sim | Não | Não |
spicyapi_tasks_list | Uma página de metadados de tarefas para a chave atual | Sim | Não | Não |
spicyapi_task_get | Ler uma tarefa, incluindo links de resultados prontos | Sim | Não | Não |
spicyapi_task_wait | Aguardar até 300 segundos por uma tarefa atingir um estado terminal | Sim | Não | Não |
spicyapi_task_quote | Precificar uma solicitação exata sem criar nada | Sim | Não | Não |
spicyapi_upload_file | Ler, enviar e confirmar um arquivo local; retornar seu URI spicy:// | Não | Não | Não |
spicyapi_download_url_create | URL assinada de curta duração para uma saída de tarefa | Não | Não | Não |
spicyapi_task_create | Criar uma tarefa de geração assíncrona | Não | Sim | Sempre |
spicyapi_task_retry | Criar uma nova tarefa a partir de uma falha ou expirada | Não | Sim | Sempre |
spicyapi_task_purge | Destruir o conteúdo armazenado de uma tarefa terminal (destructiveHint) | Não | Não | Sempre |
O servidor também registra dois recursos — spicyapi://docs/index e spicyapi://contract/openapi
— e um prompt. spicyapi_generation_workflow é um prompt, não uma ferramenta — ele é registrado com
registerPrompt, recebe goal e um model opcional, e não aparece em
SPICYAPI_MCP_TOOLS. Os hosts o exibem onde listam prompts MCP.
Parâmetros
| Ferramenta | Parâmetros (obrigatórios em negrito) |
|---|---|
spicyapi_service_status | nenhum |
spicyapi_docs_search | query (padrão ""), limit (1–25, padrão 10) |
spicyapi_models_list | modality (image / video / audio / text), provider, task, search, includeSchema, includeExamples (ambos com padrão false) |
spicyapi_model_get | model |
spicyapi_balance_get | nenhum |
spicyapi_usage_get | from, to (YYYY-MM-DD, UTC) |
spicyapi_tasks_list | from, to, state, model, limit (1–100, padrão 20), cursor |
spicyapi_task_get | taskId |
spicyapi_task_wait | taskId, timeoutSeconds (1–300, padrão 60), intervalSeconds (1–60, padrão adaptativo) |
spicyapi_upload_file | path (absoluto; ~/, e ~\ no Windows, é expandido), contentType (somente quando a extensão está ausente ou incorreta) |
spicyapi_download_url_create | taskId, key |
spicyapi_task_quote | model, input, callBackUrl |
spicyapi_task_create | model, input, callBackUrl, idempotencyKey, retentionSeconds |
spicyapi_task_retry | taskId, idempotencyKey |
spicyapi_task_purge | taskId |
Os esquemas de entrada dos modelos são retornados como JSON Schema simples: anotações somente de exibição e de tabela de preços são removidas antes de chegarem ao agente.
spicyapi_task_create aceita um retentionSeconds opcional que encurta por quanto tempo a mídia gerada, o payload de resultado, o prompt e outros textos de entrada daquela tarefa são mantidos; ele nunca pode estendê-los. 0
os remove assim que a tarefa atinge um estado terminal, e os registros de cobrança são sempre mantidos.
Seu callBackUrl opcional deve ser um endereço https:// público. http:// simples é recusado, assim como
localhost, endereços de rede privada, portas explícitas diferentes de 443 e 80, e URLs com
credenciais; cada um retorna 400 com Invalid callback URL. http:// não tem exceção de desenvolvimento
porque o corpo da entrega carrega o prompt e links assinados para o resultado.
spicyapi_task_purge é anotado como destructiveHint: true e remove a mídia gerada, o payload de resultado, o prompt e outros textos de entrada de uma tarefa terminal. Ele destrói conteúdo, não o registro do que
custou — a entrada no razão, o valor cobrado, o modelo, o estado, os carimbos de data/hora e o ID da solicitação sobrevivem — portanto, nunca é um reembolso. Apenas tarefas terminais são aceitas. Uma tarefa aceita não pode ser cancelada e não há API de cancelamento, então, para uma tarefa na fila ou em execução, aguarde até que ela termine
(spicyapi_task_wait) e então a remova. Ela não aceita chave de idempotência, porque o ID da tarefa é a
chave de idempotência: uma repetição após uma resposta perdida retorna o purgedAt original e não muda
nada. Seu resultado carrega apenas o ID da tarefa, o estado do conteúdo e metadados de remoção: sem links, tickets
ou chaves de saída, porque deixar uma forma de buscar o conteúdo na mesma mensagem que relata sua
destruição anularia o propósito.
Como os gastos são protegidos
Ferramentas cobráveis usam elicitação de protocolo e estado de solicitação assinado. A criação de tarefas busca e vincula a cotação exata e então pede que você confirme sua estimativa em USD e o valor máximo cobrado. Um agente não pode contornar essa confirmação.
- A pergunta vai para o usuário, não para o modelo. O cliente a renderiza; o agente não tem como respondê-la.
- A resposta está vinculada aos argumentos exatos. Se o modelo, a entrada ou qualquer outro argumento mudar
entre a pergunta e a resposta, a chamada falha com
confirmed request state does not match the current tool argumentse nada é criado. - Recusar não cria, cobra ou destrói nada. Uma confirmação recusada ou cancelada retorna
operation declined; …com o que aconteceu e o que não aconteceu. Para criação de tarefas, isso éno task was created and no funds were reserved or charged (only the free price quote had been requested)— a cotação mostrada na pergunta já foi buscada. Repetição e remoção não enviam nenhuma solicitação antes da confirmação, então as delas terminam emno SpicyAPI request was made. Deixe qualquer configuração de "aceitar elicitação automaticamente" desativada para este servidor. - Sem elicitação, sem gasto. Um cliente sem elicitação de formulário não pode responder à pergunta, então a criação falha logo após a cotação gratuita e nada é criado ou cobrado.
- Cotações duram cinco minutos. Confirmar depois disso falha com
40901; peça novamente uma cotação nova. - Confirmações de repetição não trazem preço. Uma repetição é uma nova tarefa ao preço atual do modelo; use
spicyapi_task_quoteprimeiro se quiser o número. - A recuperação reutiliza a chave de idempotência. A confirmação a mostra, e uma falha após a
confirmação a retorna com uma dica de recuperação. Chamar
spicyapi_task_createnovamente com essaidempotencyKeye a solicitação inalterada retorna a tarefa original em vez de uma segunda cobrança. - Tarefas com falha e expiradas nunca são cobradas; a retenção é liberada automaticamente. Uma tarefa bem-sucedida é liquidada com base no uso real, limitada à retenção aceita. Tarefas aceitas não podem ser canceladas.
Chame a criação diretamente quando a entrada do modelo estiver pronta. A ferramenta separada spicyapi_task_quote é para
comparações de preço independentes, não um pré-requisito. Verificações de saúde e saldo são diagnósticos
opcionais, não uma lista de verificação por tarefa.
Resultados
spicyapi_task_get, spicyapi_task_wait e webhooks v2 verificados incluem links output.assets[].url prontos. Use-os diretamente — nunca envie a chave da API para armazenamento. Um callback
verificado completo não precisa de consulta extra de tarefa nem de ticket de download. Consulte novamente para ativos pending
ou links expirados; spicyapi_download_url_create permanece disponível para integrações legadas
e renovação explícita de links, e sua URL assinada dura 20 minutos.
Alguns modelos respondem em output.text em vez de um arquivo — transcrição de áudio é o caso simples,
uma tarefa assíncrona comum cujo resultado são palavras. Um output.assets vazio em tal modelo é o
formato esperado, não uma falha, então relate o texto em vez de procurar um link ausente.
spicyapi_task_wait faz polling adaptativo por padrão, começando em cerca de dois segundos e recuando para
no máximo dez. Defina intervalSeconds apenas para um intervalo fixo. A espera é limitada a 60 segundos por
padrão e 300 no máximo por chamada; um timeout local não cancela a tarefa aceita.
Artefatos gerados são mantidos por cerca de 14 dias no máximo, prompts por 30 dias, uploads por um dia — veja Retenção e destruição. Copie qualquer coisa que queira manter.
Relatórios de uso
spicyapi_usage_get aceita datas opcionais from e to em YYYY-MM-DD. Ele consulta apenas a chave da API
configurada para este processo MCP — não há substituição de usuário, chave ou workspace.
- Intervalo UTC
[from,to), até 92 dias. Por padrão,toé amanhã UTC efromé sete dias antes. - As contagens de tarefas são agrupadas por dia de criação e modelo.
totalSpende cadaspendsão strings decimais exatas em USD cobrindo apenas cobranças liquidadas; retenções pendentes são excluídas e liquidação tardia pode alterar dias anteriores.- Este é um relatório de uso, não saldo de conta ou orçamento restante da chave, e nunca é necessário antes de
gerar. Observe
Retry-Afterquando o relatório estiver limitado por taxa.
spicyapi_tasks_list encontra tarefas após uma reinicialização ou um callback perdido. Ele retorna uma página de
metadados sem entradas, sem URLs de resultado e sem solicitações automáticas de detalhes. Filtros: from, to,
state, model, limit, cursor. Mantenha as datas UTC fixas durante a paginação e passe nextCursor
inalterado. Janela padrão de sete dias terminando amanhã UTC, máximo de 92 dias; tamanho de página 20, limitado
a 100. cost é final somente quando settled é verdadeiro. Não use o histórico para polling de status ou como
pré-requisito para geração.
Este endpoint tem seu próprio bucket de conta: uma rajada de 30 solicitações, recarregando 30 por minuto, compartilhado por todas as chaves da conta. Diferente do limite geral da API, ele falha fechado, então ainda rejeita quando o limitador está degradado. Use-o para reconciliação, não para polling.
Arquivos locais
spicyapi_upload_file recebe o caminho absoluto que o usuário forneceu, lê o arquivo, envia os bytes desta
máquina e confirma o upload em uma única chamada, então retorna o URI spicy:// confirmado para colocar em
um campo de entrada do modelo. Não há ferramenta de confirmação separada: nada no lado do MCP mantém um
upload pela metade. Uploads em etapas divididas (ticket, PUT, confirmação) pertencem ao código do SDK, que os finaliza
com commitUploadedFile. Imagens (JPEG, PNG, WebP, GIF) até 10 MiB; vídeo MP4 / WebM e áudio MP3
/ WAV até 90 MiB. O tipo de conteúdo é inferido da extensão. URLs de mídia HTTPS públicas não precisam
de upload. Caminhos relativos são recusados; um ~/ inicial (e ~\ no Windows) é expandido para o diretório
inicial. Se a extensão não for reconhecida, o erro lista as nove que ele infere: gif, jpeg,
jpg, png, webp, mp4, webm, mp3, wav.
O servidor lê apenas sob o diretório inicial do usuário. Symlinks são resolvidos antes da verificação, então um link apontando para fora de uma raiz permitida é recusado. A proteção existe para injeção de prompt — um caminho que chega dentro de um e-mail, uma página web ou uma descrição de tarefa é dado, não instrução — não para restringir a pessoa que executa o servidor, que já pode ler seus próprios arquivos.
Defina SPICY_MCP_UPLOAD_ROOTS no env do servidor para restringir ou ampliar isso; ele substitui o padrão.
As entradas são separadas como PATH: : no macOS e Linux, ; no Windows. ~ não é expandido
nesta variável, então escreva caminhos completos.
{
"env": {
"SPICY_API_KEY": "YOUR_SPICY_API_KEY",
"SPICY_MCP_UPLOAD_ROOTS": "/Users/you/Pictures:/Users/you/Movies"
}
}
No Windows, a mesma entrada lê "SPICY_MCP_UPLOAD_ROOTS": "C:\\Users\\you\\Pictures;D:\\Renders"
(barras invertidas duplicadas dentro do JSON). Uma raiz que não existe não corresponde a nada; a mensagem de recusa
lista as raízes em vigor.
Variáveis de ambiente
| Variável | Usado por | Significado |
|---|---|---|
SPICY_API_KEY | ambos os entrypoints | Sua chave de API. Necessária para tudo, exceto status e pesquisa de documentação |
SPICY_MCP_UPLOAD_ROOTS | ambos os entrypoints | Diretórios que spicyapi_upload_file pode ler, separados por : (; no Windows). Padrão: diretório pessoal |
SPICY_MCP_HTTP_TOKEN | spicyapi-mcp-http | Token bearer obrigatório, com pelo menos 32 bytes, diferente de SPICY_API_KEY |
SPICY_MCP_HOST | spicyapi-mcp-http | 127.0.0.1 (padrão), localhost ou ::1; qualquer outra coisa é recusada |
SPICY_MCP_PORT | spicyapi-mcp-http | Porta, padrão 8765 |
HTTPS_PROXY | ambos os entrypoints | Envie chamadas de API por este proxy; veja Atrás de um proxy |
Atrás de um proxy
Se sua rede acessa a internet por meio de um proxy HTTP, coloque HTTPS_PROXY (e NO_PROXY, se
precisar) no bloco env do servidor. O servidor o usa por conta própria no Node.js 22.21+ ou 24+.
O fetch embutido do Node.js ignora variáveis de proxy, a menos que seja iniciado com
NODE_USE_ENV_PROXY=1, então quando o servidor encontra um proxy http:// ou https://, ele se reinicia
uma vez com essa opção ativada. Defina NODE_USE_ENV_PROXY=0 para sempre conectar diretamente.
Coloque-o no bloco env em vez de depender do seu shell. Aplicativos de desktop não veem as variáveis
que você exporta em um terminal, e o Codex passa apenas uma lista curta e fixa delas para servidores MCP:
codex mcp add spicyapi \
--env SPICY_API_KEY=$SPICY_API_KEY \
--env HTTPS_PROXY=http://127.0.0.1:7890 \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
Um proxy que curl usa no seu terminal e este servidor não usa é o motivo usual de curl
alcançar a API enquanto o servidor relata network request failed. Os erros então dizem isso: eles nomeiam
a variável de proxy que foi definida e não usada. Proxies socks5:// não são suportados.
Entrypoint HTTP
spicyapi-mcp-http serve Streamable HTTP apenas em loopback. A maioria dos usuários quer o entrypoint stdio
acima; use este para um cliente que se conecta a um servidor já em execução por URL.
export SPICY_API_KEY="sk-spicy-..."
export SPICY_MCP_HTTP_TOKEN="$(node -e "console.log(require('node:crypto').randomBytes(32).toString('hex'))")"
npx --yes --package=@spicyapi/mcp spicyapi-mcp-http
# SpicyAPI MCP HTTP listening at http://127.0.0.1:8765/mcp
- O endpoint MCP é
/mcpe requerAuthorization: Bearer <SPICY_MCP_HTTP_TOKEN>; sem ele, o servidor responde401. GET /healthzretorna{"ok":true}sem autenticação.- Ele se recusa a iniciar em um endereço não-loopback, com um token menor que 32 bytes, ou com um token
igual a
SPICY_API_KEY. - Os cabeçalhos Host e Origin devem ser locais, para que páginas da web em outros sites não possam acioná-lo; os corpos das requisições são limitados a 2 MiB.
Loopback significa que apenas programas no mesmo computador podem conectar — não outros dispositivos na rede.
Solução de problemas
| Sintoma | Correção |
|---|---|
| Nenhuma ferramenta SpicyAPI no cliente | Reinicie o cliente completamente; valide o JSON (sem comentários ou vírgulas finais); verifique o caminho do arquivo; verifique se node --version é 22.13 ou posterior |
npx: command not found / spawn npx ENOENT | Instale o Node.js de nodejs.org, ou use o caminho absoluto de which npx / where npx; no Windows, tente "command": "cmd" com argumentos /c npx … |
could not determine executable to run | Adicione --package=@spicyapi/mcp antes de spicyapi-mcp |
SPICY_API_KEY is required for authenticated API operations | A chave não está chegando ao servidor: corrija o bloco env, ou re-adicione o servidor de um shell onde a chave está exportada |
HTTPS_PROXY is set, but this request did not use it | Atualize o Node.js para 22.21+ ou 24+, ou adicione NODE_USE_ENV_PROXY=1 ao bloco env; veja Atrás de um proxy |
401 | Chave digitada errada, revogada ou expirada — crie uma nova chave |
40201 / 40202 / 40301 | Recarregue; aumente o limite da chave ou aguarde o reset UTC; permita o modelo na chave |
40310 | Verifique o e-mail da sua conta: abra o link que enviamos, ou envie um novo pelo console |
40003 | Os bytes enviados não correspondem ao ticket; chame spicyapi_upload_file novamente e use o novo URI spicy:// |
40004 | Nenhuma implantação pode atender essa combinação exata de configurações; altere o parâmetro nomeado na mensagem conforme o esquema do modelo, não apenas tente novamente |
503 | Uma dependência está temporariamente indisponível; aguarde Retry-After e repita a chamada |
50302 | Uma geração síncrona falhou upstream e já foi reembolsada; enviar a mesma requisição novamente é seguro |
did not declare the required capability | O cliente não tem suporte a elicitação; nada foi criado ou cobrado (a criação buscou apenas sua cotação gratuita). Atualize-o, ou use o CLI para tarefas pagas |
confirmed request state does not match the current tool arguments | A requisição mudou após a pergunta ser feita; inicie a criação novamente |
40901 | Cotação expirada ou preço alterado; cotar e confirmar novamente |
path must be absolute / no such file / may only read files under … | Dê o caminho completo; verifique se existe; mova o arquivo para uma raiz permitida |
contentType is required unless the file extension is one of: … | Renomeie o arquivo com uma extensão listada, ou passe contentType |
operation declined; … | A confirmação foi recusada ou cancelada; a mensagem diz se apenas a cotação gratuita havia sido solicitada |
task … did not reach a terminal state within … | A tarefa ainda está em execução — aguarde novamente ou consulte depois; ela não foi cancelada |
Erros da API carregam status, code e requestId; guarde o ID da requisição para suporte. Veja
Erros para cada código.
Uma tarefa falha é diferente de uma chamada falha: ela retorna com state: "failed", um errorCode
de um conjunto fechado e um errorMessage. Repasse errorMessage ao usuário — quando o serviço de modelo
deu um motivo específico, ele é repassado em inglês, sem tradução, com nomes de serviços, hosts,
URLs, IDs de requisição e tarefa e detalhes de conta removidos — mas ramifique apenas em errorCode, que não
muda com a redação ou o idioma.
O que este servidor não faz
Ele envia e rastreia tarefas assíncronas nativas; não faz streaming de tokens de chat e não tem ferramenta
de chat para adicionar. Os modelos de texto do catálogo são servidos pelas camadas compatíveis —
POST /v1/chat/completions e POST /v1/responses (OpenAI), POST /v1/messages (Anthropic) e
POST /v1beta/models/{model}:generateContent (Google Gemini), todos sob https://api.spicyapi.ai —
então um cliente que já fala um desses protocolos só precisa apontar sua URL base para SpicyAPI.
Use jobs/stream nativo quando precisar de confirmação de cotação e do envelope de eventos da plataforma — veja o
guia de streaming de chat.
Ele não pode cancelar uma tarefa aceita — nenhuma API pública pode — e nunca responde a uma confirmação de cobrança em seu nome.
Mais
- Guia MCP: configuração, todas as ferramentas, custos e solução de problemas
- Configuração do cliente no hub de desenvolvedores
- Guia de agentes e automação
- Quer que o agente também saiba o fluxo de trabalho correto? Adicione
@spicyapi/skill.