mcpField
O
openttt-pot

openttt-pot

本地服务
github.com/Helm-Protocol安全13 周前更新

关于 openttt-pot

openttt-pot 是用于记录和恢复带密码学时间戳的工作流事件的 MCP 服务,面向需要在上下文压缩后保留历史的 Claude Code 工作流。它将事件连接成可验证的因果链。

主要功能

  1. 01Ed25519 签名时间证明
  2. 02按事件精确查询
  3. 03遍历因果事件图
  4. 04压缩工作流检查点
  5. 05验证 PoT 记录

适用场景

  1. 01上下文压缩后恢复步骤
  2. 02追踪多个 Agent 的决策
  3. 03验证带时间戳的事件记录

MCP 相关

它向 MCP 客户端提供 `pot_generate`、`pot_query`、`pot_graph` 和验证工具,用于记录、检索、遍历和验证 Proof-of-Time 工作流记录。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"helm-protocol-openttt-pot": {
"command": "npx",
"args": [
"-y",
"@helm-protocol/ttt-mcp"
]
}
}
}
启动命令npx -y @helm-protocol/ttt-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@helm-protocol/ttt-mcp0.3.4

工具

8

收录的工具列表 · 更新于 2 周前

参数类型必填说明
ctxIdstring否draft-08 §3.3 上下文标识符(Commitment 的域分隔符)。省略时默认为固定的服务器值;MAY 为公开值。
txHashstring否交易哈希(DeFi,带 0x 前缀的十六进制值)
chainIdnumber否EVM 链 ID(DeFi,例如,Base 的 ID 为 8453)
eventIdstring否工作流步骤标识符(Claude Code)。例如:'refactor_auth_step1'
poolAddressstring否DEX 池合约地址(DeFi)
prevEventIdstring否上一步的 eventId——将步骤关联成因果链
contentDigeststring否此记录所证明内容的 SHA-256 摘要(小写十六进制,64 个字符)。由调用方计算,服务器永远不会看到内容本身。提供此值后,如果本地时间合成满足 draft-08 自身的要求(>=3 个独立来源、可表示的误差界限),响应除通常的 potHash 字段外,还会包含符合规范的 potRecordV08 二进制记录(十六进制编码);否则 potRecordV08Error 会说明无法生成的原因。

详细介绍

@helm-protocol/ttt-mcp

draft-helmprotocol-tttps 的参考实现(IETF Experimental)

时间证明(Proof-of-Time)证明——Ed25519 签名时间戳,结合多源佐证和明确的误差界。IETF draft-helmprotocol-tttps


欧盟《人工智能法案》第 50 条——AI 生成内容透明度

TTTPS 可在 AI 生成内容创建时为其提供加密时间来源证明。pot_generate 调用会将防篡改时间戳锚定到内容记录的加密哈希,不受任何嵌入式元数据影响。

与 C2PA 互补:在重新采集、转码和格式转换过程中,C2PA 元数据会被剥离。TTTPS 作为外部锚点独立保留,无需元数据链连续性即可验证;即使嵌入式标记缺失,也能重建内容来源的取证记录。

从设计上兼容 GDPR:PoT 记录不包含内容或个人标识符。每条记录都将加密哈希(SHA-256 + HMAC-SHA256)与多源时间证明绑定。任何明文内容都不会经由 Helm 服务传输或存储。

IETF 规范:draft-helmprotocol-tttps(ISE track)。联系邮箱:[email protected]。


问题:工作流失忆

每个 Claude Code 长周期工作流都会遇到同一个障碍:上下文压缩会抹除操作历史。

Agent B 不知道 Agent A 做出了什么决定。Agent A 在压缩后恢复时,也没有自身此前步骤的记录。导致重复工作、决策丢失和状态损坏。

ttt-mcp 是能在上下文压缩后继续保留的外部因果链。

每个工作流步骤都会锚定到外部服务上的加密时间戳中,该服务与 Claude 的上下文窗口在物理上彼此独立。发生压缩后,Agent 可调用 pot_query(eventId),以 O(1) 时间精确回忆步骤,并在完整因果上下文中恢复工作。

