@bryan-thompson/inspector-assessment-client 1.7.2 → 1.8.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/dist/assets/{OAuthCallback-Dk69OAHS.js → OAuthCallback-C6NJ8fGr.js} +1 -1
- package/dist/assets/{OAuthDebugCallback-Do2NIUkY.js → OAuthDebugCallback-MIqvflwd.js} +1 -1
- package/dist/assets/{index-BZfyfKpR.js → index-CW7GS_di.js} +1235 -1366
- package/dist/assets/{index-B9Z2VpMu.css → index-Cuc9GxjD.css} +5 -1
- package/dist/index.html +2 -2
- package/lib/services/assessment/AssessmentOrchestrator.d.ts.map +1 -1
- package/lib/services/assessment/AssessmentOrchestrator.js +91 -29
- package/package.json +2 -2
|
@@ -56,6 +56,8 @@ pre[class*="language-"] {
|
|
|
56
56
|
-moz-tab-size: 4;
|
|
57
57
|
-o-tab-size: 4;
|
|
58
58
|
tab-size: 4;
|
|
59
|
+
|
|
60
|
+
-webkit-hyphens: none;
|
|
59
61
|
hyphens: none;
|
|
60
62
|
}
|
|
61
63
|
|
|
@@ -281,7 +283,7 @@ pre[class*="language-"] {
|
|
|
281
283
|
--tw-contain-paint: ;
|
|
282
284
|
--tw-contain-style: ;
|
|
283
285
|
}/*
|
|
284
|
-
! tailwindcss v3.4.
|
|
286
|
+
! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com
|
|
285
287
|
*//*
|
|
286
288
|
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
|
|
287
289
|
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
|
|
@@ -2099,7 +2101,9 @@ video {
|
|
|
2099
2101
|
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
|
|
2100
2102
|
}
|
|
2101
2103
|
.transition {
|
|
2104
|
+
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;
|
|
2102
2105
|
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
|
|
2106
|
+
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;
|
|
2103
2107
|
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
2104
2108
|
transition-duration: 150ms;
|
|
2105
2109
|
}
|
package/dist/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
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-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-CW7GS_di.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Cuc9GxjD.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root" class="w-full"></div>
|
|
@@ -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.
|
|
3
|
+
"version": "1.8.1",
|
|
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>",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"cleanup:e2e": "node e2e/global-teardown.js"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
49
|
+
"@modelcontextprotocol/sdk": "^1.24.3",
|
|
50
50
|
"@radix-ui/react-checkbox": "^1.1.4",
|
|
51
51
|
"@radix-ui/react-dialog": "^1.1.3",
|
|
52
52
|
"@radix-ui/react-icons": "^1.3.0",
|