mcpField
A
ai-audit-trail

ai-audit-trail

ローカル
sundsoffice-tech.github.io法務・行政42 日前に更新

ai-audit-trail について

ai-audit-trailは、AIやエージェントの判断を記録し、検証するためのPythonライブラリです。規制対象のチームや監査担当者向けに、署名とハッシュチェーンによる記録保護、オフライン検証可能な証拠パッケージを提供します。

主な機能

  1. 01Ed25519署名とハッシュチェーンによる記録
  2. 02PIIのマスキングと暗号学的消去
  3. 03コンプライアンス対応表とレポート生成
  4. 04オフライン検証可能な証拠パッケージ
  5. 05エージェントのツール呼び出しと複数エージェントの記録
  6. 06ドリフトと認証状態の監視

活用シーン

  1. 01エージェントの判断を改ざん検知可能な形で記録
  2. 02外部監査向けの証拠パッケージを作成
  3. 03監査記録に含まれる個人データの処理を追跡
  4. 04動作のドリフトとコンプライアンス状態を監視

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"sundsoffice-tech-ai-audit-trail": {
"command": "uvx",
"args": [
"ai-audit-trail"
]
}
}
}
起動コマンドuvx ai-audit-trail

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiai-audit-trail0.4.7

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

ai-audit-trail

PyPI version Python License: MIT CI Downloads Tests mypy Ruff OpenSSF Scorecard

AI が何を行い、なぜそうしたのか、そして記録が誰にも改ざんされていないことを証明します。

Ed25519 署名、SHA-256 ハッシュチェーン、 そして正式なコンプライアンス対応付けを備えた、改ざんを検知できる意思決定レシートです。ブロックチェーン、SaaS、ベンダーロックインは不要です。 セルフホスト可能で、オフラインで検証でき、Python ネイティブです。


これが必要な理由

EU AI Act は、ハイリスク AI システムに対して 2026 年 8 月に義務化されます。すべての意思決定が適切に行われたことを証明する、改ざんを検知できるログが求められます(第 12 条)。多くのチームは通常のロギングで対応していますが、これは改ざんを検知できず、監査において法的な根拠にもなりません。

ai-audit-trail は、監査担当者がシステムにアクセスせず、オフラインで検証できる暗号学的なレシートによって、このギャップを埋めます。ブロックチェーンと同じ原理を、ブロックチェーンのオーバーヘッド、SaaS への依存、ベンダーロックインなしで実現します。

対象ユーザー

  • コンプライアンスを証明する必要がある規制対象の AI チーム(FinTech、HealthTech、LegalTech、InsurTech)
  • ツールにアクセスする LLM エージェントをデプロイするエンタープライズのプラットフォームチーム
  • 監査対応済みの証拠パッケージを必要とするセキュリティおよびコンプライアンス担当者
  • プラットフォームの移行ではなく、pip install と 3 行のコードで済ませたい開発者

このライブラリが提供するもの

ai-audit-trail は、EU AI Act、ISO 42001、NIST AI RMF への準拠を支援する技術的な構成要素を提供します。このライブラリ単独で規制への準拠を保証するものではありません。コンプライアンスは、単一のソフトウェアコンポーネントの範囲を超える、組織としての義務です。以下の共有責任モデルをご覧ください。


インストール

pip install ai-audit-trail                    # Core (Ed25519 + SHA-256 + PII)
pip install "ai-audit-trail[redis]"           # + Redis persistence
pip install "ai-audit-trail[otel]"            # + OpenTelemetry metrics
pip install "ai-audit-trail[all]"             # Everything

要件: Python 3.11 以降 | 外部サービス不要 | エアギャップ環境で動作


クイックスタート

from ai_audit import (
    AuditConfig, init_audit_config,
    ReceiptCollector, ReceiptStore, ReceiptAction,
    verify_chain, get_verify_key_hex,
)

# 1. Configure once at startup
init_audit_config(AuditConfig(is_production=False))
store = ReceiptStore()

