内容
# 🪞🔎🪪 镜像堆栈 - 单个 MCP 服务器
**整个 [镜像堆栈](https://github.com/mirror-stack) 的一个 MCP 服务器。** 安装一次,添加一个服务器,代理人拥有所有四个镜像:claims、actions、provenance 和 stack-level verify-all。
💬 **[讨论](https://github.com/orgs/mirror-stack/discussions)** — 问题 · 想法 · 独立复现 欢迎。
## 一次获取所有镜像
```bash
pip install git+https://github.com/mirror-stack/mirror-stack-mcp
```
单个安装会拉取 **measure-mirror + action-mirror + provenance-mirror** 作为依赖项 — 您不需要克隆四个仓库。(Apache-2.0,零依赖核心。)
## 添加一个 MCP 服务器
```json
{
"mcpServers": {
"mirror-stack": { "command": "mirror-stack-mcp" }
}
}
```
无需 `cwd`,无需 `PYTHONPATH` — 它是一个适当的已安装入口点。在 Claude Code、Cursor、Windsurf、任何 MCP 客户端中均可工作。
## 工具(18)
| 工具 | 镜像 | 功能 |
|---|---|---|
| `mm_preregister` | 🪞 claims | 在测量前密封声明 + 终止条件 |
| `mm_verify` | 🪞 | 伞形验证 — 每个探测器输入键都存在 |
| `mm_audit` | 🪞 | 审计结果与其密封注册 |
| `mm_power_check` | 🪞 | 假阴性防护 — n 是否足够大?(设计时) |
| `mm_falsifiability_check` | 🪞 | 波珀门槛 — 已注册的终止条件且未触发? |
| `mm_leakage_check` | 🪞 | 训练 ∩ 测试污染 |
| `mm_multiseed_check` | 🪞 | 不稳定信号 / 幸运种子 |
| `mm_retract` | 🪞 | 链式撤销(不能被静默删除) |
| `mm_anchor` | 🪞 | 防篡改快照,存储在账本外部(本地) |
| `mm_anchor_bitcoin` | 🪞⏱️ | **真实** 外部锚点 — 将账本头时间戳到比特币(OpenTimestamps) |
| `mm_anchor_upgrade` | 🪞⏱️ | 在日历提交后检索比特币区块证明(约 1-3 小时) |
| `mm_anchor_verify` | 🪞⏱️ | 通过公共区块浏览器验证比特币锚点 — **无需本地节点** |
| `mm_preflight` | 🪞 | GO/BLOCK 门控原始值 — 连接到计算启动器 / 预提交钩子 |
| `am_record` | 🪪 actions | 密封操作;`target=<claim_id>` 将其绑定到声明 |
| `am_witness` | 🪪 | 固定对等方的账本头(捕获整个文件替换) |
| `am_verify` | 🪪 | 验证操作账本的哈希链 |
| `pm_verify` | 🔎 provenance | 验证文件的溯源,跨 5 个信号 |
| `stack_verify_all` | 🪞🔎🪪 | 整个堆栈,一次调用:链(L1)+ 锚点(L3)+ 见证(L2) |
(通过 `mm_verify` 可以访问更细粒度的 `measure-mirror` 探测器 — 它会根据数据键进行调度。)
## 外部锚点:比特币(OpenTimestamps) ⏱️🔗
`mm_anchor` 编写一个 **本地** 快照 — 有用,但它仍然是 **您的** 文件。`mm_anchor_bitcoin` 将 L3 层升级为 **真正的外部时钟**:它将您的账本头时间戳到比特币区块链,通过 [OpenTimestamps](https://opentimestamps.org),因此任何人都可以证明您的记录在给定的区块之前存在 — 独立于您 *和* GitHub。
**诚实范围(这就是重点,所以我们明确说明):**
- ✅ **证明** 您的账本头在比特币区块时间之前存在 → 没有回溯,没有静默重写。
- ❌ **不证明** 内容是真实的(GIGO — 早期密封的谎言仍然是谎言)。
- ❌ **不** 调用外部 *判断* 见证(这是社会层,L2)。时钟现在运行,供验证者可能在以后到达。
这里的加密技术不会 *阻止* 不诚实 — 它使重写 **可检测**。
### 使用它
```bash
pip install "mirror-stack-mcp[bitcoin] @ git+https://github.com/mirror-stack/mirror-stack-mcp"
# (拉取 `ots` 命令行工具;需要网络才能访问公共 OpenTimestamps 日历)
```
然后,通过 MCP 工具(或调用它们的代理):
1. **时间戳** — `mm_anchor_bitcoin(ledger_paths=["/path/seara.jsonl", …], out_dir="…/anchors_ots")`
→ 构建清单,提交,返回 `state="pending"` + `.ots` 路径。
2. **升级** — 约 1-3 小时后,`mm_anchor_upgrade(ots_path)` → `state="bitcoin_confirmed"` + `block_height`。
3. **验证** — `mm_anchor_verify(ots_path)` 交叉检查公共浏览器上的区块的默克尔根(默认为 blockstream.info)— **无需比特币节点** — 并返回是否匹配。
任何人都可以独立重新检查:`curl https://blockstream.info/api/block-height/<height>`。
参见 **[docs/ANCHORING.md](docs/ANCHORING.md)** 获取完整的操作指南、命令行工具的备用方案和 L1 / L2 / L3 模型。
## 纪律与工具同行
当代理连接时,服务器通过 MCP `instructions` 握手注入一个紧凑的 **诚实测量纪律** — 因此方法论 *与* 工具一起到达,而不是作为单独的文档,供某人查找。它带有最重要的一个规则:**将工具与您的判断分开** — 只有当探测器返回您引用的发现时,才说“mm 标记 X”;当它是您的推理时,说“应用纪律,我怀疑 X”。另外:计算前密封(预注册 + 终止条件),花费前进行权力检查,报告前进行验证,以及“缺少的账本本身就是一个信号”。
(显示服务器指令的 MCP 客户端 — 例如 Claude Code — 在连接时显示。这是指导,而不是强制:硬保证仍然是链 + 见证,而不是提示。)
### 每次节拍的提醒(可配置)
连接时的指令会在长时间会话后逐渐消失,因此服务器也会在 **关键时刻** 重新植入纪律 — 在相关工具的结果中追加一行提醒。`mm_preregister` → “**结果** 也必须密封,而不仅仅是文字”;`mm_verify` / `mm_audit` / `stack_verify_all` → 在您声明一个数字 **之前** 的检查清单(语言规则,双向,范围,密封否定);`am_record`,`mm_retract`,`mm_power_check`,`mm_falsifiability_check` → 它们自己的单行注释。它在密封/验证/发布节拍处触发,而不是每次调用 — 一个提示,而不是噪音。
使用 `MIRROR_REMINDERS` 环境变量控制它:
| 值 | 行为 |
|---|---|
| `once` *(默认)* | 每个会话中只追加每个提醒一次 |
| `all` | 在每次相关调用时追加提醒 |
| `off` | 永远不追加 |
`once` 是默认设置,因此长时间循环不会为同一个提醒重复付费(上下文卫生)。按服务器覆盖:
```json
{ "mcpServers": { "mirror-stack": {
"command": "mirror-stack-mcp",
"env": { "MIRROR_REMINDERS": "all" }
} } }
```
### 输出压缩(循环上下文卫生)
验证输出在循环迭代中累积 — 上下文腐烂 + 成本。服务器 **不隐藏信号** 而压缩它:`OK`/`INFO` 发现折叠为一行摘要,而每个 **`WARN`/`FAIL` 都保留原样** (丢失负面结果将破坏整个目的)。
| `MIRROR_VERBOSITY` | 行为 |
|---|---|
| `compact` *(默认)* | `✓ N 检查(s)OK:…` + 每个 WARN/FAIL 全部保留 |
| `full` | 每个发现全部保留 |
每个调用的压缩是服务器的工作;跨迭代总结运行日志是循环/框架的工作 — 服务器对每个调用都是无状态的。
### 硬门控:计算前密封/发布前密封(可选)
提醒是 **软** 的。对于 **硬** 门控,`mm_preflight` 返回一个 GO/BLOCK 决策,您可以将其连接到操作站点:
- `mm_preflight(ledger, claim_id, gate="compute")` → **BLOCK** 除非密封了一个具有终止条件的预注册。将其连接到您的训练/实验启动器,以便它拒绝在未密封的声明上花费计算资源。
- `mm_preflight(ledger, claim_id, gate="publish", am_ledger=…)` → **BLOCK** 除非结果也被密封(撤销,或 `am_record(target=claim_id)`)。将其连接到预提交/预发布钩子,以便未解决的声明无法发布。
MCP 仅 *判断* GO/BLOCK — **您的** 启动器/钩子执行实际的阻止。服务器无法拦截外部计算或提交,这是设计使然:纪律是可选的(缺少的账本本身就是一个信号),而不是通道强制的。
**强制程序随软件包一起提供。** `mm_preflight` 做出判断;`mirror-stack-gate` 命令行工具是实际退出非零的部分,因此 shell 可以执行 MCP 无法执行的阻止:
```bash
mirror-stack-gate compute --ledger L.jsonl --claim my_claim && python run.py
# 除非密封了一个具有终止条件的预注册,否则退出 1(run.py 永远不会启动)
mirror-stack-gate publish --ledger L.jsonl --claim my_claim --am-ledger A.jsonl
# 除非结果也被密封(撤销或 am_record(target=claim)),否则退出 1
```
对于 git,请在 [`hooks/pre-commit.sample`](hooks/pre-commit.sample) 中插入:它运行发布门控,因此在声明解决之前无法提交结果。命令行工具和 MCP 工具共享一个 `decide()`(`gate.py`),因此它们永远不会分开。
## 为什么这是可靠的
防篡改来自 **哈希链 + 外部见证**,而不是来自 MCP 通道 — 因此在 MCP 上公开操作账本是可以的:编辑仍然会破坏链。这个服务器使诚实 **容易证明**;它不(也不能)防止一个代理简单地从不记录。
参见 **[堆栈保证的内容 — 以及它不能保证的内容](https://github.com/bhyi4/measure-mirror/blob/main/stack/PILLARS.md)** (四个支柱:完整性 · 不擦除 · 可证伪性 · 可验证性),以及 [镜像堆栈约定 + 案例研究](https://github.com/bhyi4/measure-mirror/tree/main/stack)。