Server MCP

Collega a Synthorai qualsiasi agente compatibile con MCP (Claude Code, Cursor, VS Code, Codex, l'OpenAI Agents SDK e altri) con un solo URL e la tua chiave API. Tutti i modelli e le modalità, la gestione delle chiavi API e i dati di fatturazione diventano strumenti che l'agente può chiamare. Ogni chiamata viene autenticata, limitata e fatturata esattamente come la richiesta REST corrispondente.

Endpointhttps://synthorai.io/v1/mcp
TrasportoStreamable HTTP, stateless (senza sessioni), risposte JSON
AutenticazioneAuthorization: Bearer <API key>
ℹ

La chiave con cui ti connetti decide quali strumenti hai a disposizione: una chiave di inferenza (sk-syn-…) chiama i modelli; una chiave di amministrazione (sk-syn-admin-…) dà gli strumenti consentiti dai suoi ambiti: la gestione delle chiavi con keys.read o keys.write, saldo e utilizzo con billing.read. Con una chiave di amministrazione che ha più ambiti li trovi tutti in un’unica connessione. Le chiavi di provisioning e di fatturazione emesse in precedenza (sk-syn-prov-…, sk-syn-bill-…) continuano a funzionare.

Gli altri ambiti di una chiave di amministrazione aggiungono strumenti per il registro delle richieste, la libreria dei prompt e le impostazioni del workspace. Le tabelle qui sotto indicano quale ambito serve a ciascuno strumento.

Guida rapida

  1. Crea una chiave API nella console, dalla pagina Chiavi API. Per un agente, assegnale un limite di spesa e un'allowlist dei modelli.
  2. Aggiungi il server al tuo client con uno degli snippet qui sotto, leggendo la chiave da una variabile d'ambiente invece di incollarla in un file.
  3. Chiedi al tuo agente, ad esempio: “Elenca i tre modelli più economici che supportano gli strumenti, poi chiedi al più veloce di riassumere questo file e dimmi quanto è costato.”

Collega il tuo client

Tutti i client usano lo stesso endpoint e lo stesso header. Imposta prima SYNTHORAI_API_KEY nel tuo ambiente.

I client che si connettono effettuando l'accesso (claude.ai, Claude Desktop, ChatGPT) non hanno bisogno di una chiave. Aggiungi l'endpoint qui sopra come connettore e accedi a Synthorai: scegli tu il workspace e che cosa può fare la connessione. La connessione riceve una chiave propria, con una scadenza: la trovi in Chiavi API, dove puoi anche rimuoverla.

Claude Code

Esegui /mcp in Claude Code per verificare la connessione. Aggiungi --scope user per rendere il server disponibile in tutti i progetti, oppure esegui il commit della forma .mcp.json per condividerlo con il tuo team (la chiave resta nell'ambiente di ogni sviluppatore).

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

Inseriscilo in ~/.cursor/mcp.json (tutti i progetti) o in .cursor/mcp.json (un singolo progetto).

{
  "mcpServers": {
    "synthorai": {
      "url": "https://synthorai.io/v1/mcp",
      "headers": { "Authorization": "Bearer ${env:SYNTHORAI_API_KEY}" }
    }
  }
}

VS Code (GitHub Copilot)

Inseriscilo in .vscode/mcp.json. VS Code chiede la chiave una sola volta e la conserva in modo sicuro.

{
  "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

Inseriscilo in ~/.codex/config.toml, oppure esegui 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

Sono i server di OpenAI a chiamare l'endpoint per tuo conto, quindi lascia vuota l'allowlist IP della chiave (oppure consenti gli intervalli di IP in uscita di OpenAI). Usa allowed_tools per esporre solo gli strumenti di cui il modello ha bisogno.

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

Funziona allo stesso modo con qualsiasi framework basato sugli SDK client MCP (LangChain, LlamaIndex, Pydantic AI, Vercel AI SDK, Mastra …): punta il suo trasporto Streamable HTTP all'endpoint con l'header.

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

Claude Desktop si connette effettuando l'accesso: aggiungi l'endpoint come connettore personalizzato e non serve alcuna chiave. Per usare una tua chiave, connettiti tramite il bridge mcp-remote, che aggiunge l'header per te:

{
  "mcpServers": {
    "synthorai": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://synthorai.io/v1/mcp", "--header", "Authorization:${AUTH_HEADER}"],
      "env": { "AUTH_HEADER": "Bearer sk-syn-..." }
    }
  }
}

curl

Il server usa semplice JSON-RPC su HTTP, quindi non serve alcun SDK. Non è richiesto alcun handshake: ogni richiesta è indipendente.

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"}}}'

Esempio di risposta

{
  "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-…"
    }
  }
}

Strumenti

