mcpField
C
Chron

Chron

本地服务
github.com/SirinivasK开发工具43 天前更新

关于 Chron

Chron 为使用 MCP 兼容 AI 工具的开发者提供本地优先的对话与工具调用审计记录。它将事件存入 SQLite,并支持哈希链、合规检查和故障闭锁式命令捕获。

主要功能

  1. 01记录消息、工具调用与结果
  2. 02SQLite 本地审计历史
  3. 03哈希链与会话签名
  4. 04秘密和个人信息检测
  5. 05四种框架的确定性合规审查
  6. 06命令输出记录后再转发

适用场景

  1. 01追溯 AI 会话及工具执行
  2. 02审查 AI 编码会话的合规发现
  3. 03检查记录是否与日志链一致
  4. 04防止未记录的命令输出显示

MCP 相关

Chron 提供 MCP 服务,供 AI 客户端记录对话和工具事件。也可通过 chron run 捕获受控命令的输入与输出,不依赖客户端调用 MCP 工具。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"chron": {
"command": "npx",
"args": [
"-y",
"chron-mcp"
]
}
}
}
启动命令npx -y chron-mcp

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

安装包
npmchron-mcp

工具

15

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

参数类型必填说明
titlestring是描述性会话标题,例如 "Contract review — 2026-05-08"
ai_toolstring否AI 工具名称:"claude"、"cursor"、"windsurf" 等。
limitinteger否返回的近期消息数量(默认值:10)
parent_session_idstring否如果这是由其他会话生成的子 Agent 会话,则填写父会话 ID
external_refstring否外部工单/PR 引用,例如 "jira:ENG-123" 或 "github:org/repo#456"
resume_latestboolean否为 true 时,恢复最近活动的会话,而不是按标题匹配。使用此选项可在上下文压缩后继续会话,同时保持审计链完整。

详细介绍

Chron

Chron

本地优先、可防篡改的审计轨迹,记录 AI 对话、工具调用、代码更改和机密信息,并针对 SOC 2、ISO 27001、EU AI Act 和 NIST AI RMF 进行确定性合规审查。

AI 工具会显示你何时发送了消息。Chron 还会记录 AI 何时作出回应,并永久保存可查询、防篡改的记录,追踪 AI 在你的各项工具中完成的工作。

适用于 Claude Desktop、Claude Code、Cursor、Windsurf、Codex、Gemini CLI 以及任何兼容 MCP 的 AI 工具。


为什么需要 Chron

AI 工具默认不会生成审计轨迹。你无法回答以下问题:

  • AI 说了什么?具体是什么时候说的?
  • AI 花了多长时间回应?
  • 是什么完整对话促成了这段输出?
  • 会话期间发生了哪些工具调用、命令结果和代码差异?
  • 是否有机密信息或凭据被粘贴到 AI 提示词中?
  • 这条审计记录事后是否被编辑过?
  • 上周我问 Claude 关于这个代码库的什么问题?

Chron 可以解决这些问题。每次交互都会以精确的本地日期时间(包括时区偏移量)记录到由你掌控的 SQLite 文件中。它可以为每个事件构建哈希链,使用 Ed25519 对会话签名,检测机密信息/PII,针对四种框架进行确定性合规审查,并向你的 SIEM 仅传输元数据事件。无需云端服务,不受供应商锁定,消息内容不会离开你的设备。


Chron 捕获的内容

Chron 在本地存储以下审计轨迹:

  • 用户和助手消息
  • 工具调用和工具结果
  • 代码更改,包含文件路径、操作和统一差异
  • 会话开始/恢复元数据,包括父会话和外部引用
  • 机密信息/PII 检测结果及经过掩码处理的值
  • 哈希链完整性数据
  • 可选的 Ed25519 会话签名
  • 可选的 NTP 时钟证明元数据

Chron 的 SIEM 集成只会发送元数据:会话开始事件、仅含角色信息的消息事件,以及经过掩码处理的机密信息检测结果。消息内容和未经处理的机密信息值会保留在本地。

需要对 AI Agent 执行运行时策略?CLAIIM 在 Chron 的证明基础上添加 Agent 身份、审批工作流以及 ALLOW/DENY 门控。试用公开预览:https://claiim.io/preview


失败时关闭的捕获 — chron run

Chron 的 MCP 日志记录依赖 AI 客户端调用工具。chron run 则不依赖这一点。

chron run -- claude
chron run -- codex

