Skip to main content
Glama

crs-mcp

ci MCP status License

编写补丁的智能体无法给自己的作业打分。

立即试用,无需安装: 打开浏览器演示 并点击 加载一个伪造品 —— 检查器会在客户端拒绝它。

一个 MCP 服务器,为 AI 编码智能体提供一个它们无法绕过的判定表面。智能体提出一个防护;本工具决定该防护是否真正可靠,并在不可靠时返回一个具体的反例。

pip install "crs-mcp@git+https://github.com/nickharris808/crs-mcp@main"

预发布版本。 PyPI 名称已保留,即将发布;在此之前,上面一行是有效的安装方式。已在 CI 中针对 Linux、macOS 和 Windows 进行测试。

30 秒快速入门

将其添加到 Claude Desktop(claude_desktop_config.json)或 Cursor:

{
  "mcpServers": {
    "crs": {
      "command": "crs-mcp"
    }
  }
}

然后询问你的智能体:"我在这次读取之前添加了一个边界检查 1 + payload <= record_len。请根据 3 + payload <= record_len 对其进行认证。"

{
  "verdict": "PROVEN_UNSOUND",
  "summary": "The guard admits 509 state(s) the safety property forbids (out of 65,536). Example: {'record_len': 1, 'payload': 0}.",
  "detail": {
    "over_acceptance": 509,
    "box_volume": 65536,
    "counterexample": {"record_len": 1, "payload": 0},
    "hit_probability": 0.0077667236328125,
    "expected_draws_to_hit": 128.75442043222003
  }
}

这是一个真实的反例:在 payload=0, record_len=1 时,防护通过而安全属性不成立。智能体无法反驳它,你也不能。

Related MCP server: Chiasmus

三种判定

判定

含义

CERTIFIED

在整个声明的盒子上,不允许任何禁止状态。

PROVEN_UNSOUND

至少有一个——并附带一个具体的反例。

OUT_OF_SCOPE

盒子太大,无法通过枚举判定。未得出任何判定。

OUT_OF_SCOPE 是重要的一种。它不是失败,也绝对不是通过。智能体会将"无错误"解读为"已批准"并提交;工具描述旨在对抗这种解读,explain_refusal 返回的散文明确写着 "不要将此视为批准"。一个只返回绿色的工具比没有工具更糟糕。

工具

工具

用途

certify_guard

该防护在声明的盒子上是否可靠,以及可靠程度如何?

decide_guard

相同的判定,但不计数——在不可靠的防护上快得多

count_exploitability

确切有多少状态逃逸,以及一个示例

verify_certificate

重新检查 certkit 证书,而不信任其生产者

explain_refusal

将判定转化为散文,包括它确立的内容

verify_certificate 额外返回 certificate_verdict,即 certkit 自身的 ACCEPTED / REFUSED / UNVERIFIED未能通过检查的证书被报告为 OUT_OF_SCOPE,绝不会是 PROVEN_UNSOUND:糟糕的证明是证据的缺失,而不是不可靠的证据。只有计数状态才能证明防护不可靠,这正是 certify_guard 所做的。

decide_guard:更早得到相同答案

大多数时候,智能体问的是 这安全吗?,而不是 有多不安全?decide_guard 在第一个逃逸状态处停止,而不是计数整个区域。在一个不可靠的防护上测量:

盒子

certify_guard(计数)

decide_guard(首个见证)

倍数

payload=0:255, record_len=0:255

0.15 ms

0.0131 ms

11x

payload=0:4095, record_len=0:4095

2.29 ms

0.0134 ms

171x

payload=0:65535, record_len=0:65535

36.72 ms

0.0129 ms

2,843x

使用 exploit-counter 仓库中的 python benchmarks/decide_vs_count.py 重新生成,计数发生在该仓库中。差距随盒子增大而增大,因为计数枚举了整个违规区域,而判定在第一个逃逸状态处停止。

判定结果相同——一个测试断言它们在 150 个随机规格上一致。可靠的防护无论哪种方式成本相同,因为完整枚举确实是确立可靠性所必需的。

