stig-mcp
A local, read-only MCP server that answers security questions by mapping MITRE ATT&CK techniques/actors to NIST 800-53 controls, DISA STIG rules, and ATT&CK mitigations and detections, from an installed ~6 MB knowledge base.
Defenses for a technique: for an ATT&CK technique id, return the 800-53r5 controls CTID maps to it, the DISA STIG findings implementing those controls on a named system (most severe first), plus ATT&CK mitigations and detection strategy.
Actor techniques: for an ATT&CK group (id, name, or alias), list its techniques, optionally expanded with controls, findings, mitigations, detections, and coverage gaps for a given system.
STIG check/fix text: fetch DISA's check and fix text, benchmark, release, and CCIs for findings by rule id (SV-...r..._rule) or V- id.
MITRE defense text: return full text for mitigations (M-ids), detection strategies (DET-ids), and analytics (AN-ids), including platforms, log sources, and tunable elements.
System resolution: turn a free-text system description (e.g. 'ESXi 8.0 U3') into candidate DISA STIG benchmarks, noting build applicability.
Discovery: search ATT&CK techniques by name or id (revoked ids redirect to replacements) and list STIGs by title, benchmark id, or keyword.
Scoping and filtering: narrow findings by CAT severity, benchmark ids, ATT&CK platforms, and collected log sources (up to 100) to judge which detections are applicable and detectable.
Knowledge base management: install the prebuilt KB from GitHub releases (or offline via file + SHA-256), and check for newer releases with guidance on installing, upgrading, or building locally.
Works with any stdio MCP client (VS Code Copilot, Claude Code, others); it does not scan or connect to your systems, and only the install/check tools touch the network.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@stig-mcp what STIG fixes mitigate T1059 on Windows Server 2022?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
stig-mcp
A local MCP (Model Context Protocol) server that lets an AI assistant, such as GitHub Copilot in VS Code or Claude Code, answer security questions from published guidance instead of from memory. Name a MITRE ATT&CK® technique or threat actor and the system you care about, and the answer gives you:
the NIST SP 800-53 security controls that mitigate it;
the DISA STIG configuration rules that implement those controls on that system, most severe first, with DISA's check and fix text on request;
ATT&CK's own mitigations, and which of its detections work with the logs you collect.
It does not scan or connect to your systems. Its answers come from a knowledge base, a local database of about 6 MB built from those public sources, which you install once. The user guide explains what it does and shows three ways to use it: as a security controls assessor, a system owner, or a SOC analyst.
Prerequisite
stig-mcp is published on PyPI and runs through uvx,
which comes with uv.
Install uv, then check that
uvx --version runs in a new terminal. Restart VS Code or Claude Code after installing uv
so it sees the new PATH.
Related MCP server: MITRE ATT&CK MCP Server
Quick start
VS Code (GitHub Copilot)
Click this badge. VS Code opens and offers to install stig-mcp; choose Install.
Open Copilot Chat and set the mode dropdown to Agent. MCP tools are not available in Ask or Edit mode.
Ask:
Install the stig-mcp knowledge base.This is a one-time download of about 6 MB. Allow the tool when VS Code asks.
If that doesn't work, see troubleshooting or setting up VS Code by hand.
Claude Code
Inside a Claude Code session (2.1.275 or later), run:
/plugin install stig-mcp --marketplace jeneric/STIG-MCPAsk:
Install the stig-mcp knowledge base.This is a one-time download of about 6 MB. Allow the tool when Claude Code asks.
If that doesn't work, see troubleshooting or setting up Claude Code by hand.
Example prompts
With the knowledge base installed, try:
System owner:
What DISA STIG steps mitigate T1078 on Windows 11?Security controls assessor:
Which ATT&CK techniques does APT29 use?Anyone, to find the right STIG:
Which STIG benchmarks apply to RHEL 9?SOC analyst:
What can I detect of APT29 on Windows Server 2022 with Security and Sysmon logs?
More example prompts are in the user guide, with how to get more out of it and how to make sure the agent answers from the server.
Other MCP clients
Use this only if you are not using VS Code or Claude Code. Any client that launches a local
(stdio) MCP server works with this configuration, shown in the common mcpServers shape:
{
"mcpServers": {
"stig-mcp": {
"command": "uvx",
"args": ["stig-mcp"],
"env": { "UV_SYSTEM_CERTS": "true", "UV_NATIVE_TLS": "true" }
}
}
}The two environment variables let uv download stig-mcp behind a TLS-inspecting proxy. They are harmless on most other hosts; that section names the one exception. Then ask the agent to install the stig-mcp knowledge base, as in the quick start.
docs/install.md has the details:
manual VS Code and Claude Code setup
installing the knowledge base without an agent or without network access
What this server fetches
The MCP server contacts nothing unless
check_sourcesorinstall_knowledge_baseis called. Then it sends HTTPS GET requests toapi.github.com(this repository's release listing) andgithub.com(/jeneric/STIG-MCP/releases/download/...), which redirects torelease-assets.githubusercontent.comorobjects.githubusercontent.com. Any other URL, a redirect included, is refused. Nothing is uploaded, and there is no telemetry.install_knowledge_basegiven a file path and its SHA-256 requests nothing at all.stig-mcp-install-kbcontacts the same hosts, and nothing at all with--file.stig-mcp-fetch, used only to build the knowledge base yourself, downloads fromraw.githubusercontent.comandapi.github.com(MITRE ATT&CK, the CTID mapping, the NIST 800-53 catalog) and fromwww.cyber.milanddl.dod.cyber.mil(DISA).
PRIVACY.md states what each of these requests sends and what is stored locally.
Documentation
docs/install.md: installation details for every client, where the data lives, and troubleshooting.
docs/user-guide.md: for a person talking to an LLM that has this server wired in.
docs/operations.md: for whoever installs, builds and maintains the knowledge base.
SECURITY.md: reporting a vulnerability, and what is in scope.
CONTRIBUTING.md: working from a source checkout, running the tests, and the project's conventions.
RELEASING.md: for the maintainer, publishing the package to PyPI and the MCP Registry.
PRIVACY.md: what the server and the fetch tool contact, and what is stored locally.
Third-party content
The knowledge base aggregates MITRE ATT&CK, CTID mapping, DISA STIG, DISA CCI list, and NIST OSCAL content. See NOTICE for attribution and licensing obligations and licenses/apache-2.0.txt for the Apache 2.0 license text that notice requires.
Development
Developed with the assistance of Claude Code (Anthropic). All changes were reviewed and tested by the maintainer.
Available Tools
9 toolscheck_sourcesA
Check whether a newer prebuilt knowledge base is published than the one installed. This contacts only this project's GitHub releases (github.com/jeneric/STIG-MCP). action is "install" (call install_knowledge_base), "upgrade_package" (a newer knowledge base needs a newer stig-mcp; upgrade_to says which), "build_locally" (nothing usable is installed and no release exists for this stig-mcp; build with stig-mcp-fetch and stig-mcp-ingest), or "none"; reason says why. It works even when the knowledge base is not built, and then not_ready says why and what to run.
Inputs: no named parameters.
defense_detailsA
Return MITRE's text for ATT&CK defenses named by id: mitigations (M1026), detection strategies (DET0103) and analytics (AN0286), as listed under protect.mitigations and detect in a defenses_for_technique answer or under each technique in a techniques_for_actor answer. ids takes up to 10 per call, matched case-insensitively. A mitigation returns its description and how many techniques it covers; with technique_id it also returns MITRE's text about that mitigation on that technique as technique_description, which is null when that mitigation is not paired with that technique (a revoked id answers for its replacement, reported in technique.redirected_from). A detection strategy returns every analytic in full: description, platforms, log_sources (name, channel and data component) and mutable_elements, the tunables a detection engineer sets. An analytic id returns that analytic alone. Analytics say what to collect, not how to enable it: the enabling steps are in the vendor's documentation. not_found lists ids that matched nothing; if none match, the call is refused. Quote MITRE's text as written and label anything you add as your own. If the knowledge base is not built yet this returns {"status": "not_ready"} with the commands to run, rather than an error.
Inputs: ids (required), technique_id.
defenses_for_techniqueA
Return the defenses the knowledge base holds for an ATT&CK technique: the 800-53r5 controls CTID maps to it, the DISA STIG findings that implement those controls on the systems you name, and ATT&CK's own mitigations and detection strategy. The answer opens with summary: rules found, rules per CAT, control_counts, mitigation and detection counts (detection counts analytics), cat_i (the CAT I V- ids with their count), then controls_with_rules. Use those counts rather than counting lists yourself. protect.controls maps each control id to its name, family, source and rules. A control's rules include those DISA tags to its enhancements (e.g. AC-6(9) under AC-6), since the ATT&CK mapping names base controls; via, when present, maps each enhancement to the rules that reach the control only through it. Each finding gives its benchmark (stig_id/version, described in resolved_systems), V- id and CAT; titles come with CAT I findings, or with every CAT named in severity; when any are missing, summary.titles reads "CAT I only", so never name or describe an untitled finding without fetching its title (call again with severity naming its CAT); call finding_details with rule ids or V- ids for DISA's check and fix text and the CCIs. severity narrows findings to CAT levels, e.g. ["I"]. A technique id ATT&CK has revoked (e.g. T1562) is answered for its replacement, and the response reports the redirect in technique.redirected_from. Include the product build in system_description where one exists (e.g. 'ESXi 8.0 U3'): some products ship two STIG versions with different remediations, and the build selects the one that applies. benchmark_ids narrows to benchmarks you already know and accepts at most 200; to scope a system you cannot name, pass system_description instead and let the resolver do it. If the knowledge base is not built yet this returns {"status": "not_ready"} with the commands to run, rather than an error. platforms names ATT&CK platforms, e.g. ["Windows"], and detect.applicable then lists the analytics that apply to them; an unknown name is refused with the full list. log_sources names the telemetry you collect, with ATT&CK's log source names, in any case (e.g. ["WinEventLog:Security", "WinEventLog:Sysmon"]); log_sources takes up to 100 names. When platforms is given, detect.detectable lists (and summary.detection counts) only applicable analytics whose every log source is in the list; without platforms, every analytic whose log sources are all collected. detect.analytics maps each analytic id to its name and platforms; detect.applicable and detect.detectable list the qualifying ids and are present only when platforms or log_sources was given (absent: not judged; empty: none qualify). Mitigations are listed by id and name only: call defense_details with M-, DET- or AN- ids for MITRE's text, log sources and tunable elements.
Inputs: technique_id (required), severity, platforms, log_sources, +2 more.
finding_detailsA
Return DISA's check and fix text for STIG findings, with each finding's benchmark, release and CCIs. ids takes up to 50 rule ids (SV-...r..._rule) or V- ids as listed under findings in a defenses_for_technique or techniques_for_actor answer, in any case. Prefer the V- id: a rule id carries its release's revision and matches only that release. A V- id that two benchmarks or majors share returns every match, each labeled with its benchmark. not_found lists ids that matched nothing; if none match, the call is refused with an error instead. Quote check_text and fix_text as DISA wrote them, and label anything you add, such as commands or explanations, as your own rather than DISA's. If the knowledge base is not built yet this returns {"status": "not_ready"} with the commands to run, rather than an error.
Inputs: ids (required).
install_knowledge_baseA
Install the prebuilt knowledge base this server answers from. With no arguments, download the newest release for this server from this project's GitHub releases (github.com/jeneric/STIG-MCP), verify its SHA-256 and install it; this downloads and verifies about 5 MB and can take several seconds. It is the only tool besides check_sources that uses the network. release pins an exact kb-YYYY-MM-DD tag, for rollback. On a host without network access, pass path (a .sqlite.xz or .sqlite copied from a release) and sha256 (the value its SHA256SUMS lists); nothing is then requested. Call this when another tool returns {"status": "not_ready"}, or when check_sources reports "install".
Inputs: path, sha256, release.
list_stigsA
List the STIGs in the knowledge base, optionally filtered by a substring of the title, the benchmark id (e.g. RHEL_9_STIG), or the product keywords. If the knowledge base is not built yet this returns {"status": "not_ready"} with the commands to run, rather than an error.
Inputs: filter.
resolve_systemA
Resolve a free-text system description to candidate DISA STIG(s). Returns 'candidates' and 'notes'. limit caps the number of distinct benchmarks returned, not rows: a benchmark holding more than one STIG major (for example vSphere 8.0) contributes every major as its own row, so a caller asking for limit=5 may receive more than 5 rows. Include the product build where one exists (e.g. 'ESXi 8.0 U3'); each candidate reports whether it applies to that build in the 'applicable' field. When the description names a product version this knowledge base does not hold, a note in 'notes' says so and names the versions it does hold. A description naming more than one system is split on 'and' and commas and each part judged separately, so it can carry one such note per part, each quoting the part it is about. When more benchmarks tie with the last benchmark shown than limit allows, a note in 'notes' says how many and suggests calling again with a higher limit. If the knowledge base is not built yet this returns {"status": "not_ready"} with the commands to run, rather than an error.
Inputs: system_description (required), limit.
search_techniquesA
Search ATT&CK techniques by name or id. Ids and names ATT&CK has revoked also match, returning the replacement technique with redirected_from set to the old id. If the knowledge base is not built yet this returns {"status": "not_ready"} with the commands to run, rather than an error.
Inputs: query (required), limit.
techniques_for_actorA
List an ATT&CK actor's techniques, optionally expanded with defenses for given systems. actor is an ATT&CK group id, name or alias; case, spacing, punctuation and a trailing "Group" or "Team" are ignored, and actor.matched_as then names what matched. actor.also_matches, when present, lists other groups the same label loosely names. A misspelling is not corrected: the error names the closest groups, so call again with the group id of the one meant. The answer opens with summary, which counts the techniques; with include_defenses it adds the same counts defenses_for_technique gives, across every technique. Use those counts rather than counting lists yourself. controls lists each control once with its rule ids, including rules DISA tags to its enhancements, which via names, and findings lists each finding once, without check or fix text (call finding_details for those), each naming its benchmark, V- id and CAT, with titles for CAT I or for the CATs named in severity; summary.titles reads "CAT I only" when the rest are missing, so fetch a title before naming an untitled finding. Each technique lists its control ids grouped by where the mapping came from ("ctid" or "override"). benchmark_ids accepts at most 200; it, severity (CAT levels, e.g. ["I"]), platforms and log_sources are validated always but only take effect with include_defenses. To scope a system you cannot name, pass system_description instead. With include_defenses each technique also lists its ATT&CK mitigations (M-ids), its detection strategy (DET-id), analytics (a map of AN-id to platforms, with applicable and detectable id lists as in defenses_for_technique), and gaps, the coverage classes the call can judge that count that technique as a gap (mitigated_without_rules needs a scoped system, without_applicable_analytic platforms, undetectable log_sources), so read gaps rather than deriving them. mitigations maps each M-id to its name once, while summary.mitigations counts mitigation references across techniques (one on two techniques counts twice). summary.coverage, which comes right after control_counts, counts techniques: without_mitigation, mitigated_without_rules (only when a system was scoped; with severity, no rules at the requested CAT levels), without_applicable_analytic (only with platforms), detectable and undetectable (only with log_sources); summary.detection counts analytics instead. Detection is judged applicability first when platforms is given, then detectability over the applicable analytics. Each technique's applicable and detectable id lists are judged as in defenses_for_technique, so with platforms detectable is always a subset of applicable; log_sources takes up to 100 names. Call defense_details with M-, DET- or AN- ids for MITRE's text. If the knowledge base is not built yet this returns {"status": "not_ready"} with the commands to run, rather than an error.
Inputs: actor (required), severity, platforms, log_sources, +3 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 9 tools
Most tools target distinct resources: resolve_system finds benchmarks, list_stigs enumerates them, finding_details and defense_details fetch text for specific ids, and install/check handle the knowledge base. The main overlap is between defenses_for_technique and techniques_for_actor, since the latter's include_defenses effectively re-runs the former's logic, and resolve_system vs list_stigs both deal with the benchmark catalog. The very detailed descriptions mitigate most of this, so an agent can usually pick correctly.
All names use snake_case consistently, with no casing chaos. The convention is only split between action-led names (resolve_system, list_stigs, search_techniques, check_sources, install_knowledge_base) and noun-phrase lookups (finding_details, defense_details, defenses_for_technique, techniques_for_actor), which reads a bit mixed but remains predictable and readable.
Nine tools is well within a healthy range and each appears to earn its place: a handful of query tools, two detail-fetch tools, and two knowledge-base lifecycle tools. Nothing feels redundant or thin.
The surface covers the full workflow: resolving systems, listing STIGs, fetching finding check/fix text, mapping techniques/actors to defenses and controls, fetching MITRE defense text, and installing/updating the knowledge base. A minor gap is a direct control-id lookup (controls are only reachable through technique/actor queries), but this is largely workable.
Maintenance
Related MCP Connectors
Query and retrieve information about various adversarial tactics and techniques used in cyber atta…
2,029 DISA STIG rules with official check/fix text, CCI mappings, and .ckl checklist export.
Live threat intel for agents: incidents, actors, CVEs with KEV/EPSS, ransomware leak-site victims.
MITRE ATT&CK MCP — STIX bundles from github.com/mitre/cti.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables 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-
- AlicenseAqualityCmaintenanceEnables AI-native access to the MITRE ATT\&CK framework, allowing LLMs and agents to query techniques, threat groups, software, and generate ATT\&CK Navigator layers for threat intelligence and security workflows.65120 npm5Apache 2.0
- AlicenseBqualityDmaintenanceEnables cyber defenders to query ATT\&CK techniques, list tactics, map incidents to techniques, look up threat actor groups and mitigations, all via the MCP protocol.5MIT
- FlicenseNot gradedqualityDmaintenanceProvides search, detail lookup, and gap listing tools for a security control inventory, enabling natural language queries about control status and gaps.-