You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+18-8Lines changed: 18 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -42,7 +42,10 @@
42
42
│ Almost identical words │ Steals your SSH keys
43
43
```
44
44
45
-
Every MCP scanner we source-verified uses text patterns, regex, or text classifiers. On matched-vocabulary tool poisoning where safe and poisoned descriptions share the same words, Snyk's shipped classifier catches **zero**.
45
+
Every public MCP scanner source/docs we checked relies on text patterns, rules,
46
+
policy checks, classifiers, or opaque vendor APIs. On matched-vocabulary tool
47
+
poisoning where safe and poisoned descriptions share the same words, the
@@ -58,11 +61,13 @@ Every MCP scanner we source-verified uses text patterns, regex, or text classifi
58
61
|---|---|---|---|---|
59
62
|**Enterprise cloud scanner**| Lakera, Azure Prompt Shields, Google Model Armor, AWS Bedrock Guardrails, Cisco, HiddenLayer | Send prompt / tool call / output to their cloud API | You don't know what model they use or how to verify results; requires uploading your content |**Runs locally.** No upload. Benchmark scripts, model artifacts, and datasets are public and reproducible. |
60
63
|**MCP / agent scanner**| Snyk Agent Scan, Invariant MCP-Scan, MEDUSA, ClawGuard | Mostly static rules, pattern matching, metadata scan, proxy, policy checks; some call vendor APIs | Fast and practical, but fundamentally "read the text / rules / known patterns" |**Activation probe.** Reads what the model *understood* from the tool description, not the text itself. |
61
-
|**Text classifier**| ProtectAI DeBERTa, Meta Prompt Guard | Classify text as benign / injection / jailbreak | Learns text patterns; fails when words are the same but intent differs | Same-words benchmark: IntentProbe **96.5% F1** vs DeBERTa **0% F1**. |
64
+
|**Text classifier**| ProtectAI DeBERTa, Meta Prompt Guard | Classify text as benign / injection / jailbreak | Learns text patterns; fails when words are the same but intent differs | Same-words benchmark: IntentProbe **96.6% F1** vs DeBERTa **0% F1**. |
62
65
|**LLM-as-judge**| NeMo self-check, OpenAI Guardrails, Promptfoo grader | Ask another LLM: "is this poisoned?" | Expensive, slow, burns tokens; non-deterministic; the judge LLM can be fooled by the same poisoning |**Fixed local artifact.** Same input always gets the same deterministic score. |
63
66
|**Red-team / eval framework**| garak, Giskard, Promptfoo red team | Generate attacks, test if app/model breaks | Great for audits, but not a "scan before install" daily workflow | IntentProbe is a **CLI scanner + runtime hook** — blocks before install and before each tool call. |
64
67
|**IntentProbe**|**Us**| Small local model reads tool description, extract layers 13-15 activations, probe classifies intent | v0 still improving wild-data generalization |**First product-shaped activation-probe scanner for MCP/tool poisoning.** Local, reproducible, fundamentally different from text scanning. |
@@ -268,7 +274,11 @@ For the full event schema and JSONL protocol, see [docs/RUNTIME_HOOKS.md](docs/R
268
274
269
275
## The story
270
276
271
-
I built this after source-reading Snyk's shipped MCP scanner and finding it uses a DeBERTa text classifier that scores 0% recall on matched-vocabulary tool poisoning. The entire category of MCP scanners relies on text patterns. None of them read model internals.
277
+
I built this after source-reading the strongest public MCP scanner path I could
278
+
reproduce locally: a DeBERTa text-classifier baseline that scores 0% recall on
279
+
matched-vocabulary tool poisoning. Current vendor API backends are opaque; this
280
+
repo publishes the benchmark path and scanner artifact. None of the public MCP
281
+
scanner sources/docs we checked read model internals.
272
282
273
283
IntentProbe is a different approach: run the description through a small model, read the activations, and train a probe on the signal that encodes intent. The research paper behind this is [published on Zenodo](https://doi.org/10.5281/zenodo.19990741). The probe weights are 22 KB. The benchmarks are open. Run them yourself.
0 commit comments