Serveur MCP
Connectez n'importe quel agent compatible MCP - Claude Code, Cursor, VS Code, Codex, l'OpenAI Agents SDK et d'autres - à Synthorai avec une seule URL et votre clé API. Chaque modèle et chaque modalité, la gestion des clés API et les données de facturation deviennent des outils que l'agent peut appeler. Chaque appel est authentifié, limité et facturé exactement comme la requête REST correspondante.
| Endpoint | https://synthorai.io/v1/mcp |
| Transport | Streamable HTTP, sans état (pas de sessions), réponses JSON |
| Authentification | Authorization: Bearer <API key> |
La clé utilisée pour la connexion détermine les outils disponibles : une clé d'inférence (sk-syn-…) appelle les modèles, une clé de provisioning (sk-syn-prov-…) gère les clés API, et une clé de facturation (sk-syn-bill-…) lit le solde et l'usage. Si un agent a besoin de plusieurs types de clés, connectez le serveur une fois par type.
Démarrage rapide
- Créez une clé API dans la console, sur la page Clés API. Pour un agent, attribuez-lui un plafond de dépense et une liste blanche de modèles.
- Ajoutez le serveur à votre client avec l'un des extraits ci-dessous, en lisant la clé depuis une variable d'environnement plutôt qu'en la collant dans un fichier.
- Demandez à votre agent, par exemple : « Liste les trois modèles les moins chers qui prennent en charge les outils, puis demande au plus rapide de résumer ce fichier, et dis-moi combien ça a coûté. »
Connecter votre client
Tous les clients utilisent le même endpoint et le même en-tête. Définissez d'abord SYNTHORAI_API_KEY dans votre environnement.
Claude Code
Exécutez /mcp dans Claude Code pour vérifier la connexion. Ajoutez --scope user pour rendre le serveur disponible dans tous les projets, ou committez la forme .mcp.json pour le partager avec votre équipe (la clé reste dans l'environnement de chaque développeur).
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
Placez ceci dans ~/.cursor/mcp.json (tous les projets) ou .cursor/mcp.json (un seul projet).
{
"mcpServers": {
"synthorai": {
"url": "https://synthorai.io/v1/mcp",
"headers": { "Authorization": "Bearer ${env:SYNTHORAI_API_KEY}" }
}
}
} VS Code (GitHub Copilot)
Placez ceci dans .vscode/mcp.json. VS Code demande la clé une seule fois et la stocke de manière sécurisée.
{
"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
Placez ceci dans ~/.codex/config.toml, ou exécutez 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
Les serveurs d'OpenAI appellent l'endpoint en votre nom : laissez donc vide la liste blanche d'IP de la clé (ou autorisez les plages d'IP sortantes d'OpenAI). Utilisez allowed_tools pour n'exposer que les outils dont le modèle a besoin.
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
Fonctionne de la même manière avec tout framework basé sur les SDK clients MCP (LangChain, LlamaIndex, Pydantic AI, Vercel AI SDK, Mastra…) : pointez son transport Streamable HTTP vers l'endpoint, avec l'en-tête.
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
Les connecteurs personnalisés de Claude Desktop et claude.ai s'authentifient via OAuth, que ce serveur ne propose pas encore (voir la feuille de route ci-dessous). En attendant, Claude Desktop peut se connecter via le pont mcp-remote, qui ajoute l'en-tête pour vous :
{
"mcpServers": {
"synthorai": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://synthorai.io/v1/mcp", "--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer sk-syn-..." }
}
}
} curl
Le serveur parle du JSON-RPC simple sur HTTP : aucun SDK n'est nécessaire. Aucune poignée de main n'est requise : chaque requête est autonome.
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"}}}' Exemple de réponse
{
"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-…"
}
}
} Outils
tools/list ne renvoie que les outils utilisables par votre clé : la liste est filtrée selon le type de clé et selon les fonctionnalités activées pour votre workspace (la génération d'images et de vidéos est en preview limitée). Les outils qui exécutent un modèle coûtent exactement le prix de l'appel REST ; tous les autres outils sont gratuits.
Clé d'inférence
| Outil | Rôle | Endpoint REST | Remarques |
|---|---|---|---|
list_models | Modèles que la clé peut appeler, du moins cher au plus cher, avec longueur de contexte, modalités, capacités et prix catalogue. Filtres : catégorie, capacité, modalité d'entrée, recherche. | GET /v1/models + /api/models | lecture seule |
get_model | Détails complets d'un modèle, y compris le prix effectif après remise éventuelle et si la clé peut l'appeler. | GET /v1/models/{id} | lecture seule |
get_pricing | La grille tarifaire (USD après remises) : prix par token, par appel, par minute, par seconde et par paliers. | GET /api/pricing | lecture seule |
chat_completion | Une complétion de chat sur n'importe quel modèle : un prompt ou un tableau messages complet (images, résultats d'outils), avec en option sortie structurée, outils de fonction, effort de raisonnement et modèles de repli. Renvoie le texte, les appels d'outils, l'usage, le coût et le request_id. | POST /v1/chat/completions | facturé |
generate_image | Génère ou modifie des images ; renvoyées comme contenu image, ou sous forme de liens avec response_format=url. | POST /v1/images/generations | facturé |
list_image_models | Modèles d'image avec leurs prix et les entrées prises en charge. | GET /v1/images/models | lecture seule |
create_video | Lance une tâche vidéo à partir d'un prompt ou d'une première image ; peut attendre jusqu'à 60 s qu'elle se termine. Facturé à la fin de la tâche. | POST /v1/videos | facturé |
get_video | Statut de la tâche ; une fois terminée, liens vers les vidéos (valables environ 24 heures). | GET /v1/videos/{id} | lecture seule |
cancel_video | Annule une tâche encore en file d'attente (une tâche démarrée ne peut pas être arrêtée). Les tâches annulées ou échouées ne sont pas facturées. | DELETE /v1/videos/{id} | destructif |
list_video_models | Modèles vidéo avec résolutions, durées et prix. | GET /v1/videos/models | lecture seule |
text_to_speech | Synthèse vocale à partir de texte, renvoyée comme contenu audio. | POST /v1/audio/speech | facturé |
transcribe_audio | Texte extrait d'un audio fourni par URL ou en données base64 (jusqu'à 25 Mo). | POST /v1/audio/transcriptions | facturé |
create_embeddings | Vecteurs d'embedding pour un texte ou pour un lot de 2048 textes maximum. | POST /v1/embeddings | facturé |
get_key_info | Plafond de dépense de la clé, montant utilisé et restant, période de réinitialisation, et dépense du jour / de la semaine / du mois (USD). | GET /v1/key | lecture seule |
get_generation | L'enregistrement de facturation d'une requête, par request_id : coût, détail des tokens, latence, statut. | GET /v1/generation | lecture seule |
Clé de provisioning
| Outil | Rôle | Endpoint REST | Remarques |
|---|---|---|---|
create_api_key | Crée une clé d'inférence avec plafond de dépense, période de réinitialisation, listes blanches de modèles et d'IP, expiration et métadonnées. Le secret ne figure que dans le résultat. | POST /api/provisioning/keys | modifie des données |
list_api_keys | Les clés d'inférence du workspace avec leurs plafonds, dépenses et statut ; filtrage par métadonnées. | GET /api/provisioning/keys | lecture seule |
get_api_key | Paramètres, dépense et statut d'une clé. | GET /api/provisioning/keys/{id} | lecture seule |
update_api_key | Modifie les paramètres d'une clé, ou la désactive / réactive. Seuls les champs fournis sont modifiés. | PATCH /api/provisioning/keys/{id} | destructif |
delete_api_key | Supprime définitivement une clé. | DELETE /api/provisioning/keys/{id} | destructif |
Clé de facturation
| Outil | Rôle | Endpoint REST | Remarques |
|---|---|---|---|
get_balance | Solde disponible actuel (USD), avec crédit promotionnel et crédits programmés. | GET /api/v1/billing/balance | lecture seule |
get_usage | Dépense et requêtes par heure ou par jour, par clé et/ou par modèle. | GET /api/v1/billing/usage | lecture seule |
list_usage_records | Enregistrements par requête avec tokens, coût et statut, paginés par curseur. | GET /api/v1/billing/records | lecture seule |
get_billing_summary | Totaux sur une plage, avec les principales clés et les principaux modèles. | GET /api/v1/billing/summary | lecture seule |
get_data_freshness | Degré d'actualité des données de facturation. | GET /api/v1/billing/freshness | lecture seule |
list_models, get_model et get_pricing sont proposés à tous les types de clés ; pour une clé d'inférence, list_models n'affiche que les modèles que cette clé peut appeler.
Format des résultats
Chaque résultat contient un bloc de texte lisible et les mêmes données en JSON dans structuredContent, exploitables aussi bien par les clients de chat que par les programmes. Les images et l'audio sont renvoyés comme contenu image et audio, les vidéos sous forme de liens. Les outils qui exécutent un modèle se terminent par une ligne de reçu - modèle, tokens, coût et request_id - que get_generation permet de consulter plus tard.
Permissions et sécurité
- Mêmes règles que l'API REST. Chaque appel d'outil est exécuté par l'endpoint REST qu'il nomme, avec votre clé : authentification, type de clé, liste blanche d'IP, liste blanche de modèles, plafond de dépense, limites de débit et facturation s'appliquent sans changement. MCP n'ajoute aucune permission et ne contourne aucun contrôle.
- Moindre privilège selon le type de clé. Les clés d'inférence ne peuvent ni gérer les clés ni lire la facturation du workspace ; les clés de provisioning ne peuvent pas appeler de modèles ; les clés de facturation sont en lecture seule.
- Indications d'approbation. Chaque outil porte des annotations MCP. Les outils en lecture seule sont marqués
readOnlyHint; les outils qui dépensent de l'argent ne sont pas en lecture seule ;update_api_key,delete_api_keyetcancel_videosont marquésdestructiveHint. Les clients s'en servent pour décider quoi vous demander avant l'exécution. - Clé recommandée pour un agent : une clé d'inférence dédiée, avec un plafond de dépense réinitialisé chaque jour, une liste
allowed_modelset une liste blanche d'IP lorsque l'agent tourne sur des hôtes connus. Révoquez-la isolément, sans toucher aux clés de production. - Secrets et contenu non fiable.
create_api_keyrenvoie la nouvelle clé une seule fois - indiquez à votre agent où la stocker. Traitez la sortie des modèles et les résultats d'outils comme des entrées non fiables (injection de prompt) avant de laisser un agent agir en conséquence.
Détails du protocole
| Élément | Détail |
|---|---|
| Versions du protocole | 2026-07-28 (sans état, _meta par requête et en-têtes Mcp-Method / Mcp-Name, server/discover) et 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05 (poignée de main initialize). Les deux sur la même URL ; chaque requête est traitée selon la génération de protocole qu'elle utilise. |
| Sessions | Aucune. Aucun Mcp-Session-Id n'est émis : n'importe quelle requête peut atteindre n'importe quelle réplique du serveur, et rien n'est à réinitialiser après une reconnexion. |
| Méthodes | initialize, ping, tools/list, tools/call ; avec 2026-07-28, server/discover remplace la poignée de main. GET et DELETE renvoient 405 ; les lots JSON-RPC ne sont pas acceptés. |
| Erreurs | Un outil inconnu produit une erreur JSON-RPC (-32602). Tout le reste - arguments invalides, refus de l'API, génération échouée - est un résultat d'outil avec isError: true et un message exploitable par le modèle. Avec 2026-07-28, les problèmes d'enveloppe renvoient HTTP 400 avec -32020 (en-têtes incohérents) ou -32022 (version non prise en charge, avec la liste des versions prises en charge). |
| Mise en cache | tools/list est renvoyé dans un ordre fixe (favorable au cache de prompt), avec un ttlMs de 10 minutes et cacheScope: "private", puisque la liste dépend de votre clé. |
| Limite de débit | 600 messages MCP par minute et par clé (HTTP 429 avec Retry-After). Chaque appel d'outil compte aussi dans les limites de l'endpoint REST qu'il appelle. |
| Appels longs | Un appel peut durer jusqu'à 30 minutes (raisonnement long). La génération vidéo est asynchrone : create_video renvoie une tâche et get_video en interroge le statut. |
Dépannage
| Symptôme | Cause et solution |
|---|---|
| 401, ou le client indique qu'une authentification est nécessaire | La clé est manquante, invalide, expirée ou désactivée. Envoyez-la sous la forme Authorization: Bearer <key> et vérifiez que la variable d'environnement est définie là où le client s'exécute. |
| Un outil attendu n'apparaît pas dans la liste | Les outils dépendent du type de clé (voir les tableaux ci-dessus) et des fonctionnalités en preview : les outils image et vidéo n'apparaissent que pour les workspaces admis à ces previews. |
| Un résultat d'outil indique HTTP 402 | Le solde du workspace est épuisé. Rechargez-le dans la console ; get_key_info affiche le plafond propre à la clé. |
| Un résultat d'outil indique HTTP 403 pour un modèle | Le modèle est exclu par le allowed_models de la clé ou par l'accès aux modèles de votre workspace. list_models indique exactement ce que la clé peut appeler. |
chat_completion ne renvoie aucun texte, avec finish_reason length | Un modèle de raisonnement a consommé tout le budget max_tokens à réfléchir. Augmentez max_tokens ou baissez reasoning_effort. |
| HTTP 429 | Plus de 600 messages par minute sur une même clé, ou la limite propre de l'endpoint REST. Attendez le délai indiqué par Retry-After. |
Prochainement
- Connexion OAuth, pour que les connecteurs claude.ai, Claude Desktop et ChatGPT puissent se connecter sans coller de clé, avec des identifiants à courte durée de vie et à dépense plafonnée.
- Passerelle MCP : le même endpoint agrégera aussi des serveurs MCP tiers (GitHub, Slack, les vôtres) sous votre clé, avec des permissions par outil, des identifiants conservés côté serveur et un journal d'audit unique.
- Progression des appels longs, diffusée pendant l'exécution d'un outil.
Voir aussi : Clés API · Clés de provisioning · API de facturation · Chat Completions