Claude workflow → [context compressed] → agents call pot_query(eventId)
                                         → external server returns full timeline
                                         → workflow resumes, zero lost state

数学保证

层级机制保证
身份SHA-3 eventId(256 位)碰撞概率为 2⁻²⁵⁶,实际可视为零
查找O(1) 精确检索重建历史不会消耗上下文
排序TTTPS 因果时间戳事件具有全序——可防篡改的序列证明
因果链prevEventId DAGO(depth) 遍历——对于 1B-token 工作流,深度约为 100
不可否认性Ed25519 签名对谁在何时执行操作的加密证明
韧性纠删码加密分片BER=0.05 时恢复率 ≥97%,BER=0.02 时为 99.88%(理论值)
持久性Redis AOF + 90 天 TTL服务在上下文压缩和重启后仍可运行

快速开始

Claude Code
claude mcp add ttt -- npx -y @helm-protocol/[email protected]

使用 API 密钥(可将免费额度提升至套餐的月度限额):

claude mcp add ttt -e TTT_API_KEY=your-key -- npx -y @helm-protocol/[email protected]
Claude Desktop

添加到 claude_desktop_config.json:

{
  "mcpServers": {
    "ttt": {
      "command": "npx",
      "args": ["-y", "@helm-protocol/[email protected]"],
      "env": { "TTT_API_KEY": "your-key" }
    }
  }
}
Cursor

添加到 Cursor

一键安装,或将上方相同的 mcpServers 块添加到 .cursor/mcp.json。

免费层级:每个 IP 每天 100 次调用,无需注册。


5 分钟测试

连接后,在 Claude 中按以下顺序操作:

步骤 1 — 为工作流步骤添加时间戳:

只需自然地告诉 Claude:

“将此步骤标记为 my-first-step” “将我刚才执行的操作记录为 refactor-auth-step1”

Claude 会自动调用 pot_generate。也可以直接调用:

pot_generate(eventId: "my-first-step")

步骤 2 — 模拟上下文压缩: 开始一个新的 Claude 会话

步骤 3 — 在新会话中恢复:

告诉 Claude:

“我在 my-first-step 中做了什么?” “恢复我最近的工作流状态”

也可以直接调用:

pot_query(eventId: "my-first-step")

→ 返回精确记录。遗忘问题就此解决。

步骤 4 — 构建因果链:

pot_generate(eventId: "step-2", prevEventId: "my-first-step")
pot_graph(eventId: "step-2", depth: 5)

→ 完整的反向链。按密码学顺序排列。


10 个工具

工具用途
pot_generate使用密码学时间戳标记工作流步骤
pot_verify验证 PoT 签名
pot_generate_v2生成 draft-11 180-octet PoT Record v2 核心(规范线缆配置文件)
pot_verify_v2验证 v2 记录;可选的 TLS 1.3 导出器绑定证明(无 TLS 时会安全失败)
pot_verify_v08验证 draft-08 §3 Payload Digest 记录
pot_query根据 eventId 进行 O(1) 精确查找——遗忘恢复核心功能
pot_graph遍历因果 DAG(反向 + 正向链)
pot_checkpoint将事件汇总为压缩摘要——每约 100 个事件或长任务开始前使用
pot_stats服务统计信息和模式状态
pot_health健康检查

工具参数

pot_generate

使用密码学时间戳标记工作流步骤。对于 Claude Code:使用 eventId + prevEventId。对于 DeFi:使用 txHash + chainId + poolAddress。若要将证明绑定到特定内容(draft-08 §3 Payload Digest),还需提供 contentDigest。eventId、txHash 或 contentDigest 中必须提供一个。

参数类型必填描述
eventIdstring二选一工作流步骤标识符。例如:"refactor_auth_step1"
prevEventIdstring否上一步的 eventId——将步骤关联成因果链
txHashstring二选一交易哈希(DeFi,带 0x 前缀的十六进制值)
chainIdnumber否EVM 链 ID(DeFi)
poolAddressstring否DEX 池合约地址(DeFi)
contentDigeststring二选一本记录所证明内容的 SHA-256 摘要(小写十六进制,64 个字符)。由调用方计算——服务不会看到内容。当本地时间合成满足 draft-08 自身要求(≥3 个独立来源、可表示的误差界限)时,响应会包含符合规范的 potRecordV08 二进制记录(十六进制);否则,potRecordV08Error 会说明原因。
ctxIdstring否draft-08 §3.3 上下文标识符(Commitment 域分隔符,最多 255 个 octet)。默认为固定的服务端值;可以公开。
pot_verify_v08