包装器会将每段交互记录到本地只追加日志中,并在释放内容前确保持久化。只有覆盖相应内容的日志写入已刷新并执行 fsync 后,字节才会到达你的终端。如果日志写入失败,双向转发都会停止,子进程会被终止,正在暂存的内容不会输出——命令会以 99 退出,而不会显示未经记录的输出。

chron run --scope      # exactly what this does and does not establish
chron verify --journal # verify the journal chain and see its scope
chron project          # replay the journal into the database (idempotent)
它能确保什么,不能确保什么

chron run 会在转发或释放之前,记录受控的 stdin、stdout 和 stderr 通道。这就是它所能保证的全部内容。

它不能强制要求使用包装器——直接运行客户端即可绕过它,这需要 Chron 之外的控制措施,例如受管理的 PATH、受限 Shell 或 MDM 策略。它不会捕获客户端的所有副作用:客户端读取或写入的文件、启动的子进程以及发出的网络请求,都不会经过包装器的管道。

chron run --scope 会打印完整列表,每次运行也都会将同一份列表写入日志的第一条记录,以便证据中包含相应的声明。

已验证的强制执行

投影到数据库中的运行会绑定到其来源的日志记录。chron verify <session-id> 会沿着该绑定进行验证——日志分段必须构成可验证的链,运行必须仍在链中且未经更改,投影后的消息必须与日志中的字段逐一匹配——只有满足这些条件,才会报告 enforced:wrapper。未通过核验的声明属于验证失败,而不是脚注。

通过验证的日志链只能证明其中的记录彼此一致,并不能证明它们从未被编辑过:该链没有锚定,因此任何能够重写整个文件的人都可以重新计算所有哈希。Chron 会对会话和捆绑包签名;目前还不会对日志头签名。


安装

CLI + MCP 服务:

npm install -g chron-mcp
chron doctor --fix

npx chron-mcp 只会启动 MCP 服务——不会将 chron CLI 命令加入你的 PATH。要使用 CLI,你需要全局安装。

chron doctor --fix 会自动将 Chron 添加到受支持的 AI 客户端:Claude Desktop、Claude Code、Cursor、Gemini CLI、Windsurf 和 Codex。运行后请重启 AI 客户端。

首次运行时会自动创建 ~/.chron/chron.db。无需设置数据库、环境变量或运行迁移。

检查设置:

chron doctor

用于 CI 或自动化:

chron doctor --json

如有需要,可手动配置 MCP:

{
  "mcpServers": {
    "chron": {
      "command": "npx",
      "args": ["-y", "chron-mcp"]
    }
  }
}

CLI

运行 npm install -g chron-mcp 后,chron 命令即可全局使用:

Usage: chron <command> [options]

Commands:
  run             Run a command with fail-closed capture — output is withheld until recorded
  project         Replay the capture journal into the database (idempotent)
  reconcile       Read-only: what your client records that Chron cannot account for
  history         List sessions or show full log for a session
  report          Aggregate audit stats across sessions
  export          Export a session as markdown
  secrets         List detected secrets across sessions
  settings        View current configuration
  connect         Connect to a SIEM or AI tool (codex, cursor, gemini, crowdstrike, sentinel, splunk)
  summary         Structured summary of a session (timeline, mutations, secrets)
  sign            Sign a session with its Ed25519 key — produces a .chron.sig file
  verify          Verify a session's hash chain and Ed25519 signature
  prune           Delete sessions older than a retention cutoff
  doctor          Check your Chron setup — Node version, DB, MCP configs, SIEM
  import          Import conversations from external AI tools into Chron
  review          Review AI sessions against compliance control criteria
  update          Update chron to the latest version

Options (history):
  --limit=<n>       Max sessions to show (default: 20)
  --search=<query>  Full-text search across all sessions (FTS5: phrases, boolean, prefix*)
  --ref=<value>     Filter by external_ref prefix (e.g. --ref=jira:ENG-123)
  <id-prefix>       Show full log for the session with this ID prefix

Options (report):
  --since=<range>   Filter by date: 7d, 30d, or YYYY-MM-DD (default: all time)
  --format=soc2     Generate SOC 2 HTML evidence package
  --output=<file>   Output file for --format=soc2

Options (export):
  <id-prefix>       Markdown export for a single session
  --signed          Tamper-evident bundle (JSONL + manifest + Ed25519 sig)
  --session=<id>    Filter bundle to a single session
  --since=<range>   Filter bundle by date: 7d, 30d, or YYYY-MM-DD
  --output=<file>   Output path (default: bundle.chron.tar.gz)

Options (reconcile):
  --json            Machine-readable JSON output, including the compared message indices

