AI・機械学習
Show HN: AIエージェントの危険な機能をスキャンする
Show HN: Scan your AI agents for dangerous capabilities (github.com)
要約
MakerCheckerは、AIエージェントのセキュリティを強化するためのオープンソースツールです。LangChainやClaude SDKなどのフレームワークと連携し、エージェントが実行できるツール呼び出しを制御し、不正な操作を防ぎます。コードスキャン機能で潜在的なリスクを特定し、実行時には権限に基づいたアクセス制御と、改ざん不可能な監査ログを提供します。
全文翻訳
🛡️ MakerChecker AIエージェントのためのオープンソースセキュリティレイヤー。デフォルト拒否の強制、人間の承認、および暗号学的に署名された監査トレイルにより、エージェントは許可されたもののみを実行し、自身の作業を証明可能に承認できません。
ウェブサイト · ライブデモ · mc scan · ドキュメント
エージェントは既存のフレームワーク(LangChain、Claude SDK、CrewAI)で実行され続けます。MakerCheckerは、各ツール呼び出しの前にチェックポイントとして、また呼び出し後に署名済みレジャーとして機能します。エージェントはロールを通じてのみ行動し、許可されたスキルのみを実行し、制限を超えず、自身の作業を承認できません。
🚀 クイックスタート
1 — コードをスキャンする
エージェントが単独で何ができるかを、リスク別に分類して見つけます。インストール不要、何もマシンから離れません:
npx @makerchecker/scan .
データ削除、資金移動、シェルコマンド実行、シークレットの抽出など、すべての結果的なアクションをフラグ付けし、それに類似する実際のインシデントの名前を付け、--fix オプションでガバナンスコードを生成します。
→ packages/scan
2 — その動作を保証する
コントロールをインポートし、任意のツールをラップします。エージェントは現在、そのロールに許可されたものしか実行できません。許可されていない呼び出しは、実行前に拒否されます:
npm i @makerchecker/embedded
import { createGovernor, GovernanceDeniedError } from "@makerchecker/embedded";
const gov = createGovernor()
.defineSkill("place-order@1", { riskTier: "high" })
.defineRole("agent")
.defineRole("risk-desk")
.grant("risk-desk", "place-order@1") // エージェントは許可されていません — デフォルト拒否
.defineRole("trader", "agent");
// ツールを一度ラップします。これでエージェントは構造的にそれを起動できません。
const placeOrder = gov.governedTool("trader", "place-order@1", (order) => broker.submit(order));
try {
await placeOrder({ symbol: "BTC", qty: 10 });
} catch (err) {
if (err instanceof GovernanceDeniedError)
console.log(err.code); // "skill_not_granted"
}
高リスクスキルは別のロールに配置されるため、エージェントは自身の作業を承認できません。そして、許可されたか拒否されたかに関わらず、すべての決定は署名付き監査ログにコミットされます。
→ packages/embedded
3 — 監査担当者との連携
ステップ2はすでに署名付きログを書き込みます。監査担当者が耐久性があり、クエリ可能で、改ざん不可能なレコードを必要とする場合 — 人間による承認受信トレイとレビューコンソールも — 自己ホスト型サーバーを実行します:
docker compose up
すべての決定は Ed25519 で署名され、ハッシュチェーン化されています。任意の行を変更すると検証が壊れます。バンドルをエクスポートすれば、誰でもオフラインで検証できます — データベース不要、プロセスへの信頼不要。
→ 完全なサーバーセットアップは以下にあります
これらは3つの独立したパッケージです — mc scan、@makerchecker/embedded、およびサーバー — これらは同じコントロールを強制し、同じ署名付き監査フォーマットを書き込みます。いずれか単独で採用できます。
🔬 ガバナンスされたユースケース
結果を伴う作業を行うエージェントの実行可能な例(人間のゲートの後):
薬物警戒症例処理 — エージェントが有害事象報告をトリアージしますが、緊急の15日規制報告が送信される前に医療レビュー担当者が署名します。
examples/pv-icsr-processing
医療機器(MDR)苦情トリアージ — 規制担当者が、ドラフトレポートが生成される前に報告可能性をゲートで決定します。
examples/mdr-reportability-triage
腫瘍患者アクセス — エージェントが給付マッチングを処理しますが、専門家が署名しない限り、自己負担額登録の送信はブロックされます。
examples/oncology-patient-access
毎日の現金照合 — 財務エージェントがトランザクションを照合しますが、現金担当者が署名するまで例外ゲートでロックされます。
examples/daily-cash-reconciliation
🔌 フレームワークとの統合
ドロップインコネクタが既存のツールを管理します:
LangChain → packages/connector-langchain
Claude Agent SDK → packages/connector-claude-agent
TypeScript / Python SDK → packages/sdk · packages/sdk-python
サーバーを実行すると、SDK の governedTool は、中央集権的な承認と記録のために各呼び出しをプロキシセッションにルーティングします:
import { createClient, governedTool, GovernanceDeniedError } from "@makerchecker/sdk";
const client = createClient({ baseUrl: "http://localhost:3000", apiKey: "mk_..." });
const { session } = await client.proxy.openSession({ label: "recon-run" });
const match = governedTool(
client,
session.id,
"recon-preparer", // エージェントのロール権限が評価される
"txn-match@1", // skillRef: name@version (入力) => matchTxns(input),
);
await match({ statement, ledger }); // 拒否された場合は GovernanceDeniedError をスローします
await client.proxy.closeSession(session.id);
🖥️ 自己ホスト型サーバー(オプション)
複数のエージェントにわたる中央集権的な強制、人間による承認受信トレイ、およびレビューコンソールが必要な場合は、完全なゲートウェイを実行します。
docker compose up は、Postgres、localhost:3000 上のサーバー、およびシードされたデモを起動し、2つの API キー(管理キー(エージェントが実行を認証するため)と担当者キー(人間レビュー担当者がゲート付きアクションを承認するため))を出力します。シードされた薬物警戒フローは、要求者が自身の承認者として拒否される医療レビューゲートで停止します:
export H='authorization: Bearer mk_...' # 管理キー
export OFFICER='authorization: Bearer mk_...' # 担当者キー
curl -X POST localhost:3000/api/flows/pv-icsr-processing/runs -H "$H" -H 'content-type: application/json' -d '{}'
curl localhost:3000/api/approvals -H "$H" # 要求者は自身の実行を承認できません — 403 で拒否されます
curl -X POST localhost:3000/api/approvals/<id>/decision -H "$H" -H 'content-type: application/json' \
-d '{"decision":"approved","reason":"self-approval attempt"}' # 別担当者が署名します。その後にのみアクションが進行します
curl -X POST localhost:3000/api/approvals/<id>/decision -H "$OFFICER" -H 'content-type: application/json' \
-d '{"decision":"approved","reason":"Seriousness confirmed; file 15-day expedited ICSRs."}'
curl localhost:3000/api/audit/verify -H "$H"
完全なセットアップ、Kubernetes/Helm、およびライブモデルでの実行: docs/quickstart.md。
🔒 検証可能な監査トレイル
すべての決定とツール呼び出しはハッシュチェーン化されたログにコミットされます — 各イベントはイベントの RFC 8785 カノニカル JSON の SHA-256 であり、ジェネシスからの prev_hash を通じてチェーン化され、Ed25519 で署名されています。任意の行を変更すると検証が壊れます。誰でもエクスポートされたバンドルをオフラインで検証できます — データベース不要、生成されたプロセスへの信頼不要:
npx @makerchecker/proof-verifier verify bundle.json
仕様: docs/audit-spec.md。
🗂️ パッケージ
パッケージ | ライセンス | 内容
---|---|---
packages/scan | Apache-2.0 | mc scan — エージェントができることを見つけて分類します。
packages/embedded | Apache-2.0 | インポート可能な強制プリミティブ — コード内のガバナンス。
packages/proof-verifier | Apache-2.0 | 署名付き監査バンドルをオフラインで独立して検証します。
packages/sdk | Apache-2.0 | TypeScript クライアント + サーバー用の governedTool。
packages/sdk-python | Apache-2.0 | Python クライアント + governed_tool。
packages/connector-langchain | Apache-2.0 | LangChain ツールを管理します。
packages/connector-claude-agent | Apache-2.0 | Claude Agent SDK ツールを管理します。
packages/server | AGPL-3.0 | 自己ホスト型 Fastify + Postgres ゲートウェイ、フローエンジン、監査ライター。
packages/web | AGPL-3.0 | React コンソール: 承認受信トレイ、実行ログ、レジストリ。
packages/shared | AGPL-3.0 | ドメインタイプ、カノニカル JSON、暗号ユーティリティ。
📄 ライセンスと貢献
サーバー、Web、共有: AGPL-3.0。mc scan、embedded、SDK、コネクタ、例: Apache-2.0 — クローズドソースエージェントに自由に組み込めます。商用(コピーレフトなし)ライセンス: hello@makerchecker.ai。貢献: CONTRIBUTING.md · セキュリティ: SECURITY.md · 行動規範: CODE_OF_CONDUCT.md