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.
| Endpoint | https://synthorai.io/v1/mcp |
| Trasporto | Streamable HTTP, stateless (senza sessioni), risposte JSON |
| Autenticazione | Authorization: Bearer <API key> |
La chiave con cui ti connetti determina quali strumenti ottieni: una chiave di inferenza (sk-syn-…) chiama i modelli, una chiave di provisioning (sk-syn-prov-…) gestisce le chiavi API e una chiave di fatturazione (sk-syn-bill-…) legge saldo e utilizzo. Se un agente ha bisogno di più tipi di chiave, collega il server una volta per ciascun tipo.
Guida rapida
- Crea una chiave API nella console, dalla pagina Chiavi API. Per un agente, assegnale un limite di spesa e un'allowlist dei modelli.
- 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.
- 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.
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
I connettori personalizzati di Claude Desktop e claude.ai accedono tramite OAuth, che questo server non offre ancora (vedi la roadmap più sotto). Nel frattempo, Claude Desktop può connettersi 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
| Strumento | Cosa fa | Endpoint REST | Note |
|---|---|---|---|
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
| Strumento | Cosa fa | Endpoint REST | Note |
|---|---|---|---|
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/provisioning/keys | modifica i dati |
list_api_keys | Le chiavi di inferenza del workspace con limiti, spesa e stato; filtrabili per metadati. | GET /api/provisioning/keys | sola lettura |
get_api_key | Impostazioni, spesa e stato di una singola chiave. | GET /api/provisioning/keys/{id} | sola lettura |
update_api_key | Modifica le impostazioni di una chiave, oppure la disabilita / riabilita. Cambiano solo i campi forniti. | PATCH /api/provisioning/keys/{id} | distruttivo |
delete_api_key | Elimina definitivamente una chiave. | DELETE /api/provisioning/keys/{id} | distruttivo |
Chiave di fatturazione
| Strumento | Cosa fa | Endpoint REST | Note |
|---|---|---|---|
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 |
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.
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 tipo di chiave. Le chiavi di inferenza non possono gestire chiavi né leggere la fatturazione del workspace; le chiavi di provisioning non possono chiamare modelli; le chiavi di fatturazione sono di sola lettura.
- 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_keyecancel_videosono contrassegnati condestructiveHint. 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_modelse 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_keyrestituisce 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
| Voce | Dettaglio |
|---|---|
| Versioni del protocollo | 2026-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. |
| Sessioni | Nessuna. Non viene emesso alcun Mcp-Session-Id, quindi qualsiasi richiesta può raggiungere qualsiasi replica del server e dopo una riconnessione non serve reinizializzare nulla. |
| Metodi | initialize, 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. |
| Errori | Uno 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). |
| Caching | tools/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 frequenza | 600 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 lunghe | Una 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
| Sintomo | Causa e soluzione |
|---|---|
| 401, oppure il client segnala che è necessaria l'autenticazione | La 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'elenco | Gli 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 402 | Il 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 modello | Il 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 è length | Un modello di ragionamento ha speso l'intero budget di max_tokens per ragionare. Aumenta max_tokens o riduci reasoning_effort. |
| HTTP 429 | Più di 600 messaggi al minuto su una chiave, oppure il limite proprio dell'endpoint REST. Attendi il tempo indicato da Retry-After. |
Prossimamente
- Accesso OAuth, così i connettori di claude.ai, Claude Desktop e ChatGPT potranno connettersi senza incollare una chiave, con credenziali a breve durata e con tetto di spesa.
- 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