Skip to content
Conduit

mcp server

scout-agent

Can better tools make a cheaper AI model reliable enough for the job? A research agent, five tool versions, the evaluation harness and every graded attempt.

helenatan/scout-agentcommunitylistedunreviewed

Set up

Runs on your computer. Pick your agent and operating system.

This project does not publish an install method we can turn into a config. Follow the README instead.

README

synced Oct 21, 2026

Scout: Can better tools make a cheaper AI model reliable enough for the job?

checks license: MIT python 3.13

I built Scout, a research agent that answers questions about Product Manager (PM) job postings, to test a practical question: how much can better tools improve a cheaper model? This repository holds the agent, its three tools in five versions, the evaluation harness and every graded attempt.

Read the study: the write-up · the interactive version · How Scout Works

I tested three Claude models with five versions of Scout's tools. What I found:

  • Better tools let the cheaper model clear the bar. On a test set of 10 new questions, Sonnet 5.5 with the final tools passed more often than Opus 5 with the basic tools (93% against 77%), at 28% of the cost per attempt ($0.057 against $0.201). Then I gave both models the final tools. They reached the same pass rate, 93%, and Sonnet still cost about a quarter as much ($0.057 against $0.225).
  • Tools can hand a model facts; judgment needs a stronger model. Even after tuning, Haiku 4.5, the cheapest model, passed only about 30% of the tasks it was not tuned against. About half of its failures were judgment errors that no tool change fixed.
  • The same tool change can hurt one model and leave another untouched. My first tool redesign lowered Sonnet's pass rate from 77% to 62%, while Opus was unaffected. Working out why led to the final tools.

Findings

A task is one research question with a known answer, and an attempt is one try at it; every setup tried every task three times. I used two task sets and never pool them. The tuning set (11 tasks) is where I studied failures and improved the tools. The test set (10 new tasks) was written and frozen after all the tuning and never tuned against; the headline numbers come from it. The bar, set before any attempt: a cheaper setup counts as a yes if its pass rate is within 10 percentage points of Opus 5 with basic tools, at a lower cost per attempt.

SetupTuning set, 11 tasksTest set, 10 new tasksCost per attempt (tuning / test)
Opus 5 + basic tools (v1), the reference98% (43/44)77% (23/30)$0.187 / $0.201
Sonnet 5.5 + basic tools (v1)77% (51/66)80% (24/30), added later, 1 pending$0.042 / $0.049
Sonnet 5.5 + summary tools (v2)62% (41/66)$0.047
Sonnet 5.5 + explicit caveats (v3)97% (64/66)$0.054
Sonnet 5.5 + dated summary (v4)76% (50/66)$0.051
Sonnet 5.5 + final tools (v5)94% (62/66)93% (28/30)$0.054 / $0.057
Opus 5 + final tools (v5)93% (28/30)$0.225
Haiku 4.5 + explicit caveats (v3) + self-check, held-out tasks28% (10/36)$0.049

Test-set numbers use the corrected grader. I froze the grader before the run and afterwards found two bugs in it (it missed quotes stored in one part of an answer, and could not read counts written as "1/1"). Under the original grader the test set reads 67%, 77%, 80% and 80% for the four rows above, and every comparison points the same way.

  • #1: Tuning Haiku showed which failures tools can fix. Development scores climbed from 27% to 89% while every tuned version landed between 28% and 33% on held-out tasks. Only the first change held up. About half of the remaining failures were judgment errors, such as reading zero captured postings as proof a company was not hiring.
  • #2: My first tool redesign made Sonnet worse. The summary tools (v2) added a one-line gap note to each search result. Opus kept checking the full collection record; Sonnet treated the note as enough, looked up the record for 49% of time windows instead of 73%, and in most of its new failures never saw the date of the gap.
  • #3: Testing each problem with its own tool version led to the final tools. Gap sentences ready to copy (v3) took Sonnet to 97%; gap dates in each result (v4) only restored 76%. The final tools (v5) do both, plus counts per source and named duplicate groups: 94% on the tuning set, within 4 points of Opus at 29% of its cost per attempt.
  • #4: On new questions, Sonnet cleared the bar at 28% of the cost. With the final tools, Sonnet passed 93% against 77% for Opus with basic tools. Opus with the final tools also passed 93%, at 3.9 times Sonnet's cost per attempt. A setup added later, Sonnet with basic tools, passed 80% (90% read by hand), so on the test set the final tools helped Opus (+17 points) more than Sonnet (+13 points).

