关于 drift — mandate enforcement for AI agents
drift 是一个 MCP 服务,可在 AI Agent 执行操作前,将其与已签署的授权条件核对。它按固定顺序检查六类规则,但只作出是否允许的判断,不执行操作或验证签名。
主要功能
- 01检查金额和币种限制
- 02核对收款方与受众
- 03执行有效期限制
- 04按意图限制操作
- 05检查操作序列并生成报告
- 06按判定顺序解释规则
适用场景
- 01在 Agent 提交付款前进行检查
- 02防止收款方或币种被替换
- 03依据授权条件审查一系列操作
MCP 相关
drift 向 MCP 客户端提供 `drift_check`、`drift_session` 和 `drift_explain`。这些工具可将单项操作或操作序列与授权条件核对并解释规则,但不会执行操作或验证授权签名。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://drift.rta.lat/mcpclaude mcp add --transport http mrpkk-drift https://drift.rta.lat/mcp{"mcpServers":{"mrpkk-drift":{"type":"http","url":"https://drift.rta.lat/mcp"}}}在 Cursor 中打开{"servers":{"mrpkk-drift":{"type":"http","url":"https://drift.rta.lat/mcp"}}}在 VS Code 中打开{"mcpServers":{"mrpkk-drift":{"type":"http","url":"https://drift.rta.lat/mcp"}}}{"mcpServers":{"mrpkk-drift":{"serverUrl":"https://drift.rta.lat/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
3| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| action | object | 是 | 拟议操作。 |
| action.at | integer | 是 | 操作拟发生的时间,Unix 秒数。 |
| action.intent | string | 是 | Agent 声称自己正在执行的操作。不可信。 |
| action.audience | string | 是 | 付款将支付给的受众。 |
| action.currency | string | 是 | 此付款的 ISO-4217 代码。 |
| action.payee_id | string | 是 | Agent 即将使用的收款方。 |
| action.amount_minor | integer | 是 | 以最小货币单位表示的金额,与 max_amount_minor 使用相同的单位比例。 |
| mandate | object | 是 | 正在执行的已签署授权。请将其视为只读输入。 |
| mandate.audience | string | 是 | 授权中绑定的商户受众 URI。 |
| mandate.currency | string | 是 | ISO-4217 代码,例如 USD。 |
| mandate.payee_id | string | 是 | 授权中指定的确切收款方。 |
| mandate.valid_from | integer | 是 | 包含起始时刻,Unix 秒。 |
| mandate.valid_until | integer | 是 | 包含结束时刻,Unix 秒。 |
| mandate.allowed_intents | array | 是 | 允许的意图。留空表示允许任何意图。 |
| mandate.max_amount_minor | integer | 是 | 以最小货币单位表示的支出上限,例如 10000 = 100.00 USD。仅限整数。 |
详细介绍
drift
持续强制执行 AI Agent 的授权。 每项操作都会在发生之前,而不是仅在签署时,根据已签署的授权进行检查。
pip install drift # or: pip install -e .
python3 -m drift.http_server --http 8080
问题所在
Agent 获得一项授权:向谁付款、支付多少、使用哪种货币,以及授权有效期至何时。 AP2 仅在签署时验证一次授权。之后,Agent 便自行行动,不再有任何机制将其约束在授权范围内。
这件事确实重要,AP2 Python SDK 本身就提供了实测证据:
verify_chain documents:
"enforcing expected_aud / expected_nonce on the terminal hop when provided"
but kb_sd_jwt.verify calls verify_expected_claims only when typ in TYP_TERMINAL,
and a kb+sd-jwt+kb token — which the SDK itself produces whenever the payload
carries a cnf — falls into TYP_INTERMEDIATE:
hop type : kb+sd-jwt+kb
aud in token : https://attacker.example/ap2
expected_aud : https://honest-merchant.example/ap2
ACCEPTED a token with the wrong audience.
Agent 信任其管理支出权限的协议,却不会检查该权限是否被替换。drift 会检查。
检查内容
| # | 规则 | 可发现的问题 |
|---|---|---|
| 1 | amount | 超出限额——最常见的越权形式 |
| 2 | payee | 收款方错误 |
| 3 | audience | 付款被转给其他人 |
| 4 | currency | 货币被替换 |
| 5 | window | 超出有效期 |
| 6 | intent | 意图不在允许列表中 |
默认策略为拒绝。规则按固定顺序运行,因此拒绝时会指出最重要的原因,而不是偶然出现的问题。
MCP 工具
| 工具 | 用途 |
|---|---|
drift_check | 根据授权检查单项操作 |
drift_session | 检查一系列操作,并获取包含链指纹的报告 |
drift_explain | 按应用顺序展示规则 |
不使用 SSE,不使用有状态会话,也不使用 HTTP 框架。仅使用标准库。
示例
from drift import Mandate, Drift, Action
m = Mandate(
payee_id="shop", audience="https://merchant.example/ap2",
max_amount_minor=10_000, currency="USD",
valid_from=1_700_000_000, valid_until=1_700_086_400,
allowed_intents=("buy",),
)
d = Drift(m)
verdict, rule = d.submit(Action(
intent="buy", payee_id="shop", audience="https://merchant.example/ap2",
amount_minor=99_999, currency="USD", at=1_700_000_060,
))
print(verdict, rule) # DENY amount
明确说明限制
- 不会验证授权签名。 这是 AP2 的职责。drift 在签名验证之后,从决策层面进行检查。
- 不会执行操作。 它负责决策;调用方负责执行。
- 不保留状态。 会话作为参数传入。无状态意味着没有攻击面,也不会因复制部署而产生差异。
- 无法辨别真实情况与意图。
intent来自 Agent,是不可信输入。drift 会限制损害,但不会验证意图。
如果 Agent 同时控制 intent 和 amount,它可以在两者上撒谎。弥补这一缺口是
attest 的职责:attest 事后提供证明,drift 事前限制范围。两者相辅相成。
在你的 Agent 中使用
{
"mcpServers": {
"drift": { "url": "https://drift.rta.lat/mcp" }
}
}
我们的 Agent 就是通过这段代码调用此服务的。工具:drift_check(单项操作)、drift_session(一系列操作)、drift_explain(六条规则及其存在的原因)。每天免费检查 100 次,之后通过 x402 按次收费 $0.005。
许可证
Apache-2.0。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。