@bryan-thompson/inspector-assessment 1.36.5 → 1.38.0
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/cli/build/lib/assessment-runner/assessment-executor.js +40 -0
- package/cli/build/lib/assessment-runner/source-loader.js +11 -0
- package/cli/package.json +1 -1
- package/client/dist/assets/{OAuthCallback-DJ1av7om.js → OAuthCallback-AngeBaCl.js} +1 -1
- package/client/dist/assets/{OAuthDebugCallback-lRXgX7wV.js → OAuthDebugCallback--FE6_fPs.js} +1 -1
- package/client/dist/assets/{index-DEdS99fp.js → index-BQC95Boo.js} +4 -4
- package/client/dist/index.html +1 -1
- package/client/lib/lib/assessment/coreTypes.d.ts +37 -0
- package/client/lib/lib/assessment/coreTypes.d.ts.map +1 -1
- package/client/lib/lib/assessment/resultTypes.d.ts +30 -1
- package/client/lib/lib/assessment/resultTypes.d.ts.map +1 -1
- package/client/lib/lib/assessment/sharedSchemas.d.ts +10 -0
- package/client/lib/lib/assessment/sharedSchemas.d.ts.map +1 -1
- package/client/lib/lib/assessment/sharedSchemas.js +4 -0
- package/client/lib/lib/securityPatterns/advancedExploitPatterns.d.ts +13 -0
- package/client/lib/lib/securityPatterns/advancedExploitPatterns.d.ts.map +1 -0
- package/client/lib/lib/securityPatterns/advancedExploitPatterns.js +504 -0
- package/client/lib/lib/securityPatterns/authSessionPatterns.d.ts +12 -0
- package/client/lib/lib/securityPatterns/authSessionPatterns.d.ts.map +1 -0
- package/client/lib/lib/securityPatterns/authSessionPatterns.js +357 -0
- package/client/lib/lib/securityPatterns/index.d.ts +18 -0
- package/client/lib/lib/securityPatterns/index.d.ts.map +1 -0
- package/client/lib/lib/securityPatterns/index.js +18 -0
- package/client/lib/lib/securityPatterns/injectionPatterns.d.ts +13 -0
- package/client/lib/lib/securityPatterns/injectionPatterns.d.ts.map +1 -0
- package/client/lib/lib/securityPatterns/injectionPatterns.js +356 -0
- package/client/lib/lib/securityPatterns/resourceExhaustionPatterns.d.ts +12 -0
- package/client/lib/lib/securityPatterns/resourceExhaustionPatterns.d.ts.map +1 -0
- package/client/lib/lib/securityPatterns/resourceExhaustionPatterns.js +215 -0
- package/client/lib/lib/securityPatterns/toolSpecificPatterns.d.ts +13 -0
- package/client/lib/lib/securityPatterns/toolSpecificPatterns.d.ts.map +1 -0
- package/client/lib/lib/securityPatterns/toolSpecificPatterns.js +373 -0
- package/client/lib/lib/securityPatterns/types.d.ts +20 -0
- package/client/lib/lib/securityPatterns/types.d.ts.map +1 -0
- package/client/lib/lib/securityPatterns/types.js +6 -0
- package/client/lib/lib/securityPatterns/utils.d.ts +56 -0
- package/client/lib/lib/securityPatterns/utils.d.ts.map +1 -0
- package/client/lib/lib/securityPatterns/utils.js +96 -0
- package/client/lib/lib/securityPatterns/validationPatterns.d.ts +13 -0
- package/client/lib/lib/securityPatterns/validationPatterns.d.ts.map +1 -0
- package/client/lib/lib/securityPatterns/validationPatterns.js +110 -0
- package/client/lib/lib/securityPatterns.d.ts +18 -69
- package/client/lib/lib/securityPatterns.d.ts.map +1 -1
- package/client/lib/lib/securityPatterns.js +18 -1946
- package/client/lib/services/assessment/AssessmentOrchestrator.d.ts +6 -1
- package/client/lib/services/assessment/AssessmentOrchestrator.d.ts.map +1 -1
- package/client/lib/services/assessment/config/performanceConfig.d.ts +18 -0
- package/client/lib/services/assessment/config/performanceConfig.d.ts.map +1 -1
- package/client/lib/services/assessment/config/performanceConfig.js +6 -0
- package/client/lib/services/assessment/config/performanceConfigSchemas.d.ts +18 -0
- package/client/lib/services/assessment/config/performanceConfigSchemas.d.ts.map +1 -1
- package/client/lib/services/assessment/config/performanceConfigSchemas.js +20 -0
- package/client/lib/services/assessment/helpers/ExternalAPIDependencyDetector.d.ts +165 -0
- package/client/lib/services/assessment/helpers/ExternalAPIDependencyDetector.d.ts.map +1 -0
- package/client/lib/services/assessment/helpers/ExternalAPIDependencyDetector.js +317 -0
- package/client/lib/services/assessment/helpers/StdioTransportDetector.d.ts +137 -0
- package/client/lib/services/assessment/helpers/StdioTransportDetector.d.ts.map +1 -0
- package/client/lib/services/assessment/helpers/StdioTransportDetector.js +315 -0
- package/client/lib/services/assessment/helpers/ToolAnnotationExtractor.d.ts +34 -0
- package/client/lib/services/assessment/helpers/ToolAnnotationExtractor.d.ts.map +1 -0
- package/client/lib/services/assessment/helpers/ToolAnnotationExtractor.js +85 -0
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.d.ts +23 -0
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.js +255 -20
- package/client/lib/services/assessment/modules/FunctionalityAssessor.d.ts +10 -0
- package/client/lib/services/assessment/modules/FunctionalityAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/FunctionalityAssessor.js +65 -3
- package/client/lib/services/assessment/modules/ProtocolComplianceAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/ProtocolComplianceAssessor.js +30 -0
- package/client/lib/services/assessment/modules/SecurityAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/SecurityAssessor.js +6 -0
- package/client/lib/services/assessment/modules/TemporalAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/TemporalAssessor.js +16 -3
- package/client/lib/services/assessment/modules/annotations/AlignmentChecker.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/annotations/AlignmentChecker.js +6 -2
- package/client/lib/services/assessment/modules/annotations/DescriptionPoisoningDetector.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/annotations/DescriptionPoisoningDetector.js +16 -7
- package/client/lib/services/assessment/modules/securityTests/AnnotationAwareSeverity.d.ts +55 -0
- package/client/lib/services/assessment/modules/securityTests/AnnotationAwareSeverity.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/securityTests/AnnotationAwareSeverity.js +135 -0
- package/client/lib/services/assessment/modules/securityTests/ErrorClassifier.d.ts +14 -0
- package/client/lib/services/assessment/modules/securityTests/ErrorClassifier.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/ErrorClassifier.js +24 -1
- package/client/lib/services/assessment/modules/securityTests/SafeResponseDetector.d.ts +6 -0
- package/client/lib/services/assessment/modules/securityTests/SafeResponseDetector.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/SafeResponseDetector.js +9 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.d.ts +43 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.js +87 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityPayloadTester.d.ts +39 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityPayloadTester.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityPayloadTester.js +93 -3
- package/client/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.d.ts +1 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.js +10 -1
- package/client/lib/services/assessment/modules/securityTests/index.d.ts +1 -0
- package/client/lib/services/assessment/modules/securityTests/index.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/index.js +1 -0
- package/client/lib/services/assessment/modules/temporal/VarianceClassifier.d.ts +16 -1
- package/client/lib/services/assessment/modules/temporal/VarianceClassifier.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/temporal/VarianceClassifier.js +43 -1
- package/client/package.json +1 -1
- package/package.json +1 -1
- package/server/package.json +1 -1
|
@@ -5,9 +5,11 @@
|
|
|
5
5
|
* @public
|
|
6
6
|
* @module AssessmentOrchestrator
|
|
7
7
|
*/
|
|
8
|
-
import { MCPDirectoryAssessment, AssessmentConfiguration, ManifestJsonSchema, ProgressCallback, ServerInfo, PackageJson } from "../../lib/assessmentTypes.js";
|
|
8
|
+
import { MCPDirectoryAssessment, AssessmentConfiguration, ManifestJsonSchema, ProgressCallback, ServerInfo, PackageJson, ToolAnnotationsContext } from "../../lib/assessmentTypes.js";
|
|
9
9
|
import { Tool, CompatibilityCallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
10
10
|
import { ClaudeCodeBridge, ClaudeCodeBridgeConfig } from "./lib/claudeCodeBridge.js";
|
|
11
|
+
import { ExternalAPIDependencyInfo } from "./helpers/ExternalAPIDependencyDetector.js";
|
|
12
|
+
import { TransportDetectionResult } from "./helpers/StdioTransportDetector.js";
|
|
11
13
|
/**
|
|
12
14
|
* MCP Resource interface for assessment context
|
|
13
15
|
* @public
|
|
@@ -96,6 +98,9 @@ export interface AssessmentContext {
|
|
|
96
98
|
oauthEnabled?: boolean;
|
|
97
99
|
};
|
|
98
100
|
listTools?: () => Promise<Tool[]>;
|
|
101
|
+
externalAPIDependencies?: ExternalAPIDependencyInfo;
|
|
102
|
+
transportDetection?: TransportDetectionResult;
|
|
103
|
+
toolAnnotationsContext?: ToolAnnotationsContext;
|
|
99
104
|
}
|
|
100
105
|
/**
|
|
101
106
|
* Main orchestrator class for running MCP server assessments
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssessmentOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/services/assessment/AssessmentOrchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EAEvB,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACV,WAAW,
|
|
1
|
+
{"version":3,"file":"AssessmentOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/services/assessment/AssessmentOrchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,6 +63,20 @@ export interface PerformanceConfig {
|
|
|
63
63
|
* @default 50
|
|
64
64
|
*/
|
|
65
65
|
eventEmitterMaxListeners: number;
|
|
66
|
+
/**
|
|
67
|
+
* Maximum retry attempts for transient errors in security tests.
|
|
68
|
+
* Payload-level retry with exponential backoff for connection errors.
|
|
69
|
+
* @default 2
|
|
70
|
+
* @see https://github.com/triepod-ai/inspector-assessment/issues/157
|
|
71
|
+
*/
|
|
72
|
+
securityRetryMaxAttempts: number;
|
|
73
|
+
/**
|
|
74
|
+
* Initial backoff delay in milliseconds for security test retries.
|
|
75
|
+
* Uses exponential backoff: delay * 2^attempt (100ms → 200ms → 400ms)
|
|
76
|
+
* @default 100
|
|
77
|
+
* @see https://github.com/triepod-ai/inspector-assessment/issues/157
|
|
78
|
+
*/
|
|
79
|
+
securityRetryBackoffMs: number;
|
|
66
80
|
}
|
|
67
81
|
/**
|
|
68
82
|
* Default performance configuration.
|
|
@@ -86,6 +100,8 @@ export declare const PERFORMANCE_PRESETS: {
|
|
|
86
100
|
securityTestTimeoutMs: number;
|
|
87
101
|
queueWarningThreshold: number;
|
|
88
102
|
eventEmitterMaxListeners: number;
|
|
103
|
+
securityRetryMaxAttempts: number;
|
|
104
|
+
securityRetryBackoffMs: number;
|
|
89
105
|
}>;
|
|
90
106
|
/** Conservative settings for resource-constrained environments */
|
|
91
107
|
readonly resourceConstrained: Readonly<{
|
|
@@ -96,6 +112,8 @@ export declare const PERFORMANCE_PRESETS: {
|
|
|
96
112
|
testTimeoutMs: number;
|
|
97
113
|
securityTestTimeoutMs: number;
|
|
98
114
|
eventEmitterMaxListeners: number;
|
|
115
|
+
securityRetryMaxAttempts: number;
|
|
116
|
+
securityRetryBackoffMs: number;
|
|
99
117
|
}>;
|
|
100
118
|
};
|
|
101
119
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performanceConfig.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/config/performanceConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAE9B;;;;;;;;;;OAUG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAE9B;;;;OAIG;IACH,wBAAwB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"performanceConfig.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/config/performanceConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAE9B;;;;;;;;;;OAUG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAE9B;;;;OAIG;IACH,wBAAwB,EAAE,MAAM,CAAC;IAEjC;;;;;OAKG;IACH,wBAAwB,EAAE,MAAM,CAAC;IAEjC;;;;;OAKG;IACH,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAWzE,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,mBAAmB;IAC9B,mDAAmD;;IAGnD,8CAA8C;;;;8BA5FxB,MAAM;uBAoBb,MAAM;+BAOE,MAAM;+BAaN,MAAM;kCAOH,MAAM;kCAQN,MAAM;gCAQR,MAAM;;IAoC9B,kEAAkE;;;;;8BAnG5C,MAAM;uBAoBb,MAAM;+BAOE,MAAM;kCAoBH,MAAM;kCAQN,MAAM;gCAQR,MAAM;;CA2CtB,CAAC;AAEX;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACjC,MAAM,EAAE,CAGV;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAClC,QAAQ,CAAC,iBAAiB,CAAC,CA4B7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,QAAQ,CAAC,iBAAiB,CAAC,CAyC7B"}
|
|
@@ -24,6 +24,8 @@ export const DEFAULT_PERFORMANCE_CONFIG = Object.freeze({
|
|
|
24
24
|
securityTestTimeoutMs: 5000,
|
|
25
25
|
queueWarningThreshold: 10000,
|
|
26
26
|
eventEmitterMaxListeners: 50,
|
|
27
|
+
securityRetryMaxAttempts: 2,
|
|
28
|
+
securityRetryBackoffMs: 100,
|
|
27
29
|
});
|
|
28
30
|
/**
|
|
29
31
|
* Performance presets for common use cases.
|
|
@@ -82,6 +84,10 @@ export function mergeWithDefaults(partial) {
|
|
|
82
84
|
DEFAULT_PERFORMANCE_CONFIG.queueWarningThreshold,
|
|
83
85
|
eventEmitterMaxListeners: partial.eventEmitterMaxListeners ??
|
|
84
86
|
DEFAULT_PERFORMANCE_CONFIG.eventEmitterMaxListeners,
|
|
87
|
+
securityRetryMaxAttempts: partial.securityRetryMaxAttempts ??
|
|
88
|
+
DEFAULT_PERFORMANCE_CONFIG.securityRetryMaxAttempts,
|
|
89
|
+
securityRetryBackoffMs: partial.securityRetryBackoffMs ??
|
|
90
|
+
DEFAULT_PERFORMANCE_CONFIG.securityRetryBackoffMs,
|
|
85
91
|
};
|
|
86
92
|
}
|
|
87
93
|
/**
|
|
@@ -46,6 +46,16 @@ export declare const PerformanceConfigSchema: z.ZodObject<{
|
|
|
46
46
|
* Maximum EventEmitter listeners to prevent Node.js warnings.
|
|
47
47
|
*/
|
|
48
48
|
eventEmitterMaxListeners: z.ZodOptional<z.ZodNumber>;
|
|
49
|
+
/**
|
|
50
|
+
* Maximum retry attempts for transient errors in security tests.
|
|
51
|
+
* Issue #157: Connection retry logic for reliability
|
|
52
|
+
*/
|
|
53
|
+
securityRetryMaxAttempts: z.ZodOptional<z.ZodNumber>;
|
|
54
|
+
/**
|
|
55
|
+
* Initial backoff delay in milliseconds for security test retries.
|
|
56
|
+
* Issue #157: Connection retry logic for reliability
|
|
57
|
+
*/
|
|
58
|
+
securityRetryBackoffMs: z.ZodOptional<z.ZodNumber>;
|
|
49
59
|
}, "strip", z.ZodTypeAny, {
|
|
50
60
|
batchFlushIntervalMs?: number;
|
|
51
61
|
functionalityBatchSize?: number;
|
|
@@ -54,6 +64,8 @@ export declare const PerformanceConfigSchema: z.ZodObject<{
|
|
|
54
64
|
securityTestTimeoutMs?: number;
|
|
55
65
|
queueWarningThreshold?: number;
|
|
56
66
|
eventEmitterMaxListeners?: number;
|
|
67
|
+
securityRetryMaxAttempts?: number;
|
|
68
|
+
securityRetryBackoffMs?: number;
|
|
57
69
|
}, {
|
|
58
70
|
batchFlushIntervalMs?: number;
|
|
59
71
|
functionalityBatchSize?: number;
|
|
@@ -62,6 +74,8 @@ export declare const PerformanceConfigSchema: z.ZodObject<{
|
|
|
62
74
|
securityTestTimeoutMs?: number;
|
|
63
75
|
queueWarningThreshold?: number;
|
|
64
76
|
eventEmitterMaxListeners?: number;
|
|
77
|
+
securityRetryMaxAttempts?: number;
|
|
78
|
+
securityRetryBackoffMs?: number;
|
|
65
79
|
}>;
|
|
66
80
|
/**
|
|
67
81
|
* Type inferred from the schema.
|
|
@@ -99,6 +113,8 @@ export declare function safeParsePerformanceConfig(config: unknown): z.SafeParse
|
|
|
99
113
|
securityTestTimeoutMs?: number;
|
|
100
114
|
queueWarningThreshold?: number;
|
|
101
115
|
eventEmitterMaxListeners?: number;
|
|
116
|
+
securityRetryMaxAttempts?: number;
|
|
117
|
+
securityRetryBackoffMs?: number;
|
|
102
118
|
}, {
|
|
103
119
|
batchFlushIntervalMs?: number;
|
|
104
120
|
functionalityBatchSize?: number;
|
|
@@ -107,5 +123,7 @@ export declare function safeParsePerformanceConfig(config: unknown): z.SafeParse
|
|
|
107
123
|
securityTestTimeoutMs?: number;
|
|
108
124
|
queueWarningThreshold?: number;
|
|
109
125
|
eventEmitterMaxListeners?: number;
|
|
126
|
+
securityRetryMaxAttempts?: number;
|
|
127
|
+
securityRetryBackoffMs?: number;
|
|
110
128
|
}>;
|
|
111
129
|
//# sourceMappingURL=performanceConfigSchemas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performanceConfigSchemas.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/config/performanceConfigSchemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;IAClC;;OAEG;;IAcH;;OAEG;;IAcH;;OAEG;;IAcH;;OAEG;;IAcH;;OAEG;;IAcH;;OAEG;;IAcH;;OAEG
|
|
1
|
+
{"version":3,"file":"performanceConfigSchemas.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/config/performanceConfigSchemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;IAClC;;OAEG;;IAcH;;OAEG;;IAcH;;OAEG;;IAcH;;OAEG;;IAcH;;OAEG;;IAcH;;OAEG;;IAcH;;OAEG;;IAcH;;;OAGG;;IAcH;;;OAGG;;;;;;;;;;;;;;;;;;;;;;EAaH,CAAC;AAEH;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE/E;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAW1E;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,GACd,wBAAwB,CAE1B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;GAEzD"}
|
|
@@ -83,6 +83,26 @@ export const PerformanceConfigSchema = z.object({
|
|
|
83
83
|
.min(PERF_CONFIG_RANGES.eventEmitterMaxListeners.min, `eventEmitterMaxListeners must be >= ${PERF_CONFIG_RANGES.eventEmitterMaxListeners.min}`)
|
|
84
84
|
.max(PERF_CONFIG_RANGES.eventEmitterMaxListeners.max, `eventEmitterMaxListeners must be <= ${PERF_CONFIG_RANGES.eventEmitterMaxListeners.max}`)
|
|
85
85
|
.optional(),
|
|
86
|
+
/**
|
|
87
|
+
* Maximum retry attempts for transient errors in security tests.
|
|
88
|
+
* Issue #157: Connection retry logic for reliability
|
|
89
|
+
*/
|
|
90
|
+
securityRetryMaxAttempts: z
|
|
91
|
+
.number()
|
|
92
|
+
.int("securityRetryMaxAttempts must be an integer")
|
|
93
|
+
.min(PERF_CONFIG_RANGES.securityRetryMaxAttempts.min, `securityRetryMaxAttempts must be >= ${PERF_CONFIG_RANGES.securityRetryMaxAttempts.min}`)
|
|
94
|
+
.max(PERF_CONFIG_RANGES.securityRetryMaxAttempts.max, `securityRetryMaxAttempts must be <= ${PERF_CONFIG_RANGES.securityRetryMaxAttempts.max}`)
|
|
95
|
+
.optional(),
|
|
96
|
+
/**
|
|
97
|
+
* Initial backoff delay in milliseconds for security test retries.
|
|
98
|
+
* Issue #157: Connection retry logic for reliability
|
|
99
|
+
*/
|
|
100
|
+
securityRetryBackoffMs: z
|
|
101
|
+
.number()
|
|
102
|
+
.int("securityRetryBackoffMs must be an integer")
|
|
103
|
+
.min(PERF_CONFIG_RANGES.securityRetryBackoffMs.min, `securityRetryBackoffMs must be >= ${PERF_CONFIG_RANGES.securityRetryBackoffMs.min}`)
|
|
104
|
+
.max(PERF_CONFIG_RANGES.securityRetryBackoffMs.max, `securityRetryBackoffMs must be <= ${PERF_CONFIG_RANGES.securityRetryBackoffMs.max}`)
|
|
105
|
+
.optional(),
|
|
86
106
|
});
|
|
87
107
|
/**
|
|
88
108
|
* Validate a partial performance config using Zod.
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External API Dependency Detector
|
|
3
|
+
*
|
|
4
|
+
* Identifies tools that depend on external APIs based on:
|
|
5
|
+
* 1. Tool name and description patterns (fast, always available)
|
|
6
|
+
* 2. Source code scanning for API calls (more accurate, when source available)
|
|
7
|
+
*
|
|
8
|
+
* This information enables downstream assessors to adjust their behavior:
|
|
9
|
+
* - TemporalAssessor: Relaxed variance thresholds for external API tools
|
|
10
|
+
* - FunctionalityAssessor: Accept API errors as valid responses
|
|
11
|
+
* - ErrorHandlingAssessor: Account for external service failures
|
|
12
|
+
*
|
|
13
|
+
* Issue #168: Enhanced with source code scanning support
|
|
14
|
+
*
|
|
15
|
+
* @module helpers/ExternalAPIDependencyDetector
|
|
16
|
+
*/
|
|
17
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
18
|
+
/**
|
|
19
|
+
* Implications of external API dependencies for downstream assessors
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
export interface ExternalAPIImplications {
|
|
23
|
+
/** Expected temporal variance behavior */
|
|
24
|
+
temporalVariance: string;
|
|
25
|
+
/** Dependency on external service availability */
|
|
26
|
+
availabilityDependency: string;
|
|
27
|
+
/** Potential rate limiting from external services */
|
|
28
|
+
rateLimitingRisk?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* External API dependency detection results
|
|
32
|
+
* @public
|
|
33
|
+
*/
|
|
34
|
+
export interface ExternalAPIDependencyInfo {
|
|
35
|
+
/** Set of tool names that depend on external APIs */
|
|
36
|
+
toolsWithExternalAPIDependency: Set<string>;
|
|
37
|
+
/** Number of tools detected with external API dependencies */
|
|
38
|
+
detectedCount: number;
|
|
39
|
+
/** Detection confidence based on pattern strength */
|
|
40
|
+
confidence: "high" | "medium" | "low";
|
|
41
|
+
/** List of detected tool names (for serialization) */
|
|
42
|
+
detectedTools: string[];
|
|
43
|
+
/** Extracted domains from source code scanning (e.g., ["api.worldbank.org"]) */
|
|
44
|
+
domains?: string[];
|
|
45
|
+
/** Whether source code was available and scanned */
|
|
46
|
+
sourceCodeScanned?: boolean;
|
|
47
|
+
/** Implications for downstream assessors when external APIs are detected */
|
|
48
|
+
implications?: ExternalAPIImplications;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Detects external API dependencies in MCP tools based on name and description patterns.
|
|
52
|
+
* Designed to run during context preparation before assessors execute.
|
|
53
|
+
*
|
|
54
|
+
* @public
|
|
55
|
+
*/
|
|
56
|
+
export declare class ExternalAPIDependencyDetector {
|
|
57
|
+
/**
|
|
58
|
+
* Tool name patterns that suggest external API dependency.
|
|
59
|
+
* Uses word-boundary matching to prevent false positives.
|
|
60
|
+
*
|
|
61
|
+
* Extracted from VarianceClassifier (Issue #166) for reuse across modules.
|
|
62
|
+
*/
|
|
63
|
+
private readonly EXTERNAL_API_PATTERNS;
|
|
64
|
+
/**
|
|
65
|
+
* Description patterns that suggest external API dependency.
|
|
66
|
+
* Regex patterns for more flexible matching.
|
|
67
|
+
*/
|
|
68
|
+
private readonly EXTERNAL_API_DESCRIPTION_PATTERNS;
|
|
69
|
+
/**
|
|
70
|
+
* Source code patterns that indicate external API calls.
|
|
71
|
+
* Each pattern captures the URL in group 1.
|
|
72
|
+
*
|
|
73
|
+
* Issue #168: Patterns from proposal for source code scanning
|
|
74
|
+
*/
|
|
75
|
+
private readonly SOURCE_CODE_API_PATTERNS;
|
|
76
|
+
/**
|
|
77
|
+
* URL patterns to skip (localhost, local networks, documentation)
|
|
78
|
+
*/
|
|
79
|
+
private readonly LOCALHOST_PATTERNS;
|
|
80
|
+
/**
|
|
81
|
+
* File patterns to skip during source code scanning
|
|
82
|
+
*/
|
|
83
|
+
private readonly SKIP_FILE_PATTERNS;
|
|
84
|
+
/**
|
|
85
|
+
* Detect external API dependencies from tools and optionally source code.
|
|
86
|
+
*
|
|
87
|
+
* Detection strategy:
|
|
88
|
+
* 1. Always analyze tool names and descriptions (fast, no source needed)
|
|
89
|
+
* 2. If sourceCodeFiles provided, scan for actual API calls (more accurate)
|
|
90
|
+
* 3. Combine results and compute confidence
|
|
91
|
+
*
|
|
92
|
+
* @param tools - List of MCP tools to analyze
|
|
93
|
+
* @param sourceCodeFiles - Optional map of file paths to content for source scanning
|
|
94
|
+
* @returns Detection results with tool names, domains, and implications
|
|
95
|
+
*/
|
|
96
|
+
detect(tools: Tool[], sourceCodeFiles?: Map<string, string>): ExternalAPIDependencyInfo;
|
|
97
|
+
/** Maximum content length per file (500KB) - prevents ReDoS attacks */
|
|
98
|
+
private readonly MAX_CONTENT_LENGTH;
|
|
99
|
+
/** Maximum matches per file - prevents runaway matching */
|
|
100
|
+
private readonly MAX_MATCHES_PER_FILE;
|
|
101
|
+
/**
|
|
102
|
+
* Scan source code files for external API URLs.
|
|
103
|
+
* Returns unique external domains found in the code.
|
|
104
|
+
*
|
|
105
|
+
* @param sourceCodeFiles - Map of file paths to content
|
|
106
|
+
* @returns Array of unique external domain names
|
|
107
|
+
*/
|
|
108
|
+
scanSourceCode(sourceCodeFiles: Map<string, string>): string[];
|
|
109
|
+
/**
|
|
110
|
+
* Extract the hostname from a URL string.
|
|
111
|
+
*
|
|
112
|
+
* @param url - URL string (may be partial)
|
|
113
|
+
* @returns Hostname or null if extraction fails
|
|
114
|
+
*/
|
|
115
|
+
private extractDomain;
|
|
116
|
+
/**
|
|
117
|
+
* Check if a URL points to localhost or local network.
|
|
118
|
+
*
|
|
119
|
+
* @param url - URL string to check
|
|
120
|
+
* @returns true if URL is local
|
|
121
|
+
*/
|
|
122
|
+
private isLocalhost;
|
|
123
|
+
/**
|
|
124
|
+
* Check if a file should be skipped during source scanning.
|
|
125
|
+
*
|
|
126
|
+
* @param filePath - Path to check
|
|
127
|
+
* @returns true if file should be skipped
|
|
128
|
+
*/
|
|
129
|
+
private shouldSkipFile;
|
|
130
|
+
/**
|
|
131
|
+
* Compute detection confidence based on both methods.
|
|
132
|
+
* Source code confirmation boosts confidence.
|
|
133
|
+
*
|
|
134
|
+
* @param toolCount - Number of tools detected via name/description
|
|
135
|
+
* @param domains - Domains found in source code
|
|
136
|
+
* @returns Confidence level
|
|
137
|
+
*/
|
|
138
|
+
private computeConfidence;
|
|
139
|
+
/**
|
|
140
|
+
* Generate implications for downstream assessors.
|
|
141
|
+
*
|
|
142
|
+
* @param domains - External domains found
|
|
143
|
+
* @returns Implications object
|
|
144
|
+
*/
|
|
145
|
+
private generateImplications;
|
|
146
|
+
/**
|
|
147
|
+
* Check if a single tool depends on external APIs.
|
|
148
|
+
* Uses BOTH name patterns AND description analysis for detection.
|
|
149
|
+
*
|
|
150
|
+
* @param tool - MCP tool to check
|
|
151
|
+
* @returns true if tool appears to depend on external APIs
|
|
152
|
+
*/
|
|
153
|
+
isExternalAPITool(tool: Tool): boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Get the list of name patterns used for detection.
|
|
156
|
+
* Useful for debugging and documentation.
|
|
157
|
+
*/
|
|
158
|
+
getNamePatterns(): readonly string[];
|
|
159
|
+
/**
|
|
160
|
+
* Get the list of description patterns used for detection.
|
|
161
|
+
* Useful for debugging and documentation.
|
|
162
|
+
*/
|
|
163
|
+
getDescriptionPatterns(): readonly RegExp[];
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=ExternalAPIDependencyDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExternalAPIDependencyDetector.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/helpers/ExternalAPIDependencyDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,gBAAgB,EAAE,MAAM,CAAC;IACzB,kDAAkD;IAClD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,qDAAqD;IACrD,8BAA8B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5C,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,sDAAsD;IACtD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,4EAA4E;IAC5E,YAAY,CAAC,EAAE,uBAAuB,CAAC;CACxC;AAED;;;;;GAKG;AACH,qBAAa,6BAA6B;IACxC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAuBpC;IAEF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAQhD;IAEF;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAevC;IAEF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAUjC;IAEF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAajC;IAEF;;;;;;;;;;;OAWG;IACH,MAAM,CACJ,KAAK,EAAE,IAAI,EAAE,EACb,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,yBAAyB;IA0C5B,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAW;IAE9C,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAO;IAE5C;;;;;;OAMG;IACH,cAAc,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE;IAoC9D;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAUrB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAItB;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAmBtC;;;OAGG;IACH,eAAe,IAAI,SAAS,MAAM,EAAE;IAIpC;;;OAGG;IACH,sBAAsB,IAAI,SAAS,MAAM,EAAE;CAG5C"}
|