Options (verify):
  <id-prefix>       Verify a session's hash chain + Ed25519 signature
  --bundle=<file>   Verify a signed bundle offline (no DB needed)

Options (prune):
  --older-than=<n>d  Cutoff in days (falls back to retention_days in config)
  --dry-run          Show what would be deleted without deleting
  --confirm          Required flag to actually delete

Options (doctor):
  --json             Machine-readable JSON output

Options (import):
  chatgpt <file>     Import from ChatGPT export (.zip or conversations.json)

Options (review):
  --framework=<name>  Framework to review against: soc2, iso27001, euaiact, nist-ai-rmf
  --since=<range>     Limit to sessions since: 7d, 30d, or YYYY-MM-DD
  --all               Include accepted, dismissed, and resolved findings
  --output=<file>     Write HTML report to file (printable to PDF from browser)
  accept <id>         Mark a finding as accepted; supports --note=<text>
  dismiss <id>        Mark a finding as dismissed; supports --note=<text>
  resolve <id>        Mark a finding as resolved; supports --note=<text>

对账 — chron reconcile

你的 AI 客户端会保存自己的转录记录。Chron 会保存证据。chron reconcile 会读取两者,并报告客户端记录了哪些 Chron 无法说明的内容。

chron reconcile          # human-readable
chron reconcile --json   # includes the compared message indices

此操作为只读。它会通过副本打开数据库,绝不写入任何行,也不会触碰捕获日志或所读取的转录记录。

它能证明什么,不能证明什么

有三种结果,我们有意将它们区分开来:

  • 已记录的身份 — 导入的会话通过 external_ref 绑定到一份转录记录。这说明某次导入创建了哪个会话,但并不表示该会话的消息与转录记录中的消息相对应,因此内容会单独报告,并采用各自的表述。
  • 候选关联 — 消息相对应,但两者之间没有绑定。需要确认,不能视为结论。
  • 未找到关联 — 在实际执行的搜索范围内未找到关联。

没有匹配项的转录记录并不能证明会话被绕过。 Chron 无法看到自己未记录的内容,因此缺失只说明搜索结果,并不说明用户的情况。每项缺失结果都会附带产生该结果的范围:检查过的来源、时间、已比较的消息数量及可比较消息总数;在 --json 中,还会附带实际比较的转录记录序号,以便复现抽样结果,而不必盲目信任。

单独说明限制

没有转录记录大小限制:转录记录采用流式读取,480MB 的文件也会被完整检查。每份转录记录最多会比较 200 条消息,并均匀取样。这两点互不影响——现在可以检查的文件更多了,但每份文件的比较深度都没有增加。

规范化后短于 24 个字符的消息不会参与比较,因为匹配到“ok”意义不大,而错误关联比漏掉关联更糟。超过 4MB 的行会被跳过并报告。完全不会比较时间戳:时钟容差为 null,因此任何发现都不会基于两个时钟相符这一点。

如果转录记录只能部分读取,系统会明确说明;与它有关的每项发现都会附带其完整性信息,包括文件在读取期间是否发生变化。若发生变化,其摘要是已读取字节的摘要,而非稳定文件的摘要。

目前仅支持 Claude Code。待通过真实样本验证格式后,Codex 和 Cursor 也会采用相同契约。


Chron Intelligence — 合规审查

chron review 会扫描你的会话历史,并根据合规框架标记发现项。不进行模型推理。不调用 API。仅对 Chron 已捕获的结构化事件进行确定性模式匹配。

chron review --framework=soc2
chron review --framework=iso27001
chron review --framework=euaiact
chron review --framework=nist-ai-rmf

添加 --since=30d 可将范围限定为近期会话,添加 --output=report.html 可生成可打印的 HTML 证据报告。

支持四种框架:

框架规则数覆盖的控制项
SOC 25CC6.1、CC6.6、CC6.7、CC7.2、CC8.1
ISO 27001:20226A.8.2、A.8.3、A.8.12、A.8.20、A.8.24、A.8.31
EU AI Act6Art. 9、Art. 10、Art. 12、Art. 13、Art. 14
NIST AI RMF 1.07GOVERN、MAP、MEASURE、MANAGE

发现项工作流:

每个发现项都有稳定的 SHA-256 ID。审查时可处理发现项:

chron review accept <id> --note="approved by security team, PR #512"
chron review dismiss <id> --note="test fixture, not production code"
chron review resolve <id> --note="credential rotated, no commit exposure"
chron review --framework=soc2 --all   # show accepted/dismissed/resolved too

