Microsoft DefenderでローカルAIエージェントとMCPを自動検出する方法

社内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対応IDECursor、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 HuntingDefender 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

確認すべき主な値は次のとおりです。

項目期待する状態
AMRunningModeNormal
RealTimeProtectionEnabledTrue
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

出力結果では、少なくとも次の項目を確認します。

項目期待する状態
licensedtrue
healthytrue
passive_mode_enabledfalse
real_time_protection_enabledtrue
engine_load_statusエンジンが正常に読み込まれている状態
app_version組織の現行バージョン
engine_version当月の現行エンジン
definitions_statusup_to_date

licensedは端末がテナントへオンボードされているかを確認する目安になります。passive_mode_enabledがtrue、またはreal_time_protection_enabledがfalseの場合は、Defenderポータル側を調べる前にmacOS側のポリシー配布状況を確認します。(Microsoft Learn)

DefenderポータルでAIエージェントを確認する

端末側の前提条件を確認したら、Microsoft Defenderポータルでインベントリを開きます。

  1. Microsoft Defenderポータルへサインインします。
  2. 左側のナビゲーションから「Assets」を開きます。
  3. 「AI agents」を選択します。
  4. 「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がtrue
  • trustedProcessが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、端末、アカウントを調べる
ExposureGraphNodesAIエージェント、端末、ユーザー、クラウド資産の属性や重要度を調べる
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構成によってアクセス可能な情報や実行できる操作が変わるためです。

優先順位を付けて調査する

次の条件に該当するものから確認すると、調査対象を絞り込めます。

  1. 重要端末や管理者端末で動作している
  2. 重要ユーザーのアカウントで利用されている
  3. Auto-approveが有効になっている
  4. ホストプロセスが信頼済みとして認識されていない
  5. 管理対象外の外部MCPエンドポイントへ接続している
  6. ローカルMCPの起動コマンドにシェルやスクリプト実行が含まれる
  7. 同じ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を見落としやすいため、ポータルを確認する前に端末側の状態を点検することが重要です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次