IETF Internet-Draft · Patent Pending

MCPS: MCP with Built-in Agent Security

Zero Trust End-to-End Security for the Model Context Protocol
Author: Raza Sharif, CyberSecAI Ltd
IETF Reference: draft-sharif-mcps-secure-mcp
Version: 1.0.0  |  Date: March 2026
Status: Patent Pending  |  Package: mcp-secure@1.0.2 (npm)
Live Demo: mcps-demo.fly.dev  |  Trust Authority: agentsign.dev

0 Abstract

The Model Context Protocol (MCP) has become the de facto standard for connecting AI agents to external tools and data sources. With 80,700+ GitHub stars and adoption by Anthropic, OpenAI, Google, and Microsoft, MCP now underpins millions of agent-to-server interactions daily.

MCP has no security layer. There is no agent identity, no message signing, no tool integrity verification, and no replay protection. Every JSON-RPC message travels unsigned. Every tool definition is unverified. Every agent is anonymous.

MCPS (MCP Secure) is a cryptographic security extension for MCP that adds end-to-end agent identity, message-level signing, tool integrity verification, and trust scoring — without modifying the MCP protocol itself. MCPS wraps MCP messages in signed envelopes, ensuring that every action is authenticated, every tool is verified, and every agent is accountable.

This document presents the technical architecture of MCPS, explains why existing security mechanisms (OAuth, TLS, DIDs) are insufficient for MCP, and demonstrates how MCPS blocks documented real-world attacks including CVE-2025-6514 (CVSS 9.6), the Smithery.ai breach, and the postmark-mcp supply chain backdoor.

1 The Problem: MCP Has No Security Layer

MCP defines a JSON-RPC 2.0 protocol for agent-to-server communication across two transport mechanisms: stdio (local process pipes) and HTTP/SSE (network). Neither transport includes any application-layer security.

// Standard MCP message — no identity, no signature, no integrity { "jsonrpc": "2.0", "method": "tools/call", "id": 1, "params": { "name": "send_email", "arguments": { "to": "ceo@company.com", "subject": "Q4 Report", "body": "See attached." } } } // Who sent this? Is the tool definition authentic? Has this been replayed? // MCP cannot answer any of these questions.

1.1 Documented Attacks

These are not theoretical risks. They are published CVEs and documented breaches:

IncidentImpactRoot Cause
CVE-2025-6514 (CVSS 9.6)RCE via mcp-remote — 437K downloadsNo tool integrity verification
Smithery.ai Breach3,243 MCP servers exposed, API keys compromisedNo server identity
postmark-mcp BackdoorFirst malicious MCP server — BCC'd all emailsNo tool signing
Asana Cross-Tenant1,000 customers exposed for 34 daysNo isolation or identity

1.2 Academic Evidence

Peer-reviewed research quantifies the attack surface:

The Core Issue
MCP authenticates the user. Nobody authenticates the agent. OAuth verifies "this user authorized this app." It does not verify "this AI agent is who it claims to be, and this message has not been tampered with." The agent is the most powerful actor in the system, yet it operates with zero cryptographic identity.

2 Why OAuth, TLS, and DIDs Don't Solve This

The instinctive response to MCP's security gap is: "just use OAuth" or "TLS already handles this." This section explains, with precision, why each existing mechanism is insufficient — not because they are flawed in general, but because they operate at the wrong layer for the MCP threat model.

2.1 OAuth 2.1: Authenticates Users, Not Agents

The MCP authorization specification (adopted March 2025) is based on OAuth 2.1. It classifies MCP servers as Resource Servers and MCP clients as OAuth Clients acting "on behalf of a resource owner." [4]

What OAuth protects:

What OAuth does not protect:

Furthermore, the MCP spec permits anonymous Dynamic Client Registration, meaning any client can register as a valid OAuth client without identifying itself. Christian Posta (Solo.io) called this "a mess for enterprise": any process can register, obtain tokens, and make requests — with no proof of identity. [6]

