协议mcp(计划1+2+3)
转到MCP服务器进行Vaultclaw操作,以及本地烹饪书/模板目录渲染和远程拉取安装。
这实现了什么
stdioMCP服务器(默认模式)。- 用于共享运行时部署的可选HTTP网桥模式。
- 仅令牌会话配置(无密码处理)。
- 连接器工具:列出/获取/验证/执行/执行作业。
- 文档辅助工具:Vaultclaw文档类型的建议/最新版本。
- 计划工具:验证/执行/运行状态。
- 必备工具:插槽绑定+无界轮廓。
- 自动无限制配置文件编排,用于:
- vaultclaw_connector_execute_job - vaultclaw_plan_execute
- 显式编排助手:
- vaultclaw_unbounded_profile_resolve - vaultclaw_plan_unbounded_profile_preview
- MCP友好包络的确定性误差归一化。
- 自动
module_hash从连接器派生policy_hash对于有界的执行路径。 - 外部审批交接
execute-job和plan-execute. - 显式等待/恢复轮询工具,用于批准后的继续。
- 只读审批可见性工具(待处理列表/获取+作业/运行状态结果预测)。
- 本地烹饪书捆绑CRUD/导入/导出目录。
- 配方/模板发现工具和模板渲染工具。
- 远程目录源注册表+仅拉取列表/安装,可选SHA256验证。
- 严格的计划3边界:目录/渲染工具从不执行Vault操作。
非目标
- 批准签字或提交决定。
- 保险库初始化/解锁/锁定。
- 远程烹饪书发布/发布API。
- 超越stdio和请求/响应HTTP的双向流传输。
构建并运行
go run ./cmd/accords-mcp这将通过stdin/stdout启动MCP服务器。
HTTP模式(用于单例部署):
ACCORDS_MCP_HTTP_ADDR=:8080 ACCORDS_MCP_HTTP_PATH=/v1/mcp go run ./cmd/accords-mcp这通过HTTP为JSON-RPC提供服务 POST /v1/mcp (别名: /mcp)以及健康终点(/healthz, /v1/healthz).
单例HTTP会话范围:
vaultclaw_session_configure,vaultclaw_session_status,以及vaultclaw_session_clear根据HTTP请求租户密钥确定范围。- 严格租户标头模式env:
ACCORDS_MCP_HTTP_REQUIRE_TENANT_HEADER(默认值:false). - 范围解析顺序(第一个非空标头获胜):
1. X-Accords-Tenant-Id (主标题) 1. X-OpenClaw-Tenant-Id (可选兼容性标头) 1. X-Tenant-Id (可选兼容性标头) 1. 退路: default (仅当严格模式关闭时)
- 行为矩阵:
- 严格模式 false (默认):缺少租户标头将回退到 default 范围。 - 严格模式 true:缺少的租户标头被HTTP拒绝 400 信封错误代码 MCP_TENANT_HEADER_REQUIRED;没有退路 default. - 任一模式下都存在标头:保留上述现有标头的优先级。
- 严格模式抑制包络形状:
- ok=false - error.code="MCP_TENANT_HEADER_REQUIRED" - error.category="validation"
stdio模式始终使用default范围。
烹饪书编写标准
有关烹饪书/食谱/模板/计划创作约定和所需的测试覆盖率,请参阅:
MCP信封
每次工具调用都会返回:
{
"ok": true,
"data": {},
"error": null,
"meta": {
"request_id": "...",
"vault_http_status": 200,
"vault_code": ""
}
}关于失败:
{
"ok": false,
"data": null,
"error": {
"code": "MCP_*",
"category": "auth|approval|validation|policy|secrets|plans|network|internal",
"message": "...",
"retryable": false,
"vault_code": "...",
"details": {}
},
"meta": {
"request_id": "...",
"vault_http_status": 4xx,
"vault_code": "..."
}
}工具
会话
vaultclaw_session_configure(base_url, token, timeout_ms?)vaultclaw_session_status()vaultclaw_session_clear()
作用域行为:
- 在HTTP模式下,会话工具对解析的请求作用域进行操作(基于标头,请参阅上面的单例HTTP会话作用域)。
- 在stdio模式下,会话工具在
default范围。
例子:
{
"name": "vaultclaw_session_configure",
"arguments": {
"base_url": "http://127.0.0.1:8080",
"token": "vc_tok_...",
"timeout_ms": 20000
}
}核心行动
vaultclaw_connectors_list()vaultclaw_connector_get(connector_id)vaultclaw_connector_validate(request)vaultclaw_connector_execute(request)vaultclaw_connector_execute_job(request, orchestration?)vaultclaw_document_types_suggest(query, top_k?)vaultclaw_document_types_latest(type_id, subject_id?)
vaultclaw_connector_validate 致电Vaultclaw /v0/connectors/validate 并返回字段级验证错误(path, code, message, expected, actual)当有效载荷形状无效时。
vaultclaw_connector_execute 和 vaultclaw_connector_execute_job 同时运行模块哈希预检:
- 谷歌Gmail有界动词:总是派生
module_hash从连接器policy_hash除非已经提供。 - 通用HTTP传统秘密id绑定(
token_secret_id/required_secret_ids路径):派生module_hash. - 没有遗留秘密id绑定的通用HTTP无界配置文件/插槽意图路径:不强制模块哈希。
vaultclaw_connector_execute 和 vaultclaw_connector_execute_job 始终通过验证 /v0/connectors/validate 在执行之前。如果验证失败,它们会提前返回,并且不会请求/触发审批执行路径。
vaultclaw_connector_execute_job 编排默认值:
{
"unbounded_profiles": true,
"auto_create_profiles": true
}文档辅助工具行为:
vaultclaw_document_types_suggest致电Vaultclaw/v0/docs/types/suggest.vaultclaw_document_types_latest致电Vaultclaw/v0/docs/types/latest.- 对于非成功响应,MCP在故障信封中保留Vaultclaw代码/详细信息(
vault_code和details.vault_error).
例子:
{
"name": "vaultclaw_connector_execute_job",
"arguments": {
"request": {
"connector_id": "generic.http",
"verb": "generic.http.request.v1",
"request": {
"method": "GET",
"url": "https://api.example.com/data",
"secret_attachments": [
{
"slot": "api_key",
"intent": "http.auth",
"expected_secret_types": ["api-key"],
"mode": "read",
"target": "https://api.example.com"
}
]
}
}
}
}安全的Gmail执行顺序
- 发现(
vaultclaw_recipes_search)优先选择最新的食谱条目(google.workspace@1.3.0之前1.2.0). - 渲染模板(
vaultclaw_template_render)或加载配方/计划有效载荷。 - 验证有效载荷(
vaultclaw_connector_validate或vaultclaw_plan_validate). - 如果有效载荷包括
document_attachments,每次飞行前type_id和vaultclaw_document_types_latest. - 仅在验证/飞行前通过后执行。
- 如果需要批准,请等待用户批准,然后通过以下方式继续
vaultclaw_approval_wait.
典型的Gmail有效负载形状:
- 收件人必须是数组:
to,cc,bcc - 邮件正文使用
text_plain/text_html - 文档附件的使用
document_attachments具有严格对象键的数组:
- 必修的: type_id - 可选: filename, content_type - 无其他密钥
弃用的Gmail形状(被模式验证拒绝):
body_text- 标量接收者字段(例如,
to: "user@example.com"而不是to: ["user@example.com"])
附件感知提示流示例:
- 提示:
send my passport over email to a@b.com - 通过解析类型
vaultclaw_document_types_suggest(query="passport", top_k=5)->identity.passport. - 使用以下命令构建渲染输入:
- to=["a@b.com"] - subject="Document: Passport" (如果缺失,则默认) - text_plain="Attached is my passport." (如果缺失,则默认) - document_attachments=[{"type_id":"identity.passport"}]
- 使用渲染+验证Gmail计划和飞行前
vaultclaw_document_types_latest(type_id="identity.passport", subject_id="self"). - 仅在飞行前解决时执行。
护照复印+详细信息工作流程
vaultclaw_passport_email_workflow 为以下内容添加确定性编排流:
- “发送电子邮件至 `` 附上我的护照副本,并在电子邮件正文中注明我的护照字段。"
输入:
- 必修的:
recipient_email(或包括在request_text) - 可选:
subject(默认为Passport Copy and Details) - 可选:
body_style - 可选简历字段:
passport_document_id,manual_fields - 可选:
execute(true默认情况下;集false仅返回计划+计划输入)
行为:
- 解决护照文件绑定问题(
identity.passport,subject_id=self). - 跑:
- identity.extraction.run.v1 和 profile_kind=KYC, provider=aws.textract.v1, mode=ANALYZE_AND_SAVE - identity.profile.read.v1 对于所需插槽: - given_name - family_name - passport_number - passport_expiry_date - passport_issuing_country
- 构建一个带有标签护照字段的纯文本电子邮件正文。
- 构建一个包含身份和Gmail步骤的连接器计划:
- identity.extraction.run.v1 - identity.profile.read.v1 - google.gmail.drafts.create - google.gmail.drafts.send
google.gmail.drafts.send绑定draft_id从create_draft步进输出。
结构化恢复状态:
MCP_RECIPIENT_REQUIREDMCP_DOCUMENT_UPLOAD_REQUIRED(包括上传动作有效载荷)MCP_PASSPORT_EXTRACTION_FAILEDMCP_PASSPORT_PROFILE_READ_FAILEDMCP_MANUAL_FIELDS_REQUIRED(仅包括手动输入的缺失字段)MCP_GMAIL_DRAFT_SEND_FAILED
计划
vaultclaw_plan_validate(plan)vaultclaw_plan_execute(plan, plan_input?, orchestration?)vaultclaw_plan_run_get(run_id)
vaultclaw_plan_validate 和 vaultclaw_plan_execute 不要注射 module_hash 进入计划步骤 request_base 有效载荷。
vaultclaw_plan_execute 编排默认值:
{
"unbounded_profiles": true,
"auto_create_profiles": true
}审批可见性+简历
vaultclaw_job_get(job_id)vaultclaw_approvals_pending_list(states?, limit?, connector_id?, verb?, agent_id?, challenge_id?)vaultclaw_approvals_pending_get(challenge_id, pending_id)vaultclaw_approval_wait(handle, timeout_ms?, poll_interval_ms?)
等待默认值和夹具:
- 默认
timeout_ms=600000,min1000,最大值3600000 - 默认
poll_interval_ms=1500,min250,最大值10000
例子:
{
"name": "vaultclaw_plan_execute",
"arguments": {
"plan": {
"steps": [
{
"step_id": "s1",
"connector_id": "generic.http",
"verb": "generic.http.request.v1",
"request_base": {
"method": "GET",
"url": "https://api.example.com/data",
"secret_attachments": [
{
"slot": "api_key",
"mode": "read",
"target": "https://api.example.com"
}
]
}
}
]
},
"plan_input": {}
}
}必备助手
vaultclaw_slot_bindings_list(connector_id, verb, include_revoked?)vaultclaw_slot_bind(connector_id, verb, slot, secret_id)vaultclaw_unbounded_profiles_list(connector_id?, verb?, include_revoked?)vaultclaw_unbounded_profile_get(profile_id)vaultclaw_unbounded_profile_upsert(profile)
编排/预览
vaultclaw_unbounded_profile_resolve(requirements, auto_create=true)vaultclaw_plan_unbounded_profile_preview(plan, plan_input?)
目录+模板(方案3)
目录CRUD:
vaultclaw_cookbooks_list(filter?)vaultclaw_cookbook_get(cookbook_id, version?)vaultclaw_cookbook_upsert(bundle, conflict_policy?)vaultclaw_cookbook_delete(cookbook_id, version?)vaultclaw_cookbook_export(cookbook_id, version?)vaultclaw_cookbook_import(bundle, conflict_policy?)
配方/模板访问:
vaultclaw_recipes_search(query?, connector_id?, verb?, tags?, entry_type?)vaultclaw_recipe_get(cookbook_id, recipe_id, version?)
模板渲染(不执行):
vaultclaw_template_render(cookbook_id, template_id, version?, inputs, output_kind?)output_kind:AUTO | VERB_REQUEST | PLAN
远程拉取:
vaultclaw_catalog_sources_list()vaultclaw_catalog_source_upsert(source)vaultclaw_catalog_source_delete(source_id)vaultclaw_cookbooks_remote_list(source_id, query?)vaultclaw_cookbook_remote_install(source_id, cookbook_id, version?, conflict_policy?, expected_sha256?)
搜索订购单:
vaultclaw_recipes_search当多个版本包含匹配的条目时,首先返回更高的烹饪书版本。
模板渲染示例:
{
"name": "vaultclaw_template_render",
"arguments": {
"cookbook_id": "http.recipes",
"template_id": "tpl_get_user",
"inputs": {
"url": "https://api.example.com/users/42",
"method": "GET"
},
"output_kind": "AUTO"
}
}渲染响应形状:
{
"ok": true,
"data": {
"rendered": {},
"missing_inputs": [],
"used_defaults": [],
"source_ref": {
"cookbook_id": "http.recipes",
"version": "1.0.0",
"template_id": "tpl_get_user",
"entry_type": "template.verb.v1",
"output_kind": "VERB_REQUEST"
}
}
}将渲染的有效负载与现有的操作工具一起使用(vaultclaw_connector_execute, vaultclaw_connector_execute_job, vaultclaw_plan_validate, vaultclaw_plan_execute)当你真正想要处决的时候。
路线解析(vaultclaw_route_resolve)
Vault布线的确定性NL第一解析器:
- 主路径:注册表路由匹配+确定性输入提取/自动填充。
- 搜索回退:仅当确定性路由匹配失败时。
- 缺少所需的输入将返回正常循环恢复的结构化指导。
- 天气语义提取支持两者
weather in tomorrow和's weather in措辞。
请求:
{
"name": "vaultclaw_route_resolve",
"arguments": {
"request_text": "send email to a@example.com about weather in boston tomorrow",
"options": {
"allow_search_fallback": true
},
"context": {
"facts": {
"weather_summary": "Tomorrow in Boston: 58F with morning showers."
}
}
}
}回应 data 亮点:
{
"status": "RESOLVED_EXECUTABLE",
"inputs": {},
"missing_inputs": [],
"autofilled_inputs": [
{
"input_key": "text_plain",
"value": "Weather for boston (tomorrow): Tomorrow in Boston: 58F with morning showers.",
"source": "external_facts",
"reason": "composed body from weather facts provided by normal loop"
}
],
"missing_input_guidance": [
{
"input_key": "text_plain",
"required_for_route": "google.gmail.send_email.v1",
"resolution_mode": "AUTO_RETRY_WITH_FACTS",
"question": "Fetch weather details with normal tools, then retry route resolve with context.facts.weather_summary.",
"external_fact_request": {
"fact_key": "weather_summary",
"kind": "weather_forecast",
"location": "boston",
"timeframe": "tomorrow"
}
}
],
"progress_hint": {
"mode": "AUTO_ENRICH_AND_RETRY",
"message": "Missing inputs can be auto-filled with normal-loop facts. Fetch facts and retry route resolve.",
"next_action": "RUN_FACT_TASKS_AND_RETRY_ROUTE_RESOLVE",
"retry_recommended": true,
"parallelizable": true,
"fact_keys": ["weather_summary"],
"batch_groups": ["gmail_compose_enrichment"]
},
"needs_clarification": false
}当两者都 subject 和 text_plain Gmail撰写未解决,解析器指南可能包括多个 AUTO_RETRY_WITH_FACTS 同一回复中的项目。每 external_fact_request 包括:
fact_key(email_subject/email_body)parallelizable: truebatch_group: "gmail_compose_enrichment"
正常的循环检索可以并行解析这些事实,并使用以下命令重试一次:
context.facts.email_subjectcontext.facts.email_body
对于 generic.http 路由(包括具有所需绑定的搜索解析模板),缺少所需输入现在返回 AUTO_RETRY_WITH_FACTS 指导也是。每个缺失的输入都作为可并行化的事实请求发出(fact_key=, batch_group="generic_http_enrichment"),因此正常的循环获取可以并发运行,然后使用合并重试一次 context.facts.
progress_hint 是机器可读的编排摘要 /vault 呼叫者:
mode:
- AUTO_ENRICH_AND_RETRY - PARTIAL_AUTO_ENRICH_THEN_ASK_USER - ASK_USER
next_action给出一个确定性的调用者动作标签。fact_keys和batch_groups在重试之前公开要获取的内容。
Vaultclaw技能(路由)
可移植回购技能的真实来源:
skills/vaultclaw/SKILL.md
OpenClaw使用的本地运行时技能路径:
~/.openclaw/workspace/skills/vaultclaw/SKILL.md
同步命令:
mkdir -p ~/.openclaw/workspace/skills/vaultclaw/references
cp -f skills/vaultclaw/SKILL.md ~/.openclaw/workspace/skills/vaultclaw/SKILL.md
cp -f skills/vaultclaw/references/routes.google_gmail.v1.json ~/.openclaw/workspace/skills/vaultclaw/references/routes.google_gmail.v1.json
cp -f skills/vaultclaw/references/slots.google_gmail.v1.json ~/.openclaw/workspace/skills/vaultclaw/references/slots.google_gmail.v1.json
cp -f skills/vaultclaw/references/document_type_aliases.google_gmail.v1.json ~/.openclaw/workspace/skills/vaultclaw/references/document_type_aliases.google_gmail.v1.jsonOpenClaw运行时标准(桥接+审批交接)
accords-mcp 默认为stdio MCP模式,不需要 mcporter 在协议层面。
开爪 2026.3.1 不接受根 mcpServers 输入 ~/.openclaw/openclaw.json (模式验证失败,显示“无法识别的密钥:mcpServers”)。在这个OpenClaw版本中,直接 vaultclaw_* 工具公开需要运行时/插件桥。
安装支持的运行时路径:
openclaw plugins install /Users/sam/code/accords-mcp/plugins/openclaw-vaultclaw-bridge
openclaw plugins enable vaultclaw-openclaw-bridge
openclaw config set plugins.entries.vaultclaw-openclaw-bridge.config.command /Users/sam/code/accords-mcp/bin/accords-mcp
openclaw plugins install @vaultclaw/vaultclaw-mcp-approval-handoff
openclaw plugins enable vaultclaw-mcp-approval-handoff运行时间要求:
- 保持Vaultclaw技能同步(见上文)。
- 保持
VC_AGENT_TOKEN在OpenClaw技能环境中配置(skills.entries.vaultclaw*.env)或桥接插件环境覆盖。 - 在插件/配置更改后重新启动网关。
责任划分:
| 组成部分 | 责任 |
|---|---|
vaultclaw-openclaw-bridge | 直接暴露 vaultclaw_* 通过桥接到OpenClaw中的工具 accords-mcp. |
vaultclaw-mcp-approval-handoff | 手柄 MCP_APPROVAL_REQUIRED,等待认证结果,并自动恢复。 |
故障排除:
| 症状 | 可能原因 | 修复 |
|---|---|---|
vaultclaw_* 工具不可用 | 桥接插件丢失/禁用或未设置命令路径 | 重新运行上面的安装块并验证 plugins.entries.vaultclaw-openclaw-bridge.config.command. |
| 审批回调延迟/丢失 | 审批切换插件丢失/禁用或没有活动会话传递路径 | 启用 vaultclaw-mcp-approval-handoff,确认插件日志,并重新启动网关。 |
MCP_AUTH_UNAUTHENTICATED /会话未配置 | 丢失/过期 VC_AGENT_TOKEN 或Vaultclaw身份验证状态 | 刷新身份验证/令牌,运行 vaultclaw_session_configure,然后重试。 |
目录存储和远程默认值
- 目录根默认值:
os.UserConfigDir()/accords-mcp/catalog - 用env var覆盖根:
ACCORDS_MCP_CATALOG_DIR - 文件夹:
- sources.json - index.json - cookbooks//.json
冲突策略:
FAIL(默认)OVERWRITESKIP_IF_EXISTS
远程源身份验证模式:
NONEBEARER_ENV(令牌从加载auth_env_var)
远程完整性:
vaultclaw_cookbook_remote_install在以下情况下验证SHA256:
- expected_sha256 由呼叫者提供,或 - sha256 存在于远程索引项中。
- 如果任何地方都没有提供校验和,安装仍将继续(此阶段的可信源模型)。
自动无边界配置文件编排
执行作业
当请求是 connector_id=generic.http 和 verb=generic.http.request.v1:
- 从以下内容导出需求集
request.secret_attachments. - 列出/获取无限配置文件。
- 按插槽/意图/类型/模式/目标进行确定性匹配。
- 按最高分数选择获胜者,然后按词汇选择
profile_id. - 如果没有匹配:
- 如果允许,自动创建最小约束轮廓。 - 否则返回 MCP_UNBOUNDED_PROFILE_REQUIRED 有要求。
- 注入
profile_id并致电/v0/connectors/execute-job.
计划执行
对于每一个 generic.http.request.v1 步骤:
- 解析来自的请求形状
request_base+request_bindings使用plan_input. - 如果需要未解析的运行时绑定,请使用以下命令进行严格飞行前失败:
- MCP_PLAN_PROFILE_PRECHECK_UNRESOLVED - step_id - 未解决的参考文献 - 必需的 plan_input 路径
- 使用相同的匹配逻辑解析/创建配置文件。
- 注入
profile_id转变为计划。 - 将转换后的计划提交给
/v0/connectors/plans/execute.
审批交接和简历(计划2)
vaultclaw_connector_execute_job 和 vaultclaw_plan_execute 需要批准时立即返回受控切换:
ok=falseerror.code=MCP_APPROVAL_REQUIREDerror.details.approval包括:
- status=PENDING_APPROVAL - kind=JOB|PLAN_RUN - job_id, run_id, challenge_id, pending_id - pending_id_resolved (尽最大努力) - pending_expires_at_unix_ms - pending_approval 原始有效载荷 - decision_outcome=PENDING - next_action 指向 vaultclaw_approval_wait
示例 next_action 有效载荷:
{
"tool": "vaultclaw_approval_wait",
"arguments": {
"handle": {
"kind": "PLAN_RUN",
"run_id": "run_123",
"job_id": "run_123",
"challenge_id": "ach_123",
"pending_id": "apj_123"
}
}
}简历流程:
- 调用执行工具(
execute-job或plan-execute). - 如果
MCP_APPROVAL_REQUIRED,表面等待人类。 - 人工外部批准(Vault/UI/其他客户端)。
- 呼叫
vaultclaw_approval_wait(handle)直到终端:
- SUCCEEDED -> decision_outcome=ALLOW - DENIED 带有批准拒绝代码-> decision_outcome=DENY - 否则-> decision_outcome=UNKNOWN
决定论与意识形态
- 自动创建
profile_id:mcp.auto.从标准化的要求。 - 自动创建upstart使用稳定的幂等性密钥:
- mcp-unbounded-profile-
- 对需求和插槽阵列进行排序/重复数据消除,以实现确定性输出。
- 模块哈希预检使用连接器
policy_hash使用内存缓存中的每个请求进行查找。
误差归一化
主要映射:
CONNECTOR_APPROVAL_DECISION_REQUIRED,PLAN_APPROVAL_REQUIRED,CONNECTOR_APPROVAL_GRANT_REQUIRED->MCP_APPROVAL_REQUIREDUNBOUNDED_PROFILE_SLOT_UNRESOLVED,UNBOUNDED_PROFILE_SLOT_VIOLATION,UNBOUNDED_PROFILE_NOT_FOUND,UNBOUNDED_PROFILE_REQUIRED_FIELDS_MISSING->MCP_UNBOUNDED_PROFILE_INVALID- 自动创建追加销售
INSUFFICIENT_SCOPE->MCP_UNBOUNDED_PROFILE_REQUIRED(编排层) - 未解决的计划预检查->
MCP_PLAN_PROFILE_PRECHECK_UNRESOLVED - 等待超时->
MCP_WAIT_TIMEOUT - 等待错过->
MCP_APPROVAL_PENDING_NOT_FOUND - 缺少所需模块哈希路径的可导出策略哈希->
MCP_MODULE_HASH_REQUIRED - 根据代码中的映射表保留auth/validation/policy/secrets/plans/network/internal。
测试
运行:
go test ./...包括单位覆盖范围:
- 配置文件匹配器精确/不匹配/平局中断行为
- 确定性最小配置文件生成器和稳定的哈希/配置文件id
- 自动创建确定性幂等性密钥+缺失作用域处理
- 计划飞行前已解决/未解决/混合步骤行为
- vault错误规范化映射
- 执行作业和计划执行的审批交接提取
- 待定id尽力而为解析器确定性连接中断行为
- 等待/恢复超时+终端结果行为
- 待定未找到+输入行为不正确
- 模块哈希自动推导规则和处理程序注入行为
- 目录包验证和条目类型模式检查
- 本地目录追加销售/列表/获取/删除和冲突策略行为
- 模板呈现绑定解析(必需/默认/数组路径集语义)
- 远程索引获取/安装和校验和验证行为
集成烟雾(真正的Vaultclaw)
此套件针对实时Vaultclaw实例验证MCP行为。
假设:
- Vaultclaw已运行并解锁。
- 您提供了一个有效的预铸造代理令牌。
generic.http连接器已安装。
环境合同:
VC_BASE_URL(默认值:http://127.0.0.1:8787)VC_UNIX_SOCKET(可选;设置后,MCP使用此Unix域套接字进行本地Vaultclaw HTTP传输)VC_AGENT_TOKEN(必填)VC_SMOKE_MANUAL_APPROVAL(默认值:0;set1用于手动恢复测试)VC_SMOKE_WAIT_TIMEOUT_MS(默认值:600000)VC_SMOKE_POLL_INTERVAL_MS(默认值:1500)VC_SMOKE_EXPECT_OUTCOME(此计划中的默认值和必需值:DENY)
完全烟雾覆盖所需的令牌范围:
connectors.list.v1connectors.get.v1connectors.execute.v1connectors.execute_job.v1connectors.plans.execute.v1connectors.plans.read.v1connectors.approvals.pending.read.v1
自动核心烟雾:
VC_BASE_URL=http://127.0.0.1:8787 \
VC_AGENT_TOKEN= \
go test -tags=integration ./internal/mcp -run '^TestSmoke_(Session|Discovery|Execute|ExecuteJob|Plan|Approvals)' -v本地Unix套接字上的自动核心冒烟:
VC_UNIX_SOCKET="$HOME/Library/Application Support/vaultclaw/vaultd.sock" \
VC_BASE_URL=http://localhost \
VC_AGENT_TOKEN= \
go test -tags=integration ./internal/mcp -run '^TestSmoke_(Session|Discovery|Execute|ExecuteJob|Plan|Approvals)' -v手动外部批准恢复吸烟(拒绝):
VC_BASE_URL=http://127.0.0.1:8787 \
VC_AGENT_TOKEN= \
VC_SMOKE_MANUAL_APPROVAL=1 \
VC_SMOKE_EXPECT_OUTCOME=DENY \
go test -tags=integration ./internal/mcp -run '^TestSmoke_ManualApprovalResume_Deny$' -v手动流动行为:
- 测试提交计划执行并接收
MCP_APPROVAL_REQUIRED. - 它记录
challenge_id,pending_id,以及run_id. - 从外部拒绝该挂起的批准(Vault UI/API)。
- 测试电话
vaultclaw_approval_wait并期待终端DENIED和decision_outcome=DENY.