已审查的发现项不会在下次运行时再次出现,造成干扰。自上次审查后会话中产生的新发现项会清晰呈现。

重要提示: Chron 涵盖的是可根据 AI 编码会话证据评估的部分控制项。完整的框架评估还需要政策文档、董事会记录和审计人员的判断,这些都无法由会话日志取代。每份 HTML 报告的封面页都包含针对相应框架的免责声明。

chron otel receipts

每次导出都会写入一条回执:证据发送到了哪里、发送了多少,以及收到了什么。

chron otel receipts              # most recent 20
chron otel receipts --limit=5
chron otel receipts --json       # machine-readable
2026-09-29 12:36  c53022ae  partly accepted       20 span(s)  https://collector.example.com/v1/traces
      spans: 12 accepted, 8 unanswered

回执是一种仅追加的哈希链记录:目标位置、范围和内容状态都会绑定到链中,每个批次都会记录即将发送的内容。这样一来,即使进程在导出中途被终止,状态也会显示为 delivery unknown,而不会错误声称没有发送任何内容。

每次读取回执时都会进行验证。若验证失败,则会显示原因和不提供交付状态——无法站得住脚的记录不能作为任何事情的证据——并以非零状态码退出,以便自动化程序察觉,而不必解析每一行。

措辞很重要。“Accepted”表示收集器已成功返回该负载。数据是否被保留,只有相应平台才能说明,Chron 不会对此作出声称。凭据绝不会进入回执:记录目标位置前,系统会移除用户信息、查询参数和无法识别的路径片段;收集器的错误响应正文则会缩减为类别,而不会存储。

chron doctor

chron doctor 会验证 Chron 在实际使用中发挥作用所需的各个部分:

  • Node.js 版本(需要 v18+)
  • 本地 Chron 版本与 npm 最新版本的对比
  • 客户端配置中写入的确切 MCP 启动器
  • DB 目录和密钥目录的写入权限
  • 是否存在 Claude Desktop、Claude Code、Cursor、Gemini CLI、Windsurf 和 Codex 的 MCP 配置
  • Chron 是否已在每个 MCP 客户端中配置
  • 可选的 HTTP 模式健康检查(/health)
  • 通过环境变量或 ~/.chron/config.json 配置的 Splunk、Sentinel 和 LogScale

运行 chron doctor --fix,可自动将 Chron MCP 服务添加到受支持的客户端。可选集成的警告不会导致命令失败。实际故障会以状态码 1 退出。


它记录的内容

每次交互都会记录精确的本地时间戳——收到用户消息时的时间,以及发送助手回复时的时间:

[user: 2026-05-08 14:32:11 +02:00 | assistant: 2026-05-08 14:32:43 +02:00]

The main risks of deploying this contract are...

用户和助手时间戳之间的间隔就是真实的生成时间。两者都会连同完整的时区偏移量存储在本地 SQLite DB 中。


按工具配置

Claude Desktop

编辑 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):

{
  "mcpServers": {
    "chron": {
      "command": "/absolute/path/to/chron-mcp",
      "args": []
    }
  }
}
Claude Code
claude mcp add chron -- /absolute/path/to/chron-mcp

然后将技能钩子添加到 ~/.claude/settings.json:

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "cat ~/.chron/chron.skill.md"
          }
        ]
      }
    ]
  }
}
Cursor

运行:

chron connect cursor
chron doctor --verify-logging cursor

这会写入全局 MCP 配置和项目工作区规则:

  • ~/.cursor/mcp.json
  • .cursor/mcp.json
  • .cursor/rules/chron.mdc

Chron 还会通过 MCP 服务的初始化说明公布日志记录约定,因此 Cursor 在项目工作区之外也能接收到这些说明。设置完成后必须重启 Cursor。使用 Cursor Agent 模式,然后运行上面的验证命令,确认本地数据库中出现了真实的 Chron 会话。

手动配置 MCP:

{
  "mcpServers": {
    "chron": {
      "command": "/absolute/path/to/chron-mcp",
      "args": []
    }
  }
}
Gemini CLI

运行:

chron connect gemini

或编辑 ~/.gemini/settings.json:

{
  "mcpServers": {
    "chron": {
      "command": "/absolute/path/to/chron-mcp",
      "args": []
    }
  }
}
Windsurf

编辑 ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "chron": {
      "command": "/absolute/path/to/chron-mcp",
      "args": []
    }
  }
}

配套技能文件