tools/list restituisce solo gli strumenti che la tua chiave può usare: l'elenco è filtrato per tipo di chiave e per le funzionalità abilitate nel tuo workspace (la generazione di immagini e video è in anteprima limitata). Gli strumenti che eseguono un modello costano esattamente quanto la chiamata REST; tutti gli altri sono gratuiti.

Chiave di inferenza

StrumentoCosa faEndpoint RESTNote
list_models Modelli che la chiave può chiamare, dal più economico, con lunghezza del contesto, modalità, capacità e prezzi di listino. Filtri: categoria, capacità, modalità di input, ricerca. GET /v1/models + /api/models sola lettura
get_model Dettagli completi di un modello, incluso il prezzo effettivo dopo eventuali sconti e se la chiave può chiamarlo. GET /v1/models/{id} sola lettura
get_pricing Il listino prezzi (USD dopo gli sconti): prezzi per token, per chiamata, al minuto, al secondo e a scaglioni. GET /api/pricing sola lettura
chat_completion Una chat completion su qualsiasi modello: un prompt o un array messages completo (immagini, risultati degli strumenti), con output strutturato, strumenti funzione, sforzo di ragionamento e modelli di fallback facoltativi. Restituisce testo, chiamate agli strumenti, utilizzo, costo e request_id. POST /v1/chat/completions a pagamento
generate_image Genera o modifica immagini; restituite come contenuto immagine, oppure come link con response_format=url. POST /v1/images/generations a pagamento
list_image_models Modelli di immagini con prezzi e input supportati. GET /v1/images/models sola lettura
create_video Avvia un job video da un prompt o da un primo fotogramma; può attendere fino a 60 s il completamento. Fatturato al completamento del job. POST /v1/videos a pagamento
get_video Stato del job; una volta completato, link ai video (validi circa 24 ore). GET /v1/videos/{id} sola lettura
cancel_video Annulla un job ancora in coda (un job già avviato non può essere fermato). I job annullati e quelli non riusciti non vengono fatturati. DELETE /v1/videos/{id} distruttivo
list_video_models Modelli video con risoluzioni, durate e prezzi. GET /v1/videos/models sola lettura
text_to_speech Voce a partire da un testo, restituita come contenuto audio. POST /v1/audio/speech a pagamento
transcribe_audio Testo da un audio fornito come URL o come dati base64 (fino a 25 MB). POST /v1/audio/transcriptions a pagamento
create_embeddings Vettori di embedding per un testo o per un batch fino a 2048. POST /v1/embeddings a pagamento
get_key_info Limite di spesa della chiave, importo usato e rimanente, periodo di reset e spesa di oggi / di questa settimana / di questo mese (USD). GET /v1/key sola lettura
get_generation Il record di fatturazione di una richiesta tramite request_id: costo, ripartizione dei token, latenza, stato. GET /v1/generation sola lettura

Chiave di provisioning

StrumentoCosa faEndpoint RESTNote
create_api_key Crea una chiave di inferenza con limite di spesa, periodo di reset, allowlist di modelli e IP, scadenza e metadati. Il segreto compare solo nel risultato. POST /api/v1/keys modifica i dati
list_api_keys Le chiavi di inferenza del workspace con limiti, spesa e stato; filtrabili per metadati. GET /api/v1/keys sola lettura
get_api_key Impostazioni, spesa e stato di una singola chiave. GET /api/v1/keys/{id} sola lettura
update_api_key Modifica le impostazioni di una chiave, oppure la disabilita / riabilita. Cambiano solo i campi forniti. PATCH /api/v1/keys/{id} distruttivo
delete_api_key Elimina definitivamente una chiave. DELETE /api/v1/keys/{id} distruttivo

Chiave di fatturazione

StrumentoCosa faEndpoint RESTNote
get_balance Saldo spendibile attuale (USD), con credito promozionale e crediti programmati. GET /api/v1/billing/balance sola lettura
get_usage Spesa e richieste per ora o per giorno, per chiave e/o per modello. GET /api/v1/billing/usage sola lettura
list_usage_records Record per richiesta con token, costo e stato, paginati tramite cursore. GET /api/v1/billing/records sola lettura
get_billing_summary Totali su un intervallo, con le chiavi e i modelli principali. GET /api/v1/billing/summary sola lettura
get_data_freshness Quanto sono aggiornati i dati di fatturazione. GET /api/v1/billing/freshness sola lettura

Chiave di amministrazione: registro delle richieste e utilizzo

