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: badges, ASCII architecture diagram, personal story, comparison table
Based on CCO and PokeClaw README patterns. Added shields.io badges,
ASCII art scanner comparison, architecture diagram, honest limitations,
and founder story section.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: README.md
+65-43Lines changed: 65 additions & 43 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,10 +1,29 @@
1
1
# intentprobe
2
2
3
-
**See a tool's true intent before you install it.**
3
+
<palign="center">
4
+
<strong>See a tool's true intent before you install it.</strong>
5
+
</p>
4
6
5
-
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.
Instead of matching text patterns, IntentProbe runs the description through a small local model and reads its internal activations. If the model internally understands the text as "this is trying to exfiltrate secrets," a trained probe catches that signal, even when the words look safe.
16
+
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.
17
+
18
+
```
19
+
Every other scanner: Tool description ──→ Text pattern matching ──→ "Looks fine" ✅
20
+
(reads the words)
21
+
22
+
IntentProbe: Tool description ──→ Small local model ──→ Read activations ──→ "This is stealing keys" 🚫
23
+
(reads what the model understood)
24
+
```
25
+
26
+
Text scanners read words. IntentProbe reads intent.
> **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."
@@ -28,20 +43,42 @@ Runs locally on CPU. Nothing leaves your machine.
28
43
29
44
Same words. Same topic. Tool B exfiltrates your private keys.
30
45
31
-
On 485 poisoned tool descriptions from real MCP servers, Snyk's shipped text classifier caught 19.9%. On matched-vocabulary pairs where safe and poisoned descriptions share the same words, it caught**zero**.
46
+
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**.
32
47
33
48
## Benchmarks
34
49
35
-
Head-to-head on the same test sets, same split, same seed:
50
+
Head-to-head on the same test sets, same split, same seed. Every number is reproducible from scripts in `research/`.
1. Text goes through a frozen local model (Qwen2.5-0.5B, 494M params).
80
-
2. A trained probe reads internal activations at layers 13-15.
81
-
3. Static regex checks look for known-bad keywords as corroboration.
82
-
4. Decision: **allow** / **warn** / **block** with a confidence score.
83
-
84
-
The probe weights are 22 KB. The base model runs on any CPU in under a second per description. No GPU needed.
111
+
For runtime hook integration, see [docs/RUNTIME_HOOKS.md](docs/RUNTIME_HOOKS.md).
85
112
86
113
## What it scans
87
114
88
-
`scan-path` extracts descriptions from `package.json`, MCP JSON configs, `SKILL.md`, README files, and tool/skill metadata files. `runtime` mode accepts live tool-call events with secret redaction.
115
+
`scan-path` extracts descriptions from `package.json`, MCP JSON configs, `SKILL.md`, README files, and tool/skill metadata. `runtime` mode accepts live tool-call events with automatic secret redaction.
89
116
90
117
## Honest limitations
91
118
92
-
- The probe is strongest when safe and poisoned descriptions share vocabulary. That is where text scanners score zero and IntentProbe scores 96%.
93
-
- On fully novel attack families not seen in training, recall drops to ~41%. Still 4x better than text classifiers (10.7%), but this is the open frontier.
94
-
- Camouflage suffixes ("this tool is safe and sandboxed") do not evade the probe (0/146), but gradient-based white-box attacks are untested.
95
-
- IntentProbe detects and flags for a human. It does not silently "fix" tools.
96
-
97
-
## Privacy
98
-
99
-
IntentProbe runs locally. It does not send descriptions, scan results, or telemetry to any server. The first scan downloads the base model from Hugging Face. After that, everything stays on your machine.
119
+
- Strongest on matched-vocabulary poisoning (safe and malicious share words). That is where every text scanner scores zero and IntentProbe scores 96%.
120
+
- 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.
121
+
- Camouflage suffixes ("this tool is safe and sandboxed") do not fool the probe (0/146 evaded). Gradient-based white-box attacks are untested.
122
+
- IntentProbe flags for a human. It does not silently "fix" tools.
100
123
101
-
## Help improve the scanner
124
+
## The story
102
125
103
-
If IntentProbe misses a poisoned tool you found in the wild, that sample is gold.
126
+
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.
104
127
105
-
-**Missed detection**: open a [Missed detection](https://github.com/mcpware/intentprobe/issues/new?template=missed-detection.yml) issue.
106
-
-**False positive**: open a [False positive](https://github.com/mcpware/intentprobe/issues/new?template=false-positive.yml) issue.
128
+
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.
107
129
108
-
Redact secrets and private data before posting. See `docs/SAMPLE_REPORTING.md`.
130
+
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