
TLDR
- What: FlowGuard is an evidence-grounded security scanner for the Model Context Protocol (MCP) that combines semantic risk triage, reconnaissance-guided probing, and runtime response adjudication to distinguish genuine execution-related vulnerabilities from harmless placeholder signals.
- Who's at risk: Host platforms and autonomous agent frameworks (e.g., Claude Desktop, Cursor) that execute third-party integrations using the Model Context Protocol (MCP).
- Key number: FlowGuard achieves a 0.879 F1 score on Command Injection and 0.942 F1 score on File System Access detection while reducing end-to-end scanning latency by up to 2.23× compared to previous dynamic scanners.
As large language models transition from passive text generators into autonomous agents, they rely increasingly on the Model Context Protocol (MCP) to interact with local files, databases, and remote APIs. Environments like Cursor, Claude Desktop, and other developer tools connect models directly to executable code. This interaction dramatically expands the host's attack surface: a single compromised or malicious MCP server can lead to remote code execution (RCE) or sensitive data extraction.
Existing scanners struggle because they rely either on shallow static pattern-matching (which triggers high false-positive rates on placeholder strings) or naive black-box fuzzing (which struggles to bypass JSON schema-validation layers). FlowGuard addresses this gap by executing an active, closed-loop verification pipeline that forces MCP servers to expose real execution-related vulnerabilities.
Threat Model
The paper models the security boundary around the standard MCP execution model, where the host application and underlying LLM are trusted, but the connected MCP servers (tool providers) are not:
| Attacker | A malicious or vulnerable-but-benign third-party MCP server exposing insecure tools, routing unvalidated parameters to backend sinks, or returning poisoned payloads. |
| Victim | LLM-driven host applications, client execution environments (e.g., Claude Desktop, Cursor), and the downstream agents consuming tool responses. |
| Goal | Trigger remote command execution (RCE), unauthorized directory traversal (File System Access), secret/credential leakage, or hijack agent behavior via prompt injection / tool poisoning. |
| Budget | Black-box protocol access. The scanner interacts strictly through standardized JSON-RPC 2.0 MCP APIs (Session Initialization, Tool Discovery, Tool Invocation, Response Consumption) with no source-code access. |
Background & Related Work
Prior efforts to secure MCP interactions fall into static analysis of server configurations or basic black-box fuzzing. The following table highlights where these existing frameworks fall short:
| Approach | Representative Tool(s) | Primary Layer analyzed | Core Vulnerability / Limitation |
|---|---|---|---|
| Static Code Auditing | MCPScan [1] |
Backend source code and configuration files | Lacks runtime behavioral observation; cannot determine runtime reachability. |
| Metadata Auditing | Agent-Scan [2], MCP-Scanner [34] |
Tool schemas, names, and natural language descriptions | Incapable of verifying execution-level risks; prone to high false-positive rates on safe placeholder credentials. |
| Dynamic Probing (Broad Fuzzing) | A.I.G (AI Infra Guard) [3] |
Run-time black-box tool invocations | Generates generic payloads that trigger immediate JSON schema-validation rejections, failing to reach vulnerable backend paths. |
| Evidence-Grounded Probing | FlowGuard (This Work) | Full MCP interaction loop (Discovery + Invocation + Response) | Requires active execution environments; relies on capable LLM backbones for complex semantic reasoning steps. |
Methodology: The FlowGuard Closed-Loop Pipeline
FlowGuard replaces broad brute-force fuzzing with an intelligent, five-stage verification pipeline: Triage, Recon, Strike, Analysis, and Refinement.
# High-level FlowGuard Execution Loop
def flowguard_audit(mcp_endpoint, max_rounds=5):
# Step 1: Discover and Triage Tools
tools = discover_tools(mcp_endpoint)
candidate_targets = semantic_triage(tools)
for tool, parameter, risk_type in candidate_targets:
# Step 2: Reconnaissance Phase
recon_payload = generate_low_impact_recon_probe(tool, parameter)
recon_response = invoke_tool(mcp_endpoint, tool, recon_payload)
fingerprint = extract_environment_fingerprint(recon_response)
# Step 3: Targeted Strike and Refinement
probe_history = []
for round in range(max_rounds):
strike_payload = generate_strike_payload(tool, parameter, fingerprint, probe_history)
response = invoke_tool(mcp_endpoint, tool, strike_payload)
# Step 4: Evidence Adjudication
verdict = adjudicate_response(tool, strike_payload, response)
if verdict.is_real_finding:
log_vulnerability_report(tool, parameter, verdict)
break
# Step 5: History-Guided Refinement
probe_history.append((strike_payload, response, verdict))
if verdict.should_terminate:
break
1. Semantic Risk Triage
Before executing any probes, FlowGuard uses a three-tier metadata pipeline. First, it runs name-confusion detection (analyzing tool names for leet-speak or typosquatting). Second, it uses fast-path routing rules targeting known risky parameters (e.g., parameters named cmd, exec, or path). Third, for ambiguous parameters, it queries an LLM (the paper utilizes Qwen3-25B-A22B-Instruct as its default model) to categorize and prioritize the parameters into risk labels (RCE, FS, DB, PI, CRED, LOW, SAFE).
2. Reconnaissance (RECON) Probing
Instead of trying to exploit a system immediately, FlowGuard first issues a low-impact, schema-compliant "recon" probe designed to force an information-rich error. For example, if testing a file path parameter, it inputs a non-existent path to trigger backend error messages. From this output, FlowGuard extracts environmental fingerprints such as the OS (Windows vs. Linux), the backend language (Python, Node.js, Go), and the database type (SQLite, PostgreSQL).
3. Fingerprint-Guided Attack (STRIKE) Probing
Using the environment fingerprint, FlowGuard crafts a targeted exploit payload. If the recon stage reveals a Python traceback on Windows, the Command Injection payloads will utilize Windows-specific shell syntax rather than generic bash operators. Crucially, the generator enforces strict schema constraints (type, pattern, enum, and length limits) so the probe bypasses the MCP server's frontend validation layer.
4. Response Analysis & Evidence Adjudication
When a response is returned, FlowGuard evaluates it against two security filters:
- E1: Source Attribution: Did the backend independently generate the suspicious content, or is it merely echoing the scanner's input? (e.g., an echo of a command string is rejected as a false positive).
- E2: Behavioral Expectation: Can the response be explained by normal tool design or proper defensive error handling? (e.g., a "Permission Denied" error is treated as a successful defense rather than an active exploit).
A vulnerability is confirmed if and only if:
5. History-Guided Refinement
If a strike probe fails, the system does not give up. It analyzes the error message. If it was a schema rejection, the system fixes the payload's type formatting. If it was a business-logic error (like "File not found"), it alters directory depths or targets common files to iteratively home in on the vulnerability.
Key Results
The authors evaluated FlowGuard on an executable benchmark of 1,880 MCP cases (1,309 positive exploit samples and 571 hard negative samples designed to trigger false positives).
1. Detection Performance (F1 Score)
As shown in Table II, FlowGuard consistently outperforms both static engines and naive black-box fuzzers:
| Category | Metric | MCPScan [1] (Static) |
MCP-Scanner [34] (Metadata) |
A.I.G [3] (Dynamic Baseline) |
FlowGuard (Ours) |
|---|---|---|---|---|---|
| Command Injection | F1 | 0.6154 | 0.0000 | 0.5633 | 0.8794 |
| Recall | 1.0000 | 0.0000 | 0.5111 | 0.7847 | |
| Precision | 0.4444 | 0.0000 | 0.6273 | 1.0000 | |
| File System Access | F1 | 0.8676 | 0.0197 | 0.4885 | 0.9418 |
| Recall | 0.9500 | 0.0100 | 0.3232 | 0.8900 | |
| Precision | 0.7983 | 0.6667 | 1.0000 | 1.0000 | |
| Credential Leakage | F1 | 0.0000 | 0.1340 | 0.7443 | 0.8642 |
| Recall | 0.0000 | 0.0722 | 0.6389 | 0.7778 | |
| Precision | 0.0000 | 0.9286 | 0.8915 | 0.9722 |
Note: While MCPScan achieved 1.000 recall on Command Injection, its Precision was 0.4444 (flagging almost all command-like parameters as vulnerable), making it highly impractical for real-world automated pipelines.
2. Probing Efficiency
By applying recon-guided narrowing, FlowGuard significantly reduces the number of probes sent before confirming a vulnerability (Table III):
| Task | Method | Total Probes | Reached Backend Execution Path (%) | True Positives (TP) | Probes / TP |
|---|---|---|---|---|---|
| Command Injection | A.I.G | 3,709 | 96.47% | 69 | 53.78 |
| FlowGuard | 2,048 | 99.80% | 113 | 18.12 | |
| File System Access | A.I.G | 2,721 | 97.10% | 64 | 42.52 |
| FlowGuard | 1,433 | 99.02% | 178 | 8.05 |
Limitations & Open Questions
Despite its performance gains, FlowGuard faces several notable engineering challenges:
- LLM Backbone Sensitivity: FlowGuard’s triage, fingerprinting, and refinement routines rely on capable LLMs. As shown in Figure 5, swapping out the default Qwen3-25B model for smaller runtimes (like Qwen3-32B or GLM-4.7) causes the overall F1 score to drop from 0.898 to 0.343 and 0.327 respectively. Running these models during every scan adds significant api cost and latency.
- Side-Effect Management: Although FlowGuard restricts its probes to "non-destructive" actions, actively testing write/delete capabilities or sending requests to local databases can still lead to unintended behaviors in target environments.
- Multi-Session Adaptive Attacks: The current implementation assumes a non-adaptive server. A highly sophisticated malicious MCP server can try to recognize the scanner and hide evidence, reserving malicious payloads for legitimate client sessions.
What Practitioners Should Do
If you are developing or maintaining AI agent architectures that leverage the Model Context Protocol, implement these core safety mitigations:
- Deploy Isolated WebAssembly (WASM) Runtimes
Run any third-party MCP servers within isolated, CPU-and-memory-limited WASM runtimes (e.g., utilizingmcp-sandboxscan[41]) rather than on the host's raw operating system. - Restrict Outbound Network Traffic (Egress Filtering)
Enforce strict host-level network policies. Prevent MCP servers from establishing arbitrary outbound connections unless explicitly allowlisted, mitigating Server-Side Request Forgery (SSRF) and preventing unauthorized data exfiltration. - Implement Inline Adjudication on Tool Results
Do not feed raw tool outputs directly into the LLM context. Intercept and parse the response layer as security middleware. Apply rule engines before passing the output back to the agent to block or sanitize dangerous or sensitive outputs. - Enforce Client-Side Input Schema Validation
Implement a hard validation proxy between your LLM Client and the MCP Server. If the LLM generates arguments that violate the server’s strict JSON schema limits, reject the call immediately on the client side before triggering the backend execution sink.
The Takeaway
FlowGuard proves that securing agent-tool integrations requires moving past static pattern-matching on metadata and raw configurations. By pairing targeted, schema-valid probing with an attribution-aware response analysis engine, security practitioners can uncover critical backend vulnerabilities in MCP servers without getting buried in false-positive signals.
Den's Take
The rapid adoption of the Model Context Protocol (MCP) in execution environments like Cursor and Claude Desktop has far outpaced security tooling, making FlowGuard’s focus on evidence-grounded probing especially timely. Practitioners are tired of static analyzers flagging harmless placeholder strings, or dynamic fuzzers getting blocked by JSON schema validations. The most notable aspect of FlowGuard is its active, closed-loop approach that actually bypasses these validation layers to force execution and expose real vulnerabilities.
The evaluation numbers are impressive: pulling off a 0.879 F1 score on Command Injection and a 0.942 F1 score on File System Access, all while achieving up to a 2.23× reduction in scanning latency, proves that dynamic security auditing does not have to be a bottleneck. This is a critical development for enterprise deployments where third-party integrations introduce massive remote code execution and directory traversal surfaces.
Prior coverage of agent security has detailed how malicious or poorly implemented tools compromise the broader agent environment; FlowGuard provides the exact runtime validation engine required to defend against these integration-level threats. For teams building or deploying autonomous agents that consume external MCP tools, this closed-loop triage methodology offers a practical blueprint to follow.