验证由 pot_generate 的 potRecordV08 字段生成的 draft-08 §3 记录:重新计算 Commitment、检查 Ed25519 签名;如果提供了 content,则检查其是否与记录的 Payload Digest 匹配。

参数类型必填描述
potRecordV08string是十六进制编码的 184 或 216 字节记录
ctxIdstring否必须与 pot_generate 使用的值匹配,否则验证失败
issuerPubKeystring否十六进制编码的 32 字节原始 Ed25519 公钥。默认为此服务自己的密钥。
contentstring否要与记录的 Payload Digest 字段进行匹配的载荷
clientIdstring当 TTTPS_REQUIRE_REPLAY_LEDGER=1 时必填用于重放键的稳定调用方身份
sessionIdstring当 TTTPS_REQUIRE_REPLAY_LEDGER=1 时必填用于重放键的活动传输/会话标识符

当 TTTPS_REQUIRE_V08_FRESHNESS=1 时,必须将 TTTPS_V08_MAX_SKEW_NS 设为非负整数。验证器会拒绝超出 maxSkewNs + errorBoundUs 范围的记录。当 TTTPS_REQUIRE_REPLAY_LEDGER=1 时,成功验证会在 Redis 中以 90 天 TTL 原子地认领 clientId/sessionId/nonce;Redis 故障或重复认领都会被拒绝。这些标志是故障时拒绝访问的控制项。

当前的 MCP 规范线格式配置文件为 draft-11 PoT Record v2(180 字节)。pot_generate_v2 和 pot_verify_v2 实现固定核心记录,包括对字节 0-79 的 SHA-256 完整性校验,以及对字节 0-115 的 Ed25519 签发方身份验证。draft-08 仍可通过 pot_verify_v08 使用,但仅用于旧版互操作。TLS 绑定证明是单独的 64/32 字节值;TTTPS_V2_REQUIRE_BINDING=1 会在服务未通过直接 TLS 1.3 运行时故障时拒绝访问;stdio 和纯 HTTP 没有 TLS 导出器。为 HTTPS 模式配置 MCP_TLS_CERT_FILE 和 MCP_TLS_KEY_FILE。重放认领使用 (ctx_id, nonce),并采用 TTTPS_REPLAY_TTL_SECONDS(默认值为 86400)。

pot_query

查询 Proof of Time 记录。上下文压缩后,使用 eventId 进行 O(1) 精确查找。

参数类型必填描述
eventIdstring否精确步骤查找 — 碰撞概率为 2⁻²⁵⁶
startTimenumber否开始时间(unix ms)。默认值:24 小时前
endTimenumber否结束时间(unix ms)。默认值:现在
limitnumber否返回的最大条目数。默认值:100,最大值:1000
pot_graph

从任意步骤遍历因果链。返回向后链(祖先)和向前链(后代)。

参数类型必填描述
eventIdstring是要从其开始遍历的步骤
depthnumber否最大向后深度。默认值:10,最大值:100

返回值:

  • backwardChain — 按时间顺序排列的祖先(大型链会进行深度压缩)
  • forwardChain — 给定 eventId 之后的步骤
  • chainBroken — 检测到间隙时为 true(祖先已从环形缓冲区中逐出,或链根引用了未知条目)
  • brokenAt — 如果间隙是由服务器重启导致的内存状态清除所致,则为 "server_restart";否则为发生中断处的 eventId;如果链完整,则为 null
  • reachableDepth — 到间隙(或链根)之前成功遍历的祖先数量

因果链间隙的原因:

  • server_restart:服务器重启,内存中的 DAG 被清除。如果 Redis 可用且设置了 REDIS_URL,启动时会从 Redis 重建 DAG,从而减少重启造成的间隙。
  • 环形缓冲区逐出:环形缓冲区在内存中保存最近的 10,000 个事件。超过此窗口的祖先会显示为 chainBroken: true,且 brokenAt 设为最早的可达 eventId。

