
Uber ADRの使い方——AIエージェントが「やったこと」をログから集め、危ない振る舞いを2段で検知する
朝、AIエージェントの夜間ログを開いたら、見覚えのないファイルを読んだ記録が1行ありました。
誰も頼んでいない。でも、止める仕組みも無かった。
これ、ありませんか?
Uber ADRは、その「見覚えのない1行」を機械で拾うためのオープンソースです。今月1,509スター増(GitHub Trending月間・2026年9月2日取得)。作者はUber、ライセンスはApache 2.0。
READMEの一言に性格が出ています。Agentic AI Detection and Response。AIエージェント向けの「検知と対応」。Uberの本番で動いていて、論文はMLSys 2026に採択されたと書いてあります。
この記事では、Uber ADRの使い方を「何者か・4つの部品・集める・棚卸しする・判定する」の順で書きます。うちではまだ本番に入れていないので、READMEから読めることと、うちならこう試すという提案を分けて書きます。
出典はGitHub uber/ADRのREADMEと、同リポジトリのSensor、Discovery、Detectionの各README。2026年9月10日に本文を確認しました。
Uber ADRは何者か——AIエージェント向けの「検知と対応」
セキュリティの世界には、EDRという言葉があります。端末の振る舞いを記録して、怪しい動きを検知し、対応する。
ADRは、その対象をAIエージェントに置き換えたものです。
READMEが挙げる守る相手は2つ。CursorやClaude Codeのような社員が使う道具と、顧客に向いたAIサポート。どちらも、人が全部の操作を見ていられない。
で、何を「振る舞い」として見るのか。エージェントの意図、ツールの呼び出し、実行の跡。READMEは、macOS・Linux・Windowsで7つ以上のAIコーディングツールから、これを集めると書いています。
つまりUber ADRは、AIエージェントの「やったこと」をあとから機械が読める形にして、その中から危ないものを拾う道具です。
4つの部品と、まだ無い1つ
READMEの構成は、5つの能力に分かれています。公開されているのは4つ。
Discoveryは、端末に入っているAIアプリ・CLIエージェント・IDE拡張・モデル実行環境・MCPサーバーを棚卸しする。
Observabilityは、エージェントのログを集めて揃える。リポジトリでは Sensor/ フォルダ。
Benchmarkは、検知の腕を測る試験。300以上のタスク、133のMCPサーバー、17種類の攻撃手法をカバーすると書いてあります。
Detectionは、2段構えの検知器。
そして5つ目のPrevention。READMEにはこうあります。「この部品は現在のオープンソース公開には含まれていない。Stay tuned.」
ここ、大事です。Uber ADRは今のところ「止める」道具ではなく、「見つける」道具。止めるのは、まだ自分で組む必要があります。

STEP1: Sensorで「やったこと」を集める
最初に入れるのは、Sensorです。
入れ方は1行。
pip install adr-sensor集め方が、少し意外でした。Sensorは実行時にフックを差し込むのではなく、各ツールが手元に残しているログを読む。READMEの言い方は「複数のAIエージェント基盤のログを解析し、統一スキーマへ揃える」。
対応しているのは7つ。Claude Codeは ~/.claude/projects/ のJSONL。CursorはSQLite。Codex CLIは ~/.codex/sessions/。ほかにCline、Claude Desktop、Warp、opencode。
いや、ログを読むだけなら自分で書けるでしょ?
僕もそう思ってたんですが、揃えるのが大変なんです。7つのツールは、ログの形も置き場も全部違う。Sensorはそれを AgentEvent という1つの形にする。誰が・いつ・どのモデルで・どのツールを・どんな引数で呼び、結果はどうだったか。
実行はこう。
adr-sensor # 全部のエージェント
adr-sensor --source claude # Claude Code だけ
adr-sensor --output-format jsonl # JSONL で出すPython 3.9から3.13、macOS・Linux・Windowsで動く。OSに無いツールは自動で飛ばされます。
STEP2: Discoveryで「何が入っているか」を棚卸しする
集める前に、そもそも何が入っているかを知りたい。それがDiscoveryです。
uv run adr-discovery --dry-run --json棚卸しするのは、AIのバイナリ、デスクトップアプリ、エージェント、MCPサーバー、スキル、プラグイン。READMEは「知らない面を、確認用に印を付ける」と書いています。
終了コードに意味があります。0なら全部見えた。2なら、見えない場所があったが棚卸し自体は出た。 無人で回すなら、この2を拾って人に知らせる、という設計にできる。
前回との差分も取れます。
uv run adr-discovery --diff /path/to/snapshot.json --dry-run --json先週は無かったMCPサーバーが今週ある。これが分かるだけで、「誰が何を足したか」の会話ができます。Python 3.11以上、外部ライブラリなし。