StrumentoCosa faEndpoint RESTNote
search_requests Le richieste in un intervallo di tempo: modello, stato, token, costo, tempi, chiave ed etichette. Mai il prompt né la risposta. Richiede logs.read. GET /api/v1/requests sola lettura
get_request Una singola richiesta tramite il suo id. Richiede logs.read. GET /api/v1/requests/{id} sola lettura
list_traces Le richieste raggruppate per id di trace, con conteggi, costo e durata. Richiede logs.read. GET /api/v1/traces sola lettura
list_sessions Le richieste raggruppate per id di sessione. Richiede logs.read. GET /api/v1/sessions sola lettura
get_label_usage Richieste, token e costo sommati per etichetta. Richiede usage.read. GET /api/v1/usage/labels sola lettura

Chiave di amministrazione: libreria dei prompt

StrumentoCosa faEndpoint RESTNote
list_prompts Tutti i prompt con le relative etichette e la versione più recente. Richiede prompts.read. GET /api/v1/prompts sola lettura
get_prompt Etichette, rilascio e versioni di un prompt. Richiede prompts.read. GET /api/v1/prompts/{id} sola lettura
get_prompt_version Testo, impostazioni del modello e variabili di una versione. Richiede prompts.read. GET /api/v1/prompts/{id}/versions/{version} sola lettura
save_prompt_version Salva la versione successiva. Per i chiamanti non cambia nulla finché non viene spostata un’etichetta. Richiede prompts.write. POST /api/v1/prompts/{id}/versions modifica i dati
move_prompt_label Sposta un’etichetta su una versione. Spostare production cambia ciò che ricevono i chiamanti. Richiede prompts.write. PUT /api/v1/prompts/{id}/labels/{label} distruttivo
list_prompt_test_sets I set di test di un prompt, senza le righe. Richiede evals.read. GET /api/v1/prompts/{id}/test-sets sola lettura
get_prompt_test_set Un set di test con le sue righe e i controlli. Richiede evals.read. GET /api/v1/prompts/{id}/test-sets/{set} sola lettura
list_prompt_eval_runs Le ultime esecuzioni di un prompt: le versioni confrontate, il set di test e quante righe sono passate. Richiede evals.read. GET /api/v1/prompts/{id}/eval-runs sola lettura
get_prompt_eval_run Un’esecuzione con le risposte di entrambe le versioni e l’esito di ogni controllo. Richiede evals.read. GET /api/v1/prompts/{id}/eval-runs/{run} sola lettura

Chiave di amministrazione: workspace

StrumentoCosa faEndpoint RESTNote
list_audit_logs Cosa è stato modificato nel workspace e da chi. Richiede audit.read. GET /api/v1/audit-logs sola lettura
list_members I membri e i loro ruoli. Richiede members.read. GET /api/v1/members sola lettura
get_byok_settings Quali provider usano le tue chiavi e come è configurato ciascuno. Mai una chiave. Richiede byok.read. GET /api/v1/byok sola lettura
list_export_destinations Dove vengono esportati i dati delle richieste. Mai chiavi di accesso né header. Richiede exports.read. GET /api/v1/export-destinations sola lettura

list_models, get_model e get_pricing sono disponibili per ogni tipo di chiave; per una chiave di inferenza, list_models mostra solo i modelli che quella chiave può chiamare.

Controlla cosa può fare una connessione

  • Per il workspace. In Impostazioni > MCP un amministratore attiva o disattiva MCP, sceglie i gruppi di strumenti che le connessioni possono usare e decide se consentire gli strumenti che modificano qualcosa. Su un’istanza dedicata MCP resta disattivato finché un amministratore non lo attiva.
  • Per una singola connessione. Invia X-MCP-Readonly: true per escludere tutti gli strumenti che modificano qualcosa o spendono denaro, e X-MCP-Toolsets: logs,prompts per tenere solo quei gruppi (usage, logs, prompts, keys, workspace, inference). I client che non possono impostare header aggiungono ?readonly=true&toolsets=logs,prompts all’URL.
  • Tutto questo può solo togliere strumenti. Uno strumento compare nell’elenco quando lo consentono tutti e tre: gli ambiti della chiave, le impostazioni del workspace e i limiti della connessione stessa.
  • Ogni modifica viene registrata. Una modifica fatta tramite MCP compare nel registro di audit con la chiave e il nome del client.

Come sono fatti i risultati

Ogni risultato contiene un blocco di testo leggibile e gli stessi dati in JSON in structuredContent, così possono usarlo sia i client di chat sia i programmi. Immagini e audio vengono restituiti come contenuto immagine e audio, i video come link. Gli strumenti che eseguono un modello terminano con una riga di ricevuta (modello, token, costo e request_id) che get_generation può consultare in seguito.

