[Bug]: /toolset/{name}/mcp tools/list loses URL scope after catalog authority refresh (1.106.x regression)

这个报错出现在使用 LiteLLM 1.106.x 并通过 /toolset/{name}/mcp 端点提供 MCP 工具时:虚拟密钥被授予多个 toolset 后, tools/list 返回了所有 toolset 的工具并集,而不是所选 toolset 的限定范围。优先排查网关版本,并确认 li

快速结论:这个报错出现在使用 LiteLLM 1.106.x 并通过 /toolset/{name}/mcp 端点提供 MCP 工具时:虚拟密钥被授予多个 toolset 后,tools/list 返回了所有 toolset 的工具并集,而不是所选 toolset 的限定范围。优先排查网关版本,并确认 list_gateway_catalog() 在刷新权限后是否重新应用了 toolset scope。

适用环境:官方镜像 ghcr.io/berriai/litellm:v1.105.1、v1.106.0、v1.106.2 以及基于 1.106.2 的派生镜像;通过 HTTP 直接调用 MCP 端点,与 MCP 客户端无关;密钥授权同时覆盖直接授予 key 和从 team 继承两种方式,Allow All Keys 为关闭状态。Issue 未给出操作系统、Python、CUDA、显卡等环境信息。

最快修复方案:暂无确认的一步修复方案。Issue 中验证过的处理方式是在 list_gateway_catalog() 中刷新 authority 之后重新调用 apply_toolset_scope(),并向 resolve_toolset_tool_permissions() 传入 requires_fresh_policy=acting.requires_fresh_policy;对应修复以 PR #47893 提交,建议升级到包含该修复的版本。

注意事项:1.105.1 的 46 项断言 0 失败,1.106.0 与 1.106.2 各 34 项失败,说明这是 1.106.x 的回归。Issue 特别说明该问题表现的是工具清单发现结果错误,并非已证实的工具执行越权绕过:两个超出 toolset 范围的 tools/call 请求在打补丁前后均被拒绝。自行打补丁时不要只保留 refresh 而丢掉重新应用 scope 的步骤,否则问题依旧。

问题场景

用户在 LiteLLM 网关中通过 /toolset/{name}/mcp 端点调用 MCP 工具。该虚拟密钥被授予了多个 MCP toolset(直接授予或经 team 继承),期望该端点只暴露指定 toolset 的工具,但 tools/list 返回了全部 toolset 工具并集。密钥只绑定一个 toolset 时表现正常。问题可在不依赖 MCP 客户端、直接发送 HTTP 请求的情况下复现。

报错原文

[Bug]: /toolset/{name}/mcp tools/list loses URL scope after catalog authority refresh (1.106.x regression)

原因分析

toolset 路由先对请求的 authority 应用 apply_toolset_scope(),但随后的 list_gateway_catalog() 会调用 MCPRequestHandler.refresh_catalog_authority(context.user_api_key_auth)。该刷新从数据库重新加载虚拟密钥,并把其已限定的 object_permission 替换为数据库中的完整 object_permission。mcp_toolset_id 虽然保留,但请求级别的 URL 限定没有在常规虚拟密钥列表路径上重新应用,因此 tools/list 使用了全部授权的并集。该 authority 刷新路径由 commit d1cfe17518f69d5fbf56d6d26d392bba83ab52e4(PR #44446)引入,是此次回归的可能来源。相关位置在 v1.106.2 中为 catalog.py 的 list_gateway_catalog()(约 1112 行)、user_api_key_auth_mcp.py 的 refresh_catalog_authority()(约 1256–1278 行)、server.py 的 apply_toolset_scope()(约 1554–1628 行)。

环境排查

  • 确认 LiteLLM 镜像或版本:1.105.1 无此问题,1.106.0 和 1.106.2 均出现 34/46 断言失败。
  • 确认是否包含 PR #47893 或等价补丁。
  • 确认虚拟密钥是否被授予多个 toolset,以及授权来自直接授予、team 继承还是两者叠加。
  • 确认 Allow All Keys 处于关闭状态。
  • Issue 未提供操作系统、Python、CUDA、PyTorch、显卡或 MCP 客户端版本,这些不作为判断依据。

解决步骤

  1. 先用 v1.105.1 对比同一请求,确认 /toolset/{name}/mcp 的 tools/list 是否只返回所选 toolset 的工具,以判断是否为 1.106.x 回归。
  2. 可优先尝试:在 list_gateway_catalog() 中调用 refresh_catalog_authority() 后,若 caller.mcp_toolset_id 不为空,则重新调用 apply_toolset_scope(caller, caller.mcp_toolset_id),并用 replace(context, _caller=caller) 写回上下文。
  3. 可优先尝试:在 apply_toolset_scope() 中向 resolve_toolset_tool_permissions() 传入 requires_fresh_policy=acting.requires_fresh_policy,保证重新应用 scope 时使用最新 toolset 内容。
  4. 应用后运行 toolset scope 相关单元测试(Issue 提及 tests/unit/proxy/_experimental/mcp_server/test_mcp_toolset_scope.py),覆盖多 toolset、team 继承、只读/完整重叠等场景。

验证方法

直接向 /toolset/{name}/mcp 发送 tools/list 请求,确认返回结果只包含目标 toolset 的工具,不再出现其他 toolset 的工具;真实 MCP SDK 在修复前返回全部四个工具,修复后只返回所选工具。再验证:删除某 toolset 授权后下一次请求返回 HTTP 403;修改 toolset 内容后无需重启网关即可生效。

参考来源

BerriAI/litellm #47856

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 31852

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注