Skip to main content
Glama
MITRE ATT&CK MCP Server

MITRE ATT&CK MCP Server

by imouiche

🛡️ MITRE ATT&CK MCP Server

AI-Native Access to the World's Leading Threat Intelligence Framework

npm npm downloads License MCP Registry GitHub release

Features • Installation • Quick Start • Tools • Examples • Roadmap


The MITRE ATT&CK MCP Server transforms the world's leading adversary knowledge base into an AI-native interface. Built for the Model Context Protocol, it enables LLMs and agentic systems to:

  • 🔍 Query 200+ techniques, 140+ groups, 700+ software entries

  • 🧠 Reason over complex threat relationships and TTPs

  • 📊 Visualize coverage gaps with ATT&CK Navigator layers

  • ⚡ Scale threat intelligence workflows with structured tools

Perfect for: Security teams, threat hunters, detection engineers, AI researchers, and anyone building intelligent security systems.

What is this?

mitre-attack-mcp-server is a self-contained MCP server that provides machine-callable access to the MITRE ATT&CK framework using official STIX data with LLMs friendly structured outputs.

It enables:

  • 🤖 LLMs to reason about ATT&CK techniques, groups, software, and mitigations

  • 🧠 Agentic workflows to generate threat explanations and coverage maps

  • 🔍 Security teams to query ATT&CK relationships programmatically

  • 📊 Visualization via ATT&CK Navigator layers

No scraping.
No fragile APIs.
Just official MITRE data, structured and reliable.


📑 Table of Contents


Related MCP server: MITRE ATT&CK MCP Server

✨ Key Features

  • ✅ 65+ MCP tools across ATT&CK domains (Enterprise, Mobile, ICS)

  • ✅ Automatic STIX download & caching on first run

  • ✅ Native ATT&CK Navigator layer generation

  • ✅ Designed for LLMs & MCP-compatible clients

  • ✅ In-memory caching for instant query responses

  • ✅ Type-safe with Pydantic models

  • ✅ Clean, production-ready, self-contained server

  • ✅ Comprehensive test coverage


📦 Installation

pip install mitre-mcp-server

npm

npm install -g @imouiche/mitre-attack-mcp-server

npx (no installation required)

npx @imouiche/mitre-attack-mcp-server

Via uv (Modern Python)

uv pip install mitre-mcp-server

Local Development

git clone https://github.com/imouiche/complete-mitre-attack-mcp-server.git
cd complete-mitre-attack-mcp-server
npm install

Using uv (Python package manager)

git clone https://github.com/imouiche/complete-mitre-attack-mcp-server.git
cd complete-mitre-attack-mcp-server
uv sync

⚡ Quick Start

1. Install

pip install mitre-mcp-server

2. Configure Claude Desktop

Add to your claude_desktop_config.json:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "mitre-attack": {
      "command": "npx",
      "args": ["-y", "@imouiche/mitre-attack-mcp-server"]
    }
  }
}

3. Restart Claude Desktop

Quit Claude Desktop completely (Cmd+Q on macOS) and reopen it.

4. Start Querying!

Ask Claude:

"What techniques does APT29 use for initial access?"
"Generate an ATT&CK Navigator layer for ransomware groups"
"Show me all Windows persistence techniques"

Data downloads automatically on first run (~59MB, cached at ~/.mitre-mcp-server/data/).


📦 MCP Registry

This server is officially registered in the Model Context Protocol (MCP) Registry.

Registry ID: io.github.imouiche/mitre-attack-mcp-server

View in Official Registry: https://registry.modelcontextprotocol.io/?q=mitre-attack-mcp-server

Installation Options

Option 1: Direct NPM

npm install -g @imouiche/mitre-attack-mcp-server

Option 2: NPX (no installation)

npx @imouiche/mitre-attack-mcp-server

Option 3: Discover via Registry

  1. Visit MCP Registry

  2. Search for "mitre-attack"

  3. Click the server card for installation instructions


🛠️ Available Tools

The server exposes 65+ MCP tools covering all major MITRE ATT&CK entities and relationships.


📊 Infrastructure & Metadata

Tool

Description

get_data_stats

Show download status, file paths, sizes, and ATT&CK release version

generate_layer

Generate an ATT&CK Navigator layer (JSON output)

get_layer_metadata

Return Navigator layer metadata template


🎯 Techniques

Tool

Description

get_technique_by_id

Get a technique by ATT&CK ID (e.g., T1055)

search_techniques

Search techniques by name or description

get_all_techniques

Retrieve all techniques

get_all_parent_techniques

Parent techniques only

get_all_subtechniques

All subtechniques

get_subtechniques_of_technique

Subtechniques of a parent

get_parent_technique_of_subtechnique

Parent of a subtechnique

get_technique_tactics

Tactics associated with a technique

get_techniques_by_tactic

Techniques under a tactic

get_techniques_by_platform

Techniques for a platform

get_revoked_techniques

Revoked techniques


🧑‍💻 Groups (Threat Actors)

Tool

Description

get_group_by_name

Find group by name or alias

search_groups

Search groups

get_all_groups

All ATT&CK groups

get_groups_by_alias

Lookup groups by alias

get_groups_using_technique

Groups using a technique

get_groups_using_software

Groups using software

get_groups_attributing_to_campaign

Groups attributed to a campaign


🧪 Software (Malware & Tools)

Tool

Description

get_software

Get all software

search_software

Search software

get_software_by_alias

Lookup software by alias

get_software_used_by_group

Software used by a group

get_software_used_by_campaign

Software used in campaigns

get_software_using_technique

Software using a technique


📌 Campaigns

Tool

Description

get_all_campaigns

Get all campaigns

get_campaigns_by_alias

Lookup campaigns by alias

get_campaigns_using_technique

Campaigns using a technique

get_campaigns_using_software

Campaigns using software

get_campaigns_attributed_to_group

Campaign attribution


🛡️ Mitigations

Tool

Description

get_all_mitigations

Get all mitigations

get_mitigations_mitigating_technique

Mitigations for a technique

get_techniques_mitigated_by_mitigation

Techniques mitigated by a mitigation


🧭 Tactics, Data Sources & ICS

Tool

Description

get_all_tactics

Get all tactics

get_all_datasources

Get all data sources

get_all_datacomponents

Get all data components

get_datacomponents_detecting_technique

Data components detecting a technique

get_all_assets

Get ICS assets

get_assets_targeted_by_technique

Assets targeted by a technique


💡 Example Queries

Threat Intelligence

"What techniques does APT29 use for initial access?"
"Which groups target financial institutions?"
"Show me all ransomware-related software"
"What are the aliases for the Lazarus Group?"

Detection Engineering

"What data sources detect credential dumping?"
"Generate a coverage map for EDR capabilities"
"List all techniques for Windows privilege escalation"
"What can detect T1055 (Process Injection)?"

Threat Hunting

"What techniques use PowerShell?"
"Show me lateral movement techniques for Linux"
"Which groups use Cobalt Strike?"
"What persistence techniques target macOS?"

Mitigation & Defense

"What mitigations exist for phishing attacks?"
"Show me all mitigations for privilege escalation"
"What techniques does MFA mitigate?"

Compliance & Gap Analysis

"Generate a layer for all techniques our EDR covers"
"Compare APT29 TTPs against our detection capabilities"
"Show unmitigated techniques in our environment"

📊 ATT&CK Navigator Visualization

The generate_layer tool produces ATT&CK Navigator–compatible JSON.

Usage:

  1. Ask Claude to generate a layer:

    "Generate an ATT&CK Navigator layer for all techniques used by APT29"

  2. Save the JSON output to a file (e.g., apt29_layer.json)

  3. Upload to ATT&CK Navigator

  4. Visualize technique coverage, threat actor usage, or mitigation mapping

Real-World Example Using LangGraph

Example Layer Use Cases:

  • Red Team Coverage: Map all techniques used in an exercise

  • Detection Gaps: Highlight unmonitored techniques

  • Threat Actor Profile: Visualize group TTPs

  • Mitigation Coverage: Show what's protected vs. exposed


🔧 Technical Details

Architecture

  • Language: Python 3.12+

  • Framework: FastMCP for Model Context Protocol

  • Data Library: Official mitreattack-python (v5.3.0+)

  • Async/Await: Optimal performance for concurrent queries

  • Type Safety: Full Pydantic models for all data structures

  • Testing: Comprehensive pytest coverage

Data

  • Enterprise ATT&CK: v18.1+ (~50.9MB)

  • Mobile ATT&CK: v18.1+ (~4.9MB)

  • ICS ATT&CK: v18.1+ (~3.5MB)

  • Total: ~59MB cached locally

  • Storage: ~/.mitre-mcp-server/data/v{version}/

  • Update: Auto-downloads on install, uses cached data on subsequent runs

