社内PCにClaude CodeやCodex CLI、ChatGPT Desktop、Cursor、GitHub CopilotなどのAIツールが導入されても、情報システム部門やSOCがすべてを把握できるとは限りません。さらに、AIエージェントから社内ファイルや外部サービスへ接続するMCPサーバーが設定されると、端末上のAI利用状況は一段と見えにくくなります。
Microsoft Defender for Endpointの「AI agent discovery」を利用すると、正しくオンボードされたWindows/macOS端末から、サポート対象のローカルAIエージェントと関連するMCPサーバー構成を自動検出できます。追加の検出スクリプトや専用パッケージを配布する必要はありません。検出結果はMicrosoft Defenderポータルのインベントリと、Advanced HuntingのAgentsInfoテーブルから確認できます。(Microsoft Learn)
ただし、Defender for Endpoint Plan 2、商用クラウド、Microsoft Defender AntivirusのActive mode、リアルタイム保護などの前提条件があります。また、この機能はプレビューであり、すべてのAIアプリや単独で稼働するMCPサーバーを無条件に検出するものではありません。Sovereign cloudやnational cloudも現時点では対象外です。(Microsoft Learn)
DefenderのローカルAIエージェント検出とは
ローカルAIエージェント検出は、従業員のWindows/macOS端末で利用されているAIエージェントを、Microsoft Defenderの資産として可視化する機能です。
ローカルAIエージェントは、実行ユーザーの権限を使ってファイル、コマンド、ツール、クラウドサービスへアクセスできます。そのため、どの端末で誰が何を利用しているか分からない状態では、AI利用のリスク評価やインシデント調査が難しくなります。Defenderは検出したエージェントを端末やユーザーと関連付け、組織全体のAI利用状況を一元的に確認できるようにします。(Microsoft Learn)
主に確認できる情報は次のとおりです。
| 確認項目 | 主な内容 |
|---|---|
| AIエージェント | 名前、ベンダー、バージョン、関連プロセス |
| 利用端末 | デバイス名、OS、デバイスID、デバイス種別 |
| 利用者 | アカウント名、ドメイン、SIDなど |
| 実行設定 | ホストプロセスの信頼状態、Auto-approve設定 |
| MCPサーバー | リモートMCPのエンドポイント、ローカルMCPの起動コマンド |
| 発見情報 | 初回検出日時、ライフサイクル状態 |
| 関連資産 | エージェント、端末、ユーザー、アクセス可能な資産の関係 |
ポータルでは、単に「AIソフトがインストールされている」という情報だけでなく、どのアカウントで動作し、どのMCPサーバーが構成されているかまで確認できます。(Microsoft Learn)
検出対象となるAIエージェントの例
Microsoftがプレビュー資料で挙げているサポート対象には、CLI、デスクトップアプリ、AI対応IDE、VS Code拡張機能、Claw系エージェントなどがあります。
| 種類 | 公式情報に掲載されている主な例 |
|---|---|
| CLIエージェント | Claude Code、Codex CLI、Gemini CLI、GitHub Copilot CLI、Kiro CLI、OpenCode |
| デスクトップアプリ | ChatGPT Desktop、Claude Desktop、Codex Desktop、Ollama Desktop、Perplexity Desktop |
| AI対応IDE | Cursor、Devin Desktop、Kiro IDE |
| VS Code拡張機能 | Claude Code、Cline、Codex、Gemini Code Assist、GitHub Copilot、Roo Code |
| Claw系エージェント | OpenClaw、Clawpilot、QClawなど |
サポート対象はプレビュー期間中に追加、変更される可能性があります。上表は固定的な対応保証リストではなく、検出対象のイメージをつかむための代表例として扱ってください。(Microsoft Learn)
また、Defenderでは基本的に「ユーザー、デバイス、エージェント種別」の組み合わせを1つのエージェントとして扱います。同じユーザーが同じ端末上でClaude Codeを複数のプロジェクトフォルダーから利用しても、通常は1件として表示されます。一方、同じ端末でも利用アカウントが異なる場合や、別の端末で動作する場合は別のエントリになります。(Microsoft Learn)
自動検出を利用するための前提条件
ローカルAIエージェント検出は、Defender for Endpointに端末が表示されているだけでは利用できません。次の条件をすべて確認する必要があります。(Microsoft Learn)
| 前提条件 | 確認内容 |
|---|---|
| クラウド環境 | Microsoftの商用クラウドであること |
| ライセンス | Microsoft Defender for Endpoint Plan 2以上 |
| オンボーディング | 対象端末がDefender for Endpointへ正しくオンボードされていること |
| OS | サポート対象のWindowsまたはmacOSであること |
| Defender更新 | 当月の現行Defenderプラットフォームとエンジンが適用されていること |
| Antivirusモード | Microsoft Defender AntivirusがActive modeで動作していること |
| リアルタイム保護 | Real-time protectionが有効であること |
| 追加配布 | 専用スクリプトや追加の検出設定は不要 |
| 非対応環境 | Sovereign cloud、national cloudは未対応 |
特に見落としやすいのが、Microsoft Defender Antivirusの動作モードです。Defender for Endpointにオンボード済みでも、他社製アンチウイルスを利用している端末ではDefender AntivirusがPassive modeになっている場合があります。今回の自動検出にはActive modeが必要なため、EDRデータが取得できているだけでは要件を満たさない可能性があります。(Microsoft Learn)
ライセンスによって確認できる内容が異なる
自動検出、AIエージェントインベントリ、AgentsInfoを使ったAdvanced Huntingには、Defender for Endpoint Plan 2が最低限必要です。
一方、検出したローカルAIエージェントのリスクレベル、リスク指標、セキュリティ推奨事項まで表示するには、Microsoft 365 E7、またはMicrosoft Agent 365とDefender for Endpoint Plan 2の組み合わせが必要とされています。(Microsoft Learn)
| 利用したい機能 | 必要なライセンス |
|---|---|
| ローカルAIエージェントの自動検出 | Defender for Endpoint Plan 2 |
| AIエージェントインベントリの表示 | Defender for Endpoint Plan 2 |
AgentsInfoによるAdvanced Hunting | Defender for Endpoint Plan 2 |
| リスクレベル、リスク指標、推奨事項 | Microsoft 365 E7、またはMicrosoft Agent 365+Defender for Endpoint Plan 2 |
Microsoft 365 E5にはDefender for Endpoint Plan 2が含まれるため、検出やAdvanced Huntingは利用できます。ただし、プレビュー資料上では、追加のAIエージェント向けリスク評価機能まで同じ条件で利用できるとは限りません。ライセンスを確認するときは、「Defender for Endpoint Plan 2があるか」だけでなく、「どの列や評価情報まで必要か」を整理しておくことが重要です。(Microsoft Learn)
社内PCのローカルAIエージェントとMCPサーバーをDefenderで探す手順
Windows端末の前提条件を確認する
Windowsでは、管理者権限でPowerShellを開き、次のコマンドを実行します。
Get-MpComputerStatus |
Select-Object `
AMRunningMode,
RealTimeProtectionEnabled,
AMProductVersion,
AMEngineVersion
確認すべき主な値は次のとおりです。
| 項目 | 期待する状態 |
|---|---|
AMRunningMode | Normal |
RealTimeProtectionEnabled | True |
AMProductVersion | 組織が配布している現行プラットフォーム |
AMEngineVersion | 当月の現行エンジン |
AMRunningModeがNormalであれば、Microsoft Defender AntivirusはActive modeで動作しています。Passive Modeと表示された場合は、今回のローカルAIエージェント検出の前提を満たしません。EDR Block Modeと表示される場合も、Active modeであると即断せず、Defender Antivirusの構成とForceDefenderPassiveModeの状態を確認してください。(Microsoft Learn)
他社製アンチウイルスをプライマリ製品として利用しているWindows端末では、Defender Antivirusが自動的にPassive modeになる構成があります。この場合、AIエージェント検出を優先して安易にActive modeへ変更すると、アンチウイルス製品の競合を起こす可能性があります。既存のエンドポイント保護設計を確認したうえで判断してください。(Microsoft Learn)
macOS端末の前提条件を確認する
macOSでは、ターミナルから次のコマンドを実行します。
mdatp health
出力結果では、少なくとも次の項目を確認します。
| 項目 | 期待する状態 |
|---|---|
licensed | true |
healthy | true |
passive_mode_enabled | false |
real_time_protection_enabled | true |
engine_load_status | エンジンが正常に読み込まれている状態 |
app_version | 組織の現行バージョン |
engine_version | 当月の現行エンジン |
definitions_status | up_to_date |
licensedは端末がテナントへオンボードされているかを確認する目安になります。passive_mode_enabledがtrue、またはreal_time_protection_enabledがfalseの場合は、Defenderポータル側を調べる前にmacOS側のポリシー配布状況を確認します。(Microsoft Learn)
DefenderポータルでAIエージェントを確認する
端末側の前提条件を確認したら、Microsoft Defenderポータルでインベントリを開きます。
- Microsoft Defenderポータルへサインインします。
- 左側のナビゲーションから「Assets」を開きます。
- 「AI agents」を選択します。
- 「Local agents」タブを開きます。
条件を満たした端末では、追加の検出スクリプトを実行しなくても、サポート対象のAIエージェント検出が自動的に開始されます。(Microsoft Learn)
インベントリでは、次の観点でフィルターをかけると調査しやすくなります。
| 調査目的 | 確認する列やフィルター |
|---|---|
| 未承認AIツールを探す | Agent name、Vendor、Version |
| 特定端末の利用状況を調べる | Device name、Device ID、OS platform |
| 利用者を特定する | Account name、Account domain |
| MCP利用端末を探す | MCP servers、Local MCPs |
| 危険度の高い構成を絞る | Risk level、Risk indicators、Recommendations |
| 新しく導入されたものを探す | First seen |
一覧にはエクスポート機能もあるため、CSVなどへ出力して、承認済みAIツールの台帳と突き合わせる運用も可能です。リスク関連の列は、保有ライセンスによって表示されない場合があります。(Microsoft Learn)
エージェントの詳細画面で確認する項目
一覧からエージェントを選択すると、詳細ペインが開きます。
| タブ・項目 | 確認できる内容 |
|---|---|
| Details | エージェント名、ベンダー、モデル、バージョン、関連プロセス |
| Risk | リスクレベル、リスク指標、推奨事項 |
| Device details | 端末名、OS、デバイス種別、Microsoft EntraデバイスID |
| User details | 利用アカウント、ドメイン、SID |
| MCP servers | ネットワーク経由で接続するMCPサーバー |
| Local MCP servers | 端末内でプロセスとして起動するMCPサーバー |
詳細画面からAdvanced Huntingを開く「Go hunt」、関連資産を確認する「View on map」、エージェント全体のページを開く「Open Agent page」も利用できます。(Microsoft Learn)
Advanced HuntingでローカルAIエージェントを一覧化する
大量の端末を調べる場合や、継続的な監視クエリを作る場合はAdvanced Huntingを利用します。
Defenderポータルで「Investigation & response」から「Hunting」、「Advanced hunting」の順に開き、AgentsInfoテーブルを検索します。
最初は次のクエリで、現在存在するローカルAIエージェントを一覧化します。
AgentsInfo
| where Platform == "LocalAgents"
| summarize arg_max(Timestamp, *) by AgentId
| where LifecycleStatus !in~ ("Deleted", "Uninstalled")
| sort by Timestamp desc
AgentsInfoには同じエージェントの状態が複数時点のスナップショットとして記録されます。arg_max(Timestamp, *)を使うことで、エージェントごとの最新状態だけを取得できます。また、削除済み、アンインストール済みのレコードを除外しないと、現在は利用されていないエージェントも一覧に残ります。(Microsoft Learn)
端末、ユーザー、MCP構成をまとめて表示するKQL
次のクエリでは、エージェント名、端末、利用者、ホストプロセス、Auto-approve、MCP構成を一度に確認できます。
AgentsInfo
| where Platform == "LocalAgents"
| summarize arg_max(Timestamp, *) by AgentId
| where LifecycleStatus !in~ ("Deleted", "Uninstalled")
| extend LocalMetadata = RawAgentInfo.localAgentMetadata
| extend Agent = tostring(
column_ifexists(
"Name",
column_ifexists("AgentName", "")
)
)
| project
LastSeen = Timestamp,
Agent,
Version,
Vendor = tostring(LocalMetadata.vendor),
Device = tostring(LocalMetadata.deviceName),
Account = tostring(LocalMetadata.accountName),
AccountDomain = tostring(LocalMetadata.accountDomain),
HostProcess = tostring(LocalMetadata.relatedProcess),
AutoApprove = tostring(LocalMetadata.autoApprove),
TrustedProcess = tostring(LocalMetadata.trustedProcess),
RemoteMcpServers = McpServers,
LocalMcpServers = LocalMetadata.localMcps
| sort by Device asc, Agent asc
プレビュー中の機能では、資料やテナントの更新時期によって表示名列がNameまたはAgentNameになっている可能性があります。上の例ではcolumn_ifexists()を使い、存在する列を選ぶようにしています。実際に運用へ組み込む際は、Advanced Hunting画面に表示される自組織のスキーマを優先してください。(Microsoft Learn)
RawAgentInfo.localAgentMetadataには、ベンダー、ホストプロセス、端末、アカウント、Auto-approve、ローカルMCPなどの情報が格納されます。autoApproveとtrustedProcessは真偽値ではなく文字列として報告されるため、条件判定では"true"や"false"と比較します。(Microsoft Learn)
MCPサーバーをローカルとリモートに分けて確認する
MCPサーバーは、端末内のコマンドとして起動するローカルMCPと、ネットワーク上のエンドポイントへ接続するリモートMCPに分けて確認すると調査しやすくなります。
let CurrentLocalAgents =
AgentsInfo
| where Platform == "LocalAgents"
| summarize arg_max(Timestamp, *) by AgentId
| where LifecycleStatus !in~ ("Deleted", "Uninstalled")
| extend LocalMetadata = RawAgentInfo.localAgentMetadata
| extend Agent = tostring(
column_ifexists(
"Name",
column_ifexists("AgentName", "")
)
)
| project
Timestamp,
Agent,
Device = tostring(LocalMetadata.deviceName),
Account = tostring(LocalMetadata.accountName),
RemoteMcps = McpServers,
LocalMcps = LocalMetadata.localMcps;
let RemoteMcpInventory =
CurrentLocalAgents
| mv-expand Mcp = RemoteMcps
| project
LastSeen = Timestamp,
Agent,
Device,
Account,
McpName = tostring(Mcp.name),
Origin = "Remote",
Transport = tostring(Mcp.type),
Location = tostring(Mcp.endpoint);
let LocalMcpInventory =
CurrentLocalAgents
| mv-expand Mcp = LocalMcps
| project
LastSeen = Timestamp,
Agent,
Device,
Account,
McpName = tostring(Mcp.name),
Origin = "Local",
Transport = tostring(Mcp.transportType),
Location = tostring(Mcp.commandName);
RemoteMcpInventory
| union LocalMcpInventory
| where isnotempty(McpName)
| sort by Device asc, Agent asc, McpName asc
OriginがRemoteの場合、Locationには接続先エンドポイントが入ります。Localの場合は、端末上でMCPサーバーを起動するコマンドが表示されます。ローカルMCPの詳細はAgentsInfo内のlocalMcpsから取得します。(Microsoft Learn)
このクエリは各エージェントの最新状態だけを対象にしています。過去に一時的に設定されていたMCPサーバーも調べる場合は、先にarg_max()で絞り込まず、各レコードを展開した後にMCPサーバー単位で最終検出時刻を集計します。
Auto-approveと信頼されていないプロセスを抽出する
AIエージェントの調査では、次の2項目を優先的に確認すると効率的です。
autoApproveがtruetrustedProcessがfalse
該当するエージェントは、次のKQLで抽出できます。
AgentsInfo
| where Platform == "LocalAgents"
| summarize arg_max(Timestamp, *) by AgentId
| where LifecycleStatus !in~ ("Deleted", "Uninstalled")
| extend LocalMetadata = RawAgentInfo.localAgentMetadata
| extend Agent = tostring(
column_ifexists(
"Name",
column_ifexists("AgentName", "")
)
)
| extend
AutoApprove = tostring(LocalMetadata.autoApprove),
TrustedProcess = tostring(LocalMetadata.trustedProcess)
| where AutoApprove =~ "true"
or TrustedProcess =~ "false"
| project
LastSeen = Timestamp,
Agent,
Version,
Vendor = tostring(LocalMetadata.vendor),
Device = tostring(LocalMetadata.deviceName),
Account = tostring(LocalMetadata.accountName),
HostProcess = tostring(LocalMetadata.relatedProcess),
AutoApprove,
TrustedProcess
| sort by Device asc, Agent asc
Auto-approveが有効なエージェントは、操作のたびに人の承認を求めず、ツールやリソースへアクセスする可能性があります。ただし、trueであることだけを理由に不正なエージェントと判断してはいけません。実行ユーザーの権限、端末の重要度、接続するMCP、業務上の必要性を合わせて評価します。(Microsoft Learn)
AgentsInfoとExposure Graphの使い分け
Advanced Huntingでは、主に次の3テーブルを使います。
| テーブル | 主な用途 |
|---|---|
AgentsInfo | エージェントの種類、バージョン、設定、MCP、端末、アカウントを調べる |
ExposureGraphNodes | AIエージェント、端末、ユーザー、クラウド資産の属性や重要度を調べる |
ExposureGraphEdges | エージェント、端末、ユーザー、資産間の関係を調べる |
簡単に整理すると、AgentsInfoは「このエージェントは何で、どのように構成されているか」、Exposure Graphは「そのエージェントが何に到達できるか」を調査するために使います。(Microsoft Learn)
注意したいのは、ExposureGraphEdges自体にはローカルAIエージェントだけを識別する専用プロパティがないことです。先にExposureGraphNodesでLocalAgentsを抽出し、そのNodeIdを使ってExposureGraphEdgesへ結合します。単純にSourceNodeLabel == "ai-agent"だけで検索すると、クラウド上のAIエージェントまで混在する可能性があります。(Microsoft Learn)
DefenderにローカルAIエージェントが表示されないときの確認事項
検出結果が空の場合、AIエージェント側の再インストールから始めるのではなく、次の順番で確認します。
| 症状 | 優先して確認すること |
|---|---|
| Local agentsタブが空 | 商用クラウド、Plan 2、端末オンボーディング |
| Windowsだけ検出されない | AMRunningModeがNormalか |
| macOSだけ検出されない | passive_mode_enabledとリアルタイム保護 |
| 一部のAIツールだけ表示されない | サポート対象の製品、形態、バージョンか |
| MCPが表示されない | サポート対象エージェントに関連付けられた構成か |
| リスク列が空 | Microsoft 365 E7またはMicrosoft Agent 365の有無 |
| 同じ製品が複数表示される | 端末や利用アカウントが異なっていないか |
| KQLで結果が出ない | Platform == "LocalAgents"の指定とテーブル名 |
| 削除済みエージェントが残る | LifecycleStatusを除外しているか |
古い記事やサンプルではAIAgentsInfoテーブルが使われている場合があります。MicrosoftはAIAgentsInfoからAgentsInfoへの移行を案内しており、旧テーブルの移行期限は2026年7月1日とされていました。現在のクエリはAgentsInfoを前提に作成してください。(Microsoft Learn)
また、MCPサーバー検出は、サポート対象のローカルAIエージェントに関連付けられたMCP構成を可視化する仕組みです。端末上で独立して起動している任意のプロセスを、すべてMCPサーバーとして識別する汎用プロセススキャンとは考えないほうが安全です。(Microsoft Learn)
自動検出後に実施すべき運用
ローカルAIエージェントが見えるようになっても、インベントリを眺めるだけではシャドーAI対策にはなりません。検出結果を、承認、調査、是正の流れへ接続する必要があります。
承認済みAIエージェントとMCPの基準を決める
最低限、次の3分類を用意します。
| 分類 | 判断例 |
|---|---|
| 承認済み | 利用目的、管理者、データ取り扱い、MCP接続先が確認済み |
| 条件付き | 開発端末限定、テストデータ限定、特定MCPのみ許可 |
| 未確認・禁止 | 管理者不明、外部MCP接続、機密端末での無断利用 |
製品名だけで承認するのではなく、エージェントのバージョン、利用アカウント、接続MCPまで含めて判定することが重要です。同じAIエージェントでも、MCP構成によってアクセス可能な情報や実行できる操作が変わるためです。
優先順位を付けて調査する
次の条件に該当するものから確認すると、調査対象を絞り込めます。
- 重要端末や管理者端末で動作している
- 重要ユーザーのアカウントで利用されている
- Auto-approveが有効になっている
- ホストプロセスが信頼済みとして認識されていない
- 管理対象外の外部MCPエンドポイントへ接続している
- ローカルMCPの起動コマンドにシェルやスクリプト実行が含まれる
- 同じAIエージェントで複数バージョンが混在している
これらは、不正や脆弱性を自動的に確定する条件ではありません。業務上の必要性と影響範囲を確認するためのトリアージ基準です。
検出と遮断を分けて考える
今回のAI agent discoveryは、主に「何が存在するか」を明らかにする可視化機能です。ローカルAIエージェントを検出しただけで、自動的にアプリやMCP通信が遮断されるわけではありません。
Microsoft Defenderには、エージェントの処理ループを監視し、悪意のある指示が実行される前にブロックするAI agent runtime protectionも用意されていますが、自動検出とは別の保護機能として設計されています。(Microsoft Learn)
実際の統制では、必要に応じて次のような対策を組み合わせます。
- 承認されていないAIアプリや拡張機能の削除
- MCP設定ファイルの是正
- 外部MCPエンドポイントの許可制
- 実行ユーザーの権限縮小
- 開発用アカウントと管理者アカウントの分離
- アプリケーション制御やネットワーク制御
- DLP、監査ログ、Advanced Huntingによる継続監視
- AI agent runtime protectionなどの追加保護
DefenderによるAIエージェント検出で最初に行うこと
まず、WindowsとmacOSから数台ずつパイロット端末を選び、Defender AntivirusのActive mode、リアルタイム保護、プラットフォームとエンジンの更新状態を確認します。その後、Defenderポータルの「Assets」から「AI agents」「Local agents」を開き、既知のAIエージェントが表示されるか検証してください。
次に、AgentsInfoでPlatform == "LocalAgents"を指定したKQLを実行し、端末、ユーザー、Auto-approve、MCP構成を一覧化します。最後に、承認済みAIエージェントとMCPの基準を作り、未確認の構成を定期的に調査する運用へつなげます。
追加スクリプトなしで自動検出できる点は大きな利点ですが、実際の成否を左右するのはライセンス、オンボーディング、Defender Antivirusの動作モードです。特に他社製アンチウイルスとの併用環境ではPassive modeを見落としやすいため、ポータルを確認する前に端末側の状態を点検することが重要です。

コメント