【免费下载链接】otari
Open-source, OpenAI-compatible LLM gateway you run yourself. One endpoint for 40+ providers, with virtual keys, budgets, and usage tracking.
otari 是一个开源、OpenAI 兼容的 LLM 网关,一个端点即可接入 40+ 模型提供商,并自带虚拟密钥、预算和用量追踪。而它的 MCP 集成能力,让/api/v1/chat/completions、/api/v1/messages和/api/v1/responses三个端点都能直接调用 MCP 服务器暴露的工具——模型发起工具调用,网关负责执行、把结果塞回对话、再让模型继续回答,全程你无需自己写循环。
1 分钟看懂:otari 的两种 MCP 接入模式
在 otari 中,MCP 服务器有两种接入方式,它们可以二选一,也可以组合使用:
| 字段 | 含义 | 适合场景 |
|---|---|---|
mcp_servers | 在请求体内联 MCP 服务器配置,网关直连 | 临时调试、一次性调用 |
mcp_server_ids | 引用工作区中已保存的 MCP 服务器 ID | 长期使用的正式服务 |
两种写法都属于托管模式(Managed MCP):otari 接管整个「模型 ⇄ 工具」循环。当模型发出一个 MCP 工具调用时,otari 会执行它、把结果追加进对话、再调用一次模型,直到模型返回正常回答为止。
内联 mcp_servers:在请求里直接带上 MCP 服务器
最快的上手方式。MCP 配置是请求的顶级字段,不要塞进tools数组里:
{ "model": "anthropic:claude-sonnet-4-6", "messages": [{"role": "user", "content": "列出仓库中未关闭的 issue"}], "mcp_servers": [ { "name": "github", "url": "https://mcp.example.com/github", "authorization_token": "ghp_...", "purpose_hint": "用于查询仓库和 issue", "allowed_tools": ["list_issues", "get_issue"] } ] }各字段的作用:
name:服务器标签,同一请求内必须全局唯一url:streamable HTTP 形式的 MCP 端点,需可从网关访问authorization_token:可选的 Bearer Token;一旦填写,url必须是https://purpose_hint:可选提示,会拼进系统消息,帮模型更准地选用工具allowed_tools:可选白名单。省略或传null表示暴露全部工具;传[]表示全部禁用;传具体名称则只暴露这些
用 mcp_server_ids 引用工作区已保存的服务器
生产环境更推荐的做法是:把 MCP 服务器注册一次,之后所有请求只传 ID:
{ "model": "anthropic:claude-sonnet-4-6", "messages": [{"role": "user", "content": "总结一下未合并的 PR"}], "mcp_server_ids": ["11111111-1111-1111-1111-111111111111"] }保存的服务器在控制台Tools → MCP servers页面管理,也可以直接用主密钥调用 API 完成同样的事:
curl -X POST http://localhost:8000/api/v1/workspaces/$WORKSPACE_ID/mcp-servers \ -H "Otari-Key: $OTARI_MASTER_KEY" \ -H "Content-Type: application/json" \ -d '{"name": "github", "url": "https://mcp.example.com/github"}'几个实用的细节:
- 🔐
authorization_token使用OTARI_SECRET_KEY加密存储,接口永不回显,只返回has_token - ⚙️
enabled: false会保留配置和令牌,但让该服务器从所有请求中摘除 - ✅ 创建或修改 URL、令牌、白名单时会自动做一次连接体检,结果放在
health字段里;也可用POST /{server_id}/check随时手动复检 - 📦 单个工作区最多配置 50 个服务器,
mcp_server_ids一次最多引用 50 个 ID
otari 托管的工具循环是怎么跑的
这是新手最容易踩坑的地方,值得单独说明:
- 模型发出 MCP 工具调用 → otari 执行并把结果追加进对话
- otari 再次调用模型,循环往复
- 循环由
max_tool_iterations控制:默认 10 轮,上限 25 轮 - 最后一轮会收回 otari 的全部工具,强制模型基于已有结果作答——即使模型"上瘾"一直想调工具,也一定会以正常回答收尾
另外,MCP 工具可以与 otari 内置工具(web_search、web_fetch、code_execution)在同一个请求中混用,但服务器工具名不能与内置工具重名,否则会返回400。
进阶:调用方编排模式(Caller-orchestrated MCP)
如果你需要人在环上审批(比如人工批准一次写操作),托管循环就不合适了。otari 提供两个无状态端点,把编排权交回给你的应用:
| 步骤 | 端点 | 说明 |
|---|---|---|
| 发现工具 | GET /api/v1/mcp/servers/{id}/tools | 返回该服务器暴露的工具定义与server_revision |
| 执行调用 | POST /api/v1/mcp/execute | 执行一次已授权的工具调用,返回原生 MCP 结果 |
两条规则务必记住:
- ⚠️执行请求永不自动重试。otari 不做去重,重复发送可能把工具再执行一遍。遇到
execution_state: "outcome_unknown"错误时,说明结果不确定,应展示为"状态未知"而非静默重试 - 🔄
server_revision要随授权记录一起保存并回传。它不是审批凭证,但能防止"授权之后配置被改了"导致调错对象
otari 独立强制的是认证、工作区可达性、工具白名单和 URL 安全;用户审批、参数编辑、操作留痕这些边界由你的应用负责。
生产使用前必看的 3 个安全设计
- SSRF 防护:MCP URL 在保存时和每次请求时都会做安全校验,默认拦截私有与保留地址、允许回环;
OTARI_MCP_ALLOW_LOOPBACK=false可进一步收紧 - 名称唯一:同一请求用到的所有 MCP 服务器(内联 + 工作区保存的)名称不能重复,否则
400,因为 otari 靠名称路由每次工具调用 - 传输上限:发现与执行各有独立的并发和超时预算(如单次工具调用 30 秒、结果 1 MiB),慢速或恶意的 MCP 服务器不会饿死已授权的正常调用
小结
| 需求 | 推荐方式 |
|---|---|
| 快速验证一个 MCP 服务器 | 内联mcp_servers |
| 团队长期使用的正式服务 | 工作区保存 +mcp_server_ids |
| 需要人工审批的敏感操作 | Caller-orchestrated 双端点 |
更多细节可参考项目文档:MCP 完整文档、内置工具说明、工具文档。核心实现位于 mcp_loop.py、mcp_client.py 与 workspace_mcp_server_service.py。在 otari 上,MCP 集成不需要你额外搭建任何东西——加上两个字段,任意 MCP 服务器就能进入你的 Chat 与 Responses 请求了。
【免费下载链接】otari
Open-source, OpenAI-compatible LLM gateway you run yourself. One endpoint for 40+ providers, with virtual keys, budgets, and usage tracking.
相关推荐
LangChain MCP 集成指南:用 MCPAdapter 将任意 MCP 服务器接入 create_agent 智能体
LangChain MCP 集成指南:用 MCPAdapter 将任意 MCP 服务器接入 create_agent 智能体 Model Context Pro
人工智能大模型AI AgentAgent 框架RAG如何快速集成MCP服务器到rLLM环境:完整配置与实战指南
如何快速集成MCP服务器到rLLM环境:完整配置与实战指南 rLLM(Democratizing Reinforcement Learning for LLMs
AI Agent强化学习大模型模型评测Kiln MCP Server 实战指南:将 Kiln 搜索与任务工具接入任意 MCP 客户端
Kiln MCP Server 实战指南:将 Kiln 搜索与任务工具接入任意 MCP 客户端 Kiln 的 MCP(Model Context Protoco
人工智能AI 应用AI 评测RAG微调提示工程开发工具桌面应用MLOps
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考