MCP 发现、过滤与断线重放
分别设置启动和调用预算,检查工具可见性、服务信任与未知执行结果。
连接成功、工具出现在模型声明里、调用获准、结果成功返回是四个不同阶段。排查时按阶段处理,避免重复执行可能已经完成的写操作。
启动发现与超时
交互终端先显示 UI,再在后台发现服务,状态显示 N/M MCP servers ready。太早发提示可能只有部分工具可用。无头 --prompt、stream-json 和 ACP 会在第一条提示前等待发现收敛。
| 字段 | 范围 | 默认 |
|---|---|---|
| discoveryTimeoutMs | connect、tools/list、prompts/list、resources/list 初始握手 | stdio 30 秒;HTTP/SSE 5 秒 |
| timeout | 工具调用请求 | 600,000 毫秒,即十分钟 |
{
"mcpServers": {
"slow-local": {
"command": "node",
"args": ["./server.js"],
"discoveryTimeoutMs": 60000,
"timeout": 30000
}
}
}ToolSearch 预加载还有单独时序:MCP 如果在初始预加载之后才连接,可能要新会话或 /clear 才参加该预加载。服务注册就绪不等于它的全部 schema 立刻进入每个模型请求,见上下文成本。
QWEN_CODE_LEGACY_MCP_BLOCKING=1 可回到等待所有服务后显示 UI 的旧模式。官方将它作为过渡回退入口,不应依赖其永久保留。
stdio 协议协商
versionNegotiation 默认 legacy,只启动会话所需进程。设为 auto 时,会先运行一个短命副本协商协议,最多占发现预算五秒,再启动会话进程。
启动有不可重复副作用、单 owner 锁、PID 文件或很慢握手的服务应保留 legacy。auto 并不只是改变请求字段,它会额外启动一次服务进程。
服务与工具过滤
全局 mcp.allowed、mcp.excluded 按服务名称匹配,支持 * 任意字符序列、? 单字符;无通配符按完全相同名称比较,同时匹配时 excluded 优先。
每服务 includeTools 是工具允许列表,省略默认全部;excludeTools 优先于 includeTools,并让对应工具不对模型提供。筛选工具与工具调用审批不是同一设置。
trust 与断线重放
trust 默认 false。设 true 只在可信工作区跳过该服务确认。
当前调用断线后,只有服务 trust 为 true、工作区可信,而且工具明确给出 idempotentHint:true 或一致的只读注解时,Qwen 才重连并重放。只读标注与 destructiveHint:true、idempotentHint:false 冲突时不能按只读重放。
注解缺失、冲突或任一信任条件不满足,都不会透明重放。错误会提醒结果未知:服务可能已执行,只是应答丢失,应先核对实际状态再重试。
注解来自服务自身,是行为提示,不是授权证明。只有已核对服务行为和标注后才考虑 trust;不能用修改客户端 trust 来证明远端操作幂等。