@bryan-thompson/inspector-assessment 1.5.0 → 1.7.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/assess-full.js +528 -0
- package/cli/build/assess-security.js +342 -0
- package/cli/build/cli.js +10 -1
- package/client/dist/assets/{OAuthCallback-TeTvKfWE.js → OAuthCallback-Xo9zS7pv.js} +1 -1
- package/client/dist/assets/{OAuthDebugCallback-DwA2sKy9.js → OAuthDebugCallback-CaIey8K_.js} +1 -1
- package/client/dist/assets/{index-BwAoxcvr.js → index-nCPw6E-c.js} +4 -4
- package/client/dist/index.html +1 -1
- package/client/lib/lib/assessmentTypes.d.ts +670 -0
- package/client/lib/lib/assessmentTypes.d.ts.map +1 -0
- package/client/lib/lib/assessmentTypes.js +220 -0
- package/client/lib/lib/aupPatterns.d.ts +63 -0
- package/client/lib/lib/aupPatterns.d.ts.map +1 -0
- package/client/lib/lib/aupPatterns.js +344 -0
- package/client/lib/lib/prohibitedLibraries.d.ts +76 -0
- package/client/lib/lib/prohibitedLibraries.d.ts.map +1 -0
- package/client/lib/lib/prohibitedLibraries.js +364 -0
- package/client/lib/lib/securityPatterns.d.ts +64 -0
- package/client/lib/lib/securityPatterns.d.ts.map +1 -0
- package/client/lib/lib/securityPatterns.js +453 -0
- package/client/lib/services/assessment/AssessmentOrchestrator.d.ts +88 -0
- package/client/lib/services/assessment/AssessmentOrchestrator.d.ts.map +1 -0
- package/client/lib/services/assessment/AssessmentOrchestrator.js +418 -0
- package/client/lib/services/assessment/ResponseValidator.d.ts +69 -0
- package/client/lib/services/assessment/ResponseValidator.d.ts.map +1 -0
- package/client/lib/services/assessment/ResponseValidator.js +1038 -0
- package/client/lib/services/assessment/TestDataGenerator.d.ts +86 -0
- package/client/lib/services/assessment/TestDataGenerator.d.ts.map +1 -0
- package/client/lib/services/assessment/TestDataGenerator.js +669 -0
- package/client/lib/services/assessment/TestScenarioEngine.d.ts +91 -0
- package/client/lib/services/assessment/TestScenarioEngine.d.ts.map +1 -0
- package/client/lib/services/assessment/TestScenarioEngine.js +505 -0
- package/client/lib/services/assessment/ToolClassifier.d.ts +61 -0
- package/client/lib/services/assessment/ToolClassifier.d.ts.map +1 -0
- package/client/lib/services/assessment/ToolClassifier.js +349 -0
- package/client/lib/services/assessment/lib/claudeCodeBridge.d.ts +160 -0
- package/client/lib/services/assessment/lib/claudeCodeBridge.d.ts.map +1 -0
- package/client/lib/services/assessment/lib/claudeCodeBridge.js +357 -0
- package/client/lib/services/assessment/modules/AUPComplianceAssessor.d.ts +100 -0
- package/client/lib/services/assessment/modules/AUPComplianceAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/AUPComplianceAssessor.js +474 -0
- package/client/lib/services/assessment/modules/BaseAssessor.d.ts +71 -0
- package/client/lib/services/assessment/modules/BaseAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/BaseAssessor.js +171 -0
- package/client/lib/services/assessment/modules/DocumentationAssessor.d.ts +45 -0
- package/client/lib/services/assessment/modules/DocumentationAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/DocumentationAssessor.js +355 -0
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.d.ts +25 -0
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.js +564 -0
- package/client/lib/services/assessment/modules/FunctionalityAssessor.d.ts +20 -0
- package/client/lib/services/assessment/modules/FunctionalityAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/FunctionalityAssessor.js +253 -0
- package/client/lib/services/assessment/modules/MCPSpecComplianceAssessor.d.ts +70 -0
- package/client/lib/services/assessment/modules/MCPSpecComplianceAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/MCPSpecComplianceAssessor.js +508 -0
- package/client/lib/services/assessment/modules/ManifestValidationAssessor.d.ts +70 -0
- package/client/lib/services/assessment/modules/ManifestValidationAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/ManifestValidationAssessor.js +430 -0
- package/client/lib/services/assessment/modules/PortabilityAssessor.d.ts +43 -0
- package/client/lib/services/assessment/modules/PortabilityAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/PortabilityAssessor.js +347 -0
- package/client/lib/services/assessment/modules/ProhibitedLibrariesAssessor.d.ts +41 -0
- package/client/lib/services/assessment/modules/ProhibitedLibrariesAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/ProhibitedLibrariesAssessor.js +256 -0
- package/client/lib/services/assessment/modules/SecurityAssessor.d.ts +176 -0
- package/client/lib/services/assessment/modules/SecurityAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/SecurityAssessor.js +1333 -0
- package/client/lib/services/assessment/modules/ToolAnnotationAssessor.d.ts +96 -0
- package/client/lib/services/assessment/modules/ToolAnnotationAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/ToolAnnotationAssessor.js +593 -0
- package/client/lib/services/assessment/modules/UsabilityAssessor.d.ts +21 -0
- package/client/lib/services/assessment/modules/UsabilityAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/UsabilityAssessor.js +241 -0
- package/client/lib/services/assessment/modules/index.d.ts +33 -0
- package/client/lib/services/assessment/modules/index.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/index.js +35 -0
- package/package.json +7 -2
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Standalone Security Assessment Runner CLI
|
|
4
|
+
*
|
|
5
|
+
* Runs security assessment against an MCP server without the web UI.
|
|
6
|
+
* Focuses on prompt injection and vulnerability testing.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* mcp-assess-security --server <server-name>
|
|
10
|
+
* mcp-assess-security --server broken-mcp --tool vulnerable_tool
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from "fs";
|
|
13
|
+
import * as path from "path";
|
|
14
|
+
import * as os from "os";
|
|
15
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
16
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
17
|
+
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
18
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
19
|
+
// Import from local client lib (will use package exports when published)
|
|
20
|
+
import { SecurityAssessor } from "../../client/lib/services/assessment/modules/SecurityAssessor.js";
|
|
21
|
+
import { DEFAULT_ASSESSMENT_CONFIG, } from "../../client/lib/lib/assessmentTypes.js";
|
|
22
|
+
/**
|
|
23
|
+
* Load server configuration from Claude Code's MCP settings
|
|
24
|
+
*/
|
|
25
|
+
function loadServerConfig(serverName, configPath) {
|
|
26
|
+
const possiblePaths = [
|
|
27
|
+
configPath,
|
|
28
|
+
path.join(os.homedir(), ".config", "mcp", "servers", `${serverName}.json`),
|
|
29
|
+
path.join(os.homedir(), ".config", "claude", "claude_desktop_config.json"),
|
|
30
|
+
].filter(Boolean);
|
|
31
|
+
for (const tryPath of possiblePaths) {
|
|
32
|
+
if (!fs.existsSync(tryPath))
|
|
33
|
+
continue;
|
|
34
|
+
const config = JSON.parse(fs.readFileSync(tryPath, "utf-8"));
|
|
35
|
+
if (config.mcpServers && config.mcpServers[serverName]) {
|
|
36
|
+
const serverConfig = config.mcpServers[serverName];
|
|
37
|
+
return {
|
|
38
|
+
transport: "stdio",
|
|
39
|
+
command: serverConfig.command,
|
|
40
|
+
args: serverConfig.args || [],
|
|
41
|
+
env: serverConfig.env || {},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (config.url ||
|
|
45
|
+
config.transport === "http" ||
|
|
46
|
+
config.transport === "sse") {
|
|
47
|
+
if (!config.url) {
|
|
48
|
+
throw new Error(`Invalid server config: transport is '${config.transport}' but 'url' is missing`);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
transport: config.transport || "http",
|
|
52
|
+
url: config.url,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (config.command) {
|
|
56
|
+
return {
|
|
57
|
+
transport: "stdio",
|
|
58
|
+
command: config.command,
|
|
59
|
+
args: config.args || [],
|
|
60
|
+
env: config.env || {},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
throw new Error(`Server config not found for: ${serverName}\nTried: ${possiblePaths.join(", ")}`);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Connect to MCP server via configured transport
|
|
68
|
+
*/
|
|
69
|
+
async function connectToServer(config) {
|
|
70
|
+
let transport;
|
|
71
|
+
switch (config.transport) {
|
|
72
|
+
case "http":
|
|
73
|
+
if (!config.url)
|
|
74
|
+
throw new Error("URL required for HTTP transport");
|
|
75
|
+
transport = new StreamableHTTPClientTransport(new URL(config.url));
|
|
76
|
+
break;
|
|
77
|
+
case "sse":
|
|
78
|
+
if (!config.url)
|
|
79
|
+
throw new Error("URL required for SSE transport");
|
|
80
|
+
transport = new SSEClientTransport(new URL(config.url));
|
|
81
|
+
break;
|
|
82
|
+
case "stdio":
|
|
83
|
+
default:
|
|
84
|
+
if (!config.command)
|
|
85
|
+
throw new Error("Command required for stdio transport");
|
|
86
|
+
transport = new StdioClientTransport({
|
|
87
|
+
command: config.command,
|
|
88
|
+
args: config.args,
|
|
89
|
+
env: {
|
|
90
|
+
...Object.fromEntries(Object.entries(process.env).filter(([, v]) => v !== undefined)),
|
|
91
|
+
...config.env,
|
|
92
|
+
},
|
|
93
|
+
stderr: "pipe",
|
|
94
|
+
});
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
const client = new Client({
|
|
98
|
+
name: "mcp-assess-security",
|
|
99
|
+
version: "1.0.0",
|
|
100
|
+
}, {
|
|
101
|
+
capabilities: {},
|
|
102
|
+
});
|
|
103
|
+
await client.connect(transport);
|
|
104
|
+
return client;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get list of tools from MCP server
|
|
108
|
+
*/
|
|
109
|
+
async function getTools(client, toolNameFilter) {
|
|
110
|
+
const response = await client.listTools();
|
|
111
|
+
let tools = response.tools || [];
|
|
112
|
+
if (toolNameFilter) {
|
|
113
|
+
tools = tools.filter((t) => t.name === toolNameFilter);
|
|
114
|
+
if (tools.length === 0) {
|
|
115
|
+
throw new Error(`Tool not found: ${toolNameFilter}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return tools;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create callTool wrapper for assessment context
|
|
122
|
+
*/
|
|
123
|
+
function createCallToolWrapper(client) {
|
|
124
|
+
return async (name, params) => {
|
|
125
|
+
try {
|
|
126
|
+
const response = await client.callTool({
|
|
127
|
+
name,
|
|
128
|
+
arguments: params,
|
|
129
|
+
});
|
|
130
|
+
return {
|
|
131
|
+
content: response.content,
|
|
132
|
+
isError: response.isError || false,
|
|
133
|
+
structuredContent: response
|
|
134
|
+
.structuredContent,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
return {
|
|
139
|
+
content: [
|
|
140
|
+
{
|
|
141
|
+
type: "text",
|
|
142
|
+
text: `Error: ${error instanceof Error ? error.message : String(error)}`,
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
isError: true,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Run security assessment
|
|
152
|
+
*/
|
|
153
|
+
async function runSecurityAssessment(options) {
|
|
154
|
+
console.log(`\n🔍 Connecting to MCP server: ${options.serverName}`);
|
|
155
|
+
const serverConfig = loadServerConfig(options.serverName, options.serverConfigPath);
|
|
156
|
+
const client = await connectToServer(serverConfig);
|
|
157
|
+
console.log("✅ Connected successfully");
|
|
158
|
+
const tools = await getTools(client, options.toolName);
|
|
159
|
+
console.log(`🔧 Found ${tools.length} tool${tools.length !== 1 ? "s" : ""}`);
|
|
160
|
+
if (options.toolName) {
|
|
161
|
+
console.log(` Testing only: ${options.toolName}`);
|
|
162
|
+
}
|
|
163
|
+
const config = {
|
|
164
|
+
...DEFAULT_ASSESSMENT_CONFIG,
|
|
165
|
+
securityPatternsToTest: 17,
|
|
166
|
+
reviewerMode: false,
|
|
167
|
+
testTimeout: 30000,
|
|
168
|
+
};
|
|
169
|
+
const context = {
|
|
170
|
+
serverName: options.serverName,
|
|
171
|
+
tools,
|
|
172
|
+
callTool: createCallToolWrapper(client),
|
|
173
|
+
config,
|
|
174
|
+
};
|
|
175
|
+
console.log(`🛡️ Running security assessment with 17 attack patterns...`);
|
|
176
|
+
const assessor = new SecurityAssessor(config);
|
|
177
|
+
const results = await assessor.assess(context);
|
|
178
|
+
await client.close();
|
|
179
|
+
return results;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Save results to JSON file
|
|
183
|
+
*/
|
|
184
|
+
function saveResults(serverName, results, outputPath) {
|
|
185
|
+
const defaultPath = `/tmp/inspector-security-assessment-${serverName}.json`;
|
|
186
|
+
const finalPath = outputPath || defaultPath;
|
|
187
|
+
const output = {
|
|
188
|
+
timestamp: new Date().toISOString(),
|
|
189
|
+
assessmentType: "security",
|
|
190
|
+
serverName,
|
|
191
|
+
security: results,
|
|
192
|
+
};
|
|
193
|
+
fs.writeFileSync(finalPath, JSON.stringify(output, null, 2));
|
|
194
|
+
return finalPath;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Display summary
|
|
198
|
+
*/
|
|
199
|
+
function displaySummary(results) {
|
|
200
|
+
const { promptInjectionTests, vulnerabilities, overallRiskLevel } = results;
|
|
201
|
+
const vulnerableCount = promptInjectionTests.filter((t) => t.vulnerable).length;
|
|
202
|
+
const totalTests = promptInjectionTests.length;
|
|
203
|
+
console.log("\n" + "=".repeat(60));
|
|
204
|
+
console.log("SECURITY ASSESSMENT RESULTS");
|
|
205
|
+
console.log("=".repeat(60));
|
|
206
|
+
console.log(`Total Tests: ${totalTests}`);
|
|
207
|
+
console.log(`Vulnerabilities Found: ${vulnerableCount}`);
|
|
208
|
+
console.log(`Overall Risk Level: ${overallRiskLevel}`);
|
|
209
|
+
console.log("=".repeat(60));
|
|
210
|
+
if (vulnerableCount > 0) {
|
|
211
|
+
console.log("\n⚠️ VULNERABILITIES DETECTED:\n");
|
|
212
|
+
const vulnerableTests = promptInjectionTests.filter((t) => t.vulnerable);
|
|
213
|
+
for (const test of vulnerableTests) {
|
|
214
|
+
console.log(`🚨 ${test.toolName} - ${test.testName}`);
|
|
215
|
+
console.log(` Risk: ${test.riskLevel}`);
|
|
216
|
+
console.log(` Evidence: ${test.evidence}`);
|
|
217
|
+
console.log("");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
console.log("\n✅ No vulnerabilities detected\n");
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Parse command-line arguments
|
|
226
|
+
*/
|
|
227
|
+
function parseArgs() {
|
|
228
|
+
const args = process.argv.slice(2);
|
|
229
|
+
const options = {};
|
|
230
|
+
for (let i = 0; i < args.length; i++) {
|
|
231
|
+
const arg = args[i];
|
|
232
|
+
if (!arg)
|
|
233
|
+
continue;
|
|
234
|
+
switch (arg) {
|
|
235
|
+
case "--server":
|
|
236
|
+
case "-s":
|
|
237
|
+
options.serverName = args[++i];
|
|
238
|
+
break;
|
|
239
|
+
case "--config":
|
|
240
|
+
case "-c":
|
|
241
|
+
options.serverConfigPath = args[++i];
|
|
242
|
+
break;
|
|
243
|
+
case "--output":
|
|
244
|
+
case "-o":
|
|
245
|
+
options.outputPath = args[++i];
|
|
246
|
+
break;
|
|
247
|
+
case "--tool":
|
|
248
|
+
case "-t":
|
|
249
|
+
options.toolName = args[++i];
|
|
250
|
+
break;
|
|
251
|
+
case "--verbose":
|
|
252
|
+
case "-v":
|
|
253
|
+
options.verbose = true;
|
|
254
|
+
break;
|
|
255
|
+
case "--help":
|
|
256
|
+
case "-h":
|
|
257
|
+
printHelp();
|
|
258
|
+
options.helpRequested = true;
|
|
259
|
+
return options;
|
|
260
|
+
default:
|
|
261
|
+
if (!arg.startsWith("-")) {
|
|
262
|
+
if (!options.serverName) {
|
|
263
|
+
options.serverName = arg;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
console.error(`Unknown argument: ${arg}`);
|
|
268
|
+
printHelp();
|
|
269
|
+
setTimeout(() => process.exit(1), 10);
|
|
270
|
+
options.helpRequested = true;
|
|
271
|
+
return options;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (!options.serverName) {
|
|
276
|
+
console.error("Error: --server is required");
|
|
277
|
+
printHelp();
|
|
278
|
+
setTimeout(() => process.exit(1), 10);
|
|
279
|
+
options.helpRequested = true;
|
|
280
|
+
return options;
|
|
281
|
+
}
|
|
282
|
+
return options;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Print help message
|
|
286
|
+
*/
|
|
287
|
+
function printHelp() {
|
|
288
|
+
console.log(`
|
|
289
|
+
Usage: mcp-assess-security [options] [server-name]
|
|
290
|
+
|
|
291
|
+
Run security assessment against an MCP server with 17 attack patterns.
|
|
292
|
+
|
|
293
|
+
Options:
|
|
294
|
+
--server, -s <name> Server name (required, or pass as first positional arg)
|
|
295
|
+
--config, -c <path> Path to server config JSON
|
|
296
|
+
--output, -o <path> Output JSON path (default: /tmp/inspector-security-assessment-<server>.json)
|
|
297
|
+
--tool, -t <name> Test only specific tool (default: test all tools)
|
|
298
|
+
--verbose, -v Enable verbose logging
|
|
299
|
+
--help, -h Show this help message
|
|
300
|
+
|
|
301
|
+
Attack Patterns Tested (17 total):
|
|
302
|
+
• Direct prompt injection
|
|
303
|
+
• Indirect prompt injection
|
|
304
|
+
• Instruction override
|
|
305
|
+
• Role-playing attacks
|
|
306
|
+
• Encoding bypass
|
|
307
|
+
• Multi-turn manipulation
|
|
308
|
+
• Context poisoning
|
|
309
|
+
• And more...
|
|
310
|
+
|
|
311
|
+
Examples:
|
|
312
|
+
mcp-assess-security my-server
|
|
313
|
+
mcp-assess-security --server broken-mcp --tool vulnerable_calculator_tool
|
|
314
|
+
mcp-assess-security --server my-server --output ./security-results.json
|
|
315
|
+
`);
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Main execution
|
|
319
|
+
*/
|
|
320
|
+
async function main() {
|
|
321
|
+
try {
|
|
322
|
+
const options = parseArgs();
|
|
323
|
+
if (options.helpRequested) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
const results = await runSecurityAssessment(options);
|
|
327
|
+
displaySummary(results);
|
|
328
|
+
const outputPath = saveResults(options.serverName, results, options.outputPath);
|
|
329
|
+
console.log(`📄 Results saved to: ${outputPath}\n`);
|
|
330
|
+
const exitCode = results.vulnerabilities.length > 0 ? 1 : 0;
|
|
331
|
+
setTimeout(() => process.exit(exitCode), 10);
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
console.error("\n❌ Error:", error instanceof Error ? error.message : String(error));
|
|
335
|
+
if (error instanceof Error && error.stack && process.env.DEBUG) {
|
|
336
|
+
console.error("\nStack trace:");
|
|
337
|
+
console.error(error.stack);
|
|
338
|
+
}
|
|
339
|
+
setTimeout(() => process.exit(1), 10);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
main();
|
package/cli/build/cli.js
CHANGED
|
@@ -46,6 +46,10 @@ async function runWebClient(args) {
|
|
|
46
46
|
if (args.serverUrl) {
|
|
47
47
|
startArgs.push("--server-url", args.serverUrl);
|
|
48
48
|
}
|
|
49
|
+
// Pass Claude Code flag if enabled
|
|
50
|
+
if (args.claudeEnabled) {
|
|
51
|
+
startArgs.push("--claude-enabled");
|
|
52
|
+
}
|
|
49
53
|
// Pass command and args (using -- to separate them)
|
|
50
54
|
if (args.command) {
|
|
51
55
|
startArgs.push("--", args.command, ...args.args);
|
|
@@ -171,7 +175,8 @@ function parseArgs() {
|
|
|
171
175
|
.option("--cli", "enable CLI mode")
|
|
172
176
|
.option("--transport <type>", "transport type (stdio, sse, http)")
|
|
173
177
|
.option("--server-url <url>", "server URL for SSE/HTTP transport")
|
|
174
|
-
.option("--header <headers...>", 'HTTP headers as "HeaderName: Value" pairs (for HTTP/SSE transports)', parseHeaderPair, {})
|
|
178
|
+
.option("--header <headers...>", 'HTTP headers as "HeaderName: Value" pairs (for HTTP/SSE transports)', parseHeaderPair, {})
|
|
179
|
+
.option("--claude-enabled", "enable Claude Code integration for intelligent analysis (requires Claude CLI)");
|
|
175
180
|
// Parse only the arguments before --
|
|
176
181
|
program.parse(preArgs);
|
|
177
182
|
const options = program.opts();
|
|
@@ -214,6 +219,7 @@ function parseArgs() {
|
|
|
214
219
|
cli: options.cli || false,
|
|
215
220
|
transport: "stdio",
|
|
216
221
|
headers: options.header,
|
|
222
|
+
claudeEnabled: options.claudeEnabled || false,
|
|
217
223
|
};
|
|
218
224
|
}
|
|
219
225
|
else if (config.type === "sse" || config.type === "streamable-http") {
|
|
@@ -225,6 +231,7 @@ function parseArgs() {
|
|
|
225
231
|
transport: config.type,
|
|
226
232
|
serverUrl: config.url,
|
|
227
233
|
headers: options.header,
|
|
234
|
+
claudeEnabled: options.claudeEnabled || false,
|
|
228
235
|
};
|
|
229
236
|
}
|
|
230
237
|
else {
|
|
@@ -236,6 +243,7 @@ function parseArgs() {
|
|
|
236
243
|
cli: options.cli || false,
|
|
237
244
|
transport: "stdio",
|
|
238
245
|
headers: options.header,
|
|
246
|
+
claudeEnabled: options.claudeEnabled || false,
|
|
239
247
|
};
|
|
240
248
|
}
|
|
241
249
|
}
|
|
@@ -255,6 +263,7 @@ function parseArgs() {
|
|
|
255
263
|
transport: transport,
|
|
256
264
|
serverUrl: options.serverUrl,
|
|
257
265
|
headers: options.header,
|
|
266
|
+
claudeEnabled: options.claudeEnabled || false,
|
|
258
267
|
};
|
|
259
268
|
}
|
|
260
269
|
async function main() {
|
|
@@ -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-nCPw6E-c.js";
|
|
2
2
|
const OAuthCallback = ({ onConnect }) => {
|
|
3
3
|
const { toast } = useToast();
|
|
4
4
|
const hasProcessedRef = reactExports.useRef(false);
|
package/client/dist/assets/{OAuthDebugCallback-DwA2sKy9.js → OAuthDebugCallback-CaIey8K_.js}
RENAMED
|
@@ -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-nCPw6E-c.js";
|
|
2
2
|
const OAuthDebugCallback = ({ onConnect }) => {
|
|
3
3
|
reactExports.useEffect(() => {
|
|
4
4
|
let isProcessed = false;
|
|
@@ -16279,7 +16279,7 @@ object({
|
|
|
16279
16279
|
token_type_hint: string().optional()
|
|
16280
16280
|
}).strip();
|
|
16281
16281
|
const name = "@bryan-thompson/inspector-assessment-client";
|
|
16282
|
-
const version$1 = "1.
|
|
16282
|
+
const version$1 = "1.7.0";
|
|
16283
16283
|
const packageJson = {
|
|
16284
16284
|
name,
|
|
16285
16285
|
version: version$1
|
|
@@ -48464,7 +48464,7 @@ const useTheme = () => {
|
|
|
48464
48464
|
[theme, setThemeWithSideEffect]
|
|
48465
48465
|
);
|
|
48466
48466
|
};
|
|
48467
|
-
const version = "1.
|
|
48467
|
+
const version = "1.7.0";
|
|
48468
48468
|
var [createTooltipContext] = createContextScope("Tooltip", [
|
|
48469
48469
|
createPopperScope
|
|
48470
48470
|
]);
|
|
@@ -60340,13 +60340,13 @@ const App = () => {
|
|
|
60340
60340
|
) });
|
|
60341
60341
|
if (window.location.pathname === "/oauth/callback") {
|
|
60342
60342
|
const OAuthCallback = React.lazy(
|
|
60343
|
-
() => __vitePreload(() => import("./OAuthCallback-
|
|
60343
|
+
() => __vitePreload(() => import("./OAuthCallback-Xo9zS7pv.js"), true ? [] : void 0)
|
|
60344
60344
|
);
|
|
60345
60345
|
return /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Loading..." }), children: /* @__PURE__ */ jsxRuntimeExports.jsx(OAuthCallback, { onConnect: onOAuthConnect }) });
|
|
60346
60346
|
}
|
|
60347
60347
|
if (window.location.pathname === "/oauth/callback/debug") {
|
|
60348
60348
|
const OAuthDebugCallback = React.lazy(
|
|
60349
|
-
() => __vitePreload(() => import("./OAuthDebugCallback-
|
|
60349
|
+
() => __vitePreload(() => import("./OAuthDebugCallback-CaIey8K_.js"), true ? [] : void 0)
|
|
60350
60350
|
);
|
|
60351
60351
|
return /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Loading..." }), children: /* @__PURE__ */ jsxRuntimeExports.jsx(OAuthDebugCallback, { onConnect: onOAuthDebugConnect }) });
|
|
60352
60352
|
}
|
package/client/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-nCPw6E-c.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-Bj7kEsw0.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|