使用说明
验证mcp服务器🔍
基于合同的AI代理验证。
一种MCP(模型上下文协议)服务器,解决了代理人工智能系统中的“盲信任”问题,代理在不验证的情况下委派任务并接受结果。该服务器迫使代理使用显式合约在数学上和稳健地证明他们的工作。
有关完整的架构细节、源代码分解和历史设计决策,请参阅 项目_奥维德.md.
问题
Agent A: "Write a function to sort users by age"
Agent B: "Done! Here's the code"
Agent A: "Great, shipping it!" ← No verification!
目前代理:
- 按面值接受嵌套工具输出。
- 在报告完成之前,不要确认代码是否编译或测试通过。
- 通过多智能体步骤传播幻觉。
解决方案:合同
1. DEFINE expectations (contract) → before work
2. DO the work → agent acts
3. VERIFY against contract → automated checks & metrics
4. DECIDE based on evidence → Passed / Failed / Review Required
合同对完成进行了严格的定义。如果一个代理在没有计算证明的情况下断言某事,它将被标记为 Unverified 并迫使人类重新审视任务(ReviewRequired).
快速开始
1.建造
cargo build --release
2.在客户端中配置
添加到MCP配置中(例如。 ~/.config/claude/claude_desktop_config.json 或光标配置):
{
"mcpServers": {
"verify": {
"command": "/path/to/verify-mcp-server/target/release/verify-mcp-server",
"env": {
"RUST_LOG": "verify_mcp_server=info"
}
}
}
}
3.使用示例
在开始工作之前,使用 verify_create_contract:
{
"description": "Adding user sort function",
"task": "Add a sort_users_by_age() function",
"agent_id": "cli-user",
"language": "python",
"checks": [
{
"name": "type_check",
"check_type": {
"type": "python_type_check",
"paths": ["services/user_service.py"],
"checker": "mypy",
"extra_args": ["--ignore-missing-imports"],
"working_dir": "."
}
},
{
"name": "tests_pass",
"check_type": {
"type": "pytest_result",
"test_path": "tests/test_user_service.py -v",
"min_passed": 3,
"max_failures": 0,
"working_dir": "."
}
}
]
}
注:
agent_id和language是强制性的。服务器强制执行特定语言的元验证——Python任务必须包括python_type_check和pytest_result,Rust任务必须包括cargo testJavaScript任务需要jest_vitest_result,TypeScript任务需要typescript_type_check和jest_vitest_resultHTML/CSS任务没有元验证义务。使用bypass_meta_validation_reason用于非代码更改,如模板或配置编辑。
执行工作并使用验证 verify_run_contract。您将收到详细的判决:
{
"status": "passed",
"verdict": "✓ ALL CHECKS PASSED",
"summary": {
"total_checks": 2,
"passed": 2,
"failed": 0,
"unverified": 0,
"warnings": 0
}
}
4.使用模板
与其每次都从头开始定义检查,不如使用模板:
# List available templates
verify_list_templates
# Create a contract from a template
verify_create_from_template {
"template_name": "python_bugfix",
"agent_id": "my-agent",
"variables": {
"working_dir": "/path/to/project",
"test_path": "tests/test_fix.py"
}
}
一旦合同通过,将其升级为可重用的模板 verify_promote_to_template.
5.调试和审计跟踪
如果代理或审核流程卡住,您可以调出历史记录和审计跟踪:
- 使用
verify_history浏览过去的操作。 - 使用
verify_stats查看总通过率、最常见的失败和代理信任评分。 - 使用
verify_get_audit_trail特定的contract_id跟踪任务的确切生命周期,并确定代理在成功之前失败的频率。
工具
服务器公开了12个MCP工具:
| 工具 | 说明 |
|---|---|
verify_create_contract |
在开始工作之前定义验证合同 |
verify_run_contract |
执行所有检查并获得验证报告 |
verify_quick_check |
在没有完整合同的情况下运行一次临时检查 |
verify_list_contracts |
列出所有处于活动状态的合同 |
verify_get_report |
获取合同的详细结果 |
verify_delete_contract |
删除合同 |
verify_history |
使用筛选器浏览过去的合同 |
verify_stats |
汇总统计数据、通过率和代理信任评分 |
verify_get_audit_trail |
合同的完整生命周期跟踪 |
verify_list_templates |
列出可用的合同模板 |
verify_create_from_template |
使用变量替换从模板创建合同 |
verify_promote_to_template |
将已通过的合同升级为可重用的模板 |
检查类型
服务器支持17种检查类型进行全面验证:
| 检查类型 | 描述 |
|---|---|
command_succeeds |
运行shell命令,验证退出代码0 |
command_output_matches |
运行命令,将stdout与正则表达式匹配 |
file_exists |
验证文件是否存在 |
file_contains_patterns |
验证文件中是否存在正则表达式模式 |
file_excludes_patterns |
验证文件中不存在正则表达式模式 |
ast_query |
基于树座的语义AST分析 |
json_schema_valid |
根据模式验证JSON |
value_in_range |
检查数值是否在范围内 |
diff_size_limit |
验证差异大小是否在限制范围内 |
assertion |
代理人提供的索赔(始终标记为“未验证”) |
python_type_check |
结构化mypy/pyright类型检查 |
pytest_result |
具有通过/失败/跳过阈值的结构化pytest |
python_import_graph |
使用架构规则进行循环导入检测 |
json_registry_consistency |
验证Python注册表中是否存在JSON ID |
typescript_type_check |
运行tsc--noEmit检查TypeScript类型 |
jest_vitest_result |
运行并解析Jest/Vitest JSON测试报告 |
css_html_consistency |
确保CSS文件中存在文件中的所有HTML类 |
安全特性
合同创建保障
合同在被接受之前要经过多个验证阶段:
-
检查解析 --所有检查都会反序列化,并显示有针对性的错误消息。如果字段名有误(例如。
path对比paths),代理会收到一个特定的提示,显示需要哪些字段,并使用复制粘贴示例。 -
元验证 --强制执行特定语言的最低标准(例如,Python任务必须进行类型检查和测试,JS任务必须进行测试,TS任务必须进行形式检查和测试;HTML/CSS任务没有元验证义务)。可以通过以下方式绕过
bypass_meta_validation_reason对于非代码更改。 -
试运行验证 --在存储合约之前,会编译所有正则表达式模式,验证工作目录,并检查AST查询的平衡括号。无效的合同将立即被拒绝,并提供可操作的诊断。
-
拒绝合同审核 --即使是被拒绝的合同也会存储在数据库中以供审计,因此可以跟踪重复错误的模式。
安全和沙盒
服务器执行的命令通过三层安全模型进行严格验证:
- 白名单: 安全命令(
python,cargo,pytest,mypy等等)直接在主机上运行。 - 此 路 不通: 壳体注射模式(
&&,||,;,|,rm,sudo等)被拒绝,并提出可操作的建议(例如“使用working_dir而不是cd ... &&"). - 沙盒: 未知命令在没有网络、RAM和CPU有限的临时Podman容器中运行。
验证是 报价意识 --引号内的分号(例如。 python -c "import x; y")被正确识别为安全的Python代码,而不是shell注入。
通过环境变量配置沙盒约束:
| 变量 | 默认值 | 描述 |
|---|---|---|
VERIFY_SANDBOX_IMAGE |
ubuntu:24.04 |
容器图片 |
VERIFY_SANDBOX_MEMORY |
512m |
内存限制 |
VERIFY_SANDBOX_CPUS |
2.0 |
CPU限制 |
VERIFY_SANDBOX_NETWORK |
false |
网络接入 |
VERIFY_SANDBOX_MOUNT_MODE |
rw |
安装模式(rw/ro) |
代理人信任评分
服务器通过信任分数跟踪代理的可靠性。代理人从100.0开始,并因以下原因受到处罚:
- 糟糕的结果: 一份合同
Passed使用相同的工作区哈希值突然失败→ 严厉的惩罚。 - 试错法: 同一合同连续多次失败→ N次重试后的惩罚。
信任评分可见于 verify_stats 输出,可以通过环境变量进行调整(VERIFY_TRUST_PENALTY_FLAKY, VERIFY_TRUST_PENALTY_TRIAL, VERIFY_TRUST_MAX_RETRIES).
坚持
所有合同、检查结果、模板和审计事件都存储在本地SQLite文件中:
~/.local/share/verify-mcp/verify.db
数据库使用WAL模式以获得更好的并发读取性能,并使用外键约束以实现引用完整性。
许可证
麻省理工学院