结果携带 over_acceptance 字段。没有计数任何内容,因此在那里报告一个数字(即使是零)将是分析未产生的数字。

它如何判定,以及诚实的限制

认证通过穷举整数计数在您声明的盒子上进行。这对该盒子是可靠且完备的——并且对盒子之外一无所知,这就是为什么盒子是必需参数而不是从上下文推断出来的。

计数器枚举除最宽变量之外的每个变量,最宽变量以闭式求解。因此成本是其他范围的乘积,上限适用于该乘积——而不是盒子体积。限制为 500,000 个枚举点。在本机上测量:

盒子

体积

枚举数

判定

时间

payload=0:255, record_len=0:255

65,536

256

CERTIFIED

0 ms

payload=0:65535, record_len=0:65535

4,294,967,296

65,536

CERTIFIED

30 ms

payload=0:499999, record_len=0:10^9

5.0 × 10^14

500,000

CERTIFIED

227 ms

payload=0:500000, record_len=0:10^9

5.0 × 10^14

500,001

OUT_OF_SCOPE

0 ms

三个变量,0:699 每个

343,000,000

490,000

CERTIFIED

212 ms

三个变量,0:800 每个

513,922,401

641,601

OUT_OF_SCOPE

0 ms

毫秒列来自一台机器,在您的机器上会有所不同;python benchmarks/ceiling.py 将在您的机器上重新生成此表。体积、枚举数和判定是精确且与机器无关的。

上限内的每个判定都在四分之一秒内完成,因此智能体调用不会停滞。以前并非如此:对最坏情况的分析显示约 70% 的时间花在 Python 的 Fraction 类型上,因此 exploit-counter 现在在每项系数都是整数(每个边界关系都是)时运行纯整数内循环。整数是有理数的子集,因此这是相同的算术——而不是更快的近似——test_integer_and_rational_paths_agree 检查两个实现是否一致。

在最密集的形状上,1,491.2 ms → 244.6 ms;在所有三个测量形状中,中位数为 6.06x,观察到 3.55x–10.25x。每个形状进行十一次配对重复,每次计数位相同。使用 make bench-fast-path 重新生成;数字来自已提交的 artifacts/crs/bench_fast_path.json,而不是此页面。引用中位数——范围随机器负载和问题形状而变化,因此窄带将是误导性的数字。

使用 python benchmarks/ceiling.py 重现——该脚本生成此表,上述数字是其真实输出。计时取决于机器;判定和枚举数则不是。

有两个后果值得明确说明,因为它们是人们猜错的地方——也因为本 README 的早期版本两者都错了:

  • 跨越完整 2^32 的双变量盒子被判定,在不到半秒内。本 README 之前声称它会被拒绝。

  • 缩小最宽变量没有帮助。 它已经是自由的。如果您得到 OUT_OF_SCOPE,请缩小其他变量之一;拒绝消息会指出哪个变量是自由的。

三个或更多变量中判定完整的 32 位域需要不枚举的决策过程——一种无求解器的消元方法,带有可重放的证书。该过程不是本包的一部分。 此层级为您提供可枚举盒子上的真实判定,以及无法枚举盒子上的诚实拒绝。

如果您需要对完整机器字域进行判定,那是商业产品。

工具拒绝回答的内容

只有当问题可能以另一种方式出现时,判定才有价值。以下输入被拒绝为 OUT_OF_SCOPE 而不是回答:

输入

拒绝原因

包含一个点的盒子,例如 {"p": [0,0], "r": [0,0]}

无论防护多么不可靠,那里"未发现逃逸"都是真的。

反向范围,例如 {"p": [10,2]}

盒子为空,因此零计数是空洞的。

命名盒子未声明的变量的原子

该变量无界;它过去会引发 KeyError

无法解析的防护或安全原子

格式错误的输入是带原因的拒绝,绝不是回溯。

每个拒绝都指出违规变量并说明要更改什么。

