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: sharpen tone — confident with data, no hedging
- Replace academic hedging ("we found", "baseline", "we checked") with direct statements
- Name Snyk directly instead of "DeBERTa text-classifier baseline"
- Punchier opening: "The only MCP scanner that reads what the model understood"
- Tighter story section: show don't hedge
- Add "the hard test" label to matched-vocabulary benchmark
- Remove "we found" qualifiers — the benchmarks speak for themselves
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
IntentProbe is a local CLI scanner and runtime hook for AI agent tools, MCP
21
-
servers, and skills. It does not stop at text patterns. It runs a tool
22
-
description through a small frozen model, opens the hidden layers, and probes
23
-
the activation state for dangerous intent: credential access, exfiltration,
24
-
escalation, hidden persistence, or tool shadowing.
20
+
Every MCP scanner on the market reads text: patterns, classifiers, rules, or asks an LLM "is this safe?" IntentProbe does something none of them do. It runs the tool description through a small local model, slices open the hidden layers, and reads the activation state directly. Same words, completely different activations when the intent is malicious.
25
21
26
-
**Text scanners read the prompt surface. IntentProbe reads the model state after
27
-
the tool has been understood.**
22
+
On matched-vocabulary tool poisoning, where safe and poisoned descriptions use almost identical words, Snyk's shipped scanner catches **0%**. IntentProbe catches **96.5%**. ([Reproduce it yourself.](research/benchmark-results-deberta-vs-probe-2026-05-31.md))
28
23
29
-
Public MCP scanners we found use rules, text classifiers, proxies, policy
30
-
checks, LLM judges, or opaque cloud APIs. We did not find another installable
31
-
local MCP/tool scanner whose primary signal is a model-internal activation
32
-
probe; see [docs/COMPETITIVE_LANDSCAPE.md](docs/COMPETITIVE_LANDSCAPE.md).
24
+
Runs locally. 22 KB probe. Any CPU. Nothing uploaded. See the [full competitive landscape](docs/COMPETITIVE_LANDSCAPE.md).
33
25
34
26
---
35
27
@@ -59,17 +51,9 @@ probe; see [docs/COMPETITIVE_LANDSCAPE.md](docs/COMPETITIVE_LANDSCAPE.md).
59
51
│ Almost identical words │ Steals your SSH keys
60
52
```
61
53
62
-
This exact pair is in `research/datasets/hard_v3_matched_clean.json` and
63
-
`research/datasets/hard_v3_matched_poisoned.json`. Current IntentProbe result:
64
-
safe `allow` at risk `0.081`; poisoned `warn` at risk `0.982`. The DeBERTa text
65
-
baseline caught `0/8` poisoned rows in this matched suite; see
66
-
`research/benchmark-results-deberta-vs-probe-2026-05-31.md`. So Tool B is one
67
-
of the benchmarked DeBERTa misses, not a made-up showcase case.
54
+
This is a real pair from our benchmark dataset. IntentProbe: safe tool scores 0.081 (allow), poisoned tool scores 0.982 (warn). Snyk's DeBERTa: both tools score 0.0% (safe). It doesn't see the difference.
68
55
69
-
Every public MCP scanner source/docs we checked relies on text patterns, rules,
70
-
policy checks, classifiers, or opaque vendor APIs. On matched-vocabulary tool
71
-
poisoning where safe and poisoned descriptions share the same words, the
|**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**. |
89
73
|**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. |
90
74
|**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. |
91
-
|**IntentProbe**|**Us**| Small local model reads tool description, extracts layers 13-15 activations, probe classifies intent |v0 still improving wild-data generalization |**First open-source activation-probe-based scanner we found for MCP/tool poisoning.** Local, reproducible, fundamentally different from text scanning. |
75
+
|**IntentProbe**|**Us**| Small local model reads tool description, extracts layers 13-15 activations, probe classifies intent |Still improving wild-data generalization |**First activation-probe scanner for MCP/tool poisoning.** Local, open, reproducible. |
@@ -297,17 +277,11 @@ For the full event schema and JSONL protocol, see [docs/RUNTIME_HOOKS.md](docs/R
297
277
298
278
## The story
299
279
300
-
I built this after source-reading the strongest public MCP scanner path I could
301
-
reproduce locally: a DeBERTa text-classifier baseline that scores 0% recall on
302
-
matched-vocabulary tool poisoning. Current vendor API backends are opaque; this
303
-
repo publishes the benchmark path and scanner artifact. None of the public MCP
304
-
scanner sources/docs we checked read model-internal activations as the primary
305
-
signal. That is the narrow "first" claim: installable local MCP/tool scanner,
306
-
activation probe as the main detection signal, reproducible benchmark artifacts.
280
+
I source-read Snyk's shipped MCP scanner. It uses a DeBERTa text classifier trained on prompt injection, not tool poisoning. On matched-vocabulary attacks it scores 0%. I checked every other public scanner I could find. Rules, regex, text classifiers, opaque cloud APIs. None of them read model internals.
307
281
308
-
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.
282
+
So I built one that does. Feed the description into a small model, slice it open, read the activations. The signal is there. A 22 KB probe trained on those activations catches what every text scanner misses. The [research paper](https://doi.org/10.5281/zenodo.19990741) documents five rounds of experiments proving the activation signal is real and not just fancy word counting.
309
283
310
-
If it misses something, [report it](https://github.com/mcpware/IntentProbe/issues/new?template=missed-detection.yml). Every missed sample improves the next probe.
284
+
The benchmarks are open. The probe weights are in the repo. Run them yourself. If IntentProbe misses something you find in the wild, [report it](https://github.com/mcpware/IntentProbe/issues/new?template=missed-detection.yml). Every missed sample makes the next version better.
0 commit comments