STEP3: Detectionで判定する——2段構え
集めたログを、危ないかどうか判定するのがDetectionです。
git clone https://github.com/uber/ADR
cd ADR/Detection
uv sync
export ANTHROPIC_API_KEY="..." OPENAI_API_KEY="..."鍵が2社ぶん要る理由が、2段構えです。
1段目はtriage。READMEでは gpt-4o が受け持ち、まず広く拾う。2段目はreasoning。claude-sonnet-4-6 をClaude CLI経由で呼び、拾ったものを深く読む。READMEの表現は「高い再現率の選別と、より深いエージェント的な推論を組み合わせる」。
1段目で取りこぼさず、2段目で誤報を落とす。人間の当直と同じ形です。
鍵を用意する前に腕試しをしたいなら、--detector llamafirewall。鍵なしで動く比較用の検知器で、既定の adr と並べて結果を見られます。
uv run python main_detector.py --results-dir "$BENCH"
uv run python main_detector.py --detector llamafirewall --results-dir "$BENCH"出力は {detector}_baseline_analysis.json。1件ごとの判定と、精度・再現率・F1・混同行列が入ります。
数字の読み方——精度1.000・再現率0.667
READMEが載せている数字を、そのまま書きます。
ベンチマークは303タスク。良性261、悪性42。133のMCPサーバーを使い、脅威のカテゴリは7つ。認証情報の露出、データの持ち出し、範囲の逸脱、監視のやりすぎ、金銭の操作、制御フローの乗っ取り、情報の忠実性への攻撃。
ADRの2段検知器の結果は、精度1.000、再現率0.667(42件中28件)、F1が0.800、誤報0。
ここで、数字の読み方を1つ。
精度1.000は「危ないと言ったものは全部本当に危なかった」。再現率0.667は「本当に危ないもののうち、3分の2を拾えた」。つまり残りの3分の1は見逃している。READMEも隠していません。
で、これをどう評価するか。私は「誤報ゼロで3分の2」は、当直の1段目としては十分だと思います。誤報が多い検知器は、人が読まなくなる。読まれない検知は、無いのと同じです。
ただし、Uber側のベンチマークでの数字であって、自分の環境で同じになる保証はどこにもない。ここは、自分のログで測り直すところです。

うちならこう試す(未実施の提案)
うちは、Claude CodeとCodexを毎日走らせています。まだADRは入れていません。入れるなら、こう試します。
まずSensorだけ。adr-sensor --source claude --output-format jsonl を毎朝1回。何が集まるかを1週間見る。
次にDiscoveryの差分。週1回スナップショットを取って --diff で比べ、知らないMCPサーバーが増えていたら人に知らせる。
Detectionは最後。鍵が2社ぶん要るので、まず llamafirewall で腕試しをして、それから adr に切り替える。誤報がどれだけ出るかを、自分のログで測る。
止める仕組みは、Preventionが来るまで自前です。うちなら、検知結果を朝の報告に1行足すところから。
これは提案であって、実測ではありません。やってみたら、また書きます。
Uber ADRの使い方を一言で
AIエージェントのログを、Sensorが7ツールぶん1つの形に揃える。Discoveryが端末の中身を棚卸しし、差分を出す。Detectionが2段(gpt-4o で選別・claude-sonnet-4-6 で推論)で判定する。数字は精度1.000・再現率0.667。止める部品はまだ無い。
今日、5分でできること。
pip install adr-sensor を打って、adr-sensor --source claude を1回だけ走らせてください。出てきたJSONの tool_name の列を眺める。昨日AIが何を呼んだかが、そこに全部並びます。見覚えのない1行があれば、それがこの道具を入れる理由です。
▶ 関連記事: oMLXの使い方——Macの中でモデルを常駐させて、続きの会話を計算し直さない
▶ 関連記事: RustDeskの使い方を、自分のサーバーで完結させるまで——hbbsとhbbrが何をしているか
OSSを実務で活用するための6大特典
OSSの選び方や、AIエージェントを動かすときの見張り方を整理したい方へ。活用を進めるための6大特典をご案内しています。