从间隙中恢复:长任务开始前调用 pot_checkpoint,在令牌预算范围内压缩并保留链;或者使用 Redis 持久化,以便在重启后保留链。

pot_verify
参数类型必填描述
potHashstring是要验证的 PoT 哈希(带 0x 前缀的十六进制)
grgShardsstring[]是十六进制编码的加密完整性分片数组
chainIdnumber是EVM 链 ID
poolAddressstring是Uniswap V4 池地址
pot_stats
参数类型必填描述
period"day" | "week" | "month"是统计时间段
pot_health

无参数。

pot_checkpoint

创建工作流历史的压缩汇总检查点。

适用场景: 即将达到上下文限制、长任务开始前,或每约 100 个事件时。

参数类型必填描述
fromEventIdstring否范围起点——因果链中要包含的第一个 eventId
toEventIdstring否范围终点——因果链中要包含的最后一个 eventId
startTimenumber否Unix 毫秒时间戳。默认:1 小时前
endTimenumber否Unix 毫秒时间戳。默认:现在
maxTokensnumber否汇总输出的大致最大 token 数。默认:2000

返回:

  • checkpointId — 唯一的检查点标识符
  • rollup — 压缩后的事件历史(自适应深度:完整/精简/最简/汇总)
  • summary — 检查点的单行易读摘要
  • chainIntact — 因果链是否完整无断裂
  • nextCheckpointHint — 下一个检查点前建议处理的事件数

自适应深度压缩:

深度格式~Token 数
1–5完整条目~200/事件
6–20精简(id+hash+ts)~80/事件
21–50最简(id+ts)~30/事件
51+汇总字符串~10/事件

使用场景

1. Claude Code 工作流 — 防止遗忘

问题:一个由 20 个 Agent 组成的动态工作流,花数小时重构一个有 50 万行代码的代码库。每次上下文压缩后,Agent 都不记得已经处理过哪些内容。重复工作,状态损坏。

解决方案:每个 Agent 都使用 pot_generate(eventId, prevEventId) 为自己的步骤加上时间戳。压缩后,它会调用 pot_query(eventId),从外部服务恢复准确的操作历史——运行了什么、何时运行、按什么顺序运行。该服务位于 Claude 的上下文窗口之外;压缩不会影响它。

// Agent starts a workflow step
const pot = await client.callTool({
  name: "pot_generate",
  arguments: {
    eventId: "refactor_auth_module_step3",
    prevEventId: "refactor_auth_module_step2"
  }
});
// pot.potHash — cryptographic proof this step happened at this time

// After context compression, agent recovers its history:
const history = await client.callTool({
  name: "pot_query",
  arguments: { eventId: "refactor_auth_module_step3" }
});
// history.local[0] — exact record: timestamp, prevEventId, potHash
// history.found: true — O(1) lookup, collision probability 2⁻²⁵⁶

// Traverse full causal chain:
const chain = await client.callTool({
  name: "pot_graph",
  arguments: { eventId: "refactor_auth_module_step3", depth: 20 }
});
// chain.backwardChain — all ancestor steps in chronological order
// chain.forwardChain — steps that follow this one
// chain.chainBroken — true if a gap was detected in the ancestor chain
// chain.brokenAt    — "server_restart" if the server restarted and cleared
//                     the in-memory DAG; otherwise the eventId of the oldest
//                     reachable ancestor before the gap; null if chain intact
// chain.reachableDepth — how many ancestors were recovered before the gap

// Handle a server-restart gap:
if (chain.chainBroken && chain.brokenAt === "server_restart") {
  // Server cleared in-memory state; ancestors before the gap are gone unless
  // Redis was configured (REDIS_URL) — in that case the DAG was rebuilt on
  // restart and chainBroken will be false.
  // Recover by querying the most recent checkpoint or restarting from a known step.
}

长任务开始前或每约 100 个事件时——创建检查点:

