MCP サーバー
Claude Code、Cursor、VS Code、Codex、OpenAI Agents SDK など、MCP に対応したあらゆるエージェントを Synthorai に接続できます。必要なのは 1 つの URL と API キーだけです。 すべてのモデルとモダリティ、API キー管理、課金データが、エージェントから呼び出せるツールになります。各呼び出しは、対応する REST リクエストとまったく同じように認証・制限・課金されます。
| エンドポイント | https://synthorai.io/v1/mcp |
| トランスポート | Streamable HTTP、ステートレス(セッションなし)、JSON レスポンス |
| 認証 | Authorization: Bearer <API key> |
接続に使うキーによって、利用できるツールが決まります。推論キー(sk-syn-…)はモデルを呼び出し、provisioning key(sk-syn-prov-…)は API キーを管理し、課金キー(sk-syn-bill-…)は残高と使用量を読み取ります。エージェントが複数の種類のキーを必要とする場合は、キーの種類ごとにサーバーを 1 つずつ接続してください。
クイックスタート
- コンソールの API キー ページで API キーを作成します。エージェント用には、利用上限とモデル許可リストを設定してください。
- 以下のスニペットのいずれかを使ってクライアントにサーバーを追加します。キーはファイルに貼り付けず、環境変数から読み込んでください。
- エージェントに、たとえば次のように頼んでみてください:「ツールに対応したモデルのうち最も安い 3 つを挙げて、その中で最も速いモデルにこのファイルを要約させ、かかった費用を教えて。」
クライアントを接続する
すべてのクライアントで同じエンドポイントとヘッダーを使います。先に環境変数 SYNTHORAI_API_KEY を設定してください。
Claude Code
Claude Code 内で /mcp を実行すると接続を確認できます。--scope user を付けるとすべてのプロジェクトでサーバーを使えるようになり、.mcp.json 形式をコミットすればチームで共有できます(キーは各開発者の環境に置いたままです)。
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
これを ~/.cursor/mcp.json(全プロジェクト)または .cursor/mcp.json(単一プロジェクト)に記述します。
{
"mcpServers": {
"synthorai": {
"url": "https://synthorai.io/v1/mcp",
"headers": { "Authorization": "Bearer ${env:SYNTHORAI_API_KEY}" }
}
}
} VS Code (GitHub Copilot)
これを .vscode/mcp.json に記述します。VS Code はキーを一度だけ尋ね、安全に保存します。
{
"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
これを ~/.codex/config.toml に記述するか、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
OpenAI のサーバーがユーザーに代わってエンドポイントを呼び出すため、キーの IP 許可リストは空のままにしてください(または OpenAI の送信元 IP 範囲を許可してください)。allowed_tools を使って、モデルに必要なツールだけを公開します。
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
MCP クライアント SDK 上に構築されたフレームワーク(LangChain、LlamaIndex、Pydantic AI、Vercel AI SDK、Mastra など)でも同じように動作します。Streamable HTTP トランスポートの接続先をこのエンドポイントに向け、ヘッダーを付けてください。
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 と claude.ai のカスタムコネクタは OAuth でサインインしますが、このサーバーはまだ OAuth に対応していません(下記の今後の予定を参照)。それまでは、Claude Desktop から mcp-remote ブリッジ経由で接続できます。ヘッダーはブリッジが付与します:
{
"mcpServers": {
"synthorai": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://synthorai.io/v1/mcp", "--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer sk-syn-..." }
}
}
} curl
サーバーは HTTP 上のプレーンな JSON-RPC なので、SDK は不要です。ハンドシェイクも不要で、各リクエストは単独で完結します。
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"}}}' レスポンス例
{
"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/list は、そのキーで使えるツールだけを返します。キーの種類と、ワークスペースで有効になっている機能によって絞り込まれます(画像生成と動画生成は限定プレビュー中です)。モデルを実行するツールの料金は REST 呼び出しとまったく同じで、それ以外のツールはすべて無料です。
推論キー
| ツール | 機能 | REST エンドポイント | 備考 |
|---|---|---|---|
list_models | キーで呼び出せるモデルを安い順に、コンテキスト長、モダリティ、機能、定価とともに返します。フィルター:カテゴリ、機能、入力モダリティ、検索。 | GET /v1/models + /api/models | 読み取り専用 |
get_model | 1 つのモデルの詳細。割引適用後の実効価格と、そのキーで呼び出せるかどうかを含みます。 | GET /v1/models/{id} | 読み取り専用 |
get_pricing | 価格表(割引適用後の USD):トークン単位、呼び出し単位、分単位、秒単位、段階制の価格。 | GET /api/pricing | 読み取り専用 |
chat_completion | 任意のモデルで 1 回のチャット補完を実行します。プロンプトまたは完全な messages 配列(画像、ツール結果)を渡せ、構造化出力、関数ツール、リーズニング強度、フォールバックモデルも指定できます。テキスト、ツール呼び出し、使用量、コスト、request_id を返します。 | POST /v1/chat/completions | 課金対象 |
generate_image | 画像を生成・編集します。画像コンテンツとして返されるほか、response_format=url を指定するとリンクとして返されます。 | POST /v1/images/generations | 課金対象 |
list_image_models | 画像モデルの一覧(価格と対応する入力付き)。 | GET /v1/images/models | 読み取り専用 |
create_video | プロンプトまたは最初のフレームから動画ジョブを開始します。完了まで最大 60 秒待機できます。ジョブの完了時に課金されます。 | POST /v1/videos | 課金対象 |
get_video | ジョブのステータス。完了していれば動画へのリンク(有効期間は約 24 時間)を返します。 | GET /v1/videos/{id} | 読み取り専用 |
cancel_video | キュー待ちのジョブをキャンセルします(開始済みのジョブは停止できません)。キャンセルされたジョブと失敗したジョブは課金されません。 | DELETE /v1/videos/{id} | 破壊的 |
list_video_models | 動画モデルの一覧(解像度、長さ、価格付き)。 | GET /v1/videos/models | 読み取り専用 |
text_to_speech | テキストから音声を生成し、音声コンテンツとして返します。 | POST /v1/audio/speech | 課金対象 |
transcribe_audio | URL または base64 データで渡した音声(最大 25 MB)をテキストに変換します。 | POST /v1/audio/transcriptions | 課金対象 |
create_embeddings | 1 つのテキスト、または最大 2048 件のバッチに対する埋め込みベクトル。 | POST /v1/embeddings | 課金対象 |
get_key_info | キーの利用上限、使用済み額と残額、リセット周期、および本日/今週/今月の支出(USD)。 | GET /v1/key | 読み取り専用 |
get_generation | request_id で指定した 1 リクエストの課金記録:コスト、トークン内訳、レイテンシ、ステータス。 | GET /v1/generation | 読み取り専用 |
Provisioning key
| ツール | 機能 | REST エンドポイント | 備考 |
|---|---|---|---|
create_api_key | 利用上限、リセット周期、モデル許可リストと IP 許可リスト、有効期限、metadata を指定して推論キーを作成します。シークレットは結果にしか含まれません。 | POST /api/provisioning/keys | データを変更 |
list_api_keys | ワークスペースの推論キーを、上限、支出、ステータスとともに一覧表示します。metadata で絞り込めます。 | GET /api/provisioning/keys | 読み取り専用 |
get_api_key | 1 つのキーの設定、支出、ステータス。 | GET /api/provisioning/keys/{id} | 読み取り専用 |
update_api_key | キーの設定を変更するか、無効化/再有効化します。指定したフィールドだけが変更されます。 | PATCH /api/provisioning/keys/{id} | 破壊的 |
delete_api_key | キーを完全に削除します。 | DELETE /api/provisioning/keys/{id} | 破壊的 |
課金キー
| ツール | 機能 | REST エンドポイント | 備考 |
|---|---|---|---|
get_balance | 現在使える残高(USD)と、クーポンのクレジットおよび分割入金予定のクレジット。 | GET /api/v1/billing/balance | 読み取り専用 |
get_usage | 時間単位または日単位の支出とリクエスト数(キー別、モデル別、またはその両方)。 | GET /api/v1/billing/usage | 読み取り専用 |
list_usage_records | リクエスト単位の記録(トークン、コスト、ステータス付き)。cursor でページングします。 | GET /api/v1/billing/records | 読み取り専用 |
get_billing_summary | 期間内の合計と、上位のキーおよびモデル。 | GET /api/v1/billing/summary | 読み取り専用 |
get_data_freshness | 課金データがどこまで最新か。 | GET /api/v1/billing/freshness | 読み取り専用 |
list_models、get_model、get_pricing はすべての種類のキーで利用できます。推論キーの場合、list_models にはそのキーで呼び出せるモデルだけが表示されます。
結果の形式
すべての結果には、読みやすいテキストブロックと、同じデータを JSON で表した structuredContent が含まれるため、チャットクライアントとプログラムのどちらでも扱えます。画像と音声は画像・音声コンテンツとして、動画はリンクとして返されます。モデルを実行するツールの結果は、モデル、トークン数、コスト、request_id を記した明細行で終わり、後から get_generation で照会できます。
権限と安全性
- REST API と同じルール。各ツール呼び出しは、記載された REST エンドポイントがあなたのキーで実行します。認証、キーの種類、IP 許可リスト、モデル許可リスト、利用上限、レート制限、課金はすべてそのまま適用されます。MCP が権限を追加することも、チェックを省略することもありません。
- キーの種類による最小権限。推論キーはキーの管理やワークスペースの課金データの読み取りができず、provisioning key はモデルを呼び出せず、課金キーは読み取り専用です。
- 承認のヒント。すべてのツールに MCP アノテーションが付いています。読み取り専用のツールには
readOnlyHintが付き、費用が発生するツールは読み取り専用扱いになりません。update_api_key、delete_api_key、cancel_videoにはdestructiveHintが付いています。クライアントはこれらをもとに、実行前にユーザーへ確認する内容を判断します。 - エージェント用の推奨キー:毎日リセットされる利用上限と
allowed_modelsリストを設定し、エージェントが既知のホストで動く場合は IP 許可リストも設定した専用の推論キー。本番用のキーに触れずに、そのキーだけを失効できます。 - シークレットと信頼できないコンテンツ。
create_api_keyは新しいキーを一度だけ返すため、保存先をエージェントに指示してください。エージェントに操作させる前に、モデルの出力とツールの結果は信頼できない入力(プロンプトインジェクション)として扱ってください。
プロトコルの詳細
| 項目 | 詳細 |
|---|---|
| プロトコルバージョン | 2026-07-28(ステートレス、リクエストごとの _meta と Mcp-Method / Mcp-Name ヘッダー、server/discover)と、2025-11-25、2025-06-18、2025-03-26、2024-11-05(initialize ハンドシェイク)。どちらも同じ URL で提供され、各リクエストはそのリクエストが使う世代の仕様で処理されます。 |
| セッション | なし。Mcp-Session-Id は発行されないため、どのリクエストもどのサーバーレプリカで処理でき、再接続後に再初期化する必要もありません。 |
| メソッド | initialize、ping、tools/list、tools/call。2026-07-28 では、ハンドシェイクの代わりに server/discover を使います。GET と DELETE は 405 を返し、JSON-RPC のバッチは受け付けません。 |
| エラー | 未知のツールは JSON-RPC エラー(-32602)になります。それ以外 — 不正な引数、API による拒否、生成の失敗 — はすべて isError: true 付きのツール結果として返され、モデルが対処できるメッセージが含まれます。2026-07-28 では、エンベロープの問題は HTTP 400 と -32020(ヘッダーの不一致)または -32022(未対応のバージョン。対応バージョンを列挙します)を返します。 |
| キャッシュ | tools/list は固定の順序で返され(プロンプトキャッシュに適しています)、一覧はキーによって異なるため、ttlMs は 10 分、cacheScope: "private" が付きます。 |
| レート制限 | キーごとに 1 分あたり 600 件の MCP メッセージ(超過時は Retry-After 付きの HTTP 429)。各ツール呼び出しは、呼び出し先の REST エンドポイントの制限にもカウントされます。 |
| 長時間の呼び出し | 1 回の呼び出しは最大 30 分実行できます(長い推論向け)。動画生成は非同期です:create_video がジョブを返し、get_video でそれをポーリングします。 |
トラブルシューティング
| 症状 | 原因と対処 |
|---|---|
| 401、またはクライアントが認証が必要だと表示する | キーが欠落、不正、期限切れ、または無効化されています。Authorization: Bearer <key> として送信し、クライアントが動作する環境で環境変数が設定されているか確認してください。 |
| 期待したツールが一覧にない | ツールはキーの種類(上の表を参照)とプレビュー機能によって決まります。画像ツールと動画ツールは、それぞれのプレビューに参加しているワークスペースにのみ表示されます。 |
| ツール結果に HTTP 402 と表示される | ワークスペースの残高を使い切っています。コンソールでチャージしてください。キー自身の上限は get_key_info で確認できます。 |
| あるモデルについてツール結果に HTTP 403 と表示される | キーの allowed_models、またはワークスペースのモデルアクセス設定でそのモデルが除外されています。キーで呼び出せるモデルは list_models で正確に確認できます。 |
chat_completion がテキストを返さず、finish_reason が length になる | 推論モデルが max_tokens の予算をすべて思考に使い切りました。max_tokens を増やすか、reasoning_effort を下げてください。 |
| HTTP 429 | 1 つのキーで 1 分あたり 600 メッセージを超えたか、REST エンドポイント自体の制限に達しています。Retry-After の時間が経過するまで待ってください。 |
今後の予定
- OAuth サインイン:claude.ai、Claude Desktop、ChatGPT のコネクタが、キーを貼り付けずに、短期間有効で利用上限付きの認証情報で接続できるようになります。
- MCP ゲートウェイ:同じエンドポイントでサードパーティの MCP サーバー(GitHub、Slack、独自のサーバー)もあなたのキーの下に集約し、ツールごとの権限、サーバー側での認証情報の保管、単一の監査ログを提供します。
- 長時間の呼び出しの進捗を、ツールの実行中にストリーミングで通知します。
関連:API キー · Provisioning Keys · 課金 API · Chat Completions