Performance

  • In-memory caching: All domains loaded at startup

  • Query speed: Sub-second for most operations

  • Graph traversal: Efficient relationship queries

  • Concurrent: Handles multiple simultaneous requests

Requirements

  • Python: 3.12 or higher

  • Node.js: 16+ (for NPM installation)

  • Disk Space: ~150MB (includes dependencies + data)

  • Memory: ~200MB RAM when running


🚀 Roadmap & Vision

This project is the first component of a larger vision to build comprehensive agentic security automation by integrating multiple security knowledge bases and frameworks.

Current Status

  • ✅ MITRE ATT&CK - Threat intelligence & adversary TTPs (v18.1)

Planned Integrations

  • 🔜 CVE/NVD - Vulnerability intelligence and exploit mapping

  • 🔜 MITRE D3FEND - Defensive countermeasure knowledge graph

  • 🔜 Sigma Rules - Detection rule translation and management

  • 🔜 CAPEC - Common Attack Pattern Enumeration

  • 🔜 CWE - Software weakness enumeration

  • 🔜 Agentic Pentesting - Multi-agent autonomous security testing

Ultimate Goal

Enable AI agents to autonomously:

  • 🎯 Map attack surfaces and identify vulnerabilities

  • 🛡️ Recommend defensive countermeasures

  • 🔍 Generate detection rules and validate coverage

  • 🤖 Orchestrate multi-stage security assessments

  • 📊 Reason about complete attack-defense lifecycles

Get Involved

We welcome contributions from:

  • 🎓 Students working on thesis projects (cybersecurity, AI, agentic systems)

  • 🔬 Researchers in AI security, threat intelligence, or agent frameworks

  • 💻 Developers passionate about security automation

  • 🏢 Organizations interested in research partnerships or commercial applications

Areas of Interest:

  • Integrating additional security frameworks (CVE, D3FEND, Sigma)

  • Building agentic workflows for pentesting and red teaming

  • Developing detection rule generation pipelines

  • Creating threat intelligence reasoning systems

  • Improving MCP tooling and documentation

📬 Interested? Open an issue, start a discussion, or reach out directly!

Join the Discussion →


🤝 Contributing

Found a bug? Have a feature request? Want to contribute to the roadmap?

All contributions welcome!

Development Setup

git clone https://github.com/imouiche/complete-mitre-attack-mcp-server.git
cd complete-mitre-attack-mcp-server
uv sync
# uv run pytest (test/ folder not yet released)
uv run python -m mitre_mcp_server.server

📜 License

Apache License 2.0

See LICENSE for full details.


👨‍💻 About the Author

Inoussa Mouiche, Ph.D.
AI/ML Researcher | Cybersecurity | Agentic AI Systems | Software Engineering

🎓 University of Windsor - WASP Lab
🔬 Research Focus: Threat Intelligence Automation, Machine Learning, Multi-Agent Security Systems, LLM-Powered Security Operations

📫 Connect

🎓 Award Nomination

💼 Open to opportunities in:

  • AI/ML Engineering & Research

  • Cybersecurity & Threat Intelligence

  • Agentic AI Development

  • Security Automation & Orchestration

  • Academic & Industry Collaborations


🙏 Acknowledgments

MITRE ATT&CK® is a registered trademark of The MITRE Corporation.


⭐ Star this repo if you find it useful!

Interested in collaborating on agentic engineering systems? Let's connect!

Made with ❤️ for the cybersecurity and AI communities

⬆ Back to Top

Available Tools

65 tools
generate_layerA
Generate an ATT&CK Navigator layer for visualization.

This wraps mitreattack.navlayers.UsageLayerGenerator and produces a
JSON layer highlighting techniques associated with a given ATT&CK ID.

Only the following ATT&CK ID prefixes are supported:
  - Gxxxx : groups (intrusion sets)
  - Mxxxx : mitigations (course-of-action)
  - Sxxxx : software (tool/malware)
  - Dxxxx : data components

Technique IDs (Txxxx / Txxxx.xxx) are NOT supported here.

Args:
    attack_id: ATT&CK ID (Gxxxx, Mxxxx, Sxxxx, or Dxxxx)
    score: Score to assign to all matched techniques in the layer
    domain: ATT&CK domain (e.g., "enterprise", "mobile", "ics")

Returns:
    {
      "success": bool,
      "attack_id": "<G/M/S/D ID>",
      "domain": "<domain>",
      "count": int,              # number of techniques in layer
      "layer": { ... } | null,   # ATT&CK Navigator layer JSON
      "message": "<summary or error>"
    }

Inputs: attack_id (required), score, domain. Returns: result

get_all_assetsA
Get all ATT&CK assets in a domain (primarily ICS).

Assets represent industrial control system components 
(PLC, HMI, Engineering Workstation, Control Server, etc.)

Args:
    domain: ATT&CK domain ("ics" recommended)
    remove_revoked_deprecated: Exclude revoked/deprecated entries
    include_description: Include asset descriptions

Returns:
    {
      "domain": "<domain>",
      "count": <number>,
      "assets": [
        {
          "name": "...",
          "stix_id": "x-mitre-asset--UUID",
          "description": "...",
          "attack_id": "<Axxxx or None>"
        }
      ],
      "formatted": "<human-readable output>",
      "message": "<summary>"
    }

Inputs: domain, include_description, remove_revoked_deprecated. Returns: result

get_all_campaignsA
Get all ATT&CK campaigns in a domain.

Campaigns represent specific intrusion events or long-running operations 
attributed to threat actors (e.g., SolarWinds, Operation Ghost).

Args:
    domain: ATT&CK domain ("enterprise", "mobile", "ics")
    remove_revoked_deprecated: Whether to exclude revoked/deprecated entries
    include_description: Include campaign descriptions in the output

Returns:
    {
      "domain": "<domain>",
      "count": <int>,
      "campaigns": [
         {
            "attack_id": "<Cxxxx or None>",
            "name": "<campaign name>",
            "stix_id": "campaign--UUID",
            "description": "<text or null>"
         },
         ...
      ],
      "formatted": "<nicely formatted output>",
      "message": "<summary>"
    }

Inputs: domain, include_description, remove_revoked_deprecated. Returns: result

get_all_datacomponentsA
Get all ATT&CK data components in a domain.

Data components are specific aspects of a data source that can be monitored.
For example, the "Process" data source has components like
"Process Creation", "Process Termination", etc.

Args:
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    remove_revoked_deprecated: Whether to exclude revoked/deprecated entries.
    include_description: Whether to include descriptions.

Returns:
    {
      "domain": "<domain>",
      "count": <number of data components>,
      "datacomponents": [
        {
          "name": "<data component name>",
          "stix_id": "<x-mitre-data-component--UUID>",
          "description": "<text or null>",
          "data_source_stix_id": "<x-mitre-data-source--UUID or null>",
          "data_source_name": "<parent data source name or null>",
          "data_source_attack_id": "<data source ATT&CK ID or null>"
        },
        ...
      ],
      "formatted": "<optional human-readable output>",
      "message": "<summary>"
    }

Inputs: domain, include_description, remove_revoked_deprecated. Returns: result

get_all_datasourcesA
Get all ATT&CK data sources in a domain.

Data sources represent *what* kind of telemetry you collect
(e.g., Process Monitoring, Network Traffic, File Monitoring).

Args:
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    remove_revoked_deprecated: Whether to exclude revoked/deprecated data sources.
    include_description: Whether to include descriptions.

Returns:
    {
      "domain": "<domain>",
      "count": <number of data sources>,
      "datasources": [
        {
          "name": "<data source name>",
          "stix_id": "<x-mitre-data-source--UUID>",
          "description": "<text or null>",
          "platforms": ["<Windows>", "<Linux>", ...]  # if available
        },
        ...
      ],
      "formatted": "<optional human-readable output>",
      "message": "<summary>"
    }

Inputs: domain, include_description, remove_revoked_deprecated. Returns: result

get_all_groupsA
Get all APT groups (intrusion sets) in a domain.

Args:
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    remove_revoked_deprecated: Whether to exclude revoked/deprecated groups.
    include_description: Whether to include descriptions.

Returns:
    {
      "domain": "<domain>",
      "count": <number of groups>,
      "groups": [
        {
          "attack_id": "GXXXX",
          "name": "<group name>",
          "aliases": [...],
          "stix_id": "<intrusion-set--UUID>",
          "description": "<text or null>"
        },
        ...
      ],
      "formatted": "<optional human-readable listing>",
      "message": "<summary>"
    }