// Compress workflow history before context fills up — by causal range:
const checkpoint = await client.callTool({
  name: "pot_checkpoint",
  arguments: {
    fromEventId: "refactor_auth_module_step1",
    toEventId: "refactor_auth_module_step3"
  }
});
// checkpoint.checkpointId — store this; resume from it after compression
// checkpoint.rollup — depth-adaptive compressed history (10–200 tokens/event)
// checkpoint.chainIntact: true — causal chain verified unbroken
// checkpoint.nextCheckpointHint: 87 — suggested events before next checkpoint

// Or compress by time window with a token budget:
const checkpoint = await client.callTool({
  name: "pot_checkpoint",
  arguments: {
    startTime: Date.now() - 3_600_000,  // last 1 hour
    maxTokens: 1500
  }
});

// After context compression, restore from checkpoint instead of re-querying all events:
const history = await client.callTool({
  name: "pot_query",
  arguments: { eventId: checkpoint.checkpointId }
});
// Full causal context restored in a single call

结果:彻底避免重复工作。即使上下文完全重置,也能恢复完整的工作流时间线。


2. MEV Bot — 交易排序证明

问题:你的交易遭到抢先交易。你无法证明这一点——内存池时间戳因节点而异、未经签名,也不具权威性。

解决方案:每次提交前调用 pot_generate。PoT 回执使用三个独立时间源(NIST、Google、Cloudflare)进行加密签名。链上哈希可以通过单独的 Base Sepolia TTT ERC-1155 合约进行锚定。如果发生抢先交易,你就拥有一条时间戳早于攻击者区块纳入时间的记录。

const pot = await client.callTool({
  name: "pot_generate",
  arguments: { txHash: pendingTxHash, chainId: 8453, poolAddress: "0x..." }
});
// pot.potHash — your evidence, timestamped by NIST+Google+Cloudflare

注意: DeFi 路径(txHash + chainId + poolAddress)需要启用了完整性分片管线的服务端构建版本。它在公开的 openttt npm 包中不可用;调用时会抛出异常。Claude Code 路径(eventId)开箱即用。


3. DEX 协议 — 抑制三明治攻击

解决方案:集成 TTTHookSimple(Uniswap V4 hook,Base Sepolia:0x8C633b05b833a476925F7d9818da6E215760F2c7)。诚信构建者可获得 turbo 模式。遭篡改的序列则会进入 full 模式(惩罚性延迟)。依靠经济机制,而非治理。

注意: 基于分片的验证(使用 grgShards 调用 pot_verify)需要启用了完整性分片管线的服务端构建版本;公开的 openttt npm 包中不提供此功能。


4. 对冲基金 / 自营交易台 — MiFIR 第 22c 条合规

问题:MiFIR 第 22c 条 / RTS 25 要求时间戳与 UTC 同步,精度达到微秒级。硬件 PTP 设备的成本为 $50K–$500K。

解决方案:pot_generate 生成带有不确定性界限和多源证明的 Ed25519 签名时间戳。在结构上兼容 RTS 25 审计记录格式。每笔交易只需调用一次 API。

const audit = await client.callTool({
  name: "pot_generate",
  arguments: { txHash: tradeHash, chainId: 8453 }
});
// audit.timestamp: high-resolution timestamp
// audit.uncertainty: ± bound (RTS 25 uncertainty field)
// audit.confidence: fraction of sources that agreed

**精度说明:**默认网络时间源(Roughtime / NTP)提供的误差界限为几毫秒。只有添加 GEO 时间源(KTSat)后,才能满足 MiFIR 第 22c 条 / RTS 25 的 ±1ms(及更严格)要求;这是路线图中的配置,并非默认部署。

结果:审计轨迹在结构上兼容。IETF 规范:draft-helmprotocol-tttps。


5. 多 Agent 协作 — 因果顺序证明

问题:当多个 AI Agent 在工作流中交互时,因果顺序对于调试和审计至关重要。Agent 日志无法验证。

解决方案:每个 Agent 都使用 pot_generate 为其操作添加时间戳。potHash 链可独立验证。pot_graph 可重建谁在何时执行了什么操作。


有何不同 — 职责不同,而非“更好”

