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.

Endpointhttps://synthorai.io/v1/mcp
TransportStreamable HTTP, sans état (pas de sessions), réponses JSON
AuthentificationAuthorization: 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é d’administration (sk-syn-admin-…) obtient les outils que ses portées autorisent, la gestion des clés avec keys.read ou keys.write, le solde et l’usage avec billing.read. Une clé d’administration dotée de plusieurs portées les obtient tous sur une seule connexion. Les clés de provisioning et de facturation émises auparavant (sk-syn-prov-…, sk-syn-bill-…) continuent de fonctionner.

Les autres portées d’une clé d’administration ajoutent des outils pour le journal des requêtes, la bibliothèque de prompts et les paramètres de l’espace de travail. Les tableaux ci-dessous indiquent la portée requise par chaque outil.

Démarrage rapide

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

Les clients qui se connectent par identification (claude.ai, Claude Desktop, ChatGPT) n'ont pas besoin de clé. Ajoutez l'endpoint ci-dessus comme connecteur, puis connectez-vous à Synthorai : vous choisissez l'espace de travail et ce que la connexion peut faire. Elle reçoit sa propre clé, avec une date d'expiration, visible dans Clés API, où vous pouvez la supprimer.

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

Claude Desktop se connecte par identification : ajoutez l'endpoint comme connecteur personnalisé, sans clé. Pour utiliser votre propre clé, passez par 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

OutilRôleEndpoint RESTRemarques
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

OutilRôleEndpoint RESTRemarques
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/v1/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/v1/keys lecture seule
get_api_key Paramètres, dépense et statut d'une clé. GET /api/v1/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/v1/keys/{id} destructif
delete_api_key Supprime définitivement une clé. DELETE /api/v1/keys/{id} destructif

Clé de facturation

OutilRôleEndpoint RESTRemarques
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

Clé d’administration : journal des requêtes et usage

OutilRôleEndpoint RESTRemarques
search_requests Les requêtes sur une période : modèle, statut, tokens, coût, durées, clé et libellés. Jamais le prompt ni la réponse. Nécessite logs.read. GET /api/v1/requests lecture seule
get_request Une requête par son identifiant. Nécessite logs.read. GET /api/v1/requests/{id} lecture seule
list_traces Les requêtes regroupées par identifiant de trace, avec leur nombre, leur coût et leur durée. Nécessite logs.read. GET /api/v1/traces lecture seule
list_sessions Les requêtes regroupées par identifiant de session. Nécessite logs.read. GET /api/v1/sessions lecture seule
get_label_usage Requêtes, tokens et coût additionnés par libellé. Nécessite usage.read. GET /api/v1/usage/labels lecture seule

Clé d’administration : bibliothèque de prompts

OutilRôleEndpoint RESTRemarques
list_prompts Tous les prompts, avec leurs étiquettes et leur dernière version. Nécessite prompts.read. GET /api/v1/prompts lecture seule
get_prompt Les étiquettes, le déploiement et les versions d’un prompt. Nécessite prompts.read. GET /api/v1/prompts/{id} lecture seule
get_prompt_version Le texte, les réglages du modèle et les variables d’une version. Nécessite prompts.read. GET /api/v1/prompts/{id}/versions/{version} lecture seule
save_prompt_version Enregistre la version suivante. Rien ne change pour les appelants tant qu’aucune étiquette n’est déplacée. Nécessite prompts.write. POST /api/v1/prompts/{id}/versions modifie des données
move_prompt_label Fait pointer une étiquette vers une version. Déplacer production change ce que reçoivent les appelants. Nécessite prompts.write. PUT /api/v1/prompts/{id}/labels/{label} destructif
list_prompt_test_sets Les jeux de tests d’un prompt, sans leurs lignes. Nécessite evals.read. GET /api/v1/prompts/{id}/test-sets lecture seule
get_prompt_test_set Un jeu de tests avec ses lignes et ses vérifications. Nécessite evals.read. GET /api/v1/prompts/{id}/test-sets/{set} lecture seule
list_prompt_eval_runs Les dernières exécutions d’un prompt : les versions comparées, le jeu de tests et le nombre de lignes réussies. Nécessite evals.read. GET /api/v1/prompts/{id}/eval-runs lecture seule
get_prompt_eval_run Une exécution, avec les réponses des deux versions et le verdict de chaque vérification. Nécessite evals.read. GET /api/v1/prompts/{id}/eval-runs/{run} lecture seule

Clé d’administration : espace de travail

OutilRôleEndpoint RESTRemarques
list_audit_logs Ce qui a été modifié dans l’espace de travail et par qui. Nécessite audit.read. GET /api/v1/audit-logs lecture seule
list_members Les membres et leurs rôles. Nécessite members.read. GET /api/v1/members lecture seule
get_byok_settings Quels fournisseurs utilisent vos propres clés et comment chacun est configuré. Jamais les clés. Nécessite byok.read. GET /api/v1/byok lecture seule
list_export_destinations Où les données des requêtes sont exportées. Jamais les clés d’accès ni les en-têtes. Nécessite exports.read. GET /api/v1/export-destinations 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.

Contrôler ce qu’une connexion peut faire

  • Pour l’espace de travail. Dans Paramètres > MCP, un admin active ou désactive MCP, choisit les groupes d’outils que les connexions peuvent utiliser et décide si les outils qui modifient quelque chose sont autorisés. Sur une instance dédiée, MCP reste désactivé tant qu’un admin ne l’a pas activé.
  • Pour une connexion. Envoyez X-MCP-Readonly: true pour retirer tous les outils qui modifient quelque chose ou engagent une dépense, et X-MCP-Toolsets: logs,prompts pour ne garder que ces groupes (usage, logs, prompts, keys, workspace, inference). Les clients qui ne peuvent pas définir d’en-têtes ajoutent ?readonly=true&toolsets=logs,prompts à l’URL.
  • Ces réglages ne font que retirer des outils. Un outil apparaît dans la liste lorsque les portées de la clé, les paramètres de l’espace de travail et les limites propres à la connexion l’autorisent tous.
  • Chaque modification est consignée. Une modification faite via MCP figure dans le journal d’audit, avec la clé et le nom du client.

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 par clé. Une clé d’inférence ne peut ni gérer les clés ni lire la facturation de l’espace de travail ; une clé d’administration ne peut pas appeler de modèles et se limite à ce que ses portées autorisent.
  • 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_key et cancel_video sont marqués destructiveHint. 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_models et 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_key renvoie 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émentDétail
Versions du protocole2026-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.
SessionsAucune. 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éthodesinitialize, 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.
ErreursUn 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 cachetools/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ébit600 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 longsUn 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ômeCause et solution
401, ou le client indique qu'une authentification est nécessaireLa 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 listeLes 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 402Le 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èleLe 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 lengthUn modèle de raisonnement a consommé tout le budget max_tokens à réfléchir. Augmentez max_tokens ou baissez reasoning_effort.
HTTP 429Plus 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

  • 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