Inputs: domain, include_description, remove_revoked_deprecated. Returns: result

get_all_matricesA
Get all ATT&CK matrices in a domain.

Matrices are the top-level organizational structures in ATT&CK.
Each domain typically has one or more matrices
(e.g., Enterprise ATT&CK matrix).

Args:
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    remove_revoked_deprecated: Whether to exclude revoked/deprecated matrices.
    include_description: Whether to include descriptions.

Returns:
    {
      "domain": "<domain>",
      "count": <number of matrices>,
      "matrices": [
        {
          "attack_id": "<matrix ID or None>",
          "name": "<matrix name>",
          "stix_id": "<x-mitre-matrix--UUID>",
          "description": "<text or null>"
        },
        ...
      ],
      "formatted": "<optional human-readable output>",
      "message": "<summary>"
    }

Inputs: domain, include_description, remove_revoked_deprecated. Returns: result

get_all_mitigationsA
Get all mitigations (defensive countermeasures) in a domain.

Mitigations are security controls or practices that can reduce the
effectiveness of adversary techniques (e.g., M1013, M1017).

Args:
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    remove_revoked_deprecated: Whether to exclude revoked/deprecated mitigations.
    include_description: Whether to include descriptions.

Returns:
    {
      "domain": "<domain>",
      "count": <number of mitigations>,
      "mitigations": [
        {
          "attack_id": "MXXXX" | null,
          "name": "<mitigation name>",
          "stix_id": "<course-of-action--UUID>",
          "description": "<text or null>"
        },
        ...
      ],
      "formatted": "<optional human-readable output>",
      "message": "<summary>"
    }

Inputs: domain, include_description, remove_revoked_deprecated. Returns: result

get_all_parent_techniquesA
Get all parent techniques (exclude subtechniques) in a given domain.

Parent techniques are the main techniques without a dot in their ATT&CK ID,
e.g., T1566, T1055 (not T1566.001).

Args:
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    remove_revoked_deprecated: Whether to exclude revoked/deprecated techniques.
    include_description: Whether to include descriptions.

Returns:
    {
      "domain": "<domain>",
      "count": <number of parent techniques>,
      "parent_techniques": [
        {
          "attack_id": "<TXXXX>",
          "name": "<technique name>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>",
          "tactics": ["<Tactic 1>", "<Tactic 2>", ...]
        },
        ...
      ],
      "formatted": "<optional human-readable output>",
      "message": "<summary>"
    }

Inputs: domain, include_description, remove_revoked_deprecated. Returns: result

get_all_softwareA
Get all software (malware and tools) in a domain.

This is effectively an alias for the MITRE helper get_software(), but it
returns structured results suitable for LLMs and clients.

Args:
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    remove_revoked_deprecated: Whether to exclude revoked/deprecated software.
    include_description: Whether to include descriptions.

Returns:
    {
      "domain": "<domain>",
      "count": <number of software objects>,
      "software": [
        {
          "attack_id": "<SXXXX or similar> | null",
          "name": "<software name>",
          "aliases": [...],
          "stix_id": "<malware--UUID or tool--UUID>",
          "type": "<malware|tool|...>",
          "description": "<text or null>"
        },
        ...
      ],
      "formatted": "<optional human-readable listing>",
      "message": "<summary>"
    }

Inputs: domain, include_description, remove_revoked_deprecated. Returns: result

get_all_subtechniquesA
Get all subtechniques in a given ATT&CK domain.

Subtechniques are more specific versions of parent techniques,
e.g., T1566.001 and T1566.002 are subtechniques of T1566.

Args:
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    remove_revoked_deprecated: Whether to exclude revoked/deprecated subtechniques.
    include_description: Whether to include descriptions.

Returns:
    {
      "domain": "<domain>",
      "count": <number of subtechniques>,
      "subtechniques": [
        {
          "attack_id": "<TXXXX.YYY>",
          "name": "<subtechnique name>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>",
          "tactics": ["<Tactic 1>", "<Tactic 2>", ...],
          "parent_attack_id": "<TXXXX>",
          "parent_name": "<parent technique name>",
          "parent_stix_id": "<attack-pattern--UUID>"
        },
        ...
      ],
      "formatted": "<optional human-readable output>",
      "message": "<summary>"
    }

Inputs: domain, include_description, remove_revoked_deprecated. Returns: result

get_all_tacticsA
Get all ATT&CK tactics for a domain.

Tactics represent the adversary's tactical goals (e.g., Initial Access,
Defense Evasion, Persistence).

Args:
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics')
    include_description: Whether to include tactic descriptions.

Returns:
    {
      "domain": "<domain>",
      "count": <number>,
      "tactics": [
         {
           "attack_id": "<TAxxxx>" | null,
           "name": "...",
           "stix_id": "x-mitre-tactic--UUID",
           "description": "...",
         }
      ],
      "formatted": "<optional human-readable text>",
      "message": "<summary>"
    }

Inputs: domain, include_description. Returns: result

get_all_techniquesA
Get all ATT&CK techniques for a given domain.

Args:
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    remove_revoked_deprecated: Whether to exclude revoked/deprecated techniques.
    include_description: Whether to include technique descriptions.

Returns:
    {
      "domain": "<domain>",
      "count": <number of techniques>,
      "techniques": [
        {
          "attack_id": "TXXXX or TXXXX.YYY",
          "name": "<technique name>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>",
          "tactics": [ "<tactic 1>", "<tactic 2>", ... ]
        },
        ...
      ],
      "formatted": "<optional human-readable output>",
      "message": "<summary>"
    }

Inputs: domain, include_description, remove_revoked_deprecated. Returns: result

get_assets_targeted_by_techniqueA
Get all ICS assets targeted by a specific technique.

Assets represent industrial control system components such as
PLCs, RTUs, Engineering Workstations, HMIs, Control Servers, etc.

Args:
    technique_stix_id: Technique STIX UUID identifier
    domain: ATT&CK domain ('ics' strongly recommended)
    include_description: Include asset descriptions, if available

Returns:
    {
      "technique": {
          "attack_id": "Txxxx",
          "name": "...",
          "stix_id": "<attack-pattern--UUID>"
      },
      "count": int,
      "assets": [
        {
          "name": "...",
          "stix_id": "<x-mitre-asset--UUID>",
          "description": "<optional text>",
          "asset_type": "<ICS component type>",
        },
        ...
      ],
      "formatted": "<multi-line readable text>",
      "message": "<summary>"
    }

Inputs: technique_stix_id (required), domain, include_description. Returns: result

get_attack_idA
Convert a STIX UUID into its human-readable ATT&CK ID.

This tool resolves internal STIX identifiers such as:
    attack-pattern--UUID
    malware--UUID
    intrusion-set--UUID
    tool--UUID
    course-of-action--UUID

into ATT&CK IDs such as:
    T1566      (Technique)
    T1055.002  (Sub-technique)
    G0016      (Group)
    S0154      (Software)
    M1013      (Mitigation)

Args:
    stix_id: Full STIX UUID identifier.
    domain: ATT&CK domain ("enterprise", "mobile", "ics").

Returns:
    {
      "found": bool,
      "attack_id": "<ATT&CK ID or null>",
      "message": "<status message>"
    }

Inputs: stix_id (required), domain. Returns: result

get_campaigns_attributed_to_groupA
Get all campaigns attributed to a specific intrusion set (APT group),
identified by its STIX ID.

Campaigns represent specific operations or intrusion events attributed
to a threat group.

Args:
    group_stix_id: STIX UUID of the group (e.g., "intrusion-set--UUID").
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include campaign descriptions.

Returns:
    {
      "group": {
          "attack_id": "GXXXX" | null,
          "name": "<group name or null>",
          "stix_id": "<intrusion-set--UUID>",
          "description": "<text or null>"
      } | null,

      "count": <number of campaigns>,

      "campaigns": [
        {
          "attack_id": "CXXXX" | null,
          "name": "<campaign name>",
          "stix_id": "<campaign--UUID>",
          "description": "<text or null>"
        },
        ...
      ],

      "formatted": "<formatted human-readable block>",
      "message": "<status summary>"
    }

Inputs: group_stix_id (required), domain, include_description. Returns: result

get_campaigns_by_aliasA
Get campaigns by their alias.

Campaigns frequently have multiple names assigned by different vendors
or research teams. This function resolves those aliases.

Args:
    alias: Campaign alias or alternate name (case-insensitive)
    domain: ATT&CK domain ("enterprise", "ics", etc.)
    include_description: Include campaign descriptions in output