# 2. Wrap every AI request
collector = ReceiptCollector(trace_id="req-1", tenant_id="acme")
collector.set_input("What is our GDPR policy?")
collector.add_check("safety", score=0.02, threshold=0.8, fired=False)
collector.set_output("Our GDPR policy states that...")
collector.set_action(ReceiptAction.ALLOW)
collector.emit(store)
collector.cleanup()

# 3. Verify tamper-evidence
result = verify_chain(store.get_by_tenant("acme"), get_verify_key_hex())
assert result.valid  # Ed25519 + SHA-256 + hash-chain verified

アーキテクチャ概要

Receipt Creation        Verification & Compliance       Agentic AI Audit
─────────────────       ──────────────────────────      ──────────────────
ReceiptCollector   ──>  verify_chain()                  ToolCallReceipt
  set_input()           build_compliance_summary()      TraceGraph (DAG)
  add_check()           build_crosswalk()               BehavioralContract
  set_output()          export_evidence_package()       ProvenanceChain
  set_action()          SPRTMonitor
  emit()                DriftMonitor
       │                EpochManager
       v
  ReceiptStore     ──>  StorageBackend ABC
  (in-memory LRU)       InMemoryBackend
  + Redis (optional)    (your custom backends)
  + AuditBuffer

主な機能

意思決定レシート(Ed25519 + SHA-256 + ハッシュチェーン)

AI パイプラインの意思決定ごとに、暗号学的に封印されたハッシュチェーン形式の記録である意思決定レシートが生成されます。

証明できる内容方法
入力の完全性NFKC 正規化され、PII を除去した入力の SHA-256
出力の完全性生成された出力の SHA-256
チェック結果スコアとしきい値を含む、順序付けられたチェック記録
意思決定実行されたアクション(ALLOW / REJECT / ESCALATE / ...)
モデルの来歴モデル ID + 設定ダイジェスト
否認防止Ed25519 署名(libsodium)
順序ハッシュチェーンによるリンク(prev_receipt_hash)

3 段階の検証(レシート 1 件あたり 0.1 ms 未満):

Ed25519 signature  →  detects forgery
SHA-256 self-hash  →  detects corruption
Hash-chain link    →  detects insertions / deletions / reordering
PII の秘匿化(GDPR 第 17 条)

個人データはハッシュ化する前に除去されるため、監査ログに生の PII が含まれることはありません。

from ai_audit import PiiConfig, PiiMode, PiiType

config = PiiConfig(
    enabled_types=frozenset({PiiType.EMAIL, PiiType.PHONE, PiiType.IP}),
    mode=PiiMode.REDACT,  # or HASH (SHA-256) or MASK (a***m)
)
collector = ReceiptCollector(tenant_id="acme", pii_config=config)
モード[email protected] の変換後
REDACT[EMAIL]
HASH3d4e5f8a...(決定論的な SHA-256)
MASKa***@c***.com
暗号シュレッディング(GDPR の消去権)

テナントごとの AES-256-GCM キーで PII フィールドを暗号化します。キーを破棄すれば、ハッシュチェーンを保ったまま、データは永久に読み取り不能になります。

from ai_audit.shredding import AESGCMDEKStore, encrypt_field, shred_tenant

dek_store = AESGCMDEKStore()
dek_store.create_dek("tenant-acme")

field = encrypt_field("sensitive PII", dek_store, "tenant-acme")
shred_tenant("tenant-acme", dek_store)  # Key destroyed — data unrecoverable
# Hash-chain remains mathematically intact (hashes ciphertext, not plaintext)

コンプライアンスとガバナンス

ISO 42001 / NIST AI RMF 対応表

レシートデータを、証拠への参照情報とともに、認知された管理策に直接対応付けます。

from ai_audit.crosswalk import build_crosswalk, nist_function_map

crosswalk = build_crosswalk(receipts, chain_intact=True)
for entry in crosswalk:
    print(f"[{entry.status}] {entry.framework} {entry.control_id} — {entry.control_name}")

