跳到主要内容

模型上下文协议(MCP)

OPL 数据空间从 v0.6.31 开始原生支持 MCP(Model Context Protocol)。本页说明如何快速启用、在生产环境中更稳妥地接入,以及如何排查常见问题。

信息

需要 OPL 数据空间 v0.6.31+

前置要求:WEBUI_SECRET_KEY

在 Docker 部署中,你必须设置 WEBUI_SECRET_KEY 环境变量。否则,依赖 OAuth 的 MCP 工具(例如 Notion)会在容器重启或重建后失去令牌解密能力,反复报出 Error decrypting tokens,导致你每次都要重新授权。

快速开始

  1. 打开 ⚙️ Admin Settings → External Tools
  2. 点击 +(Add Server)
  3. Type 设为 MCP (Streamable HTTP)
  4. 填写 Server URL 与认证信息。
  5. 点击 Save;如果界面提示,重启 OPL 数据空间。

完成后,你就可以在 OPL 数据空间中调用这个 MCP 服务器暴露出来的工具。

常见错误:连接类型选错

如果你接入的是 MCP 服务器,Type 必须选择 MCP (Streamable HTTP),而不是 OpenAPI

把带有 mcpServers 的 MCP 配置 JSON 填进 OpenAPI 连接,前端可能直接崩溃,或者进入无限 loading。若已出现这种情况:

  1. 先在 Admin Settings 中禁用或删除这个异常连接。
  2. 然后重新添加,并把 Type 正确设置为 MCP

什么时候用 MCP,什么时候用 OpenAPI

提示

对大多数部署来说,OpenAPI 仍然是优先推荐的集成方式。

优先选择 OpenAPI,如果你更看重:

  • 企业级接入能力:更成熟的 SSO、API 网关、审计、配额、类型化 SDK。
  • 运行稳定性:标准 HTTP 动词、幂等、缓存、更清晰的错误码。
  • 可观测性:更容易接入 tracing、策略控制和平台治理。

优先选择 MCP (Streamable HTTP),如果你需要:

  • 复用团队已经在使用的 MCP 工具协议。
  • 基于 HTTP 的流式协议通信。

这里说的是 MCP 传输层的 streaming,不是 OPL 数据空间的 UI 事件系统;后者只适用于原生 Python 工具。

你不必二选一。很多团队会在内部暴露 OpenAPI,再在边缘为特定客户端包装 MCP。

注意

浏览器环境下的多用户部署,会显著增加 CORS / CSRF、按用户隔离、重连与令牌生命周期管理的复杂度。在把 MCP 暴露给外部之前,请先评估你的认证、代理和限流策略。

配置建议

认证模式

  • None:适合本地 MCP 服务器,或无需令牌的内网环境。
    • 除非你的服务器明确要求 token,否则建议默认选它。若误选 Bearer 且未填 key, OPL 数据空间会发送空的 Authorization: Bearer 头,很多服务器会立刻拒绝连接。
  • Bearer:仅在 MCP 服务器要求固定 API Token 时使用。必须填写 Key
  • OAuth 2.1:使用动态客户端注册(DCR)。当 MCP 服务端支持自动注册 OAuth client 时优先使用。
  • OAuth 2.1 (Static):使用预先创建好的 client ID / client secret。适合不支持 DCR 的提供方,或你的安全团队要求手工管理凭据的场景。
如何在 OAuth 2.1OAuth 2.1 (Static) 间选择
  • 服务端支持 DCR 时,先试 OAuth 2.1
  • 你已经从 IdP 拿到固定凭据,且希望 OPL 数据空间直接使用它们时,改用 OAuth 2.1 (Static)

OAuth 2.1(Static)配置步骤

  1. 打开 Admin Settings → External Tools
  2. 点击 +(Add Server)
  3. Type 设为 MCP (Streamable HTTP)
  4. 输入 MCP 服务器 URL
  5. Auth 中选择 OAuth 2.1 (Static)
  6. 填写 Client IDClient Secret
  7. 点击 Register Client
  8. 点击 Save

保存后:

  1. 打开任意聊天。
  2. 点击 + → Integrations → Tools
  3. 启用这个 MCP 工具。
  4. 在浏览器跳转中完成 OAuth 授权。
信息

oauth_2.1oauth_2.1_static 都需要点击 Register Client。静态模式下, OPL 数据空间会使用你提供的 client 凭据和服务器元数据发现机制,不会进行动态客户端注册。

OAuth 2.1 工具不要设为默认工具

不要把 OAuth 2.1 的 MCP 工具设成模型的默认/预启用工具。 这类工具第一次使用时需要浏览器重定向、用户授权和回调,无法在一次普通聊天请求的后台“静默完成”。

如果用户尚未授权,或 refresh token 已失效,而这个工具又被默认挂在模型上,那么工具调用通常会失败,并显示 Failed to connect to MCP server

正确做法是:让用户在具体聊天里通过输入框旁边的 手动启用工具,这会先触发授权流程。完成首次授权后,后续令牌刷新通常可以自动进行。

连接地址

如果 OPL 数据空间运行在 Docker 中,而你的 MCP 服务端运行在宿主机上:

  • 不要用 localhost
  • 改用 http://host.docker.internal:<port>

例如:http://host.docker.internal:3000/sse

Function Name Filter List

这个字段用于限制哪些工具会暴露给 LLM。

  • 默认行为:留空时会暴露全部工具。
  • 兼容性绕过:如果留空时你遇到连接异常,可以尝试只填一个英文逗号 ,。这样系统会把它当作“合法但为空”的过滤列表,在某些解析边界条件下能绕开问题。

故障排查

“Failed to connect to MCP server”

症状: 设置页里的 Verify Connection 显示 Connected,但聊天实际调用工具时报错 Failed to connect to MCP server

排查顺序:

  1. 检查认证模式。若服务端不需要 token,就不要选择 Bearer
  2. 如果 Function Name Filter List 为空,尝试填入一个逗号 ,
  3. 如果这个工具使用 OAuth 2.1,而且被设成了模型默认工具,请把它从默认工具里移除,改为按聊天手动启用。

添加 External Tool 后前端一直 loading

症状: 添加连接后页面卡在 loading spinner,浏览器控制台常见错误是 Cannot convert undefined or null to object at Object.entries

原因: 你很可能把 MCP 服务器OpenAPI 类型配置了,或者把 MCP 风格 JSON 粘进了 OpenAPI 连接。

解决办法:

  1. 打开 Admin Settings → External Tools
  2. 禁用或删除这个异常连接。
  3. 刷新页面。
  4. 按正确的 Type = MCP (Streamable HTTP) 重新添加。

常见问题

支持 stdio 或 SSE 吗?

OPL 数据空间当前原生支持的是 Streamable HTTP 形式的 MCP。原因很直接: OPL 数据空间是一个 Web 化、多租户 的系统,不是本地桌面进程。浏览器环境本身对长连接、用户隔离与安全边界有更严格的限制,直接维护 stdio 或传统 SSE 连接并不理想。

如果你需要接入这类 MCP 服务,可以使用 mcpo。它可以把基于 stdio 或 SSE 的 MCP 服务转成 OpenAPI 兼容接口。

这里的 MCP 支持稳定吗?

可以使用,而且持续在改进。但整个 MCP 生态本身还在快速演进,偶发的破坏性变化仍有可能出现。

可以混用 OpenAPI 和 MCP 工具吗?

可以。很多团队会同时使用这两种方式。