Chron 随附 skills/chron.skill.md——一个纯文本说明文件,指导 AI 如何自动使用 MCP 工具。将其加载到 AI 工具中一次。之后,AI 会:

  1. 在每次对话开始时创建或恢复一个命名会话
  2. 在开始回复前记录你的消息(捕获真实的用户时间戳)
  3. 在撰写完回复后记录回复(捕获真实的助手时间戳)
  4. 在每条回复顶部显示 [user: YYYY-MM-DD HH:MM:SS ±HH:MM | assistant: YYYY-MM-DD HH:MM:SS ±HH:MM]
  5. 检索先前的会话历史,确保对话之间不会丢失上下文

MCP 工具

工具描述
init_session初始化或恢复会话——一次调用即可返回 session_id、消息数和最近消息
start_session创建新的命名审计会话(旧版——优先使用 init_session)
log_message使用当前本地日期时间记录单条消息
log_tool_call将 AI 工具调用记录为审计事件
log_tool_result记录工具输出,并将其关联到工具调用
log_code_change记录文件编辑,包括操作和统一差异
log_exchange原子化地记录一组用户/助手消息(用于批量导入)
list_sessions按最近活动时间列出所有会话
get_session_history检索会话的完整时间戳日志
verify_session验证防篡改哈希链——检测日志记录后发生的任何编辑
scan_prompt在记录前扫描文本中的机密信息(API 密钥、凭据)——返回已屏蔽的检测结果
rehydrate_response将助手回复中的脱敏占位符还原为原始值
delete_session删除会话及其所有消息/机密信息
summarize_session返回时间线摘要,包含延迟、变更、机密信息和生产环境引用

完整性与签名

每个新的审计事件都会通过 SHA-256 链与前一个事件关联:

content_hash = SHA256(session_id | role | content | created_at | prev_hash | event_type)

verify_session 会遍历哈希链并返回:

  • valid: true — 日志记录后没有消息被修改
  • valid: false, first_break: <id> — 第一条被篡改消息的确切行 ID

这样,你的本地日志就成为可验证的审计凭据。对已存储消息的任何编辑——内容、时间戳或角色——都会破坏哈希链,并被立即检测到。

Chron 还会尽可能为每个新会话生成一个 Ed25519 密钥对。私钥存放在 ~/.chron/keys。使用:

chron sign <session-id-prefix>
chron verify <session-id-prefix>

如需可移植的证据:

chron export --signed --session=<session-id-prefix> --output=evidence.chron.tar.gz
chron verify --bundle=evidence.chron.tar.gz

chron verify 还会报告启用了时钟检查支持的会话的 NTP 时钟证明元数据。


机密信息和 PII 检测

Chron 可以检测并屏蔽:

  • API 密钥:OpenAI、Anthropic、AWS、Google、GitHub、Slack、Stripe、SendGrid、HuggingFace
  • 私钥、JWT、URL 凭据、密码赋值、环境变量格式的机密信息
  • 信用卡号、IBAN、SSN、出生日期、护照信息
  • 电子邮件地址、美国/E.164 电话号码、内部 RFC-1918 IP 地址

使用:

chron secrets
chron secrets <session-id-prefix>

MCP 工具还可以在将内容发送到 AI 工具前调用 scan_prompt。脱敏时会使用 $CHRON_* 占位符,rehydrate_response 则可以根据返回的令牌映射还原相应值。


报告与证据

chron history
chron summary <session-id-prefix>
chron report --since=30d
chron report --format=soc2 --output=soc2-report.html
chron export <session-id-prefix>
chron export --signed --session=<id> --output=bundle.chron.tar.gz
chron prune --older-than=90d --dry-run

--signed 仅适用于一个会话,因为清单只包含一个签名,且签名密钥属于该会话。若无法生成签名,它会直接失败,而不会生成未签名的包:如果某个标明了保证的标志在未提供该保证的情况下仍成功退出,就会把一个没有理由让人信任的产物交给他人。chron verify --bundle 对没有签名的包同样会以非零状态退出——将文件与其自身的清单进行匹配只能确立内部一致性,无法证明来源。

SOC 2 报告和签名包旨在用于审计审查、法律保全和事件重建,而无需将对话内容发送到 Chron 基础设施。


CrowdStrike LogScale 集成

将 AI 会话遥测数据直接从开发者计算机流式传输到你的 CrowdStrike LogScale 存储库。无需中继服务——事件会直接发送到你自己的 LogScale 实例。

**发送的内容:**会话开始、消息计数(仅角色)和经过掩码处理的凭据检测结果。消息内容不会离开本机。

设置

1. 创建 LogScale 存储库和摄取令牌