nist = nist_function_map(receipts)
print(nist["GOVERN"].coverage)   # 0.0–1.0
print(nist["MEASURE"].status)    # PASS / PARTIAL / FAIL

ISO 42001 の管理策: A.6.2.8(ロギング)、A.7.5(来歴)、A.6.2.6(パフォーマンス)、A.8.4(出力)、A.5.3(リスク) NIST AI RMF: GOVERN、MAP、MEASURE、MANAGE — 定量的なカバレッジスコア付き

EU AI Act コンプライアンスレポート
from ai_audit.report import ComplianceReportGenerator

gen = ComplianceReportGenerator(summary, verify_key_hex=get_verify_key_hex())
gen.to_markdown()   # Documentation portals
gen.to_json()       # Automated pipelines
gen.to_html()       # Air-gapped servers

第 9 条(リスク)、第 12 条(記録保持)、第 13 条(透明性)、第 17 条(品質)、第 18 条(ロギング)を対象とします。

証拠パッケージのエクスポート(オフライン検証)

外部監査人向けの、自己完結型の署名付き ZIP です。システムへのアクセスは不要です。

from ai_audit.export import export_evidence_package, verify_evidence_package

export_evidence_package(receipts, verify_key_hex, signing_key, "audit_2026.zip")
# Bundle: receipts.jsonl + chain_metadata.json + public_key.hex + manifest.json (signed) + verify.py

# Auditor verifies offline:
# python -m ai_audit verify audit_2026.zip
継続的な認証(SPRT)

逐次確率比検定 — テナントごとのコンプライアンス状況をリアルタイムで確認できます。

from ai_audit.sprt import SPRTMonitor

monitor = SPRTMonitor(tenant_id="acme")
for receipt in receipts:
    state = monitor.update(is_reject=(receipt.action == "reject"))
print(state.status)      # CERTIFIED | MONITORING | FLAGGED
print(state.confidence)  # 0.0–1.0
ドリフト検出(Jensen-Shannon ダイバージェンス)

動作の変化をリアルタイムで検出します — scipy は不要で、純粋な Python で動作します。

from ai_audit.drift import DriftMonitor

monitor = DriftMonitor(window_size=100)
for receipt in receipts:
    state = monitor.update(receipt.action.value)
print(state.status)       # STABLE | DRIFTING | CRITICAL_DRIFT
print(state.drift_score)  # JSD 0.0–1.0

エージェント型 AI の監査(世界初)

エージェントの動作契約

信頼性インデックス Theta による形式的な (p, delta, k)-充足性 — EU AI Act の要件を検証可能な仕様に変換します。

from ai_audit.contracts import BehavioralContract, Constraint, ContractMonitor

contract = BehavioralContract(
    contract_id="safety-v1",
    constraints=[
        Constraint(name="no_pii_leak", kind="hard", field="action", operator="!=", value="reject"),
        Constraint(name="quality", kind="soft", field="checks.safety.score", operator="<=", value=0.1, delta=0.5),
    ],
)
monitor = ContractMonitor(contract)
for receipt in receipts:
    state = monitor.evaluate(receipt)

print(state.p)                   # Hard constraint satisfaction probability
print(state.delta)               # Maximum soft deviation observed
print(state.k)                   # Recovery steps after last violation
print(state.reliability_index)   # Theta: single compliance metric (0.0–1.0)
print(state.status)              # COMPLIANT | DEGRADED | VIOLATED
暗号学的なツール呼び出しレシート

すべてのエージェント API 呼び出しに Ed25519 署名を付与します — これを提供する既存のフレームワークはありません。

from ai_audit.toolcall import seal_tool_call, verify_tool_call_chain