Returns:
    {
      "alias": "<requested name>",
      "count": int,
      "campaigns": [
        {
          "name": "...",
          "stix_id": "<campaign--UUID>",
          "attack_id": "Cxxxx" | null,
          "description": "..." | null
        },
        ...
      ],
      "formatted": "<multi-line readable text>",
      "message": "<summary>"
    }

Inputs: alias (required), domain, include_description. Returns: result

get_campaigns_using_softwareA
Get all campaigns that use specific software/malware.

This is a reverse lookup: Software → Campaigns.

Args:
    software_stix_id: Software STIX UUID identifier (e.g., 'malware--UUID', 'tool--UUID').
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics').
    include_description: Whether to include campaign descriptions.

Returns:
    {
      "software": {
          "attack_id": "SXXXX or similar" | null,
          "name": "<software name or null>",
          "stix_id": "<software STIX ID>",
          "type": "<malware|tool|...> or null",
          "description": "<text or null>",
      } | null,

      "count": <number of campaigns>,

      "campaigns": [
        {
          "attack_id": "CXXXX" | null,
          "name": "<campaign name>",
          "stix_id": "<campaign--UUID>",
          "description": "<text or null>",
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "<type>",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>",
            },
            ...
          ]
        },
        ...
      ],

      "formatted": "<human-readable list of campaigns>",
      "message": "<status summary>"
    }

Inputs: software_stix_id (required), domain, include_description. Returns: result

get_campaigns_using_techniqueA
Get all campaigns that use a specific technique.

This is a reverse lookup: Technique → Campaigns.

Args:
    technique_stix_id: Technique STIX UUID identifier
                       (e.g., 'attack-pattern--UUID').
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics').
    include_description: Whether to include campaign descriptions.

Returns:
    {
      "technique": {
          "attack_id": "TXXXX or TXXXX.YYY" | null,
          "name": "<technique name or null>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>",
      } | null,

      "count": <number of campaigns>,

      "campaigns": [
        {
          "attack_id": "CXXXX" | null,
          "name": "<campaign name>",
          "stix_id": "<campaign--UUID>",
          "description": "<text or null>",
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "<type>",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>",
            },
            ...
          ]
        },
        ...
      ],

      "formatted": "<human-readable list of campaigns>",
      "message": "<status summary>"
    }

Inputs: technique_stix_id (required), domain, include_description. Returns: result

get_datacomponents_detecting_techniqueB
Get all data components that can detect a specific technique.

Primary mode:
  - Use mitreattack-python relationship traversal (if present)

Fallback mode (when relationship traversal yields 0):
  - Read technique.x_mitre_data_sources (strings)
  - Resolve data source objects by name
  - Return data components whose x_mitre_data_source_ref points to those data sources
  - If the string includes a component name (e.g., "Process: Process Creation"),
    filter to that component when possible.

Returns the same structure as before, plus a debug block.

Inputs: technique_stix_id (required), domain, include_description.

get_data_statsA

Return statistics about downloaded MITRE ATT&CK STIX data.

This confirms which domains are present on disk, their file paths, sizes, and ATT&CK release version. It assumes that downloads have already been attempted at server startup.

Inputs: no named parameters. Returns: result

get_group_by_nameA
Retrieve an intrusion set (APT group) by name or alias (case-insensitive match).

This tool searches ATT&CK intrusion sets by name or alias and returns the first
matching group. Matching is case-insensitive and supports partial matches.

Examples:
    - get_group_by_name("APT29")
    - get_group_by_name("Lazarus")
    - get_group_by_name("Fancy Bear")

Args:
    group_name: The group name or alias to search for (case-insensitive).
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include descriptions in the output.

Returns:
    {
      "found": bool,
      "group": {
          "attack_id": "<GXXXX>",
          "name": "<group name>",
          "aliases": [...],
          "stix_id": "<intrusion-set--...>",
          "description": "<description or null>"
      },
      "formatted": "<human-readable text>",
      "message": "<status>"
    }

Inputs: group_name (required), domain, include_description. Returns: result

get_groups_attributing_to_campaignA
Get all APT groups (intrusion sets) attributed to a specific campaign.

This is a reverse lookup: Campaign → Groups.
It follows attribution relationships from a campaign STIX ID to
intrusion sets (groups).

Args:
    campaign_stix_id: STIX ID of the campaign (e.g., "campaign--UUID").
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include group descriptions.

Returns:
    {
      "campaign": {
          "attack_id": "CXXXX" | null,
          "name": "<campaign name or null>",
          "stix_id": "<campaign--UUID>",
          "description": "<text or null>"
      } | null,

      "count": <number of groups>,

      "groups": [
        {
          "attack_id": "GXXXX" | null,
          "name": "<group name>",
          "aliases": [...],
          "stix_id": "<intrusion-set--UUID>",
          "description": "<text or null>",
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "<type>",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>",
            },
            ...
          ]
        },
        ...
      ],

      "formatted": "<human-readable list of groups>",
      "message": "<status summary>"
    }

Inputs: campaign_stix_id (required), domain, include_description. Returns: result

get_groups_by_aliasA
Get APT groups (intrusion sets) matching a given alias.

Many groups have multiple aliases—e.g., APT29 is also known as:
"Cozy Bear", "NOBELIUM", "Midnight Blizzard", etc.

This tool returns all groups whose alias list contains the given alias
(case-insensitive exact match, per MITRE's own alias indexing).

Args:
    alias: Alias to search for (e.g., "Cozy Bear", "NOBELIUM").
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include group descriptions.

Returns:
    {
      "count": <number>,
      "groups": [
        {
          "attack_id": "GXXXX",
          "name": "<group name>",
          "aliases": [...],
          "stix_id": "<intrusion-set--UUID>",
          "description": "<text or null>"
        },
        ...
      ],
      "formatted": "<formatted list>",
      "message": "<status summary>"
    }

Inputs: alias (required), domain, include_description. Returns: result

get_groups_using_softwareA
Get all APT groups (intrusion sets) that use a specific software/malware.

This is a reverse lookup: Software → Groups.
It follows 'uses' relationships from a software STIX ID (tool/malware)
to intrusion sets.

Args:
    software_stix_id: STIX ID of the software object
                      (e.g., "malware--UUID", "tool--UUID").
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include group descriptions.

Returns:
    {
      "software": {
          "attack_id": "SXXXX or similar" | null,
          "name": "<software name or null>",
          "stix_id": "<software STIX ID>",
          "type": "<tool|malware|...> or null",
          "description": "<text or null>",
      } | null,

      "count": <number of groups>,

      "groups": [
        {
          "attack_id": "GXXXX" | null,
          "name": "<group name>",
          "aliases": [...],
          "stix_id": "<intrusion-set--UUID>",
          "description": "<text or null>",
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "uses",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>",
            },
            ...
          ]
        },
        ...
      ],

      "formatted": "<human-readable list of groups>",
      "message": "<status summary>"
    }

Inputs: software_stix_id (required), domain, include_description. Returns: result

get_groups_using_techniqueA
Get all APT groups (intrusion sets) that use a specific technique.

This is a reverse lookup: Technique → Groups.
It follows 'uses' relationships from a technique STIX ID to intrusion sets.

Args:
    technique_stix_id: STIX ID of the technique
                       (e.g., "attack-pattern--UUID").
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include group descriptions.

Returns:
    {
      "technique": {
          "attack_id": "TXXXX or TXXXX.YYY" | null,
          "name": "<technique name or null>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>",
      } | null,

      "count": <number of groups>,

      "groups": [
        {
          "attack_id": "GXXXX" | null,
          "name": "<group name>",
          "aliases": [...],
          "stix_id": "<intrusion-set--UUID>",
          "description": "<text or null>",
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "uses",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>",
            },
            ...
          ]
        },
        ...
      ],

      "formatted": "<human-readable list of groups>",
      "message": "<status summary>"
    }

Inputs: technique_stix_id (required), domain, include_description. Returns: result

get_group_techniquesA
Get all techniques used by a specific APT group (intrusion set).

This tool:
  1) Locates a group by name or alias (case-insensitive, partial match).
  2) Uses MITRE's get_techniques_used_by_group() to retrieve techniques
     related to that group (via 'uses' relationships).

Args:
    group_name: Group name or alias (e.g., "APT29", "Lazarus Group").
    domain: ATT&CK domain ("enterprise", "mobile", or "ics").
    include_description: Whether to include descriptions in the output.