在 Falcon 控制台中,转到 Log Management → Repositories → New repository(命名为 ChronAIEvents)。
然后转到 Settings → API Tokens → Add token → 选择 Ingest 权限 → 复制令牌。

摄取 URL 格式如下:

https://<your-cluster>.humio.com/api/v1/ingest/humio-structured

2. 安装 CLI 并运行引导向导

npm install -g chron-mcp
chron connect crowdstrike
# Paste your ingest URL and token when prompted
# The wizard sends a test event and confirms before saving

3. 将环境变量添加到 MCP 客户端配置中

向导会输出要粘贴的准确配置块。对于 Claude Code,请将其添加到 ~/.claude.json 中的 chron 条目:

{
  "mcpServers": {
    "chron": {
      "command": "npx",
      "args": ["-y", "chron-mcp"],
      "env": {
        "CHRON_LOGSCALE_URL": "https://<your-cluster>.humio.com/api/v1/ingest/humio-structured",
        "CHRON_LOGSCALE_TOKEN": "<your-ingest-token>"
      }
    }
  }
}

重启 AI 工具以应用新的环境变量。

4. 导入预先构建的仪表板

在 Falcon 中,转到 Log Management → Dashboards → Import:

node_modules/chron-mcp/dashboards/logscale/chron-ai-activity.yaml

包含 SOC 警报设置的完整指南:dashboards/logscale/README.md

环境变量
环境变量说明
CHRON_LOGSCALE_URLLogScale 摄取端点
CHRON_LOGSCALE_TOKENLogScale 摄取令牌

必须同时设置这两个变量,事件才会开始流动。如果未设置,集成会静默禁用。


Splunk 集成

通过 HTTP Event Collector(HEC)将 AI 会话遥测数据流式传输到 Splunk。适用于 Splunk Enterprise、Splunk Cloud 和本地 Docker 实例。

**发送的内容:**会话开始、消息计数(仅角色)和经过掩码处理的凭据检测结果。消息内容不会离开本机。

设置

选项 A — 本地 Docker(最快,无需账户)

# Start a local Splunk instance (Apple Silicon: --platform linux/amd64 is required)
docker run -d --name splunk-chron \
  --platform linux/amd64 \
  -p 8000:8000 -p 8088:8088 \
  -e SPLUNK_START_ARGS=--accept-license \
  -e SPLUNK_GENERAL_TERMS=--accept-sgt-current-at-splunk-com \
  -e SPLUNK_PASSWORD=Admin1234! \
  -e SPLUNK_HEC_TOKEN=chron-test-token \
  splunk/splunk:latest

# Wait ~2 minutes, then watch until ready:
docker logs -f splunk-chron 2>&1 | grep -i "Ansible playbook complete"

选项 B — Splunk Enterprise 或 Cloud

Settings → Data Inputs → HTTP Event Collector → New Token → 将其命名为 chron-ingest → source type 设为 chron:event → 复制令牌。

2. 安装 CLI 并运行引导向导

npm install -g chron-mcp
chron connect splunk
# For local Docker: URL = https://localhost:8088, Token = chron-test-token
# TLS verification is skipped automatically for localhost (self-signed cert)

3. 将环境变量添加到 MCP 客户端配置中

向导会输出要粘贴的准确配置块。对于 Claude Code,请将其添加到 ~/.claude.json:

{
  "mcpServers": {
    "chron": {
      "command": "npx",
      "args": ["-y", "chron-mcp"],
      "env": {
        "CHRON_SPLUNK_URL": "https://localhost:8088",
        "CHRON_SPLUNK_TOKEN": "chron-test-token",
        "CHRON_SPLUNK_INSECURE": "1"
      }
    }
  }
}

如果生产环境中的 Splunk 实例使用有效的 TLS 证书,请移除 CHRON_SPLUNK_INSECURE。

重启 AI 工具以应用新的环境变量。

4. 在 Splunk 中搜索

打开 http://localhost:8000 → Search & Reporting → 运行:

sourcetype="chron:event"

进行 AI 对话时,事件会实时显示。

包含仪表板模板和警报设置的完整指南:dashboards/splunk/README.md

环境变量
环境变量说明
CHRON_SPLUNK_URLSplunk HEC 基础 URL,例如 https://localhost:8088 或 https://your-host:8088
CHRON_SPLUNK_TOKENHEC 摄取令牌
CHRON_SPLUNK_INSECURE设置为 1 可跳过 TLS 验证(适用于使用自签名证书的本地 Docker)

必须同时设置 CHRON_SPLUNK_URL 和 CHRON_SPLUNK_TOKEN,事件才会开始流动。


