defender-xdr
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| defender_get_capabilitiesA | What this tenant exposes, as a ZeroSOC capability binding. Call it once before
investigating. It checks which hunting tables hold data, which are exposed but empty and
which the licence does not expose at all, which APIs answer, and which application
permissions are granted, so an empty query result is read correctly: a visibility gap, a
missing licence or a missing permission. Returns |
| defender_decode_commandA | Decode a PowerShell -EncodedCommand payload (base64 of UTF-16LE) exactly. Accepts the full
command line, any spelling of the flag (-e, -enc, -ec, ...), or the bare base64. Use it
instead of decoding by hand. A decoding that is itself an encoded command is decoded again,
up to five rounds: |
| defender_to_utcA | Convert a timestamp to UTC exactly. The APIs return UTC; the Defender portal shows the viewer's local time. Convert every time quoted from the portal or by a person before it goes into a timeline, so all entries share one reference. |
| defender_get_exposure_scoreA | Get the organization's exposure score: lower is better. |
| defender_get_secure_scoreA | Get the Microsoft Secure Score for Devices: higher is better. |
| defender_get_machine_group_exposure_scoreB | Get the exposure score of each device group. |
| defender_get_device_healthA | List the antivirus health of devices: mode, engine, platform and signature versions and their freshness, last quick and full scan. A device whose antivirus is passive, disabled or out of date explains a missing detection. |
| defender_export_antivirus_healthA | Get the short-lived download links of the full antivirus health report of every device. For a bounded look at it use defender_get_device_health. |
| defender_get_vulnerabilitiesB | List the vulnerabilities that affect the organization, e.g. filter "severity eq 'Critical'" or "publicExploit eq true". |
| defender_get_vulnerability_by_idA | Get one vulnerability by CVE ID: severity, CVSS, exploit availability, exposed devices. |
| defender_get_machine_vulnerabilitiesA | List the vulnerabilities that affect one device. |
| defender_get_machines_by_vulnerabilityB | List the devices exposed to a vulnerability. |
| defender_get_softwareB | List the software inventory of the organization with weaknesses and exposed devices. |
| defender_get_software_by_idB | Get one software entry: vendor, weaknesses, exploit availability, exposed devices. |
| defender_get_software_vulnerabilitiesB | List the vulnerabilities of one software entry. |
| defender_get_machines_by_softwareB | List the devices that have a software installed. |
| defender_get_software_version_distributionA | Get the distribution of installed versions of a software. |
| defender_get_recommendationsA | List security recommendations, e.g. filter "remediationType eq 'ConfigurationChange'". |
| defender_get_recommendation_by_idC | Get one security recommendation. |
| defender_get_recommendation_machinesB | List the devices a security recommendation applies to. |
| defender_get_recommendation_vulnerabilitiesA | List the vulnerabilities a security recommendation addresses. |
| defender_get_remediation_activitiesB | List remediation activities with their status and due date. |
| defender_get_remediation_activity_by_idC | Get one remediation activity. |
| defender_get_remediation_exposed_devicesA | List the devices still exposed under a remediation activity. |
| defender_export_assessmentA | Read a per-device assessment: one row per device and software, vulnerability, configuration or browser extension. The full export is large; this returns one bounded page and the next link. |
| defender_get_machine_actionsA | List response actions taken on devices (isolation, release, scans, quarantine, packages, live response) with their status, requestor, comment and times, e.g. filter "machineId eq ''" or "type eq 'Isolate'". It lists actions taken by anyone, people included, so it is how to check whether a containment still stands. |
| defender_get_machine_action_by_idA | Get one machine action: type, status (Pending, InProgress, Succeeded, Failed, TimeOut, Cancelled), requestor, comment and times. Poll it after a response action. |
| defender_get_package_sas_uriA | Get the short-lived download link of a collected investigation package. The link grants access to forensic data: hand it to a person, do not store it in a note. |
| defender_get_live_response_resultA | Get the short-lived download link of the output of one live response command. |
| defender_get_investigationsA | List automated investigations with their state and the alert that triggered each. |
| defender_get_investigation_by_idA | Get one automated investigation: state, status details, device and triggering alert. |
| defender_list_library_filesA | List the scripts in the live response library. |
| defender_get_indicatorsA | List the custom indicators (allow, audit, warn, block) of the tenant, with OData filtering, e.g. "indicatorValue eq '203.0.113.7'", "action eq 'Block'". |
| defender_get_file_infoA | Get what Defender knows about a file by hash: global prevalence and first seen, size, type, signer and issuer, determination. Only the hash leaves the environment. |
| defender_get_file_statisticsA | Get the prevalence of a file in this organization and worldwide, with first and last seen. A file seen on one device and nowhere else is worth a closer look. |
| defender_get_file_alertsA | List the Defender for Endpoint alerts that involve a file. |
| defender_get_file_machinesA | List the devices a file was seen on: the lateral scope of a hash. |
| defender_get_domain_alertsB | List the Defender for Endpoint alerts that involve a domain. |
| defender_get_domain_machinesB | List the devices that communicated with a domain: the lateral scope of a domain. |
| defender_get_domain_statisticsA | Get the prevalence of a domain in this organization, with first and last seen. |
| defender_get_ip_alertsA | List the Defender for Endpoint alerts that involve an IP address. |
| defender_get_ip_statisticsA | Get the prevalence of an IP address in this organization, with first and last seen. |
| defender_get_user_alertsB | List the Defender for Endpoint alerts that involve a user. |
| defender_get_user_machinesA | List the devices a user logged on to: logon relationships, not role or privilege. |
| defender_get_machinesA | List devices onboarded to Defender for Endpoint, with OData filtering, e.g. "healthStatus eq 'Active'", "riskScore eq 'High'", "startswith(computerDnsName,'ws')". |
| defender_get_machine_by_idA | Get one device: DNS name, OS, health, risk and exposure level, tags, device value, IPs, first and last seen. Accepts the machine ID (the mdeDeviceId of alert evidence). |
| defender_find_machines_by_ipA | Find the devices that had an IP address around a given time. |
| defender_find_machines_by_tagB | Find the devices that carry a tag. |
| defender_get_machine_logon_usersA | List the users that logged on to a device. |
| defender_get_machine_alertsA | List the Defender for Endpoint alerts of one device. |
| defender_update_machineB | Update a device's tags or device value (a metadata write). |
| defender_add_remove_machine_tagA | Add a tag to a device or remove one (a metadata write). |
| entra_list_sign_insA | List interactive sign-ins from the Entra ID sign-in log: user, application, client and IP address, location, device, conditional access result, MFA detail, risk and error code. Always filter, e.g. "userPrincipalName eq 'alice@contoso.com' and createdDateTime ge 2026-01-01T00:00:00Z", "ipAddress eq '203.0.113.7'", "status/errorCode ne 0". Timestamps are UTC. Requires an Entra ID P1 or P2 licence in the tenant; retention is 30 days. |
| entra_list_directory_auditsA | List Entra ID directory audit events: changes to users, groups, roles, applications, service principals, credentials and policies, with who made them. Always filter, e.g. "activityDisplayName eq 'Add member to role'", "initiatedBy/user/userPrincipalName eq 'alice@contoso.com'", "activityDateTime ge 2026-01-01T00:00:00Z", "targetResources/any(t: t/id eq '')". Timestamps are UTC. |
| defender_run_hunting_queryA | Run an advanced hunting query (KQL) across Defender XDR data: endpoint, identity, email and cloud apps in one query. Tables include AlertInfo, AlertEvidence, DeviceProcessEvents, DeviceNetworkEvents, DeviceFileEvents, DeviceRegistryEvents, DeviceLogonEvents, DeviceEvents, IdentityLogonEvents, IdentityDirectoryEvents, EmailEvents, EmailUrlInfo, UrlClickEvents and CloudAppEvents. Which tables hold data depends on the tenant's licences: an empty result from a table that defender_get_capabilities reports as empty or not exposed is a visibility gap, not a finding and not a permissions problem. The sensor records no creation event for some processes (services started before it, some short-lived instances): a process absent from DeviceProcessEvents may still be there as the InitiatingProcessId and InitiatingProcessCreationTime of other events, so look there before concluding it did not run. Match a process by PID together with its creation time, never by PID alone. Timestamps are UTC. Data is limited to the last 30 days. Example: "DeviceProcessEvents | where Timestamp > ago(1d) | where FileName =~ 'powershell.exe' | project Timestamp, DeviceName, ProcessCommandLine | limit 50". |
| defender_list_alertsA | List alerts from all Defender XDR workloads: Endpoint, Office 365 email, Identity, Cloud Apps and Entra ID Protection. Supports OData filtering with Graph camelCase values, e.g. "severity eq 'high'", "status eq 'new'", "serviceSource eq 'microsoftDefenderForEndpoint'", "createdDateTime gt 2026-01-01T00:00:00Z". Each alert carries its evidence inline. For the alerts of one incident use defender_get_incident_alerts. |
| defender_get_alertA | Get one alert with its full evidence (files, processes, registry keys, IPs, URLs, users, mailboxes, devices), MITRE techniques, detection source, detector ID and comment thread. |
| defender_update_alertA | Update an alert (a triage write): status, assignee, classification and determination. |
| defender_add_alert_commentA | Append a comment to an alert's comment thread (a triage write), visible to analysts in the Defender portal. Notes about the whole case belong on the incident instead. |
| defender_list_incidentsA | List incidents from Microsoft Defender XDR. Incidents group related alerts from all Defender workloads (endpoint, identity, email, cloud apps) into one attack story. Supports OData filtering with Graph camelCase values, e.g. "status eq 'active'", "severity eq 'high'", "lastUpdateDateTime gt 2026-01-01T00:00:00Z", "assignedTo eq 'analyst@contoso.com'". Use it to find incidents before drilling into one. A merged incident has status 'redirected' and names its master in redirectIncidentId. |
| defender_get_incidentA | Get one incident as it is stored: severity, status, classification, determination, owner, custom tags, comment thread, timestamps, and redirectIncidentId when it was merged into another. The starting point of incident analysis; it does not follow merges (use defender_resolve_incident for that). |
| defender_resolve_incidentA | Follow the merge history of an incident to its master. Returns the master incident with incidentId (the master's ID) and redirectedFrom (the merged IDs walked, in order; empty when the incident is live). Writes made by this server already do this; call it to learn where an incident went. |
| defender_get_incident_alertsA | Get the alerts of an incident, paged (skip/top), with their details: title, severity, category, MITRE techniques, detection source, timestamps and nested evidence. For the entities themselves prefer defender_get_incident_evidence, which flattens and de-duplicates the evidence of every alert in one call. |
| defender_get_incident_evidenceA | The full evidence inventory of an incident: the portal's evidence view as one table. Pages
through every alert and flattens the evidence into one row per evidence item, each joined to
its device (by device ID, else through the alert) and listing the alerts that cite it. A row
is the source's own unit: entityCount equals the portal's count of evidence items and is the
number to reconcile; rowCount is the number of per-alert evidence rows. The source lists one
process more than once when alerts describe it differently (no image file, another path, a
different verdict): those rows share |
| defender_update_incidentA | Update an incident (a triage write): status, assignee, classification, determination and custom tags. If the incident was merged into another, the update is applied to the master incident and redirectedFrom says so. |
| defender_add_incident_commentA | Append a comment to an incident's comment thread (a triage write), visible to analysts in the Defender portal. If the incident was merged into another, the comment is written on the master incident, where analysts will read it, and redirectedFrom says so. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 66 tools
Most tools use a clear resource-plus-attribute pattern (get_machine_*, get_file_*, get_recommendation_*), so their purposes are largely distinct. A few inverse/overlapping pairs—machine_vulnerabilities vs machines_by_vulnerability, file_info vs file_statistics, incident_alerts vs incident_evidence—require careful reading and could cause misselection.
The dominant defender_get_<resource> and defender_update_<resource> conventions are consistent and readable. Deviations are minor but visible: mixed get_/list_ for collections, find_machines_by_* instead of get_*, the combined add_remove verb, and an entra_ prefix inside a defender_ server.
66 tools is far beyond the typical well-scoped MCP surface and exceeds the 50+ extreme-mismatch boundary. Even though the tools are grouped by domain, this scale creates significant selection and maintenance overhead and would be better split into focused servers.
Investigation, hunting, alert/incident triage, and vulnerability views are well covered. However, the response half of XDR is missing: there are no tools to isolate/release machines, run live response, create/delete indicators, or mutate remediation activities, leaving obvious dead ends after detection.