Chron について
Chronは、MCP対応AIツールを使う開発者向けのローカル優先型監査記録です。会話やツールのイベントをSQLiteに保存し、ハッシュチェーン、コンプライアンス検査、フェイルクローズのコマンド記録に対応します。
主な機能
- 01メッセージ、ツール呼び出しと結果の記録
- 02SQLiteによるローカル監査履歴
- 03ハッシュチェーンとセッション署名
- 04シークレットと個人情報の検出
- 054つの枠組みに対する決定論的レビュー
- 06転送前にコマンド出力を記録
活用シーン
- 01AIセッションとツール実行の追跡
- 02コーディングセッションの監査結果確認
- 03記録とジャーナルチェーンの照合
- 04記録前のコマンド出力を保留
MCP 対応
Chronは、会話やツールイベントを記録するMCPサーバーをAIクライアントに提供します。chron runを使えば、MCPツール呼び出しに依存せず、制御対象コマンドの入出力も記録できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
15掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| title | string | はい | 説明的なセッションタイトル。例:"Contract review — 2026-05-08" |
| ai_tool | string | いいえ | AI ツール名:"claude"、"cursor"、"windsurf" など。 |
| limit | integer | いいえ | 返す最近のメッセージ数(デフォルト:10) |
| parent_session_id | string | いいえ | 別のセッションから起動されたサブエージェントセッションの場合は、親セッション ID を指定します。 |
| external_ref | string | いいえ | 外部チケット/PR の参照。例:"jira:ENG-123" または "github:org/repo#456" |
| resume_latest | boolean | いいえ | true の場合、タイトルで照合せず、直近でアクティブだったセッションを再開します。コンテキスト圧縮後も監査チェーンを途切れさせずに継続するには、このオプションを使用してください。 |
詳細
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 ツールで動作します。
概要
AI ツールは、デフォルトでは監査証跡を作成しません。次の質問に答えることができません。
- AI は何を、正確にはいつ話しましたか?
- AI の応答にどれくらい時間がかかりましたか?
- この出力につながった会話の全容はどのようなものでしたか?
- セッション中にどのツール呼び出し、コマンド結果、コード差分が発生しましたか?
- シークレットや認証情報が AI のプロンプトに貼り付けられましたか?
- この監査記録は後から編集されていますか?
- 先週、このコードベースについて Claude に何を尋ねましたか?
Chron がこれらを解決します。すべてのやり取りは、正確なローカル日時(タイムゾーンオフセットを含む)とともに、所有者自身が管理する SQLite ファイルに記録されます。各イベントをハッシュチェーン化し、Ed25519 でセッションに署名し、シークレット/PII を検出し、4 つのフレームワークにわたる決定論的なコンプライアンスレビューを実行し、メタデータのみのイベントを SIEM にストリーミングできます。クラウドは不要で、ベンダーロックインもなく、メッセージ内容がマシンの外に出ることもありません。
Chron が記録する内容
Chron は次のローカル監査証跡を保存します。
- ユーザーとアシスタントのメッセージ
- ツール呼び出しとツールの結果
- ファイルパス、操作、統合差分を含むコード変更
- 親セッションや外部参照を含む、セッションの開始/再開メタデータ
- マスクされた値を含むシークレット/PII の検出
- ハッシュチェーンの整合性データ
- オプションの Ed25519 セッション署名
- オプションの NTP クロック証明メタデータ
Chron の SIEM 連携で送信されるのはメタデータのみです。セッションの開始、ロールのみのメッセージイベント、マスクされたシークレットの検出が対象です。メッセージ内容とマスク前のシークレット値はローカルに保持されます。
AI エージェントの実行時ポリシーを適用する必要がありますか?CLAIIM は Chron の証明機能にエージェント ID、承認ワークフロー、ALLOW/DENY ゲートを追加します。パブリックプレビューをお試しください:https://claiim.io/preview
フェイルクローズ型の記録 — chron run
Chron の MCP ロギングは、AI クライアントがツールを呼び出すことを前提としています。chron run はそうではありません。
chron run -- claude
chron run -- codex
ラッパーは各インタラクションのチャンクをローカルの追記専用ジャーナルに記録し、
解放する前に永続化します。ジャーナルへの書き込みがフラッシュされ、fsync が完了するまで、
1 バイトもターミナルに届きません。ジャーナルへの書き込みに
失敗した場合、転送は双方向とも停止し、子プロセスは終了され、
保留中のデータは出力されません。記録されていない出力を
表示する代わりに、コマンドは 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 チャネルを転送または解放する前に記録します。
保証されるのはこれだけです。
ラッパーの使用を強制するものではありません。クライアントを直接実行すればラッパーを回避できるため、管理された
PATH、制限付きシェル、MDM ポリシーなど、Chron の外部で制御する必要があります。また、クライアントのあらゆる副作用を
記録するものでもありません。クライアントが読み書きするファイル、起動するサブプロセス、
送信するネットワークリクエストは、ラッパーのパイプを通過しません。
chron run --scope は完全なリストを表示し、各実行ではその同じスコープが最初のジャーナルレコードに書き込まれるため、主張が証拠とともに残ります。
検証済みの強制適用
データベースに投影された実行には、その元となったジャーナルレコードへの紐付けが含まれます。chron verify <session-id> はその紐付けをたどり、ジャーナルセグメントがチェーンとして検証できること、実行が変更されずにチェーン内に残っていること、投影されたメッセージがジャーナルとフィールドごとに一致することを確認した場合に限り、enforced:wrapper を報告します。検証できない主張は、脚注ではなく検証失敗として扱われます。
検証に成功したジャーナルチェーンが示すのは、レコード同士に内部的な整合性があることです。レコードが一度も編集されていないことまでは示しません。チェーンにはアンカーがないため、ファイル全体を書き換えられる人なら、すべてのハッシュを再計算できます。Chron はセッションとバンドルに署名しますが、ジャーナルのヘッドにはまだ署名しません。
インストール
CLI + MCP サーバー:
npm install -g chron-mcp
chron doctor --fix
npx chron-mcpが起動するのは MCP サーバーのみです。chronCLI コマンドは PATH に追加されません。CLI を使用するには、グローバルインストールが必要です。
chron doctor --fix は、対応する AI クライアントに Chron を自動で追加します: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
これは読み取り専用です。データベースはコピーを介して開き、行を書き込むことはなく、キャプチャジャーナルにも読み取ったトランスクリプトにも触れません。
確認できることと、確認できないこと
3 つの結果を意図的に分けています:
- 記録された識別情報 — インポートされたセッションは、
external_refによってトランスクリプトに紐付けられています。これは、インポートによってどのセッションが作成されたかを示します。セッションのメッセージがトランスクリプトのメッセージに対応していることを示すものではないため、内容は別途、独立した基準で報告されます。 - 関連候補 — メッセージは対応していますが、両者を紐付けるものはありません。確認が必要であり、確定ではありません。
- 関連が見つからない — 実際に行った検索の範囲内で見つからなかったことを示します。
一致するものがないトランスクリプトがあっても、セッションが迂回されたことの証明にはなりません。
Chron は記録していないものを確認できないため、見つからなかったという結果が示すのは検索についてであり、ユーザーについてではありません。結果として見つからなかった場合も、その結果に至った範囲が必ず示されます。対象として調べたソース、時刻、比較可能だったメッセージのうち比較した件数、および --json での比較対象となったトランスクリプトの正確な序数が含まれるため、サンプル結果を無条件に信頼するのではなく再現できます。
制限事項を個別に明記
トランスクリプトのサイズ制限はありません。トランスクリプトはストリーミングで読み取られ、480MB のファイルも全体が検査されます。各トランスクリプトについて、メッセージのうち最大 200 件を均等間隔で比較します。これらは互いに独立しています。以前より多くのファイルを検査できますが、どのファイルも以前より詳細に比較されるわけではありません。
正規化後に 24 文字未満となるメッセージは比較されません。「ok」の一致から得られるものはほとんどなく、誤った対応付けは見落としよりも問題だからです。4MB を超える行はスキップされ、その旨が報告されます。タイムスタンプは一切比較されません。時計の許容差は null であり、2 つの時計が一致することを根拠とする結果はありません。
一部しか読み取れないトランスクリプトは、その旨が示されます。その完全性の情報は、そのトランスクリプトに関するすべての結果に引き継がれます。読み取り中にファイルが変更されたかどうかも含まれます。その場合、ダイジェストは確定したファイルのものではなく、読み取ったバイト列のものです。
現時点では 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 の証跡レポートを生成できます。
4 つのフレームワークに対応しています:
| フレームワーク | ルール | 対象となる統制 |
|---|---|---|
| SOC 2 | 5 | CC6.1, CC6.6, CC6.7, CC7.2, CC8.1 |
| ISO 27001:2022 | 6 | A.8.2, A.8.3, A.8.12, A.8.20, A.8.24, A.8.31 |
| EU AI Act | 6 | Art. 9, Art. 10, Art. 12, Art. 13, Art. 14 |
| NIST AI RMF 1.0 | 7 | GOVERN, 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 と記録されます。
レシートは読み取るたびに検証されます。検証に失敗した場合は理由が表示され、配信状態は表示されません。整合性が確認できない記録は何の証拠にもならないためです。また、コマンドは 0 以外の終了コードを返すため、自動化処理で各行を解析しなくても異常を検知できます。
ここでは表現が重要です。「受け付け済み」とは、コレクターがペイロードに対して成功を返したことを意味します。データを保持したかどうかを示せるのはそのプラットフォームだけであり、Chron はそれを断定しません。認証情報がレシートに含まれることはありません。送信先を記録する前に、ユーザー情報、クエリパラメーター、認識されないパスセグメントをすべて削除し、コレクターのエラーボディは保存せず、カテゴリに置き換えます。
chron doctor
chron doctor は、Chron を実際の環境で役立てるための各要素を検証します:
- Node.js のバージョン(v18 以降が必要)
- ローカルの Chron バージョンと npm の最新バージョン
- クライアント設定に書き込まれる正確な MCP 起動コマンド
- DB ディレクトリとキー用ディレクトリへの書き込み権限
- Claude Desktop、Claude Code、Cursor、Gemini CLI、Windsurf、Codex の MCP 設定の有無
- 各 MCP クライアントで Chron が設定されているかどうか
- オプションの
/healthHTTP モードヘルスチェック - 環境変数または
~/.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 が同梱されています。これは、MCP ツールを自動的に使用する方法を AI に指示するプレーンテキストの指示ファイルです。AI ツールに一度読み込ませてください。その後、AI は次の処理を行います。
- すべての会話の開始時に、名前付きセッションを作成または再開します
- 応答を開始する前にユーザーのメッセージを記録します(実際のユーザーのタイムスタンプを取得します)
- 応答を作成した後に、その応答を記録します(実際のアシスタントのタイムスタンプを取得します)
- すべての応答の先頭に
[user: YYYY-MM-DD HH:MM:SS ±HH:MM | assistant: YYYY-MM-DD HH:MM:SS ±HH:MM]を表示します - 過去のセッション履歴を取得し、会話をまたいでもコンテキストが失われないようにします
MCP ツール
| ツール | 説明 |
|---|---|
init_session | セッションを初期化または再開します。1 回の呼び出しで session_id、メッセージ数、最近のメッセージを返します |
start_session | 名前付きの新しい監査セッションを作成します(レガシーのため、init_session を推奨) |
log_message | 現在のローカル日時とともに、1 件のメッセージを記録します |
log_tool_call | AI によるツール呼び出しを監査イベントとして記録します |
log_tool_result | ツールの出力を記録し、ツール呼び出しに関連付けます |
log_code_change | 操作と unified diff を含めてファイルの編集を記録します |
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 が対象とするのは1つのセッションです。マニフェストには1つの署名が含まれ、署名キーはそのセッションに属するためです。署名なしのバンドルを生成するのではなく、エラーになります。保証を示すフラグを指定したのに、保証なしで正常終了するようでは、疑う理由のないアーティファクトを誰かに渡すことになってしまいます。同様に、chron verify --bundle は署名のないバンドルに対してゼロ以外の終了コードを返します。ファイルと独自のマニフェストを照合して確認できるのは内部整合性であり、出所ではありません。
SOC 2 レポートと署名付きバンドルは、会話内容を Chron のインフラストラクチャに送信することなく、監査レビュー、法的保全、インシデントの再構成を行えるように設計されています。
CrowdStrike LogScale との連携
開発者のマシンから CrowdStrike LogScale リポジトリへ、AI セッションのテレメトリを直接ストリーミングします。中継サービスは不要です。イベントはお使いの 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_URL | LogScale の取り込みエンドポイント |
CHRON_LOGSCALE_TOKEN | LogScale の取り込みトークン |
イベントを送信するには、両方を設定する必要があります。未設定の場合、連携機能は通知なく無効になります。
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 に設定 → ソースタイプを 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"
}
}
}
}
有効な TLS 証明書を使用する本番環境の Splunk インスタンスでは、
CHRON_SPLUNK_INSECUREを削除してください。
新しい環境変数を適用するため、AI ツールを再起動してください。
4. Splunk で検索する
http://localhost:8000 を開き、Search & Reporting → 次のクエリを実行します。
sourcetype="chron:event"
AI との会話に合わせて、イベントがリアルタイムで表示されます。
ダッシュボードのテンプレートとアラート設定を含む完全なガイド:dashboards/splunk/README.md
環境変数
| 環境変数 | 説明 |
|---|---|
CHRON_SPLUNK_URL | Splunk HEC のベース URL。例:https://localhost:8088 または https://your-host:8088 |
CHRON_SPLUNK_TOKEN | HEC の取り込みトークン |
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 Portal → Azure Active Directory → App registrations → New registration → 名前に chron-ingest を指定します。
Application (client) ID と Directory (tenant) ID を控えてください。
Certificates & secrets → New client secret に進み、値をすぐにコピーしてください。
2. Log Analytics にカスタムテーブルを作成する
Log Analytics ワークスペースを開き、Tables → Create → New custom log (DCR-based) に進み、ChronEvents_CL という名前を指定します。
自動追加される TimeGenerated に加えて、次の列を追加します。
| 列 | 型 |
|---|---|
EventType | string |
SessionIdPrefix | string |
AiTool | string |
OS | string |
ChronVersion | string |
Computer | string |
Role | string |
DetectionType | string |
MaskedValue | string |
ウィザードによって Data Collection Endpoint (DCE) と Data Collection Rule (DCR) が作成されます。両方を控えてください。
3. アプリに取り込み権限を付与する
DCR を開き、Access control (IAM) → Add role assignment に進みます。ロールに Monitoring Metrics Publisher、メンバーに chron-ingest アプリを指定します。
4. DCR の Immutable ID を取得する
DCR を開き、Overview → JSON view に進み、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 → Logs → dashboards/sentinel/ のクエリを貼り付けます。
ChronEvents_CL
| where TimeGenerated > ago(24h)
| summarize count() by EventType, AiTool
KQL クエリとアラートルールの設定を含む完全なガイド:dashboards/sentinel/README.md
環境変数
| 環境変数 | 説明 |
|---|---|
CHRON_SENTINEL_TENANT_ID | Azure AD テナント ID |
CHRON_SENTINEL_CLIENT_ID | App Registration のクライアント ID |
CHRON_SENTINEL_CLIENT_SECRET | App Registration のクライアントシークレット |
CHRON_SENTINEL_DCE | Data Collection Endpoint URL |
CHRON_SENTINEL_DCR_ID | DCR Immutable ID(dcr- で始まります) |
CHRON_SENTINEL_STREAM | ストリーム名(例:Custom-ChronEvents_CL) |
イベントを送信するには、6 つすべてを設定する必要があります。トークンの更新は自動で行われます(Azure AD トークンの有効期間は 1 時間で、有効期限の 60 秒前に更新されます)。
設定
| 環境変数 | デフォルト | 説明 |
|---|---|---|
CHRON_DB_PATH | ~/.chron/chron.db | SQLite データベースファイルのパス |
CHRON_KEYS_DIR | ~/.chron/keys | セッションごとの Ed25519 署名鍵の保存先 |
CHRON_CONFIG_PATH | ~/.chron/config.json | SIEM 設定ファイル。テスト実行、CI ジョブ、サンドボックスを実際の認証情報から分離するには、別の場所を指定してください |
CHRON_SIEM_TIMEOUT_MS | 10000 | 単一の SIEM リクエストにかけられる時間。超過すると、配信結果は不明として記録されます |
CHRON_TRANSPORT | stdio | HTTP+SSE モードを有効にするには http を設定します |
CHRON_API_KEY | (なし) | HTTP モード用のベアラートークン |
PORT | 3001 | HTTP モード用のポート |
CHRON_LOGSCALE_URL | (なし) | LogScale 取り込みエンドポイント(CrowdStrike 連携を有効にします) |
CHRON_LOGSCALE_TOKEN | (なし) | LogScale 取り込みトークン |
CHRON_SENTINEL_TENANT_ID | (なし) | Azure AD テナント ID(Sentinel 連携を有効にします) |
CHRON_SENTINEL_CLIENT_ID | (なし) | アプリ登録のクライアント ID |
CHRON_SENTINEL_CLIENT_SECRET | (なし) | アプリ登録のクライアントシークレット |
CHRON_SENTINEL_DCE | (なし) | データ収集エンドポイント URL |
CHRON_SENTINEL_DCR_ID | (なし) | DCR 不変 ID |
CHRON_SENTINEL_STREAM | (なし) | ストリーム名(例:Custom-ChronEvents_CL) |
CHRON_SPLUNK_URL | (なし) | Splunk HEC ベース URL(Splunk 連携を有効にします) |
CHRON_SPLUNK_TOKEN | (なし) | Splunk HEC 取り込みトークン |
CHRON_SPLUNK_INSECURE | (なし) | ローカルの Splunk や自己署名証明書で TLS 検証をスキップするには 1 を設定します |
CHRON_RELAY_URL | (なし) | 汎用リレーエンドポイント(任意の SIEM または Webhook) |
CHRON_RELAY_TOKEN | (なし) | 汎用リレー用のベアラートークン |
HTTP+SSE モード(チーム/セルフホスト)
チームでの利用やリモート利用では、Chron を HTTP サーバーとして実行します。
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 → Settings → Data Controls → Export data → メールが届くまで待つ → ZIP をダウンロードします。
インポートされる内容:
- 会話ごとに 1 つの Chron セッションを作成し、
ai_tool=chatgptを設定します - エクスポートに含まれる元のメッセージのタイムスタンプ
- すべてのセッションに
external_ref=chatgpt:<conversation_id>を設定します(chron historyで確認できます) - インポートしたすべてのメッセージにわたる完全な SHA-256 ハッシュチェーン
- すべてのユーザーメッセージでシークレット検出を実行します
再実行しても安全です — external_ref の一致により、すでにインポートされた会話はスキップされます。
インポート後、セッションは chron history に表示され、ネイティブに記録されたセッションと同様に chron verify で検証できます。
データについて
監査ログは、お使いのマシン上の単一の SQLite ファイル ~/.chron/chron.db に保存されます。任意の 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 は利用データを送信しません。分析用エンドポイントもアカウントも、定期的な外部通信もありません。外部に送信される可能性があるパケットは次の 2 種類のみです。
| 内容 | 送信されるタイミング | 含まれるデータ | 無効にする方法 |
|---|---|---|---|
| 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.
ライセンス
Copyright (c) 2026 Nivaya. All rights reserved.
ソースコードは透明性を確保する目的でのみ公開されています。明示的な書面による許可なく、複製、フォーク、改変、再配布することはできません。詳細な条件については、LICENSEをご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。