Returns:
    {
      "found": bool,  # whether the group was found
      "group": {
          "attack_id": "GXXXX",
          "name": "...",
          "aliases": [...],
          "stix_id": "intrusion-set--...",
          "description": "..." | null
      } | null,
      "count": <number of techniques>,
      "techniques": [
        {
          "attack_id": "TXXXX or TXXXX.YYY",
          "name": "...",
          "stix_id": "attack-pattern--...",
          "description": "..." | null,
          "relationships": [
            {
              "stix_id": "relationship--...",
              "relationship_type": "uses",
              "description": "..." | null,
              "source_ref": "...",
              "target_ref": "..."
            },
            ...
          ]
        },
        ...
      ],
      "formatted": "<human-readable technique list>",
      "message": "<status summary>"
    }

Inputs: group_name (required), domain, include_description. Returns: result

get_layer_metadataA
Return a standard ATT&CK Navigator layer metadata template.

This provides default layer properties (version info, gradient settings,
layout, filters, etc.) adapted to a specific ATT&CK domain.

Useful for clients that want to build custom layers programmatically
without starting from scratch.

Args:
    domain: One of "enterprise", "mobile", "ics". Defaults to "enterprise".

Returns:
    {
      "success": bool,
      "domain": "<domain>",
      "metadata": { ... },  # Navigator layer metadata
      "message": "<summary>"
    }

Inputs: domain. Returns: result

get_mitigations_mitigating_techniqueA
Get all mitigations that address a specific technique.

Helper returns: list[RelationshipEntry[Mitigation]]
So each item is a wrapper that contains a Mitigation object (usually in `.object`).
We must unwrap before extracting fields.

Returns (same schema as before):
  {
    "found": bool,
    "technique": {...} | null,
    "count": int,
    "mitigations": [...],
    "formatted": str,
    "message": str
  }

Inputs: technique_stix_id (required), domain, include_description. Returns: result

get_nameA
Resolve the human-readable object name for a given STIX ID.

This converts internal STIX UUIDs such as:
    attack-pattern--UUID
    intrusion-set--UUID
    malware--UUID
    tool--UUID
    course-of-action--UUID

into ATT&CK object names such as:
    "Phishing"
    "APT29"
    "Cobalt Strike"
    "Valid Accounts"

Args:
    stix_id: STIX UUID of the object.
    domain: ATT&CK domain ("enterprise", "mobile", "ics").

Returns:
    {
      "found": bool,
      "name": "<object name or null>",
      "message": "<status message>"
    }

Inputs: stix_id (required), domain. Returns: result

get_object_by_attack_idA
Retrieve any MITRE ATT&CK object by its external ATT&CK ID and STIX type.

This tool supports techniques, intrusion sets (APT groups), malware,
tools, mitigations, campaigns, data sources, data components, and tactics.

Args:
    attack_id: The external ATT&CK ID (e.g., "T1055", "G0016", "S0154", "M1013").
    stix_type: The STIX object type (e.g., "attack-pattern", "intrusion-set").
    domain: ATT&CK domain ("enterprise", "mobile", or "ics").
    include_description: Whether to include the object's description field.

Returns:
    {
      "found": bool,
      "object": {
          "id": "<ATT&CK ID>",
          "name": "<object name>",
          "stix_id": "<STIX object ID>",
          "type": "<stix_type>",
          "description": "<description or null>"
      },
      "formatted": "<human-readable formatted output>",
      "message": "<status>"
    }

Inputs: attack_id (required), stix_type (required), domain, include_description. Returns: result

get_object_by_stix_idA
Retrieve any MITRE ATT&CK object by its STIX ID (UUID).

STIX IDs are internal identifiers like:
  - attack-pattern--a62a8db3-f23a-4d8f-afd6-9dbc77e7813b

This tool is useful when you already have a STIX ID from another
query or relationship and want to resolve it to the full object.

Args:
    stix_id: STIX object ID (e.g., "attack-pattern--...").
    domain: ATT&CK domain to search in ("enterprise", "mobile", "ics").
    include_description: Whether to include the object's description.

Returns:
    {
      "found": bool,
      "object": {
          "attack_id": "<ATT&CK external ID or null>",
          "name": "<object name>",
          "stix_id": "<STIX ID>",
          "type": "<stix type>",
          "description": "<description or null>"
      },
      "formatted": "<human-readable formatted text>",
      "message": "<status message>"
    }

Inputs: stix_id (required), domain, include_description. Returns: result

get_objects_by_contentA
Search MITRE ATT&CK objects by matching text inside their description field.

This performs a full-text search over object descriptions. It is useful for:
  • Finding techniques related to specific technologies (e.g., “PowerShell”)
  • Finding groups mentioning a region or country (e.g., “Russia”)
  • Finding mitigations referencing specific defenses (e.g., “multi-factor”)
  • Searching malware or tool descriptions for keywords

Args:
    content: The text to search for (case-insensitive, partial match).
    object_type: STIX object type, such as:
        - "attack-pattern" (techniques)
        - "intrusion-set" (APT groups)
        - "malware"
        - "tool"
        - "course-of-action" (mitigations)
        - "campaign"
        - "x-mitre-data-source"
        - "x-mitre-data-component"
        - etc.
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to return descriptions in the structured output.

Returns:
    {
      "count": <number of matches>,
      "objects": [
         {
            "attack_id": "<ATT&CK ID or null>",
            "name": "<object name>",
            "stix_id": "<STIX ID>",
            "type": "<object_type>",
            "description": "<description or null>"
         },
         ...
      ],
      "formatted": "<human-readable formatted list>",
      "message": "<status message>"
    }

Inputs: content (required), object_type (required), domain, include_description. Returns: result

get_objects_by_nameA
Retrieve MITRE ATT&CK objects by exact name match (case-sensitive).

This tool performs an exact name match for a specific STIX type within
a given ATT&CK domain. It is more strict than generic search methods,
which typically perform partial or keyword matching.

Examples:
    - Technique: get_objects_by_name("Phishing", "attack-pattern")
    - Group: get_objects_by_name("APT29", "intrusion-set")
    - Malware: get_objects_by_name("Cobalt Strike", "malware")

Args:
    name: Exact object name to search for (case-sensitive).
    stix_type: STIX object type (same values as get_object_by_attack_id),
               e.g. "attack-pattern", "intrusion-set", "malware",
               "tool", "course-of-action", etc.
    domain: ATT&CK domain ("enterprise", "mobile", or "ics").
    include_description: Whether to include descriptions in the formatted output
                         and structured result.

Returns:
    {
      "count": <number of matching objects>,
      "objects": [
        {
          "attack_id": "<ATT&CK external ID or null>",
          "name": "<object name>",
          "stix_id": "<STIX ID>",
          "type": "<stix_type>",
          "description": "<description or null>"
        },
        ...
      ],
      "formatted": "<human-readable multi-object formatted text>",
      "message": "<status summary>"
    }

Inputs: name (required), stix_type (required), domain, include_description. Returns: result

get_objects_by_typeA
Get all objects of a specific STIX type.

This is a generic method to retrieve ATT&CK/CTI objects by STIX type.
It complements more specific tools such as get_all_techniques(),
get_all_groups(), etc.

Common STIX types include:
  - 'attack-pattern'          (techniques)
  - 'malware'                 (malware)
  - 'tool'                    (tools)
  - 'intrusion-set'           (APT groups)
  - 'campaign'                (campaigns)
  - 'course-of-action'        (mitigations)
  - 'x-mitre-matrix'          (matrices)
  - 'x-mitre-tactic'          (tactics)
  - 'x-mitre-data-source'     (data sources)
  - 'x-mitre-data-component'  (data components)
  - 'x-mitre-asset'           (ICS assets)

Args:
    stix_type: STIX object type to fetch.
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics', ...).
    remove_revoked_deprecated: Exclude revoked/deprecated objects.
    include_description: Include object descriptions in output.

Returns:
    {
      "stix_type": "<type>",
      "domain": "<domain>",
      "count": int,
      "objects": [
        {
          "name": "...",
          "stix_id": "<stix-id>",
          "attack_id": "<T/G/S/M/C/... or null>",
          "description": "<text or null>",
        },
        ...
      ],
      "formatted": "<multi-line readable text>",
      "message": "<summary>"
    }

Inputs: stix_type (required), domain, include_description, remove_revoked_deprecated. Returns: result

get_objects_created_afterA
Get all ATT&CK objects created after a specific timestamp.

Useful for detecting new additions to the framework.
Timestamp must be ISO8601 format, e.g., '2024-01-01T00:00:00Z'.

Returns:
    {
        "found": bool,
        "count": int,
        "objects": [
            {
                "id": "<ATT&CK ID or None>",
                "name": "...",
                "stix_id": "...",
                "type": "<stix-type>",
                "description": "..." | None
            },
            ...
        ],
        "formatted": "<pretty text>",
        "message": "..."
    }

