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 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
- 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.
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
| 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/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
| 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 |
Chiave di amministrazione: registro delle richieste e utilizzo
| Strumento | Cosa fa | Endpoint REST | Note |
|---|---|---|---|
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
| Strumento | Cosa fa | Endpoint REST | Note |
|---|---|---|---|
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
| Strumento | Cosa fa | Endpoint REST | Note |
|---|---|---|---|
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: trueper escludere tutti gli strumenti che modificano qualcosa o spendono denaro, eX-MCP-Toolsets: logs,promptsper tenere solo quei gruppi (usage,logs,prompts,keys,workspace,inference). I client che non possono impostare header aggiungono?readonly=true&toolsets=logs,promptsall’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_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
- 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