Skip to content

Configuration

Everything can be given on the command line. For anything you run more than once, put it in mcpprobe.toml next to your server; mcpprobe run reads it from the current directory (or --config PATH). Command-line options win over the file, and the file wins over the defaults.

[server]
stdio = "python -m my_server"                    # or: http = "http://127.0.0.1:8000/mcp"
env = { API_KEY = "${API_KEY}" }                  # stdio servers
headers = { Authorization = "Bearer ${TOKEN}" }   # HTTP servers

[run]
suites = ["conf", "fuzz", "rob", "sec"]
seed = 42
fuzz_examples_per_tool = 50
timeout_ms = 10000          # per case
startup_timeout_ms = 30000  # the server's first answer (cold npx/uvx)
total_timeout_ms = 1800000  # the whole run; 0 means no limit
concurrency = 8             # ROB-007
allow_destructive = false
allow_open_world = false
keep_going = false
cases_dir = ".mcpprobe/cases"
baseline = "mcpprobe-baseline.json"

[checks]
disable = ["CONF-012"]
severity_overrides = { "SEC-002" = "info" }

Windows paths

In a TOML "..." string a backslash starts an escape, so "C:\Users\me\server.py" is an error. Use single quotes, which keep backslashes as they are: stdio = 'python C:\Users\me\server.py'. If the command itself contains quotes, use three: stdio = '''"C:\Program Files\node\node.exe" dist\index.js'''.

${NAME} is replaced by the environment variable NAME, so secrets stay out of the file; a missing variable is an error. Unknown keys and unknown check ids are errors too (exit code 3), so a typo never silently does nothing. An [eval] section is accepted and reserved for the tool-usability eval (v1.1).

mcpprobe run options

Option Default What it does
--stdio CMD / --http URL The server
--header "Name: value" HTTP header; repeatable
--env KEY=VALUE Environment for a stdio server; repeatable; masked in reports
--config PATH ./mcpprobe.toml Config file
--suites LIST conf,fuzz,rob,sec Suites to run
--seed N random, printed Same seed, same report
--report FORMAT terminal terminal, json, junit, sarif, html; repeatable
-o FILE stdout One per non-terminal --report, in the same order
--baseline FILE Known findings do not fail the run
--examples N 50 Generated argument sets per tool (FUZZ)
--concurrency N 8 Requests in flight at once (ROB-007)
--timeout S 10 Seconds per case
--startup-timeout S 30 Seconds for the server's first answer
--total-timeout S 1800 Seconds for the whole run; when it runs out the rest is skipped and the exit code is 2
--allow-destructive off Also call tools not marked read-only or non-destructive
--allow-open-world off Also call tools marked openWorldHint: true
--dry-run off List the tools and which would be called; call none
--keep-going off Run later suites even if conformance fails
--cases-dir DIR .mcpprobe/cases Where failing cases are saved
--sarif-path PATH entry file Repository file SARIF alerts point at