receipt = seal_tool_call(
    agent_id="researcher",
    tool_name="web_search",
    tool_args={"query": "EU AI Act compliance"},
    tool_result="Found 5 relevant documents...",
    private_key=signing_key,
    tenant_id="acme",
)
assert receipt.verify(signing_key.verify_key)
マルチエージェントのトレースグラフ(DAG)

委任、引き継ぎ、並列オーケストレーションを監査します — 直線的なログだけではありません。

from ai_audit.tracegraph import TraceGraph

graph = TraceGraph(trace_id="workflow-1", tenant_id="acme")
root = graph.add_node(agent_id="orchestrator", action="plan")
graph.add_node(agent_id="researcher", action="search", parent_id=root.node_id)
graph.add_node(agent_id="writer", action="draft", parent_id=root.node_id)

assert graph.verify_integrity()  # Hash-based tamper detection
assert not graph.has_cycles()    # DAG validation
lineage = graph.get_agent_lineage(leaf_node.node_id)  # Root-to-leaf trace
認識論的完全性 / 改ざん不能な来歴

あらゆる情報の出所を追跡します — 意思決定がプロンプトインジェクションの影響を受けていないことを証明します。

from ai_audit.provenance import ProvenanceChain, ProvenanceRecord, SourceType

chain = ProvenanceChain(receipt_id="r1", tenant_id="acme")
chain.add(ProvenanceRecord(source_type=SourceType.SYSTEM, source_id="prompt", trust_level=1.0, content_hash="..."))
chain.add(ProvenanceRecord(source_type=SourceType.DOCUMENT, source_id="doc-123", trust_level=0.8, content_hash="..."))
chain.add(ProvenanceRecord(source_type=SourceType.UNKNOWN, source_id="???", trust_level=0.0, content_hash="..."))

summary = chain.trust_summary()
print(summary.system_grounded)       # True — has SYSTEM source
print(summary.potentially_injected)  # True — has UNKNOWN source
print(summary.min_trust)             # 0.0 — weakest link

高スループットアーキテクチャ

Merkle ツリーによるバッチ封印(RFC 6962)

レシートのチェーンではなくルートのチェーンを使用し、バッチごとの検証を O(log N) で行います。

from ai_audit.batch import MerkleBatcher

batcher = MerkleBatcher(tenant_id="acme", private_key=key, max_batch_size=2048)
for receipt in receipts:
    seal = batcher.add(receipt.receipt_id, receipt.seal_payload())
    if seal:  # Auto-flushed at 2048 receipts
        print(f"Batch sealed: {seal.merkle_root[:16]}...")

assert batcher.verify_chain_of_roots(key.verify_key)
チェーンエポック / ロールオーバー

チェーンの無制限な拡大を防ぎます。古いエポックはアーカイブまたは削除できます。

from ai_audit.epochs import EpochManager

mgr = EpochManager(tenant_id="acme", private_key=key, max_epoch_size=10_000)
for receipt in receipts:
    seal = mgr.add_receipt(receipt)  # Auto-seals at 10k
mgr.seal_epoch()                     # Or explicit rollover
assert mgr.verify_epoch_chain(key.verify_key)
バックプレッシャー対応リングバッファー

高スループットのデータ取り込みに対応する有界バッファーです — フェイルクローズで、データが黙って失われることはありません。

from ai_audit.buffer import AuditBuffer, AuditBufferFullError

buffer = AuditBuffer(maxsize=50_000)  # ~5 seconds at 10k req/s
try:
    buffer.put(receipt)
except AuditBufferFullError:
    # Backpressure — reject the request rather than lose audit data
    pass
batch = buffer.drain(max_items=2048)
ストレージバックエンド ABC

永続化方式をプラグインで拡張できます — お好みのデータベースを使用できます。

from ai_audit.storage import StorageBackend, InMemoryBackend

# Use the reference implementation for dev/test
backend = InMemoryBackend(max_receipts=50_000)

# Or implement your own:
class PostgresBackend(StorageBackend):
    def write_receipt(self, receipt): ...
    def read_receipt(self, receipt_id): ...
    def query_by_tenant(self, tenant_id, limit=100): ...
    def healthcheck(self) -> bool: ...
