Skip to main content
Glama
F6 XDR MCP Server

F6 XDR MCP Server

Official
by F6-Security

F6 XDR MCP Server

PyPI Python License CI

MCP-сервер к платформе F6 XDR. Даёт ИИ-ассистенту доступ к алертам, инцидентам, письмам, файлам, хостам и журналу — поиском на языке запросов платформы.

Тулы

Тул

Назначение

xdr_search

Поиск по секции; пустой запрос возвращает секцию целиком

xdr_count

Количество записей

xdr_get_mapping

Доступные поля поиска

xdr_get_filters

Доступные значения фильтров

xdr_get_suggestions

Реальные значения поля по префиксу

xdr_list_artifacts

Артефакты, собранные с хостов: багрепорты, логи, конфиги, дампы

xdr_get_artifact_structure

Файлы и папки внутри собранного артефакта

xdr_download_artifact

Скачать артефакт или его часть в локальную папку

xdr_list_artifact_presets

Пользовательские артефакты: сохранённые в консоли списки путей и команд

xdr_collect_artifacts

Запустить сбор артефактов с хоста

xdr_abort_artifact_collection

Остановить сбор, который ещё идёт

xdr_mark_event

Пометить объект: закрыть алерт, отметить ложное срабатывание

Секции: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications, application_versions.

Первые семь тулов только читают. xdr_download_artifact пишет файлы на диск, xdr_mark_event изменяет данные, а три тула сбора действуют на хостах; все они по умолчанию выключены, см. раздел «Безопасность».

Related MCP server: F5 MCP Server

Быстрый старт

Нужен Python 3.10+ и персональный API-токен пользователя XDR.

{
  "mcpServers": {
    "xdr": {
      "command": "uvx",
      "args": ["xdr-mcp"],
      "env": {
        "XDR_BASE_URL": "https://<your-xdr-host>",
        "XDR_API_KEY": "<token>"
      }
    }
  }
}

Этот блок подходит для Claude Desktop, Cursor и VS Code. Для Claude Code:

claude mcp add xdr \
  -e XDR_BASE_URL=https://<your-xdr-host> -e XDR_API_KEY=<token> \
  -- uvx xdr-mcp

Вместо uvx можно использовать pip install xdr-mcp и команду xdr-mcp, либо контейнер — docker run -i --rm -e XDR_BASE_URL -e XDR_API_KEY ghcr.io/f6-security/xdr-mcp (образ собран под linux/amd64 и linux/arm64).

Переменные окружения

Переменная

Назначение

XDR_BASE_URL

Адрес вашей инсталляции XDR

XDR_API_KEY

Персональный API-токен пользователя

XDR_ALLOW_WRITE

1 включает xdr_mark_event. По умолчанию выключен

XDR_ALLOW_COLLECT

1 включает сбор артефактов с хостов: xdr_collect_artifacts, xdr_abort_artifact_collection и xdr_list_artifact_presets. По умолчанию выключен

XDR_PASSWORD_PROMPT

1: когда консоль просит второй фактор для защищённых частей сбора, сервер сам спрашивает его у вас в отдельном окне (macOS или zenity) и передаёт прямо в консоль, минуя модель. По умолчанию выключен

XDR_DOWNLOAD_DIR

Папка, куда xdr_download_artifact сохраняет артефакты; заданная, включает тул. В контейнере — путь внутри примонтированного тома

XDR_CA_BUNDLE

PEM-бандл для инсталляции за внутренним УЦ

Примеры запросов

alerts        severity : "critical" AND resolved : "false"
alerts        timestamp >= now-1d AND NOT false_positive : "true"
incidents     closed : "false" AND timestamp >= now-30d
emails        is_blocked : "true" AND timestamp >= now-1d
assets        edr_active : "true"
applications  vendor : "Microsoft Corporation"
audit         success : "false" AND timestamp >= now-7d

