我们是如何在 Bifrost 中构建 MCP 支持的(以及我们对 Agent Security 的认识)

发布: (2026年1月20日 GMT+8 05:27)
11 min read
原文: Dev.to

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 网关已运行,并配有用于可视化配置、实时监控等的网页界面,…

View on GitHub

AI 代理的问题

AI 代理在尝试连接真实基础设施时会遇到硬性限制。
想让你的代理查询数据库、读取文件或调用 API?你最终需要为每一种使用场景编写自定义集成代码。

Model Context Protocol (MCP) 改变了这一现状。它是一种标准化方式,使 AI 模型能够在运行时发现并使用外部工具。与其硬编码集成,你只需启动 MCP 服务器来暴露工具——AI 模型会自行判断可用的工具并加以使用。

我们在生产部署中观察到的三个主要问题

  1. 安全灾难的潜在风险 – 大多数实现允许 AI 模型随意执行任何工具。没有监督,也没有日志记录。一次错误的提示就可能更新生产数据库或删除文件。
  2. 零可观测性 – 当出现故障时,你根本不知道调用了哪个工具、使用了哪些参数,或者哪里出错。调试变成了考古。
  3. 运维复杂性 – 管理数十个 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 msGo 运行时;Python/Node.js MCP 服务器会更慢,但架构可良好扩展。

MCP 支持

  • MCP 支持已在 Bifrost 上线。
  • 设置简便:配置您的 MCP 服务器,设置哪些工具可以自动执行,然后开始发出请求。

文档

  • 我们在 MCP 文档中记录了 全部四种连接类型代理模式与代码模式,以及 请求级过滤
  • 提供了常见模式的示例:
    • 文件系统
    • 数据库
    • Web API

结束语

如果您正在构建需要与真实基础设施交互的代理,这种方法比 自定义集成代码简洁,并为您提供生产环境所需的可观测性和安全控制。

该代码是 开源 的——如果您对内部实现感兴趣,可以查看实现细节。我们基于真实使用情况发布更新,随时欢迎反馈。

Back to Blog

相关文章

阅读更多 »

Rapg:基于 TUI 的密钥管理器

我们都有这种经历。你加入一个新项目,首先听到的就是:“在 Slack 的置顶消息里查找 .env 文件”。或者你有多个 .env …

技术是赋能者,而非救世主

为什么思考的清晰度比你使用的工具更重要。Technology 常被视为一种魔法开关——只要打开,它就能让一切改善。新的 software,...

踏入 agentic coding

使用 Copilot Agent 的经验 我主要使用 GitHub Copilot 进行 inline edits 和 PR reviews,让我的大脑完成大部分思考。最近我决定 t...