rolefence-scan
Enables security scanning of MongoDB databases used by MCP servers, including checking whether the database user can write, execute code, or access collections beyond intended permissions.
Enables security scanning of MySQL databases used by MCP servers, verifying read-only access, detecting write capabilities, and identifying unauthorized data access.
Enables security scanning of PostgreSQL databases used by MCP servers, checking for write permissions, code execution, and excessive access to tables or collections.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@rolefence-scanscan http://127.0.0.1:5000/mcp for unauthenticated access and leaks"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
rolefence-scan
Find out what your AI assistant can really see in your database, before someone else does.
Part of RoleFence. Free and open source (Apache 2.0). Made by VTSOL INC.
What is it?
Many companies now let an AI assistant (Claude, ChatGPT, Codex and others) answer questions from the company database. The AI talks to the database through an "MCP server": a small program that holds a list of questions the AI may ask.
The problem: these setups are new, done by hand, and easy to get slightly wrong. A tool meant to answer "how many enquiries did we get in June?" can often also read every customer's phone number, see the supplier costs that sales staff should never see, or even change data.
rolefence-scan is a checker. You point it at the address your AI uses, and it tells you, in
plain English:
what it saw (for example: "the server lists 6 tools to anyone, with no login")
why it matters (for example: "anyone on this address can ask those questions, and nobody is recorded as having asked")
how to close it (for example: "put a login in front; here is which setting")
It only reads. It never changes anything in the database or the server it checks.
Related MCP server: AgentAudit
What is the goal?
Before you give an AI access to company data, you want three things to be true:
The AI can only read, never write.
Each role (sales, finance, support, …) can reach only its own data, and the hidden fields really stay hidden.
There is a login, so you know who asked what.
rolefence-scan checks whether that is true today, so you can fix the gaps. Run it again
after every change, or in your deployment pipeline, so a mistake never reaches production
without a warning.
How do I use it?
1. Install
You need Python 3.11 or newer.
uvx rolefence-scan --help(or pipx install rolefence-scan)
2. The easy way: the wizard in your browser
rolefence-scan uiThis opens a page on your own computer (http://127.0.0.1:8765, reachable only from this
machine) that walks you through five short steps: the server address, an optional login token,
an optional database login (server, database name, username, password, with a "Test login"
button), an optional config file, then a review and the run. Each check
appears as it finishes; the findings are shown as cards you can download as an HTML or JSON
report. Tokens and connection strings are kept in memory for that one run and never saved.
Run it on the machine where the MCP server runs and it finds things itself: running Toolbox and agentgateway processes (address, port, config file), the database-login variable the server was started with (used without ever being shown), and the MCP servers in Claude Code, Claude Desktop, Cursor and Codex settings: both the ones with an address and the ones the app starts as a program on this computer (shown as "Claude Desktop: crm · runs as a local program"). Each shows as "Found on this computer" with a "Use this" button.
The list is sorted from the settings alone (nothing is started, no value is shown):
Talks to a database first: a database connection in its settings (a
mongodb://,postgres://,mysql://… string, or settings named likeMONGO_…,DATABASE_…,DB_…), or a known database MCP server such as MCP Toolbox for Databases.Unknown next, with "may reach your data, check it".
Well-known tools that are not databases (browser automation, documentation lookup, code hosting and the like) folded away under "N other MCP servers that do not look like databases — show". They can still be scanned.
The same server listed in several places shows once, with every app that lists it ("Claude Code, Cursor"); a scan of it checks every copy's settings for plain-text passwords.
To teach the scanner another well-known server, add a line to
src/rolefence_scan/data/known_servers.json,
under databases or tools: a name, and the patterns that identify it. A pattern is the
program's name (toolbox), a package (@scope/package, any @version is ignored), a Docker
image (mcp/name), or a web address's host (mcp.example.com, which also matches its
subdomains). Pull requests welcome.
Not sure where to find the address, the connection string or the config file? Each step has a
"Where do I find it?" link. In short: the address is in your AI app's MCP settings (for Claude
Code, .mcp.json; for Claude Desktop, Settings → Developer → Edit Config); the config file
(tools.yaml) and the connection string live on the machine where the MCP server runs, so ask
whoever set it up. Everything but the address is optional.
2b. Or the command line
The simplest run: just the address your AI assistant is configured with.
rolefence-scan --mcp http://127.0.0.1:5000/mcpThat already tells you whether the server answers without a login, whether a "sales" address leaks the "finance" tools, and whether the server is open to the whole office network.
3. Give it more, get more
Each extra piece of information unlocks more checks. Passwords and tokens are never typed on the command line: you put them in an environment variable and give the scanner the variable's name.
Add this | And the scanner can also check |
| Is the token accepted? Does the sales role see tools it is not allowed to call? |
| Can someone skip the gateway and call the server directly? |
| Can the AI's database user write? Can it run code inside the database? Can one tool read other collections? |
| Are there write tools? Do tools accept any query? Do they return whole records, or unlimited rows? |
A full run looks like this:
export SALES_TOKEN='...' # a login token for the sales role
export DB_URI='mongodb://user:pw@host/db?authSource=db' # the connection the MCP server uses
rolefence-scan --mcp http://127.0.0.1:3001/mcp --token-env SALES_TOKEN --role sales \
--backend http://127.0.0.1:5002/mcp \
--db-env DB_URI --config tools.yaml --json report.jsonThe exit code tells a script how it went: 0 nothing found, 1 low or medium findings,
2 at least one high finding, 3 it could not run. Use it in CI to stop a deploy that
opens something up.
4. Or just ask your AI assistant to run it
The scanner can itself be an MCP server. Register it with Claude Code, Codex or any MCP client, and ask in plain words: "scan my MCP server at http://127.0.0.1:3001/mcp as the sales role". The assistant runs the checks and explains the report.
{"mcpServers": {"rolefence-scan": {"command": "rolefence-scan", "args": ["serve"]}}}Set the environment variables in the shell that starts the assistant. The assistant only ever sees variable names, never the secrets.
5. Local-program servers
Most MCP servers are not at a web address at all: the AI app starts them as a program on your
computer, from its settings file (command, args and env in claude_desktop_config.json,
.mcp.json, Cursor's mcp.json, or [mcp_servers.<name>] in Codex's config.toml). The
risk there is the database login the program holds, which is often for a database on another
computer and often written into that settings file in plain text.
# read the settings file only; nothing is started
rolefence-scan --stdio-from ~/Library/Application\ Support/Claude/claude_desktop_config.json
# also start one server once, the way the AI app does, to list its tools (no tool is run)
rolefence-scan --stdio-from .mcp.json --server crm
# or a command you type yourself
rolefence-scan --stdio "npx -y some-mcp-server"What it checks:
A password or key written in the settings file. A connection string with a password in it, or a setting named like a password, token or API key. The report names the server, the file and the setting's name, and says whether the database is on this computer or another one. It never shows a value, a host name or any part of the connection string.
Tools that change data, by name and description (insert, update, delete, create, send…).
Every tool is open to whoever uses this computer: a local program has no login and no roles; every caller gets every tool.
To list the tools the scanner starts the program with the settings from the file, sends
initialize and tools/list, and stops it (after 30 seconds at most; --stdio-timeout
changes that). It has no way to send tools/call. Anything the program prints is discarded
unread. The wizard asks before it starts anything ("This will start crm the way your AI app
does, ask for its tool list, and stop it. No tool is run."); in serve mode the
scan_local_program tool only starts a server named in a settings file, never a free command.
The network checks (login, gateway, open ports) are listed as "does not apply to a local
program".
What does a report look like?
This is a real run against the "weak" demo setup that ships with the scanner (made-up data):
rolefence-scan report for http://127.0.0.1:5010/mcp/sales
11 finding(s): 6 high, 3 medium, 2 low
1. [HIGH] Tools are listed without a login
What we saw: The server answered with 3 tool(s) when no token was sent.
Why it matters: Anyone who can reach this address can see every question the AI can ask
and call them. There is no record of who asked.
How to close: Put a login in front: a gateway that checks tokens, or the question
server's own auth setting.
2. [HIGH] The bare /mcp address serves every tool
What we saw: /mcp/sales lists 3 tool(s); /mcp lists 6, including 3 not meant for this caller.
Why it matters: Per-role toolsets are a menu, not a boundary. Anyone who drops the toolset
name from the address gets everything.
3. [HIGH] The AI's database user can write
What we saw: The user the question server connects with holds write rights.
Why it matters: A tool mistake, a prompt injection, or a pipeline with $out/$merge can
change or delete data.
How to close: Create a user with a custom read-only role and point the server at it.
4. [HIGH] Server-side JavaScript runs for the AI's database user
...The same company, set up properly (one read-only user per role, fixed questions, a login in front), gets 4 findings instead of 11, and the scanner says which ones remain.
NIST AI RMF
Risk and audit teams often work from the NIST AI Risk Management Framework (AI RMF 1.0, NIST AI 100-1, and its Generative AI Profile, NIST AI 600-1). Every report shows which of its items the scan gives evidence for:
each finding has an
AI RMF:line, for exampleMEASURE 2.7, MEASURE 2.10, MANAGE 1.3;at the end, one row per item with what this scan showed and a status: Evidence, Gaps to fix, or Not checked in this scan (the checks for it did not run this time), plus a fixed row for what this tool does not cover at all: accuracy, bias and model testing.
MEASURE 2.10 Privacy: personal and secret data the AI can reach
Status: Gaps to fix
What this scan showed: 3 finding(s) to fix: Tools accept any query from the model; ...The items used are GOVERN 1.6, GOVERN 6.1, MEASURE 2.7, MEASURE 2.8, MEASURE 2.10, MANAGE 1.3,
MANAGE 3.1 and MANAGE 4.1. The AI RMF is voluntary guidance and has no certification: the
report gives evidence for its data-access parts and does not certify compliance. The JSON report
has the same in ai_rmf (per finding and a summary). Which check counts towards which item is
one data file, src/rolefence_scan/data/ai_rmf.json;
corrections are welcome.
Examples
"Our sales team's AI must never see supplier cost."
Run with --db-env set to the sales user's connection. If the scanner reports "cross-collection
reach" into orders or "the AI's database user can write", the database user is too
powerful, whatever the tools say. If it reports "Cross-collection reach is contained by the
database role", the data layer is doing its job.
"We put a gateway with login in front. Are we done?"
Run with --mcp on the gateway and --backend on the server behind it. "The question server
can be reached without the gateway" means anyone who knows the inside address skips the login.
"Users say they get 401 even with a valid login."
Run with --token-env. "A valid token is refused" with the hint about pass-through means the
gateway checked the token and then threw it away before forwarding, so the server behind it
saw none. One setting fixes it.
"A developer set this up months ago. Is it still safe?"
Run it with everything you have, save --json report.json, and run it again after each change.
Compare the two.
The full list of checks
Check | Needs | What it looks for |
Open tool list |
| The server lists and serves tools with no login |
Default |
| The bare |
Scopes advertised |
| Clients are told which scopes to ask for |
Listening everywhere |
| The port is also open on the machine's network address |
Token refused |
| A valid token gets 401 (a gateway in front may be dropping it) |
Tool list not filtered |
| The caller sees tools it may not call |
Round the gateway |
| The question server answers directly, with no token |
Writes allowed |
| The AI's database user holds write rights (read from its privileges; no write is tried) |
Server-side JavaScript |
|
|
Cross-collection reach |
|
|
Leaks in replies |
|
|
Write tools |
| Insert, update or delete tools are defined |
Free-form queries |
| Tools take the whole filter or pipeline from the model |
Aggregate not read-only |
|
|
No row cap |
| Fixed pipelines with no |
Whole documents |
| Find tools with no projection |
Password in a plain text file |
| A local program's settings hold a database login with its password (high) or a token or API key (medium) |
Tools that change data |
| A local program offers insert, update, delete, create or send tools |
Open to whoever uses this computer |
| A local program's tools have no login and no roles |
Works today with MongoDB and MCP Toolbox for Databases, with or without agentgateway in front. Other databases are planned.
Try it on the demo
demo/ holds a made-up removals company, Brightline Movers: 2,000 customers, 3,200
enquiries, 1,110 orders, all invented. It comes with two setups:
demo/toolbox/weak.yaml: how a first attempt usually looks. One over-powered database user, tools that accept any query, no login. Expected: 11 findings.demo/toolbox/governed.yaml: fixed questions, one read-only user per role, hidden fields removed by a view. Expected: 4 findings, all about the missing login (that is the gateway's job, below) and a database setting.
export DEMO_ADMIN_URI='mongodb://<admin>:<pw>@127.0.0.1:27017/admin'
uv run python demo/seed.py # writes database rolefence_demo
mongosh ... demo/setup_users.js # see the header of that file for the command
toolbox --config demo/toolbox/weak.yaml --port 5010 # with DEMO_RW_URI set
rolefence-scan --mcp http://127.0.0.1:5010/mcp/sales --db-env DEMO_RW_URI --config demo/toolbox/weak.yamlWith a login and a gateway
demo/gateway/ adds the identity side: a Keycloak realm (rolefence-demo, roles sales and
finance, scopes demo:sales / demo:finance), a third Toolbox config with Toolbox's own
login (demo/toolbox/governed_auth.yaml, port 5012), and two agentgateway
configs in front of it: gateway_good.yaml (port 3011, passes the token on) and
gateway_weak.yaml (port 3012, drops it, which is agentgateway's default). Passwords are typed
into the terminal, never written to a file; get_token.sh fetches a token into a variable and
prints only who it is for.
The whole thing in one command (asks for the passwords, starts everything, runs the three scans, stops what it started):
demo/gateway/run_live.sh # set AGENTGATEWAY=/path/to/agentgateway if it is not on PATHOr step by step:
# 1. Keycloak (Docker) and the demo realm
docker run -d --name keycloak -p 127.0.0.1:8080:8080 -e KC_BOOTSTRAP_ADMIN_USERNAME=admin \
-e KC_BOOTSTRAP_ADMIN_PASSWORD="$KC_ADMIN_PW" quay.io/keycloak/keycloak:26.7.1 start-dev
export KC_ADMIN_PW DEMO_SALES_USER_PW DEMO_FINANCE_USER_PW # typed with read -s, see the script header
demo/gateway/setup_keycloak.sh
# 2. Toolbox with its own login (needs DEMO_SALES_URI / DEMO_FINANCE_URI as for governed.yaml)
toolbox --config demo/toolbox/governed_auth.yaml --port 5012 --toolbox-url http://127.0.0.1:5012
# 3. The two gateways (binary from https://github.com/agentgateway/agentgateway/releases)
agentgateway -f demo/gateway/gateway_good.yaml &
agentgateway -f demo/gateway/gateway_weak.yaml &
# 4. A sales token, then scan
source demo/gateway/get_token.sh sales # sets DEMO_SALES_TOKEN
rolefence-scan --mcp http://127.0.0.1:3011/mcp --token-env DEMO_SALES_TOKEN --role sales \
--backend http://127.0.0.1:5012/mcp --config demo/toolbox/governed_auth.yaml
rolefence-scan --mcp http://127.0.0.1:3012/mcp --token-env DEMO_SALES_TOKEN --role sales \
--backend http://127.0.0.1:5011/mcp
rolefence-scan --mcp http://127.0.0.1:5012/mcp --token-env DEMO_SALES_TOKEN --role salesWhat each run shows:
Target | Expected |
Good gateway (3011) | Token accepted, sales sees only |
Weak gateway (3012) | Token refused: the gateway checks the token, then drops it, so Toolbox answers 401. Scopes not advertised. With the open governed Toolbox (5011) as backend: round the gateway. |
Toolbox alone (5012) | Login holds, but the tool list is not filtered: sales is shown 5 tools and refused on the 2 finance ones. Scopes not advertised. |
All three were run live on 15 Oct 2026 with demo/gateway/run_live.sh and matched this table.
What it does not do yet
Secrets that can be worked out from other fields. If sales can see price and the AI can find cost somewhere, it can work out the margin. The scanner cannot know which fields are secret in your business. Planned: a short wizard where you tick the secret fields and the scanner checks each role against them.
Watching the server over time, for example telling you that a config change was rejected and the old config is still running.
Fixing things. It finds and explains; you (or the RoleFence console) make the change.
PostgreSQL and other databases. MongoDB first.
Is it safe to run on a live system?
Yes, by design:
It only reads: it asks the database what the user is allowed to do, runs tiny read queries, and calls tools with empty arguments. Nothing is inserted, updated or deleted.
The report never contains data values, only names of fields, collections and tools, and counts.
Secrets are never on the command line, so they do not end up in shell history or logs.
reports/and*.report.jsonare git-ignored, because a report can contain host names.
Where the checks come from
GAPS.md is the log of 30 things that did not hold when we built this setup and tried to break it, with the scanner check that catches each. The story version, for people who would rather read than scan, is docs/what-a-model-can-reach.md.
Questions or ideas
Open an issue. If you found a gap the scanner missed, that is the most useful thing you can tell us: every new check started as someone's "it shouldn't have been able to do that".
Available Tools
3 toolslist_checksA
List the checks rolefence-scan runs and what each needs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden; it does convey that this is a read-only enumeration and that each entry includes its requirements, which is useful. It says nothing about side effects, permissions, or whether the check list is static versus configuration-dependent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the verb and resource lead, and the qualifier about what each check needs follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter discovery tool with an output schema describing the return shape, the description covers what the agent needs to decide to call it. It could add one clause on when to prefer it over a direct scan, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain; baseline 4 applies. The phrase "what each needs" usefully hints that returned entries carry their own input requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ("List") and resource ("the checks rolefence-scan runs") and adds that it returns what each check needs, which is more informative than a bare list. It doesn't explicitly contrast itself with the scan_* siblings, but the discovery framing makes its distinct role apparent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is a discovery step to run before invoking scan_mcp or scan_local_program, but the description never says so, nor does it state when not to use it. No explicit alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_local_programA
Check the local-program ("stdio") MCP servers in an AI app's settings file: passwords or keys written there in plain text, and (with list_tools) what tools the program offers.
settings_file: e.g. ~/Library/Application Support/Claude/claude_desktop_config.json, .mcp.json, ~/.claude.json, ~/.cursor/mcp.json, ~/.codex/config.toml server: check only the server with this name (required for list_tools) list_tools: start that server once the way the AI app does, ask for its tool list, and stop it. No tool is run. Ask the person before setting this.
The report names settings, never their values.
| Name | Required | Description | Default |
|---|---|---|---|
| server | No | ||
| list_tools | No | ||
| settings_file | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses that list_tools actually starts and stops the server process, that no tool is executed, and that the report names settings but never their values. It doesn't cover failure modes (a server that hangs or won't start) or permission requirements for reading the settings file, so it stops short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and the secret-detection scope are front-loaded in the first sentence, followed by a compact parameter block where every line carries new information. The pseudo-indented multi-line parameter list is a slightly awkward shape for a tool description but wastes little space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-oriented scanner with no annotations, an output schema present, and a declared side effect (spawning a server), the description covers safety, consent, output privacy, and all parameters. The only real hole is that it doesn't position the tool against its siblings, which matters given scan_mcp sits right next to it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for all three parameters and it does: settings_file gets concrete example paths across Claude, Cursor, and Codex, server is defined as a name filter with its dependency on list_tools, and list_tools is explained behaviorally. An agent could fill this schema correctly from the description alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb ('check') and a well-scoped resource (stdio/local-program MCP servers in an AI app's settings file), and spells out what it looks for: plain-text secrets and, optionally, tool listings. The scope is clear, but it never distinguishes itself from the sibling scan_mcp, which an agent will likely see alongside it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives conditional usage rules for parameters ('server: required for list_tools') and a consent gate ('Ask the person before setting this'), which is real guidance. What is missing is tool-selection guidance: nothing says when to pick this over scan_mcp or list_checks, or what to do when both could apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_mcpA
Scan an MCP endpoint (and optionally the question server behind it, its database user and its Toolbox config) and return a plain-English report of what a model could reach.
mcp_url: the gateway or question server address, e.g. http://127.0.0.1:3001/mcp token_env: name of an environment variable holding a bearer token for one role (optional) role: label for that role, used in the report text backend_url: the question server's own address behind the gateway, to test the bypass (optional) db_env: name of an environment variable holding the MongoDB URI the question server uses (optional) config_path: path to a Toolbox tools.yaml to check (optional)
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | the token | |
| db_env | No | ||
| mcp_url | No | ||
| token_env | No | ||
| backend_url | No | ||
| config_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does add real behavioral context: tokens and DB URIs are passed indirectly via environment-variable names, and backend_url exists specifically to attempt an auth bypass. It never says whether the scan is purely read-only, whether it writes anything to the target DB, or what happens if a credential env var is unset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in one sentence, followed by a compact aligned parameter glossary with no filler. The parameter list is arguably duplicative of the schema, but since the schema has zero property descriptions this repetition is the only source of that information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be described, and the parameter glossary covers a 6-param, all-optional signature well. What's missing is a brief note on depth/cost of a full scan and any side-effect or credential-handling caveat, which matters for a security-scanning tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: all six parameters are explained, including an explicit URL example for mcp_url and the non-obvious semantics of token_env/db_env as variable names rather than secrets. The 'role' default of 'the token' in the schema is slightly clarified by 'label for that role, used in the report text', though the interaction between role and token_env is not spelled out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb (scan) and resource (an MCP endpoint plus the question server, DB user and Toolbox config behind it) and states the output shape ('plain-English report of what a model could reach'). It doesn't explicitly name scan_local_program or list_checks as the alternatives, so sibling differentiation relies on inference from the parameter names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description marks four parameters as optional and frames them as deepening the scan (the backend 'to test the bypass'), which implies a shallow-vs-deep usage pattern. There is no explicit statement of when to pick this over scan_local_program or list_checks, and no prerequisites such as needing the endpoint reachable or a token already set in the environment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.2- First observed
list_checks - First observed
scan_local_program - First observed
scan_mcp
TDQS
Scored across 3 tools
The two scan tools target clearly different surfaces: scan_mcp covers remote MCP endpoints/backends and scan_local_program covers local stdio server configs, so an agent can pick between them. list_checks is a meta/discovery tool with a distinct purpose. The only mild risk is that both scan tools share the 'audit a surface' intent and an agent unsure whether a target is remote or local may hesitate.
All names are snake_case and readable, with scan_mcp and scan_local_program forming a coherent scan_<target> family. list_checks breaks the verb pattern but reflects a genuinely different action, and the shared scan_ prefix keeps the set predictable.
Three tools is on the lean side but each earns its place: two distinct scan surfaces plus a check-discovery tool that explains requirements. Nothing feels redundant or padded for this focused security-audit purpose.
Coverage spans remote endpoint scanning, local config scanning, and check introspection, which is solid for the stated purpose. However, the surface is asymmetric — scan_local_program offers list_tools enumeration for stdio servers, but there is no standalone way to enumerate tools on a remote endpoint, and no tool to retrieve or re-serialize a saved report.
Maintenance
Related MCP Connectors
Scan a site or AI-built app for exposed databases, keys and MCP endpoints, then verify the fixes.
Scans remote MCP servers for protocol, security, and TLS issues; exposes scan tools via MCP.
Security scanner for MCP servers. Detect vulnerabilities, prompt injection, and tool poisoning.
See which AI models fall for traps in everyday jobs, and check or scan any MCP server, skill or package before your agent installs it. No sign-in; read-only; returns structured data.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceMCP server for auditing AI agent permissions and access by scanning for the trifecta of credentials, injection, and reach without heavy infrastructure.-

AgentAuditofficial
AlicenseAqualityDmaintenanceEnables AI agents to scan MCP servers and AI packages for vulnerabilities, prompt injection, and supply chain attacks.759 npmAGPL 3.0- AlicenseNot gradedqualityCmaintenanceProvides read-only access to databases for MCP-compatible AI tools, allowing schema exploration and SELECT queries without exposing credentials or risking data changes.84 npm3MIT
- AlicenseNot gradedqualityAmaintenanceA read-only MCP server that lets agents scan a project's AI agent setup — Claude Code, Codex, Cursor, MCP servers and instruction files — and surface security findings such as the lethal trifecta, broad permissions, exposed secrets and unpinned packages.78 npmMIT