Daemon MCP 池与动态服务
按 capability 判断预算范围,管理临时 MCP 覆盖及添加失败。
This page has not been translated into English yet. The original Chinese version is shown below.
Daemon 的 MCP transport 可在工作区内共享,但是否共享必须看 mcp_workspace_pool capability。协议版本相同也可能采用不同管理方式。
池与预算
有 mcp_workspace_pool 时,相同 workspace runtime、server name、config fingerprint 的连接按引用计数共享,预算也是每工作区;第二个工作区有独立池。缺少该能力或启用 QWEN_SERVE_NO_MCP_POOL=1 时,回退到每会话管理,每个会话都可能用满自己的预算。
--mcp-client-budget 在工作区 pool 中按服务名预留名额;同名不同 fingerprint 可共用一个名额,不等于真实连接数或本机子进程数上限,也不是启动并发数。设置预算时 --mcp-budget-mode 默认 warn,未设置时默认 off;enforce 未给预算会拒绝启动。
warn 在至少 75% 时把快照标为 warning,一般发现流程不拒绝连接。enforce 按声明顺序限制连接,被拒绝服务显示 disabledReason: budget,预算状态为 error/budget_exhausted。按服务器名预留的名额跨重连或发现超时保留。
mcp_guardrail_events 支持时,mcp_budget_warning 在向上越过 75% 时发一次,降到严格低于 37.5% 后重新准备;mcp_child_refused_batch 合并发现批次。事件只表示变化,重连后仍以 GET /workspace/mcp 快照为准。
运行时添加
检查 mcp_server_runtime_mutation 后,POST /workspace/mcp/servers 可立即连接并发现服务。例如以下 body 使用已准备好的本地命令,不代表需要执行安装:
{
"name": "local-tools",
"config": {
"command": "/absolute/path/to/mcp-server",
"args": []
}
}name 仅字母数字、下划线和连字符,最多 256 字符。config 是传输相关 MCP 配置,但 trust、env、cwd、oauth、headers、authProviderType、includeTools、excludeTools、type 等安全相关字段会被剥离,不能靠此接口注入它们。
需要 live ACP child,尚未创建会话时可能收到 503 acp_channel_unavailable。strict mutation gate 仍适用;提供 X-Qwen-Client-Id 时还需是该工作区注册过的 ID。
添加成功返回 replaced、shadowedSettings、toolCount 等。同名 runtime fingerprint 不变时幂等,replaced: false;不同则断开旧连接建立新连接。
动态添加的预算差异
动态添加路由在 warn 模式下,若新增会超过预算,会返回 HTTP 200、skipped: true、reason: budget_warning_only,并不连接。它与一般发现的 warn“只警告不拒绝”语义不同,调用者必须检查 body,不能只看 200。
enforce 超限返回 409 mcp_budget_would_exceed;连接退出或超时为 502 mcp_server_spawn_failed。名称、结构、传输配置和 client ID 验证失败分别返回相应 400。
临时覆盖与删除
运行时配置覆盖同名 settings 服务,不修改 settings.json。DELETE /workspace/mcp/servers/:name 只删除 runtime 项,name 需 URL 编码;原本不存在 runtime 项时返回 skipped/not_present,即使 settings 里同名服务仍在。
删除覆盖项后,settings 服务在后续发现/连接时重新生效。daemon 重启失去 runtime overlay,只有 settings 项继续存在。GET /workspace/mcp 展示合并视图,目前没有稳定字段区分两个来源。
成功添加/删除向工作区全部 active session bus 发 mcp_server_added/mcp_server_removed;skipped 不发。重启单服务的 POST /workspace/mcp/:server/restart 还会预检查预算。恢复时应先读快照,而不是仅凭旧事件断言服务仍在。