从 Python 使用

工具层与传输无关,因此您可以在没有 MCP 的情况下调用它:

from crs_mcp import certify_guard

v = certify_guard(
    domain=[{"coeff": {"payload": -1}}, {"coeff": {"payload": 1}, "const": -255}],
    guard=[{"coeff": {"payload": 1, "record_len": -1}, "const": 19}],
    safety=[{"coeff": {"payload": 1, "record_len": -1}, "const": 3}],
    box={"payload": [0, 255], "record_len": [0, 255]},
)
print(v.verdict)  # CERTIFIED

原子接受普通整数(模型可能产生的)或磁盘上 certkit 格式的 [分子, 分母] 对。

不在 MCP 上?工具仍然有效

MCP 是本包围绕构建的传输,但工具只是接受 JSON 并返回 JSON 的函数。它们不需要框架——甚至不需要服务器:

from crs_mcp import call, openai_tools, anthropic_tools, json_schemas

call("decide_guard", {"guard": [...], "safety": [...], "box": {...}})   # run one, no server
openai_tools()       # OpenAI function-calling schema, for `tools=`
anthropic_tools()    # Anthropic tool-use schema (input_schema, not parameters)
json_schemas()       # standalone JSON Schema documents, one per tool
python -m crs_mcp.adapters anthropic > tools.json    # paste into an agent config

LangChain 用户获得 crs_mcp.adapters.langchain_tools()。LangChain 不是本包的依赖项;该函数在调用时导入它,如果缺失则引发带有安装说明的异常,而不是静默返回部分集成。

所有这些都从一个目录(crs_mcp.catalog)生成,该目录不导入标准库之外的任何内容——模式过去位于 MCP 服务器模块内部,因此除非安装了 mcp,否则无法访问。

描述是承重的。 每个描述都说明判定确立什么,因为将 OUT_OF_SCOPE 读作"未发现问题"的智能体会合并不安全的代码。一个丢弃这些句子但保留名称和模式的适配器看起来完全正确,因此存在 check_descriptions_intact(),并且每个适配器的输出都针对它进行测试。没有适配器将 OUT_OF_SCOPE 映射为布尔值、分数或通过。

支持的 MCP 版本

已验证 mcp 1.9.0 至 1.29.0,并固定为 >=1.9.0,<2.0.0

mcp 2.0.0 更改了服务器装饰器 API(Server.list_tools 不再存在),尚未支持——CI 在 2.0.0 发布当天捕获了这一点。2.x 支持被跟踪为未来工作,而不是在此声明。

范围

  • 仅限线性整数算术。 非线性项、堆形状和别名不在片段内。工具不会假装不是。

  • 计数是可触发性的,不是严重性。 它限制了在均匀采样下禁止状态的可达性。它不是 CVSS,也不是可利用性声明。

  • CERTIFIED 限于盒子。 它是真实域上的真实证明,并且对该域之外的一切保持沉默。

相关

测试

pip install -e ".[dev]"
pytest

252 个测试。test_tools.py 覆盖判定语义;test_server.py 通过已注册的处理程序执行真实的 tools/listtools/call 往返调用,因为一个工具函数完美但处理程序注册错误的服务器,会在另一个文件的每个测试中都通过。

test_adversarial.py 包含最重要的那些测试。它的判定基准只有一句话——任何输入都不得产生一个看起来自信但实际错误的答案——并且它专门攻击 CERTIFIED,因为那是智能体读作"已批准,提交它"的词。它还承载着差分测试:certkitexploit-counter 是同一问题的两个独立实现(理性反驳算术 vs. 整数枚举),并且两者都在每个输入上与暴力破解交叉验证。它们之间的分歧意味着出错的那一方存在健全性缺陷。

文档

SCOPE.md

每个判定确立了什么,以及它没有确立什么

benchmarks/ceiling.py

重新生成上面的决策上限表

certkit 的 TUTORIAL

端到端的完整示例

certkit 的 TROUBLESHOOTING

工具包中的每一个错误字符串

