agent 接入 · 原生 MCP
流利不是证据。这是它底下要垫的那份记录。
软件按领域分了家:一套做人力,一套做营销,一套做财务。AI 正在以同样的方式分家。凡是答错要付钱的地方,模型就需要一份它能引用的记录。监管是这道缝咬得最狠的地方——一个自信的错答案,代价是一张牌照。
为什么通用模型在这里必然失手
语言模型在监管问题上失手,不是因为它推理得差,而是因为它没有可推理的对象。它转述的那段条文,可能在它训练之后就改了,而它无从知道。
这不是一个靠更大的模型能修好的问题,因为缺的不是能力,是地面真值:一份带日期、带出处、说得出自己什么时候会过期的记录。CBSR 就是那份记录,并且它是以 agent 能读的形式发布的,而不是以人能读的形式再指望 agent 去猜。
接地契约
一个接地的答案必须携带的字段
下面是 compose() 对一条通道返回的东西。值得看的不是结论,而是结论周围那一圈:结论旁边的每一个字段,都是为了让这个结论可以在以后被证明是错的。
// compose(origin="EU", destination="US", as_of="2026-08-20") { "corridor": "EU>US", "class": "T", // regime in transition "mechanism": "commencement_pending", "binding_at": "destination_inbound_gate", "provision": "GENIUS Act §18", "status": "enacted_not_commenced", // NOT citable as current law "resolves_on": "2027-01-18", "resolves_to": "II", "claim_class": "tier1_legal", "evidence_tier": "resolution_text", "as_of": "2026-08-20", "register": "v0.11.0", "doi": "10.5281/zenodo.20730358" }
字段名以登记册 schema 为准,此处为示意结构。status 是独立字段而非散文附注——正因如此,一部已通过尚未施行的法规,无法被当作现行有效法引用。
没有 as_of,就没有过期
一个没有日期的答案永远不会过期,也就永远不会被证明错了。这不是保守,这是不可证伪。
没有 provision,就无法反驳
「依据 MiCA」不是引用,「MiCA 第 X 条」才是。精确定位是让对方能回到原文说你读错了的那个东西。
没有 status,「尚未施行」会被读成「已经生效」
这是通用模型最常犯的那一类错,而且它每次都答得很有把握。这里它是一个具名状态,不是一句语气词。
没有版本,事后无法复盘
登记册按构造带日期,所以省略版本的引用等于没引用。每个版本存档至 Zenodo,可以取回当时那一份。
MCP 界面
40 个类型化工具,覆盖同一份记录
登记册以单一 dataset.json 发布,外加一个把它暴露给 agent 的 MCP server。工具是类型化的:参数受 schema 约束,返回值也是,所以模型拿到的是结构,而不是一段需要它再解析一次的散文。
| 工具族 | agent 用它做什么 | 返回的关键字段 |
|---|---|---|
| compose() | 就一条有向边求解:起点 → 目的地,读在给定日期上。这是最常被调用的那一个。 | class · mechanism · provision · as_of |
| compose(as_of=…) | 同一条边,读在另一个日期上。已排期的施行会被施加,所以「今天不行、某天可以」是一个可计算的结论,不是一句预测。 | resolves_on · resolves_to · trigger |
| citable_law() | 只返回通过全部六轴门槛、可以作为现行有效约束性法律引用的严格子集。结构候选不会被混入返回值。 | 0 条严格记录 · 46 条结构候选 |
| 法域查询 | 就单一法域取回全部维度:发行、赎回、储备、投资者门槛、反洗钱、跨境等。 | 15 dimensions · per-record sourcing |
| 维度比较 | 就单一维度横切全部法域。这是「谁禁止付息、谁不禁止」这类问题的形状。 | 12 jurisdictions · comparability notes |
| 待核清单 | 取回尚未通过完整可引用门槛的格子。缺口是可查询的数据,不是一句免责声明。 | per-cell worklist · what is missing |
工具清单以仓库为准
上表按功能分族,不是签名清单。权威的工具名称、参数与返回结构在登记册仓库的 MCP_SERVER.md 里,并随版本更新。以那里为准,不要以本页为准。
它防住的四种失败
四种失败,一个无接地的模型自己躲不开
这四种不是「幻觉」的四个别名。它们是四种不同的机制,各自需要数据侧的一个不同装置去挡,而且每一种在无接地的情况下都读起来完全正常。
把尚未施行的法律当作现行有效法
模型读到一部已通过的法规,据此描述一条今天并不存在的申请路径。挡它的装置:status 是独立字段,且构建流程拒绝把 enacted_not_commenced 的记录放进可引用子集。
把有向的问题答成无向的
模型给出「欧盟与美国之间」的结论,而绑定规则其实在目的地那一侧。挡它的装置:数据集的基本单位是有向边,本登记册 66 组配对里有 56 组会因方向不同而读出不同结论。
把市场事实说成法律命题
「主要发行方通常这样做」被写成了「规则要求这样做」。挡它的装置:claim_class 把两者分开,而律师看到的那个界面里不允许出现市场事实。
给出一个不带日期、因而无法过期的答案
回答本身没有错,但它没有说自己读的是哪一天的法律,于是六个月后没人知道它还成不成立。挡它的装置:每条结论携带 as_of 与登记册版本,两者都进返回值。
这四种里没有一种是靠提示词能修好的。它们全都要求模型手上有一份它没有的东西:一份带日期、说得出出处、并且承认自己有哪些格子还没核完的记录。
怎么接上去
没有账号,没有密钥,没有速率表。代码 Apache-2.0,数据 CC-BY-4.0,自己跑自己的那一份。
固定一个版本
从 Zenodo 取一个带 DOI 的版本,而不是跟着 main 走。你希望半年后还能复现出当时那个答案;跟着分支走做不到这一点。
把 MCP server 挂进你的 agent
按 MCP_SERVER.md 里的配置接入。工具是类型化的,所以模型拿到的是结构化返回,不需要再从散文里抽字段。
要求答案携带信封
在系统提示里规定:任何监管结论都必须带 provision、status、as_of 和版本;缺任何一项就退回工具调用,而不是补一句「据我所知」。
对着待核清单做降级
被问到一个尚未通过完整可引用门槛的格子时,正确的行为是说出它属于待核清单,而不是把制度层级的确认当成条文层级的确认往上抬。