@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.
@@ -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.19 | MIT License | https://tailwindcss.com
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-BZfyfKpR.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-B9Z2VpMu.css">
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":"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"}
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
- .assess(context)
183
- .then((r) => (assessmentResults.functionality = r)), this.securityAssessor
184
- .assess(context)
185
- .then((r) => (assessmentResults.security = r)), this.documentationAssessor
186
- .assess(context)
187
- .then((r) => (assessmentResults.documentation = r)), this.errorHandlingAssessor
188
- .assess(context)
189
- .then((r) => (assessmentResults.errorHandling = r)), this.usabilityAssessor
190
- .assess(context)
191
- .then((r) => (assessmentResults.usability = r)));
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
- .assess(context)
196
- .then((r) => (assessmentResults.mcpSpecCompliance = r)));
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
- .assess(context)
202
- .then((r) => (assessmentResults.aupCompliance = r)));
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
- .assess(context)
207
- .then((r) => (assessmentResults.toolAnnotations = r)));
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
- .assess(context)
212
- .then((r) => (assessmentResults.prohibitedLibraries = r)));
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
- .assess(context)
217
- .then((r) => (assessmentResults.manifestValidation = r)));
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
- .assess(context)
222
- .then((r) => (assessmentResults.portability = r)));
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.7.2",
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.23.0",
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",