MITRE ATT&CK MCP
Query MITRE ATT&CK data and build Navigator layers for detection coverage and gap analysis
Search and map Sigma, Splunk, Elastic, KQL and other detection rules against MITRE ATT&CK
By Michael Haag (individual) TypeScript Remote (hosted) · Streamable HTTPLocal · stdio Security
57 popularity score ★ 524 ↓ 1.0k/wk
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
{
"mcpServers": {
"security-detections": {
"url": "https://detect.michaelhaag.org/api/mcp/mcp",
"headers": {
"Authorization": "Bearer <SDMCP_TOKEN>"
}
}
}
}{
"servers": {
"security-detections": {
"type": "http",
"url": "https://detect.michaelhaag.org/api/mcp/mcp",
"headers": {
"Authorization": "Bearer <SDMCP_TOKEN>"
}
}
}
}claude mcp add --transport http security-detections https://detect.michaelhaag.org/api/mcp/mcp --header "Authorization: Bearer <SDMCP_TOKEN>"{
"mcpServers": {
"security-detections": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://detect.michaelhaag.org/api/mcp/mcp",
"--header",
"Authorization: Bearer <SDMCP_TOKEN>"
]
}
}
}export SDMCP_TOKEN="<SDMCP_TOKEN>" && codex mcp add security-detections --url https://detect.michaelhaag.org/api/mcp/mcp --bearer-token-env-var SDMCP_TOKENOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs SIGMA_PATHS. Replace each <NAME> with your value.
claude mcp add security-detections -e SIGMA_PATHS=<SIGMA_PATHS> -- npx -y security-detections-mcp{
"mcpServers": {
"security-detections": {
"command": "npx",
"args": [
"-y",
"security-detections-mcp"
],
"env": {
"SIGMA_PATHS": "<SIGMA_PATHS>"
}
}
}
}{
"mcpServers": {
"security-detections": {
"command": "npx",
"args": [
"-y",
"security-detections-mcp"
],
"env": {
"SIGMA_PATHS": "<SIGMA_PATHS>"
}
}
}
}{
"servers": {
"security-detections": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"security-detections-mcp"
],
"env": {
"SIGMA_PATHS": "<SIGMA_PATHS>"
}
}
}
}[mcp_servers.security-detections]
command = "npx"
args = ["-y", "security-detections-mcp"]
[mcp_servers.security-detections.env]
SIGMA_PATHS = "<SIGMA_PATHS>"gemini mcp add --scope user -e SIGMA_PATHS=<SIGMA_PATHS> security-detections npx -- -y security-detections-mcpOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs SIGMA_PATHS. Replace each <NAME> with your value.
git clone https://github.com/MHaggis/Security-Detections-MCP.git
cd Security-Detections-MCP
npm install
npm run buildclaude mcp add security-detections -e SIGMA_PATHS=<SIGMA_PATHS> -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'{
"mcpServers": {
"security-detections": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
],
"env": {
"SIGMA_PATHS": "<SIGMA_PATHS>"
}
}
}
}{
"mcpServers": {
"security-detections": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
],
"env": {
"SIGMA_PATHS": "<SIGMA_PATHS>"
}
}
}
}{
"servers": {
"security-detections": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
],
"env": {
"SIGMA_PATHS": "<SIGMA_PATHS>"
}
}
}
}[mcp_servers.security-detections]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"]
[mcp_servers.security-detections.env]
SIGMA_PATHS = "<SIGMA_PATHS>"gemini mcp add --scope user -e SIGMA_PATHS=<SIGMA_PATHS> security-detections node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'SIGMA_PATHS |
Required: Comma-separated Sigma rule folders. At least one *_PATHS setting is needed, and any of the others below works instead. |
|---|---|
SPLUNK_PATHS |
Optional: Splunk ESCU detection folders. |
ELASTIC_PATHS |
Optional: Elastic detection rule folders. |
KQL_PATHS |
Optional: KQL hunting query folders. |
SUBLIME_PATHS |
Optional: Sublime Security rule folders. |
CQL_HUB_PATHS |
Optional: CrowdStrike CQL Hub query folders. |
JAMF_PROTECT_PATHS |
Optional: Jamf Protect analytic folders (macOS). |
STORY_PATHS |
Optional: Splunk analytic story folders. |
ATTACK_STIX_PATH |
Optional: Path to enterprise-attack.json for threat actor and software data. |
Security Detections MCP builds a local SQLite index from detection rule repositories you clone yourself: Sigma, Splunk ESCU, Elastic, KQL hunting queries, Sublime, CrowdStrike CQL Hub and Jamf Protect analytics. An assistant can then search those rules and check them against MITRE ATT&CK. You might ask which rules cover T1059.001, what a ransomware profile would get past, or how well you cover a named threat actor once an ATT&CK STIX bundle is loaded.
There is more than lookup. It mines the indexed rules for query patterns and field names, drafts detection skeletons and Splunk risk-based alerting blocks, and exports ATT&CK Navigator layers. It also keeps a local knowledge graph of decisions and lessons, plus custom tables, saved queries and templates. Eleven prompts cover workflows like purple-team planning and CVE response, and resources such as detection://technique/{techniqueId} expose the same data. The llm_enhanced_analysis tool hands results to the client's own model through MCP sampling.
The README and the hosted guide both say 81 tools. Count the modules that src/tools/index.ts registers at the v3.3.0 tag and you get 80. The index lives at ~/.cache/security-detections-mcp/detections.sqlite (src/db/connection.ts) and is filled on first start from the folders in the *_PATHS settings.
The author also hosts a read-only subset at detect.michaelhaag.org: about 25 tools behind a personal sdmcp_ token, capped at 200 calls a day per token on the free tier.
| To run it yourself | Node.js 18+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| detect.michaelhaag.org | Free tierOnly for the hosted endpoint: a free account issues the sdmcp_ token. Running it locally needs no account |
| Also |
|
Clone the rule repositories you want indexed (the README gives sparse git clone lines for SigmaHQ, Splunk security_content, Elastic detection-rules, Sublime and others) and point at least one *_PATHS setting at them. The package depends on the native better-sqlite3 module. Threat actor tools need ATT&CK's enterprise-attack.json, named in ATTACK_STIX_PATH. For the hosted endpoint, create a token at detect.michaelhaag.org. Claude Desktop reaches it through the mcp-remote bridge.
With no *_PATHS folder set the server still starts but its index is empty, so search and coverage tools return nothing. Coverage reflects only the rules you downloaded and indexed, not what runs in your SIEM. Threat actor tools need ATTACK_STIX_PATH. llm_enhanced_analysis needs a client with MCP sampling. The hosted endpoint has only about 25 read-only tools (no knowledge graph, custom tables or autonomous analysis) and stops at 200 calls a day per token on the free tier, resetting at 00:00 UTC.
Detection engineers and SOC or purple-team analysts who keep open rule sets locally and want an assistant to search them, find ATT&CK gaps or draft new rules. Run it locally for the full tool set and offline use. The hosted endpoint suits quick read-only lookups without cloning rule repositories. It reads rule files and does not query or change a live SIEM. Its README pairs it with the same author's mitre-attack-mcp, which we also list, for ATT&CK data itself.
41 only read, 14 change things, 5 can delete or overwrite. A ? marks an optional parameter.
searchquery: stringlimit?: numbersource_type?: enumget_by_idid: stringget_raw_yamlid: stringlist_alllimit?: numberoffset?: numberlist_by_sourcesource_type: enumlimit?: numberoffset?: numberlist_by_mitretechnique_id: stringlimit?: numberoffset?: numberlist_by_mitre_tactictactic: enumlimit?: numberoffset?: numberlist_by_cvecve_id: stringlimit?: numberoffset?: numberlist_by_severitylevel: enumlimit?: numberoffset?: numberlist_by_logsourcecategory?: stringproduct?: stringservice?: stringlimit?: numberoffset?: numberlist_by_analytic_storystory: stringlimit?: numberoffset?: numberget_statsrebuild_index deletesconfirm?: booleanskip_elicitation?: booleananalyze_coveragesource_type?: enumidentify_gapsthreat_profile: enumsource_type?: enumsuggest_detectionstechnique_id: stringsource_type?: enumget_coverage_summarysource_type?: enumget_top_gapsthreat_profile: enumcompare_sourcestopic: stringlimit_per_source?: numbersmart_comparetopic: stringgenerate_navigator_layername: stringdescription?: stringsource_type?: enumtactic?: enumseverity?: enumanalyze_procedure_coveragetechnique_id: stringsource_type?: enuminclude_query_snippets?: booleancompare_procedure_coveragetechnique_id: stringsources?: arraylist_actorssearch?: stringlimit?: numberget_actor_profileactor_name: stringanalyze_actor_coverageactor_name: stringsource_type?: enuminclude_navigator_layer?: booleancompare_actor_coverageactor_names: arraysource_type?: enumsearch_storiesquery: stringlimit?: numberget_storyname: stringget_query_patternstechnique_id: stringsource_type?: enumget_field_referencedata_model: stringget_macro_referencefilter?: stringfind_similar_detectionsdescription: stringtechnique_id?: stringsource_type?: enumlimit?: numbersuggest_detection_templatetechnique_id: stringdescription: stringdata_model?: stringdetection_type?: enumplatform?: enumgenerate_rba_structuredetection_type: enumseverity: enumdescription: stringfields_available?: arrayextract_patterns changesforce?: booleanlearn_from_feedback changesfeedback_type: enumoriginal: stringcorrected: stringcontext?: stringsave_query changesname: stringquery_type: stringdata: objectttl_minutes?: numbersave_template changesname: stringtemplate: stringdescription?: stringrun_templatename: stringparams?: objectdelete_template deletesname: stringcreate_entity changesname: stringentity_type: stringcreate_relation changesfrom_entity: stringto_entity: stringrelation_type: stringreasoning: stringconfidence?: numberadd_observation changesentity_name: stringobservation: stringsource?: stringconfidence?: numberdelete_entity deletesname: stringdelete_observation deletesobservation_id: stringsearch_knowledgequery: stringlimit?: numberlog_decision changesdecision_type: stringcontext: stringdecision: stringreasoning: stringentities_involved?: arrayoutcome?: stringsession_id?: stringadd_learning changeslearning_type: stringtitle: stringinsight: stringevidence?: stringapplications?: stringget_relevant_decisionscontext_query: stringdecision_type?: stringsession_id?: stringlimit?: numberget_learningstask_query: stringlearning_type?: stringlimit?: numbermark_applied?: booleancreate_table changesname: stringdescription: stringcolumns: arrayinsert_row changestable_name: stringdata: objectrow_id?: stringquery_tabletable_name: stringwhere?: objectselect?: arrayorder_by?: arraylimit?: numberlist_tablesinclude_prebuilt?: booleandrop_table deletestable_name: stringconfirm: booleanauto_analyze_coverage changesthreat_profiles?: arraystore_results?: booleananalysis_name?: stringsession_id?: stringauto_gap_report changesreport_name?: stringcompare_sources?: booleaninclude_recommendations?: booleanpriority_tactics?: arraysession_id?: stringauto_compare_sources changestechniques_to_compare?: arrayfocus_tactic?: stringinclude_quality_analysis?: booleansession_id?: stringllm_enhanced_analysisanalysis_type: stringthreat_profile?: stringtechniques?: arraycustom_context?: stringdetection://statsdetection://coveragedetection://gaps/ransomwaredetection://gaps/aptdetection://top-covereddetection://sources/comparisonknowledge://graph/summaryknowledge://decisions/recentknowledge://learnings/alldetection://technique/{techniqueId}detection://actor/{actorName}knowledge://entity/{entityName}ransomware-readiness-assessmentapt-threat-emulationpurple-team-exercisesoc-investigation-assistdetection-engineering-sprintexecutive-security-briefingcve-response-assessmentdata-source-gap-analysisdetection-quality-reviewthreat-landscape-syncdetection-coverage-diff