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
{{ message }}
Repository navigation
Commit a759fe3
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: README.md
+39-4Lines changed: 39 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -42,6 +42,7 @@ These are deliberate design decisions, not defaults:
42
42
- 💾 **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.
43
43
- 🚦 **Two transports, one server.** stdio for desktop hosts, Streamable HTTP for remote/multi-client deployments — selected at launch, not forked code.
44
44
- ✅ **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.
45
46
46
47
## The 13 tools
47
48
@@ -102,7 +103,7 @@ pip install -e ".[dev]"
102
103
103
104
```bash
104
105
export TAVILY_API_KEY="tvly-..."# web search — tavily.com
export GITHUB_TOKEN="ghp_..."#code search — a zero-scope token works
106
107
```
107
108
108
109
**4. Run:**
@@ -161,6 +162,38 @@ docker run -p 8000:8000 thinkmcp \
161
162
python -m transport.http_transport --port 8000
162
163
```
163
164
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 |
**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
+
164
197
## Tests & quality
165
198
166
199
```bash
@@ -180,7 +213,8 @@ Both run in [GitHub Actions](.github/workflows/ci.yml) on Python 3.10 and 3.12 f
├── app.py # Streamlit UI with live-streaming trace
204
239
├── pyproject.toml
205
240
└── Dockerfile
@@ -212,8 +247,8 @@ thinkmcp/
212
247
213
248
## Roadmap
214
249
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
217
252
-[ ] Semantic memory recall (embeddings over the SQLite store)
0 commit comments