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.

Endpointhttps://synthorai.io/v1/mcp
TransporteStreamable HTTP, sem estado (sem sessões), respostas JSON
AutenticaçãoAuthorization: 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 administração (sk-syn-admin-…) recebe as ferramentas que seus escopos permitem, como o gerenciamento de chaves com keys.read ou keys.write e o saldo e o uso com billing.read. Uma chave de administração com vários escopos recebe todas elas em uma única conexão. As chaves de provisionamento e de cobrança emitidas antes (sk-syn-prov-…, sk-syn-bill-…) continuam funcionando.

Os outros escopos de uma chave de administração adicionam ferramentas para o log de requisições, a biblioteca de prompts e as configurações do workspace. As tabelas abaixo indicam de qual escopo cada ferramenta precisa.

Início rápido

  1. 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.
  2. 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.
  3. 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.

Os clientes que se conectam por login (claude.ai, Claude Desktop, ChatGPT) não precisam de chave. Adicione o endpoint acima como conector e entre na Synthorai: você escolhe o workspace e o que a conexão pode fazer. Ela recebe uma chave própria, com validade, listada em Chaves de API, onde pode ser removida.

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

O Claude Desktop se conecta por login: adicione o endpoint como conector personalizado, sem precisar de chave. Para usar uma chave sua, conecte-se 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

FerramentaO que fazEndpoint RESTObservaçõ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

FerramentaO que fazEndpoint RESTObservaçõ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/v1/keys altera dados
list_api_keys As chaves de inferência do workspace, com limites, gasto e status; filtre por metadados. GET /api/v1/keys somente leitura
get_api_key Configurações, gasto e status de uma chave. GET /api/v1/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/v1/keys/{id} destrutivo
delete_api_key Exclui uma chave permanentemente. DELETE /api/v1/keys/{id} destrutivo

Chave de cobrança

FerramentaO que fazEndpoint RESTObservaçõ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

Chave de administração: log de requisições e uso

FerramentaO que fazEndpoint RESTObservações
search_requests Requisições em um intervalo de tempo: modelo, status, tokens, custo, tempos, chave e rótulos. Nunca o prompt nem a resposta. Requer logs.read. GET /api/v1/requests somente leitura
get_request Uma requisição pelo id. Requer logs.read. GET /api/v1/requests/{id} somente leitura
list_traces Requisições agrupadas por id de trace, com contagens, custo e duração. Requer logs.read. GET /api/v1/traces somente leitura
list_sessions Requisições agrupadas por id de sessão. Requer logs.read. GET /api/v1/sessions somente leitura
get_label_usage Requisições, tokens e custo somados por rótulo. Requer usage.read. GET /api/v1/usage/labels somente leitura

Chave de administração: biblioteca de prompts

FerramentaO que fazEndpoint RESTObservações
list_prompts Todos os prompts com seus rótulos e a versão mais recente. Requer prompts.read. GET /api/v1/prompts somente leitura
get_prompt Os rótulos, o lançamento e as versões de um prompt. Requer prompts.read. GET /api/v1/prompts/{id} somente leitura
get_prompt_version O texto, as configurações do modelo e as variáveis de uma versão. Requer prompts.read. GET /api/v1/prompts/{id}/versions/{version} somente leitura
save_prompt_version Salva a próxima versão. Nada muda para quem chama até que um rótulo seja movido. Requer prompts.write. POST /api/v1/prompts/{id}/versions altera dados
move_prompt_label Aponta um rótulo para uma versão. Mover production muda o que é entregue a quem chama. Requer prompts.write. PUT /api/v1/prompts/{id}/labels/{label} destrutivo
list_prompt_test_sets Os conjuntos de testes de um prompt, sem as linhas. Requer evals.read. GET /api/v1/prompts/{id}/test-sets somente leitura
get_prompt_test_set Um conjunto de testes com suas linhas e verificações. Requer evals.read. GET /api/v1/prompts/{id}/test-sets/{set} somente leitura
list_prompt_eval_runs As execuções mais recentes de um prompt: as versões comparadas, o conjunto de testes e quantas linhas passaram. Requer evals.read. GET /api/v1/prompts/{id}/eval-runs somente leitura
get_prompt_eval_run Uma execução com as respostas das duas versões e o resultado de cada verificação. Requer evals.read. GET /api/v1/prompts/{id}/eval-runs/{run} somente leitura

Chave de administração: workspace

FerramentaO que fazEndpoint RESTObservações
list_audit_logs O que foi alterado no workspace e por quem. Requer audit.read. GET /api/v1/audit-logs somente leitura
list_members Os membros e suas funções. Requer members.read. GET /api/v1/members somente leitura
get_byok_settings Quais provedores usam suas próprias chaves e como cada um está configurado. Nunca uma chave. Requer byok.read. GET /api/v1/byok somente leitura
list_export_destinations Para onde os dados das requisições são exportados. Nunca chaves de acesso nem cabeçalhos. Requer exports.read. GET /api/v1/export-destinations 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.

Controle o que uma conexão pode fazer

  • Para o workspace. Em Configurações > MCP, um administrador ativa ou desativa o MCP, escolhe os grupos de ferramentas que as conexões podem usar e decide se ferramentas que alteram algo podem ser usadas. Em uma instância dedicada, o MCP fica desativado até que um administrador o ative.
  • Para uma conexão. Envie X-MCP-Readonly: true para remover todas as ferramentas que alteram algo ou gastam dinheiro, e X-MCP-Toolsets: logs,prompts para manter apenas esses grupos (usage, logs, prompts, keys, workspace, inference). Clientes que não conseguem definir cabeçalhos colocam ?readonly=true&toolsets=logs,prompts na URL.
  • Tudo isso só retira ferramentas. Uma ferramenta aparece na lista quando os escopos da chave, as configurações do workspace e os limites da própria conexão a permitem.
  • Toda alteração é registrada. Uma alteração feita via MCP fica no log de auditoria com a chave e o nome do cliente.

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 chave. Uma chave de inferência não pode gerenciar chaves nem ler os dados de cobrança do workspace; uma chave de administração não pode chamar modelos e só faz o que seus escopos indicam.
  • 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_key e cancel_video são marcadas com destructiveHint. 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_models e 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_key retorna 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

ItemDetalhe
Versões do protocolo2026-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õesNenhuma. 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étodosinitialize, 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.
ErrosUma 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).
Cachetools/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 taxa600 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 longasUma 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

SintomaCausa e solução
401, ou o cliente informa que é preciso autenticarA 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 listaAs 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 402O 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 modeloO 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 lengthUm modelo de raciocínio gastou todo o orçamento de max_tokens pensando. Aumente max_tokens ou reduza reasoning_effort.
HTTP 429Mais 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

  • 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