Skip to content

Commit a759fe3

Browse files
committed
docs: publish benchmark results (honest null result) in README
The heuristic reasoning tools did not improve judged answer quality (Qwen pairs 1-3-2 against, Sonnet pairs 1-1-4 mostly ties), but they measurably reduced tool-thrashing. Documents method, caveats, reproduce commands; ticks the roadmap item and motivates LLM-backed critique. git log --oneline -3 && git status -s && git push origin main 2>&1 | tail -2
1 parent ee7c57f commit a759fe3

1 file changed

Lines changed: 39 additions & 4 deletions

File tree

‎README.md‎

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ These are deliberate design decisions, not defaults:
4242
- 💾 **Durable memory.** `remember`/`recall` are SQLite-backed ([server/tools/memory.py](server/tools/memory.py)), so findings survive restarts and are shared between the UI agent and any connected MCP host.
4343
- 🚦 **Two transports, one server.** stdio for desktop hosts, Streamable HTTP for remote/multi-client deployments — selected at launch, not forked code.
4444
- ✅ **Tested and linted in CI.** 31 pytest cases covering tools, agent helpers, and server registration, plus ruff — on Python 3.10 and 3.12 for every push.
45+
- 📊 **Measured, not assumed.** The reasoning tools are evaluated with a blind ablation benchmark (two agent hosts, independent LLM judge) — and the honest result, including where the scaffolding *doesn't* help, is published below.
4546

4647
## The 13 tools
4748

@@ -102,7 +103,7 @@ pip install -e ".[dev]"
102103

103104
```bash
104105
export TAVILY_API_KEY="tvly-..." # web search — tavily.com
105-
export GITHUB_TOKEN="ghp_..." # optional, raises GitHub rate limits
106+
export GITHUB_TOKEN="ghp_..." # code search — a zero-scope token works
106107
```
107108

108109
**4. Run:**
@@ -161,6 +162,38 @@ docker run -p 8000:8000 thinkmcp \
161162
python -m transport.http_transport --port 8000
162163
```
163164

165+
## Benchmark: do the reasoning tools actually help?
166+
167+
An ablation study over a fixed 6-question set (retrieval, comparison, explanation tasks — all answerable without API keys):
168+
169+
- **Arm A** sees all 13 tools and is prompted to plan / think / self-critique.
170+
- **Arm B** runs against a server started with `THINKMCP_DISABLE_REASONING=1`, which hides `think`/`critique`/`plan` from `tools/list` — the model can't see them, not merely can't call them.
171+
- Same turn budget (16) for both arms. Two agent hosts were tested: the local Qwen 3 agent, and Claude Sonnet connected to the same server over MCP.
172+
- Every answer pair was judged **blind** by Claude Sonnet in **both orderings**; an arm wins a question only if the judge picks it both times. Inconsistent picks count as ties.
173+
174+
| Agent host | With reasoning tools | Without (ablated) | Ties |
175+
|---|---|---|---|
176+
| Qwen 3 VL 8B (local, Ollama) | 1/6 | **3/6** | 2/6 |
177+
| Claude Sonnet (over MCP) | 1/6 | 1/6 | **4/6** |
178+
179+
**The honest read: the heuristic reasoning tools did not improve judged answer quality.** What the data *did* show:
180+
181+
- They change **behavior**, not prose quality: with `plan_tool`, the 8B agent averaged fewer tool calls (9.3 vs 11.8) and avoided tool-thrashing on the worst question (15 calls vs 45 for the ablated arm).
182+
- A frontier model neither needs nor is hurt by the scaffolding (4/6 ties) — and it skipped the tools entirely on pure-knowledge questions, answering in 1 turn.
183+
- The benchmark surfaced a real agent bug that's now fixed: runs that exhaust the iteration budget used to return nothing; the agent now forces a final answer from the evidence it gathered.
184+
185+
This is exactly why `critique`/`plan` being deterministic heuristics matters: they add structure and traceability, but no new intelligence — which motivates the LLM-backed critique mode on the roadmap. Negative results that point at the next experiment are worth more than inflated ones.
186+
187+
Reproduce (full per-question data lands in `benchmarks/results*.json`):
188+
189+
```bash
190+
python benchmarks/run_benchmark.py # local arms (Ollama)
191+
python benchmarks/run_benchmark_claude.py # Sonnet arms (needs Claude Code CLI)
192+
python benchmarks/judge_with_claude.py # blind judging (needs Claude Code CLI)
193+
```
194+
195+
*Caveats: n=6, one run per arm, LLM-as-judge. This is a directional ablation, not a paper.*
196+
164197
## Tests & quality
165198

166199
```bash
@@ -180,7 +213,8 @@ Both run in [GitHub Actions](.github/workflows/ci.yml) on Python 3.10 and 3.12 f
180213
| `THINKMCP_MEMORY_DB` | `./thinkmcp_memory.db` | SQLite memory location |
181214
| `THINKMCP_REPORTS_DIR` | `./reports` | Where `write_report` saves files |
182215
| `TAVILY_API_KEY` | — | Enables `web_search` |
183-
| `GITHUB_TOKEN` | — | Higher rate limits for `search_code` |
216+
| `GITHUB_TOKEN` | — | Enables `search_code` (GitHub's code-search API requires auth; a token with **no scopes** is enough) |
217+
| `THINKMCP_DISABLE_REASONING` | — | Set `1` to hide `think`/`critique`/`plan` (benchmark ablation) |
184218

185219
## Project layout
186220

@@ -200,6 +234,7 @@ thinkmcp/
200234
│ ├── stdio_transport.py # stdio launcher (Claude Desktop)
201235
│ └── http_transport.py # Streamable HTTP launcher (remote)
202236
├── tests/ # pytest suite
237+
├── benchmarks/ # reasoning-tools ablation benchmark + results
203238
├── app.py # Streamlit UI with live-streaming trace
204239
├── pyproject.toml
205240
└── Dockerfile
@@ -212,8 +247,8 @@ thinkmcp/
212247

213248
## Roadmap
214249

215-
- [ ] Benchmark: answer quality with vs. without the reasoning tools on a fixed question set
216-
- [ ] LLM-judged critique mode (local, via Ollama) as an opt-in alternative to heuristics
250+
- [x] Benchmark: answer quality with vs. without the reasoning tools on a fixed question set — [done, results above](#benchmark-do-the-reasoning-tools-actually-help)
251+
- [ ] LLM-backed critique mode (local, via Ollama) — the benchmark's null result makes this the obvious next experiment
217252
- [ ] Semantic memory recall (embeddings over the SQLite store)
218253
- [ ] One-command hosted demo
219254

0 commit comments

Comments
 (0)