Inputs: timestamp (required), domain, include_description. Returns: result

get_objects_modified_afterA
Get all ATT&CK objects modified after a specific timestamp.

Useful for tracking updates and changes to the ATT&CK framework.
Timestamp must be ISO8601 format, e.g., '2024-01-01T00:00:00Z'.

Returns:
    {
        "found": bool,
        "count": int,
        "objects": [
            {
                "id": "<ATT&CK ID or None>",
                "name": "...",
                "stix_id": "...",
                "type": "<stix-type>",
                "description": "..." | None
            },
            ...
        ],
        "formatted": "<pretty text>",
        "message": "..."
    }

Inputs: timestamp (required), domain, include_description. Returns: result

get_parent_technique_of_subtechniqueA
Get the parent technique of a subtechnique.

Args:
    technique_stix_id: STIX UUID of the subtechnique.
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics').
    include_description: Whether to include the parent's description.

Returns:
    {
      "subtechnique_stix_id": "...",
      "subtechnique_attack_id": "Txxxx.xxx" or null,
      "parent": {
          "attack_id": "Txxxx",
          "name": "...",
          "stix_id": "attack-pattern--UUID",
          "description": "..." | null
      } or null,
      "formatted": "<human readable description>",
      "message": "<summary>"
    }

Inputs: technique_stix_id (required), domain, include_description. Returns: result

get_procedure_examples_by_tacticA
Get all procedure examples for techniques in a specific tactic.

Shows real-world examples of how threat groups use techniques that fall
under a given tactic (e.g., Initial Access, Persistence).

Args:
    tactic: Tactic name (e.g., "Initial Access", "Persistence").
            Case-insensitive; should match ATT&CK tactic names.
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics').
    include_description: Include example descriptions when available.

Returns:
    {
      "tactic": {
          "name": "<tactic name>",
          "attack_id": "TAxxxx" | null,
          "stix_id": "x-mitre-tactic--UUID" | null,
      },
      "count": int,
      "examples": [
        {
          "relationship_id": "relationship--UUID",
          "description": "<procedure text or null>",
          "group": {
            "attack_id": "Gxxxx" | null,
            "name": "<group name or null>",
            "stix_id": "intrusion-set--UUID" | null,
          },
          "technique": {
            "attack_id": "Txxxx or Txxxx.xxx" | null,
            "name": "<technique name or null>",
            "stix_id": "attack-pattern--UUID" | null,
          },
        },
        ...
      ],
      "formatted": "<multi-line human-readable text>",
      "message": "<summary>"
    }

Inputs: tactic (required), domain, include_description. Returns: result

get_procedure_examples_by_techniqueB
Get procedure examples showing how threat groups used a specific technique.

Procedure examples describe real incident behavior tied to this technique.

Args:
    technique_stix_id: STIX UUID of the technique
    domain: ATT&CK domain
    include_description: Include descriptions of the examples if available

Returns:
    {
      "technique": {
          "attack_id": "Txxxx",
          "name": "...",
          "stix_id": "attack-pattern--UUID"
      },
      "count": N,
      "examples": [
          {
            "relationship_id": "relationship--UUID",
            "source_group_attack_id": "Gxxxx",
            "source_group_name": "...",
            "description": "...",
            "stix_id": "relationship--UUID"
          },
          ...
      ],
      "formatted": "<multi-line readable text>",
      "message": "<summary>"
    }

Inputs: technique_stix_id (required), domain, include_description. Returns: result

get_revoked_techniquesC
Get all revoked techniques for a domain.

Revoked techniques are no longer valid in the framework, often because
they were merged or replaced.

Returns:
    {
        "found": bool,
        "count": int,
        "techniques": [...],
        "formatted": "<pretty output>",
        "message": "..."
    }

Inputs: domain, include_description. Returns: result

get_softwareA
Get all software (malware and tools) in a given ATT&CK domain.

This returns non-revoked, non-deprecated software objects, including
both malware and tools, as defined by the MITRE ATT&CK dataset.

Args:
    domain: ATT&CK domain to search ("enterprise", "mobile", or "ics").
    include_description: Whether to include descriptions in the output and
                         formatted text.

Returns:
    {
      "count": <number of software objects>,
      "software": [
        {
          "attack_id": "<SXXXX or similar, if present>",
          "name": "<software name>",
          "stix_id": "<STIX ID>",
          "type": "<malware|tool|...>",
          "description": "<text or null>"
        },
        ...
      ],
      "formatted": "<human-readable list>",
      "message": "<status summary>"
    }

Inputs: domain, include_description. Returns: result

get_software_by_aliasA
Find software/malware by alias (e.g., 'Beacon', 'Mimilib').

Many malware/tools have multiple alternative names. This tool searches
the software catalog for alias matches.

Args:
    alias: Alias to search for.
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include description fields.

Returns:
    {
      "alias": "<alias>",
      "count": <number of matches>,
      "software": [
        {
          "attack_id": "<SXXXX or MXXXX or None>",
          "name": "<software name>",
          "aliases": [...],
          "stix_id": "<malware--UUID or tool--UUID>",
          "type": "<malware|tool|...>",
          "description": "<text or null>"
        },
        ...
      ],
      "formatted": "<human readable output>",
      "message": "<status summary>"
    }

Inputs: alias (required), domain, include_description. Returns: result

get_software_used_by_campaignA
Get all software/malware used in a specific campaign.

Args:
    campaign_stix_id: Campaign STIX UUID identifier (e.g., 'campaign--UUID').
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics').
    include_description: Whether to include software descriptions.

Returns:
    {
      "campaign": {
          "attack_id": "CXXXX" | null,
          "name": "<campaign name or null>",
          "stix_id": "<campaign--UUID>",
          "description": "<text or null>",
      } | null,

      "count": <number of software objects>,

      "software": [
        {
          "attack_id": "SXXXX or similar" | null,
          "name": "<software name>",
          "stix_id": "<malware--UUID or tool--UUID>",
          "type": "<malware|tool|...> or null",
          "aliases": ["...", "..."],
          "description": "<text or null>",
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "<type>",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>",
            },
            ...
          ]
        },
        ...
      ],

      "formatted": "<human-readable list of software>",
      "message": "<status summary>"
    }

Inputs: campaign_stix_id (required), domain, include_description. Returns: result

get_software_used_by_groupA
Get all software (malware and tools) used by a specific APT group,
identified by its STIX ID.

This uses MITRE's `get_software_used_by_group` to follow 'uses'
relationships from an intrusion set (group) to software objects.

Args:
    group_stix_id: STIX ID of the group (e.g., "intrusion-set--UUID").
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include software descriptions.

Returns:
    {
      "group": {
          "attack_id": "GXXXX" | null,
          "name": "<group name or null>",
          "stix_id": "<intrusion-set--UUID>",
          "description": "<text or null>"
      } | null,
      "count": <number of software objects>,
      "software": [
        {
          "attack_id": "SXXXX or similar" | null,
          "name": "<software name>",
          "stix_id": "<STIX ID>",
          "type": "<malware|tool|...>",
          "description": "<text or null>",
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "uses",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>",
            },
            ...
          ]
        },
        ...
      ],
      "formatted": "<human-readable list of software>",
      "message": "<status summary>"
    }

Inputs: group_stix_id (required), domain, include_description. Returns: result

get_software_using_techniqueA
Get all software (malware/tools) that use a specific technique.

This is a reverse lookup: Technique → Software.
It follows 'uses' relationships from a technique STIX ID to software
(malware and tools) that implement or leverage that technique.

Args:
    technique_stix_id: STIX ID of the technique
                       (e.g., "attack-pattern--UUID").
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include software descriptions.

Returns:
    {
      "technique": {
          "attack_id": "TXXXX or TXXXX.YYY" | null,
          "name": "<technique name or null>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>",
      } | null,

      "count": <number of software objects>,

      "software": [
        {
          "attack_id": "SXXXX or similar" | null,
          "name": "<software name>",
          "stix_id": "<software STIX ID>",
          "type": "<malware|tool|...>",
          "description": "<text or null>",
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "uses",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>",
            },
            ...
          ]
        },
        ...
      ],

      "formatted": "<human-readable list of software>",
      "message": "<status summary>"
    }

Inputs: technique_stix_id (required), domain, include_description. Returns: result

get_statsA
Get basic statistics about the loaded ATT&CK data for a given domain.

This returns counts of key object types (techniques, groups, software,
tactics, mitigations), excluding revoked/deprecated entries.

Args:
    domain: ATT&CK domain ("enterprise", "mobile", "ics").