OpenTelemetry インストルメンテーション

SRE ダッシュボード向けのネイティブメトリクスを提供します — OTel SDK がない場合も、正常に何も行わず動作します。

# pip install "ai-audit-trail[otel]"
from ai_audit.telemetry import record_seal, record_append, record_drift

record_seal(duration_seconds=0.000045, tenant_id="acme")
record_append(tenant_id="acme", async_mode=True)
record_drift(score=0.03, tenant_id="acme")

メトリクス: ai_audit.seal_duration_seconds、ai_audit.append_total、ai_audit.redis_fallback_total、ai_audit.chain_break_total、ai_audit.drift_score、ai_audit.buffer_size、ai_audit.epoch_sealed_total


本番環境のセットアップ

永続署名キー
python -c "import nacl.signing; print(nacl.signing.SigningKey.generate().encode().hex())"
init_audit_config(AuditConfig(is_production=True, signing_key_hex="your-64-char-hex-key"))
KMS 統合
from ai_audit import KeyProvider, init_key_provider

class VaultKeyProvider(KeyProvider):
    def get_signing_key(self) -> nacl.signing.SigningKey:
        secret = vault_client.secrets.kv.read_secret("secret/ai-audit/key")
        return nacl.signing.SigningKey(bytes.fromhex(secret["data"]["key"]))
    def get_verify_key_hex(self) -> str:
        return self.get_signing_key().verify_key.encode().hex()

init_key_provider(VaultKeyProvider())
Redis の永続化
import redis
store = ReceiptStore(redis_client=redis.Redis(), use_lua=True)  # Lua mode: 10k+ req/s

共有責任モデル

責任ライブラリデプロイ担当者
Ed25519 + SHA-256 による署名とハッシュ化X
ハッシュチェーンの完全性X
PII の編集(REDACT/HASH/MASK)X
Merkle ツリーによるバッチ封印(RFC 6962)X
SPRT コンプライアンス認証X
ISO 42001 / NIST AI RMF のマッピングX
証拠パッケージのエクスポート + 検証X
暗号シュレッディング(AES-256-GCM)X
エージェントの動作契約X
OpenTelemetry メトリクスX
安全なキー保管(HSM/Vault)X
PII タイプの設定X
耐久性のあるストレージバックエンドX
アクセス制御 / RBACX
人間による監督(EU AI Act 第 14 条)X
クロック同期(NTP)X
インシデント対応X
規制コンプライアンス認証X

例

examples/ ディレクトリを参照してください。


パフォーマンス

操作典型的なレイテンシ備考
seal()(ハッシュ化+署名)< 100 uslibsodium C による Ed25519
verify_chain(1000)< 50 ms線形にスケールします
merkle_root(2048)< 5 msRFC 6962 SHA-256
レシートあたりのメモリ~1 KBPydantic V2 + orjson

ベンチマークの実行:pytest tests/test_benchmark.py -v -s


プロジェクトの統計情報

指標値
テスト196
ソースモジュール26
__all__ のエクスポート60
型チェックmypy --strict、エラー 0 件
リンティングruff、エラー 0 件
Python のバージョン3.11、3.12、3.13
セキュリティスキャン3 件完了、6 件修正
NB バリデーターへの相談5 名(アーキテクチャ、エンタープライズ、パフォーマンス、エージェント、ブランディング)

セキュリティ

脅威モデル、脆弱性の報告手順、サポート対象バージョンの全容については、SECURITY.md をご覧ください。

アーキテクチャ上の不変条件、責任共有モデル、貢献ガイドラインについては、CONTRIBUTING.md をご覧ください。


ライセンス

MIT — 商用利用は無料です。


作成・メンテナンス

S&S Connect — 自律型 AI システムのための信頼インフラを構築しています。

本番環境または研究で ai-audit-trail をご利用の場合は、ぜひお知らせください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。