MCP 服务器
让任何支持 MCP 的 agent —— Claude Code、Cursor、VS Code、Codex、OpenAI Agents SDK 等 —— 只需 一个 URL 加你的 API 密钥 即可接入 Synthorai。所有模型与模态、API 密钥管理和账单数据都成为 agent 可以直接调用的工具;每次调用的鉴权、限流与计费都与对应的 REST 请求完全一致。
| 端点 | https://synthorai.io/v1/mcp |
| 传输 | Streamable HTTP,无状态(无会话),JSON 响应 |
| 鉴权 | Authorization: Bearer <API key> |
连接时用的密钥决定你能拿到哪些工具:推理 API 密钥(sk-syn-…)调用模型,provisioning key(sk-syn-prov-…)管理 API 密钥,账单密钥(sk-syn-bill-…)读取余额与用量。一个 agent 需要多种能力时,按密钥类型各连接一次即可。
快速开始
- 在控制台的 API 密钥 页面创建一个密钥。给 agent 用的密钥建议设置额度上限和模型白名单。
- 用下面任一配置片段把服务器加到你的客户端里,密钥从环境变量读取,不要直接写进文件。
- 然后直接问你的 agent,例如:“列出三个支持工具调用、最便宜的模型,用最快的那个总结这个文件,并告诉我花了多少钱。”
连接你的客户端
所有客户端用的都是同一个端点和同一个请求头。先在环境变量里设置 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 的出口网段)。用 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 登录,本服务器暂未提供(见下方路线图)。在此之前,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 调用完全相同;其余工具全部免费。
推理 API 密钥
| 工具 | 作用 | REST 端点 | 说明 |
|---|---|---|---|
list_models | 这把密钥能调用的模型,按价格从低到高,含上下文长度、模态、能力和刊例价。可按类别、能力、输入模态和关键词筛选。 | GET /v1/models + /api/models | 只读 |
get_model | 单个模型的完整信息,包括折扣后的实际价格,以及这把密钥能否调用它。 | GET /v1/models/{id} | 只读 |
get_pricing | 价格表(美元,已计折扣):按 token、按次、按分钟、按秒及阶梯价格。 | GET /api/pricing | 只读 |
chat_completion | 对任意模型发起一次对话补全:单条提示词或完整的 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 | 单条文本或最多 2048 条批量文本的向量。 | POST /v1/embeddings | 计费 |
get_key_info | 这把密钥的额度上限、已用与剩余金额、重置周期,以及今日/本周/本月消费(美元)。 | GET /v1/key | 只读 |
get_generation | 按 request_id 查询单个请求的账单记录:费用、token 明细、延迟和状态。 | GET /v1/generation | 只读 |
Provisioning key
| 工具 | 作用 | REST 端点 | 说明 |
|---|---|---|---|
create_api_key | 创建推理 API 密钥,可设置额度上限、重置周期、模型与 IP 白名单、过期时间和 metadata。密钥明文只在返回结果中出现一次。 | POST /api/provisioning/keys | 会修改数据 |
list_api_keys | 工作区的推理 API 密钥及其额度、消费和状态;可按 metadata 筛选。 | GET /api/provisioning/keys | 只读 |
get_api_key | 单把密钥的设置、消费和状态。 | GET /api/provisioning/keys/{id} | 只读 |
update_api_key | 修改密钥设置,或停用/重新启用它。只修改传入的字段。 | PATCH /api/provisioning/keys/{id} | 破坏性 |
delete_api_key | 永久删除密钥。 | DELETE /api/provisioning/keys/{id} | 破坏性 |
账单密钥
| 工具 | 作用 | REST 端点 | 说明 |
|---|---|---|---|
get_balance | 当前可用余额(美元),含代金券和计划中的到账额度。 | GET /api/v1/billing/balance | 只读 |
get_usage | 按小时或按天的消费与请求数,可按密钥和/或模型拆分。 | GET /api/v1/billing/usage | 只读 |
list_usage_records | 逐请求记录,含 token、费用和状态,按游标分页。 | 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 对所有密钥类型开放;使用推理 API 密钥时,list_models 只显示这把密钥能调用的模型。
返回结果的形态
每个结果都带一段可读文本,同时在 structuredContent 里给出同样数据的 JSON,对话客户端和程序都能直接使用。图片和音频以图片、音频内容返回,视频以链接返回。运行模型的工具结尾附一行回执 —— 模型、token 数、费用和 request_id —— 之后可用 get_generation 查询。
权限与安全
- 规则与 REST API 完全一致。每次工具调用都由它对应的 REST 端点、用你的密钥执行:鉴权、密钥类型、IP 白名单、模型白名单、额度上限、限流和计费全部照常生效。MCP 不增加任何权限,也不绕过任何检查。
- 按密钥类型最小授权。推理 API 密钥不能管理密钥,也不能读取工作区账单;provisioning key 不能调用模型;账单密钥只读。
- 审批提示。每个工具都带 MCP 注解:只读工具标记
readOnlyHint;会花钱的工具不标为只读;update_api_key、delete_api_key和cancel_video标记destructiveHint。客户端据此决定执行前要不要先征求你的确认。 - 推荐给 agent 的密钥:一把专用的推理 API 密钥,设置按天重置的额度上限、
allowed_models模型白名单;agent 跑在固定主机上时再加 IP 白名单。需要时可单独吊销,不影响生产密钥。 - 密钥明文与不可信内容。
create_api_key只返回一次新密钥 —— 请告诉 agent 把它存到哪里。在让 agent 据此行动之前,请把模型输出和工具结果当作不可信输入(提示词注入)。
协议细节
| 项目 | 说明 |
|---|---|
| 协议版本 | 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",因为列表取决于你的密钥。 |
| 限流 | 每把密钥每分钟 600 条 MCP 消息(超出返回 HTTP 429 并带 Retry-After)。每次工具调用还会计入它所调用的 REST 端点自身的限流。 |
| 长耗时调用 | 单次调用最长可运行 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 | 单把密钥每分钟超过 600 条消息,或触发了 REST 端点自身的限流。请按 Retry-After 等待后重试。 |
即将推出
- OAuth 登录:claude.ai、Claude Desktop 和 ChatGPT 的连接器无需粘贴密钥即可接入,使用短期、带额度上限的凭证。
- MCP 网关:同一个端点还能聚合第三方 MCP 服务器(GitHub、Slack 以及你自己的服务器),统一使用你的密钥,支持按工具授权、凭证保存在服务端、一份审计日志。
- 长耗时调用的进度:工具运行期间实时推送进度。
相关文档:API 密钥 · Provisioning Keys · 账单 API · Chat Completions