MCP-Server
Verbinden Sie jeden MCP-fähigen Agenten (Claude Code, Cursor, VS Code, Codex, das OpenAI Agents SDK und mehr) mit Synthorai, und zwar mit nur einer URL und Ihrem API-Schlüssel. Alle Modelle und Modalitäten, die Verwaltung von API-Schlüsseln und die Abrechnungsdaten werden zu Tools, die der Agent aufrufen kann. Jeder Aufruf wird genau wie die entsprechende REST-Anfrage authentifiziert, begrenzt und abgerechnet.
| Endpunkt | https://synthorai.io/v1/mcp |
| Transport | Streamable HTTP, zustandslos (keine Sessions), JSON-Antworten |
| Authentifizierung | Authorization: Bearer <API key> |
Der Schlüssel, mit dem Sie sich verbinden, bestimmt, welche Tools Sie erhalten: Ein Inferenzschlüssel (sk-syn-…) ruft Modelle auf, ein Provisioning-Schlüssel (sk-syn-prov-…) verwaltet API-Schlüssel, und ein Billing-Schlüssel (sk-syn-bill-…) liest Guthaben und Nutzung. Braucht ein Agent mehr als eine Schlüsselart, verbinden Sie den Server einmal pro Schlüsselart.
Schnellstart
- Erstellen Sie in der Konsole auf der Seite API-Schlüssel einen API-Schlüssel. Geben Sie ihm für einen Agenten ein Ausgabenlimit und eine Modell-Allowlist.
- Fügen Sie den Server mit einem der folgenden Snippets zu Ihrem Client hinzu und lesen Sie den Schlüssel dabei aus einer Umgebungsvariablen, statt ihn in eine Datei einzufügen.
- Fragen Sie Ihren Agenten zum Beispiel: „Liste die drei günstigsten Modelle auf, die Tools unterstützen, lass dann das schnellste diese Datei zusammenfassen und sag mir, was es gekostet hat.“
Client verbinden
Alle Clients verwenden denselben Endpunkt und denselben Header. Setzen Sie zuerst SYNTHORAI_API_KEY in Ihrer Umgebung.
Claude Code
Führen Sie in Claude Code /mcp aus, um die Verbindung zu prüfen. Mit --scope user steht der Server in jedem Projekt zur Verfügung; alternativ committen Sie die .mcp.json-Variante, um ihn mit Ihrem Team zu teilen (der Schlüssel bleibt in der Umgebung jedes Entwicklers).
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
Legen Sie dies in ~/.cursor/mcp.json (alle Projekte) oder .cursor/mcp.json (ein Projekt) ab.
{
"mcpServers": {
"synthorai": {
"url": "https://synthorai.io/v1/mcp",
"headers": { "Authorization": "Bearer ${env:SYNTHORAI_API_KEY}" }
}
}
} VS Code (GitHub Copilot)
Legen Sie dies in .vscode/mcp.json ab. VS Code fragt den Schlüssel einmal ab und speichert ihn sicher.
{
"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
Legen Sie dies in ~/.codex/config.toml ab, oder führen Sie codex mcp add synthorai --url https://synthorai.io/v1/mcp --bearer-token-env-var SYNTHORAI_API_KEY aus.
[mcp_servers.synthorai]
url = "https://synthorai.io/v1/mcp"
bearer_token_env_var = "SYNTHORAI_API_KEY" OpenAI Responses API
Die Server von OpenAI rufen den Endpunkt in Ihrem Namen auf. Lassen Sie die IP-Allowlist des Schlüssels daher leer (oder lassen Sie die Egress-Bereiche von OpenAI zu). Mit allowed_tools geben Sie nur die Tools frei, die das Modell braucht.
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
Funktioniert genauso mit jedem Framework, das auf den MCP-Client-SDKs aufbaut (LangChain, LlamaIndex, Pydantic AI, Vercel AI SDK, Mastra …): Richten Sie seinen Transport für Streamable HTTP mit dem Header auf den Endpunkt aus.
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
Benutzerdefinierte Connectors in Claude Desktop und claude.ai melden sich per OAuth an, was dieser Server noch nicht anbietet (siehe Roadmap unten). Bis dahin kann sich Claude Desktop über die Bridge mcp-remote verbinden, die den Header für Sie ergänzt:
{
"mcpServers": {
"synthorai": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://synthorai.io/v1/mcp", "--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer sk-syn-..." }
}
}
} curl
Der Server spricht einfaches JSON-RPC über HTTP, ein SDK ist also nicht nötig. Ein Handshake ist nicht erforderlich: Jede Anfrage steht für sich.
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"}}}' Beispielantwort
{
"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-…"
}
}
} Tools
tools/list liefert nur die Tools, die Ihr Schlüssel nutzen kann: Die Liste wird nach Schlüsselart und nach den für Ihren Workspace freigeschalteten Funktionen gefiltert (Bild- und Videogenerierung befinden sich in einer eingeschränkten Vorschau). Tools, die ein Modell ausführen, kosten genau so viel wie der REST-Aufruf; alle anderen Tools sind kostenlos.
Inferenzschlüssel
| Tool | Funktion | REST-Endpunkt | Hinweise |
|---|---|---|---|
list_models | Modelle, die der Schlüssel aufrufen kann, günstigste zuerst, mit Kontextlänge, Modalitäten, Fähigkeiten und Listenpreisen. Filter: Kategorie, Fähigkeit, Eingabemodalität, Suche. | GET /v1/models + /api/models | nur lesend |
get_model | Alle Details zu einem Modell, einschließlich des effektiven Preises nach etwaigen Rabatten und ob der Schlüssel es aufrufen kann. | GET /v1/models/{id} | nur lesend |
get_pricing | Die Preisliste (USD nach Rabatten): Preise pro Token, pro Aufruf, pro Minute, pro Sekunde und gestaffelte Preise. | GET /api/pricing | nur lesend |
chat_completion | Eine Chat Completion auf einem beliebigen Modell: ein Prompt oder ein vollständiges messages-Array (Bilder, Tool-Ergebnisse), optional mit strukturierter Ausgabe, Function-Tools, Reasoning Effort und Fallback-Modellen. Liefert Text, Tool-Aufrufe, Nutzung, Kosten und request_id. | POST /v1/chat/completions | kostenpflichtig |
generate_image | Bilder generieren oder bearbeiten; Rückgabe als Bildinhalt oder mit response_format=url als Links. | POST /v1/images/generations | kostenpflichtig |
list_image_models | Bildmodelle mit Preisen und unterstützten Eingaben. | GET /v1/images/models | nur lesend |
create_video | Startet einen Videojob aus einem Prompt oder einem ersten Frame; kann bis zu 60 s auf den Abschluss warten. Abgerechnet wird, wenn der Job abgeschlossen ist. | POST /v1/videos | kostenpflichtig |
get_video | Jobstatus; nach Abschluss Links zu den Videos (etwa 24 Stunden gültig). | GET /v1/videos/{id} | nur lesend |
cancel_video | Bricht einen Job ab, der noch in der Warteschlange steht (ein bereits gestarteter Job lässt sich nicht stoppen). Abgebrochene und fehlgeschlagene Jobs werden nicht abgerechnet. | DELETE /v1/videos/{id} | destruktiv |
list_video_models | Videomodelle mit Auflösungen, Dauern und Preisen. | GET /v1/videos/models | nur lesend |
text_to_speech | Sprache aus Text, zurückgegeben als Audioinhalt. | POST /v1/audio/speech | kostenpflichtig |
transcribe_audio | Text aus Audio, übergeben als URL oder Base64-Daten (bis 25 MB). | POST /v1/audio/transcriptions | kostenpflichtig |
create_embeddings | Embedding-Vektoren für einen Text oder einen Batch von bis zu 2048. | POST /v1/embeddings | kostenpflichtig |
get_key_info | Ausgabenlimit des Schlüssels, verbrauchter und verbleibender Betrag, Reset-Zeitraum sowie Ausgaben heute / diese Woche / diesen Monat (USD). | GET /v1/key | nur lesend |
get_generation | Der Abrechnungsdatensatz einer Anfrage per request_id: Kosten, Token-Aufschlüsselung, Latenz, Status. | GET /v1/generation | nur lesend |
Provisioning-Schlüssel
| Tool | Funktion | REST-Endpunkt | Hinweise |
|---|---|---|---|
create_api_key | Erstellt einen Inferenzschlüssel mit Ausgabenlimit, Reset-Zeitraum, Modell- und IP-Allowlists, Ablaufdatum und Metadaten. Der geheime Schlüssel steht nur im Ergebnis. | POST /api/provisioning/keys | ändert Daten |
list_api_keys | Die Inferenzschlüssel des Workspace mit Limits, Ausgaben und Status; filterbar nach Metadaten. | GET /api/provisioning/keys | nur lesend |
get_api_key | Einstellungen, Ausgaben und Status eines Schlüssels. | GET /api/provisioning/keys/{id} | nur lesend |
update_api_key | Ändert die Einstellungen eines Schlüssels oder deaktiviert / reaktiviert ihn. Nur die angegebenen Felder ändern sich. | PATCH /api/provisioning/keys/{id} | destruktiv |
delete_api_key | Löscht einen Schlüssel dauerhaft. | DELETE /api/provisioning/keys/{id} | destruktiv |
Billing-Schlüssel
| Tool | Funktion | REST-Endpunkt | Hinweise |
|---|---|---|---|
get_balance | Aktuell verfügbares Guthaben (USD), mit Aktionsguthaben und geplanten Gutschriften. | GET /api/v1/billing/balance | nur lesend |
get_usage | Ausgaben und Anfragen pro Stunde oder Tag, nach Schlüssel und/oder Modell. | GET /api/v1/billing/usage | nur lesend |
list_usage_records | Datensätze pro Anfrage mit Tokens, Kosten und Status, paginiert per Cursor. | GET /api/v1/billing/records | nur lesend |
get_billing_summary | Summen über einen Zeitraum mit den Top-Schlüsseln und -Modellen. | GET /api/v1/billing/summary | nur lesend |
get_data_freshness | Wie aktuell die Abrechnungsdaten sind. | GET /api/v1/billing/freshness | nur lesend |
list_models, get_model und get_pricing stehen jeder Schlüsselart zur Verfügung; bei einem Inferenzschlüssel zeigt list_models nur die Modelle, die dieser Schlüssel aufrufen kann.
So sehen Ergebnisse aus
Jedes Ergebnis enthält einen lesbaren Textblock und dieselben Daten als JSON in structuredContent, sodass Chat-Clients wie Programme damit arbeiten können. Bilder und Audio kommen als Bild- und Audioinhalt zurück, Videos als Links. Tools, die ein Modell ausführen, enden mit einer Belegzeile (Modell, Tokens, Kosten und request_id) , die get_generation später nachschlagen kann.
Berechtigungen und Sicherheit
- Dieselben Regeln wie bei der REST-API. Jeder Tool-Aufruf wird von dem jeweils genannten REST-Endpunkt mit Ihrem Schlüssel ausgeführt: Authentifizierung, Schlüsselart, IP-Allowlist, Modell-Allowlist, Ausgabenlimit, Rate-Limits und Abrechnung gelten unverändert. MCP fügt keine Berechtigung hinzu und überspringt keine Prüfung.
- Minimale Rechte je Schlüsselart. Inferenzschlüssel können keine Schlüssel verwalten und keine Workspace-Abrechnung lesen; Provisioning-Schlüssel können keine Modelle aufrufen; Billing-Schlüssel sind nur lesend.
- Hinweise zur Freigabe. Jedes Tool trägt MCP-Annotationen. Nur lesende Tools sind mit
readOnlyHintmarkiert; Tools, die Geld ausgeben, gelten nicht als nur lesend;update_api_key,delete_api_keyundcancel_videosind mitdestructiveHintmarkiert. Clients entscheiden anhand dieser Angaben, wann sie vor der Ausführung bei Ihnen nachfragen. - Empfohlener Schlüssel für Agenten: ein eigener Inferenzschlüssel mit täglich zurückgesetztem Ausgabenlimit, einer
allowed_models-Liste und einer IP-Allowlist, wenn der Agent auf bekannten Hosts läuft. Sie können ihn einzeln widerrufen, ohne Produktionsschlüssel anzutasten. - Secrets und nicht vertrauenswürdige Inhalte.
create_api_keygibt den neuen Schlüssel nur einmal zurück: sagen Sie Ihrem Agenten, wo er ihn speichern soll. Behandeln Sie Modellausgaben und Tool-Ergebnisse als nicht vertrauenswürdige Eingaben (Prompt Injection), bevor ein Agent darauf reagiert.
Protokolldetails
| Punkt | Detail |
|---|---|
| Protokollversionen | 2026-07-28 (zustandslos, _meta pro Anfrage sowie Header Mcp-Method / Mcp-Name, server/discover) und 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05 (initialize-Handshake). Beide unter derselben URL; jede Anfrage wird in der Protokollgeneration beantwortet, die sie spricht. |
| Sessions | Keine. Es wird keine Mcp-Session-Id vergeben, sodass jede Anfrage jede Server-Replica erreichen kann und nach einem erneuten Verbindungsaufbau nichts neu initialisiert werden muss. |
| Methoden | initialize, ping, tools/list, tools/call; mit 2026-07-28 server/discover statt des Handshakes. GET und DELETE liefern 405; JSON-RPC-Batches werden nicht akzeptiert. |
| Fehler | Ein unbekanntes Tool ist ein JSON-RPC-Fehler (-32602). Alles andere (ungültige Argumente, eine Ablehnung durch die API, eine fehlgeschlagene Generierung) ist ein Tool-Ergebnis mit isError: true und einer Meldung, auf die das Modell reagieren kann. Mit 2026-07-28 liefern Probleme im Envelope HTTP 400 mit -32020 (Header stimmen nicht überein) oder -32022 (nicht unterstützte Version, mit Liste der unterstützten). |
| Caching | tools/list wird in fester Reihenfolge (Prompt-Cache-freundlich) mit ttlMs von 10 Minuten und cacheScope: "private" zurückgegeben, da die Liste von Ihrem Schlüssel abhängt. |
| Rate-Limit | 600 MCP-Nachrichten pro Minute und Schlüssel (HTTP 429 mit Retry-After). Jeder Tool-Aufruf zählt zusätzlich gegen die Limits des REST-Endpunkts, den er aufruft. |
| Lange Aufrufe | Ein Aufruf kann bis zu 30 Minuten laufen (langes Reasoning). Videogenerierung ist asynchron: create_video liefert einen Job, den get_video abfragt. |
Fehlerbehebung
| Symptom | Ursache und Lösung |
|---|---|
| 401, oder der Client meldet, dass eine Authentifizierung nötig ist | Der Schlüssel fehlt, ist ungültig, abgelaufen oder deaktiviert. Senden Sie ihn als Authorization: Bearer <key> und prüfen Sie, ob die Umgebungsvariable dort gesetzt ist, wo der Client läuft. |
| Ein erwartetes Tool wird nicht aufgeführt | Die Tools hängen von der Schlüsselart (siehe Tabellen oben) und von Vorschaufunktionen ab: Bild- und Video-Tools erscheinen nur für Workspaces, die für diese Vorschauen freigeschaltet sind. |
| Ein Tool-Ergebnis meldet HTTP 402 | Das Guthaben des Workspace ist aufgebraucht. Laden Sie es in der Konsole auf; get_key_info zeigt das eigene Limit des Schlüssels. |
| Ein Tool-Ergebnis meldet HTTP 403 für ein Modell | Die allowed_models des Schlüssels oder der Modellzugriff Ihres Workspace schließen es aus. list_models zeigt genau, was der Schlüssel aufrufen kann. |
chat_completion liefert keinen Text, finish_reason ist length | Ein Reasoning-Modell hat das gesamte max_tokens-Budget mit Nachdenken verbraucht. Erhöhen Sie max_tokens oder senken Sie reasoning_effort. |
| HTTP 429 | Mehr als 600 Nachrichten pro Minute auf einem Schlüssel oder das eigene Limit des REST-Endpunkts. Warten Sie die in Retry-After angegebene Zeit ab. |
Demnächst
- OAuth-Anmeldung, damit sich Connectors von claude.ai, Claude Desktop und ChatGPT ohne eingefügten Schlüssel verbinden können: mit kurzlebigen Anmeldedaten und Ausgabenobergrenze.
- MCP-Gateway: Derselbe Endpunkt bündelt zusätzlich MCP-Server von Drittanbietern (GitHub, Slack, Ihre eigenen) unter Ihrem Schlüssel, mit Berechtigungen pro Tool, serverseitig verwahrten Anmeldedaten und einem gemeinsamen Audit-Log.
- Fortschritt bei langen Aufrufen, gestreamt, während ein Tool läuft.
Siehe auch: API-Schlüssel · Provisioning-Schlüssel · Billing-API · Chat Completions