我们是如何在 Bifrost 中构建 MCP 支持的(以及我们对 Agent Security 的认识)
Source: Dev.to
请提供您希望翻译的具体文本内容,我将把它翻译成简体中文并保留原始的格式、Markdown 语法以及技术术语。谢谢!
当我们开始为 Bifrost 构建 MCP 支持时…
我原以为这很简单:连接到 MCP 服务器,代理工具调用,完成。
结果发现,要让它达到生产就绪的水平,需要解决 MCP 规范甚至没有涉及的问题。
Bifrost
构建永不宕机的 AI 应用的最快方式
Bifrost 是一个高性能 AI 网关,通过单一兼容 OpenAI 的 API 统一访问 15+ 家提供商(OpenAI、Anthropic、AWS Bedrock、Google Vertex 等)。几秒钟部署,无需配置,并提供自动故障转移、负载均衡、语义缓存以及企业级功能。
快速入门
在不到一分钟的时间内,从零开始搭建生产就绪的 AI 网关。
第一步 – 启动 Bifrost Gateway
本地安装并运行
npx -y @maximhq/bifrost
或使用 Docker
docker run -p 8080:8080 maximhq/bifrost
第二步 – 通过 Web UI 配置
# 打开内置的网页界面
open http://localhost:8080
第三步 – 发起你的第一个 API 调用
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-4o-mini",
"messages": [{"role": "user", "content": "Hello, Bifrost!"}]
}'
就这样!你的 AI 网关已运行,并配有用于可视化配置、实时监控等的网页界面,…
AI 代理的问题
AI 代理在尝试连接真实基础设施时会遇到硬性限制。
想让你的代理查询数据库、读取文件或调用 API?你最终需要为每一种使用场景编写自定义集成代码。
Model Context Protocol (MCP) 改变了这一现状。它是一种标准化方式,使 AI 模型能够在运行时发现并使用外部工具。与其硬编码集成,你只需启动 MCP 服务器来暴露工具——AI 模型会自行判断可用的工具并加以使用。
我们在生产部署中观察到的三个主要问题
- 安全灾难的潜在风险 – 大多数实现允许 AI 模型随意执行任何工具。没有监督,也没有日志记录。一次错误的提示就可能更新生产数据库或删除文件。
- 零可观测性 – 当出现故障时,你根本不知道调用了哪个工具、使用了哪些参数,或者哪里出错。调试变成了考古。
- 运维复杂性 – 管理数十个 MCP 服务器的连接、处理故障、控制访问——这些都不是协议本身能够解决的。
Source: …
为什么 Bifrost 包含 MCP 支持
我们将 MCP 支持直接内置到 Bifrost 中。它不仅仅是一个客户端——它是一个 面向生产级代理基础设施的完整控制平面。
我们支持 四种 连接 MCP 服务器的方式,每种方式解决不同的问题:
| 连接类型 | 描述 | 典型延迟 | 理想使用场景 |
|---|---|---|---|
| 进程内 | 在 Bifrost 的内存中直接运行工具。使用 Go 注册类型化处理器。 | ~0.1 ms(无网络) | 不需要单独进程的内部业务逻辑。 |
| 本地进程 | 启动外部进程并通过 stdin/stdout 通信。适用于 Python/Node.js MCP 服务器。 | 1‑10 ms | 文件系统操作、脚本或任何本地工具。 |
| 远程 HTTP | 通过 HTTP 与远程 MCP 服务器通信。 | 10‑500 ms(取决于网络) | 可扩展的微服务、数据库工具、已认证的 API。 |
| 服务器发送事件 (SSE) | 持久连接,实时推送更新。 | 取决于来源 | 监控工具、实时仪表盘、事件驱动数据。 |
示例:进程内工具注册(Go)
type CalculatorArgs struct {
Operation string `json:"operation"`
A float64 `json:"a"`
B float64 `json:"b"`
}
func calculatorHandler(args CalculatorArgs) (string, error) {
switch args.Operation {
case "add":
return fmt.Sprintf("%.2f", args.A+args.B), nil
case "multiply":
return fmt.Sprintf("%.2f", args.A*args.B), nil
default:
return "", fmt.Errorf("unsupported operation")
}
}
// Register the tool with Bifrost
client.RegisterMCPTool(
"calculator",
"Perform arithmetic",
calculatorHandler,
schema,
)
编译时的类型检查可以在运行前捕获错误。
示例:远程 HTTP 工具(数据库)
# Bifrost configuration snippet
ToolManagerConfig: &schemas.MCPToolManagerConfig{
ToolsToAutoExecute: []string{
"filesystem/read_file",
"database/query_readonly",
},
ToolExecutionTimeout: 30 * time.Second,
}
只有您明确批准的工具会自动运行。其他所有工具都需要手动批准,从而防止灾难发生,同时保持代理在安全操作下的高速运行。
细粒度工具暴露
您可以在每个请求中筛选可用的工具:
curl -X POST http://localhost:8080/v1/chat/completions \
-H "x-bf-mcp-include-clients: secure-database,audit-logger" \
-H "x-bf-mcp-include-tools: secure-database/*,audit-logger/log_access" \
-d '{"model": "gpt-4o-mini", "messages": [...]}'
- 代理只能看到您指定的工具。
- 面向客户的聊天机器人不会获得管理员工具的访问权限。
- 金融应用可以将代理限制为只读操作。
- 支持通配符(
database/*包含所有数据库工具)。
通过提供 每个请求、每个工具的控制,此方式解决了特权提升问题。
安全模型
默认情况下,Bifrost 将工具调用视为 建议,而非指令。当 AI 模型想要使用工具时,它会将请求返回给你的应用程序,由你决定是否执行。这为任何可能危险的操作提供了人工监督。
如果需要完全自动化执行,请启用 agent mode 并将安全工具列入白名单(如上面的配置示例所示)。
关键要点
- 可观测性 – 每一次工具调用都会被记录并可追溯。
- 安全性 – 默认情况下需要人工介入;可选的白名单用于安全的自动化。
- 运维简易性 – 单一网关、四种连接模式、统一配置。
Bifrost + MCP = 具备 快速、可观测且安全 的生产就绪 AI 代理。
执行模式
我们构建了两种执行模式,因为不同的使用场景需要不同的方法:
1. 代理模式
- AI一次调用一个工具。
- 它看到结果后思考,然后调用下一个工具。
- 适用于交互式代理,在每一步都希望可见的场景。
2. 代码模式
- AI编写TypeScript,在单个脚本中编排多个工具。
const files = await listFiles("/project");
const results = await Promise.all(
files.map(file => analyzeFile(file))
);
return summarize(results);
- 代码以原子方式运行——对批量操作来说更快。
- 延迟更低,因为避免了多次 LLM 往返。
- 权衡: 失去对每个工具的单独批准——代码要么运行,要么不运行。
典型用法
- 代码模式 – 需要读取数十个文件、运行查询并生成报告的数据分析工作流。
- 代理模式 – 在执行前我们希望审查数据库查询的客户支持场景。
Tool Discovery & Communication
- 工具发现 比预期更快——从 MCP 服务器检索 50 多个工具的列表耗时 不足 100 ms。
- STDIO 延迟 出奇地低:仅 1–2 ms 的开销,几乎感觉不到。
- HTTP 由于网络往返导致的延迟显著增加。
类型安全与请求过滤
- 类型安全 可防止许多错误。使用 Go 结构体的进程内工具在编译时捕获问题,而这些问题如果仅靠 JSON 验证会在运行时才出现。
- 请求级过滤 比全局配置更强大。能够根据每个请求更改可用工具,比静态配置提供了更大的控制力。
真实世界性能数据
| 组件 | 平均延迟 | 备注 |
|---|---|---|
| STDIO 文件系统工具 | 1.2 ms | |
| HTTP 数据库工具 | 15 ms | 本地网络 |
| 进程内计算工具 | 0.08 ms | |
| 每个 STDIO 连接的内存 | ~2 MB | |
| 工具发现(50 个工具) | 85 ms | Go 运行时;Python/Node.js MCP 服务器会更慢,但架构可良好扩展。 |
MCP 支持
- MCP 支持已在 Bifrost 上线。
- 设置简便:配置您的 MCP 服务器,设置哪些工具可以自动执行,然后开始发出请求。
文档
- 我们在 MCP 文档中记录了 全部四种连接类型、代理模式与代码模式,以及 请求级过滤。
- 提供了常见模式的示例:
- 文件系统
- 数据库
- Web API
结束语
如果您正在构建需要与真实基础设施交互的代理,这种方法比 自定义集成代码 更 简洁,并为您提供生产环境所需的可观测性和安全控制。
该代码是 开源 的——如果您对内部实现感兴趣,可以查看实现细节。我们基于真实使用情况发布更新,随时欢迎反馈。