控制台

MCP

BasicRouter MCP 使用说明

把 BasicRouter(OpenAI 兼容的 LLM 网关)包装成一个 MCP server,让 你的AI工具 可以直接调用 BasicRouter 的对话、模型、计费、图像、视频等接口。

功能特性

  • 🤖 多接口对话:同时支持 OpenAI Chat Completions、Anthropic Messages、OpenAI Responses 三种兼容接口
  • 🖼️ 多模态生成:除文本对话外,支持图像生成、视频生成(文生/图生/首尾帧/参考素材)异步任务
  • 🔍 模型与计费查询:列出可用模型、查看模型详情、账户余额、用量扣费明细、充值交易流水
  • 🔑 按 header 传 key:每次调用从请求 header 读取 API Key,同一部署可被多个不同账号共用,服务器不落盘、不缓存任何 key

快速开始

在 Claude Code 中使用(推荐)。用 -s user 加到 user scope(所有项目可用)。

步骤 1:添加连接

claude mcp add --transport http basicrouter https://api.basicrouter.ai/mcp \
  --header "X-Basicrouter-Api-Key: <你的 BasicRouter API key>" \
  -s user

步骤 2:确认连接

claude mcp list          # 应显示 ✓ Connected
claude mcp get basicrouter  # 看到 Scope: User config (available in all your projects)

步骤 3:开始使用

在 Claude 中可以这样提问:

  • "用 BasicRouter 调一下 claude-sonnet-5,写一首关于秋天的诗"
  • "列一下我 BasicRouter 账户里可用的模型"
  • "查一下我 BasicRouter 的余额和最近用量"
  • "用 BasicRouter 生成一张赛博朋克风格的城市夜景图"

Claude 会自动调用对应的 MCP 工具并返回结果。

在 Claude Desktop 中使用

在 mcpServers 部分添加配置:

{
  "mcpServers": {
    "basicrouter": {
      "type": "http",
      "url": "https://api.basicrouter.ai/mcp",
      "headers": {
        "X-Basicrouter-Api-Key": "<你的 BasicRouter API key>"
      }
    }
  }
}

在 Codex CLI 中使用

推荐写法:用 env_http_headers 从环境变量读 key

先在 shell 里 export 环境变量:

export BASICROUTER_API_KEY=<你的 BasicRouter API key>

然后在 ~/.codex/config.toml 里:

[mcp_servers.basicrouter]
url = "https://api.basicrouter.ai/mcp"
env_http_headers = { "X-Basicrouter-Api-Key" = "BASICROUTER_API_KEY" }

备选写法:用 http_headers 把 key 直接写进配置(不想单独管环境变量时可以把 key 静态写死,注意 key 会明文落在配置文件里):

[mcp_servers.basicrouter]
url = "https://api.basicrouter.ai/mcp"
http_headers = { "X-Basicrouter-Api-Key" = "<你的 BasicRouter API key>" }

如果通过 Codex 设置界面添加:

  • 类型:HTTP / Streamable HTTP
  • 名称:basicrouter
  • URL:https://api.basicrouter.ai/mcp
  • Header 名称:X-Basicrouter-Api-Key
  • Header 值:你的 BasicRouter API key

验证连接

启动 Codex CLI 后,/mcp 命令可以列出已配置的 MCP server 及其连接状态,确认连接已正常加载即可。调用方式与 Claude 一致——Codex 会自动选用对应的工具。

如果配置文件里已有其他 MCP server,按平级追加即可。改完完全退出 Claude Desktop 再重新打开。

工具说明

这个 MCP server 提供了 14 个工具。按用途分五组:

一、对话接口

1. chat_completion — Chat Completions

发送一次对话请求,返回模型完整回复(不支持流式)。除纯文本外,还支持传入图片和视频做多模态理解(需模型支持对应 vision/video 能力,可先 list_models 查看 input_modalities)——把消息的 content 从字符串改为内容块数组,混合 text 与 image_url / video_url。

