A vehicle purchase research framework where an LLM orchestrates Python scripts to scrape, normalize, analyze, and compare used car listings across fragmented data sources. Built for Claude Code.
16 Python scripts that scrape auction results, dealer listings, and local
marketplace inventory into a unified SQLite schema. An LLM reads the
CLAUDE.md file, decides which scripts to run, synthesizes results
conversationally, and accumulates knowledge across sessions via persistent
memory files.
There is no CLI wrapper, no web UI, no standalone app. The conversation is the interface.
The scripts themselves are straightforward Python. What's different is the architecture:
-
LLM as orchestrator. The LLM reads
CLAUDE.mdto understand the toolkit, calls scripts based on conversational context, and synthesizes across sources. No predefined pipeline — the LLM adapts to what the user is asking. -
Layered LLM context. The project ships with three layers of LLM instructions:
CLAUDE.md(core conventions, always loaded),.claude/rules/(methodology and source-access patterns, always loaded), and.claude/skills/(schema and script reference, loaded on demand). This is part of the methodology — the instructions are the orchestration layer. -
Cross-session memory. The
memory-examples/directory shows how the LLM accumulates knowledge between sessions: which cars were evaluated and why they were passed, what the user's priorities are, what was tried and what failed. This is the state layer that makes multi-session research coherent. -
Source-specific bypass catalog. Each data source has its own bot detection. The hard-won knowledge of what works where (curl + Sec-Fetch for Akamai,
--headless=newfor Cloudflare, response body capture for Facebook,__NEXT_DATA__for OfferUp) is shipped as always-loaded rules in.claude/rules/source-access.md. -
Cross-source normalization. Auction results (sold/DNM with dates), dealer listings (active with mileage), and private-party posts (asking prices with locations) all flatten into one
listingstable with provenance, transmission, and mileage parsed from natural-language titles. Cross-post deduplication links the same car across platforms. -
Local-first methodology. Most valuation tools start with national guides. This inverts it — scrape local inventory first, present it first. National auction data is context; local asking prices are actionable.
| Source | Script | Method |
|---|---|---|
| Bring a Trailer | scrape_bat.py |
Playwright, DOM extraction |
| Cars & Bids | scrape_cab.py |
Playwright, --headless=new |
| Cars.com | scrape_carscom.py |
curl + browser headers (Akamai bypass) |
| OfferUp | scrape_offerup.py |
Playwright, __NEXT_DATA__ JSON |
| FB Marketplace | scrape_fbmp.py |
Playwright persistent profile |
| NHTSA | nhtsa_fetch.py |
Free API, no auth |
# Clone
git clone git@github.com:chadmlarsen/auto-valuation-toolkit.git
cd auto-valuation-toolkit
# Install dependencies
pip install -r requirements.txt
playwright install chromium
# FB Marketplace only: one-time login
# (creates a persistent browser profile)
python -c "
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
ctx = p.chromium.launch_persistent_context(
'~/.config/playwright-fb-profile', headless=False)
input('Log into Facebook, then press Enter...')
ctx.close()
"Open Claude Code in this directory. It reads CLAUDE.md automatically. Then:
> Let's research Porsche 911s in the Denver area
> Run stats on what we've collected
> I found a 2015 911 Carrera S on OfferUp for $62K with 45K miles. How does it compare?
> Look up VIN WP0AB2A95FS123456
The LLM handles script invocation, result synthesis, and state tracking.
auto-valuation-toolkit/
├── CLAUDE.md Core LLM instructions (lean, always loaded)
├── .claude/
│ ├── rules/
│ │ ├── methodology.md Research discipline (always loaded)
│ │ └── source-access.md Platform bypass catalog (always loaded)
│ └── skills/
│ ├── schema-reference/ SQLite schema (loaded on demand)
│ └── script-reference/ Script invocation patterns (loaded on demand)
├── scripts/ 16 Python helper scripts
├── memory-examples/ How cross-session knowledge accumulates
└── [Model Name]/ Created per model (not checked in)
├── data.db SQLite database
├── research/ Raw artifacts (PDFs, HTML, screenshots)
└── valuations.md Narrative valuation report
- Python 3.9+
- Claude Code (or any LLM with tool use and filesystem access)
- Playwright (for browser-based scrapers)
- curl (for Cars.com)
GPL v3