Microsoft Sentinel 集成

通过 Azure Monitor Logs Ingestion API,将 AI 会话遥测数据流式传输到你的 Microsoft Sentinel 工作区。事件会直接从开发者的计算机发送到你自己的 Log Analytics 工作区,无需中继服务。

发送的内容: 会话开始、消息计数(仅角色)以及经过掩码处理的凭据检测结果。消息内容绝不会离开计算机。

设置

1. 注册 Azure 应用

Azure 门户 → Azure Active Directory → 应用注册 → 新注册 → 将其命名为 chron-ingest。
记下 应用程序(客户端)ID 和 目录(租户)ID。
转到 证书和机密 → 新建客户端机密 → 立即复制该值。

2. 在 Log Analytics 中创建自定义表

打开 Log Analytics 工作区 → 表 → 创建 → 新建自定义日志(基于 DCR) → 将其命名为 ChronEvents_CL。

添加以下列(自动添加的 TimeGenerated 除外):

列类型
EventTypestring
SessionIdPrefixstring
AiToolstring
OSstring
ChronVersionstring
Computerstring
Rolestring
DetectionTypestring
MaskedValuestring

向导会创建一个 数据收集终结点(DCE) 和一个 数据收集规则(DCR)——记下这两项。

3. 为应用授予数据引入权限

打开 DCR → 访问控制(IAM) → 添加角色分配 → 角色:Monitoring Metrics Publisher → 成员:chron-ingest 应用。

4. 获取 DCR Immutable ID

打开 DCR → 概述 → JSON 视图 → 复制 immutableId 字段(以 dcr- 开头)。

5. 安装 CLI 并运行入门向导

npm install -g chron-mcp
chron connect sentinel
# Enter tenant ID, client ID, client secret, DCE URL, DCR immutable ID, and stream name
# The wizard authenticates with Azure AD and sends a test event before saving

6. 将环境变量添加到 MCP 客户端配置

向导会输出要粘贴的确切配置块。对于 Claude Code,将其添加到 ~/.claude.json:

{
  "mcpServers": {
    "chron": {
      "command": "npx",
      "args": ["-y", "chron-mcp"],
      "env": {
        "CHRON_SENTINEL_TENANT_ID": "<your-tenant-id>",
        "CHRON_SENTINEL_CLIENT_ID": "<your-client-id>",
        "CHRON_SENTINEL_CLIENT_SECRET": "<your-client-secret>",
        "CHRON_SENTINEL_DCE": "https://<your-dce>.ingest.monitor.azure.com",
        "CHRON_SENTINEL_DCR_ID": "dcr-<your-immutable-id>",
        "CHRON_SENTINEL_STREAM": "Custom-ChronEvents_CL"
      }
    }
  }
}

重启 AI 工具以载入新的环境变量。

7. 在 Sentinel 中查询

Sentinel → 日志 → 粘贴 dashboards/sentinel/ 中的任意查询:

ChronEvents_CL
| where TimeGenerated > ago(24h)
| summarize count() by EventType, AiTool

包含 KQL 查询和警报规则设置的完整指南:dashboards/sentinel/README.md

环境变量
环境变量说明
CHRON_SENTINEL_TENANT_IDAzure AD 租户 ID
CHRON_SENTINEL_CLIENT_ID应用注册客户端 ID
CHRON_SENTINEL_CLIENT_SECRET应用注册客户端机密
CHRON_SENTINEL_DCE数据收集终结点 URL
CHRON_SENTINEL_DCR_IDDCR Immutable ID(以 dcr- 开头)
CHRON_SENTINEL_STREAM流名称,例如 Custom-ChronEvents_CL

必须设置全部六项,事件才会开始流动。令牌会自动刷新(Azure AD 令牌有效期为 1 小时,并在过期前 60 秒刷新)。


配置

