Add CLI and config file support

This commit is contained in:
Nicolas Barraud
2025-03-10 20:19:23 -04:00
parent 0870a81990
commit 4c4c8a0884
20 changed files with 1456 additions and 57 deletions

231
bin/tests/cli-tests.sh Executable file
View File

@@ -0,0 +1,231 @@
#!/bin/bash
# Colors for output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
ORANGE='\033[0;33m'
NC='\033[0m' # No Color
# Track test results
PASSED_TESTS=0
FAILED_TESTS=0
SKIPPED_TESTS=0
TOTAL_TESTS=0
echo -e "${YELLOW}=== MCP Inspector CLI Test Script ===${NC}"
echo -e "${BLUE}This script tests the MCP Inspector CLI's ability to handle various command line options:${NC}"
echo -e "${BLUE}- Basic CLI mode${NC}"
echo -e "${BLUE}- Environment variables (-e)${NC}"
echo -e "${BLUE}- Config file (--config)${NC}"
echo -e "${BLUE}- Server selection (--server)${NC}"
echo -e "${BLUE}- Method selection (--method)${NC}"
echo -e "${BLUE}- Tool-related options (--tool-name, --tool-args)${NC}"
echo -e "${BLUE}- Resource-related options (--uri)${NC}"
echo -e "${BLUE}- Prompt-related options (--prompt-name, --prompt-args)${NC}"
echo -e "${BLUE}- Logging options (--log-level)${NC}"
echo ""
# Change to the bin directory
cd "$(dirname "$0")/.."
BIN_DIR="$(pwd)"
PROJECT_ROOT="$(dirname "$BIN_DIR")"
# Compile bin and cli projects
echo -e "${YELLOW}Compiling MCP Inspector bin and cli...${NC}"
cd "$BIN_DIR"
npm run build
cd "$PROJECT_ROOT/cli"
npm run build
cd "$BIN_DIR"
# Create a symbolic link to handle path resolution
echo -e "${YELLOW}Setting up environment for tests...${NC}"
PARENT_DIR="$(dirname "$PROJECT_ROOT")"
# Define the test server command using npx
TEST_CMD="npx"
TEST_ARGS=("@modelcontextprotocol/server-everything")
# Create output directory for test results
OUTPUT_DIR="$BIN_DIR/tests/output"
mkdir -p "$OUTPUT_DIR"
# Create a temporary directory for test files
TEMP_DIR=$(mktemp -d)
trap 'rm -rf "$TEMP_DIR"' EXIT INT TERM
# Use the existing sample config file
echo -e "${BLUE}Using existing sample config file: $PROJECT_ROOT/sample-config.json${NC}"
cat "$PROJECT_ROOT/sample-config.json"
# Create an invalid config file for testing
echo '{
"mcpServers": {
"invalid": {' > "$TEMP_DIR/invalid-config.json"
# Function to run a basic test
run_basic_test() {
local test_name=$1
local output_file="$OUTPUT_DIR/${test_name//\//_}.log"
shift
echo -e "\n${YELLOW}Testing: ${test_name}${NC}"
TOTAL_TESTS=$((TOTAL_TESTS + 1))
# Run the command and capture output
echo -e "${BLUE}Command: node ${BIN_DIR}/cli.js $*${NC}"
node "$BIN_DIR/cli.js" "$@" > "$output_file" 2>&1
local exit_code=$?
# Check if the test passed or failed
if [ $exit_code -eq 0 ]; then
echo -e "${GREEN}✓ Test passed: ${test_name}${NC}"
echo -e "${BLUE}First few lines of output:${NC}"
head -n 5 "$output_file" | sed 's/^/ /'
PASSED_TESTS=$((PASSED_TESTS + 1))
else
echo -e "${RED}✗ Test failed: ${test_name}${NC}"
echo -e "${RED}Error output:${NC}"
cat "$output_file" | sed 's/^/ /'
FAILED_TESTS=$((FAILED_TESTS + 1))
# Stop after any error is encountered
echo -e "${YELLOW}Stopping tests due to error. Please validate and fix before continuing.${NC}"
exit 1
fi
}
# Function to run an error test (expected to fail)
run_error_test() {
local test_name=$1
local output_file="$OUTPUT_DIR/${test_name//\//_}.log"
shift
echo -e "\n${YELLOW}Testing error case: ${test_name}${NC}"
TOTAL_TESTS=$((TOTAL_TESTS + 1))
# Run the command and capture output
echo -e "${BLUE}Command: node ${BIN_DIR}/cli.js $*${NC}"
node "$BIN_DIR/cli.js" "$@" > "$output_file" 2>&1
local exit_code=$?
# For error tests, we expect a non-zero exit code
if [ $exit_code -ne 0 ]; then
echo -e "${GREEN}✓ Error test passed: ${test_name}${NC}"
echo -e "${BLUE}Error output (expected):${NC}"
head -n 5 "$output_file" | sed 's/^/ /'
PASSED_TESTS=$((PASSED_TESTS + 1))
else
echo -e "${RED}✗ Error test failed: ${test_name} (expected error but got success)${NC}"
echo -e "${RED}Output:${NC}"
cat "$output_file" | sed 's/^/ /'
FAILED_TESTS=$((FAILED_TESTS + 1))
# Stop after any error is encountered
echo -e "${YELLOW}Stopping tests due to error. Please validate and fix before continuing.${NC}"
exit 1
fi
}
echo -e "\n${YELLOW}=== Running Basic CLI Mode Tests ===${NC}"
# Test 1: Basic CLI mode with method
run_basic_test "basic_cli_mode" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "tools/list"
# Test 2: CLI mode with non-existent method (should fail)
run_error_test "nonexistent_method" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "nonexistent/method"
# Test 3: CLI mode without method (should fail)
run_error_test "missing_method" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli"
echo -e "\n${YELLOW}=== Running Environment Variable Tests ===${NC}"
# Test 4: CLI mode with environment variables
run_basic_test "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)
run_error_test "invalid_env_format" "${TEST_CMD}" "${TEST_ARGS[@]}" "-e" "INVALID_FORMAT" "--cli" "--method" "tools/list"
echo -e "\n${YELLOW}=== Running Config File Tests ===${NC}"
# Test 6: Using config file with CLI mode
run_basic_test "config_file" "--config" "$PROJECT_ROOT/sample-config.json" "--server" "everything" "--cli" "--method" "tools/list"
# Test 7: Using config file without server name (should fail)
run_error_test "config_without_server" "--config" "$PROJECT_ROOT/sample-config.json" "--cli" "--method" "tools/list"
# Test 8: Using server name without config file (should fail)
run_error_test "server_without_config" "--server" "everything" "--cli" "--method" "tools/list"
# Test 9: Using non-existent config file (should fail)
run_error_test "nonexistent_config" "--config" "./nonexistent-config.json" "--server" "everything" "--cli" "--method" "tools/list"
# Test 10: Using invalid config file format (should fail)
run_error_test "invalid_config" "--config" "$TEMP_DIR/invalid-config.json" "--server" "everything" "--cli" "--method" "tools/list"
# Test 11: Using config file with non-existent server (should fail)
run_error_test "nonexistent_server" "--config" "$PROJECT_ROOT/sample-config.json" "--server" "nonexistent" "--cli" "--method" "tools/list"
echo -e "\n${YELLOW}=== Running Tool-Related Tests ===${NC}"
# Test 12: CLI mode with tool call
run_basic_test "tool_call" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "tools/call" "--tool-name" "echo" "--tool-args" "message=Hello"
# Test 13: CLI mode with tool call but missing tool name (should fail)
run_error_test "missing_tool_name" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "tools/call" "--tool-args" "message=Hello"
# Test 14: CLI mode with tool call but invalid tool args format (should fail)
run_error_test "invalid_tool_args" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "tools/call" "--tool-name" "echo" "--tool-args" "invalid_format"
# Test 15: CLI mode with multiple tool args
run_basic_test "multiple_tool_args" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "tools/call" "--tool-name" "add" "--tool-args" "a=1" "b=2"
echo -e "\n${YELLOW}=== Running Resource-Related Tests ===${NC}"
# Test 16: CLI mode with resource read
run_basic_test "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)
run_error_test "missing_uri" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "resources/read"
echo -e "\n${YELLOW}=== Running Prompt-Related Tests ===${NC}"
# Test 18: CLI mode with prompt get
run_basic_test "prompt_get" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "prompts/get" "--prompt-name" "simple_prompt"
# Test 19: CLI mode with prompt get and args
run_basic_test "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)
run_error_test "missing_prompt_name" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "prompts/get"
echo -e "\n${YELLOW}=== Running Logging Tests ===${NC}"
# Test 21: CLI mode with log level
run_basic_test "log_level" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "logging/setLevel" "--log-level" "debug"
# Test 22: CLI mode with invalid log level (should fail)
run_error_test "invalid_log_level" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "logging/setLevel" "--log-level" "invalid"
echo -e "\n${YELLOW}=== Running Combined Option Tests ===${NC}"
# Note about the combined options issue
echo -e "${BLUE}Testing combined options with environment variables and config file.${NC}"
# Test 23: CLI mode with config file, environment variables, and tool call
run_basic_test "combined_options" "--config" "$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)
run_basic_test "all_options" "--config" "$PROJECT_ROOT/sample-config.json" "--server" "everything" "-e" "CLI_ENV_VAR=cli_value" "--cli" "--method" "tools/call" "--tool-name" "echo" "--tool-args" "message=Hello" "--log-level" "debug"
# Print test summary
echo -e "\n${YELLOW}=== Test Summary ===${NC}"
echo -e "${GREEN}Passed: $PASSED_TESTS${NC}"
echo -e "${RED}Failed: $FAILED_TESTS${NC}"
echo -e "${ORANGE}Skipped: $SKIPPED_TESTS${NC}"
echo -e "Total: $TOTAL_TESTS"
echo -e "${BLUE}Detailed logs saved to: $OUTPUT_DIR${NC}"
echo -e "\n${GREEN}All tests completed!${NC}"