适配器运行时契约
核心为代理在工具和作业运行期间需要的运行时材料暴露了小型、与 DCC 无关的契约。适配器保留宿主特定的收集和安全策略;核心标准化形状和资源移交路径。
就绪探针发布与恢复
使用嵌入式 McpHttpServer 时,必须在 start() 之前发布 AdapterReadinessBinder。监听器在启动时捕获该探针;之后修改同一个探针的位会实时 生效,但启动后发布另一个探针不会替换运行中监听器的探针。setter 成功不等于 HTTP 验证成功。
publish()和published表示最近一次发布尝试是否被接受。setter 显式返回False表示拒绝,原生 setter 成功时返回None。缺少 setter 或抛出异常也表示 发布失败。失败的尝试不会撤销之前已安装的探针。- 纯 Python 的
SidecarBackedSkillServerfacade 返回False,因为它无法将进程内 探针传入独立 Rust server。binder 与DccServerBase.set_readiness_probe()都会 保留此拒绝结果。本地binder.report_subset()全绿不代表 sidecar HTTP 已就绪。 如果 adapter 进程使用的是嵌入式扩展,即使该进程本身在原生 DCC 之外运行,仍属于嵌入式情况。 dcc_ready_probe只在绑定和binder.refresh_dcc_ready()时取样,不会在每个 HTTP 请求时自动调用,也没有后台轮询。adapter 负责安排刷新;回调异常使dcc=False, 后续成功刷新可以恢复就绪状态。bind_queue_dispatcher(server, dispatcher, require_first_pump=True)必须传入 实际 dispatcher。binder 提交回调并等待 pump,不会自动 attach dispatcher 或驱动 队列。启动前接好执行路径,避免阻塞唯一能处理该队列的线程。- 基础调用门槛要求
process、dcc、skill_catalog、dispatcher全绿。host_execution_bridge和main_thread_executor是另外报告的执行能力。 基础就绪不能单独证明主线程执行或原生 DCC 操作可用。
共享基础探针同时限制 REST /v1/call 与已注册 MCP tools/call,包括同一 gate 后面的恢复工具。dcc 为红时会在 handler 执行前返回 HTTP 503 / MCP -32002。 恢复就绪的唯一路径不能依赖这些工具;应保留独立且得到明确授权的恢复路径,不能为了绕过 gate 而谎报宿主已就绪。本契约不增加逐工具绕过机制,也不授权自动点击对话框或破坏性确认。
验证时应覆盖隔离 HTTP 的 ready → blocked → ready,并另外验证实际执行路径。 Core loopback 测试、sidecar 进程可响应、原生 DCC/GUI 验收属于不同证据,必须分别报告。
会话事件
使用 SessionEventBuffer 处理有界的 stdout/stderr/log/progress/checkpoint 事件。将其注册为 MCP 资源:
from dcc_mcp_core import SessionEventBuffer
events = SessionEventBuffer("maya-001", maxlen=1000, max_message_bytes=4096)
server.resources().register_session_event_buffer(events)
events.append("python", "stdout", "Created rig control", tool_call_id="req-1")客户端读取 events://session/maya-001?cursor=N&limit=100。响应包含 next_cursor,因此客户端无需实时订阅即可避免重复事件。drain=true 可用于需要读取时消耗行为的客户端。
工件引用
对于大型或二进制输出,使用现有的 FileRef / ArtefactStore 路径:
artefact://sha256/<hex>永远不会暴露适配器文件系统路径。- 伴生进程携带 MIME、大小、摘要、显示名称、会话/工具/作业/关联字段、过期时间和适配器元数据。
- 有界存储可以强制执行最大载荷字节数、最大保留条目数、最大总字节数和默认 TTL。
工具结果应在上下文中返回小型 FileRef 对象,并让客户端通过 resources/read 获取字节。
调试描述符
使用 DebugSessionDescriptor 发布可选的附加元数据,而无需向核心添加硬调试器依赖。描述符支持 unavailable、available、listening、client_connected 和 error 状态,以及主机/端口、运行时/进程标识、路径映射、日志 URI、设置说明和适配器元数据。
Python 适配器可以使用:
from dcc_mcp_core import DebugSessionDescriptor
descriptor = DebugSessionDescriptor.listening("debugpy", "127.0.0.1", 5678)通过文档/自定义资源或适配器拥有的可选工具发布结果 descriptor.to_dict()。
UI Control 自动化契约
ui_control 契约是架构和工作流,不是通用点击机器人。适配器可以使用 Qt、原生可访问性 API、webview 或 DCC 特定的 UI API 实现它。公共工具名称使用 ui_control__*,因为该能力有意比 DCC 专用的 UI 命名空间更广泛:相同的契约可以描述 DCC 偏好设置对话框、外部启动器、许可证实用程序或其他适配器拥有的应用程序窗口。
Core 侧架构位于 dcc_mcp_core.adapter_contracts;原生自动化由独立的 dcc-cua manifest 和 Host 协议提供,因此 UI 自动化契约可独立于 HTTP 服务器层演进。
核心形状包括:
UiControlNode和UiSnapshot用于有界的 UI 树。UiFindRequest用于通过查询、角色、标签或对象名称定位控件。UiActionRequest用于一个有界操作,如单击、设置文本、切换、设置选中、选择选项或聚焦。UiWaitCondition和UiWaitResult用于工具内轮询,如"等待状态文本等于 Applied"或"等待模态框消失"。UiActionResult包含结构化错误,如stale_control、denied、unsupported_action和可选的截图/工件引用。UiControlPolicy和UiControlAuditRecord用于作用域操作控制和隐私保护的审计输出。
当控件过时时,适配器必须返回结构化错误而不是挂起,适配器端安全策略仍决定允许哪些操作。
首选代理循环:
ui_control__snapshot观察一个作用域应用程序窗口并返回snapshot_id。ui_control__find通过查询、角色、标签或对象名称解析稳定的控件 ID。ui_control__act对该控件 ID 执行一个操作。在可用时传递snapshot_id,以便过时的控件以stale_control失败,而不是对错误目标执行操作。ui_control__wait_for在一次调用内轮询,直到预期的 UI 状态为真,或返回带有结构化详细信息的timeout。ui_control__snapshot验证最终状态。
首先使用原生 DCC 技能或 API。仅当行为在应用程序 UI 中可见但未通过可靠的宿主 API 暴露时,才使用 ui_control__*。工作流示例和恢复模式位于 ui-control-workflows.md。
安全期望:
- 快照/查找工具是只读的,当后端支持时可以在任何线程上运行。
- 变异操作应声明保守的安全注释,宿主要求时的主线程亲和性,以及反映 UI 轮询的超时。
- 在
tools.yaml中声明 MCPannotations、execution、affinity和timeout_hint_secs。网关search_tools//v1/search携带紧凑的安全提示,describe_tool//v1/describe暴露完整架构加上_meta.dcc亲和性、执行、超时和风险提示。 - 网关实例行包括
diagnostics.ui_control.status:当ui_control__*能力被索引时为available,当不存在时为unavailable,或当适配器注册表元数据发布ui_control.status=disabled时为disabled_by_policy(可选带ui_control.reason)。 - 策略应默认禁用全桌面访问。限定到适配器拥有的进程、窗口或显式允许列表。除非用户明确选择特定后端的全桌面回退,否则保持
UiControlPolicy.require_scoped_window启用。 - 原始坐标单击和键盘快捷键是高风险的。除非适配器明确选择加入并记录回退,否则保持禁用。
- 审计记录应包括操作类型、目标控件 ID/角色/标签(安全时)、前后焦点 ID、成功/失败和结构化错误代码。敏感的键入文本和截图字节应被编辑或仅作为工件/资源引用返回。
捆绑的 ui-control 技能默认使用独立的 dcc-cua 0.4.0 或更高版本;确定性模拟后端仅供显式测试使用。设置 DCC_MCP_UI_CONTROL_BACKEND=chrome 以使用实验性 CDP 后端,并通过相同的 ui_control__snapshot、ui_control__find、ui_control__act 和 ui_control__wait_for 工具驱动浏览器或 webview 搜索。CDP 后端支持预设:reuse 首先附加到现有 DevTools 端点以便可以重用当前浏览器令牌,isolated 启动临时 Chrome 配置文件,auroraview 使用 DCC_MCP_UI_CONTROL_AURORAVIEW_CDP_PORT、AURORAVIEW_CDP_PORT、DCC_MCP_UI_CONTROL_CDP_PORT 或端口 9222 附加到 AuroraView 的 CDP 端点。相同的运行时还支持 edge 用于 Microsoft Edge CDP 和 agent-browser 用于 Vercel 的 agent-browser CLI,该 CLI 通过 agent-browser get cdp-url 公开其 DevTools URL,并可以在 CI 中通过 agent-browser install 配置。
默认的 DCC_MCP_UI_CONTROL_BACKEND=cua 通过独立的 dcc-cua CLI/Host 控制 Windows、Linux 和 macOS 原生应用。请把 0.4.0 或更高版本安装到 PATH,或把 DCC_MCP_CUA_BINARY 设置为绝对可执行文件路径。使用 DCC_MCP_UI_CONTROL_PROCESS_ID 和 DCC_MCP_UI_CONTROL_WINDOW_HANDLE 绑定准确应用;请求只能缩小作用域,不能扩大。平台无障碍、截图、可见接管标记、输入队列和 Escape 中断均由 CUA Host 负责。
项目绑定的启动与就绪契约
希望 agent 能从零实例状态恢复的 adapter,需要发布经过校验的启动计划,并在注册行 写上生命周期 metadata。Core 负责生命周期,adapter 负责计划、metadata 与就绪取值。 完整的 adapter 侧契约 —— 计划 schema、argv 占位符、环境变量、metadata key、就绪位 与阻塞状态 —— 见 adapter-launch-plan-contract.md。