Servidor MCP
Conecte qualquer agente compatível com MCP (Claude Code, Cursor, VS Code, Codex, o OpenAI Agents SDK e outros) à Synthorai com uma URL e sua chave de API. Todos os modelos e modalidades, o gerenciamento de chaves de API e os dados de cobrança viram ferramentas que o agente pode chamar. Cada chamada é autenticada, limitada e cobrada exatamente como a requisição REST correspondente.
| Endpoint | https://synthorai.io/v1/mcp |
| Transporte | Streamable HTTP, sem estado (sem sessões), respostas JSON |
| Autenticação | Authorization: Bearer <API key> |
A chave usada na conexão define quais ferramentas você recebe: uma chave de inferência (sk-syn-…) chama modelos, uma chave de provisioning (sk-syn-prov-…) gerencia chaves de API e uma chave de cobrança (sk-syn-bill-…) lê saldo e uso. Se um agente precisar de mais de um tipo, conecte o servidor uma vez para cada tipo de chave.
Início rápido
- Crie uma chave de API no console, na página Chaves de API. Para um agente, defina um limite de gasto e uma lista de permissões de modelos.
- Adicione o servidor ao seu cliente com um dos trechos abaixo, lendo a chave de uma variável de ambiente em vez de colá-la em um arquivo.
- Peça ao seu agente, por exemplo: “Liste os três modelos mais baratos que suportam ferramentas, depois peça ao mais rápido para resumir este arquivo e me diga quanto custou.”
Conecte seu cliente
Todos os clientes usam o mesmo endpoint e o mesmo cabeçalho. Primeiro, defina SYNTHORAI_API_KEY no seu ambiente.
Claude Code
Execute /mcp no Claude Code para verificar a conexão. Adicione --scope user para disponibilizar o servidor em todos os projetos, ou faça commit do formato .mcp.json para compartilhá-lo com sua equipe (a chave continua no ambiente de cada desenvolvedor).
claude mcp add --transport http synthorai https://synthorai.io/v1/mcp \
--header "Authorization: Bearer $SYNTHORAI_API_KEY"{
"mcpServers": {
"synthorai": {
"type": "http",
"url": "https://synthorai.io/v1/mcp",
"headers": { "Authorization": "Bearer ${SYNTHORAI_API_KEY}" }
}
}
} Cursor
Coloque isto em ~/.cursor/mcp.json (todos os projetos) ou em .cursor/mcp.json (um projeto).
{
"mcpServers": {
"synthorai": {
"url": "https://synthorai.io/v1/mcp",
"headers": { "Authorization": "Bearer ${env:SYNTHORAI_API_KEY}" }
}
}
} VS Code (GitHub Copilot)
Coloque isto em .vscode/mcp.json. O VS Code pede a chave uma vez e a armazena com segurança.
{
"inputs": [
{ "type": "promptString", "id": "synthorai-key", "description": "Synthorai API key", "password": true }
],
"servers": {
"synthorai": {
"type": "http",
"url": "https://synthorai.io/v1/mcp",
"headers": { "Authorization": "Bearer ${input:synthorai-key}" }
}
}
} Codex CLI
Coloque isto em ~/.codex/config.toml ou execute codex mcp add synthorai --url https://synthorai.io/v1/mcp --bearer-token-env-var SYNTHORAI_API_KEY.
[mcp_servers.synthorai]
url = "https://synthorai.io/v1/mcp"
bearer_token_env_var = "SYNTHORAI_API_KEY" OpenAI Responses API
Os servidores da OpenAI chamam o endpoint em seu nome, então deixe vazia a lista de permissões de IP da chave (ou libere as faixas de saída da OpenAI). Use allowed_tools para expor apenas as ferramentas de que o modelo precisa.
import os
from openai import OpenAI
client = OpenAI()
resp = client.responses.create(
model="gpt-4.1",
tools=[{
"type": "mcp",
"server_label": "synthorai",
"server_url": "https://synthorai.io/v1/mcp",
"headers": {"Authorization": f"Bearer {os.environ['SYNTHORAI_API_KEY']}"},
"allowed_tools": ["list_models", "chat_completion"],
"require_approval": "never",
}],
input="Find the cheapest Synthorai chat model with tool support and ask it for a haiku about gateways.",
)
print(resp.output_text) OpenAI Agents SDK
Funciona da mesma forma com qualquer framework construído sobre os SDKs de cliente MCP (LangChain, LlamaIndex, Pydantic AI, Vercel AI SDK, Mastra …): aponte o transporte Streamable HTTP dele para o endpoint, com o cabeçalho.
import asyncio, os
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp
async def main():
async with MCPServerStreamableHttp(
name="synthorai",
params={
"url": "https://synthorai.io/v1/mcp",
"headers": {"Authorization": f"Bearer {os.environ['SYNTHORAI_API_KEY']}"},
"timeout": 120,
},
cache_tools_list=True,
) as synthorai:
agent = Agent(name="assistant", instructions="Use the Synthorai tools.", mcp_servers=[synthorai])
result = await Runner.run(agent, "List three chat models under $1 per million input tokens.")
print(result.final_output)
asyncio.run(main()) MCP Python SDK
import asyncio, os, httpx2
from mcp import Client
from mcp.client.streamable_http import streamable_http_client
async def main():
http = httpx2.AsyncClient(
headers={"Authorization": f"Bearer {os.environ['SYNTHORAI_API_KEY']}"}, timeout=120)
async with Client(streamable_http_client("https://synthorai.io/v1/mcp", http_client=http)) as mcp:
tools = await mcp.list_tools()
print([t.name for t in tools.tools])
result = await mcp.call_tool("chat_completion",
{"model": "deepseek-v4-flash", "prompt": "Say hi in five words"})
print(result.content[0].text)
asyncio.run(main()) Claude Desktop
Os conectores personalizados do Claude Desktop e do claude.ai fazem login com OAuth, que este servidor ainda não oferece (veja a seção Em breve abaixo). Até lá, o Claude Desktop pode se conectar pela ponte mcp-remote, que adiciona o cabeçalho para você:
{
"mcpServers": {
"synthorai": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://synthorai.io/v1/mcp", "--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer sk-syn-..." }
}
}
} curl
O servidor é JSON-RPC puro sobre HTTP, então nenhum SDK é necessário. Não há handshake: cada requisição é independente.
curl https://synthorai.io/v1/mcp \
-H "Authorization: Bearer $SYNTHORAI_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"chat_completion",
"arguments":{"model":"deepseek-v4-flash","prompt":"Say hi in five words"}}}' Exemplo de resposta
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{ "type": "text", "text": "Hi there, great to meet!" },
{ "type": "text", "text": "[deepseek-v4-flash · finish_reason stop · 12 in / 7 out tokens · cost $0.0000031 · request_id 0199a7c2-…]" }
],
"structuredContent": {
"model": "deepseek-v4-flash",
"content": "Hi there, great to meet!",
"finish_reason": "stop",
"usage": { "prompt_tokens": 12, "completion_tokens": 7, "total_tokens": 19 },
"cost_usd": 0.0000031,
"request_id": "0199a7c2-…"
}
}
} Ferramentas
tools/list retorna apenas as ferramentas que sua chave pode usar: a lista é filtrada pelo tipo de chave e pelos recursos habilitados no seu workspace (a geração de imagens e de vídeos está em prévia limitada). Ferramentas que executam um modelo custam exatamente o mesmo que a chamada REST; todas as outras são gratuitas.
Chave de inferência
| Ferramenta | O que faz | Endpoint REST | Observações |
|---|---|---|---|
list_models | Modelos que a chave pode chamar, do mais barato para o mais caro, com tamanho de contexto, modalidades, capacidades e preços de tabela. Filtros: categoria, capacidade, modalidade de entrada, busca. | GET /v1/models + /api/models | somente leitura |
get_model | Detalhes completos de um modelo, incluindo o preço efetivo após qualquer desconto e se a chave pode chamá-lo. | GET /v1/models/{id} | somente leitura |
get_pricing | A tabela de preços (USD após descontos): preços por token, por chamada, por minuto, por segundo e escalonados. | GET /api/pricing | somente leitura |
chat_completion | Uma chat completion em qualquer modelo: um prompt ou um array messages completo (imagens, resultados de ferramentas), com saída estruturada, ferramentas de função, esforço de raciocínio e modelos de fallback opcionais. Retorna texto, chamadas de ferramenta, uso, custo e request_id. | POST /v1/chat/completions | cobrado |
generate_image | Gera ou edita imagens; retornadas como conteúdo de imagem, ou como links com response_format=url. | POST /v1/images/generations | cobrado |
list_image_models | Modelos de imagem com preços e entradas suportadas. | GET /v1/images/models | somente leitura |
create_video | Inicia um job de vídeo a partir de um prompt ou de um primeiro quadro; pode aguardar até 60 s pela conclusão. Cobrado quando o job é concluído. | POST /v1/videos | cobrado |
get_video | Status do job; quando concluído, links para os vídeos (válidos por cerca de 24 horas). | GET /v1/videos/{id} | somente leitura |
cancel_video | Cancela um job que ainda está na fila (um job já iniciado não pode ser interrompido). Jobs cancelados ou com falha não são cobrados. | DELETE /v1/videos/{id} | destrutivo |
list_video_models | Modelos de vídeo com resoluções, durações e preços. | GET /v1/videos/models | somente leitura |
text_to_speech | Fala a partir de texto, retornada como conteúdo de áudio. | POST /v1/audio/speech | cobrado |
transcribe_audio | Texto a partir de áudio fornecido como URL ou dados base64 (até 25 MB). | POST /v1/audio/transcriptions | cobrado |
create_embeddings | Vetores de embedding para um texto ou um lote de até 2048. | POST /v1/embeddings | cobrado |
get_key_info | Limite de gasto da chave, valor usado e restante, período de redefinição e gasto de hoje / desta semana / deste mês (USD). | GET /v1/key | somente leitura |
get_generation | O registro de cobrança de uma requisição pelo request_id: custo, detalhamento de tokens, latência, status. | GET /v1/generation | somente leitura |
Chave de provisioning
| Ferramenta | O que faz | Endpoint REST | Observações |
|---|---|---|---|
create_api_key | Cria uma chave de inferência com limite de gasto, período de redefinição, listas de permissões de modelos e de IP, expiração e metadados. O segredo aparece apenas no resultado. | POST /api/provisioning/keys | altera dados |
list_api_keys | As chaves de inferência do workspace, com limites, gasto e status; filtre por metadados. | GET /api/provisioning/keys | somente leitura |
get_api_key | Configurações, gasto e status de uma chave. | GET /api/provisioning/keys/{id} | somente leitura |
update_api_key | Altera as configurações de uma chave, ou a desativa / reativa. Apenas os campos informados mudam. | PATCH /api/provisioning/keys/{id} | destrutivo |
delete_api_key | Exclui uma chave permanentemente. | DELETE /api/provisioning/keys/{id} | destrutivo |
Chave de cobrança
| Ferramenta | O que faz | Endpoint REST | Observações |
|---|---|---|---|
get_balance | Saldo disponível agora (USD), com voucher e créditos programados. | GET /api/v1/billing/balance | somente leitura |
get_usage | Gasto e requisições por hora ou por dia, por chave e/ou modelo. | GET /api/v1/billing/usage | somente leitura |
list_usage_records | Registros por requisição com tokens, custo e status, paginados por cursor. | GET /api/v1/billing/records | somente leitura |
get_billing_summary | Totais de um intervalo com as principais chaves e modelos. | GET /api/v1/billing/summary | somente leitura |
get_data_freshness | O quão atualizados estão os dados de cobrança. | GET /api/v1/billing/freshness | somente leitura |
list_models, get_model e get_pricing estão disponíveis para todos os tipos de chave; com uma chave de inferência, list_models mostra apenas os modelos que essa chave pode chamar.
Como são os resultados
Todo resultado traz um bloco de texto legível e os mesmos dados em JSON em structuredContent, para que tanto clientes de chat quanto programas possam usá-lo. Imagens e áudio voltam como conteúdo de imagem e de áudio; vídeos, como links. Ferramentas que executam um modelo terminam com uma linha de recibo (modelo, tokens, custo e request_id) que pode ser consultada depois com get_generation.
Permissões e segurança
- As mesmas regras da API REST. Cada chamada de ferramenta é executada pelo endpoint REST indicado, com a sua chave: autenticação, tipo de chave, lista de permissões de IP, lista de permissões de modelos, limite de gasto, limites de taxa e cobrança se aplicam sem alteração. O MCP não concede nenhuma permissão extra nem pula nenhuma verificação.
- Privilégio mínimo por tipo de chave. Chaves de inferência não podem gerenciar chaves nem ler a cobrança do workspace; chaves de provisioning não podem chamar modelos; chaves de cobrança são somente leitura.
- Dicas de aprovação. Toda ferramenta traz anotações MCP. Ferramentas somente leitura são marcadas com
readOnlyHint; ferramentas que gastam dinheiro não são somente leitura;update_api_key,delete_api_keyecancel_videosão marcadas comdestructiveHint. Os clientes usam essas marcações para decidir o que perguntar a você antes de executar. - Chave recomendada para agentes: uma chave de inferência dedicada, com limite de gasto redefinido diariamente, uma lista
allowed_modelse uma lista de permissões de IP quando o agente roda em hosts conhecidos. Revogue-a isoladamente, sem mexer nas chaves de produção. - Segredos e conteúdo não confiável.
create_api_keyretorna a nova chave uma única vez: diga ao seu agente onde armazená-la. Trate a saída do modelo e os resultados das ferramentas como entrada não confiável (prompt injection) antes de deixar um agente agir com base neles.
Detalhes do protocolo
| Item | Detalhe |
|---|---|
| Versões do protocolo | 2026-07-28 (sem estado, _meta por requisição e cabeçalhos Mcp-Method / Mcp-Name, server/discover) e 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05 (handshake initialize). Todas na mesma URL; cada requisição é atendida conforme a versão que ela usa. |
| Sessões | Nenhuma. Nenhum Mcp-Session-Id é emitido, então qualquer requisição pode chegar a qualquer réplica do servidor e nada precisa ser reinicializado após uma reconexão. |
| Métodos | initialize, ping, tools/list, tools/call; com 2026-07-28, server/discover no lugar do handshake. GET e DELETE retornam 405; lotes JSON-RPC não são aceitos. |
| Erros | Uma ferramenta desconhecida gera um erro JSON-RPC (-32602). Todo o resto (argumentos inválidos, uma recusa da API, uma geração com falha) é um resultado de ferramenta com isError: true e uma mensagem com a qual o modelo pode agir. Com 2026-07-28, problemas no envelope retornam HTTP 400 com -32020 (cabeçalho divergente) ou -32022 (versão não suportada, listando as suportadas). |
| Cache | tools/list é retornado em ordem fixa (favorável ao prompt cache), com ttlMs de 10 minutos e cacheScope: "private", pois a lista depende da sua chave. |
| Limite de taxa | 600 mensagens MCP por minuto por chave (HTTP 429 com Retry-After). Cada chamada de ferramenta também conta para os limites do endpoint REST que ela chama. |
| Chamadas longas | Uma chamada pode durar até 30 minutos (raciocínio longo). A geração de vídeo é assíncrona: create_video retorna um job e get_video consulta seu andamento. |
Solução de problemas
| Sintoma | Causa e solução |
|---|---|
| 401, ou o cliente informa que é preciso autenticar | A chave está ausente, é inválida, expirou ou está desativada. Envie-a como Authorization: Bearer <key> e verifique se a variável de ambiente está definida onde o cliente é executado. |
| Uma ferramenta esperada não aparece na lista | As ferramentas dependem do tipo de chave (veja as tabelas acima) e dos recursos em prévia: as ferramentas de imagem e vídeo aparecem apenas para workspaces admitidos nessas prévias. |
| Um resultado de ferramenta indica HTTP 402 | O saldo do workspace acabou. Recarregue no console; get_key_info mostra o limite da própria chave. |
| Um resultado de ferramenta indica HTTP 403 para um modelo | O allowed_models da chave ou o acesso a modelos do seu workspace exclui esse modelo. list_models mostra exatamente o que a chave pode chamar. |
chat_completion não retorna texto, com finish_reason length | Um modelo de raciocínio gastou todo o orçamento de max_tokens pensando. Aumente max_tokens ou reduza reasoning_effort. |
| HTTP 429 | Mais de 600 mensagens por minuto em uma chave, ou o limite próprio do endpoint REST. Aguarde o tempo indicado em Retry-After. |
Em breve
- Login com OAuth, para que os conectores do claude.ai, do Claude Desktop e do ChatGPT possam se conectar sem colar uma chave, usando credenciais de curta duração e com gasto limitado.
- Gateway MCP: o mesmo endpoint também agregando servidores MCP de terceiros (GitHub, Slack, os seus próprios) sob a sua chave, com permissões por ferramenta, credenciais mantidas no servidor e um único log de auditoria.
- Progresso de chamadas longas, transmitido enquanto uma ferramenta é executada.
Relacionados: Chaves de API · Chaves de provisioning · API de cobrança · Chat Completions