Skip to content

Task 子 Agent 无法执行 MCP 工具(权限未从父 Agent 继承)

问题

通过 Task 工具创建的子 agent 会话中,已在 opencode.json 配置的 MCP 工具出现在工具注册表里(子 agent 可以"看到"这些工具),但实际调用时报错或静默失败:

Error: MCP tool execution failed: missing session permissions

父 agent(主会话)可以正常使用这些 MCP 工具,但子 agent 无法执行相同的操作。

典型场景:使用 Task 工具让子 agent 调用 context7 查文档、用 Jenkins MCP 触发构建、或读取自定义 MCP 服务——这些在父 agent 中正常,在子 agent 中都失败。

原因

Task 工具创建的子 agent 会话没有正确继承父 agent 的 MCP 会话权限。MCP 工具的注册(出现在工具列表)和执行权限(实际调用时的鉴权)是两套不同的机制,子 agent 只继承了注册信息,没有继承执行权限。

这是一个已知设计问题(另见 #3808),官方曾尝试通过 PR 修复但 PR 被关闭,尚未有合并的完整修复。

解决方案

临时方案:将 MCP 包装成 opencode plugin

将需要在子 agent 中使用的 MCP 功能封装成 opencode plugin,以原生工具的形式注册。原生工具不受 MCP 权限继承限制,可以在子 agent 中正常使用。

在项目根目录创建插件文件:

typescript
// opencode-plugin.ts(示例:包装 MCP 工具为原生工具)
import { definePlugin } from "opencode/plugin"

export default definePlugin({
  tools: {
    my_mcp_wrapped_tool: {
      description: "包装自 MCP 的工具,子 agent 可用",
      parameters: { /* ... */ },
      execute: async (params) => {
        // 在这里直接调用 MCP 或等效逻辑
        // ...
      }
    }
  }
})

opencode.json 中注册 plugin:

jsonc
{
  "plugins": ["./opencode-plugin.ts"]
}

注意:这是规避方案,需要为每个 MCP 工具单独包装,有维护成本。

等待官方修复

该问题在 GitHub #16491 追踪,持续关注官方是否提供 MCP 权限继承的正式支持。

来源:GitHub #16491