参数必填说明
model✅模型 ID,例如"claude-sonnet-5",可先 list_models 查看
messages✅消息列表,每条形如{"role": "user"|"assistant"|"system", "content": "..."};多模态时 content 为内容块数组(见下方多模态输入)
temperature❌采样温度,越高越随机
max_tokens❌生成的最大 token 数

多模态输入(text / image / video)

图片输入(URL 方式):

{"role": "user", "content": [
  {"type": "text", "text": "这张图片里有什么?"},
  {"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
]}

图片输入(Base64 方式):

{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,<BASE64_STRING>"}}

支持的图片格式:PNG、JPEG、GIF(仅首帧)、WebP。单张图片大小限制 20MB。

注意:大图片的 Base64 编码字符串非常长,可能因请求体过大而失败,建议优先使用 URL 方式传入。

detail 参数(可选,写在 image_url 对象上)控制图片处理精度:"auto"(默认,模型按图片大小自动决定)/ "low"(512x512 缩略图,快、省,适合简单分类)/ "high"(全分辨率,适合读小字、抠细节)。一条消息的 content 数组里可放多个 image_url 块传入多张图片。

视频输入(URL 方式):

{"role": "user", "content": [
  {"type": "text", "text": "描述这个视频里的内容。"},
  {"type": "video_url", "video_url": {"url": "https://example.com/video.mp4"}}
]}

视频输入(Base64 方式):

{"type": "video_url", "video_url": {"url": "data:video/mp4;base64,<BASE64_STRING>"}}

BasicRouter 上支持 video 输入的模型包括 Qwen、Doubao(dola-seed)、Kimi、MiniMax 等系列的部分模型,具体以 list_models 返回的 input_modalities 为准。OpenAI 官方 Chat Completions 标准不原生支持视频,但 BasicRouter 网关通过

{"type": "video_url", "video_url": {"url": "..."}}

扩展格式支持视频输入,该格式与 OpenRouter、NVIDIA NIM、vLLM 等平台的 video_url 格式一致。

2. create_message — Anthropic Messages 兼容

调用 Anthropic Messages 兼容接口(不支持流式)。内容块支持 text、image、tool_use、tool_result、thinking、redacted_thinking。图片通过

{"type": "image", "source": {...}}

内容块传入。

参数必填说明
model✅模型 ID,例如"claude-sonnet-4.6"
messages✅消息列表,content 可以是字符串或内容块数组(text/image/tool_use/tool_result/thinking 等)
max_tokens✅最大输出 token 数
system❌系统提示词,字符串或[{"type": "text", "text": "..."}]
temperature / top_p / top_k❌采样参数
tools❌工具定义列表,每项形如{"name", "description", "input_schema", ...}
tool_choice❌工具选择策略
thinking❌扩展思考配置
stop_sequences❌自定义停止序列
metadata❌附加元数据
anthropic_beta❌anthropic-beta 请求头的 beta 功能标识

多模态输入(text / image / video)

图片输入支持三种 source 类型:

1. Base64 编码(注意:data 字段为纯 Base64 字符串,不含 data: 前缀),media_type 支持 image/jpeg、image/png、image/gif、image/webp:

{"type": "image", "source": {
  "type": "base64",
  "media_type": "image/jpeg",
  "data": "<BASE64_STRING>"
}}

2. URL 引用:

{"type": "image", "source": {
  "type": "url",
  "url": "https://example.com/image.jpg"
}}

3. File ID(需先通过 Files API 以 purpose="vision" 上传图片获取 file_id):

{"type": "image", "source": {
  "type": "file",
  "file_id": "<file_id>"
}}

一条消息的 content 数组里可放多个 image 块传入多张图片。

注意:大图片的 Base64 编码字符串非常长,可能因请求体过大而失败,建议优先使用 URL 方式传入。

视频输入:Anthropic Messages API 不支持视频文件。如需视频理解,先用 ffmpeg 等工具抽取关键帧,把每帧作为 image 内容块传入。BasicRouter 上支持视频输入的模型(可通过 list_models 查看 input_modalities 中是否包含 video)建议改用 chat_completion 或 create_response 接口以原生支持视频。

3. create_response — OpenAI Responses 兼容

用 input 代替 messages,用 instructions 代替系统消息,用 text.format 代替 response_format。除纯文本外,还支持传入图片和视频做多模态理解(需模型支持对应 vision/video 能力,可先 list_models 查看 input_modalities)——把 input 设为消息对象数组,content 用内容块数组,混合文本与图片/视频。

参数必填说明
model✅模型 ID,例如"glm-5.2"
input✅纯字符串(作为一条用户消息)或消息对象数组(多模态时使用,见下方)
instructions❌系统提示词
max_output_tokens❌最大输出 token 数
temperature / top_p❌采样参数
tools❌工具定义列表,顶层结构为{"type", "name", "description", "parameters"}
tool_choice❌"auto" / "none" / "required" 或 {"type", "name"}
text❌输出格式配置,形如 {"format": {"type": "text" | "json_object" | "json_schema", ...}}
previous_response_id❌用于多轮对话的前一个响应 ID
parallel_tool_calls❌是否允许并行工具调用
metadata❌附加元数据

多模态输入(text / image / video)

注意:Responses API 的内容块类型用 input_text / input_image / input_video(而非 Chat Completions 的 text / image_url / video_url),且 image_url / video_url 直接为字符串而非嵌套对象。

图片输入(URL 方式):

[{"role": "user", "content": [
  {"type": "input_text", "text": "这张图片里有什么?"},
  {"type": "input_image", "image_url": "https://example.com/image.jpg"}
]}]

图片输入(Base64 方式):

{"type": "input_image", "image_url": "data:image/jpeg;base64,<BASE64_STRING>"}

支持的图片格式:PNG、JPEG、GIF(仅首帧)、WebP。单张图片大小限制 20MB。

注意:大图片的 Base64 编码字符串非常长,可能因请求体过大而失败,建议优先使用 URL 方式传入。

图片输入(File ID 方式):

{"type": "input_image", "file_id": "<file_id>"}

file_id 需通过 Files API 以 purpose="vision" 上传图片获取。

detail 参数(可选,写在 input_image 对象上)控制图片处理精度:"auto"(默认)/ "low"(512x512 缩略图,快、省)/ "high"(全分辨率,读小字、抠细节)/ "original"(原始分辨率,仅部分新模型支持)。一条消息的 content 数组里可放多个 input_image 块传入多张图片。

视频输入(URL 方式):

[{"role": "user", "content": [
  {"type": "input_text", "text": "描述这个视频里的内容。"},
  {"type": "input_video", "video_url": "https://example.com/video.mp4"}
]}]

视频输入(Base64 方式):

{"type": "input_video", "video_url": "data:video/mp4;base64,<BASE64_STRING>"}

视频输入(File ID 方式):

{"type": "input_video", "file_id": "<file_id>"}

BasicRouter 上支持 video 输入的模型包括 Qwen、Doubao(dola-seed)、Kimi、MiniMax 等系列的部分模型,具体以 list_models 返回的 input_modalities 为准。OpenAI 官方 Responses API 标准不原生支持视频,但 BasicRouter 网关通过

{"type": "input_video", "video_url": "..."}

扩展格式支持视频输入,该格式与 BytePlus/Volcengine 等平台的 input_video 格式一致。

二、模型与账户查询

4. list_models — 列出可用模型

返回当前账户可用模型,含厂商、模态、支持的能力和定价等元数据。无参数。列表每项含 price_tiers 价格档位,返回的是当前调用方的有效计费价,与实际扣费一致(见价格档位字段说明)。

5. get_model — 查询单个模型详情
参数必填说明
model✅模型 ID,例如"gpt-5.5",不存在时返回明确错误

出参含 price_tiers 价格档位(见价格档位字段说明);模型不存在时返回 404,不含价格字段。

6. get_balance — 查询账户余额

返回当前账户的用量和余额。无参数。

三、计费流水

7. list_usage — 模型调用扣费明细

分页查询模型调用计费详情,按订单创建时间倒序。仅含正常用量扣费,不含充值/调整。

参数必填说明
page❌页码,从 1 开始,默认 1
size❌每页条数,默认 20
start_time❌开始时间,格式"yyyy-MM-ddTHH:mm:ss"(例如 "2026-07-01T00:00:00")
end_time❌结束时间,格式同上
8. list_transactions — 充值/套餐交易记录

分页查询已支付的充值 / 套餐购买交易记录,按创建时间倒序。

参数必填说明
page❌页码,从 1 开始,默认 1
size❌每页条数,默认 20
start_time❌开始时间,格式"yyyy-MM-dd HH:mm:ss"(注意日期和时间之间是空格不是 T)
end_time❌结束时间,格式同上

四、图像生成

9. list_image_models — 列出图像模型

返回支持的图像生成模型,含分辨率、宽高比、单次最大图片数(maxCount)、最大参考图数(fileMax)。无参数。调用图像生成前先查这个,只能传规格里公布的值。列表每项含 priceTiers 价格档位(见价格档位字段说明)。

10. create_image_generation — 提交图像生成任务

异步提交,立即返回 taskId,会消耗账户额度。

参数必填说明
text✅图像生成提示词
model✅模型名称,取值来自 list_image_models 返回的 id
count❌生成图片数量
resolution❌分辨率,取值来自 list_image_models 的 resolutions
ratio❌宽高比,取值来自 list_image_models 的 ratios
image_urls❌参考图片 URL 列表(图生图),数量不能超过该模型的 fileMax
callback_url❌任务完成回调 webhook,省略则自行轮询
11. get_image_generation — 轮询图像任务
参数必填说明
task_id✅create_image_generation 返回的 taskId

返回:status 为 pending(进行中)/ success(成功)/ failed(失败);images 是图片 URL 数组的 JSON 字符串;text 携带模型附加描述(如 Gemini 多模态输出)。

五、视频生成

12. list_video_models — 列出视频模型

返回支持的视频生成模型,含 allowedVideoTypes、时长范围(videoDurationMin/Max)、分辨率、宽高比、参考素材上限(fileMax)。无参数。调用视频生成前先查这个。列表每项含 priceTiers 价格档位(见价格档位字段说明)。

13. create_video_generation — 提交视频生成任务

异步提交,立即返回 taskId,会消耗账户额度。

参数必填说明
text✅视频生成提示词,video_type=5 时可用 "@图片 N"/"@视频 N"/"@音频 N" 引用素材
model✅模型名称,取值来自 list_video_models 返回的 id
video_type✅生成模式代码(1-5,见下),只能用该模型 allowedVideoTypes 中列出的值
image_urls❌图片素材 URL 列表,含义随 video_type 变化
video_urls❌视频素材 URL 列表,仅 video_type=5 使用
audio_urls❌音频素材 URL 列表,仅 video_type=5 使用
resolution / ratio❌分辨率 / 宽高比,取值来自 list_video_models
duration❌视频时长(秒),必须在 videoDurationMin/Max 范围内
callback_url❌任务完成回调 webhook,省略则自行轮询

video_type 含义:

值模式素材要求
1文生视频无需素材
2图生视频(首帧)image_urls 提供单张起始帧
3图生视频(首尾帧)image_urls 提供 [首帧, 尾帧],顺序固定
4图生视频(参考)image_urls 提供一张或多张风格/内容参考图
5全部参考混合 image_urls/video_urls/audio_urls,在 text 中按位置引用
14. get_video_generation — 轮询视频任务
参数必填说明
task_id✅create_video_generation 返回的 taskId

价格档位字段说明

list_models、get_model、list_image_models、list_video_models 这 4 个模型查询工具的出参会返回当前调用方(API Key 用户)的有效计费价,与实际扣费完全一致,且返回该模型的全部价格档位。

字段命名差异:list_models / get_model 沿用 OpenAI 风格下划线命名(price_tiers);list_image_models / list_video_models 沿用 camelCase 命名(priceTiers)。两者结构完全相同。

price_tiers / priceTiers 为数组,每个元素是一个价格档位:

字段类型说明
regionstring文本模型 V2 分层区域,如 GLOBAL / NON_GLOBAL / us-central1。图片/视频模型为 null
bandMinlong文本模型 input token 区间下界(含),null 表示无限档
bandMaxlong文本模型 input token 区间上界(含),null 表示无限档
resolutionstring图片/视频分辨率,如 1080p / 4K。文本模型为 null
claritystring清晰度
unitstring计量单位:token(文本)/ image(图片)/ video(视频)
quantityinteger计量单位数量(如每 1000 token、每 1 张图)
descriptionstring价格描述
inputPricedecimal当前调用方有效输入单价
outputPricedecimal当前调用方有效输出单价
cachePricedecimal缓存价格(通用模型,旧计费公式用)
cacheReadPricedecimal缓存读取单价(Bedrock Claude 专用)
cacheWritePricedecimal缓存写入单价(Bedrock Claude 专用)
ratiodecimal计费倍率。FIXED 模式为 1;RATIO 模式为用户/分组倍率
modestring定价模式:RATIO / FIXED
planIdstring命中的定价计划 id,可为 null

三种模型类型共用同一结构,仅描述字段填充不同,不适用字段为 null:

模型类型unit生效的描述字段
文本tokenregion / bandMin / bandMax
图片imageresolution / clarity
视频videoresolution / clarity

价格含义:返回的 inputPrice / outputPrice / cacheReadPrice / cacheWritePrice 等,是经价格链(chain)→ guidance → 基础价逐级解析后,针对当前 API Key 用户的最终计费单价,与实际扣费一致。调用方看到的单价会因自身所属的定价链(reseller / distributor / 企业 / 用户级配置)不同而不同。

实际扣费额 = 用量 ÷ quantity × 对应单价 × ratio。视频按秒计费时,实际扣费 = duration × outputPrice × ratio。

边界与异常处理(只读接口不会因价格配置问题返回 500):

场景行为
单个档位解析失败(定价策略拒绝访问、配置缺失)跳过该档,记录 warn 日志,继续解析其余档位
某模型所有档位均解析失败为空数组 [],模型仍正常返回
模型无任何价格配置为空数组 []
价格解析抛出未捕获异常整体 try-catch,返回空数组,接口仍 200

响应示例(list_models,文本模型):

{
  "object": "list",
  "data": [
    {
      "id": "gpt-4o",
      "object": "model",
      "display_name": "gpt-4o",
      "context_length": 128000,
      "description": "...",
      "price_tiers": [
        {
          "region": "GLOBAL",
          "bandMin": null,
          "bandMax": null,
          "resolution": null,
          "clarity": null,
          "unit": "token",
          "quantity": 1000,
          "description": "每千 token",
          "inputPrice": 0.0025,
          "outputPrice": 0.01,
          "cachePrice": 0.00125,
          "cacheReadPrice": 0,
          "cacheWritePrice": 0,
          "ratio": 1,
          "mode": "RATIO",
          "planId": null
        }
      ]
    }
  ]
}

响应示例(list_image_models,图片模型,priceTiers 结构同上,unit 为 image):

{
  "object": "list",
  "data": [
    {
      "id": "dall-e-3",
      "object": "image_model",
      "displayName": "dall-e-3",
      "resolutions": ["1024x1024", "1792x1024", "1024x1792"],
      "priceTiers": [
        {
          "region": null,
          "bandMin": null,
          "bandMax": null,
          "resolution": "1024x1024",
          "clarity": "standard",
          "unit": "image",
          "quantity": 1,
          "description": "每张",
          "inputPrice": 0,
          "outputPrice": 0.04,
          "cachePrice": 0,
          "cacheReadPrice": 0,
          "cacheWritePrice": 0,
          "ratio": 1,
          "mode": "RATIO",
          "planId": null
        }
      ]
    }
  ]
}

使用示例

示例 1:一次普通对话

提问:"用 BasicRouter 调 claude-sonnet-5,问它 Python 的 GIL 是什么"

AI 会调用 chat_completion,参数为:

{
  "model": "claude-sonnet-5",
  "messages": [{"role": "user", "content": "Python 的 GIL 是什么?"}]
}

示例 2:用 Anthropic Messages 接口带工具调用

提问:"用 BasicRouter 的 Messages 接口,让模型自己决定要不要查天气"

AI 会调用 create_message,传入 tools 定义和 tool_choice,返回中会包含 tool_use 内容块。

示例 3:查可用模型

提问:"列一下我 BasicRouter 账户里有哪些模型"

AI 会调用 list_models,返回所有可用模型的 ID、厂商、模态、定价等信息。

示例 4:查余额和用量

提问:"查一下我 BasicRouter 这个月的用量明细"

AI 会调用 get_balance 查余额,再调用 list_usage(带 start_time 限定本月)查扣费明细。

示例 5:生成图片

提问:"用 BasicRouter 生成一张赛博朋克风格的城市夜景图"

AI 会先调用 list_image_models 查规格,再调用 create_image_generation 拿到 taskId,最后轮询 get_image_generation 拿到图片 URL。

示例 6:文生视频

提问:"用 BasicRouter 生成一段 5 秒的太空星云视频"

AI 会先调用 list_video_models 查规格,再调用 create_video_generation(video_type=1,duration=5),拿到 taskId 后轮询 get_video_generation。

常见问题

调用工具时报 "缺少 BasicRouter API Key"

  • 用 claude mcp add 时没带 --header,或 key 写错了
  • 直接编辑 JSON 配置时,headers 字段名写错(应为 X-Basicrouter-Api-Key)
  • 本地运行时没设环境变量 BASICROUTER_API_KEY

调用工具报 "BasicRouter 返回 401 未授权"

API Key 本身不对或已失效,去 BasicRouter 控制台重新生成。

Claude 没有调用 BasicRouter 工具怎么办?

  • 用 claude mcp list 确认连接是 ✓ Connected
  • 确认连接状态:claude mcp get basicrouter
  • 尝试明确要求:"用 BasicRouter 的 chat_completion 工具调 claude-sonnet-5 …"

图像/视频生成一直 pending

  • 图像任务用 get_image_generation、视频任务用 get_video_generation 轮询,注意视频任务进行中时 status 是 "running" 不是 "pending"
  • 生成需要时间,通常几秒到几十秒,视频更久
  • 如果带了 callback_url,任务完成会主动回调,不需要轮询

list_image_models / list_video_models 报错

这两个工具本身不会消耗额度,报错一般是 key 或网络问题。先确认 list_models 能正常返回。

注意事项

  • Header 名称:MCP 用 X-Basicrouter-Api-Key 传 key。
  • 额度消耗:chat_completion / create_message / create_response / create_image_generation / create_video_generation 都会消耗账户额度,调用前可以先 get_balance 看一下余额。
  • 先查规格再生成:图像/视频生成的 model、resolution、ratio、count、duration、video_type 等参数只能传 list_image_models / list_video_models 公布的值,否则会报错。
  • 不支持流式:三个对话接口都不支持流式响应,一次性返回完整结果。
  • 无状态设计:每次请求都是独立的,不保存会话信息;多轮对话靠 create_response 的 previous_response_id 或自己在 messages 里维护历史。