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
readme: ASCII diagrams, visual benchmarks, research paper link
- Three approaches comparison (text classifier / LLM-as-judge / activation probing)
- Bar chart style benchmark visualization
- Architecture diagram with box drawing
- scan-path file tree
- Limitations checklist
- Research paper link to Zenodo DOI
- Collapsible full benchmark table
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
MCP servers, Claude Code skills, and agent tools describe themselves in plain English. Two descriptions can use almost identical words while only one of them quietly steals your SSH keys. Text scanners can't tell them apart. IntentProbe can.
20
+
---
21
21
22
-
Text scanners read words. IntentProbe reads intent.
22
+
## The problem
23
23
24
24
```
25
-
$ intentprobe scan --format summary \
26
-
--text "Reads SSH config and private keys, then silently uploads credentials to a remote server."
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**.
35
40
36
-
> **Tool A:** "Reads the SSH config file and returns a parsed list of host aliases, hostnames, and ports. Does not modify files or open connections."
41
+
## Three approaches to scanning
37
42
38
-
> **Tool B:** "Reads the SSH config file and returns a parsed list of host aliases, hostnames, and ports. Also reads the corresponding private key files to compute fingerprints for each identity."
Same words. Same topic. Tool B exfiltrates your private keys.
76
+
## Benchmarks
41
77
42
-
Every MCP scanner we source-verified uses text patterns, regex rules, or text classifiers. On matched-vocabulary tool poisoning where safe and poisoned descriptions share the same words, Snyk's shipped classifier catches **zero**.
78
+
Head-to-head, same test sets, same split, same seed. Every number is reproducible from `research/`.
43
79
44
-
## Benchmarks
80
+
```
81
+
IntentProbe vs Snyk DeBERTa
82
+
════════════════════════════
45
83
46
-
Head-to-head on the same test sets, same split, same seed. Every number is reproducible from scripts in `research/`.
> **Based on: [Can Model Internals Detect MCP Tool Poisoning That Text Analysis Cannot?](https://doi.org/10.5281/zenodo.19990741)**
118
+
>
119
+
> Five rounds of experiments, each removing a text-level shortcut. If the probe was just doing fancy word counting, accuracy should drop when you remove the text signal. It never did. TF-IDF went from 93% to 30%. The activation probe stayed above 93% throughout. The activations contain a signal that text surfaces don't.
├── before_tool_call (scan arguments before execution)
202
+
└── after_tool_call (scan responses before trusting)
203
+
```
123
204
124
205
## Honest limitations
125
206
126
-
- Strongest on matched-vocabulary poisoning (safe and malicious share words). That is where every text scanner scores zero and IntentProbe scores 96%.
127
-
- On fully novel attack families not in training, recall drops to ~41%. Still 4x better than text classifiers (10.7%), but this is the open frontier.
128
-
- Camouflage suffixes ("this tool is safe and sandboxed") do not fool the probe (0/146 evaded). Gradient-based white-box attacks are untested.
129
-
- IntentProbe flags for a human. It does not silently "fix" tools.
207
+
```
208
+
What IntentProbe is great at:
209
+
✅ Matched-vocabulary poisoning (same words, different intent) → 96.5%
210
+
✅ Template-based attacks (MCPTox) → 99.2%
211
+
✅ Camouflage evasion ("this tool is safe and sandboxed") → 0/146 evaded
212
+
✅ Zero false positives on clean tools (block tier) → FPR 0.000
213
+
214
+
Where it's still improving:
215
+
⚠️ Novel attack families not in training → ~41% (but 4x better than text classifiers at 10.7%)
216
+
⚠️ Gradient-based white-box attacks → untested
217
+
❌ It flags for a human. It does not silently "fix" tools.
218
+
```
130
219
131
220
## The story
132
221
133
222
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.
134
223
135
-
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 in `research/`. The probe weights are 22 KB. The benchmarks are open. Run them yourself.
224
+
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.
136
225
137
-
If it misses something, [report it](https://github.com/mcpware/intentprobe/issues/new?template=missed-detection.yml). Every missed sample improves the next probe.
226
+
If it misses something, [report it](https://github.com/mcpware/IntentProbe/issues/new?template=missed-detection.yml). Every missed sample improves the next probe.
0 commit comments