Fixes to the formatting
This commit is contained in:
22
README.md
22
README.md
@@ -50,8 +50,8 @@ The MCP Inspector includes a proxy server that can run and communicate with loca
|
|||||||
|
|
||||||
The MCP Inspector supports the following configuration settings. To change them click on the `Configuration` button in the MCP Inspector UI:
|
The MCP Inspector supports the following configuration settings. To change them click on the `Configuration` button in the MCP Inspector UI:
|
||||||
|
|
||||||
| Name | Purpose | Default Value |
|
| Name | Purpose | Default Value |
|
||||||
| -------------------------- | --------------------------------------------------------------------------- | ------------- |
|
| -------------------------- | ----------------------------------------------------------------------------------------- | ------------- |
|
||||||
| MCP_SERVER_REQUEST_TIMEOUT | Maximum time in milliseconds to wait for a response from the MCP server before timing out | 10000 |
|
| MCP_SERVER_REQUEST_TIMEOUT | Maximum time in milliseconds to wait for a response from the MCP server before timing out | 10000 |
|
||||||
|
|
||||||
The inspector also supports configuration files to store settings for different MCP servers. This is useful when working with multiple servers or complex configurations:
|
The inspector also supports configuration files to store settings for different MCP servers. This is useful when working with multiple servers or complex configurations:
|
||||||
@@ -149,15 +149,15 @@ npx @modelcontextprotocol/inspector --cli https://my-mcp-server.example.com --me
|
|||||||
|
|
||||||
### UI Mode vs CLI Mode: When to Use Each
|
### UI Mode vs CLI Mode: When to Use Each
|
||||||
|
|
||||||
| Use Case | UI Mode | CLI Mode |
|
| Use Case | UI Mode | CLI Mode |
|
||||||
|----------|---------|----------|
|
| ------------------------ | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| **Server Development** | Visual interface for interactive testing and debugging during development | Scriptable commands for quick testing and continuous integration; creates feedback loops with AI coding assistants like Cursor for rapid development |
|
| **Server Development** | Visual interface for interactive testing and debugging during development | Scriptable commands for quick testing and continuous integration; creates feedback loops with AI coding assistants like Cursor for rapid development |
|
||||||
| **Resource Exploration** | Interactive browser with hierarchical navigation and JSON visualization | Programmatic listing and reading for automation and scripting |
|
| **Resource Exploration** | Interactive browser with hierarchical navigation and JSON visualization | Programmatic listing and reading for automation and scripting |
|
||||||
| **Tool Testing** | Form-based parameter input with real-time response visualization | Command-line tool execution with JSON output for scripting |
|
| **Tool Testing** | Form-based parameter input with real-time response visualization | Command-line tool execution with JSON output for scripting |
|
||||||
| **Prompt Engineering** | Interactive sampling with streaming responses and visual comparison | Batch processing of prompts with machine-readable output |
|
| **Prompt Engineering** | Interactive sampling with streaming responses and visual comparison | Batch processing of prompts with machine-readable output |
|
||||||
| **Debugging** | Request history, visualized errors, and real-time notifications | Direct JSON output for log analysis and integration with other tools |
|
| **Debugging** | Request history, visualized errors, and real-time notifications | Direct JSON output for log analysis and integration with other tools |
|
||||||
| **Automation** | N/A | Ideal for CI/CD pipelines, batch processing, and integration with coding assistants |
|
| **Automation** | N/A | Ideal for CI/CD pipelines, batch processing, and integration with coding assistants |
|
||||||
| **Learning MCP** | Rich visual interface helps new users understand server capabilities | Simplified commands for focused learning of specific endpoints |
|
| **Learning MCP** | Rich visual interface helps new users understand server capabilities | Simplified commands for focused learning of specific endpoints |
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ const colors = {
|
|||||||
RED: "\x1b[31m",
|
RED: "\x1b[31m",
|
||||||
BLUE: "\x1b[34m",
|
BLUE: "\x1b[34m",
|
||||||
ORANGE: "\x1b[33m",
|
ORANGE: "\x1b[33m",
|
||||||
NC: "\x1b[0m" // No Color
|
NC: "\x1b[0m", // No Color
|
||||||
};
|
};
|
||||||
|
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
@@ -26,16 +26,24 @@ let FAILED_TESTS = 0;
|
|||||||
let SKIPPED_TESTS = 0;
|
let SKIPPED_TESTS = 0;
|
||||||
let TOTAL_TESTS = 0;
|
let TOTAL_TESTS = 0;
|
||||||
|
|
||||||
console.log(`${colors.YELLOW}=== MCP Inspector CLI Test Script ===${colors.NC}`);
|
console.log(
|
||||||
console.log(`${colors.BLUE}This script tests the MCP Inspector CLI's ability to handle various command line options:${colors.NC}`);
|
`${colors.YELLOW}=== MCP Inspector CLI Test Script ===${colors.NC}`,
|
||||||
|
);
|
||||||
|
console.log(
|
||||||
|
`${colors.BLUE}This script tests the MCP Inspector CLI's ability to handle various command line options:${colors.NC}`,
|
||||||
|
);
|
||||||
console.log(`${colors.BLUE}- Basic CLI mode${colors.NC}`);
|
console.log(`${colors.BLUE}- Basic CLI mode${colors.NC}`);
|
||||||
console.log(`${colors.BLUE}- Environment variables (-e)${colors.NC}`);
|
console.log(`${colors.BLUE}- Environment variables (-e)${colors.NC}`);
|
||||||
console.log(`${colors.BLUE}- Config file (--config)${colors.NC}`);
|
console.log(`${colors.BLUE}- Config file (--config)${colors.NC}`);
|
||||||
console.log(`${colors.BLUE}- Server selection (--server)${colors.NC}`);
|
console.log(`${colors.BLUE}- Server selection (--server)${colors.NC}`);
|
||||||
console.log(`${colors.BLUE}- Method selection (--method)${colors.NC}`);
|
console.log(`${colors.BLUE}- Method selection (--method)${colors.NC}`);
|
||||||
console.log(`${colors.BLUE}- Tool-related options (--tool-name, --tool-arg)${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.BLUE}- Tool-related options (--tool-name, --tool-arg)${colors.NC}`,
|
||||||
|
);
|
||||||
console.log(`${colors.BLUE}- Resource-related options (--uri)${colors.NC}`);
|
console.log(`${colors.BLUE}- Resource-related options (--uri)${colors.NC}`);
|
||||||
console.log(`${colors.BLUE}- Prompt-related options (--prompt-name, --prompt-args)${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.BLUE}- Prompt-related options (--prompt-name, --prompt-args)${colors.NC}`,
|
||||||
|
);
|
||||||
console.log(`${colors.BLUE}- Logging options (--log-level)${colors.NC}`);
|
console.log(`${colors.BLUE}- Logging options (--log-level)${colors.NC}`);
|
||||||
console.log("");
|
console.log("");
|
||||||
|
|
||||||
@@ -45,7 +53,9 @@ const BIN_DIR = path.resolve(SCRIPTS_DIR, "..");
|
|||||||
const PROJECT_ROOT = path.resolve(BIN_DIR, "..");
|
const PROJECT_ROOT = path.resolve(BIN_DIR, "..");
|
||||||
|
|
||||||
// Compile bin and cli projects
|
// Compile bin and cli projects
|
||||||
console.log(`${colors.YELLOW}Compiling MCP Inspector bin and cli...${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.YELLOW}Compiling MCP Inspector bin and cli...${colors.NC}`,
|
||||||
|
);
|
||||||
try {
|
try {
|
||||||
process.chdir(BIN_DIR);
|
process.chdir(BIN_DIR);
|
||||||
execSync("npm run build", { stdio: "inherit" });
|
execSync("npm run build", { stdio: "inherit" });
|
||||||
@@ -53,7 +63,9 @@ try {
|
|||||||
execSync("npm run build", { stdio: "inherit" });
|
execSync("npm run build", { stdio: "inherit" });
|
||||||
process.chdir(BIN_DIR);
|
process.chdir(BIN_DIR);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`${colors.RED}Error during compilation: ${error.message}${colors.NC}`);
|
console.error(
|
||||||
|
`${colors.RED}Error during compilation: ${error.message}${colors.NC}`,
|
||||||
|
);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,22 +80,33 @@ if (!fs.existsSync(OUTPUT_DIR)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a temporary directory for test files
|
// Create a temporary directory for test files
|
||||||
const TEMP_DIR = fs.mkdirSync(path.join(os.tmpdir(), "mcp-inspector-tests-"), { recursive: true });
|
const TEMP_DIR = fs.mkdirSync(path.join(os.tmpdir(), "mcp-inspector-tests-"), {
|
||||||
|
recursive: true,
|
||||||
|
});
|
||||||
process.on("exit", () => {
|
process.on("exit", () => {
|
||||||
try {
|
try {
|
||||||
fs.rmSync(TEMP_DIR, { recursive: true, force: true });
|
fs.rmSync(TEMP_DIR, { recursive: true, force: true });
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(`${colors.RED}Failed to remove temp directory: ${err.message}${colors.NC}`);
|
console.error(
|
||||||
|
`${colors.RED}Failed to remove temp directory: ${err.message}${colors.NC}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Use the existing sample config file
|
// Use the existing sample config file
|
||||||
console.log(`${colors.BLUE}Using existing sample config file: ${PROJECT_ROOT}/sample-config.json${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.BLUE}Using existing sample config file: ${PROJECT_ROOT}/sample-config.json${colors.NC}`,
|
||||||
|
);
|
||||||
try {
|
try {
|
||||||
const sampleConfig = fs.readFileSync(path.join(PROJECT_ROOT, "sample-config.json"), "utf8");
|
const sampleConfig = fs.readFileSync(
|
||||||
|
path.join(PROJECT_ROOT, "sample-config.json"),
|
||||||
|
"utf8",
|
||||||
|
);
|
||||||
console.log(sampleConfig);
|
console.log(sampleConfig);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`${colors.RED}Error reading sample config: ${error.message}${colors.NC}`);
|
console.error(
|
||||||
|
`${colors.RED}Error reading sample config: ${error.message}${colors.NC}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create an invalid config file for testing
|
// Create an invalid config file for testing
|
||||||
@@ -92,13 +115,18 @@ fs.writeFileSync(invalidConfigPath, '{\n "mcpServers": {\n "invalid": {');
|
|||||||
|
|
||||||
// Function to run a basic test
|
// Function to run a basic test
|
||||||
async function runBasicTest(testName, ...args) {
|
async function runBasicTest(testName, ...args) {
|
||||||
const outputFile = path.join(OUTPUT_DIR, `${testName.replace(/\//g, "_")}.log`);
|
const outputFile = path.join(
|
||||||
|
OUTPUT_DIR,
|
||||||
|
`${testName.replace(/\//g, "_")}.log`,
|
||||||
|
);
|
||||||
|
|
||||||
console.log(`\n${colors.YELLOW}Testing: ${testName}${colors.NC}`);
|
console.log(`\n${colors.YELLOW}Testing: ${testName}${colors.NC}`);
|
||||||
TOTAL_TESTS++;
|
TOTAL_TESTS++;
|
||||||
|
|
||||||
// Run the command and capture output
|
// Run the command and capture output
|
||||||
console.log(`${colors.BLUE}Command: node ${BIN_DIR}/cli.js ${args.join(" ")}${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.BLUE}Command: node ${BIN_DIR}/cli.js ${args.join(" ")}${colors.NC}`,
|
||||||
|
);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Create a write stream for the output file
|
// Create a write stream for the output file
|
||||||
@@ -107,7 +135,7 @@ async function runBasicTest(testName, ...args) {
|
|||||||
// Spawn the process
|
// Spawn the process
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
const child = spawn("node", [path.join(BIN_DIR, "cli.js"), ...args], {
|
const child = spawn("node", [path.join(BIN_DIR, "cli.js"), ...args], {
|
||||||
stdio: ["ignore", "pipe", "pipe"]
|
stdio: ["ignore", "pipe", "pipe"],
|
||||||
});
|
});
|
||||||
|
|
||||||
// Pipe stdout and stderr to the output file
|
// Pipe stdout and stderr to the output file
|
||||||
@@ -129,24 +157,37 @@ async function runBasicTest(testName, ...args) {
|
|||||||
if (code === 0) {
|
if (code === 0) {
|
||||||
console.log(`${colors.GREEN}✓ Test passed: ${testName}${colors.NC}`);
|
console.log(`${colors.GREEN}✓ Test passed: ${testName}${colors.NC}`);
|
||||||
console.log(`${colors.BLUE}First few lines of output:${colors.NC}`);
|
console.log(`${colors.BLUE}First few lines of output:${colors.NC}`);
|
||||||
const firstFewLines = output.split("\n").slice(0, 5).map(line => ` ${line}`).join("\n");
|
const firstFewLines = output
|
||||||
|
.split("\n")
|
||||||
|
.slice(0, 5)
|
||||||
|
.map((line) => ` ${line}`)
|
||||||
|
.join("\n");
|
||||||
console.log(firstFewLines);
|
console.log(firstFewLines);
|
||||||
PASSED_TESTS++;
|
PASSED_TESTS++;
|
||||||
resolve(true);
|
resolve(true);
|
||||||
} else {
|
} else {
|
||||||
console.log(`${colors.RED}✗ Test failed: ${testName}${colors.NC}`);
|
console.log(`${colors.RED}✗ Test failed: ${testName}${colors.NC}`);
|
||||||
console.log(`${colors.RED}Error output:${colors.NC}`);
|
console.log(`${colors.RED}Error output:${colors.NC}`);
|
||||||
console.log(output.split("\n").map(line => ` ${line}`).join("\n"));
|
console.log(
|
||||||
|
output
|
||||||
|
.split("\n")
|
||||||
|
.map((line) => ` ${line}`)
|
||||||
|
.join("\n"),
|
||||||
|
);
|
||||||
FAILED_TESTS++;
|
FAILED_TESTS++;
|
||||||
|
|
||||||
// Stop after any error is encountered
|
// Stop after any error is encountered
|
||||||
console.log(`${colors.YELLOW}Stopping tests due to error. Please validate and fix before continuing.${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.YELLOW}Stopping tests due to error. Please validate and fix before continuing.${colors.NC}`,
|
||||||
|
);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`${colors.RED}Error running test: ${error.message}${colors.NC}`);
|
console.error(
|
||||||
|
`${colors.RED}Error running test: ${error.message}${colors.NC}`,
|
||||||
|
);
|
||||||
FAILED_TESTS++;
|
FAILED_TESTS++;
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
@@ -154,13 +195,18 @@ async function runBasicTest(testName, ...args) {
|
|||||||
|
|
||||||
// Function to run an error test (expected to fail)
|
// Function to run an error test (expected to fail)
|
||||||
async function runErrorTest(testName, ...args) {
|
async function runErrorTest(testName, ...args) {
|
||||||
const outputFile = path.join(OUTPUT_DIR, `${testName.replace(/\//g, "_")}.log`);
|
const outputFile = path.join(
|
||||||
|
OUTPUT_DIR,
|
||||||
|
`${testName.replace(/\//g, "_")}.log`,
|
||||||
|
);
|
||||||
|
|
||||||
console.log(`\n${colors.YELLOW}Testing error case: ${testName}${colors.NC}`);
|
console.log(`\n${colors.YELLOW}Testing error case: ${testName}${colors.NC}`);
|
||||||
TOTAL_TESTS++;
|
TOTAL_TESTS++;
|
||||||
|
|
||||||
// Run the command and capture output
|
// Run the command and capture output
|
||||||
console.log(`${colors.BLUE}Command: node ${BIN_DIR}/cli.js ${args.join(" ")}${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.BLUE}Command: node ${BIN_DIR}/cli.js ${args.join(" ")}${colors.NC}`,
|
||||||
|
);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Create a write stream for the output file
|
// Create a write stream for the output file
|
||||||
@@ -169,7 +215,7 @@ async function runErrorTest(testName, ...args) {
|
|||||||
// Spawn the process
|
// Spawn the process
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
const child = spawn("node", [path.join(BIN_DIR, "cli.js"), ...args], {
|
const child = spawn("node", [path.join(BIN_DIR, "cli.js"), ...args], {
|
||||||
stdio: ["ignore", "pipe", "pipe"]
|
stdio: ["ignore", "pipe", "pipe"],
|
||||||
});
|
});
|
||||||
|
|
||||||
// Pipe stdout and stderr to the output file
|
// Pipe stdout and stderr to the output file
|
||||||
@@ -190,26 +236,43 @@ async function runErrorTest(testName, ...args) {
|
|||||||
|
|
||||||
// For error tests, we expect a non-zero exit code
|
// For error tests, we expect a non-zero exit code
|
||||||
if (code !== 0) {
|
if (code !== 0) {
|
||||||
console.log(`${colors.GREEN}✓ Error test passed: ${testName}${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.GREEN}✓ Error test passed: ${testName}${colors.NC}`,
|
||||||
|
);
|
||||||
console.log(`${colors.BLUE}Error output (expected):${colors.NC}`);
|
console.log(`${colors.BLUE}Error output (expected):${colors.NC}`);
|
||||||
const firstFewLines = output.split("\n").slice(0, 5).map(line => ` ${line}`).join("\n");
|
const firstFewLines = output
|
||||||
|
.split("\n")
|
||||||
|
.slice(0, 5)
|
||||||
|
.map((line) => ` ${line}`)
|
||||||
|
.join("\n");
|
||||||
console.log(firstFewLines);
|
console.log(firstFewLines);
|
||||||
PASSED_TESTS++;
|
PASSED_TESTS++;
|
||||||
resolve(true);
|
resolve(true);
|
||||||
} else {
|
} else {
|
||||||
console.log(`${colors.RED}✗ Error test failed: ${testName} (expected error but got success)${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.RED}✗ Error test failed: ${testName} (expected error but got success)${colors.NC}`,
|
||||||
|
);
|
||||||
console.log(`${colors.RED}Output:${colors.NC}`);
|
console.log(`${colors.RED}Output:${colors.NC}`);
|
||||||
console.log(output.split("\n").map(line => ` ${line}`).join("\n"));
|
console.log(
|
||||||
|
output
|
||||||
|
.split("\n")
|
||||||
|
.map((line) => ` ${line}`)
|
||||||
|
.join("\n"),
|
||||||
|
);
|
||||||
FAILED_TESTS++;
|
FAILED_TESTS++;
|
||||||
|
|
||||||
// Stop after any error is encountered
|
// Stop after any error is encountered
|
||||||
console.log(`${colors.YELLOW}Stopping tests due to error. Please validate and fix before continuing.${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.YELLOW}Stopping tests due to error. Please validate and fix before continuing.${colors.NC}`,
|
||||||
|
);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`${colors.RED}Error running test: ${error.message}${colors.NC}`);
|
console.error(
|
||||||
|
`${colors.RED}Error running test: ${error.message}${colors.NC}`,
|
||||||
|
);
|
||||||
FAILED_TESTS++;
|
FAILED_TESTS++;
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
@@ -217,96 +280,329 @@ async function runErrorTest(testName, ...args) {
|
|||||||
|
|
||||||
// Run all tests
|
// Run all tests
|
||||||
async function runTests() {
|
async function runTests() {
|
||||||
console.log(`\n${colors.YELLOW}=== Running Basic CLI Mode Tests ===${colors.NC}`);
|
console.log(
|
||||||
|
`\n${colors.YELLOW}=== Running Basic CLI Mode Tests ===${colors.NC}`,
|
||||||
|
);
|
||||||
|
|
||||||
// Test 1: Basic CLI mode with method
|
// Test 1: Basic CLI mode with method
|
||||||
await runBasicTest("basic_cli_mode", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "tools/list");
|
await runBasicTest(
|
||||||
|
"basic_cli_mode",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/list",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 2: CLI mode with non-existent method (should fail)
|
// Test 2: CLI mode with non-existent method (should fail)
|
||||||
await runErrorTest("nonexistent_method", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "nonexistent/method");
|
await runErrorTest(
|
||||||
|
"nonexistent_method",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"nonexistent/method",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 3: CLI mode without method (should fail)
|
// Test 3: CLI mode without method (should fail)
|
||||||
await runErrorTest("missing_method", TEST_CMD, ...TEST_ARGS, "--cli");
|
await runErrorTest("missing_method", TEST_CMD, ...TEST_ARGS, "--cli");
|
||||||
|
|
||||||
console.log(`\n${colors.YELLOW}=== Running Environment Variable Tests ===${colors.NC}`);
|
console.log(
|
||||||
|
`\n${colors.YELLOW}=== Running Environment Variable Tests ===${colors.NC}`,
|
||||||
|
);
|
||||||
|
|
||||||
// Test 4: CLI mode with environment variables
|
// Test 4: CLI mode with environment variables
|
||||||
await runBasicTest("env_variables", TEST_CMD, ...TEST_ARGS, "-e", "KEY1=value1", "-e", "KEY2=value2", "--cli", "--method", "tools/list");
|
await runBasicTest(
|
||||||
|
"env_variables",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"-e",
|
||||||
|
"KEY1=value1",
|
||||||
|
"-e",
|
||||||
|
"KEY2=value2",
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/list",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 5: CLI mode with invalid environment variable format (should fail)
|
// Test 5: CLI mode with invalid environment variable format (should fail)
|
||||||
await runErrorTest("invalid_env_format", TEST_CMD, ...TEST_ARGS, "-e", "INVALID_FORMAT", "--cli", "--method", "tools/list");
|
await runErrorTest(
|
||||||
|
"invalid_env_format",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"-e",
|
||||||
|
"INVALID_FORMAT",
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/list",
|
||||||
|
);
|
||||||
|
|
||||||
console.log(`\n${colors.YELLOW}=== Running Config File Tests ===${colors.NC}`);
|
console.log(
|
||||||
|
`\n${colors.YELLOW}=== Running Config File Tests ===${colors.NC}`,
|
||||||
|
);
|
||||||
|
|
||||||
// Test 6: Using config file with CLI mode
|
// Test 6: Using config file with CLI mode
|
||||||
await runBasicTest("config_file", "--config", path.join(PROJECT_ROOT, "sample-config.json"), "--server", "everything", "--cli", "--method", "tools/list");
|
await runBasicTest(
|
||||||
|
"config_file",
|
||||||
|
"--config",
|
||||||
|
path.join(PROJECT_ROOT, "sample-config.json"),
|
||||||
|
"--server",
|
||||||
|
"everything",
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/list",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 7: Using config file without server name (should fail)
|
// Test 7: Using config file without server name (should fail)
|
||||||
await runErrorTest("config_without_server", "--config", path.join(PROJECT_ROOT, "sample-config.json"), "--cli", "--method", "tools/list");
|
await runErrorTest(
|
||||||
|
"config_without_server",
|
||||||
|
"--config",
|
||||||
|
path.join(PROJECT_ROOT, "sample-config.json"),
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/list",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 8: Using server name without config file (should fail)
|
// Test 8: Using server name without config file (should fail)
|
||||||
await runErrorTest("server_without_config", "--server", "everything", "--cli", "--method", "tools/list");
|
await runErrorTest(
|
||||||
|
"server_without_config",
|
||||||
|
"--server",
|
||||||
|
"everything",
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/list",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 9: Using non-existent config file (should fail)
|
// Test 9: Using non-existent config file (should fail)
|
||||||
await runErrorTest("nonexistent_config", "--config", "./nonexistent-config.json", "--server", "everything", "--cli", "--method", "tools/list");
|
await runErrorTest(
|
||||||
|
"nonexistent_config",
|
||||||
|
"--config",
|
||||||
|
"./nonexistent-config.json",
|
||||||
|
"--server",
|
||||||
|
"everything",
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/list",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 10: Using invalid config file format (should fail)
|
// Test 10: Using invalid config file format (should fail)
|
||||||
await runErrorTest("invalid_config", "--config", invalidConfigPath, "--server", "everything", "--cli", "--method", "tools/list");
|
await runErrorTest(
|
||||||
|
"invalid_config",
|
||||||
|
"--config",
|
||||||
|
invalidConfigPath,
|
||||||
|
"--server",
|
||||||
|
"everything",
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/list",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 11: Using config file with non-existent server (should fail)
|
// Test 11: Using config file with non-existent server (should fail)
|
||||||
await runErrorTest("nonexistent_server", "--config", path.join(PROJECT_ROOT, "sample-config.json"), "--server", "nonexistent", "--cli", "--method", "tools/list");
|
await runErrorTest(
|
||||||
|
"nonexistent_server",
|
||||||
|
"--config",
|
||||||
|
path.join(PROJECT_ROOT, "sample-config.json"),
|
||||||
|
"--server",
|
||||||
|
"nonexistent",
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/list",
|
||||||
|
);
|
||||||
|
|
||||||
console.log(`\n${colors.YELLOW}=== Running Tool-Related Tests ===${colors.NC}`);
|
console.log(
|
||||||
|
`\n${colors.YELLOW}=== Running Tool-Related Tests ===${colors.NC}`,
|
||||||
|
);
|
||||||
|
|
||||||
// Test 12: CLI mode with tool call
|
// Test 12: CLI mode with tool call
|
||||||
await runBasicTest("tool_call", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "tools/call", "--tool-name", "echo", "--tool-arg", "message=Hello");
|
await runBasicTest(
|
||||||
|
"tool_call",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/call",
|
||||||
|
"--tool-name",
|
||||||
|
"echo",
|
||||||
|
"--tool-arg",
|
||||||
|
"message=Hello",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 13: CLI mode with tool call but missing tool name (should fail)
|
// Test 13: CLI mode with tool call but missing tool name (should fail)
|
||||||
await runErrorTest("missing_tool_name", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "tools/call", "--tool-arg", "message=Hello");
|
await runErrorTest(
|
||||||
|
"missing_tool_name",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/call",
|
||||||
|
"--tool-arg",
|
||||||
|
"message=Hello",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 14: CLI mode with tool call but invalid tool args format (should fail)
|
// Test 14: CLI mode with tool call but invalid tool args format (should fail)
|
||||||
await runErrorTest("invalid_tool_args", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "tools/call", "--tool-name", "echo", "--tool-arg", "invalid_format");
|
await runErrorTest(
|
||||||
|
"invalid_tool_args",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/call",
|
||||||
|
"--tool-name",
|
||||||
|
"echo",
|
||||||
|
"--tool-arg",
|
||||||
|
"invalid_format",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 15: CLI mode with multiple tool args
|
// Test 15: CLI mode with multiple tool args
|
||||||
await runBasicTest("multiple_tool_args", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "tools/call", "--tool-name", "add", "--tool-arg", "a=1", "b=2");
|
await runBasicTest(
|
||||||
|
"multiple_tool_args",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/call",
|
||||||
|
"--tool-name",
|
||||||
|
"add",
|
||||||
|
"--tool-arg",
|
||||||
|
"a=1",
|
||||||
|
"b=2",
|
||||||
|
);
|
||||||
|
|
||||||
console.log(`\n${colors.YELLOW}=== Running Resource-Related Tests ===${colors.NC}`);
|
console.log(
|
||||||
|
`\n${colors.YELLOW}=== Running Resource-Related Tests ===${colors.NC}`,
|
||||||
|
);
|
||||||
|
|
||||||
// Test 16: CLI mode with resource read
|
// Test 16: CLI mode with resource read
|
||||||
await runBasicTest("resource_read", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "resources/read", "--uri", "test://static/resource/1");
|
await runBasicTest(
|
||||||
|
"resource_read",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"resources/read",
|
||||||
|
"--uri",
|
||||||
|
"test://static/resource/1",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 17: CLI mode with resource read but missing URI (should fail)
|
// Test 17: CLI mode with resource read but missing URI (should fail)
|
||||||
await runErrorTest("missing_uri", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "resources/read");
|
await runErrorTest(
|
||||||
|
"missing_uri",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"resources/read",
|
||||||
|
);
|
||||||
|
|
||||||
console.log(`\n${colors.YELLOW}=== Running Prompt-Related Tests ===${colors.NC}`);
|
console.log(
|
||||||
|
`\n${colors.YELLOW}=== Running Prompt-Related Tests ===${colors.NC}`,
|
||||||
|
);
|
||||||
|
|
||||||
// Test 18: CLI mode with prompt get
|
// Test 18: CLI mode with prompt get
|
||||||
await runBasicTest("prompt_get", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "prompts/get", "--prompt-name", "simple_prompt");
|
await runBasicTest(
|
||||||
|
"prompt_get",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"prompts/get",
|
||||||
|
"--prompt-name",
|
||||||
|
"simple_prompt",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 19: CLI mode with prompt get and args
|
// Test 19: CLI mode with prompt get and args
|
||||||
await runBasicTest("prompt_get_with_args", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "prompts/get", "--prompt-name", "complex_prompt", "--prompt-args", "temperature=0.7", "style=concise");
|
await runBasicTest(
|
||||||
|
"prompt_get_with_args",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"prompts/get",
|
||||||
|
"--prompt-name",
|
||||||
|
"complex_prompt",
|
||||||
|
"--prompt-args",
|
||||||
|
"temperature=0.7",
|
||||||
|
"style=concise",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 20: CLI mode with prompt get but missing prompt name (should fail)
|
// Test 20: CLI mode with prompt get but missing prompt name (should fail)
|
||||||
await runErrorTest("missing_prompt_name", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "prompts/get");
|
await runErrorTest(
|
||||||
|
"missing_prompt_name",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"prompts/get",
|
||||||
|
);
|
||||||
|
|
||||||
console.log(`\n${colors.YELLOW}=== Running Logging Tests ===${colors.NC}`);
|
console.log(`\n${colors.YELLOW}=== Running Logging Tests ===${colors.NC}`);
|
||||||
|
|
||||||
// Test 21: CLI mode with log level
|
// Test 21: CLI mode with log level
|
||||||
await runBasicTest("log_level", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "logging/setLevel", "--log-level", "debug");
|
await runBasicTest(
|
||||||
|
"log_level",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"logging/setLevel",
|
||||||
|
"--log-level",
|
||||||
|
"debug",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 22: CLI mode with invalid log level (should fail)
|
// Test 22: CLI mode with invalid log level (should fail)
|
||||||
await runErrorTest("invalid_log_level", TEST_CMD, ...TEST_ARGS, "--cli", "--method", "logging/setLevel", "--log-level", "invalid");
|
await runErrorTest(
|
||||||
|
"invalid_log_level",
|
||||||
|
TEST_CMD,
|
||||||
|
...TEST_ARGS,
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"logging/setLevel",
|
||||||
|
"--log-level",
|
||||||
|
"invalid",
|
||||||
|
);
|
||||||
|
|
||||||
console.log(`\n${colors.YELLOW}=== Running Combined Option Tests ===${colors.NC}`);
|
console.log(
|
||||||
|
`\n${colors.YELLOW}=== Running Combined Option Tests ===${colors.NC}`,
|
||||||
|
);
|
||||||
|
|
||||||
// Note about the combined options issue
|
// Note about the combined options issue
|
||||||
console.log(`${colors.BLUE}Testing combined options with environment variables and config file.${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.BLUE}Testing combined options with environment variables and config file.${colors.NC}`,
|
||||||
|
);
|
||||||
|
|
||||||
// Test 23: CLI mode with config file, environment variables, and tool call
|
// Test 23: CLI mode with config file, environment variables, and tool call
|
||||||
await runBasicTest("combined_options", "--config", path.join(PROJECT_ROOT, "sample-config.json"), "--server", "everything", "-e", "CLI_ENV_VAR=cli_value", "--cli", "--method", "tools/list");
|
await runBasicTest(
|
||||||
|
"combined_options",
|
||||||
|
"--config",
|
||||||
|
path.join(PROJECT_ROOT, "sample-config.json"),
|
||||||
|
"--server",
|
||||||
|
"everything",
|
||||||
|
"-e",
|
||||||
|
"CLI_ENV_VAR=cli_value",
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/list",
|
||||||
|
);
|
||||||
|
|
||||||
// Test 24: CLI mode with all possible options (that make sense together)
|
// Test 24: CLI mode with all possible options (that make sense together)
|
||||||
await runBasicTest("all_options", "--config", path.join(PROJECT_ROOT, "sample-config.json"), "--server", "everything", "-e", "CLI_ENV_VAR=cli_value", "--cli", "--method", "tools/call", "--tool-name", "echo", "--tool-arg", "message=Hello", "--log-level", "debug");
|
await runBasicTest(
|
||||||
|
"all_options",
|
||||||
|
"--config",
|
||||||
|
path.join(PROJECT_ROOT, "sample-config.json"),
|
||||||
|
"--server",
|
||||||
|
"everything",
|
||||||
|
"-e",
|
||||||
|
"CLI_ENV_VAR=cli_value",
|
||||||
|
"--cli",
|
||||||
|
"--method",
|
||||||
|
"tools/call",
|
||||||
|
"--tool-name",
|
||||||
|
"echo",
|
||||||
|
"--tool-arg",
|
||||||
|
"message=Hello",
|
||||||
|
"--log-level",
|
||||||
|
"debug",
|
||||||
|
);
|
||||||
|
|
||||||
// Print test summary
|
// Print test summary
|
||||||
console.log(`\n${colors.YELLOW}=== Test Summary ===${colors.NC}`);
|
console.log(`\n${colors.YELLOW}=== Test Summary ===${colors.NC}`);
|
||||||
@@ -314,13 +610,17 @@ async function runTests() {
|
|||||||
console.log(`${colors.RED}Failed: ${FAILED_TESTS}${colors.NC}`);
|
console.log(`${colors.RED}Failed: ${FAILED_TESTS}${colors.NC}`);
|
||||||
console.log(`${colors.ORANGE}Skipped: ${SKIPPED_TESTS}${colors.NC}`);
|
console.log(`${colors.ORANGE}Skipped: ${SKIPPED_TESTS}${colors.NC}`);
|
||||||
console.log(`Total: ${TOTAL_TESTS}`);
|
console.log(`Total: ${TOTAL_TESTS}`);
|
||||||
console.log(`${colors.BLUE}Detailed logs saved to: ${OUTPUT_DIR}${colors.NC}`);
|
console.log(
|
||||||
|
`${colors.BLUE}Detailed logs saved to: ${OUTPUT_DIR}${colors.NC}`,
|
||||||
|
);
|
||||||
|
|
||||||
console.log(`\n${colors.GREEN}All tests completed!${colors.NC}`);
|
console.log(`\n${colors.GREEN}All tests completed!${colors.NC}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run all tests
|
// Run all tests
|
||||||
runTests().catch(error => {
|
runTests().catch((error) => {
|
||||||
console.error(`${colors.RED}Tests failed with error: ${error.message}${colors.NC}`);
|
console.error(
|
||||||
|
`${colors.RED}Tests failed with error: ${error.message}${colors.NC}`,
|
||||||
|
);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
});
|
||||||
16
package-lock.json
generated
16
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@modelcontextprotocol/inspector",
|
"name": "@modelcontextprotocol/inspector",
|
||||||
"version": "0.5.1",
|
"version": "0.7.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@modelcontextprotocol/inspector",
|
"name": "@modelcontextprotocol/inspector",
|
||||||
"version": "0.5.1",
|
"version": "0.7.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"client",
|
"client",
|
||||||
@@ -15,10 +15,10 @@
|
|||||||
"bin"
|
"bin"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@modelcontextprotocol/inspector-bin": "0.5.1",
|
"@modelcontextprotocol/inspector-bin": "0.7.0",
|
||||||
"@modelcontextprotocol/inspector-cli": "0.5.1",
|
"@modelcontextprotocol/inspector-cli": "0.7.0",
|
||||||
"@modelcontextprotocol/inspector-client": "0.5.1",
|
"@modelcontextprotocol/inspector-client": "0.7.0",
|
||||||
"@modelcontextprotocol/inspector-server": "0.5.1",
|
"@modelcontextprotocol/inspector-server": "0.7.0",
|
||||||
"@modelcontextprotocol/sdk": "^1.6.1",
|
"@modelcontextprotocol/sdk": "^1.6.1",
|
||||||
"commander": "^13.1.0",
|
"commander": "^13.1.0",
|
||||||
"concurrently": "^9.0.1",
|
"concurrently": "^9.0.1",
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"name": "@modelcontextprotocol/inspector-bin",
|
"name": "@modelcontextprotocol/inspector-bin",
|
||||||
"version": "0.5.1",
|
"version": "0.7.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
"mcp-inspector": "cli.js"
|
"mcp-inspector": "cli.js"
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
},
|
},
|
||||||
"cli": {
|
"cli": {
|
||||||
"name": "@modelcontextprotocol/inspector-cli",
|
"name": "@modelcontextprotocol/inspector-cli",
|
||||||
"version": "0.5.1",
|
"version": "0.7.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"commander": "^13.1.0",
|
"commander": "^13.1.0",
|
||||||
|
|||||||
Reference in New Issue
Block a user