{
  "generatedBy": "bench.mjs",
  "startedAt": "2026-10-02T11:08:21.582Z",
  "finishedAt": "2026-10-02T11:09:54.665Z",
  "machine": {
    "cpu": "Apple M1",
    "os": "Darwin 26.3",
    "arch": "arm64",
    "node": "v22.18.0",
    "python": "Python 3.13.5"
  },
  "metricCount": 89,
  "metrics": [
    {
      "metric": "inspector_latest_version",
      "value": "2.9.0",
      "unit": "text",
      "note": "npm view @modelcontextprotocol/inspector version"
    },
    {
      "metric": "inspector_v1_latest",
      "value": "1.0.2",
      "unit": "text",
      "note": "npm dist-tag v1-latest"
    },
    {
      "metric": "inspector_publish_time",
      "value": "2026-09-30T22:40:43.423Z",
      "unit": "text",
      "note": "npm publish time of latest"
    },
    {
      "metric": "inspector_node_engine",
      "value": ">=22.19.0",
      "unit": "text",
      "note": "engines.node in package.json"
    },
    {
      "metric": "node_used",
      "value": "v22.23.3",
      "unit": "text",
      "note": "Node used for the main runs"
    },
    {
      "metric": "fastmcp_version",
      "value": "4.0.10",
      "unit": "text",
      "note": "uv pip install fastmcp, no pin"
    },
    {
      "metric": "mcp_sdk_version",
      "value": "2.2.0",
      "unit": "text",
      "note": "mcp package pulled in by fastmcp"
    },
    {
      "metric": "server_loc",
      "value": 23,
      "unit": "lines",
      "note": "non-blank lines in the FastMCP demo server"
    },
    {
      "metric": "fastmcp_dev_inspector_server_port_help",
      "value": "--server-port INT Port for the MCP Inspector Proxy server",
      "unit": "text",
      "note": "fastmcp dev inspector --help row"
    },
    {
      "metric": "fastmcp_dev_inspector_npx_spec",
      "value": "@modelcontextprotocol/inspector",
      "unit": "text",
      "note": "package spec fastmcp passes to npx when --inspector-version is unset"
    },
    {
      "metric": "fastmcp_dev_inspector_server_port_env",
      "value": "SERVER_PORT",
      "unit": "text",
      "note": "env var --server-port sets"
    },
    {
      "metric": "launcher_help_has_version_flag",
      "value": "no",
      "unit": "bool",
      "note": "does mcp-inspector --help list a --version flag"
    },
    {
      "metric": "launcher_modes",
      "value": "--cli --tui --web",
      "unit": "text",
      "note": "mode flags in launcher --help"
    },
    {
      "metric": "old_node_version",
      "value": "v22.18.0",
      "unit": "text",
      "note": "Node below the >=22.19.0 floor"
    },
    {
      "metric": "old_node_exit",
      "value": 0,
      "unit": "code",
      "note": "CLI tools/list exit code on the old Node"
    },
    {
      "metric": "old_node_ebadengine_warnings",
      "value": 2,
      "unit": "count",
      "note": "npm EBADENGINE warning blocks on a cold npx cache"
    },
    {
      "metric": "old_node_ebadengine_packages",
      "value": "@modelcontextprotocol/inspector@2.9.0 undici@8.11.2",
      "unit": "text",
      "note": "packages that tripped the engine check"
    },
    {
      "metric": "old_node_tool_count",
      "value": 1,
      "unit": "count",
      "note": "tools returned on the old Node (stdio)"
    },
    {
      "metric": "stdio_initialize_server",
      "value": "inspector-demo 4.0.10",
      "unit": "text",
      "note": "serverInfo from --method initialize"
    },
    {
      "metric": "stdio_protocol_version",
      "value": "2025-11-25",
      "unit": "text",
      "note": "negotiated protocolVersion"
    },
    {
      "metric": "stdio_capabilities",
      "value": "logging,prompts,resources,tools",
      "unit": "text",
      "note": "capability keys"
    },
    {
      "metric": "stdio_tools_list_exit",
      "value": 0,
      "unit": "code"
    },
    {
      "metric": "stdio_tool_names",
      "value": "add",
      "unit": "text",
      "note": "tools/list"
    },
    {
      "metric": "stdio_tool_has_output_schema",
      "value": "yes",
      "unit": "bool",
      "note": "FastMCP adds outputSchema for an int return"
    },
    {
      "metric": "stdio_tools_call_exit",
      "value": 0,
      "unit": "code",
      "note": "tools/call add a=2 b=3"
    },
    {
      "metric": "stdio_tools_call_text",
      "value": 5,
      "unit": "text",
      "note": "content[0].text"
    },
    {
      "metric": "stdio_tools_call_structured",
      "value": 5,
      "unit": "int",
      "note": "structuredContent.result"
    },
    {
      "metric": "stdio_resource_uris",
      "value": "config://app",
      "unit": "text",
      "note": "resources/list"
    },
    {
      "metric": "stdio_resource_read_mime",
      "value": "text/plain",
      "unit": "text",
      "note": "resources/read config://app"
    },
    {
      "metric": "stdio_prompt_names",
      "value": "review_code",
      "unit": "text",
      "note": "prompts/list"
    },
    {
      "metric": "stdio_prompt_get_role",
      "value": "user",
      "unit": "text",
      "note": "prompts/get first message role"
    },
    {
      "metric": "bad_arg_exit",
      "value": 5,
      "unit": "code",
      "note": "tools/call add a=x (wrong type)"
    },
    {
      "metric": "bad_arg_error_code",
      "value": "tool_is_error",
      "unit": "text",
      "note": "stderr envelope"
    },
    {
      "metric": "bad_arg_is_error",
      "value": "True",
      "unit": "bool",
      "note": "result.isError still printed on stdout"
    },
    {
      "metric": "missing_tool_exit",
      "value": 5,
      "unit": "code",
      "note": "tools/call on a tool that does not exist"
    },
    {
      "metric": "missing_tool_error_code",
      "value": "tool_not_found",
      "unit": "text",
      "note": "stderr envelope"
    },
    {
      "metric": "no_method_exit",
      "value": 1,
      "unit": "code",
      "note": "--cli with a target but no --method"
    },
    {
      "metric": "no_method_message",
      "value": "Method is required. Use --method to specify the method to invoke.",
      "unit": "text",
      "note": "stderr envelope"
    },
    {
      "metric": "wrong_order_exit",
      "value": 1,
      "unit": "code",
      "note": "--cli --method tools/list <target> (target last)"
    },
    {
      "metric": "wrong_order_message",
      "value": "No servers found in config file",
      "unit": "text",
      "note": "stderr envelope"
    },
    {
      "metric": "catalog_created_by_cli",
      "value": "{\"mcpServers\":{}}",
      "unit": "text",
      "note": "~/.mcp-inspector/mcp.json after the CLI fell back to the default catalog"
    },
    {
      "metric": "http_test_port",
      "value": 8000,
      "unit": "port",
      "note": "FastMCP transport=http bind"
    },
    {
      "metric": "sse_test_port",
      "value": 8001,
      "unit": "port",
      "note": "FastMCP transport=sse bind"
    },
    {
      "metric": "unreachable_test_port",
      "value": 8999,
      "unit": "port",
      "note": "port with nothing listening-"
    },
    {
      "metric": "http_inferred_exit",
      "value": 0,
      "unit": "code",
      "note": "URL ending /mcp, no --transport"
    },
    {
      "metric": "http_inferred_tools",
      "value": 1,
      "unit": "count"
    },
    {
      "metric": "http_trailing_slash_exit",
      "value": 1,
      "unit": "code",
      "note": "URL ending /mcp/ (trailing slash), no --transport"
    },
    {
      "metric": "http_trailing_slash_message",
      "value": "Transport type not specified and could not be determined from URL: http://127.0.0.1:8000/mcp/.",
      "unit": "text"
    },
    {
      "metric": "http_bare_host_exit",
      "value": 1,
      "unit": "code",
      "note": "bare host URL, no --transport (CLI README says default is SSE)"
    },
    {
      "metric": "http_bare_host_message",
      "value": "Transport type not specified and could not be determined from URL: http://127.0.0.1:8000.",
      "unit": "text"
    },
    {
      "metric": "http_trailing_slash_explicit_exit",
      "value": 0,
      "unit": "code",
      "note": "same /mcp/ URL with --transport http"
    },
    {
      "metric": "http_tools_call_exit",
      "value": 0,
      "unit": "code",
      "note": "--server-url ... tools/call add 40+2"
    },
    {
      "metric": "http_tools_call_result",
      "value": 42,
      "unit": "int"
    },
    {
      "metric": "sse_inferred_exit",
      "value": 0,
      "unit": "code",
      "note": "URL ending /sse, no --transport (FastMCP transport=sse)"
    },
    {
      "metric": "sse_inferred_tools",
      "value": 1,
      "unit": "count"
    },
    {
      "metric": "wrong_transport_exit",
      "value": 1,
      "unit": "code",
      "note": "Streamable HTTP server forced to --transport sse"
    },
    {
      "metric": "wrong_transport_error_code",
      "value": "error",
      "unit": "text"
    },
    {
      "metric": "wrong_transport_message",
      "value": "SSE error: Non-200 status code (400)",
      "unit": "text"
    },
    {
      "metric": "unreachable_exit",
      "value": 4,
      "unit": "code",
      "note": "nothing listening on :8999"
    },
    {
      "metric": "unreachable_error_code",
      "value": "unreachable",
      "unit": "text"
    },
    {
      "metric": "unreachable_cause",
      "value": "connect ECONNREFUSED 127.0.0.1:8999",
      "unit": "text"
    },
    {
      "metric": "cli_stdio_roundtrip_median",
      "value": 1413,
      "unit": "ms",
      "note": "n=5, warm npx cache, includes spawning the Python server"
    },
    {
      "metric": "cli_http_roundtrip_median",
      "value": 834,
      "unit": "ms",
      "note": "n=5, warm npx cache, server already running"
    },
    {
      "metric": "config_stdio_exit",
      "value": 0,
      "unit": "code",
      "note": "--config mcp.json --server demo-stdio"
    },
    {
      "metric": "config_http_exit",
      "value": 0,
      "unit": "code",
      "note": "--config mcp.json --server demo-http tools/call"
    },
    {
      "metric": "config_http_result",
      "value": 2,
      "unit": "int"
    },
    {
      "metric": "config_servers_list",
      "value": "demo-http,demo-stdio",
      "unit": "text",
      "note": "servers/list (no MCP connect)"
    },
    {
      "metric": "config_file_unchanged",
      "value": "yes",
      "unit": "bool",
      "note": "sha1 of mcp.json before vs after three --config runs"
    },
    {
      "metric": "config_missing_exit",
      "value": 1,
      "unit": "code",
      "note": "--config pointing at a file that does not exist"
    },
    {
      "metric": "config_missing_message",
      "value": "Error loading configuration: Config file not found: /tmp/mcpi/missing.json",
      "unit": "text"
    },
    {
      "metric": "config_plus_adhoc_exit",
      "value": 1,
      "unit": "code",
      "note": "--config plus a positional target"
    },
    {
      "metric": "config_plus_adhoc_message",
      "value": "--config cannot be combined with an ad-hoc server URL/command. --config selects a read-only session file.",
      "unit": "text"
    },
    {
      "metric": "web_banner_url",
      "value": "http://127.0.0.1:6274?MCP_INSPECTOR_API_TOKEN=",
      "unit": "text",
      "note": "URL prefix printed by the launcher (token elided)"
    },
    {
      "metric": "web_token_length",
      "value": 64,
      "unit": "chars",
      "note": "hex chars in the per-launch token"
    },
    {
      "metric": "web_listen_ports",
      "value": "127.0.0.1:6274 127.0.0.1:6275 127.0.0.1:6278",
      "unit": "text",
      "note": "lsof LISTEN sockets of the web process"
    },
    {
      "metric": "web_ui_port",
      "value": 6274,
      "unit": "port",
      "note": "lowest LISTEN port (web UI + /api)"
    },
    {
      "metric": "web_sandbox_port",
      "value": 6275,
      "unit": "port",
      "note": "second LISTEN port (MCP Apps sandbox)"
    },
    {
      "metric": "web_app_origin_port",
      "value": 6278,
      "unit": "port",
      "note": "third LISTEN port (app-origin server)"
    },
    {
      "metric": "web_port_6277_open",
      "value": "no",
      "unit": "bool",
      "note": "v1 proxy port"
    },
    {
      "metric": "web_root_status_no_token",
      "value": 200,
      "unit": "http",
      "note": "GET / without token"
    },
    {
      "metric": "web_root_embeds_token",
      "value": "yes",
      "unit": "bool",
      "note": "token injected into index.html"
    },
    {
      "metric": "web_api_status_no_token",
      "value": 401,
      "unit": "http",
      "note": "GET /api/config without header"
    },
    {
      "metric": "web_api_status_wrong_token",
      "value": 401,
      "unit": "http"
    },
    {
      "metric": "web_api_status_token",
      "value": 200,
      "unit": "http",
      "note": "x-mcp-remote-auth: Bearer <token>"
    },
    {
      "metric": "web_api_default_transport",
      "value": "stdio",
      "unit": "text",
      "note": "/api/config for an ad-hoc stdio launch"
    },
    {
      "metric": "web_secret_store",
      "value": "Memory (this session only)",
      "unit": "text",
      "note": "banner line"
    },
    {
      "metric": "web_fixed_token_used",
      "value": "yes",
      "unit": "bool",
      "note": "MCP_INSPECTOR_API_TOKEN=fixed-token-123"
    },
    {
      "metric": "web_wildcard_host_exit",
      "value": 1,
      "unit": "code",
      "note": "HOST=0.0.0.0 without DANGEROUSLY_BIND_ALL_INTERFACES"
    },
    {
      "metric": "web_wildcard_host_message",
      "value": "Error: Refusing to bind HOST=\"0.0.0.0\": this exposes the MCP Inspector to your entire network, and its backend can spawn local processes and connect to MCP serv",
      "unit": "text"
    }
  ],
  "log": [
    "[harness] done",
    ""
  ]
}
