@bryan-thompson/inspector-assessment-client 1.8.0 → 1.8.2
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/dist/assets/{OAuthCallback-C6NJ8fGr.js → OAuthCallback-Dh4s0sPz.js} +1 -1
- package/dist/assets/{OAuthDebugCallback-MIqvflwd.js → OAuthDebugCallback-CcQFCLfg.js} +1 -1
- package/dist/assets/{index-CW7GS_di.js → index-Ck1G7GcJ.js} +4 -4
- package/dist/index.html +1 -1
- package/lib/services/assessment/AssessmentOrchestrator.d.ts.map +1 -1
- package/lib/services/assessment/AssessmentOrchestrator.js +91 -29
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { u as useToast, r as reactExports, j as jsxRuntimeExports, p as parseOAuthCallbackParams, g as generateOAuthErrorDescription, S as SESSION_KEYS, I as InspectorOAuthClientProvider, a as auth } from "./index-
|
|
1
|
+
import { u as useToast, r as reactExports, j as jsxRuntimeExports, p as parseOAuthCallbackParams, g as generateOAuthErrorDescription, S as SESSION_KEYS, I as InspectorOAuthClientProvider, a as auth } from "./index-Ck1G7GcJ.js";
|
|
2
2
|
const OAuthCallback = ({ onConnect }) => {
|
|
3
3
|
const { toast } = useToast();
|
|
4
4
|
const hasProcessedRef = reactExports.useRef(false);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as reactExports, S as SESSION_KEYS, p as parseOAuthCallbackParams, j as jsxRuntimeExports, g as generateOAuthErrorDescription } from "./index-
|
|
1
|
+
import { r as reactExports, S as SESSION_KEYS, p as parseOAuthCallbackParams, j as jsxRuntimeExports, g as generateOAuthErrorDescription } from "./index-Ck1G7GcJ.js";
|
|
2
2
|
const OAuthDebugCallback = ({ onConnect }) => {
|
|
3
3
|
reactExports.useEffect(() => {
|
|
4
4
|
let isProcessed = false;
|
|
@@ -16320,7 +16320,7 @@ object({
|
|
|
16320
16320
|
token_type_hint: string().optional()
|
|
16321
16321
|
}).strip();
|
|
16322
16322
|
const name = "@bryan-thompson/inspector-assessment-client";
|
|
16323
|
-
const version$1 = "1.8.
|
|
16323
|
+
const version$1 = "1.8.1";
|
|
16324
16324
|
const packageJson = {
|
|
16325
16325
|
name,
|
|
16326
16326
|
version: version$1
|
|
@@ -48863,7 +48863,7 @@ const useTheme = () => {
|
|
|
48863
48863
|
[theme, setThemeWithSideEffect]
|
|
48864
48864
|
);
|
|
48865
48865
|
};
|
|
48866
|
-
const version = "1.8.
|
|
48866
|
+
const version = "1.8.1";
|
|
48867
48867
|
var [createTooltipContext] = createContextScope("Tooltip", [
|
|
48868
48868
|
createPopperScope
|
|
48869
48869
|
]);
|
|
@@ -60816,13 +60816,13 @@ const App = () => {
|
|
|
60816
60816
|
) });
|
|
60817
60817
|
if (window.location.pathname === "/oauth/callback") {
|
|
60818
60818
|
const OAuthCallback = React.lazy(
|
|
60819
|
-
() => __vitePreload(() => import("./OAuthCallback-
|
|
60819
|
+
() => __vitePreload(() => import("./OAuthCallback-Dh4s0sPz.js"), true ? [] : void 0)
|
|
60820
60820
|
);
|
|
60821
60821
|
return /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Loading..." }), children: /* @__PURE__ */ jsxRuntimeExports.jsx(OAuthCallback, { onConnect: onOAuthConnect }) });
|
|
60822
60822
|
}
|
|
60823
60823
|
if (window.location.pathname === "/oauth/callback/debug") {
|
|
60824
60824
|
const OAuthDebugCallback = React.lazy(
|
|
60825
|
-
() => __vitePreload(() => import("./OAuthDebugCallback-
|
|
60825
|
+
() => __vitePreload(() => import("./OAuthDebugCallback-CcQFCLfg.js"), true ? [] : void 0)
|
|
60826
60826
|
);
|
|
60827
60827
|
return /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Loading..." }), children: /* @__PURE__ */ jsxRuntimeExports.jsx(OAuthDebugCallback, { onConnect: onOAuthDebugConnect }) });
|
|
60828
60828
|
}
|
package/dist/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="/mcp.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>MCP Inspector</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-Ck1G7GcJ.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-Cuc9GxjD.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssessmentOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/services/assessment/AssessmentOrchestrator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EAGvB,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,IAAI,EACJ,2BAA2B,EAC5B,MAAM,oCAAoC,CAAC;AAoB5C,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EAEvB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"AssessmentOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/services/assessment/AssessmentOrchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,46 @@ import { PortabilityAssessor } from "./modules/PortabilityAssessor.js";
|
|
|
20
20
|
// Claude Code integration for intelligent analysis
|
|
21
21
|
import { ClaudeCodeBridge, FULL_CLAUDE_CODE_CONFIG, } from "./lib/claudeCodeBridge.js";
|
|
22
22
|
import { TestDataGenerator } from "./TestDataGenerator.js";
|
|
23
|
+
/**
|
|
24
|
+
* Emit module progress to stderr for real-time monitoring by external tools.
|
|
25
|
+
* Format: <emoji> <ModuleName>: <STATUS> (<score>%)
|
|
26
|
+
* Example: ✅ Functionality: PASS (95%)
|
|
27
|
+
*/
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
|
+
function emitModuleProgress(moduleName, status, result) {
|
|
30
|
+
const emoji = status === "PASS" ? "✅" : status === "FAIL" ? "❌" : "⚠️";
|
|
31
|
+
// Compute score based on module type
|
|
32
|
+
let score = 0;
|
|
33
|
+
const metrics = result?.metrics;
|
|
34
|
+
if (metrics?.mcpComplianceScore !== undefined) {
|
|
35
|
+
// ErrorHandling module
|
|
36
|
+
score = Math.round(metrics.mcpComplianceScore);
|
|
37
|
+
}
|
|
38
|
+
else if (result?.complianceScore !== undefined) {
|
|
39
|
+
// MCPSpecCompliance module
|
|
40
|
+
score = Math.round(result.complianceScore);
|
|
41
|
+
}
|
|
42
|
+
else if (result?.workingPercentage !== undefined) {
|
|
43
|
+
// Functionality module
|
|
44
|
+
score = Math.round(result.workingPercentage);
|
|
45
|
+
}
|
|
46
|
+
else if (Array.isArray(result?.vulnerabilities)) {
|
|
47
|
+
// Security module: 100% if no vulns, lower based on vuln count
|
|
48
|
+
const vulnCount = result.vulnerabilities.length;
|
|
49
|
+
score = vulnCount === 0 ? 100 : Math.max(0, 100 - vulnCount * 10);
|
|
50
|
+
}
|
|
51
|
+
else if (Array.isArray(result?.violations)) {
|
|
52
|
+
// AUP module: 100% if no violations, lower based on violation count
|
|
53
|
+
const violationCount = result.violations.length;
|
|
54
|
+
score = violationCount === 0 ? 100 : Math.max(0, 100 - violationCount * 10);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// Derive from status: PASS=100, FAIL=0, other=50
|
|
58
|
+
score = status === "PASS" ? 100 : status === "FAIL" ? 0 : 50;
|
|
59
|
+
}
|
|
60
|
+
// Emit to stderr (not stdout) so it doesn't interfere with JSON output
|
|
61
|
+
console.error(`${emoji} ${moduleName}: ${status} (${score}%)`);
|
|
62
|
+
}
|
|
23
63
|
export class AssessmentOrchestrator {
|
|
24
64
|
config;
|
|
25
65
|
startTime = 0;
|
|
@@ -178,48 +218,59 @@ export class AssessmentOrchestrator {
|
|
|
178
218
|
const assessmentResults = {};
|
|
179
219
|
if (this.config.parallelTesting) {
|
|
180
220
|
// Core assessments
|
|
181
|
-
assessmentPromises.push(this.functionalityAssessor
|
|
182
|
-
.
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
.
|
|
187
|
-
|
|
188
|
-
.
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
221
|
+
assessmentPromises.push(this.functionalityAssessor.assess(context).then((r) => {
|
|
222
|
+
emitModuleProgress("Functionality", r.status, r);
|
|
223
|
+
return (assessmentResults.functionality = r);
|
|
224
|
+
}), this.securityAssessor.assess(context).then((r) => {
|
|
225
|
+
emitModuleProgress("Security", r.status, r);
|
|
226
|
+
return (assessmentResults.security = r);
|
|
227
|
+
}), this.documentationAssessor.assess(context).then((r) => {
|
|
228
|
+
emitModuleProgress("Documentation", r.status, r);
|
|
229
|
+
return (assessmentResults.documentation = r);
|
|
230
|
+
}), this.errorHandlingAssessor.assess(context).then((r) => {
|
|
231
|
+
emitModuleProgress("Error Handling", r.status, r);
|
|
232
|
+
return (assessmentResults.errorHandling = r);
|
|
233
|
+
}), this.usabilityAssessor.assess(context).then((r) => {
|
|
234
|
+
emitModuleProgress("Usability", r.status, r);
|
|
235
|
+
return (assessmentResults.usability = r);
|
|
236
|
+
}));
|
|
192
237
|
// Extended assessments
|
|
193
238
|
if (this.mcpSpecAssessor) {
|
|
194
|
-
assessmentPromises.push(this.mcpSpecAssessor
|
|
195
|
-
.
|
|
196
|
-
|
|
239
|
+
assessmentPromises.push(this.mcpSpecAssessor.assess(context).then((r) => {
|
|
240
|
+
emitModuleProgress("MCP Spec", r.status, r);
|
|
241
|
+
return (assessmentResults.mcpSpecCompliance = r);
|
|
242
|
+
}));
|
|
197
243
|
}
|
|
198
244
|
// New MCP Directory Compliance Gap assessments
|
|
199
245
|
if (this.aupComplianceAssessor) {
|
|
200
|
-
assessmentPromises.push(this.aupComplianceAssessor
|
|
201
|
-
.
|
|
202
|
-
|
|
246
|
+
assessmentPromises.push(this.aupComplianceAssessor.assess(context).then((r) => {
|
|
247
|
+
emitModuleProgress("AUP", r.status, r);
|
|
248
|
+
return (assessmentResults.aupCompliance = r);
|
|
249
|
+
}));
|
|
203
250
|
}
|
|
204
251
|
if (this.toolAnnotationAssessor) {
|
|
205
|
-
assessmentPromises.push(this.toolAnnotationAssessor
|
|
206
|
-
.
|
|
207
|
-
|
|
252
|
+
assessmentPromises.push(this.toolAnnotationAssessor.assess(context).then((r) => {
|
|
253
|
+
emitModuleProgress("Annotations", r.status, r);
|
|
254
|
+
return (assessmentResults.toolAnnotations = r);
|
|
255
|
+
}));
|
|
208
256
|
}
|
|
209
257
|
if (this.prohibitedLibrariesAssessor) {
|
|
210
|
-
assessmentPromises.push(this.prohibitedLibrariesAssessor
|
|
211
|
-
.
|
|
212
|
-
|
|
258
|
+
assessmentPromises.push(this.prohibitedLibrariesAssessor.assess(context).then((r) => {
|
|
259
|
+
emitModuleProgress("Libraries", r.status, r);
|
|
260
|
+
return (assessmentResults.prohibitedLibraries = r);
|
|
261
|
+
}));
|
|
213
262
|
}
|
|
214
263
|
if (this.manifestValidationAssessor) {
|
|
215
|
-
assessmentPromises.push(this.manifestValidationAssessor
|
|
216
|
-
.
|
|
217
|
-
|
|
264
|
+
assessmentPromises.push(this.manifestValidationAssessor.assess(context).then((r) => {
|
|
265
|
+
emitModuleProgress("Manifest", r.status, r);
|
|
266
|
+
return (assessmentResults.manifestValidation = r);
|
|
267
|
+
}));
|
|
218
268
|
}
|
|
219
269
|
if (this.portabilityAssessor) {
|
|
220
|
-
assessmentPromises.push(this.portabilityAssessor
|
|
221
|
-
.
|
|
222
|
-
|
|
270
|
+
assessmentPromises.push(this.portabilityAssessor.assess(context).then((r) => {
|
|
271
|
+
emitModuleProgress("Portability", r.status, r);
|
|
272
|
+
return (assessmentResults.portability = r);
|
|
273
|
+
}));
|
|
223
274
|
}
|
|
224
275
|
await Promise.all(assessmentPromises);
|
|
225
276
|
}
|
|
@@ -227,37 +278,48 @@ export class AssessmentOrchestrator {
|
|
|
227
278
|
// Sequential execution
|
|
228
279
|
assessmentResults.functionality =
|
|
229
280
|
await this.functionalityAssessor.assess(context);
|
|
281
|
+
emitModuleProgress("Functionality", assessmentResults.functionality.status, assessmentResults.functionality);
|
|
230
282
|
assessmentResults.security = await this.securityAssessor.assess(context);
|
|
283
|
+
emitModuleProgress("Security", assessmentResults.security.status, assessmentResults.security);
|
|
231
284
|
assessmentResults.documentation =
|
|
232
285
|
await this.documentationAssessor.assess(context);
|
|
286
|
+
emitModuleProgress("Documentation", assessmentResults.documentation.status, assessmentResults.documentation);
|
|
233
287
|
assessmentResults.errorHandling =
|
|
234
288
|
await this.errorHandlingAssessor.assess(context);
|
|
289
|
+
emitModuleProgress("Error Handling", assessmentResults.errorHandling.status, assessmentResults.errorHandling);
|
|
235
290
|
assessmentResults.usability =
|
|
236
291
|
await this.usabilityAssessor.assess(context);
|
|
292
|
+
emitModuleProgress("Usability", assessmentResults.usability.status, assessmentResults.usability);
|
|
237
293
|
if (this.mcpSpecAssessor) {
|
|
238
294
|
assessmentResults.mcpSpecCompliance =
|
|
239
295
|
await this.mcpSpecAssessor.assess(context);
|
|
296
|
+
emitModuleProgress("MCP Spec", assessmentResults.mcpSpecCompliance.status, assessmentResults.mcpSpecCompliance);
|
|
240
297
|
}
|
|
241
298
|
// New MCP Directory Compliance Gap assessments (sequential)
|
|
242
299
|
if (this.aupComplianceAssessor) {
|
|
243
300
|
assessmentResults.aupCompliance =
|
|
244
301
|
await this.aupComplianceAssessor.assess(context);
|
|
302
|
+
emitModuleProgress("AUP", assessmentResults.aupCompliance.status, assessmentResults.aupCompliance);
|
|
245
303
|
}
|
|
246
304
|
if (this.toolAnnotationAssessor) {
|
|
247
305
|
assessmentResults.toolAnnotations =
|
|
248
306
|
await this.toolAnnotationAssessor.assess(context);
|
|
307
|
+
emitModuleProgress("Annotations", assessmentResults.toolAnnotations.status, assessmentResults.toolAnnotations);
|
|
249
308
|
}
|
|
250
309
|
if (this.prohibitedLibrariesAssessor) {
|
|
251
310
|
assessmentResults.prohibitedLibraries =
|
|
252
311
|
await this.prohibitedLibrariesAssessor.assess(context);
|
|
312
|
+
emitModuleProgress("Libraries", assessmentResults.prohibitedLibraries.status, assessmentResults.prohibitedLibraries);
|
|
253
313
|
}
|
|
254
314
|
if (this.manifestValidationAssessor) {
|
|
255
315
|
assessmentResults.manifestValidation =
|
|
256
316
|
await this.manifestValidationAssessor.assess(context);
|
|
317
|
+
emitModuleProgress("Manifest", assessmentResults.manifestValidation.status, assessmentResults.manifestValidation);
|
|
257
318
|
}
|
|
258
319
|
if (this.portabilityAssessor) {
|
|
259
320
|
assessmentResults.portability =
|
|
260
321
|
await this.portabilityAssessor.assess(context);
|
|
322
|
+
emitModuleProgress("Portability", assessmentResults.portability.status, assessmentResults.portability);
|
|
261
323
|
}
|
|
262
324
|
}
|
|
263
325
|
// Collect test counts from all assessors
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bryan-thompson/inspector-assessment-client",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.2",
|
|
4
4
|
"description": "Client-side application for the Enhanced MCP Inspector with assessment capabilities",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Bryan Thompson <bryan@triepod.ai>",
|