Local MCP capabilities provider for Expo
Run every static mcp-guard rule over a tools/list result you already have: { "tools": [...] }, a bare array of tools, or { "servers": [{ "name", "tools" }] } to also check shadowing between servers. Nothing is started or contacted. Returns a Markdown report and the findings.
A call is made on an account: it counts against an allowance and the publisher sees it, which is why this one asks who you are first.
What it does
Checks an MCP server before you install it. It reads the tool list a server advertises and flags poisoned descriptions, invisible Unicode instructions, tools that shadow another server's tools, over-broad command, path and URL arguments, missing annotations, leaked credentials and weak HTTP transports. 24 documented rules, each with a fix and references.
The scanned server's tools are never called. scan_tools_export works on an export you paste in, with no network access; scan_server only reaches public https endpoints and refuses private and local addresses. The same scanner is an open source CLI with SARIF output and a GitHub Action. Apache-2.0.
Quickstart
# 1 — sign in once: npx mcprush@latest login
# it asks for a key from mcprush.com/dashboard#access
# 2 — install
npx mcprush@latest add diegoperezg7/mcp-guard-scan
# 3 — ask your agent for something these tools do
# scan_tools_export, scan_server, list_rules and 1 more
Windows PowerShell says 'running scripts is disabled on this system'? Run Set-ExecutionPolicy -Scope CurrentUser RemoteSigned once, or type npx.cmd instead of npx (codex.cmd, gemini.cmd, grok.cmd likewise). PowerShell 7 needs neither.
mcp-guard-scan costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine — this server runs on infrastructure we host behind our gateway, and what you install is the connection to it.
Claude Code has its own MCP command, and the key rides on it as a header — the gateway refuses a call that carries none. Claude Code reads MCPRUSH_KEY each time it connects, so the key stays out of its config: export your key from Access in your shell profile (macOS, Linux), or run setx MCPRUSH_KEY <your key> and open a new terminal (Windows). Or let npx mcprush@latest add diegoperezg7/mcp-guard-scan write the entry with the key for you; --scope user makes it available in every project. The first connection after a quiet spell starts the server, which takes up to a minute: if your client says it failed to connect, reconnect after that (/mcp in Claude Code).
claude mcp add --transport http --scope user mcp-guard-scan https://mcprush.com/gw/mcp-guard-scan/mcp --header 'Authorization: Bearer ${MCPRUSH_KEY}'Reconnect, or start a new session, and the tools appear in the model’s tool list.
Nothing is required, but it can take MCP_GUARD_ALLOW_STDIO (Set to 1 to add scan_stdio_server, which starts the command it is given), MCP_GUARD_ALLOW_PRIVATE_NETWORK (Set to 1 to let scan_server reach local and private addresses, over http too), LOG_LEVEL (pino log level; logs go to stderr) if you want to set them.
One config entry pointing at the gateway. The server itself runs on infrastructure we host, so nothing from this listing executes on your machine.
4 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Run every static mcp-guard rule over a tools/list result you already have: { "tools": [...] }, a bare array of tools, or { "servers": [{ "name", "tools" }] } to also check shadowing between servers. Nothing is started or contacted. Returns a Markdown report and the findings.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| export | yes | The tools/list result, or several servers under a servers key. | |
| name | string | no | Server name used in the report when the export has none. |
| fail_on | string | no | passed is false when a finding is at or above this severity. |
Connect to a Streamable HTTP MCP endpoint, list its tools, resources and prompts, run every static rule and check the transport (TLS, auth, CORS, session handling). The scanned server's tools are never called. Only public https endpoints; local and private addresses are refused unless the server runs with MCP_GUARD_ALLOW_PRIVATE_NETWORK=1.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | Streamable HTTP endpoint, e.g. https://example.com/mcp. |
| headers | object | no | HTTP headers for the endpoint, e.g. Authorization. |
| fail_on | string | no | passed is false when a finding is at or above this severity. |
List every MCPG rule with its category, default severity and whether it is static or needs the CLI's --probe mode.
No parameter schema on file.
Explain one rule, e.g. MCPG-002: what it detects, a bad and a good example, how to fix it and references.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Rule id, e.g. MCPG-002. |
- Every tool, no call limit, and mcprush charges nothing
- A buyer key from your dashboard — the gateway refuses a call without one
- Answers through our gateway, so every call is in your log
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install mcp-guard-scan or to call it, and its free tier carries no monthly call limit.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | high | capability blast radius (high) — client exposure if the model is manipulated | −6 |
| verification-discount | repo | publisher verification (public source) — no provenance, but the source is public and inspectable | −1 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
Tools were statically extracted from the published source (5 recovered), not enumerated from a running server. Tool-poisoning, Unicode-smuggling, capability and toxic-flow analysis ran on this inferred surface, but a mis-parsed registration could be missed or mis-attributed, so tool-derived findings are capped below “confirmed”. To grade the real runtime surface, scan the running server: --command "npx -y <package>".
1 of the 5 recovered tools are registered only when opts.allowStdio holds (src/mcp/server.ts:240) — typically when a key or option is configured. They are part of the server's surface and were analysed; a server started without that configuration exposes only the other 4.
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. high is the level these add up to.
4 tools are registered unconditionally · 1 more only when opts.allowStdio holds (src/mcp/server.ts:240) — typically when a key or option is configured. All 5 are in the table below and were analysed; the conditional ones are marked.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| scan_tools_export | no tags | |
| scan_server | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| scan_stdio_server conditional | code-execexternal-sink | code-exec: parameter "command"; external-sink: declares readOnlyHint: false, openWorldHint: true |
| list_rules | no tags | |
| explain_rule | no tags |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
The gateway serves every install the publisher’s current release, so a release cannot be pinned or rolled back to here yet. The history below is for reading; the current release on file is 0.1.0.
- The version this listing went live with, after review.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish mcp-guard-scan can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.