Full tables, failure analysis and caveats: docs/results.md. Every pass count and cost above is recomputed from results/attempts.csv by python scripts/verify_results.py; the hand readings and the run-trace figures (49%, 73%) are explained in docs/results.md.

How I would choose a model and tools next time

Set the bar with the expensive model first. Keep a tuning set and a separate test set, and run the cheaper model with the starting tools on the test set too. Sort each failure before choosing a lever: a fact never found, a fact found but left out, or a slip on a count or format is a tools fix; the right facts and the wrong conclusion call for a stronger model. Test every tool change on every model. Among the setups that clear the bar, rank by cost per passing answer.

How Scout works

The model never touches the data. It works through three tools served over a local MCP server: search_job_postings, get_job_posting and get_dataset_context. The Scout runtime runs the model loop under a budget and deadline, gives every tool result an evidence ID, and checks the final answer (cited evidence was delivered, quotes are verbatim, arithmetic adds up, required pages were read) before accepting it, with one repair allowed. Only the model and the tool version change between attempts.

The five tool versions keep the same three tool names and schemas and differ only in what each result carries: basic tools (v1), summary tools (v2), explicit caveats (v3), dated summary (v4) and final tools (v5). See docs/tool-versions.md for one request's real response in each version, How Scout Works for the full walkthrough, and docs/architecture.md for the five parts of a run, a step-by-step sequence, how runs end, and how an evaluation works.

Quick start

No API key is needed. The demo uses a fictional three-posting snapshot and a scripted model, so it exercises the software, not model capability.

python3.13 -m venv .venv
.venv/bin/pip install -r requirements.lock
.venv/bin/python scripts/create_demo_data.py
.venv/bin/python -m pytest tests -q
.venv/bin/python scripts/verify_results.py
SCOUT_PROVIDER=fake .venv/bin/uvicorn scout.service.api:app --port 8000

Then open http://127.0.0.1:8000/ui/index.html and use snapshot pai-2026-08. Tests that assert numbers from the original snapshot are skipped automatically on the demo data (listed in tests/real_data_tests.txt).

Reproducing the study

LevelWhat you can doNeeds
1. Run ScoutStart the service, call the tools in every version, run the test suiteNothing beyond the quick start
2. Verify the resultsRecompute every published number from the per-attempt resultsNothing beyond the quick start
3. Re-run the studyRun any model and tool version on your own snapshot, write tasks, grade themA Claude subscription or API key, your own data

The original snapshot and the answer keys are not distributed: they contain job posting text owned by employers and job boards. docs/reproduce.md gives the exact commands for each level, the database schema Scout expects, and what an exact re-run would need.

Repository layout

PathContents
scout/service/HTTP API, run engine, budget, evidence store, answer checks, Claude Code and API providers
scout/tools/The three data tools, the MCP server, and the tool versions (pai_tools.py holds v1 and v2; tuned.py, dated.py, v5.py hold v3 to v5)
scout/ui/Local web UI for one run and for comparing saved results
eval/run_original_suite.pyRun one model and tool version on the tuning set (original 11 tasks), then grade with grader v3
eval/run_matrix.pyGeneral runner used for the test set
eval/graders/original_v3/Deterministic grader for the tuning set (frozen, hash-checked)
eval/tasks/final/, eval/tasks/fresh-v1/Task prompts for the tuning set (final/) and the test set (fresh-v1/), plus the test set's two-part grader, freeze record and decisions
results/One row per graded attempt (pass/fail, cost, latency, tokens; no answer text) and its provenance
scripts/Demo data, result verification, and the export script that produced results/
docs/Results, reproduction guide, tool versions, architecture diagrams, figures
tests/Unit and integration tests, runnable without an API key

Limits

  • A small sample. The test set has 10 tasks, tried three times each. A gap of 93% against 77% on 30 attempts each is not enough to call Sonnet with the final tools better than Opus with basic tools, so "at least as good" is the claim the data supports. The tuning set has 11 tasks.
  • Estimated costs. Every attempt ran on a Claude subscription through headless Claude Code, so costs are list prices applied to the tokens each attempt used, not a real bill.
  • An input limit. Every attempt was capped at 50,000 input tokens per request. On the test set, the cap cost Opus with basic tools one task and Sonnet with basic tools one attempt.
  • One pending attempt. One Sonnet with basic tools attempt on the test set awaits human review because the two judge models disagreed; it counts as not passed.

See docs/results.md.

Citation

If you use this work, cite it with the metadata in CITATION.cff.

License

Code and documentation are released under the MIT License. The study's snapshot of job postings is not part of this repository.

↑↓ navigate openesc close