工具包的其余部分

certkit

证书格式和独立检查器

exploit-counter

如果防护不健全,恰好有多少状态逃逸

crs-mcp

AI 编码智能体通过 MCP 调用的判定表面

soundnessbench

为上述所有内容评分的基准

certkit-action

在你的 CI 中运行检查

pytest-mutation-verified

证明你的回归测试确实能够失败

cve-proof-corpus

六个带有机器可验证证明的真实 CVE

在浏览器中试用

无需安装;观看伪造被拒绝


封闭核心

这些包是检查那一半。它们刻意不包含证明搜索,这正是它们小到足以被审计的原因——这也意味着上游必须有东西来产生证书。

对于覆盖完整机器字域的义务,枚举无法扩展,因此需要一种不枚举的判定过程:无求解器消元,发出可重放的证书。那个引擎、从反驳中推导出最小防护的修复合成器,以及驱动它们的进化搜索在本仓库中,可商业获取。

这种划分是刻意的、永久的。检查器是免费的,而且永远免费——一个你无法独立验证的证书毫无价值,所以对验证收费会破坏这种格式。需要花钱的是大规模地产生证书。

许可证

客户端和工具层采用 Apache-2.0。

快速路径数据是如何得出的

上面引用的加速是 6.06x 中位数,观测范围 3.55x–10.25x,每种形状 11 次配对重复。它之所以达到这个数字,是因为先错了两次,而记录就保留在这里——在结果下方,想要审计这个数字的读者可以找到它,而不是放在数字本身前面。

  • 已撤回——6.18x。 样本太小,不足以支撑与之一起引用的区间。

  • 2026-07-31 更正——2026-07-30 的更正本身没有依据。 之前于 2026-07-30 发布的数字(1,698.7 ms -> 245.7 ms,中位数 6.82x(范围 6.65-6.98x)7 次配对重复)不出现在任何产物中,而且算术对不上: 1,698.7 / 245.7 = 6.91,不是 6.82。引用的区间也比每个测量到的形状更窄——与被取代的 6.18x 数字所携带的 n 太小错误相同。

  • 当前数字是 make bench-fast-pathartifacts/crs/bench_fast_path.json)的已提交输出:每种形状 11 次配对重复,每次重复计数逐位相同,区间引用自实际观测到的数据,而不是其中的子集。

由此得出的规则是:本仓库中的性能声明必须能由已提交的测试工具重新生成,区间必须来自测量结果,而不是来自最好的几个数据点。

许可证、引用、贡献

Apache-2.0(LICENSE)。如果你在发表的工作中使用它,CITATION.cff 中有机器可读的引用元数据——GitHub 的"引用此仓库"按钮会读取它。

  • CONTRIBUTING.md — 内部规则,以及变更不得破坏的一个不变量。

  • ARCHITECTURE.md — 模块图和信任边界所在的位置。

  • TROUBLESHOOTING.md — 与它实际打印的错误消息对应。

  • SECURITY.md — 一个接受错误内容的检查器是这里最严重的严重性等级。


认证发现 的一部分——十个基于同一个不对称性构建的产物:检查证明是廉价且可审计的,因此产生证明的那个东西不必被信任。

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that gives LLMs access to formal verification via Z3 and SWI-Prolog, plus tree-sitter-based source code analysis. Translates natural language problems into formal logic using a template-based pipeline, verifies results with mathematical certainty, and analyzes call graphs for reachability, dead code, and impact analysis.
    79
    210
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for fts-gate. It enables verification of FTS executable specifications through proof-carrying checks, exposing tools to run gate checks (fts_gate_check) and list available morphisms (fts_morphisms_list), with rejection of invalid proofs via structural logical fallacy detection.
    BSD 2-Clause "Simplified"
  • A
    license
    Not graded
    quality
    B
    maintenance
    A verification infrastructure and MCP server that specializes in refutation (negation) rather than generation, providing tools for counterexample search, Lean verification, and audit chains with a 4-value verdict system.
    MIT