agent-runtime-validati…
Plans and evaluates bounded runtime tests of AI agents, tools, memory, hooks, approvals, and scope enforcement. Use when static…
Reviews an MCP server's tool surface for tool poisoning, over-broad parameters, missing descriptions, and privilege escalation paths. Use when auditing, onboarding, or writing an MCP server, or when a user asks whether a server is safe to connect to an agent.
Claude Code
$ npx -y skills add zero-lab-ai/skills --skill agent-surface-audit --agent claude-code
Codex
$ npx skills add zero-lab-ai/skills --skill agent-surface-audit -a codex -y
Cursor
$ npx skills add zero-lab-ai/skills --skill agent-surface-audit -a cursor -y
Gemini CLI
$ npx skills add zero-lab-ai/skills --skill agent-surface-audit -a gemini-cli -y
GitHub Copilot
$ npx skills add zero-lab-ai/skills --skill agent-surface-audit -a github-copilot -y
OpenCode
$ npx skills add zero-lab-ai/skills --skill agent-surface-audit -a opencode -y
Windsurf
$ npx skills add zero-lab-ai/skills --skill agent-surface-audit -a windsurf -y
name: agent-surface-audit description: "Reviews an MCP server's tool surface for tool poisoning, over-broad parameters, missing descriptions, and privilege escalation paths. Use when auditing, onboarding, or writing an MCP server, or when a user asks whether a server is safe to connect to an agent." allowed-tools: Read Grep Glob Bash
An MCP server hands an agent a set of tools. Each tool is a name, a description the model reads, and a parameter schema the model fills in. The attack surface is those three things plus whatever the tool does when called. This skill reviews the surface deterministically first, then reads the implementation for the parts a scanner cannot judge.
1. Get the server's tool list as JSON. Any of these work:
same JSON shape (see `references/manifest-format.md`) 2. Run the checker:
uv run {baseDir}/scripts/inspect_tools.py path/to/tools.jsonIt prints one finding per line with a severity and exits non-zero if the input contains zero tools. An empty manifest is a failed review, not a clean one. 3. For every `high` finding, open the implementation and confirm whether the risk is real (step 4). For `medium` and `info`, record them and move on. 4. Read the implementation for what the scanner cannot see, using `references/checklist.md`:
SQL, or URL?
5. Write findings with the `findings-report` skill if it is installed; otherwise use the structure in `references/finding-shape.md`.
Return one compact review record before writing individual findings:
| Field | What to record | | --- | --- | | Scope | Server name, version or commit, deployment context, and tool count | | Manifest signals | Every scanner result, including medium and informational signals | | Implementation checks | The code path reviewed for each high-risk parameter or side effect | | Privilege paths | What data, credentials, networks, and hosts the server can actually reach | | Evidence gaps | Missing source, deployment configuration, or runtime controls | | Disposition | Acceptable as deployed, acceptable with stated constraints, or reject pending change |
Do not call the server safe merely because the manifest scan is clean. A clean manifest means the description and parameter surface passed; the implementation and deployment blast radius remain separate claims.
| Check | Why it matters | | --- | --- | | Imperative text in a description (`ignore`, `always`, `you must`, `before calling`) | Tool poisoning: descriptions are prompt text the model obeys | | Description references other tools or the system prompt | Cross-tool shadowing and instruction override | | Hidden text markers (`<!-- -->`, zero-width chars, `<IMPORTANT>`) | Content meant for the model, not the human reviewer | | Free-form string parameter named like a command, path, query, or URL | Injection sink; the model fills it from untrusted context | | Parameter with no description or `additionalProperties: true` | Model guesses; reviewer cannot bound behavior | | Tool name implies destructive action with no confirmation parameter | Irreversible side effect on a single model decision | | Tool with no description at all | Unreviewable; the model will invent one |
Severity is assigned by the script and is a starting point, not a verdict.
sandboxed dev container is the product. `run_command` on a production host reachable from a chat window is critical. Severity follows the blast radius of the deployment, which is in the config, not the manifest.
`get_schema` before `run_query`" is good UX. "Ignore prior instructions about credentials" is an attack. The script flags both; you decide, and you record why.
that takes a path parameter can still read secrets. Check what the path is resolved against.
shipped `run_command` with no sandbox and descriptions with hidden instructions. Reputation changes the prior, not the review.
do not, and the approval prompt shows the tool name, not the parameters. Review as if every call auto-approves.
the type, not the content. A `string` with `maxLength: 10000` is a shell command.
cloud credentials, and source trees are. Local is the high-value target.
many tools, and that is the first finding. Review all of them; the script makes the first pass cheap.
In Claude Code, the server's tool list can be read from the active session's MCP co
Portable, evidence-bound security skills for authorized defensive assessment, penetration testing, red teaming, detection engineering, purple teaming, and engagement operations. The collection contains 56 skills in 10 installable plugins from zero-lab.ai.
Plans and evaluates bounded runtime tests of AI agents, tools, memory, hooks, approvals, and scope enforcement. Use when static…
Maps identity, authority, instruction, data, memory, and approval propagation across agents and agent-to-agent handoffs. Use when…
Assesses whether direct, indirect, multi-turn, retrieved, or tool-mediated instructions can override an AI system's intended…
Maps cloud identity and authorization paths across AWS, Azure, GCP, and hybrid trust boundaries, separating proven access from…
Tracks embedded-device and firmware assessment coverage across exact units, acquisition methods, debug interfaces, stored…
Tracks Android and iOS application assessment coverage across packages, platform components, local storage, device behavior,…
Use for authorized security assessment of REST, GraphQL, WebSocket, or SOAP APIs, including discovery, authentication,…
Extract and decrypt Windows DPAPI-protected secrets (Credential Manager, browser logins/cookies, Wi-Fi credentials, KeePass keys)…
Clean and finalize authorized natural-language text intended for readers by auditing suspicious invisible Unicode and rewriting…