Условия объединяются через AND, OR, NOT и группируются скобками. Время — обычно поле timestamp, относительное (now-1d, now-6h) или абсолютное. Какие поля доступны в секции, покажет xdr_get_mapping; в application_versions для дат используются first_seen и last_seen.

В строковых значениях работает * в любой позиции: name : "VDI-5*", file_name : "*.exe". Без него значение должно совпасть точно. Если запрос ничего не вернул, а значение могло писаться иначе, точное написание подскажет xdr_get_suggestions: платформа отвечает на несовпавшее значение нулём записей, а не ошибкой.

Версии программного обеспечения

applications возвращает программное обеспечение, а application_versions — записи его версий на активах. Сначала найдите нужное ПО в applications, затем используйте его uuid в поле software_id:

application_versions  software_id : "<software_uuid>"
application_versions  software_id : "<software_uuid>" AND version : "1.2.3"
application_versions  asset : "<machine_id>" AND last_seen >= now-7d

software_id поддерживается поиском, хотя отсутствует в xdr_get_mapping. Поле asset принимает machine_id или точный current_name, соответствующий одному активу. Ответ включает version, uuid, ts_created, ts_updated и сведения об активе, например machine_id и computer_name.

Для секции доступны все пять тулов, принимающих секцию. Пагинация использует page_size и offset; сортировка — version, ts_created, ts_updated с необязательным префиксом -. xdr_count считает записи версий на активах: одинаковая версия на разных активах может встречаться несколько раз. Поле version имеет show_suggestions=false, поэтому пустой список подсказок допустим.

Безопасность

Всё, что возвращают читающие тулы, попадает в контекст языковой модели: адреса и темы писем, имена файлов, хосты, журнал действий. Выдавайте серверу токен с минимально необходимыми правами.

xdr_mark_event создаёт матчер — правило, которое применяется ко всем объектам, подходящим под выражение, и этим тулом не отменяется. Поэтому тул выключен по умолчанию; включайте XDR_ALLOW_WRITE осознанно и не добавляйте его в авто-подтверждение MCP-клиента.

Собранные артефакты — одни из самых чувствительных данных платформы: дампы памяти, учётные данные, история команд. xdr_download_artifact кладёт их на диск, а модели возвращает только путь и размер — содержимое в контекст не попадает. Тул включается, только когда задана XDR_DOWNLOAD_DIR; выбирайте для неё папку с ограниченным доступом. Для списка и скачивания токену нужны права на артефакты.

xdr_collect_artifacts запускает на хосте сбор с правами SYSTEM или root. Сбор нагружает хост, а пользовательские артефакты могут нести команды, которые на нём выполнятся. Поэтому тулы сбора включаются своей переменной XDR_ALLOW_COLLECT, а не XDR_ALLOW_WRITE. Произвольных команд тул не принимает, только пользовательские артефакты, сохранённые человеком в консоли. За вызов — один хост, массового запуска нет. Пути проверяются до запроса: неподходящий путь роняет весь сбор. Для путей, пользовательских артефактов, багрепорта, дампов памяти, истории команд и ещё нескольких частей платформа просит одноразовый код, если у пользователя токена нет списка разрешённых IP. С XDR_PASSWORD_PROMPT=1 сервер спрашивает его в отдельном окне и отправляет прямо в консоль. Модель его не видит, а окно показывает, что и с какого хоста собирается. Без этой переменной модель спросит код в чате. Остановить можно только сбор, который ещё идёт: отмену завершённого платформа тоже принимает, и его архив после этого не читается. Не добавляйте тулы сбора в авто-подтверждение MCP-клиента.

Модель угроз и порядок сообщения об уязвимостях — SECURITY.md.

Участие в разработке

См. CONTRIBUTING.md.

Лицензия

Apache License 2.0

Available Tools

7 tools
xdr_countA
Read-only

Get the total count of records in an XDR section. Optionally filter by query to count matching records only. For application_versions this counts per-asset records, not distinct version strings.