Permessi e sicurezza

  • Le stesse regole dell'API REST. Ogni chiamata a uno strumento viene eseguita dall'endpoint REST indicato, con la tua chiave: autenticazione, tipo di chiave, allowlist IP, allowlist dei modelli, limite di spesa, limiti di frequenza e fatturazione si applicano invariati. MCP non aggiunge alcun permesso e non salta alcun controllo.
  • Privilegio minimo per chiave. Una chiave di inferenza non può gestire le chiavi né leggere la fatturazione del workspace; una chiave di amministrazione non può chiamare i modelli e fa solo ciò che prevedono i suoi ambiti.
  • Indicazioni per l'approvazione. Ogni strumento include annotazioni MCP. Gli strumenti di sola lettura sono contrassegnati con readOnlyHint; gli strumenti che spendono denaro non sono di sola lettura; update_api_key, delete_api_key e cancel_video sono contrassegnati con destructiveHint. I client le usano per decidere cosa chiederti prima dell'esecuzione.
  • Chiave consigliata per gli agenti: una chiave di inferenza dedicata con un limite di spesa che si azzera ogni giorno, un elenco allowed_models e un'allowlist IP quando l'agente gira su host noti. Puoi revocarla singolarmente senza toccare le chiavi di produzione.
  • Segreti e contenuti non attendibili. create_api_key restituisce la nuova chiave una sola volta: indica al tuo agente dove conservarla. Tratta l'output dei modelli e i risultati degli strumenti come input non attendibile (prompt injection) prima di lasciare che un agente agisca in base a essi.

Dettagli del protocollo

VoceDettaglio
Versioni del protocollo2026-07-28 (stateless, _meta per richiesta e header Mcp-Method / Mcp-Name, server/discover) e 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05 (handshake initialize). Entrambe sullo stesso URL; ogni richiesta viene servita secondo la versione che usa.
SessioniNessuna. Non viene emesso alcun Mcp-Session-Id, quindi qualsiasi richiesta può raggiungere qualsiasi replica del server e dopo una riconnessione non serve reinizializzare nulla.
Metodiinitialize, ping, tools/list, tools/call; con 2026-07-28, server/discover al posto dell'handshake. GET e DELETE restituiscono 405; i batch JSON-RPC non sono accettati.
ErroriUno strumento sconosciuto produce un errore JSON-RPC (-32602). Tutto il resto (argomenti non validi, un rifiuto dell'API, una generazione non riuscita) è un risultato dello strumento con isError: true e un messaggio su cui il modello può agire. Con 2026-07-28, i problemi nell'envelope restituiscono HTTP 400 con -32020 (header non corrispondente) o -32022 (versione non supportata, con l'elenco di quelle supportate).
Cachingtools/list viene restituito in un ordine fisso (adatto al prompt caching) con ttlMs di 10 minuti e cacheScope: "private", poiché l'elenco dipende dalla tua chiave.
Limite di frequenza600 messaggi MCP al minuto per chiave (HTTP 429 con Retry-After). Ogni chiamata a uno strumento conta anche nei limiti dell'endpoint REST che richiama.
Chiamate lungheUna chiamata può durare fino a 30 minuti (ragionamento lungo). La generazione video è asincrona: create_video restituisce un job e get_video ne controlla lo stato.

Risoluzione dei problemi

SintomoCausa e soluzione
401, oppure il client segnala che è necessaria l'autenticazioneLa chiave è assente, non valida, scaduta o disabilitata. Inviala come Authorization: Bearer <key> e verifica che la variabile d'ambiente sia impostata dove gira il client.
Uno strumento atteso non compare nell'elencoGli strumenti dipendono dal tipo di chiave (vedi le tabelle sopra) e dalle funzionalità in anteprima: gli strumenti per immagini e video compaiono solo per i workspace ammessi a tali anteprime.
Il risultato di uno strumento riporta HTTP 402Il saldo del workspace è esaurito. Ricarica dalla console; get_key_info mostra il limite proprio della chiave.
Il risultato di uno strumento riporta HTTP 403 per un modelloIl modello è escluso da allowed_models della chiave o dall'accesso ai modelli del tuo workspace. list_models mostra esattamente cosa può chiamare la chiave.
chat_completion non restituisce testo e finish_reason è lengthUn modello di ragionamento ha speso l'intero budget di max_tokens per ragionare. Aumenta max_tokens o riduci reasoning_effort.
HTTP 429Più di 600 messaggi al minuto su una chiave, oppure il limite proprio dell'endpoint REST. Attendi il tempo indicato da Retry-After.

Prossimamente

  • Gateway MCP: lo stesso endpoint aggregherà anche server MCP di terze parti (GitHub, Slack, i tuoi) sotto la tua chiave, con permessi per singolo strumento, credenziali conservate lato server e un unico log di audit.
  • Avanzamento delle chiamate lunghe, trasmesso in streaming mentre uno strumento è in esecuzione.

Vedi anche: Chiavi API · Chiavi di provisioning · API di fatturazione · Chat Completions