工具集成方式可回忆的内容完整性热路径成本
Letta (MemGPT)管理 Agent 循环可自行编辑的语义记忆无每次记忆操作都需要嵌入 + 向量搜索
LangGraph / LangMem仅限 LangGraph图状态 / 语义信息无检查点 I/O(+ 嵌入)
RAG / vector DB插件式集成模糊相似性无每个条目都需要嵌入 + 向量搜索
ttt-mcp2 分钟完成 MCP 改造精确因果步骤(按 eventId)Ed25519 + TTTPS 时间戳签名 + 哈希 + 写入——0 次嵌入调用

成本差异源于结构,而非偶然。

Letta 和 Mem0 将 Agent 记忆视为语义搜索问题——每次回忆都需要调用大模型嵌入并进行向量搜索。ttt-mcp 完全绕过大模型 / 嵌入层:状态恢复通过加密哈希进行 O(1) 查找。边际成本只是通用 CPU + 存储,而非 API 令牌。

范围:Agent 为值得设检查点的步骤添加时间戳——不是每个令牌,也不是每次查询。数据量取决于决策,而非聊天总流量。

如果你需要对过去的对话进行模糊语义搜索,请使用 Letta 或 vector DB。如果你需要一个零嵌入、确定性的状态恢复层,用于能够在上下文压缩后继续运行的长周期工作流,请使用 ttt-mcp。


定价

套餐价格每月调用次数
免费$0每个 IP 每天 100 次——无需注册
Dev$29/月100K
Pro$99/月1M
Team$299/月10M + 超额部分每 1K 次 $0.01
Enterprise$999+/月每月 100M 次调用 · 超额部分每 1K 次 $0.001 · SLA 99.9%
Platform License协商($2M+/年)协商用量上限 · 原生集成

订阅:

Dev $29/月 · Pro $99/月 · Team $299/月——订阅请发送邮件至 [email protected]。

Enterprise 和 Platform License:[email protected]

联系邮箱:[email protected]

配额机制——stdio 与 HTTP:

  • HTTP 模式(Glama / Smithery 容器,已设置 PORT):每个 IP 的免费套餐限额(每天 100 次调用)由服务进程在本地执行。
  • stdio 模式(Claude Code npx、Claude Desktop):不设每个 IP 的计数器。工具调用通过 X-TTT-API-Key 转发至 api.kenosian.com;配额根据你套餐的月度额度在服务端执行。未设置 TTT_API_KEY 时,本地回退模式运行且没有每日上限,但无法使用套餐功能(服务端 DAG 持久化、多会话因果链)。

要求

  • Node.js >= 18
  • 合成时间需要网络访问(通过 HTTPS 访问 time.nist.gov、time.google.com、time.cloudflare.com)

时间源层级(自动回退):

层级来源层级值备注
1(优先)PTP / 硬件时钟0–1需要本地 PTP 守护进程
2Roughtime / NTP(NIST、Google、Cloudflare)2–4大多数部署的默认选项
3(离线回退)本地系统时钟16RFC 5905 中表示未同步的层级值;当所有网络来源均不可达时使用

服务会自动回退到层级值 16;无需手动配置。每个 pot_generate 响应中的 stratum 字段会指明使用了哪个层级。

Redis 持久化(可选):

Redis 并非必需。运行时以内存 DAG 为权威数据。如果设置了 REDIS_URL,事件会写入 Redis,并设置 90 天 TTL;服务重启时会从 Redis 重建 DAG,从而减少 server_restart 链路中断。若未使用 Redis,重启时内存 DAG 会被清除。


生产环境提示

冷启动预热 — 首次启动时,BatchSigner 需要一个请求来完成初始化。请在负载均衡器的健康检查上线前,调用 pot_health 或发送一个虚拟 pot_generate 请求。否则,第一个请求的 p99 延迟可能达到约 500ms;后续请求则会稳定在 <10ms。

# Kubernetes / Docker: add to your startup script
curl -s http://your-server/pot/health > /dev/null

了解更多

许可证

BSL-1.1 — 可免费用于非商业用途。

商业用途(生产环境机器人、对冲基金、自营交易公司)需要许可证。

变更日期:2029-05-28 → Apache 2.0

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。