NameRequiredDescriptionDefault
queryNoSearch query string using field:value syntax, e.g. 'resolved : "false" AND severity : "critical"'. Pass an empty string to list the whole section unfiltered — deliberately, since that can be a very large number of records. Fields can be combined with AND, OR, AND NOT, OR NOT and grouped with parentheses. A string value may contain * as a wildcard, in any position: name : "VDI-5*", file_name : "*.exe", domain : "*corp*". Without a wildcard a string value must match exactly. Numeric and date fields do not take wildcards. Call xdr_get_mapping for the fields a section accepts, xdr_get_filters for the values an enumerated field takes, and xdr_get_suggestions to look up the exact spelling of a value — a value outside the accepted set returns zero results rather than an error. Time filtering uses fields from xdr_get_mapping, typically timestamp, with relative (timestamp >= now-1d, now-6h) or absolute values (timestamp >= "2024-01-01T00:00:00.000+03:00"). The calendar-rounding forms now/d, now/w and now/M return nothing, so use now-1d and the like. Note that timestamp is a search field: the ordering parameter takes an entirely different set of names. For the "applications" section, filter by asset, e.g. (asset: "<machine_id>"). The "application_versions" section returns per-asset software version records. Filter by software_id: "<uuid from applications>" (supported even though absent from mapping), version: "1.2.3", or asset: "<machine_id or exact current_name>" identifying a single asset. For dates in this section use first_seen or last_seen, e.g. last_seen >= now-7d; ordering uses version, ts_created or ts_updated. A query the API cannot parse is not rejected — it is treated as free text, so verify that the results match what you asked for. (optional)
sectionYesSection name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications, application_versions
xdr_get_artifact_structureA
Read-only

List the files and folders inside a collected artifact, one level at a time, with their sizes. Takes the artifact's numeric 'id' from xdr_list_artifacts and an optional folder inside it (e.g. /var/log). Use it to find the part worth downloading rather than fetching a whole artifact.

NameRequiredDescriptionDefault
pathNoFolder inside the artifact; omit for the top
report_idYesNumeric artifact id ('id' in xdr_list_artifacts)
xdr_get_filtersB
Read-only

Get available filter options for an XDR section.

NameRequiredDescriptionDefault
sectionYesSection name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications, application_versions
xdr_get_mappingA
Read-only

Get all available search fields for an XDR section. Returns field names, labels, categories, and supported operators. Call this first to understand what you can search on.

NameRequiredDescriptionDefault
sectionYesSection name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications, application_versions
xdr_get_suggestionsA
Read-only

Look up real values of a field, optionally narrowed by a prefix. Use it when a query returns nothing and the value may simply be spelled differently — an unmatched value is answered with zero records rather than an error, so a guess is indistinguishable from a genuine absence. Each entry has a value to put in a query and a label for display; search on the value. Returns up to about ten entries, so narrow the prefix to see more. Field names come from xdr_get_mapping, where the ones worth asking about carry show_suggestions; an unknown field name comes back empty rather than as an error.

NameRequiredDescriptionDefault
fieldYesField to list values of, as named by xdr_get_mapping
prefixNoReturn only values starting with this. Omit for the field's first values.
sectionYesSection name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications, application_versions
xdr_list_artifactsA
Read-only

List artifacts collected from hosts — what an analyst gathered through the asset's Response → Artifacts: bug reports, logs, configs, memory dumps. Filter by host with asset_id (the asset's numeric id) or machine_id; with neither, lists artifacts across all hosts. Newest first by default. Each row has 'id' (for xdr_get_artifact_structure), 'internal_id' (for xdr_download_artifact), 'parts' (what was collected), 'command_status' (New, Queued, Pending, Uploading, Uploaded, Done, Failed, Aborted) and 'size' in bytes.