Returns:
    {
      "domain": "<domain>",
      "stats": {
          "techniques": <int>,
          "groups": <int>,
          "software": <int>,
          "tactics": <int>,
          "mitigations": <int>
      },
      "message": "<status message>"
    }

Inputs: domain. Returns: result

get_stix_typeA
Determine the STIX object type for a given STIX ID.

This is useful when you have a raw STIX UUID (e.g.,
"attack-pattern--xxxx") but need to know whether it corresponds to a
technique, intrusion set, malware, tool, mitigation, data source, etc.

Args:
    stix_id: The STIX UUID identifier to look up.
    domain: ATT&CK domain ("enterprise", "mobile", "ics").

Returns:
    {
        "found": bool,
        "stix_type": "<type string or null>",
        "message": "<status message>"
    }

Examples:
    get_stix_type("attack-pattern--a62a8db3-f23a-4d8f-afd6-9dbc77e7813b")
    → "attack-pattern"

Inputs: stix_id (required), domain. Returns: result

get_subtechniques_of_techniqueA
Get all subtechniques of a parent technique.

Args:
    technique_stix_id: STIX UUID of the parent technique.
    domain: ATT&CK domain.
    include_description: Whether to include subtechnique descriptions.

Returns:
    {
      "parent": {
          "stix_id": "...",
          "attack_id": "...",
          "name": "..."
      },
      "count": int,
      "subtechniques": [
          {
              "attack_id": "...",
              "name": "...",
              "stix_id": "...",
              "description": "..." | null
          },
          ...
      ],
      "formatted": "<multi-line string>",
      "message": "<summary>"
    }

Inputs: technique_stix_id (required), domain, include_description. Returns: result

get_tactics_by_matrixA
Get all ATT&CK tactics belonging to a specific matrix.

Args:
    matrix_stix_id: STIX ID of the matrix (e.g., x-mitre-matrix--UUID)
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics')
    include_description: Whether to include tactic descriptions

Returns:
    {
      "found": bool,
      "count": int,
      "tactics": [
        {
          "name": "...",
          "stix_id": "...",
          "description": "...",
          "attack_id": "TAxxxx" or null
        }
      ],
      "formatted": "<multiline string>",
      "message": "..."
    }

Inputs: matrix_stix_id (required), domain, include_description.

get_tactics_by_techniqueA
Get all tactics associated with a specific ATT&CK technique.

Techniques can belong to one or more tactics (kill chain phases).

Args:
    technique_stix_id: Technique STIX UUID identifier (attack-pattern--UUID)
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics')
    include_description: Whether to include tactic descriptions

Returns:
    {
      "found": bool,
      "count": int,
      "tactics": [
        {
          "name": "...",
          "stix_id": "...",
          "attack_id": "TAxxxx" or null,
          "description": "...",
        }
      ],
      "formatted": "<multiline formatted output>",
      "message": "..."
    }

Inputs: technique_stix_id (required), domain, include_description.

get_technique_by_idA

" Retrieve a MITRE ATT&CK technique by its external ATT&CK ID (e.g., "T1055", "T1053.005").

This tool searches the specified ATT&CK domain (enterprise, mobile, or ics)
and returns both structured machine-readable data and an optional formatted
human-readable text block. It is useful for user-facing responses as well
as downstream programmatic reasoning.

Args:
    technique_id: The external ATT&CK technique ID (e.g., "T1055").
    domain: ATT&CK domain to search in ("enterprise", "mobile", "ics").
    include_description: If True, returns the full ATT&CK description text.

Returns:
    {
      "found": bool,
      "technique": {
          "id": "<ATT&CK ID>",
          "name": "<technique name>",
          "stix_id": "<STIX object ID>",
          "description": "<full description or null>"
      },
      "formatted": "<human-readable formatted block>",
      "message": "<status message>"
    }

Inputs: technique_id (required), domain, include_description. Returns: result

get_techniques_by_platformA
Get all ATT&CK techniques that apply to a specific platform.

Args:
    platform: Platform name (e.g., 'Windows', 'Linux', 'macOS', 
              'Cloud', 'Azure AD', 'Network', etc.)
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics').
    include_description: Whether to include technique descriptions.

Returns:
    {
      "platform": "<platform>",
      "count": <number>,
      "techniques": [
        {
          "attack_id": "Txxxx" or "Txxxx.xxx" or null,
          "name": "<technique name>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>"
        },
        ...
      ],
      "formatted": "<optional formatted string>",
      "message": "<summary>"
    }

Inputs: platform (required), domain, include_description. Returns: result

get_techniques_by_tacticA
Get all techniques associated with a specific ATT&CK tactic.

This uses the MITRE ATT&CK Navigator-style mapping between tactics and
techniques for a given domain (e.g., "enterprise-attack").

Examples:
    - get_techniques_by_tactic("Initial Access", "enterprise")
    - get_techniques_by_tactic("Execution", "enterprise")
    - get_techniques_by_tactic("Persistence", "enterprise")

Args:
    tactic: Tactic name (e.g., "Initial Access", "Persistence").
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include technique descriptions
                         in the structured and formatted output.

Returns:
    {
      "count": <number of techniques>,
      "techniques": [
        {
          "attack_id": "<TXXXX or TXXXX.YYY>",
          "name": "<technique name>",
          "stix_id": "<attack-pattern--...>",
          "description": "<description or null>",
          "tactic": "<tactic name>",
        },
        ...
      ],
      "formatted": "<human-readable technique list>",
      "message": "<status summary>"
    }

Inputs: tactic (required), domain, include_description. Returns: result

get_techniques_detected_by_datacomponentA
Get all techniques that can be detected by a specific data component.

Shows which adversary techniques can be identified by monitoring
this specific aspect of telemetry.

Args:
    datacomponent_stix_id: Data component STIX UUID identifier
                           (e.g., 'x-mitre-data-component--UUID').
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics').
    include_description: Whether to include technique descriptions.

Returns:
    {
      "datacomponent": {
          "name": "<data component name or null>",
          "stix_id": "<x-mitre-data-component--UUID>",
          "description": "<text or null>",
          "data_source_stix_id": "<x-mitre-data-source--UUID or null>",
          "data_source_name": "<data source name or null>",
          "data_source_attack_id": "<data source ATT&CK ID or null>",
      } | null,

      "count": <number of techniques>,

      "techniques": [
        {
          "attack_id": "Txxxx or Txxxx.xxx" | null,
          "name": "<technique name>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>",
        },
        ...
      ],

      "formatted": "<human-readable list of techniques>",
      "message": "<status summary>"
    }

Inputs: datacomponent_stix_id (required), domain, include_description. Returns: result

get_techniques_mitigated_by_mitigationA
Get all techniques mitigated by a specific mitigation (by STIX ID).

Args:
    mitigation_stix_id: STIX UUID of the mitigation (e.g., course-of-action--UUID).
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics').
    include_description: Include technique descriptions in the output.

Returns:
    {
      "found": bool,
      "mitigation": {
          "attack_id": "...",
          "name": "...",
          "stix_id": "course-of-action--..."
      } | null,
      "count": int,
      "techniques": [
          {
              "attack_id": "Txxxx",
              "name": "...",
              "stix_id": "...",
              "description": "...",
          },
          ...
      ],
      "formatted": "<multi-line text>",
      "message": "<summary>"
    }

Inputs: mitigation_stix_id (required), domain, include_description. Returns: result

get_techniques_targeting_assetA
Get all techniques that target a specific ICS asset.

Shows which adversary techniques can affect a given industrial
control system component.

Args:
    asset_stix_id: STIX ID of the ICS asset
    domain: Domain (default: 'ics')
    include_description: Whether to include descriptions in formatted output

Returns:
    {
        "found": bool,
        "count": int,
        "techniques": [
            {
                "id": "<ATT&CK ID>",
                "name": "...",
                "stix_id": "...",
                "description": "..." | None
            },
            ...
        ],
        "formatted": "<optional pretty text>",
        "message": "..."
    }

Inputs: asset_stix_id (required), domain, include_description. Returns: result

get_techniques_used_by_campaignA
Get all techniques used in a specific campaign.

Args:
    campaign_stix_id: Campaign STIX UUID identifier
                      (e.g., 'campaign--UUID').
    domain: ATT&CK domain ('enterprise', 'mobile', 'ics').
    include_description: Whether to include technique descriptions.

