Scan

See your agent's blast radius.

Paste your mcp.json and see what the file proves: which servers hold a credential, which fetch their code fresh at every launch, and which can reach off your machine. Paste a tools/listdump and it goes per tool - which calls can't be undone, which send data off your machine, and how many contracts are unpinned, with nothing watching them for change.

That last one is not hypothetical. Across the public MCP servers we re-crawl daily, 6,685 tools have changed a safety-relevant field. Not confirmed vulnerabilities, but the changes a pin exists to catch. 8,486 of 11,750 drifting tools have only ever changed with their declared version unchanged, where version evidence exists, so a version pin does not see them. Check the numbers yourself →

It runs entirely in your browser. Your config is read locally and never uploaded - which matters, because that file holds your tokens.

/scan
or drop your mcp.json anywhere in this panel
Where's my file?
~/Library/Application Support/Claude/claude_desktop_config.json

paths vary by version; open the file and drop or paste it above

no config handy?

nothing to scan yet · add your mcp.json above

sample setup - not your config

a realistic toolset, so the page is never empty
10
tools your agent can call
3
can't be undone
1
send data off-machine
10
unpinned contracts

unpinned = not yet watched for drift. a fresh scan pins nothing, so this equals your tool count until the gate is installed - it is a state, not a finding.

10 unpinned contracts.This is Monday's picture. Any of these tools can change what it declares between runs, with nothing in your repo to diff. mcpindex pins each contract and HOLDs the call when it drifts.

see a HOLD →

deterministic contract-diff, not a safety verdict · fails open · advisory

toolactioneffectreversibilityegress
read_filereadread-onlyreversible·
list_directorylistread-onlyreversible·
search_docssearchread-onlyreversible·
postgres_querysearchwrites locallyreversibleinternal
write_filewritewrites locallyhard to reverseinternal
update_recordannotation says read-only; schema exposes write/delete parametersupdatewrites locallyhard to reverseinternal
slack_send_messagesendsends outboundhard to reverseoff-machine
delete_filedestructive with no obvious undo pathdeletedestructiveirreversibleinternal
stripe_create_chargedestructive with no obvious undo pathwritedestructiveirreversibleinternal
run_commanddestructive with no obvious undo pathexecutedestructiveirreversibleinternal
share these numbers
mcpindex scan: 10 tools, 3 irreversible, 1 off-machine, 10 unpinned

counts only - no tool names or schemas are in the link

What this is - and isn't
  • Deterministic, not a verdict.Every label is a fact read off the declared contract (schema, name, annotations) - action type, side effect, reversibility, egress. It never says a tool is “safe” or “unsafe.”
  • It's Monday's snapshot.A scan shows what your tools declare right now. It does not run them, and it can't catch a live server that changes what it does after you look. Watching for that change over time is what the gate does.
  • Nothing leaves your browser. No upload, no account, no logging of your config. The share card carries counts only - never tool names or schemas. See privacy.
  • Local servers stay coarse.A browser can't reach a local (stdio) server, so those show a server-level read; paste a tools/list dump for the full per-tool blast radius.

Looking to check a single tool's description for hidden instructions instead? Screen a tool →

Blast radiusTwo tool calls look identical to an agent. Running each through the deterministic blast-radius classifier separates them: search_docs is a read that touches documents, has no reversal question and stays local, so its autonomy ceiling is autonomous. delete_repo is a delete that touches a repository, is not reversible and stays local, so its ceiling is ask a human. The grade is read from the tool declared contract and does not run the tool. Ambiguous contracts grade toward the more dangerous class, never down. It is advisory: mcpindex labels the blast radius and your agent or IDE decides.TO YOUR AGENT, BOTH OF THESE ARE JUST “A TOOL CALL”search_docs(query)delete_repo(name)ACTIONreaddeleteTOUCHESdocumentsa repositoryREVERSIBLEnothing to undonot reversibleEGRESSstays on this machinestays on this machineAUTONOMY CEILINGautonomousask a humanDeterministic and static, read from the tool’s own declared contract — it does not run the tool.Ambiguous contracts grade toward the more dangerous class, never down. Advisory: mcpindexlabels the blast radius, your agent or IDE decides.
Fig. 11 · To an agent, a search and an irreversible delete are both just "a tool call" until something labels them.
Read Fig. 11 as text
  to your agent, both of these are just "a tool call":

    search_docs(query)                      delete_repo(name)
          |                                       |
   ACTION | read                           delete |
  TOUCHES | documents                      a repo |
  REVERSE | n/a                     not reversible|
   EGRESS | stays local                stays local|
          v                                       v
   CEILING  autonomous                    ask a human

  deterministic and static, read from the tool's own declared contract.
  it does not run the tool. ambiguous contracts grade toward the more
  dangerous class, never down. advisory: mcpindex labels the blast radius,
  your agent or IDE decides.

Permalink, SVG & reuse · CC BY 4.0