What the check looks at
An MCP server describes its tools in its tools/list response: a name, a description, an input schema and optional annotations for each tool. Your AI assistant reads all of that text as part of its instructions. That makes it a place to hide commands (tool poisoning, OWASP MCP03), and it tells you what the server lets the model do. An A2A Agent Card does the same for an agent you connect to: its endpoints, how to authenticate, and the skills it offers.
The check reads that metadata and applies fixed rules. Each finding has a level (Critical, High, Medium, Low or Info), the exact text that triggered it, a reference, and the matching check in our MCP Security Audit Kit. The rules are deterministic: the same input always gives the same result, and there is no AI involved. Rules version 1.0, checked against MCP specification 2026-07-28 and A2A 1.0.0.
Hidden or manipulative text
Applied to every text the model reads: tool names, titles and descriptions, and every description, title, enum, default and example inside the input and output schemas. For Agent Cards: the name, description and every skill's name, description, tags and examples.
| Flag | Level | Reference | Audit Kit |
|---|---|---|---|
| P1 Invisible or direction-changing Unicode characters | High | OWASP MCP03 Tool Poisoning | C12 |
| P2 Instruction-like text aimed at the model | High | OWASP MCP03 Tool Poisoning; ASI01 Agent Goal Hijack | C12 |
| P3 Refers to secrets or sensitive files | High | OWASP MCP03 Tool Poisoning; ASI03 Identity and Privilege Abuse | C12 |
| P4 Tells the model to use or avoid other tools (shadowing) | Medium | OWASP MCP03 Tool Poisoning | C13 |
| P5 Hidden markup or encoded content | Medium | OWASP MCP03 Tool Poisoning | C12 |
| P6 Unusually long text: read it in full | Info | OWASP MCP03 Tool Poisoning | C12 |
Invisible characters (P1): zero-width characters (U+200B to U+200F, U+2060 to U+2064, U+FEFF), direction controls (U+202A to U+202E, U+2066 to U+2069) and Unicode tag characters (U+E0000 to U+E007F). They are shown as [U+200B] in the result.
Instruction phrases (P2): ignore previous, ignore all previous, ignore the above, disregard previous, disregard all, forget your instructions, do not tell the user, don't tell the user, do not mention, don't mention, without telling the user, without informing the user, do not inform the user, the user must not know, keep this secret, hide this from, before using this tool, before calling this tool, before using any other tool, <important>, </important>, <system>, system prompt, you must always, you must first, always call this tool, this is very important, otherwise the tool will not work, new instructions.
Secret and file references (P3): ~/.ssh, .ssh/, id_rsa, id_ed25519, .env file, /.env, mcp.json, claude_desktop_config, .aws/credentials, .npmrc, .git-credentials, /etc/passwd, /etc/shadow, private key, seed phrase, recovery phrase.
Shadowing phrases (P4): instead of using, do not use the, never use the, rather than using, overrides the, replaces the, use this tool instead; also a description that names another tool of the same server together with "instead", "never", "do not", "replace", "override" or "ignore".
What each tool can do
Each tool gets capability classes from the words in its name and title. Descriptions and parameter names often mention actions as context ("use before you send...", a parameter called transferCountry), so they count only for what a tool reads (untrusted content, private data, files) and, for parameter names, credentials. Hover over a capability in the result to see the words that matched.
| Capability | Words |
|---|---|
| Reads untrusted content | fetch, browse, scrape, crawl, webpage, web page, website, url, urls, inbox, emails, incoming, ticket, tickets, issue, issues, comment, comments, pull request, rss, web search, search the web, download, html |
| Reads private data | customer, customers, database, db, records, crm, personal, employee, employees, patient, account, accounts, documents, drive, repository, repo, private, internal, sql, contacts, calendar, mailbox, inbox, files |
| Changes data | create, update, write, edit, modify, insert, upsert, set, add, commit, merge, move, rename, save, patch, put, append, upload |
| Deletes data | delete, remove, drop, truncate, purge, destroy, erase, wipe |
| Sends data out | send, reply, forward, publish, post, webhook, upload, share, notify, tweet, sms, smtp, message, email, mail, http request, post request, invite |
| Runs code or commands | exec, execute, shell, bash, command, cmd, terminal, eval, run code, python, script, subprocess, spawn, powershell, sandbox |
| File system | file, files, directory, folder, path, filesystem, filepath, filename |
| Payments | payment, payments, pay, transfer, refund, charge, purchase, checkout, wallet, payout |
| Handles credentials | password, passwd, token, api key, apikey, api_key, secret, credential, credentials, oauth |
| Flag | Level | Reference | Audit Kit |
|---|---|---|---|
| C1 Exfiltration path: untrusted content, private data and a way to send data out on one server | Critical | ASI01 Agent Goal Hijack; ASI02 Tool Misuse | C42 |
| C2 Runs code or commands | High | ASI05 Unexpected Code Execution | C34, C35, C36 |
| C3 Declared read-only, but the name or description suggests it changes, deletes, sends or runs something | High | MCP spec: annotations are untrusted unless the server is trusted | C14, C15 |
| C4 No annotations on a tool that changes, deletes, sends or runs something: clients must assume the defaults (not read-only, destructive, open-world) | Medium | MCP schema: ToolAnnotations defaults | C14 |
| C5 Free-text parameter that reaches a URL, path, command, query or recipient | Medium | MCP security best practices; ASI02 Tool Misuse | C16, C34 |
| C6 Takes a secret as a parameter, so the credential passes through the model | High | ASI03 Identity and Privilege Abuse | C32 |
| C7 x-mcp-header on a sensitive parameter: its value is visible to network intermediaries | High | MCP spec (tools, x-mcp-header): SHOULD NOT | C32 |
| C8 One tool with an action or operation argument: reading and changing cannot be allowed separately | Low | ASI02 Tool Misuse | C19 |
| C9 More than 30 tools: fewer tools means fewer ways to misuse them | Info | ASI02 Tool Misuse (least agency) | C19 |
The first rule matters most. A server whose tools together read untrusted content (email, web pages, tickets), reach private data and can send data out gives any agent that uses it an exfiltration path: one injected instruction can make it send the data to an attacker. The same rule is in the AI Agent Risk Calculator.
On annotations: the MCP schema defines four hints, readOnlyHint (default false), destructiveHint (default true), idempotentHint (default false) and openWorldHint (default true), and the specification says clients must treat them as untrusted unless the server is trusted. A tool with no hints should therefore be handled as destructive and open-world.
Specification rules
| Flag | Level | Reference | Audit Kit |
|---|---|---|---|
| S1 Tool name outside the spec rules (1-128 characters; A-Z, a-z, 0-9, _, -, .) | Low | MCP spec (tools, tool names) | C13 |
| S2 Duplicate tool name | Medium | MCP spec (tools, tool names); OWASP MCP03 | C13 |
| S3 inputSchema missing or not an object | Medium | MCP spec (tools): inputSchema MUST be a valid JSON Schema object | C16 |
| S4 Input schema accepts unexpected properties on a tool that changes, deletes, sends or runs something | Low | MCP spec (tools); MCP security best practices | C16 |
| N1 The list is paginated (nextCursor): only the pasted page was checked | Info | MCP spec (pagination) | C09 |
A2A Agent Card rules
Based on the A2A specification 1.0.0. Required fields: name, description, supportedInterfaces, version, capabilities, defaultInputModes, defaultOutputModes and skills. Agent Cards are usually published at /.well-known/agent-card.json.
| Flag | Level | Reference | Audit Kit |
|---|---|---|---|
| A1 Required Agent Card field missing | Medium | A2A 1.0, section 4.4.1 | C09 |
| A2 Interface URL uses http://: production deployments must use encrypted transport | High | A2A 1.0, section 7 (transport security) | C53 |
| A3 Card points to localhost, a private or link-local address | Medium | A2A 1.0, sections 3.1.11, 13.3 | C38 |
| A4 The card declares no authentication | High | A2A 1.0, sections 4.5, 13.1; ASI07 Insecure Inter-Agent Communication | C20 |
| A4p The card declares no authentication (marked as deliberately public) | Info | A2A 1.0, sections 4.5, 13.1 | C20 |
| A5 API key sent in the query string: keys in URLs end up in logs | Medium | A2A 1.0, section 4.5 (APIKeySecurityScheme) | C23 |
| A6 The card is not signed: clients cannot verify it came from its publisher | Medium | A2A 1.0, section 8.4; ASI04 Agentic Supply Chain | C06 |
| A7 Signature header is unusable (alg none or missing, or kid missing) | High | A2A 1.0, section 8.4.2 | C06 |
| A7j Signature key URL (jku) is not HTTPS | High | A2A 1.0, sections 8.4.2, 8.4.3 | C06 |
| A7i Signed: the signature was not verified by this check | Info | A2A 1.0, section 8.4.3 | C06 |
| A8 Push notifications enabled: webhook controls apply | Info | A2A 1.0, section 13.2 | C38 |
| A9 Extended Agent Card available: it must require authentication | Info | A2A 1.0, sections 3.1.11, 13.3 | C20 |
| A10 No provider: you cannot tell who operates the agent | Low | ASI04 Agentic Supply Chain | C06 |
Many of the important controls in A2A are recommendations rather than requirements, such as verifying card signatures and rejecting internal webhook addresses. Read more in A2A security.
ClevSec Pro: compare versions and get the review report
The free check gives every flag, the levels and the fingerprint. With ClevSec Pro you can also paste the version you approved and see what changed (tools added, removed and changed, field by field, with the old and new description), get an action for every flag grouped into fix before use, fix soon and note, an inventory row for the Audit Kit, and a PDF report.
What this check is not
It is not a scanner, a penetration test or an audit. It reads what a server or agent says about itself. It cannot see how the server handles authorization or tokens, what its code does, where it runs, or whether it logs your data, and it does not verify signatures. A clean result means the declared metadata raised no flags, not that the server is safe. For the full review, use the MCP Security Audit Kit and read how to audit an MCP server.
The same rules are available to AI assistants as the mcp_tools_check tool of the ClevSec MCP server, so an assistant can check a server's tools before you enable it.
Frequently Asked Questions
Does this tool scan or connect to my MCP server?
No. It only reads the JSON you paste: the tool names, descriptions, schemas and annotations a server declares, or the fields of an Agent Card. It does not connect to the server, call its tools or fetch anything. That is why it can run entirely in your browser, and why it cannot tell you what the server really does.
How do I get the tools/list response?
Most MCP clients and the MCP Inspector show it: connect to the server and list its tools, then copy the JSON. You can also send a tools/list request yourself. Paste the whole JSON-RPC response, its result object or just the tools array; all three work. If the response has a nextCursor, the list is paginated: fetch every page.
What is the fingerprint for?
Servers can change their tool descriptions after you approved them, and the new text reaches the model without anyone reading it. Record the fingerprint when you approve a server. Before each use or update, check again: a different fingerprint means something changed and needs a new review. The fingerprint is a SHA-256 hash of the tools in canonical JSON (keys sorted, tools sorted by name, _meta and icons left out), so formatting and order do not change it.
Why is a tool flagged when the server is legitimate?
The rules are deliberately simple and published on this page: a word in a tool name or a phrase in a description is enough. Some flags will be false alarms; each one shows the exact text that triggered it so you can judge it in seconds. Flags are prompts to look, not verdicts.
Why does it not trust the readOnlyHint annotation?
The MCP specification says clients must treat tool annotations as untrusted unless they come from trusted servers. A malicious or careless server can mark a destructive tool as read-only. The check compares the hints with the tool's name and title and flags a mismatch, and flags risky tools with no hints at all, because the defaults then mean destructive and open-world.
Is the Agent Card signature verified?
No. The check decodes the protected header of each signature and flags unusable ones (no algorithm, alg none, no key id, a key URL over plain HTTP). Verifying the signature needs the publisher's key; do that in your A2A client before trusting the card.
Is my data stored or sent anywhere?
No. The check runs in your browser and the pasted JSON is never sent to a server. The same rules are also available to AI assistants as the mcp_tools_check tool of the ClevSec MCP server, which does not log inputs.
Related Articles
How to Audit an MCP Server
A step-by-step security review against the MCP specification.
How to Secure MCP Servers and AI Agent Tools
A practical checklist for teams using MCP.
A2A Security
What the A2A 1.0 specification requires and what to add.
OWASP Top 10 for Agentic Applications
The ten agent risks with first controls.
Related Tools
AI Agent Risk Calculator
Score one agent's risk from what it can do and what limits it.
Vendor Risk Assessment
Assess the company behind a server or agent.
Sources
- Model Context Protocol specification 2026-07-28: Tools (tool names, annotations, x-mcp-header, security considerations)
- MCP schema 2026-07-28: ToolAnnotations and their defaults
- Model Context Protocol specification 2026-07-28: Security Best Practices
- Agent2Agent (A2A) Protocol specification 1.0.0: sections 4.4, 4.5, 8.4 and 13
- OWASP MCP Top 10 (beta)
- OWASP Top 10 for Agentic Applications, version 2026 (December 2025)
Disclaimer: This check is for informational purposes only. It reads only the metadata you paste and is not a security test, scan or audit; a result without flags does not mean a server or agent is safe. It does not constitute legal, regulatory or professional advice. Built by ClevSec, makers of EU compliance and security tools; see About.
Last updated: November 2026