NameRequiredDescriptionDefault
pageNo1-based page number
asset_idNoNumeric asset id
orderingNoBy creation time; default -ts_created (newest first)
page_sizeNoRows per page (1-200, default 20)
machine_idNoAgent machine id (UUID); looked up to the asset id first

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv1.3.0
    • Changedxdr_count3 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"Search query string using field:value syntax, e.g. 'resolved : \"false\" AND severity : \"critical\"'. Pass an empty string to list the whole section unfiltered — deliberately, since that can be a very large number of records. Fields can be combined with AND, OR, AND NOT, OR NOT and grouped with parentheses. Call xdr_get_mapping for the fields a section accepts, and xdr_get_filters for the values an enumerated field takes — a value outside that set returns zero results rather than an error. Time filtering uses the timestamp field, relative (timestamp >= now-1d, now-6h) or absolute (timestamp >= \"2024-01-01T00:00:00.000+03:00\"). The calendar-rounding forms now/d, now/w and now/M return nothing, so use now-1d and the like. Note that timestamp is a search field: the ordering parameter takes an entirely different set of names. For the \"applications\" section, filter by asset, e.g. (asset: \"<machine_id>\"). A query the API cannot parse is not rejected — it is treated as free text, so verify that the results match what you asked for. (optional)"New value: +"Search query string using field:value syntax, e.g. 'resolved : \"false\" AND severity : \"critical\"'. Pass an empty string to list the whole section unfiltered — deliberately, since that can be a very large number of records. Fields can be combined with AND, OR, AND NOT, OR NOT and grouped with parentheses. A string value may contain * as a wildcard, in any position: name : \"VDI-5*\", file_name : \"*.exe\", domain : \"*corp*\". Without a wildcard a string value must match exactly. Numeric and date fields do not take wildcards. Call xdr_get_mapping for the fields a section accepts, xdr_get_filters for the values an enumerated field takes, and xdr_get_suggestions to look up the exact spelling of a value — a value outside the accepted set returns zero results rather than an error. Time filtering uses fields from xdr_get_mapping, typically timestamp, with relative (timestamp >= now-1d, now-6h) or absolute values (timestamp >= \"2024-01-01T00:00:00.000+03:00\"). The calendar-rounding forms now/d, now/w and now/M return nothing, so use now-1d and the like. Note that timestamp is a search field: the ordering parameter takes an entirely different set of names. For the \"applications\" section, filter by asset, e.g. (asset: \"<machine_id>\"). The \"application_versions\" section returns per-asset software version records. Filter by software_id: \"<uuid from applications>\" (supported even though absent from mapping), version: \"1.2.3\", or asset: \"<machine_id or exact current_name>\" identifying a single asset. For dates in this section use first_seen or last_seen, e.g. last_seen >= now-7d; ordering uses version, ts_created or ts_updated. A query the API cannot parse is not rejected — it is treated as free text, so verify that the results match what you asked for. (optional)"
      • changedInput schema / properties / section / description
        Previous value: -"Section name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications"New value: +"Section name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications, application_versions"
      • changedInput schema / properties / section / enum
        Previous value: -[
        -  "alerts",
        -  "incidents",
        -  "emails",
        -  "files",
        -  "events",
        -  "connections",
        -  "assets",
        -  "modules",
        -  "audit",
        -  "applications"
        -]New value: +[
        +  "alerts",
        +  "incidents",
        +  "emails",
        +  "files",
        +  "events",
        +  "connections",
        +  "assets",
        +  "modules",
        +  "audit",
        +  "applications",
        +  "application_versions"
        +]
    • Addedxdr_get_artifact_structure
    • Changedxdr_get_filters2 fields changed
      • changedInput schema / properties / section / description
        Previous value: -"Section name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications"New value: +"Section name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications, application_versions"
      • changedInput schema / properties / section / enum
        Previous value: -[
        -  "alerts",
        -  "incidents",
        -  "emails",
        -  "files",
        -  "events",
        -  "connections",
        -  "assets",
        -  "modules",
        -  "audit",
        -  "applications"
        -]New value: +[
        +  "alerts",
        +  "incidents",
        +  "emails",
        +  "files",
        +  "events",
        +  "connections",
        +  "assets",
        +  "modules",
        +  "audit",
        +  "applications",
        +  "application_versions"
        +]
    • Changedxdr_get_mapping2 fields changed
      • changedInput schema / properties / section / description
        Previous value: -"Section name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications"New value: +"Section name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications, application_versions"
      • changedInput schema / properties / section / enum
        Previous value: -[
        -  "alerts",
        -  "incidents",
        -  "emails",
        -  "files",
        -  "events",
        -  "connections",
        -  "assets",
        -  "modules",
        -  "audit",
        -  "applications"
        -]New value: +[
        +  "alerts",
        +  "incidents",
        +  "emails",
        +  "files",
        +  "events",
        +  "connections",
        +  "assets",
        +  "modules",
        +  "audit",
        +  "applications",
        +  "application_versions"
        +]
    • Addedxdr_get_suggestions
    • Addedxdr_list_artifacts
    • Changedxdr_search4 fields changed
      • changedInput schema / properties / ordering / description
        Previous value: -"Sort field with optional - prefix for descending, e.g. -created_at (newest first). An unknown field is silently ignored: the API reports no error and the results come back in some other order, so use only the fields listed here. Per section — alerts: created_at, last_event, last_updated, severity; incidents: created_at, updated_at; emails: ts_created, delay; files: ts_created, delay; events: Header.Timestamp; connections: ts_parsed, ts_last_usage_parsed, service_count, duration; assets: last_activity, first_activity; modules: ts_created, name; audit: timestamp; applications: name, ts_created, ts_updated."New value: +"Sort field with optional - prefix for descending, e.g. -created_at (newest first). An unknown field is silently ignored: the API reports no error and the results come back in some other order, so use only the fields listed here. Per section — alerts: created_at, last_event, last_updated, severity; incidents: created_at, updated_at; emails: ts_created, delay; files: ts_created, delay; events: Header.Timestamp; connections: ts_parsed, ts_last_usage_parsed, service_count, duration; assets: last_activity, first_activity; modules: ts_created, name; audit: timestamp; applications: name, ts_created, ts_updated; application_versions: version, ts_created, ts_updated."
      • changedInput schema / properties / query / description
        Previous value: -"Search query string using field:value syntax, e.g. 'resolved : \"false\" AND severity : \"critical\"'. Pass an empty string to list the whole section unfiltered — deliberately, since that can be a very large number of records. Fields can be combined with AND, OR, AND NOT, OR NOT and grouped with parentheses. Call xdr_get_mapping for the fields a section accepts, and xdr_get_filters for the values an enumerated field takes — a value outside that set returns zero results rather than an error. Time filtering uses the timestamp field, relative (timestamp >= now-1d, now-6h) or absolute (timestamp >= \"2024-01-01T00:00:00.000+03:00\"). The calendar-rounding forms now/d, now/w and now/M return nothing, so use now-1d and the like. Note that timestamp is a search field: the ordering parameter takes an entirely different set of names. For the \"applications\" section, filter by asset, e.g. (asset: \"<machine_id>\"). A query the API cannot parse is not rejected — it is treated as free text, so verify that the results match what you asked for."New value: +"Search query string using field:value syntax, e.g. 'resolved : \"false\" AND severity : \"critical\"'. Pass an empty string to list the whole section unfiltered — deliberately, since that can be a very large number of records. Fields can be combined with AND, OR, AND NOT, OR NOT and grouped with parentheses. A string value may contain * as a wildcard, in any position: name : \"VDI-5*\", file_name : \"*.exe\", domain : \"*corp*\". Without a wildcard a string value must match exactly. Numeric and date fields do not take wildcards. Call xdr_get_mapping for the fields a section accepts, xdr_get_filters for the values an enumerated field takes, and xdr_get_suggestions to look up the exact spelling of a value — a value outside the accepted set returns zero results rather than an error. Time filtering uses fields from xdr_get_mapping, typically timestamp, with relative (timestamp >= now-1d, now-6h) or absolute values (timestamp >= \"2024-01-01T00:00:00.000+03:00\"). The calendar-rounding forms now/d, now/w and now/M return nothing, so use now-1d and the like. Note that timestamp is a search field: the ordering parameter takes an entirely different set of names. For the \"applications\" section, filter by asset, e.g. (asset: \"<machine_id>\"). The \"application_versions\" section returns per-asset software version records. Filter by software_id: \"<uuid from applications>\" (supported even though absent from mapping), version: \"1.2.3\", or asset: \"<machine_id or exact current_name>\" identifying a single asset. For dates in this section use first_seen or last_seen, e.g. last_seen >= now-7d; ordering uses version, ts_created or ts_updated. A query the API cannot parse is not rejected — it is treated as free text, so verify that the results match what you asked for."
      • changedInput schema / properties / section / description
        Previous value: -"Section name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications"New value: +"Section name, one of: alerts, incidents, emails, files, events, connections, assets, modules, audit, applications, application_versions"
      • changedInput schema / properties / section / enum
        Previous value: -[
        -  "alerts",
        -  "incidents",
        -  "emails",
        -  "files",
        -  "events",
        -  "connections",
        -  "assets",
        -  "modules",
        -  "audit",
        -  "applications"
        -]New value: +[
        +  "alerts",
        +  "incidents",
        +  "emails",
        +  "files",
        +  "events",
        +  "connections",
        +  "assets",
        +  "modules",
        +  "audit",
        +  "applications",
        +  "application_versions"
        +]
  2. 4 tool updatesv0.1.0
    • First observedxdr_count
    • First observedxdr_get_filters
    • First observedxdr_get_mapping
    • First observedxdr_search

