agent-threat-rules 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +360 -98
- package/dist/action-executor.d.ts +44 -0
- package/dist/action-executor.d.ts.map +1 -0
- package/dist/action-executor.js +130 -0
- package/dist/action-executor.js.map +1 -0
- package/dist/adapters/default-adapter.d.ts +24 -0
- package/dist/adapters/default-adapter.d.ts.map +1 -0
- package/dist/adapters/default-adapter.js +51 -0
- package/dist/adapters/default-adapter.js.map +1 -0
- package/dist/adapters/stdio-adapter.d.ts +30 -0
- package/dist/adapters/stdio-adapter.d.ts.map +1 -0
- package/dist/adapters/stdio-adapter.js +128 -0
- package/dist/adapters/stdio-adapter.js.map +1 -0
- package/dist/cli.js +119 -1
- package/dist/cli.js.map +1 -1
- package/dist/coverage-analyzer.d.ts +43 -0
- package/dist/coverage-analyzer.d.ts.map +1 -0
- package/dist/coverage-analyzer.js +329 -0
- package/dist/coverage-analyzer.js.map +1 -0
- package/dist/engine.d.ts +40 -5
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +89 -5
- package/dist/engine.js.map +1 -1
- package/dist/hook-handler.d.ts +61 -0
- package/dist/hook-handler.d.ts.map +1 -0
- package/dist/hook-handler.js +178 -0
- package/dist/hook-handler.js.map +1 -0
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/layer-integration.d.ts +55 -0
- package/dist/layer-integration.d.ts.map +1 -0
- package/dist/layer-integration.js +185 -0
- package/dist/layer-integration.js.map +1 -0
- package/dist/loader.js +2 -2
- package/dist/loader.js.map +1 -1
- package/dist/mcp-server.d.ts +13 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +220 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-tools/coverage-gaps.d.ts +13 -0
- package/dist/mcp-tools/coverage-gaps.d.ts.map +1 -0
- package/dist/mcp-tools/coverage-gaps.js +55 -0
- package/dist/mcp-tools/coverage-gaps.js.map +1 -0
- package/dist/mcp-tools/list-rules.d.ts +17 -0
- package/dist/mcp-tools/list-rules.d.ts.map +1 -0
- package/dist/mcp-tools/list-rules.js +45 -0
- package/dist/mcp-tools/list-rules.js.map +1 -0
- package/dist/mcp-tools/scan.d.ts +24 -0
- package/dist/mcp-tools/scan.d.ts.map +1 -0
- package/dist/mcp-tools/scan.js +87 -0
- package/dist/mcp-tools/scan.js.map +1 -0
- package/dist/mcp-tools/submit-proposal.d.ts +12 -0
- package/dist/mcp-tools/submit-proposal.d.ts.map +1 -0
- package/dist/mcp-tools/submit-proposal.js +95 -0
- package/dist/mcp-tools/submit-proposal.js.map +1 -0
- package/dist/mcp-tools/threat-summary.d.ts +12 -0
- package/dist/mcp-tools/threat-summary.d.ts.map +1 -0
- package/dist/mcp-tools/threat-summary.js +74 -0
- package/dist/mcp-tools/threat-summary.js.map +1 -0
- package/dist/mcp-tools/validate.d.ts +15 -0
- package/dist/mcp-tools/validate.d.ts.map +1 -0
- package/dist/mcp-tools/validate.js +45 -0
- package/dist/mcp-tools/validate.js.map +1 -0
- package/dist/modules/index.d.ts +5 -4
- package/dist/modules/index.d.ts.map +1 -1
- package/dist/modules/index.js +6 -4
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/semantic.d.ts +105 -0
- package/dist/modules/semantic.d.ts.map +1 -0
- package/dist/modules/semantic.js +283 -0
- package/dist/modules/semantic.js.map +1 -0
- package/dist/rule-scaffolder.d.ts +39 -0
- package/dist/rule-scaffolder.d.ts.map +1 -0
- package/dist/rule-scaffolder.js +184 -0
- package/dist/rule-scaffolder.js.map +1 -0
- package/dist/skill-fingerprint.d.ts +85 -0
- package/dist/skill-fingerprint.d.ts.map +1 -0
- package/dist/skill-fingerprint.js +326 -0
- package/dist/skill-fingerprint.js.map +1 -0
- package/dist/types.d.ts +59 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/verdict.d.ts +26 -0
- package/dist/verdict.d.ts.map +1 -0
- package/dist/verdict.js +127 -0
- package/dist/verdict.js.map +1 -0
- package/package.json +6 -1
- package/rules/agent-manipulation/ATR-2026-030-cross-agent-attack.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-032-goal-hijacking.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-074-cross-agent-privilege-escalation.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-076-inter-agent-message-spoofing.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-077-human-trust-exploitation.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-020-system-prompt-leak.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-021-api-key-exposure.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-075-agent-memory-manipulation.yaml +1 -1
- package/rules/data-poisoning/ATR-2026-070-data-poisoning.yaml +1 -1
- package/rules/excessive-autonomy/ATR-2026-050-runaway-agent-loop.yaml +1 -1
- package/rules/excessive-autonomy/ATR-2026-051-resource-exhaustion.yaml +1 -1
- package/rules/excessive-autonomy/ATR-2026-052-cascading-failure.yaml +1 -1
- package/rules/model-security/ATR-2026-072-model-behavior-extraction.yaml +1 -1
- package/rules/model-security/ATR-2026-073-malicious-finetuning-data.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-040-privilege-escalation.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-041-scope-creep.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-001-direct-prompt-injection.yaml +3 -3
- package/rules/prompt-injection/ATR-2026-002-indirect-prompt-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-003-jailbreak-attempt.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-004-system-prompt-override.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-005-multi-turn-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-080-encoding-evasion.yaml +80 -0
- package/rules/prompt-injection/ATR-2026-081-semantic-multi-turn.yaml +77 -0
- package/rules/prompt-injection/ATR-2026-082-fingerprint-evasion.yaml +76 -0
- package/rules/prompt-injection/ATR-2026-083-indirect-tool-injection.yaml +76 -0
- package/rules/prompt-injection/ATR-2026-084-structured-data-injection.yaml +78 -0
- package/rules/prompt-injection/ATR-2026-085-audit-evasion.yaml +76 -0
- package/rules/prompt-injection/ATR-2026-086-visual-spoofing.yaml +80 -0
- package/rules/prompt-injection/ATR-2026-087-rule-probing.yaml +74 -0
- package/rules/prompt-injection/ATR-2026-088-adaptive-countermeasure.yaml +76 -0
- package/rules/prompt-injection/ATR-2026-089-polymorphic-skill.yaml +77 -0
- package/rules/prompt-injection/ATR-2026-090-threat-intel-exfil.yaml +76 -0
- package/rules/prompt-injection/ATR-2026-091-nested-payload.yaml +80 -0
- package/rules/prompt-injection/ATR-2026-092-consensus-poisoning.yaml +84 -0
- package/rules/prompt-injection/ATR-2026-093-gradual-escalation.yaml +78 -0
- package/rules/prompt-injection/ATR-2026-094-audit-bypass.yaml +78 -0
- package/rules/skill-compromise/ATR-2026-060-skill-impersonation.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-010-mcp-malicious-response.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-011-tool-output-injection.yaml +3 -3
- package/rules/tool-poisoning/ATR-2026-012-unauthorized-tool-call.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-013-tool-ssrf.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-095-supply-chain-poisoning.yaml +82 -0
- package/rules/tool-poisoning/ATR-2026-096-registry-poisoning.yaml +84 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer Integration Helpers
|
|
3
|
+
*
|
|
4
|
+
* Bridges the ATREngine (Layer 1 regex) with:
|
|
5
|
+
* - SkillFingerprintStore (Layer 2 behavioral fingerprinting)
|
|
6
|
+
* - SemanticModule (Layer 3 LLM-as-judge)
|
|
7
|
+
*
|
|
8
|
+
* Extracted from engine.ts to keep file sizes manageable.
|
|
9
|
+
*
|
|
10
|
+
* @module agent-threat-rules/layer-integration
|
|
11
|
+
*/
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Layer 2: Skill Fingerprinting
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/** Severity mapping for anomaly types */
|
|
16
|
+
const ANOMALY_SEVERITY_MAP = {
|
|
17
|
+
critical: 'critical',
|
|
18
|
+
high: 'high',
|
|
19
|
+
medium: 'medium',
|
|
20
|
+
low: 'low',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the skill identifier from an agent event.
|
|
24
|
+
* Returns undefined if no skill identifier is present.
|
|
25
|
+
*/
|
|
26
|
+
export function resolveSkillId(event) {
|
|
27
|
+
const fromMetadata = event.metadata?.['skill_id'];
|
|
28
|
+
if (typeof fromMetadata === 'string' && fromMetadata.length > 0) {
|
|
29
|
+
return fromMetadata;
|
|
30
|
+
}
|
|
31
|
+
const fromFields = event.fields?.['tool_name'];
|
|
32
|
+
if (typeof fromFields === 'string' && fromFields.length > 0) {
|
|
33
|
+
return fromFields;
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a synthetic ATRRule for a behavioral anomaly detected by Layer 2.
|
|
39
|
+
* These rules are not loaded from YAML -- they are generated at runtime.
|
|
40
|
+
*/
|
|
41
|
+
function buildAnomalyRule(anomaly) {
|
|
42
|
+
return {
|
|
43
|
+
title: `Skill Behavior Drift: ${anomaly.anomalyType}`,
|
|
44
|
+
id: `layer2-fingerprint-${anomaly.anomalyType}-${anomaly.skillName}`,
|
|
45
|
+
status: 'experimental',
|
|
46
|
+
description: anomaly.description,
|
|
47
|
+
author: 'atr-engine/layer2',
|
|
48
|
+
date: new Date(anomaly.timestamp).toISOString().slice(0, 10),
|
|
49
|
+
severity: ANOMALY_SEVERITY_MAP[anomaly.severity] ?? 'medium',
|
|
50
|
+
tags: {
|
|
51
|
+
category: 'skill-compromise',
|
|
52
|
+
subcategory: 'behavioral-drift',
|
|
53
|
+
confidence: anomaly.severity === 'critical' ? 'high' : 'medium',
|
|
54
|
+
},
|
|
55
|
+
agent_source: { type: 'skill_lifecycle' },
|
|
56
|
+
detection: {
|
|
57
|
+
conditions: [],
|
|
58
|
+
condition: 'layer2-runtime',
|
|
59
|
+
},
|
|
60
|
+
response: {
|
|
61
|
+
actions: anomaly.severity === 'critical' ? ['alert', 'block_tool'] : ['alert'],
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Run Layer 2 fingerprint analysis on an event.
|
|
67
|
+
* Returns additional ATRMatch entries for any detected anomalies.
|
|
68
|
+
*/
|
|
69
|
+
export function runFingerprintLayer(store, event, skillId) {
|
|
70
|
+
const anomalies = store.recordInvocation(skillId, event);
|
|
71
|
+
if (anomalies.length === 0) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
const matches = [];
|
|
75
|
+
for (const anomaly of anomalies) {
|
|
76
|
+
const rule = buildAnomalyRule(anomaly);
|
|
77
|
+
const confidence = anomaly.severity === 'critical'
|
|
78
|
+
? 0.95
|
|
79
|
+
: anomaly.severity === 'high'
|
|
80
|
+
? 0.85
|
|
81
|
+
: 0.7;
|
|
82
|
+
matches.push({
|
|
83
|
+
rule,
|
|
84
|
+
matchedConditions: [anomaly.anomalyType],
|
|
85
|
+
matchedPatterns: [anomaly.newValue],
|
|
86
|
+
confidence,
|
|
87
|
+
timestamp: new Date(anomaly.timestamp).toISOString(),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return matches;
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Layer 3: Semantic Analysis
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
/** Minimum severity rank that triggers Layer 3 analysis */
|
|
96
|
+
const SEMANTIC_TRIGGER_SEVERITIES = new Set([
|
|
97
|
+
'medium',
|
|
98
|
+
'high',
|
|
99
|
+
'critical',
|
|
100
|
+
]);
|
|
101
|
+
/**
|
|
102
|
+
* Determine whether Layer 3 semantic analysis should run.
|
|
103
|
+
*
|
|
104
|
+
* Triggers when:
|
|
105
|
+
* - Any Layer 1/2 match has medium or higher severity
|
|
106
|
+
* - The event explicitly requests deep analysis via metadata
|
|
107
|
+
*/
|
|
108
|
+
export function shouldRunSemanticLayer(layer1Matches, event) {
|
|
109
|
+
// Explicit opt-in via metadata
|
|
110
|
+
if (event.metadata?.['force_semantic'] === true) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
// Check if any existing matches have medium+ severity
|
|
114
|
+
for (const match of layer1Matches) {
|
|
115
|
+
if (SEMANTIC_TRIGGER_SEVERITIES.has(match.rule.severity)) {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create a SemanticModule instance from simplified config.
|
|
123
|
+
* Returns undefined if the semantic module cannot be imported.
|
|
124
|
+
*/
|
|
125
|
+
export function createSemanticModuleFromConfig(config) {
|
|
126
|
+
return {
|
|
127
|
+
apiUrl: config.baseUrl ?? 'https://api.openai.com',
|
|
128
|
+
apiKey: config.apiKey,
|
|
129
|
+
model: config.model ?? 'gpt-4o-mini',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Run Layer 3 semantic analysis and return upgraded/new matches.
|
|
134
|
+
*
|
|
135
|
+
* The semantic module is called with `analyze_threat` to get a threat score.
|
|
136
|
+
* If the score is >= 0.7, a synthetic high-severity match is produced.
|
|
137
|
+
* If the score is 0.4-0.7, existing matches may have confidence boosted.
|
|
138
|
+
*/
|
|
139
|
+
export async function runSemanticLayer(semanticModule, event, existingMatches) {
|
|
140
|
+
const result = await semanticModule.evaluate(event, {
|
|
141
|
+
module: 'semantic',
|
|
142
|
+
function: 'analyze_threat',
|
|
143
|
+
args: { field: 'content' },
|
|
144
|
+
operator: 'gte',
|
|
145
|
+
threshold: 0.4,
|
|
146
|
+
});
|
|
147
|
+
if (!result.matched) {
|
|
148
|
+
return [];
|
|
149
|
+
}
|
|
150
|
+
const additionalMatches = [];
|
|
151
|
+
// High threat score: create a new synthetic match
|
|
152
|
+
if (result.value >= 0.7) {
|
|
153
|
+
const syntheticRule = {
|
|
154
|
+
title: 'Semantic Threat Detected (Layer 3)',
|
|
155
|
+
id: 'layer3-semantic-threat',
|
|
156
|
+
status: 'experimental',
|
|
157
|
+
description: result.description,
|
|
158
|
+
author: 'atr-engine/layer3',
|
|
159
|
+
date: new Date().toISOString().slice(0, 10),
|
|
160
|
+
severity: result.value >= 0.9 ? 'critical' : 'high',
|
|
161
|
+
tags: {
|
|
162
|
+
category: 'prompt-injection',
|
|
163
|
+
subcategory: 'semantic-detection',
|
|
164
|
+
confidence: 'high',
|
|
165
|
+
},
|
|
166
|
+
agent_source: { type: 'llm_io' },
|
|
167
|
+
detection: {
|
|
168
|
+
conditions: [],
|
|
169
|
+
condition: 'layer3-runtime',
|
|
170
|
+
},
|
|
171
|
+
response: {
|
|
172
|
+
actions: result.value >= 0.9 ? ['block_input', 'alert'] : ['alert'],
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
additionalMatches.push({
|
|
176
|
+
rule: syntheticRule,
|
|
177
|
+
matchedConditions: ['semantic_analysis'],
|
|
178
|
+
matchedPatterns: [`threat_score=${result.value.toFixed(2)}`],
|
|
179
|
+
confidence: result.value,
|
|
180
|
+
timestamp: new Date().toISOString(),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return additionalMatches;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=layer-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-integration.js","sourceRoot":"","sources":["../src/layer-integration.ts"],"names":[],"mappings":"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"}
|
package/dist/loader.js
CHANGED
|
@@ -32,8 +32,8 @@ export function loadRulesFromDirectory(dirPath) {
|
|
|
32
32
|
try {
|
|
33
33
|
rules.push(loadRuleFile(fullPath));
|
|
34
34
|
}
|
|
35
|
-
catch {
|
|
36
|
-
|
|
35
|
+
catch (err) {
|
|
36
|
+
console.warn(`[ATR] Failed to load rule file ${fullPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
}
|
package/dist/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAY,CAAC;IAE7C,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,kDAAkD,CAAC,CAAC;IACrG,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,KAAK,GAAc,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC;YACtF,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YACrC,CAAC;YAAC,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAY,CAAC;IAE7C,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,kDAAkD,CAAC,CAAC;IACrG,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,KAAK,GAAc,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC;YACtF,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,kCAAkC,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAa;IACxC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,CAAC,GAAG,IAA+B,CAAC;IAE1C,kBAAkB;IAClB,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACzI,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,YAAY;IACZ,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvE,CAAC;IAED,cAAc;IACd,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxE,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,gBAAgB;IAChB,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IAC/E,IAAI,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,gBAAgB;IAChB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAwC,CAAC;IAC9D,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,eAAe,GAAG;YACtB,kBAAkB,EAAE,gBAAgB,EAAE,sBAAsB;YAC5D,oBAAoB,EAAE,sBAAsB,EAAE,oBAAoB;YAClE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB;SACpD,CAAC;QACF,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACxF,MAAM,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,WAAW,GAAG,CAAC,CAAC,cAAc,CAAwC,CAAC;IAC7E,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG;YACjB,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB;YACvD,kBAAkB,EAAE,gBAAgB,EAAE,eAAe;YACrD,iBAAiB,EAAE,kBAAkB,EAAE,aAAa;SACrD,CAAC;QACF,IAAI,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,8BAA8B,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,CAAwC,CAAC;IACxE,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAwC,CAAC;IACtE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAwC,CAAC;IACzE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ATR MCP Server - Model Context Protocol server for Agent Threat Rules
|
|
4
|
+
*
|
|
5
|
+
* Exposes ATR functionality as MCP tools for AI agents and IDEs.
|
|
6
|
+
* Start with: atr mcp (stdio transport)
|
|
7
|
+
*
|
|
8
|
+
* @module agent-threat-rules/mcp-server
|
|
9
|
+
*/
|
|
10
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
11
|
+
export declare function createMCPServer(): Promise<Server>;
|
|
12
|
+
export declare function startMCPServer(): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAsKnE,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAoDvD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ATR MCP Server - Model Context Protocol server for Agent Threat Rules
|
|
4
|
+
*
|
|
5
|
+
* Exposes ATR functionality as MCP tools for AI agents and IDEs.
|
|
6
|
+
* Start with: atr mcp (stdio transport)
|
|
7
|
+
*
|
|
8
|
+
* @module agent-threat-rules/mcp-server
|
|
9
|
+
*/
|
|
10
|
+
import { resolve, dirname } from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
13
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
14
|
+
import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
15
|
+
import { ATREngine } from './engine.js';
|
|
16
|
+
import { handleScan } from './mcp-tools/scan.js';
|
|
17
|
+
import { handleListRules } from './mcp-tools/list-rules.js';
|
|
18
|
+
import { handleValidate } from './mcp-tools/validate.js';
|
|
19
|
+
import { handleSubmitProposal } from './mcp-tools/submit-proposal.js';
|
|
20
|
+
import { handleCoverageGaps } from './mcp-tools/coverage-gaps.js';
|
|
21
|
+
import { handleThreatSummary } from './mcp-tools/threat-summary.js';
|
|
22
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
23
|
+
const __dirname = dirname(__filename);
|
|
24
|
+
const RULES_DIR = resolve(__dirname, '..', 'rules');
|
|
25
|
+
const TOOLS = [
|
|
26
|
+
{
|
|
27
|
+
name: 'atr_scan',
|
|
28
|
+
description: 'Scan text content for AI agent security threats using ATR detection rules. Returns matched rules with severity, confidence, and recommended actions.',
|
|
29
|
+
inputSchema: {
|
|
30
|
+
type: 'object',
|
|
31
|
+
properties: {
|
|
32
|
+
content: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
description: 'The text content to scan for threats (prompt, tool response, agent output, etc.)',
|
|
35
|
+
},
|
|
36
|
+
event_type: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
enum: ['llm_input', 'llm_output', 'tool_call', 'tool_response', 'agent_behavior', 'multi_agent_message'],
|
|
39
|
+
description: 'Type of agent event being scanned. Defaults to "llm_input".',
|
|
40
|
+
},
|
|
41
|
+
min_severity: {
|
|
42
|
+
type: 'string',
|
|
43
|
+
enum: ['informational', 'low', 'medium', 'high', 'critical'],
|
|
44
|
+
description: 'Minimum severity level to include in results. Defaults to "informational".',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
required: ['content'],
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'atr_list_rules',
|
|
52
|
+
description: 'List and filter available ATR detection rules. Search by category, severity, or keyword.',
|
|
53
|
+
inputSchema: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: {
|
|
56
|
+
category: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
enum: [
|
|
59
|
+
'prompt-injection', 'tool-poisoning', 'context-exfiltration',
|
|
60
|
+
'agent-manipulation', 'privilege-escalation', 'excessive-autonomy',
|
|
61
|
+
'data-poisoning', 'model-abuse', 'skill-compromise',
|
|
62
|
+
],
|
|
63
|
+
description: 'Filter rules by threat category.',
|
|
64
|
+
},
|
|
65
|
+
severity: {
|
|
66
|
+
type: 'string',
|
|
67
|
+
enum: ['informational', 'low', 'medium', 'high', 'critical'],
|
|
68
|
+
description: 'Filter rules by severity level.',
|
|
69
|
+
},
|
|
70
|
+
search: {
|
|
71
|
+
type: 'string',
|
|
72
|
+
description: 'Search rules by keyword in title, description, or ID.',
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'atr_validate_rule',
|
|
79
|
+
description: 'Validate an ATR rule written in YAML format. Checks required fields, enum values, and structural correctness.',
|
|
80
|
+
inputSchema: {
|
|
81
|
+
type: 'object',
|
|
82
|
+
properties: {
|
|
83
|
+
yaml_content: {
|
|
84
|
+
type: 'string',
|
|
85
|
+
description: 'The ATR rule YAML content to validate.',
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
required: ['yaml_content'],
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'atr_submit_proposal',
|
|
93
|
+
description: 'Generate a draft ATR rule from a threat description. Produces YAML with detection patterns derived from example payloads.',
|
|
94
|
+
inputSchema: {
|
|
95
|
+
type: 'object',
|
|
96
|
+
properties: {
|
|
97
|
+
title: {
|
|
98
|
+
type: 'string',
|
|
99
|
+
description: 'Title for the new rule (e.g., "Multi-turn Context Hijacking").',
|
|
100
|
+
},
|
|
101
|
+
category: {
|
|
102
|
+
type: 'string',
|
|
103
|
+
enum: [
|
|
104
|
+
'prompt-injection', 'tool-poisoning', 'context-exfiltration',
|
|
105
|
+
'agent-manipulation', 'privilege-escalation', 'excessive-autonomy',
|
|
106
|
+
'data-poisoning', 'model-abuse', 'skill-compromise',
|
|
107
|
+
],
|
|
108
|
+
description: 'Threat category for the rule.',
|
|
109
|
+
},
|
|
110
|
+
attack_description: {
|
|
111
|
+
type: 'string',
|
|
112
|
+
description: 'Detailed description of the attack this rule detects.',
|
|
113
|
+
},
|
|
114
|
+
example_payloads: {
|
|
115
|
+
type: 'array',
|
|
116
|
+
items: { type: 'string' },
|
|
117
|
+
description: 'Example attack payloads to generate detection patterns from.',
|
|
118
|
+
},
|
|
119
|
+
severity: {
|
|
120
|
+
type: 'string',
|
|
121
|
+
enum: ['informational', 'low', 'medium', 'high', 'critical'],
|
|
122
|
+
description: 'Severity level. Defaults to "medium".',
|
|
123
|
+
},
|
|
124
|
+
mitre_refs: {
|
|
125
|
+
type: 'array',
|
|
126
|
+
items: { type: 'string' },
|
|
127
|
+
description: 'Optional MITRE ATLAS reference IDs (e.g., "AML.T0051").',
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
required: ['title', 'category', 'attack_description', 'example_payloads'],
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: 'atr_coverage_gaps',
|
|
135
|
+
description: 'Analyze ATR rule coverage against security frameworks (OWASP Agentic AI, MITRE ATLAS). Identifies uncovered threat categories.',
|
|
136
|
+
inputSchema: {
|
|
137
|
+
type: 'object',
|
|
138
|
+
properties: {
|
|
139
|
+
framework: {
|
|
140
|
+
type: 'string',
|
|
141
|
+
enum: ['owasp_agentic', 'mitre_atlas', 'all'],
|
|
142
|
+
description: 'Security framework to analyze against. Defaults to "all".',
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: 'atr_threat_summary',
|
|
149
|
+
description: 'Get aggregated statistics about loaded ATR rules. Shows distribution by category, severity, status, and test coverage.',
|
|
150
|
+
inputSchema: {
|
|
151
|
+
type: 'object',
|
|
152
|
+
properties: {
|
|
153
|
+
category: {
|
|
154
|
+
type: 'string',
|
|
155
|
+
enum: [
|
|
156
|
+
'prompt-injection', 'tool-poisoning', 'context-exfiltration',
|
|
157
|
+
'agent-manipulation', 'privilege-escalation', 'excessive-autonomy',
|
|
158
|
+
'data-poisoning', 'model-abuse', 'skill-compromise',
|
|
159
|
+
],
|
|
160
|
+
description: 'Optional: filter statistics to a single threat category.',
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
];
|
|
166
|
+
export async function createMCPServer() {
|
|
167
|
+
const engine = new ATREngine({ rulesDir: RULES_DIR });
|
|
168
|
+
const ruleCount = await engine.loadRules();
|
|
169
|
+
const server = new Server({
|
|
170
|
+
name: 'atr-mcp-server',
|
|
171
|
+
version: '0.2.0',
|
|
172
|
+
}, {
|
|
173
|
+
capabilities: {
|
|
174
|
+
tools: {},
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
178
|
+
tools: TOOLS,
|
|
179
|
+
}));
|
|
180
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
181
|
+
const { name, arguments: args } = request.params;
|
|
182
|
+
const toolArgs = (args ?? {});
|
|
183
|
+
switch (name) {
|
|
184
|
+
case 'atr_scan':
|
|
185
|
+
return await handleScan(engine, toolArgs);
|
|
186
|
+
case 'atr_list_rules':
|
|
187
|
+
return handleListRules(engine, toolArgs);
|
|
188
|
+
case 'atr_validate_rule':
|
|
189
|
+
return handleValidate(toolArgs);
|
|
190
|
+
case 'atr_submit_proposal':
|
|
191
|
+
return handleSubmitProposal(toolArgs);
|
|
192
|
+
case 'atr_coverage_gaps':
|
|
193
|
+
return handleCoverageGaps(engine, toolArgs);
|
|
194
|
+
case 'atr_threat_summary':
|
|
195
|
+
return handleThreatSummary(engine, toolArgs);
|
|
196
|
+
default:
|
|
197
|
+
return {
|
|
198
|
+
content: [{ type: 'text', text: `Error: Unknown tool "${name}".` }],
|
|
199
|
+
isError: true,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
return server;
|
|
204
|
+
}
|
|
205
|
+
export async function startMCPServer() {
|
|
206
|
+
const server = await createMCPServer();
|
|
207
|
+
const transport = new StdioServerTransport();
|
|
208
|
+
await server.connect(transport);
|
|
209
|
+
}
|
|
210
|
+
// Auto-start when run directly
|
|
211
|
+
const isDirectExecution = process.argv[1] &&
|
|
212
|
+
(process.argv[1].endsWith('mcp-server.js') ||
|
|
213
|
+
process.argv[1].endsWith('mcp-server.ts'));
|
|
214
|
+
if (isDirectExecution) {
|
|
215
|
+
startMCPServer().catch((err) => {
|
|
216
|
+
process.stderr.write(`ATR MCP Server error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
217
|
+
process.exit(1);
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* atr_coverage_gaps MCP tool - Analyze coverage gaps against security frameworks
|
|
3
|
+
* @module agent-threat-rules/mcp-tools/coverage-gaps
|
|
4
|
+
*/
|
|
5
|
+
import type { ATREngine } from '../engine.js';
|
|
6
|
+
export declare function handleCoverageGaps(engine: ATREngine, args: Record<string, unknown>): {
|
|
7
|
+
content: Array<{
|
|
8
|
+
type: string;
|
|
9
|
+
text: string;
|
|
10
|
+
}>;
|
|
11
|
+
isError?: boolean;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=coverage-gaps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-gaps.d.ts","sourceRoot":"","sources":["../../src/mcp-tools/coverage-gaps.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACpF,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAkDA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* atr_coverage_gaps MCP tool - Analyze coverage gaps against security frameworks
|
|
3
|
+
* @module agent-threat-rules/mcp-tools/coverage-gaps
|
|
4
|
+
*/
|
|
5
|
+
import { CoverageAnalyzer } from '../coverage-analyzer.js';
|
|
6
|
+
export function handleCoverageGaps(engine, args) {
|
|
7
|
+
const framework = (args['framework'] ?? 'all').toLowerCase();
|
|
8
|
+
const validFrameworks = ['owasp_agentic', 'mitre_atlas', 'all'];
|
|
9
|
+
if (!validFrameworks.includes(framework)) {
|
|
10
|
+
return {
|
|
11
|
+
content: [{ type: 'text', text: `Error: "framework" must be one of: ${validFrameworks.join(', ')}` }],
|
|
12
|
+
isError: true,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const analyzer = new CoverageAnalyzer(engine.getRules());
|
|
16
|
+
const report = analyzer.analyze();
|
|
17
|
+
// Filter gaps by requested framework
|
|
18
|
+
const filteredGaps = framework === 'all'
|
|
19
|
+
? report.gaps
|
|
20
|
+
: report.gaps.filter((g) => {
|
|
21
|
+
if (framework === 'owasp_agentic')
|
|
22
|
+
return g.framework === 'OWASP Agentic Top 10';
|
|
23
|
+
if (framework === 'mitre_atlas')
|
|
24
|
+
return g.framework === 'MITRE ATLAS';
|
|
25
|
+
return true;
|
|
26
|
+
});
|
|
27
|
+
const filteredSuggestions = framework === 'all'
|
|
28
|
+
? report.suggestions
|
|
29
|
+
: report.suggestions.filter((s) => {
|
|
30
|
+
if (framework === 'owasp_agentic')
|
|
31
|
+
return s.includes('OWASP') || s.includes('ASI');
|
|
32
|
+
if (framework === 'mitre_atlas')
|
|
33
|
+
return s.includes('MITRE') || s.includes('AML');
|
|
34
|
+
return true;
|
|
35
|
+
});
|
|
36
|
+
const result = {
|
|
37
|
+
analysis_timestamp: new Date().toISOString(),
|
|
38
|
+
total_rules_loaded: engine.getRuleCount(),
|
|
39
|
+
total_active_rules: report.totalRules,
|
|
40
|
+
framework_filter: framework,
|
|
41
|
+
gaps: filteredGaps.map((g) => ({
|
|
42
|
+
framework: g.framework,
|
|
43
|
+
risk_id: g.riskId,
|
|
44
|
+
risk_name: g.riskName,
|
|
45
|
+
current_rule_count: g.currentRuleCount,
|
|
46
|
+
recommended_min: g.recommendedMin,
|
|
47
|
+
})),
|
|
48
|
+
category_distribution: report.categoryDistribution,
|
|
49
|
+
suggestions: filteredSuggestions,
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=coverage-gaps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-gaps.js","sourceRoot":"","sources":["../../src/mcp-tools/coverage-gaps.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAI3D,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,IAA6B;IAIjF,MAAM,SAAS,GAAG,CAAE,IAAI,CAAC,WAAW,CAAY,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAEzE,MAAM,eAAe,GAAG,CAAC,eAAe,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IAChE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sCAAsC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACrG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAmB,QAAQ,CAAC,OAAO,EAAE,CAAC;IAElD,qCAAqC;IACrC,MAAM,YAAY,GAAG,SAAS,KAAK,KAAK;QACtC,CAAC,CAAC,MAAM,CAAC,IAAI;QACb,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACvB,IAAI,SAAS,KAAK,eAAe;gBAAE,OAAO,CAAC,CAAC,SAAS,KAAK,sBAAsB,CAAC;YACjF,IAAI,SAAS,KAAK,aAAa;gBAAE,OAAO,CAAC,CAAC,SAAS,KAAK,aAAa,CAAC;YACtE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IAEP,MAAM,mBAAmB,GAAG,SAAS,KAAK,KAAK;QAC7C,CAAC,CAAC,MAAM,CAAC,WAAW;QACpB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9B,IAAI,SAAS,KAAK,eAAe;gBAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACnF,IAAI,SAAS,KAAK,aAAa;gBAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG;QACb,kBAAkB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5C,kBAAkB,EAAE,MAAM,CAAC,YAAY,EAAE;QACzC,kBAAkB,EAAE,MAAM,CAAC,UAAU;QACrC,gBAAgB,EAAE,SAAS;QAC3B,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,OAAO,EAAE,CAAC,CAAC,MAAM;YACjB,SAAS,EAAE,CAAC,CAAC,QAAQ;YACrB,kBAAkB,EAAE,CAAC,CAAC,gBAAgB;YACtC,eAAe,EAAE,CAAC,CAAC,cAAc;SAClC,CAAC,CAAC;QACH,qBAAqB,EAAE,MAAM,CAAC,oBAAoB;QAClD,WAAW,EAAE,mBAAmB;KACjC,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* atr_list_rules MCP tool - List and filter ATR rules
|
|
3
|
+
* @module agent-threat-rules/mcp-tools/list-rules
|
|
4
|
+
*/
|
|
5
|
+
import type { ATREngine } from '../engine.js';
|
|
6
|
+
export interface ListRulesInput {
|
|
7
|
+
category?: string;
|
|
8
|
+
severity?: string;
|
|
9
|
+
search?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function handleListRules(engine: ATREngine, args: Record<string, unknown>): {
|
|
12
|
+
content: Array<{
|
|
13
|
+
type: string;
|
|
14
|
+
text: string;
|
|
15
|
+
}>;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=list-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-rules.d.ts","sourceRoot":"","sources":["../../src/mcp-tools/list-rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACjF,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD,CAgDA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* atr_list_rules MCP tool - List and filter ATR rules
|
|
3
|
+
* @module agent-threat-rules/mcp-tools/list-rules
|
|
4
|
+
*/
|
|
5
|
+
export function handleListRules(engine, args) {
|
|
6
|
+
const category = args['category'];
|
|
7
|
+
const severity = args['severity'];
|
|
8
|
+
const search = args['search'];
|
|
9
|
+
let rules = [...engine.getRules()];
|
|
10
|
+
if (category) {
|
|
11
|
+
rules = rules.filter((r) => r.tags.category === category);
|
|
12
|
+
}
|
|
13
|
+
if (severity) {
|
|
14
|
+
rules = rules.filter((r) => r.severity === severity.toLowerCase());
|
|
15
|
+
}
|
|
16
|
+
if (search) {
|
|
17
|
+
const term = search.toLowerCase();
|
|
18
|
+
rules = rules.filter((r) => r.title.toLowerCase().includes(term) ||
|
|
19
|
+
r.description.toLowerCase().includes(term) ||
|
|
20
|
+
r.id.toLowerCase().includes(term) ||
|
|
21
|
+
r.tags.category.toLowerCase().includes(term));
|
|
22
|
+
}
|
|
23
|
+
const result = {
|
|
24
|
+
total: rules.length,
|
|
25
|
+
filters_applied: {
|
|
26
|
+
...(category ? { category } : {}),
|
|
27
|
+
...(severity ? { severity } : {}),
|
|
28
|
+
...(search ? { search } : {}),
|
|
29
|
+
},
|
|
30
|
+
rules: rules.map((r) => ({
|
|
31
|
+
id: r.id,
|
|
32
|
+
title: r.title,
|
|
33
|
+
severity: r.severity,
|
|
34
|
+
status: r.status,
|
|
35
|
+
category: r.tags.category,
|
|
36
|
+
source_type: r.agent_source.type,
|
|
37
|
+
description: r.description,
|
|
38
|
+
actions: r.response.actions,
|
|
39
|
+
})),
|
|
40
|
+
};
|
|
41
|
+
return {
|
|
42
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=list-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-rules.js","sourceRoot":"","sources":["../../src/mcp-tools/list-rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,IAA6B;IAG9E,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAuB,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAuB,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAuB,CAAC;IAEpD,IAAI,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEnC,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAClC,KAAK,GAAG,KAAK,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YACpC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC1C,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAC/C,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,eAAe,EAAE;YACf,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B;QACD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ;YACzB,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI;YAChC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO;SAC5B,CAAC,CAAC;KACJ,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC"}
|