[Bug] 内置「网页获取」MCP 服务 fetch_webpage 不可用:WebFetch 子进程启动崩溃 MODULE_NOT_FOUND
Bug 反馈待处理fetch_webpage 工具失效 —— 问题场景与状况总结(脱敏版)
报告时间:2026-08-31
涉及工具:Tokeny 内置 MCP 服务「网页获取」(fetch_webpage / fetch_json)
用途:可对外分享(如反馈给 Tokeny 开发团队)
脱敏说明:本文档已去除本机绝对路径、操作系统用户名、工作空间/会话唯一标识、内部记忆 ID 及本地业务项目名称,统一以 <...> 占位符替代;保留与问题定位直接相关的日志组件、错误码与时间信息。
一、问题现象
在会话中调用 fetch_webpage 获取任意网页(金山文档、百度等)均拿不到网页内容。
通过网关调用被服务端挡回,返回提示:「工具 fetch_webpage 已直接可用,请直接调用而非通过网关」。
但实际可调用的工具函数列表中并不存在 fetch_webpage 入口,无法“直接调用”。
服务管理/工具列表却能查到该服务与完整参数 schema(fetch_webpage / fetch_json),服务注册显示正常。
与具体 URL 无关:换任意链接都报同样的错误。
→ 表现为「服务注册正常 + 实际不可执行」的死锁:网关拒绝转发,direct 入口又没真正挂上。
二、已尝试的常规修复(均无效)
手段 结果
重启 Tokeny / 新建会话 ❌ 仍复现
设置中禁用 → 启用「网页获取」服务 ❌ 仍复现
原因见下文根因——问题在应用打包层,不在会话注入状态,会话级操作无法触及。
三、日志证据链(应用日志)
3.1 WebFetch 子进程启动失败 → 降级到内存通道
[MCPManager] Spawning WebFetch subprocess
scriptPath: <应用安装目录>\resources\app.asar.unpacked\out\main\webfetch-server.cjs
[MCPManager] WebFetch subprocess command: <Tokeny 运行时>\node\node.exe isElectron:false
[MCPManager] ERROR: WebFetch subprocess failed, falling back to InMemoryTransport
error: MCP error -32000: Connection closed
[MCPManager] WebFetch fallback to InMemory succeeded tools: 2
[MCPManager] Spawning WebFetch subprocess
scriptPath: <应用安装目录>\resources\app.asar.unpacked\out\main\webfetch-server.cjs
[MCPManager] WebFetch subprocess command: <Tokeny 运行时>\node\node.exe isElectron:false
[MCPManager] ERROR: WebFetch subprocess failed, falling back to InMemoryTransport
error: MCP error -32000: Connection closed
[MCPManager] WebFetch fallback to InMemory succeeded tools: 2
(重启/禁用启用后又完整复现一次,同款三连)
3.2 Orchestrator 将 fetch_webpage 标记为 direct 注入(配置正常)
[ToolOrchestrator] MCP 工具分流 total:95 directInject:4 gateway:91
directTools: fetch_webpage, fetch_json, send_qq_message, list_qq_chats
[ToolOrchestrator] MCP 工具分流 total:95 directInject:4 gateway:91
directTools: fetch_webpage, fetch_json, send_qq_message, list_qq_chats
3.3 实际调用只拿到 739 字节的错误返回(网关拒绝信息)
[StreamProcessor] agent node output toolCalls:["fetch_webpage"]
[StreamProcessor] tool node result toolName:"fetch_webpage" resultLen:739
[StreamProcessor] agent node output toolCalls:["fetch_webpage"]
[StreamProcessor] tool node result toolName:"fetch_webpage" resultLen:739
四、根因(已直接复现验证)
4.1 复现实验
用与日志一致的命令直接运行 WebFetch 子进程脚本:
node.exe <应用安装目录>\resources\app.asar.unpacked\out\main\webfetch-server.cjs
node.exe <应用安装目录>\resources\app.asar.unpacked\out\main\webfetch-server.cjs
启动即崩溃,输出:
Error: Cannot find module '@modelcontextprotocol/sdk/server/mcp.js'
Require stack:
- <应用安装目录>\resources\app.asar.unpacked\out\main\webfetch-server.cjs
code: 'MODULE_NOT_FOUND'
Node.js v22.22.2
Error: Cannot find module '@modelcontextprotocol/sdk/server/mcp.js'
Require stack: - <应用安装目录>\resources\app.asar.unpacked\out\main\webfetch-server.cjs
code: 'MODULE_NOT_FOUND'
Node.js v22.22.2
4.2 结构验证
@modelcontextprotocol/sdk 确实随应用打包,但位于 app.asar 内部(asar 内共 508 个相关文件)。
webfetch-server.cjs 因需作为子进程运行被解包到 app.asar.unpacked/out/main/。
子进程由外部 Node 启动(日志标注 isElectron:false),不带 Electron 的 asar 虚拟文件系统补丁,无法从 app.asar 内部解析依赖。
于是 Node 沿真实文件系统向上找 node_modules,app.asar.unpacked 下只有原生模块(better-sqlite3、node-pty 等),没有 @modelcontextprotocol → MODULE_NOT_FOUND。
4.3 完整故障链
MCPManager spawn WebFetch 子进程(外部 node)
→ webfetch-server.cjs require @modelcontextprotocol/sdk 失败 → 子进程立即崩溃
→ 子进程连接关闭(MCP error -32000: Connection closed)
→ MCPManager 捕获失败,回退 InMemoryTransport(仅注册 schema,执行通道不可用)
→ 工具列表能查到工具;Orchestrator 仍按 direct 配置分流
→ 调用时 direct 函数未真正挂载 → 路由到网关 → 网关拒绝转发
→ 死锁:注册正常但永远无法执行
MCPManager spawn WebFetch 子进程(外部 node)
→ webfetch-server.cjs require @modelcontextprotocol/sdk 失败 → 子进程立即崩溃
→ 子进程连接关闭(MCP error -32000: Connection closed)
→ MCPManager 捕获失败,回退 InMemoryTransport(仅注册 schema,执行通道不可用)
→ 工具列表能查到工具;Orchestrator 仍按 direct 配置分流
→ 调用时 direct 函数未真正挂载 → 路由到网关 → 网关拒绝转发
→ 死锁:注册正常但永远无法执行
五、为什么重启 / 禁用启用无效
每次会话初始化都会重演同一过程:spawn 子进程 → 崩溃 → InMemory 降级。这是应用打包架构缺陷(依赖在 asar 内、子进程用外部 node 跑解包脚本),会话层与服务启停都改变不了打包结构,因此必然复现。
六、影响范围与历史
翻查历史日志,WebFetch subprocess failed 自 8 月 10 日起持续存在:
日期 失败次数
08-10 2
08-11 5
08-12 3
08-13 29
08-15 1
08-16 1
08-17 1
08-24 2
08-28 2
08-31(今日) 3
→ 属于长期、非偶发的平台缺陷,非本次会话引入。
评论与讨论
还没有评论,分享你的体验吧。