TDQS

A3.6/5.0

Scored across 7 tools

Disambiguation3/5

The search/count pair and the artifact tools are clearly distinct, but the metadata trio — xdr_get_mapping, xdr_get_filters, and xdr_get_suggestions — have overlapping purposes (all answer 'what can I search/filter on?'), and xdr_get_filters has a one-line description that gives no guidance on when to use it instead of get_mapping. xdr_get_suggestions and xdr_search could also be confused since both can return matching values.

Naming Consistency4/5

All tools share the xdr_ prefix and snake_case, with a clear verb-first structure (search, count, get_*, list_*). The only deviation is that xdr_search and xdr_count drop the noun compared to the get_/list_ tools, which is minor and still readable.

Tool Count5/5

Seven tools is a well-scoped set for a search-and-inspect server: one per query primitive plus two for the artifact workflow. Each tool has a distinct role, and nothing feels padded or missing from the count itself.

Completeness2/5

xdr_list_artifacts explicitly tells the agent to use its 'internal_id' with xdr_download_artifact, but no such tool exists in this set — the artifact workflow dead-ends after inspecting structure. There is also no way to perform response/containment actions or export search results, leaving the core lifecycle incomplete.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Connects AI agents with the CrowdStrike Falcon platform to enable intelligent security analysis, providing programmatic access to detections, incidents, threat intelligence, vulnerabilities, and other security capabilities for advanced security operations and automation.
    277
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables interaction with F5 devices through the iControl REST API to manage objects like virtual servers, pools, iRules, and profiles. It provides comprehensive tools for listing, creating, updating, and deleting F5 configurations via natural language interfaces.
    -
  • A
    license
    A
    quality
    F
    maintenance
    Enables AI assistants to interact with Rapid7 InsightIDR SIEM for investigating incidents, searching logs with LEQL, managing alerts and assets, analyzing user behavior, and handling threat intelligence.
    26
    56 npm
    4
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables AI assistants to drive the UTMStack SIEM/XDR platform for triaging alerts, searching logs, running SQL, managing incidents, inspecting agents, creating/deleting correlation rules, managing data filters, and running commands on endpoints.
    44
    MIT