MCPSafe.io
RegistryThreatsMethodologyDocsPricingScanSign in
MCPSafe.io

Security checks for MCP servers — public packages and private repos, fast or deep.

Legal

Privacy PolicyCookie PolicyTerms of ServiceSecurity disclosure

Resources

State of MCP SecuritySupportSystem statusMade in Germany 🇩🇪

© 2026 MCPSafe. All rights reserved.

GDPR — Privacy Policy
← Threat Catalog

Configuration & Environment

JWT signature verification disabled

HIGHCWE: CWE-347Rule: MCP-230

MCP server decodes JWTs with `verify=False`, `algorithms: ["none"]`, or bare `jwt.decode()` from the JS jsonwebtoken package — accepting unsigned tokens that any client can forge.

What it is

JWT signature verification is the only thing standing between attacker-controlled token claims and the application trusting them. Disabling it (Python `verify=False`, JS `algorithms: ["none"]`, or PyJWT's `options={"verify_signature": False}`) means base64-decoded attacker input becomes a trusted identity.

Why it matters for MCP

MCP servers that use OAuth or session-style JWTs as their auth primitive are common. The disabled-verify pattern most often shows up when a developer was debugging signature errors and forgot to re-enable verification, or copied a snippet from a tutorial that said "in development mode..." The bug ships to production silently.

Vulnerable example

example.py
1
import jwt
2
3
def authenticate(token: str) -> dict:
4
    # No signature verification.
5
    return jwt.decode(token, options={"verify_signature": False})

Secure example

example.py
1
import jwt
2
3
JWT_KEY = os.environ["JWT_PUBLIC_KEY"]
4
5
def authenticate(token: str) -> dict:
6
    return jwt.decode(token, JWT_KEY, algorithms=["RS256"], audience="my-mcp-server")

How MCPSafe detects this

MCPSafe matches three sub-patterns: (1) JS `jwt.verify(token, key, { algorithms: ["none"] })`; (2) Python PyJWT `jwt.decode(..., verify=False)` or `options={"verify_signature": False}`; (3) JS `jwt.decode(token)` (which doesn't validate signature) in a file that imports `jsonwebtoken` and never calls `jwt.verify`.

See the full threat catalog for every documented detection.

Further reading

  • CWE-347: Improper Verification of Cryptographic Signature
  • OWASP: JSON Web Token for Java

Scan an MCP server for this issue

MCPSafe runs this check — and every other rule in the catalog — on any MCP server you paste in.

Scan now