环境变量默认值描述
CHRON_DB_PATH~/.chron/chron.dbSQLite 数据库文件的路径
CHRON_KEYS_DIR~/.chron/keys写入各会话 Ed25519 签名密钥的位置
CHRON_CONFIG_PATH~/.chron/config.jsonSIEM 配置文件。将其指向其他位置,可避免测试运行、CI 作业或沙箱接触真实凭据
CHRON_SIEM_TIMEOUT_MS10000单个 SIEM 请求在交付记录为未知状态之前允许耗费的时间
CHRON_TRANSPORTstdio设置为 http 以启用 HTTP+SSE 模式
CHRON_API_KEY(none)HTTP 模式的 Bearer 令牌
PORT3001HTTP 模式的端口
CHRON_LOGSCALE_URL(none)LogScale 接收端点(启用 CrowdStrike 集成)
CHRON_LOGSCALE_TOKEN(none)LogScale 接收令牌
CHRON_SENTINEL_TENANT_ID(none)Azure AD 租户 ID(启用 Sentinel 集成)
CHRON_SENTINEL_CLIENT_ID(none)应用注册客户端 ID
CHRON_SENTINEL_CLIENT_SECRET(none)应用注册客户端密钥
CHRON_SENTINEL_DCE(none)数据收集端点 URL
CHRON_SENTINEL_DCR_ID(none)DCR 不可变 ID
CHRON_SENTINEL_STREAM(none)流名称(例如 Custom-ChronEvents_CL)
CHRON_SPLUNK_URL(none)Splunk HEC 基础 URL(启用 Splunk 集成)
CHRON_SPLUNK_TOKEN(none)Splunk HEC 接收令牌
CHRON_SPLUNK_INSECURE(none)设置为 1,以跳过本地 Splunk 或自签名证书的 TLS 验证
CHRON_RELAY_URL(none)通用中继端点(任何 SIEM 或 webhook)
CHRON_RELAY_TOKEN(none)通用中继的 Bearer 令牌

HTTP+SSE 模式(团队 / 可自托管)

供团队或远程使用时,以 HTTP 服务的形式运行 Chron:

CHRON_TRANSPORT=http CHRON_API_KEY=your-key PORT=3001 npx chron-mcp

将 MCP 配置指向该 URL:

{
  "mcpServers": {
    "chron": {
      "url": "https://your-server/sse",
      "headers": {
        "Authorization": "Bearer your-key"
      }
    }
  }
}

导入 ChatGPT 数据

将现有 ChatGPT 历史记录导入 Chron 的防篡改审计跟踪。

# From a ChatGPT data export ZIP
chron import chatgpt ~/Downloads/chatgpt-export.zip

# Or from an extracted conversations.json
chron import chatgpt ~/Downloads/conversations.json

如何获取 ChatGPT 导出文件: ChatGPT → 设置 → 数据控制 → 导出数据 → 等待邮件 → 下载 ZIP 文件。

导入内容:

  • 每段对话对应一个 Chron 会话,其中 ai_tool=chatgpt
  • 导出文件中的原始消息时间戳
  • 每个会话都带有 external_ref=chatgpt:<conversation_id>(可在 chron history 中查看)
  • 所有导入消息的完整 SHA-256 哈希链
  • 对所有用户消息进行机密信息检测

可安全重复运行——已导入的对话会通过匹配 external_ref 跳过。

导入后,会话会显示在 chron history 中,chron verify 对这些会话的检查方式与任何原生记录的会话相同。


您的数据

您的审计日志存储在 ~/.chron/chron.db 中——这是您设备上的单个 SQLite 文件。可使用任何 SQLite 工具直接查询:

sqlite3 ~/.chron/chron.db \
  "SELECT s.title, m.role, m.content, m.created_at
   FROM messages m JOIN sessions s ON s.id = m.session_id
   ORDER BY m.created_at"

没有云服务、没有分析功能,也没有由供应商持有的日志副本。使用 CHRON_DB_PATH 更改存储位置。

哪些数据会离开您的设备

Chron 不会发送使用数据——没有分析端点、没有账户,也不会主动向服务器发送信号。可能离开的数据包只有两种,以下就是全部:

内容发送时机包含内容如何关闭
NTP 时钟检查自动进行,在创建会话时向 pool.ntp.org 发送 48 字节的 NTP 请求。不含会话数据或标识符。设置 CHRON_DISABLE_NTP=1,或通过 CHRON_NTP_SERVER=your.ntp.host 重定向
SIEM / OTLP 导出仅在配置目标后您配置的事件,发送至您选择的端点无需关闭——在运行 chron connect 前,此功能处于休眠状态

时钟检查可让 chron verify 判断会话时间戳是否基于已同步的时钟。它是 Chron 唯一一种未经请求便会发送的数据包,因此列在第一项,并提供了关闭开关。关闭后,chron verify 会如实说明这一点,而不会报告它从未检查过的时钟:

Clock attestation
  ! Clock attestation is disabled by configuration — none was requested.

许可证

版权所有 (c) 2026 Nivaya。保留所有权利。

源代码公开仅用于提高透明度。未经明确书面许可,不得克隆、分叉、修改或重新分发。完整条款请参阅 LICENSE。

评论

支持 Markdown

第一次接触 MCP?

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

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