AI代理合约验证服务器

一个基于合约的AI代理验证服务器,通过数学和严格证明解决AI系统中的盲信任问题。

  • by Pappet
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 Pappet/verify-mcp-server

使用说明

验证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类

安全特性

合同创建保障

合同在被接受之前要经过多个验证阶段:

  1. 检查解析 --所有检查都会反序列化,并显示有针对性的错误消息。如果字段名有误(例如。 path 对比 paths),代理会收到一个特定的提示,显示需要哪些字段,并使用复制粘贴示例。

  2. 元验证 --强制执行特定语言的最低标准(例如,Python任务必须进行类型检查和测试,JS任务必须进行测试,TS任务必须进行形式检查和测试;HTML/CSS任务没有元验证义务)。可以通过以下方式绕过 bypass_meta_validation_reason 对于非代码更改。

  3. 试运行验证 --在存储合约之前,会编译所有正则表达式模式,验证工作目录,并检查AST查询的平衡括号。无效的合同将立即被拒绝,并提供可操作的诊断。

  4. 拒绝合同审核 --即使是被拒绝的合同也会存储在数据库中以供审计,因此可以跟踪重复错误的模式。

安全和沙盒

服务器执行的命令通过三层安全模型进行严格验证:

  • 白名单: 安全命令(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模式以获得更好的并发读取性能,并使用外键约束以实现引用完整性。

许可证

麻省理工学院