Returns:
    {
      "campaign": {
          "attack_id": "CXXXX" | null,
          "name": "<campaign name or null>",
          "stix_id": "<campaign--UUID>",
          "description": "<text or null>",
      } | null,

      "count": <number of techniques>,

      "techniques": [
        {
          "attack_id": "TXXXX or TXXXX.YYY" | null,
          "name": "<technique name>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>",
          "tactics": ["<Tactic 1>", "<Tactic 2>", ...],
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "<type>",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>",
            },
            ...
          ]
        },
        ...
      ],

      "formatted": "<human-readable list of techniques>",
      "message": "<status summary>"
    }

Inputs: campaign_stix_id (required), domain, include_description. Returns: result

get_techniques_used_by_groupA
Get all techniques used by a specific APT group, identified by its STIX ID.

This is similar to `get_group_techniques`, but instead of a group name or
alias it takes the group's STIX UUID (e.g. "intrusion-set--..."), which is
useful when you already have the STIX ID from another query or relationship.

Args:
    group_stix_id: STIX ID of the group (intrusion-set--UUID).
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include technique descriptions.

Returns:
    {
      "group": {
          "attack_id": "GXXXX" | null,
          "name": "<group name or null>",
          "stix_id": "<intrusion-set--UUID>",
          "description": "<text or null>"
      } | null,
      "count": <number of techniques>,
      "techniques": [
        {
          "attack_id": "TXXXX or TXXXX.YYY" | null,
          "name": "<technique name>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>",
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "uses",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>"
            },
            ...
          ]
        },
        ...
      ],
      "formatted": "<human-readable technique list>",
      "message": "<status summary>"
    }

Inputs: group_stix_id (required), domain, include_description. Returns: result

get_techniques_used_by_group_softwareA
Get techniques used by the software that a group uses (Group → Software → Techniques).

This provides an indirect view of a group's capabilities by following:
    Group (intrusion set) → Software (malware/tools) → Techniques

Args:
    group_stix_id: STIX ID of the group (e.g., "intrusion-set--UUID").
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include technique descriptions.

Returns:
    {
      "group": {
          "attack_id": "GXXXX" | null,
          "name": "<group name or null>",
          "stix_id": "<intrusion-set--UUID>",
          "description": "<text or null>",
      } | null,

      "count": <number of techniques>,

      "techniques": [
        {
          "attack_id": "TXXXX or TXXXX.YYY" | null,
          "name": "<technique name>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>",
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "uses",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>",
            },
            ...
          ]
        },
        ...
      ],

      "formatted": "<human-readable list of techniques>",
      "message": "<status summary>"
    }

Inputs: group_stix_id (required), domain, include_description. Returns: result

get_techniques_used_by_softwareA
Get all techniques used by specific software/malware.

This shows what ATT&CK techniques a given software (tool/malware) is
capable of performing.

Args:
    software_stix_id: STIX ID of the software object
                      (e.g., "malware--UUID", "tool--UUID").
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include technique descriptions.

Returns:
    {
      "software": {
          "attack_id": "SXXXX or similar" | null,
          "name": "<software name or null>",
          "stix_id": "<software STIX ID>",
          "type": "<malware|tool|...> or null",
          "description": "<text or null>",
      } | null,

      "count": <number of techniques>,

      "techniques": [
        {
          "attack_id": "TXXXX or TXXXX.YYY" | null,
          "name": "<technique name>",
          "stix_id": "<attack-pattern--UUID>",
          "description": "<text or null>",
          "relationships": [
            {
              "stix_id": "<relationship--UUID>",
              "relationship_type": "uses",
              "description": "<relationship description or null>",
              "source_ref": "<source STIX ID>",
              "target_ref": "<target STIX ID>",
            },
            ...
          ]
        },
        ...
      ],

      "formatted": "<human-readable list of techniques>",
      "message": "<status summary>"
    }

Inputs: software_stix_id (required), domain, include_description. Returns: result

get_technique_tacticsA
Get the ATT&CK tactic names associated with a given technique.

This tool:
  1) Looks up a technique by its external ATT&CK ID (e.g., "T1055").
  2) Extracts its kill chain phases (tactics) from the STIX object.
  3) Returns human-readable tactic names (e.g., "Initial Access"),
     along with the raw phase names and kill chain names.

Args:
    technique_id: External ATT&CK technique ID (e.g., "T1055", "T1055.002").
    domain: ATT&CK domain ("enterprise", "mobile", "ics").

Returns:
    {
      "found": bool,
      "technique": {
          "id": "<ATT&CK ID>",
          "name": "<technique name or null>",
          "stix_id": "<attack-pattern--... or null>",
      } | null,
      "tactics": [
        {
          "tactic": "<Human readable, e.g., 'Initial Access'>",
          "phase_name": "<raw phase name, e.g., 'initial-access'>",
          "kill_chain_name": "<kill chain name, e.g., 'mitre-attack'>"
        },
        ...
      ],
      "message": "<status message>"
    }

Inputs: technique_id (required), domain. Returns: result

search_groupsA
Search MITRE ATT&CK intrusion sets (APT groups) by name, alias, or
description (case-insensitive).

If the query is empty, all groups in the domain are returned.

Args:
    query: Search keyword (name, alias, or any text in the description).
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include descriptions in the output.

Returns:
    {
      "count": <number of matches>,
      "groups": [
        {
          "attack_id": "GXXXX",
          "name": "...",
          "aliases": [...],
          "stix_id": "...",
          "description": "..." | null
        },
        ...
      ],
      "formatted": "<LLM-friendly block>",
      "message": "<summary>"
    }

Inputs: query, domain, include_description. Returns: result

search_softwareA
Search MITRE ATT&CK software (malware & tools) by keyword in name or
description (case-insensitive).

Args:
    query: Keyword to search for in software names and descriptions.
    domain: ATT&CK domain ("enterprise", "mobile", "ics").
    include_description: Whether to include descriptions in the response.

Returns:
    {
      "count": <number of matches>,
      "software": [
        {
          "attack_id": "<SXXXX or similar>",
          "name": "...",
          "stix_id": "...",
          "type": "<tool|malware|...>",
          "description": "..." | null
        },
        ...
      ],
      "formatted": "<nicely formatted block>",
      "message": "<status summary>"
    }

Inputs: query (required), domain, include_description. Returns: result

search_techniquesA
Search MITRE ATT&CK techniques by keyword in their name or description.

This tool performs a case-insensitive search over all non-revoked,
non-deprecated techniques in the given domain. A technique is matched if
the query string appears in either:
  • the technique name, or
  • the technique description

Examples:
    - search_techniques("PowerShell")
    - search_techniques("credential dumping")
    - search_techniques("initial access", domain="enterprise")

Args:
    query: Text to search for in technique names and descriptions.
    domain: ATT&CK domain ("enterprise", "mobile", or "ics").
    include_description: Whether to include descriptions in the structured
                         result and formatted output.

Returns:
    {
      "count": <number of matches>,
      "techniques": [
        {
          "attack_id": "<TXXXX or TXXXX.YYY>",
          "name": "<technique name>",
          "stix_id": "<attack-pattern--...>",
          "description": "<description or null>",
        },
        ...
      ],
      "formatted": "<human-readable formatted list>",
      "message": "<status summary>"
    }

Inputs: query (required), domain, include_description. Returns: result

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 65 tools

    Disambiguation5/5

    Each tool targets a distinct ATT&CK entity or relationship. No two tools have identical purposes; even closely related tools differ by input parameters or entity type, ensuring clear separation.

    Naming Consistency4/5

    Most tools follow a consistent 'verb_noun' pattern (e.g., get_all_*, search_*, generate_layer). A minor inconsistency exists with both 'get_software' and 'get_all_software' having overlapping functionality, but overall the naming is predictable.

    Tool Count3/5

    65 tools is high but appropriate for the comprehensive ATT&CK framework. The tool set covers many entity types and relationships, though some consolidation could reduce redundancy without losing functionality.

    Completeness5/5

    The tool set covers all major ATT&CK entities (techniques, groups, software, campaigns, etc.) and their relationships, plus utility tools for layer generation, search, and object resolution. No obvious gaps in the surface.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables querying the MITRE ATT\&CK framework for adversarial tactics, techniques, mitigations, and detection methods through natural language, supporting both ID-based and fuzzy name-based searches.
      3
      -
    • F
      license
      B
      quality
      D
      maintenance
      Provides comprehensive access to the MITRE ATT\&CK knowledge base with 50+ tools for querying threat actors, malware, and techniques, including automatic ATT\&CK Navigator layer generation for threat analysis and visualization.
      55
      45
      -
    • A
      license
      A
      quality
      A
      maintenance
      Exposes the MITRE ATT\&CK framework to LLMs and AI assistants via the Model Context Protocol, enabling querying of techniques, tactics, groups, software, and mitigations.
      9
      15
      MIT