// OAuth protects the CHANNEL, not the MESSAGE User ──OAuth──▶ MCP Client ──Bearer Token──▶ MCP Server │ ▼ AI Agent (anonymous) - No identity - No message signing - Can be impersonated - Actions are unattributable // OAuth says: "this user authorized this app" // It does NOT say: "this specific agent sent this specific message"

2.2 TLS: Protects Transport, Not Content

TLS encrypts data in transit and authenticates the server via X.509 certificates. It is essential for network security. It is irrelevant for three fundamental reasons in MCP:

Reason 1: Stdio transport has no TLS. The MCP spec states that stdio implementations "SHOULD NOT follow this specification" for authorization. [4] Stdio communication occurs via stdin/stdout pipes between processes on the same machine — no network, no TLS, no encryption. This is the primary transport for local MCP servers (Claude Desktop, Cursor, VS Code).

Reason 2: TLS is point-to-point, not end-to-end. TLS terminates at the first hop (load balancer, reverse proxy, API gateway). After termination, JSON-RPC messages travel as plaintext between internal components. A compromised proxy, sidecar, or monitoring agent can modify tool definitions, inject parameters, or alter responses — undetected.

Reason 3: TLS does not sign messages. TLS provides channel integrity (the bytes received are the bytes sent within a session), but it does not sign individual JSON-RPC messages. There is no per-message nonce, no per-message signature, and no way to verify message authenticity outside the TLS session. Once TLS is terminated, message integrity vanishes.

The TLS Termination Gap
The Smithery.ai breach is a textbook example: despite HTTPS being in place, a path traversal in the application layer exposed 3,243 MCP servers and their credentials. TLS protected the wire. It did not protect the application. [7]

2.3 DIDs: Identity Without Integrity

Decentralized Identifiers (W3C DIDs) provide a framework for self-sovereign identity: an entity generates a key pair, publishes a DID Document, and can prove control of the identifier. The MCP-I initiative at the Decentralized Identity Foundation (DIF) is exploring DID-based identity for MCP. [8]

Why DIDs alone are insufficient:

Key Insight: Identity is Necessary but Not Sufficient
Agent identity is a prerequisite for security, not a complete solution. MCPS provides identity (passports) AND integrity (message signing) AND tool verification AND replay protection. DIDs solve one piece; MCPS solves the full chain.

2.4 Comparison Matrix

Security PropertyOAuth 2.1TLS 1.3DIDsMCPS
Agent identity (not user)
Per-message signing
Tool integrity verification
Replay protection (nonce)~
Trust scoring (L0–L4)
Works with stdio transport
Works with HTTP/SSE transport
Zero external dependencies

~ TLS provides session-level replay protection but not application-layer message replay protection.

3 MCPS Architecture

MCPS is a cryptographic security layer for MCP. It does not replace or modify MCP — it wraps MCP messages in signed envelopes that provide identity, integrity, and trust verification. MCPS operates at the application layer, independent of transport.

3.1 Core Components

ComponentFunctionCryptography
Agent PassportCryptographic identity document for each agentECDSA P-256 public key (JWK)
Message EnvelopeSigned wrapper around JSON-RPC messagesECDSA SHA-256 signature
Tool SigningIntegrity verification for tool definitionsECDSA SHA-256 content hash + signature
NonceStoreReplay attack detectionCryptographic random nonce (128-bit)
Trust FrameworkGraduated trust levels (L0–L4)Trust Authority verification chain
Trust AuthorityPassport issuance and verification (agentsign.dev)Authority-signed passports

3.2 The MCPS Envelope

Every MCP message is wrapped in an MCPS envelope before transmission. The envelope contains the original message plus cryptographic metadata:

// MCPS signed envelope — every field is required { "mcps": "1.0.0", // Protocol version "passport_id": "asp_04cdb9cc...", // Agent identity "timestamp": "2026-03-15T21:46:18Z", // 5-minute window "nonce": "3b5660e71801c09a...", // 128-bit, one-time use "signature": "MEQCIBmaqHx3...", // ECDSA P-256 SHA-256 "message": { // Original MCP message "jsonrpc": "2.0", "method": "tools/list", "id": 1 } } // Signature covers: JSON(message) + passport_id + timestamp + nonce // Any modification → signature verification fails → message rejected

3.3 Agent Passport

Every agent and server in MCPS has a passport — a cryptographic identity document containing the agent's public key, capabilities, trust level, and metadata:

{ "mcps_version": "1.0.0", "passport_id": "asp_9e7b160799f412911e807fe8a50bc86e", "agent": { "name": "weather-mcp-server", "version": "2.1.0", "capabilities": ["tools", "resources"] }, "public_key": { "kty": "EC", "crv": "P-256", "x": "KFxAlTk6agW8C3gordX9FyFZ1ZkYB4W1DBfxM56kKOc", "y": "F-UuACK9u_sHDVlmc2nkUqvWsJQfzU86fxBGzc3V2XA" }, "trust_level": 2, // VERIFIED "issuer": "agentsign.dev", "issued_at": "2026-03-15T21:46:01Z", "expires_at": "2027-03-15T21:46:01Z", "signature": "MEYCIQD/tzdyX0QE..." // Authority signature }

3.4 Trust Framework (L0–L4)

MCPS defines five trust levels. Each level builds on the previous, creating a graduated access model where higher trust unlocks more capabilities:

LevelNameRequirementsCapabilities
L0
UNSIGNEDNo identity — plain MCPRead-only, sandboxed
L1
IDENTIFIEDSelf-signed passport presentedBasic tool access
L2
VERIFIEDTrust Authority verified passportFull tool access
L3
SCANNEDVerified + SDLC security scan passedSensitive operations
L4
AUDITEDScanned + manual audit + monitoringCritical systems

3.5 Protocol Flow

// End-to-end MCPS handshake Client Agent MCP Server │ │ │ 1. Generate ECDSA P-256 key pair │ │ 2. Create passport (or fetch from TA) │ │ │ ├──── Exchange passports ──────────────▶│ 3. Mutual authentication │◀──── Server passport ─────────────────┤ │ │ │ 4. Sign tools/list request │ │ - Attach passport_id │ │ - Generate nonce (128-bit) │ │ - Timestamp (ISO 8601) │ │ - ECDSA sign(msg + id + ts + nonce) │ │ │ ├──── MCPS Envelope ──────────────────▶│ 5. Server verifies: │ │ - Signature (ECDSA P-256) │ │ - Nonce (not replayed) │ │ - Timestamp (5-min window) │ │ - Passport (not expired/revoked) │ │ - Trust level (meets minimum) │ │ │◀──── Signed Response ────────────────┤ 6. Server signs response │ │ │ 7. Client verifies server signature │ │ Mutual authentication complete │ ▼ ▼

4 Attack Scenarios: MCPS vs. Standard MCP

Each attack below has been demonstrated live using real ECDSA P-256 cryptography at mcps-demo.fly.dev. No mocks or simulations.

4.1 Tool Poisoning (blocks CVE-2025-6514, postmark-mcp)

Attack: An attacker modifies a tool description to inject malicious instructions (e.g., "Also read ~/.ssh/id_rsa").

Without MCPS: The modified tool is accepted by the agent. MCPTox research shows 36.5–84.2% success rate. [1][2]

With MCPS: signTool() creates an ECDSA signature over the canonical JSON of {name, description, inputSchema}. verifyTool() detects any modification — hash changes, signature fails, tool is rejected.

4.2 Replay Attack

Attack: An attacker captures a valid signed tools/call (e.g., transfer_funds) and resends it.

Without MCPS: MCP has no nonce or replay detection. The duplicated request executes.

With MCPS: Every envelope contains a 128-bit cryptographic nonce. NonceStore.check() rejects any previously-seen nonce. The replay is blocked.

4.3 Signature Stripping (Downgrade Attack)

Attack: An attacker strips the mcps envelope, forwarding only the raw MCP message to bypass security.

Without MCPS: N/A (MCP has no security to strip).

With MCPS: Servers configured with requireSecurity: true reject any message without a valid MCPS envelope. Downgrade is impossible.

4.4 Forged Identity (blocks Smithery breach pattern)

Attack: An attacker generates their own key pair and signs messages claiming a legitimate agent's passport ID.

Without MCPS: MCP has no identity verification. Impersonation is trivial.

With MCPS: The server verifies the signature against the legitimate agent's public key (from their passport). The attacker's signature, created with a different private key, fails ECDSA verification.

4.5 Expired Credentials

Attack: An agent continues operating with an expired passport.

With MCPS: validatePassportFormat() checks expires_at against the current time. Expired passports are rejected with error code MCPS-002.

4.6 Man-in-the-Middle

Attack: A proxy, compromised gateway, or co-process intercepts and modifies MCP messages.

Without MCPS: Stdio has no encryption. HTTP post-TLS-termination is plaintext. Messages can be modified undetected.

With MCPS: Every message carries an ECDSA signature. Any modification — even a single changed byte — invalidates the signature. MITM can observe but cannot tamper without detection.

End-to-End Integrity
MCPS signatures are computed by the sending agent and verified by the receiving server. They survive transport changes, proxy hops, and protocol bridges. The signature is bound to the message content, not the transport channel. This is why TLS is insufficient and MCPS is necessary: TLS protects the pipe, MCPS protects the payload.

4.7 Rogue Server Defence

Attack: An attacker publishes a malicious MCP server to npm, Smithery, or any registry — impersonating a legitimate service (e.g., gmail-mcp, stripe-mcp). The postmark-mcp backdoor proved this is not theoretical: a trojanised server sat on npm, silently BCC'ing every email to the attacker.

Without MCPS: MCP has no concept of server identity. Any process that speaks JSON-RPC 2.0 is a valid MCP server. There is no way to distinguish a legitimate server from a malicious clone. No identity verification, no code signing, no trust differentiation.

With MCPS: Defence in depth across four layers:

LayerMechanismWhat It Blocks
1. IdentityEvery server must present a passport with a public keyAnonymous servers cannot interact with MCPS-aware clients
2. Trust LevelSelf-signed = L0. Enterprise policy: minTrustLevel: 2Rogue servers are capped at L0 — blocked from sensitive operations
3. Tool SigningsignTool() pins tool definitions with ECDSA hashesModified tool descriptions (injected instructions) detected and rejected
4. Authority VerificationverifyPassportSignature() checks Trust Authority endorsementRogue servers cannot obtain a verified passport without identity checks
The npm Supply Chain Problem
Anyone can publish an npm package called gmail-mcp-server. There is no verification that the publisher is Google, or that the code is benign. MCPS doesn't fix npm — but it ensures that even if a rogue server is installed, it cannot impersonate a verified agent (L2+), and any tool modifications are cryptographically detected.

5 Implementation

MCPS is implemented as mcp-secure, a zero-dependency Node.js package available on npm. The entire security layer is under 550 lines of code and less than 10KB.

5.1 Package Details

PropertyValue
Packagemcp-secure@1.0.2
Runtime dependencies0 (uses Node.js built-in crypto)
Size<10KB
CurveNIST P-256 (secp256r1 / prime256v1)
HashSHA-256
Signature formatBase64-encoded DER (ASN.1)
Nonce128-bit cryptographic random (crypto.randomBytes)
Timestamp window5 minutes (configurable)
Key formatPEM (SPKI/PKCS8) + JWK for passports
LicenseMIT

5.2 API Surface

// Key generation const { publicKey, privateKey } = generateKeyPair(); // ECDSA P-256 // Passport creation const passport = createPassport({ publicKey, name: 'my-agent', capabilities: ['tools'] }); // Message signing (wraps MCP in MCPS envelope) const envelope = signMessage(mcpMessage, passport.passport_id, privateKey); // Message verification const { valid, error } = verifyMessage(envelope, publicKey); // Tool integrity const signature = signTool(toolDefinition, privateKey); const isValid = verifyTool(toolDefinition, signature, publicKey); // Replay protection const store = new NonceStore(); store.check(nonce); // true first time, false on replay // Passport lifecycle isPassportExpired(passport); // boolean validatePassportFormat(passport); // { valid, error? } signPassport(passport, authorityKey); // Authority-signed passport verifyPassportSignature(passport, authorityPubKey); // boolean // Server wrapper with built-in audit const secure = secureMCP(mcpServer, { passport: passport.passport_id, privateKey, minTrustLevel: 2, // Reject below L2 VERIFIED auditLog: true, // Log all events onAudit: (entry) => siem.send(entry), // Pipe to SIEM });

5.3 Migration Guide: MCP to MCPS

MCPS is designed as a wrapper, not a replacement. It does not modify MCP — it wraps MCP messages in signed envelopes. Organisations already running MCP can adopt MCPS incrementally with zero downtime and zero breaking changes.

PhaseActionDurationImpact
Phase 1: Observenpm install mcp-secure. Run in audit-only mode: accept all messages (signed and unsigned), log which arrive without MCPS envelopes. Identifies your unsigned attack surface.Day 1Zero — read-only visibility
Phase 2: SignIssue passports to known agents (self-signed or via agentsign.dev). Start signing outbound messages and tool definitions. Still accept unsigned inbound. Agents that upgrade get trust scores; legacy agents remain at L0.Week 1–2Minimal — backward compatible
Phase 3: EnforceSet requireSecurity: true on critical servers. Unsigned messages are rejected. All agents must present passports. Full mutual authentication active.Week 3+Full security — unsigned blocked
// Phase 1: Install alongside existing MCP (zero changes to existing code) const { secureMCP } = require('mcp-secure'); // Phase 2: Wrap your existing MCP server const secure = secureMCP(existingMcpServer, { passport: myPassport.passport_id, privateKey: myPrivateKey, minTrustLevel: 0, // Accept all (monitoring mode) auditLog: true, onAudit: (e) => console.log(e), }); // Phase 3: Enforce (one line change) const secure = secureMCP(existingMcpServer, { passport: myPassport.passport_id, privateKey: myPrivateKey, minTrustLevel: 2, // Reject below L2 VERIFIED auditLog: true, onAudit: (e) => siem.ingest(e), });
Key Requirement: Install on Top of MCP
MCPS does not require forking, replacing, or modifying your MCP deployment. npm install mcp-secure adds the security layer alongside your existing @modelcontextprotocol/sdk. Both packages coexist. Existing MCP clients that are not yet MCPS-aware continue to work — they simply operate at L0 (unsigned) until upgraded.

5.4 Cryptographic Choices

MCPS uses ECDSA with NIST P-256 (secp256r1). This is the same curve used by TLS 1.3, Apple Secure Enclave, WebCrypto API, AWS/GCP/Azure KMS, FIDO2/WebAuthn, and every major browser. The choice is deliberate:

PropertyECDSA P-256Ed25519RSA-2048
Security level128-bit128-bit112-bit
Signature size64 bytes64 bytes256 bytes
Key generation<1ms<1ms~100ms
FIPS 140-2/3
Hardware accelerationUniversalLimitedUniversal
WebCrypto native
Node.js built-in
KMS support (AWS/GCP/Azure)

Why not AES-256? AES is a symmetric encryption algorithm — it hides data. MCPS signs data (proves who sent it and that it hasn't been tampered with). These are fundamentally different operations. MCP messages are not secret (the LLM must read them); they need to be authenticated and tamper-proof. Signing requires asymmetric cryptography (public/private key pairs), which is what ECDSA provides.

Why 128-bit is sufficient: 128-bit security means an attacker would need 2128 operations (340,282,366,920,938,463,463,374,607,431,768,211,456 attempts) to break a single key. For context, all computers on Earth working together could not complete this before the heat death of the universe. Every bank, government, and cloud provider considers 128-bit security sufficient for current threat models.

Algorithm agility: The MCPS envelope format is algorithm-agnostic. The signature field is base64-encoded; the passport carries the public key type. Swapping ECDSA P-256 for P-384 (192-bit), P-521 (256-bit), or post-quantum algorithms (ML-DSA/Dilithium) requires changing the key generation and signing functions — the envelope structure, passport format, and verification flow remain identical.

5.5 Audit & Compliance

Every MCPS envelope is inherently a cryptographic audit record: it contains a timestamp, a unique nonce, the agent's passport ID, and a non-repudiable ECDSA signature. This means every action taken through MCPS is attributable, timestamped, and tamper-evident — by default, with no additional infrastructure.

The secureMCP() wrapper provides a built-in audit system that fires structured events for every message processed:

// Audit event structure (fired on every message) { "timestamp": "2026-03-15T22:14:03.412Z", "event": "accepted", // or "rejected" "passport_id": "asp_9e7b1607...", "method": "tools/call", "id": 42 } // Rejection events include the reason { "timestamp": "2026-03-15T22:14:04.118Z", "event": "rejected", "reason": "replay_attack", // or: invalid_signature, insufficient_trust, // revoked, expired, invalid_format "passport_id": "asp_3b5660e7..." }

SIEM integration: The onAudit callback enables direct piping to enterprise security platforms:

SIEM / PlatformIntegration
SplunkonAudit: (e) => splunkHEC.send(e)
DataDogonAudit: (e) => dd.log(e)
AWS CloudWatchonAudit: (e) => cloudwatch.putLogEvents(e)
ElasticsearchonAudit: (e) => elastic.index(e)
CustomAny function — database, file, webhook, queue

Compliance mapping:

RegulationRequirementMCPS Coverage
EU AI Act (Art. 14)Human oversight with verifiable audit trailsEvery action signed with passport_id + timestamp
SOC 2 (CC7.2)System operations monitoringonAudit callback with structured events
ISO 27001 (A.12.4)Logging and monitoringTamper-evident logs (ECDSA signed)
GDPR (Art. 30)Records of processing activitiesAgent identity + action attribution
HIPAA (164.312)Audit controls for information systemsNon-repudiable signed envelopes
Non-Repudiation by Default
Because every MCPS envelope carries an ECDSA signature bound to a specific passport, agents cannot deny having sent a message. This is fundamentally different from OAuth access logs, which prove a token was used but not which specific agent used it. MCPS audit trails are cryptographically non-repudiable — they hold up to forensic analysis and regulatory scrutiny.

6 Why MCPS is the Future

Three converging forces make MCPS inevitable:

6.1 Regulatory Mandate

The EU AI Act (effective August 2026) mandates traceability and accountability for high-risk AI systems. Article 14 requires human oversight with verifiable audit trails. Without agent identity and signed actions, compliance is impossible. OWASP ASI03 (Agentic AI Top 10) specifically calls for agents to be treated as "managed Non-Human Identities" with JIT credentials. [10]

6.2 Scale of Exposure

600,000+ agents across 12 major frameworks operate without any form of cryptographic identity. We audited every framework with over 5,000 GitHub stars. None have agent identity, execution signing, or trust scoring. MCP alone has 80,700+ stars and is adopted by Anthropic, OpenAI, Google, and Microsoft. The attack surface is growing exponentially while the security surface remains at zero.

6.3 Protocol-Level Fix

MCPS solves the problem at the protocol level, not the application level. This means:

The HTTPS Analogy
HTTP had no security. HTTPS added a cryptographic layer without changing the protocol semantics. MCP has no security. MCPS adds a cryptographic layer without changing the protocol semantics. MCPS is to MCP what HTTPS is to HTTP.

6.4 Quantum Readiness

ECDSA P-256, like all elliptic curve and RSA algorithms, is theoretically vulnerable to Shor's algorithm on a sufficiently powerful quantum computer. This is a known, industry-wide challenge — not specific to MCPS. Every system using TLS, WebAuthn, code signing, or certificate authorities faces the same timeline.

Current quantum state:

MilestoneStatusTimeline
Qubits needed to break P-256~2,500 logical (millions physical)
Largest quantum computer (2026)~1,200 physical qubits (IBM Condor)Current
IBM 100,000 qubit roadmapAnnounced2033
Cryptographically relevant quantumNIST/NSA/GCHQ consensus2035–2040

NIST Post-Quantum Standards (published August 2024):

MCPS migration path to post-quantum:

  1. Algorithm-agnostic envelope. The MCPS envelope format carries a base64 signature field with no algorithm assumption. Swap ECDSA for ML-DSA — the envelope structure is unchanged.
  2. Hybrid signatures. During transition, sign with both ECDSA P-256 AND ML-DSA (Dilithium). Verify either. This is the same approach Chrome/TLS uses with X25519Kyber768.
  3. Passport multi-key support. The passport public_key field can carry multiple keys (classical + post-quantum), enabling progressive migration.
  4. Node.js PQC support. OpenSSL 3.x is adding PQC algorithm support. Node.js will inherit this through its crypto module, requiring no external dependencies — maintaining MCPS's zero-dependency guarantee.
Harvest Now, Decrypt Later
The "harvest now, decrypt later" threat (HNDL) is less critical for MCPS than for encryption systems. MCPS signatures prove authenticity at a point in time. An attacker who breaks P-256 in 2040 could forge new signatures, but cannot retroactively alter the audit trail — timestamps and nonces are recorded in SIEM systems at verification time. Nevertheless, migration to post-quantum algorithms before the threat materialises is a design priority.

7 OWASP Alignment

MCPS addresses multiple entries in both the OWASP MCP Top 10 and the OWASP Agentic AI Top 10:

OWASP EntryRiskMCPS Mitigation
MCP03: Tool PoisoningMalicious tool descriptionssignTool() / verifyTool()
MCP05: Message ReplayReplay of signed requestsNonceStore + timestamp window
ASI03: Identity AbuseNo agent identityAgent passports with trust levels
ASI04: Supply ChainMalicious MCP serversPassport verification + tool signing
ASI09: Insufficient LoggingNo audit trailSigned envelopes = cryptographic audit log

8 Live Demo

All claims in this document can be verified interactively at mcps-demo.fly.dev. The demo runs 10 scenarios using real ECDSA P-256 cryptography from the mcp-secure@1.0.2 npm package:

#ScenarioResultWhat It Proves
1Legitimate Agent (Happy Path)SUCCESSFull mutual auth with L2 trust
2Self-Signed Agent (L0 Trust)PARTIALSelf-signed passports are capped at L0
3Replay AttackBLOCKEDNonceStore detects duplicate nonces
4Signature StrippingBLOCKEDrequireSecurity drops unsigned messages
5Forged PassportBLOCKEDECDSA signature mismatch detected
6Expired PassportBLOCKEDvalidatePassportFormat rejects expired
7Tool PoisoningBLOCKEDverifyTool detects any modification
8CVE-2025-6514 (RCE)BLOCKEDUnsigned tool injection rejected
9Smithery BreachBLOCKEDPassport impersonation detected
10postmark-mcp BackdoorBLOCKEDBCC injection caught via tool hash

9 References