Skip to main content
Glama

carsearch — Canadian used-car search, monitoring & market-analysis platform

carsearch turns Canadian marketplace listings into a persistent, searchable, historical database and exposes it to Claude Code (or any agent) over MCP, plus a full CLI. It collects real listings from AutoTrader.ca (more providers pluggable), keeps every price/status change as history, deduplicates physical vehicles across listings, geocodes properly (real distances), extracts risk signals from descriptions, computes comparable-price statistics, scores project cars under configurable profiles, detects deals, reruns saved searches on a schedule and raises alerts.

Ask Claude things like:

  • Find me every manual BMW E90 328i under $8,000 within 800 km of Toronto, prefer private sellers, reject rust buckets, rank by project-car value.

  • What interesting project cars under $7k appeared in Ontario in the last 48 hours?

  • Is this $6,200 Audi TT actually cheap relative to similar listings we've observed?

  • Show me every price drop > 10% this week. / Cars sitting 30+ days where the seller already cut the price twice.

Status per phase, tested commands and known issues: PROJECT_STATUS.md.


Architecture (short)

providers/ (autotrader ✓, cargurus/kijiji/facebook interface+probe)  →  VehicleListing (canonical)
   → collectors/ (checkpointed ProviderRun, ingest w/ snapshots+events, raw payloads)
   → dedupe/ (VIN → weighted soft signals → vehicles + candidates)  → geo/ (geocode, haversine)
   → SQLite/PostgreSQL (SQLAlchemy)  → search/  analysis/ (description, comps, deals, market)
   → scoring/ (profiles + model knowledge JSON)  → monitoring/ (saved searches, scheduler) → notifications/
   → cli/ (carsearch …)  and  mcp/ (23 tools)

Details: docs/architecture.md, docs/providers.md, docs/schema.md.

Related MCP server: federal-spend-ai

Installation

python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"            # add ".[postgres]" for PostgreSQL
cp .env.example .env               # optional; SQLite in ./data works out of the box
carsearch db-init                  # creates/upgrades data/carsearch.db

Python ≥ 3.11 (developed on 3.14). No browser, no API keys required for AutoTrader.

Database setup

  • Default: sqlite:///./data/carsearch.db (WAL). Nothing to do.

  • PostgreSQL: CARSEARCH_DATABASE_URL=postgresql+psycopg://user:pass@host/carsearch in .env, pip install -e ".[postgres]", carsearch db-init. Schema/migrations in src/carsearch/database/ (versioned, recorded in schema_migrations).

Crawling (collecting real data)

# targeted, with detail pages for new listings (VIN, exact coordinates, drivetrain, created date)
carsearch crawl autotrader --make BMW --model "3 Series" --transmission manual --max-price 8000 --min-year 2006 --max-year 2013 --details new
# regional bulk (20 listings/page, ~1.5 s/page, no detail pages)
carsearch crawl autotrader --max-price 7000 --location Toronto --radius-km 500 --max-pages 200 --details none
# province scope (centroid + covering radius server-side, exact province locally)
carsearch crawl autotrader --province ON --transmission manual --max-price 6000 --seller-type private
# incremental refresh: stop after 3 consecutive pages with nothing new/changed
carsearch crawl autotrader --transmission manual --max-price 8000 --stop-when-seen 3
# resume an interrupted run
carsearch crawl autotrader --resume 12
# re-check listings not seen for 3 days (marks removed on 404); fetch missing detail pages; geocode backfill
carsearch refresh autotrader --older-than-days 3 --limit 200
carsearch details autotrader --limit 200
carsearch geocode --limit 60
scripts/bootstrap_crawl.sh   # example multi-band bootstrap used to seed the DB

AutoTrader caps a query at 200 pages (4000 listings) → split by price band/region for full coverage (truncated=True in the run summary tells you when).

Searching

carsearch search --make BMW --model 328i --max-price 7000 --transmission manual --location Toronto --radius-km 800 --seller-type private
carsearch search --generation E90 --keywords '"one owner" -salvage' --province ON,QC --sort price_asc
carsearch new --since 48h --province ON --max-price 7000
carsearch price-drops --min 10 --since 7d
carsearch deals --province ON --max-price 7000 --profile project_car_enthusiast
carsearch deals --location Toronto --radius-km 500 --transmission manual --max-price 7000 --since 7d \
    --profile project_car_enthusiast --sort-by project --exclude-flags salvage_title,frame_rust,doesnt_run   # "best project cars" ranking
carsearch listing 42            # full record + price history + description flags
carsearch history 42            # snapshots + change events
carsearch comps 42              # comparable-price analysis with methodology
carsearch score 42 --profile project_car_enthusiast
carsearch analyze 42            # everything above + deal signals in one JSON
carsearch market --metric manual_premium --make Subaru --model WRX
carsearch market --metric price_by_mileage --generation E90 --province ON
carsearch market --metric cheapening --days 90
carsearch status [--check-providers]  ·  carsearch runs  ·  carsearch alerts

Every command accepts --json for machine-readable output.

Monitoring / saved searches / alerts

carsearch saved seed                       # the four example searches from the brief
carsearch saved create "manual E90 328i under $8k" '{"make":"BMW","model":"3 Series","min_year":2006,"max_year":2011,"max_price":8000,"transmission":"manual"}' \
    --interval-minutes 240 --alert-rules '{"price_drop_pct":10,"target_price":6500,"min_deal_score":65}' --profile project_car_enthusiast
carsearch saved run "manual E90 328i under $8k"   # incremental crawl → new listings + alerts
carsearch schedule                          # long-running loop: runs due searches, maintenance
carsearch schedule --once                   # one pass (cron-friendly)

Alerts go to console, data/alerts.jsonl and an optional webhook (CARSEARCH_WEBHOOK_URL); new sinks = subclass notifications.alerts.AlertSink. Every alert carries reasons[] (and risks).

MCP server

carsearch serve-mcp                # stdio (default)  |  --transport streamable-http --port 8765

Tools: search_cars, search_live_marketplace, get_listing, get_vehicle, get_new_listings, get_price_history, get_listing_changes, get_comparables, compare_cars, find_deals, find_price_drops, find_long_sitting_listings, analyze_listing, score_listing, analyze_market, list_saved_searches, create_saved_search, run_saved_search, delete_saved_search, get_alerts, get_status, get_generation_codes, analyze_listing_images. All return structured JSON with pagination (limit/offset/next_offset); heavy fields (description, photos, raw) are opt-in.

Connect Claude Code

claude mcp add carsearch -- /ABSOLUTE/PATH/autotrader/.venv/bin/carsearch serve-mcp
# or in .mcp.json:
{ "mcpServers": { "carsearch": { "command": "/ABSOLUTE/PATH/autotrader/.venv/bin/carsearch", "args": ["serve-mcp"] } } }

Then: "Find me the best manual project cars under $7,000 CAD within 500 km of Toronto that appeared in the last week. Compare them against historical prices, flag major mechanical/rust risks from the listings, and rank the top 10." — Claude will typically call search_cars/get_new_listings (or search_live_marketplace for fresh data), then analyze_listing/compare_cars.

How checkpoints work

Each crawl is a provider_runs row. After every page the listings are committed and last_checkpoint.next_page is advanced; per-listing failures are logged in errors and skipped. Detail enrichment commits per listing (detail_fetched_at). A run that dies is failed/interrupted and carsearch crawl --resume <id> continues from next_page (already fetched pages come from the local http_cache). Saved-search state lives in the DB. See docs/architecture.md.

How to add a provider

Implement BaseProvider in src/carsearch/providers/<name>/, map to VehicleListing in a parser.py (keep raw), register it, add fixtures + tests, document it in docs/providers.md. Nothing else changes.

Tests

pytest -q          # 42 tests: normalization, parser fixtures, ingest/price history, dedupe,
                   # geo/search, analysis (flags/comps/scoring/deals/market), crawler checkpoints, MCP tools

No test touches the network (real payload fixtures + a fake provider).

Known limitations

  • Providers: only AutoTrader.ca collects. CarGurus (DataDome), Kijiji (edge 403 / kijijiautos.ca gone) and Facebook (login) are interfaces with live health probes; no anti-bot or login circumvention is attempted (see docs/providers.md).

  • Asking prices, not sale prices. Disappearance ≠ sold; we record not_observed/removed.

  • Coverage depends on what you crawl (200-page cap per query; split by bands). "Appeared in the last N days" uses the marketplace creation date when known (detail page) else our first observation.

  • Coordinates: exact for listings with detail pages; otherwise city-level (seed table / learned centroids / marketplace resolver). Distance filters skip listings without coordinates.

  • Scoring, flags and deal scores are heuristics with stated evidence and configurable rules (src/carsearch/config/*.json); they are inputs to reasoning, not verdicts. Regex flags can misfire on unusual phrasing (evidence is always returned).

  • Comparables use progressive relaxation; small samples are flagged (warnings, confidence).

  • Image analysis ships hashing/caching and a pluggable vision hook (Anthropic backend included, off by default); no vision model runs unless configured.

  • SQLite is fine for hundreds of thousands of listings; switch to PostgreSQL for concurrent writers.

Available Tools

23 tools
analyze_listingB

Everything about one listing: full record, price history, description risk/positive flags with evidence, comparables, project-car score with component explanations, deal signals.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoScoring profile name ('default','project_car_enthusiast','reliable_daily','flip_or_resale') or a custom dict {budget, likes[], does_not_prioritize[], major_negative[], weights{}, caps{}}.default
listing_idYes
include_imagesNoAlso cache photos and run the (pluggable) image-analysis hook
include_comparables_listNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It lists output components but does not state whether the operation is read-only, has side effects (e.g., caching), requires special permissions, or imposes rate limits. The caching behavior is only mentioned in the include_images parameter description, not in the main description. This is a significant gap for a tool with no annotation safety hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is concise and front-loaded with 'Everything about one listing'. It lists key components efficiently without excessive detail. The structure is clear, though it could benefit from separating the list into bullet points for readability. Overall, it earns its place with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 parameters, output schema exists), the description covers the main output categories but omits mention of the profile parameter that significantly alters scoring behavior, and the optional flags (include_images, include_comparables_list) are not highlighted. The output schema likely documents return values, so that is covered. However, the description would be more complete if it hinted at the customization options and the optional enrichments.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, meaning listing_id and include_comparables_list lack schema descriptions. The tool description does not compensate by explaining these parameters or the profile customization options. However, the parameters are relatively self-explanatory (listing_id is obvious, include_comparables_list is clear from its name), so the lack of explicit documentation is mitigated. The description adds no meaning beyond the schema, earning a baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Everything about one listing' and enumerates the specific components (full record, price history, description flags, comparables, project-car score, deal signals). This distinguishes it from more focused siblings like get_listing, get_price_history, get_comparables, and score_listing. The verb 'analyze' plus the comprehensive resource scope make the intent unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives. While it implies it is the comprehensive analysis option, it does not state conditions, trade-offs, or when to prefer a more specialized tool like get_listing or score_listing. The agent must infer usage from the name and sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_listing_imagesA

Cache the listing's photos (sha256 + perceptual hash) and run the pluggable vision backend (checklist: rust, rockers, paint mismatch, damage, interior, warning lights, mods, tires, stance, engine bay).

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
listing_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It discloses meaningful traits: photos are cached with sha256 and perceptual hash, the vision backend is pluggable, and the specific checklist of vehicle attributes is evaluated. It does not mention idempotency or failure behaviors, but the core side effects and scope are clearly surfaced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compressed into one purposeful sentence that front-loads the main action and object. The parenthetical checklist adds real operational detail without becoming redundant; it is slightly dense but every element contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The presence of an output schema covers return values, and the description explains the processing pipeline and checklist. However, the force parameter is left unexplained in both schema and description, and no usage context is given relative to similar analysis tools. This leaves the definition adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% parameter description coverage, so the description must clarify parameters. It implicitly ties listing_id to the listing's photos, but it never explains the force parameter, which is likely crucial for controlling cache reuse versus forced re-analysis. This is a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Cache'/'run') and resource ('listing's photos') and enumerates exactly what the vision backend checks (rust, rockers, paint mismatch, damage, etc.). This makes it clearly distinct from the sibling analyze_listing tool, which presumably covers broader listing analysis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool does but gives no guidance on when to choose it over analyze_listing, score_listing, or get_listing. There are no exclusions, prerequisites, or conditions stated, so an agent must infer usage solely from the tool name and behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_marketC

Market analytics: median prices over time / by mileage / by group, manual & AWD premiums, dealer vs private, cheapening models, turnover, long-sitting.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLookback window in days
makeNo
modelNo
metricNosummary | price_over_time | price_by_mileage | price_distribution | manual_premium | awd_premium | dealer_vs_private | long_sitting | cheapening | turnoversummary
statusNoany | activeany
group_byNoFor summary: province | seller_type | transmission | month | year | generation | make | model | mileage_band | drivetrain | body_style
keywordsNo
year_maxNo
year_minNo
price_maxNo
price_minNo
provincesNoProvince codes to include, e.g. ['ON','QC']. Omit for Canada-wide.
generationNo
seller_typeNo
transmissionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not state whether the operation is read-only, mention any rate limits, performance implications, or side effects. The description only lists output dimensions, not behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that efficiently enumerates the key analytical capabilities. It is concise and avoids fluff, though the list format is somewhat terse and could benefit from a brief explanation of the metric parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 15 parameters and an output schema, the description covers the main metric categories but omits guidance on how to combine filters or interpret results. The output schema likely defines the return structure, but the description does not help an agent decide which filters to apply for a given question, leaving some gaps in practical usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%, and the description does not explain any parameters beyond what the schema already says. Parameters like make, model, year_min, price_min, etc., have no descriptions in the schema and are also absent from the tool description, so the agent has no additional semantic guidance for those.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as 'Market analytics' and lists specific metrics (median prices, premiums, dealer vs private, etc.), making its purpose distinct from sibling tools like get_price_history or find_deals. It does not explicitly name a sibling to differentiate, but the scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, such as get_price_history for a single vehicle or find_deals for bargains. There is no mention of prerequisites or exclusions, leaving the agent to infer usage from the vague 'Market analytics' label.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_carsA

Side-by-side comparison of several listings: key facts, comps position, project score, deal signals and description risk flags.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoScoring profile name ('default','project_car_enthusiast','reliable_daily','flip_or_resale') or a custom dict {budget, likes[], does_not_prioritize[], major_negative[], weights{}, caps{}}.default
listing_idsYes2-10 listing ids to compare side by side

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so the description carries the full burden. The description indicates a read-only comparison operation (no side effects mentioned), but it does not disclose important behavioral details such as whether it requires specific authentication, whether there are rate limits, or how the output schema is structured (though an output schema exists). It also does not mention that the comparison is based on current data, which could be inferred. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one sentence, concise, and front-loads the core purpose. It lists key output categories efficiently. A small deduction because it could specify the need for at least two IDs (but that's in schema) and could be slightly more structured (e.g., bullets), but it's effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a moderate complexity (2 params, one optional), an output schema exists, and sibling tools provide context (like analyze_listing, score_listing), the description is fairly complete. It mentions the main output categories. It doesn't explain edge cases like what happens if some IDs are invalid, but that might be minor. It also doesn't state that the comparison is based on current data or that it may be heavy operation. But overall, adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% description coverage for parameters: listing_ids has clear description (2-10 ids to compare), and profile has a default and a list of named profiles with a custom dict format. The description adds little beyond the schema, but because coverage is high, the schema handles parameter documentation. The description does not need to repeat schema details, so a baseline of 3 is exceeded slightly because it hints at profiling ('project score'), implying the profile parameter's role.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'compare' and the resource 'several listings', and lists specific outputs (key facts, comps position, project score, deal signals, description risk flags). It distinguishes itself from siblings like analyze_listing (which likely analyzes a single listing) and score_listing (likely scores a single listing). However, it does not explicitly contrast with siblings, so a slight deduction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when an agent wants to compare multiple listings side by side, and the purpose is clear. But it does not explicitly state when not to use it (e.g., for single-listing analysis, use analyze_listing or score_listing). Given the tool name and description, context is clear enough, but explicit exclusions would earn a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_dealsA

Rank listings by deal signals and/or project-car score: comps position, price drops, time on market, seller, description risk flags — each item carries reasons, risks, risk_flags, project_score. Use sort_by='project' + a profile to answer 'best project cars'.

ParametersJSON Schema
NameRequiredDescriptionDefault
makeNo
limitNoPage size (max 200).
modelNo
sinceNoOnly listings that appeared since ('48h','7d')
profileNoScoring profile name ('default','project_car_enthusiast','reliable_daily','flip_or_resale') or a custom dict {budget, likes[], does_not_prioritize[], major_negative[], weights{}, caps{}}.default
sort_byNodeal (default) | project (rank by project-car score under profile) | combineddeal
keywordsNo
locationNoFree-text centre for radius search: city ('Vaughan'), 'City, PROV', or postal code ('M5V 3L9').
year_maxNo
year_minNo
price_maxNo
price_minNo
provincesNoProvince codes to include, e.g. ['ON','QC']. Omit for Canada-wide.
radius_kmNoRadius in km around `location` (or latitude/longitude).
seller_typeNo
transmissionNo
exclude_flagsNoDrop listings whose description triggers any of these flags, e.g. ['salvage_title','frame_rust','rebuilt_title','doesnt_run','flood_or_water']
min_deal_scoreNo
candidate_limitNoHow many newest matching listings to score (cost grows linearly)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does well: it reveals that the tool ranks listings, that each item carries reasons/risks/risk_flags/project_score, and that sort_by='project' requires a profile. It also implies the tool scores listings rather than just filtering them. However, it does not disclose details like whether the tool mutates anything (it doesn't appear to), rate limits, or what the output schema contains beyond the listed fields. The description adds meaningful behavioral context beyond the schema, but stops short of full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose ('Rank listings by deal signals and/or project-car score') and the key signals. The second sentence gives a concrete usage example. Every clause earns its place; there is no filler or repetition of schema details. It is appropriately sized for a tool with 19 parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (19 parameters, scoring logic, output schema), the description is reasonably complete: it explains the scoring dimensions, the output fields, and the project-car use case. The output schema exists, so return values need not be fully described. However, it does not explain the meaning of 'deal' vs 'combined' sort modes beyond the sort_by parameter description, nor does it clarify how the profile dict fields (budget, likes, etc.) affect scoring. These are gaps an agent might need to fill by inspecting the schema or making trial calls.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 47%, so the description must compensate for the many parameters without descriptions (make, model, year_min, year_max, price_min, price_max, seller_type, transmission, keywords, etc.). The description does add value by explaining the scoring semantics: it names the deal signals and the project_score, and it clarifies how sort_by and profile interact. However, it does not explain the meaning of many filter parameters (e.g., what seller_type values are valid, how keywords interact with scoring). The description partially compensates for the coverage gap but leaves several parameters semantically under-specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Rank listings') and a clear resource ('deal signals and/or project-car score'), and enumerates the exact signals used (comps position, price drops, time on market, seller, description risk flags). It also names the output fields (reasons, risks, risk_flags, project_score), which distinguishes it from sibling search tools like search_cars or find_price_drops. The explicit mention of 'best project cars' usage further clarifies its unique role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a concrete usage directive: 'Use sort_by='project' + a profile to answer 'best project cars'.' This tells the agent when to use this tool for a specific intent. However, it does not explicitly state when NOT to use it or name alternatives like find_price_drops or find_long_sitting_listings, which are siblings that might overlap. The guidance is clear for the project-car case but lacks explicit exclusions for other deal-finding scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_long_sitting_listingsC

Active listings on the market for at least min_days (optionally with several price cuts).

ParametersJSON Schema
NameRequiredDescriptionDefault
makeNo
limitNoPage size (max 200).
modelNo
offsetNoPagination offset.
locationNoFree-text centre for radius search: city ('Vaughan'), 'City, PROV', or postal code ('M5V 3L9').
min_daysNo
price_maxNo
provincesNoProvince codes to include, e.g. ['ON','QC']. Omit for Canada-wide.
radius_kmNoRadius in km around `location` (or latitude/longitude).
transmissionNo
min_price_dropsNoe.g. 2 = seller already cut the price twice

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden of behavioral disclosure. It does not state that the tool is read-only, describe pagination behavior, sorting, or what the response contains. While a 'find' tool is implicitly non-destructive, the absence of explicit behavioral information leaves a gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler. It captures the core concept efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having 11 optional parameters and an output schema, the description is minimal. It lacks context about how filters interact, what the default behavior is (e.g., default min_days=30), and how results are ordered. The description is too sparse for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 55%, so the description must add meaning. It clarifies min_days as the market-duration threshold and hints at price cuts (min_price_drops), but it doesn't explain make, model, transmission, price_max, or radius-related parameters. The description partially compensates but is not comprehensive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool returns active listings that have been on the market for at least min_days, optionally with price cuts. This clearly distinguishes it from siblings like get_new_listings, find_price_drops, and search_cars by focusing on listing age and price-drop count. However, it doesn't explicitly mention the resource scope or contrast with alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives. It doesn't mention any exclusions, prerequisites, or scenarios. An agent cannot tell from the description whether to choose this over search_cars or get_price_history.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_price_dropsB

Listings whose asking price dropped by >= min_pct within the window (single or cumulative drops).

ParametersJSON Schema
NameRequiredDescriptionDefault
makeNo
limitNoPage size (max 200).
modelNo
sinceNo7d
offsetNoPagination offset.
min_pctNo
locationNoFree-text centre for radius search: city ('Vaughan'), 'City, PROV', or postal code ('M5V 3L9').
price_maxNo
provincesNoProvince codes to include, e.g. ['ON','QC']. Omit for Canada-wide.
radius_kmNoRadius in km around `location` (or latitude/longitude).
transmissionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose the matching semantics (threshold, window, single/cumulative), which is useful, but it never states that the operation is a safe read, what it returns (though an output schema exists), or how the 'window' is defined.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one compact sentence front-loading the core criterion, with the cumulative-drop clarification in a parenthetical. Every phrase earns its place; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an existing output schema, the description is thin for an 11-parameter tool with no annotations. It never explains how the window is set (the since parameter), doesn't mention pagination or defaults, and offers no behavioral context such as sorting or listing status.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 45%, so the description must compensate. It clarifies the role of min_pct ('dropped by >= min_pct') and implies the window comes from the since parameter, but it doesn't add meaning for parameters like make, model, price_max, or transmission, which lack schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (Listings) and the qualifying condition (asking price dropped by >= min_pct within the window), and the parenthetical on single vs cumulative drops sharpens the definition. It doesn't use an explicit verb, but the tool name supplies the action, and the text distinguishes it from broad sibling 'find_deals' by specifying a measurable drop threshold.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to choose this tool over siblings like find_deals or get_listing_changes, and mentions no exclusions or prerequisites. Only the name and subject imply a use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_alertsC

Recent alerts (new matches, price drops, target price, rare manuals, deal scores) with reasons.

ParametersJSON Schema
NameRequiredDescriptionDefault
ruleNo
limitNoPage size (max 200).
sinceNo7d

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of disclosing behavior. It implies a read operation but does not state that it has no side effects, requires no special permissions, or that alerts are pre-computed/static. It also doesn't mention any rate limits or data freshness beyond 'recent'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that packs useful content (alert types, inclusion of reasons) without waste. The key information is front-loaded with 'Recent alerts'. It could be slightly more structured by adding a verb, but it is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return structure is covered, but the description leaves critical usage context missing: what 'rule' filters on, what 'since' accepts, and when this tool is the right choice among many alert-related siblings. For a 3-parameter tool with no annotation coverage and only one documented parameter, this is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (only 'limit' has a description). The tool description does not explain 'rule' or 'since' at all, leaving their formats and semantics undocumented in both the schema and the description. The phrase 'recent' weakly implies 'since' is a time filter, but that's not explicit and 'rule' remains opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (alerts), the timeframe (recent), and enumerates content categories (new matches, price drops, target price, rare manuals, deal scores) plus that they include reasons. This is specific enough to distinguish from generic alert tools, though it lacks an explicit verb like 'list' or 'fetch' and doesn't contrast with siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to prefer get_alerts over alternatives like find_price_drops or get_listing_changes. The description only states what it returns, not the decision context that should route an agent to this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_comparablesB

Comparable-price analysis: sample size, median/mean/quartiles, mileage-adjusted median, manual/AWD/dealer premiums, subject percentile and methodology. Pass a listing_id OR a vehicle spec.

ParametersJSON Schema
NameRequiredDescriptionDefault
makeNo
trimNo
yearNo
modelNo
provinceNo
price_cadNoAsking price to position against comparables (e.g. the $6,200 Audi TT)
drivetrainNo
generationNo
listing_idNo
mileage_kmNo
seller_typeNo
include_listNo
transmissionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It lists the computed metrics and mentions 'methodology,' but does not disclose read-only behavior, error conditions, or what happens if both listing_id and spec are provided. It covers the main output but lacks depth on edge cases and side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the primary purpose and lists key output metrics, followed by a clear usage instruction. Every part earns its place with zero redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 13 parameters, no required fields, no annotations, and 8% schema coverage, the description is far too brief. It does not explain the two invocation modes in detail, the relationship between parameters, or how to interpret the output (though an output schema exists). An agent would struggle to correctly assemble a 'vehicle spec' or know when to use which mode. More guidance is needed for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 8% (only price_cad has a description). The description says 'Pass a listing_id OR a vehicle spec' but does not clarify which of the 13 parameters constitute a 'spec' or how they interact. It adds minimal semantic value beyond the schema names, leaving the agent to guess which fields are required for spec mode. This is a significant gap given the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear purpose: 'Comparable-price analysis' with a list of specific outputs (sample size, median/mean/quartiles, mileage-adjusted median, premiums, subject percentile). This distinguishes it from generic search tools, but it does not explicitly name a sibling it is not (e.g., compare_cars or analyze_market). The resource and verb are clear, but the differentiation is implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a direct usage instruction: 'Pass a listing_id OR a vehicle spec.' This tells the agent how to invoke it and implies the two modes. However, it does not provide when-not-to-use guidance or mention alternatives, so the guidance is clear but not comprehensive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_generation_codesA

Supported generation/chassis labels per make/model (for the generation filter) and scoring profiles.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description should disclose behavioral traits such as read-only/no side effects and return shape. It describes content but does not explicitly state that this is a safe lookup or how the result is structured, relying on the `get_` name and output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One concise sentence that leads with the primary resource, adds the use-case parenthetical, and mentions scoring profiles with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema, this is mostly sufficient, but the 'scoring profiles' item is unexplained and the no-parameter behavior (returning all supported labels) is only implicit. An agent may need to infer how this reference data connects to scoring tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline is 4. The description adds no parameter-specific detail, but none is needed because the schema is empty and the tool requires no input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific resource: generation/chassis labels per make/model and scoring profiles. It mentions the intended use for the generation filter, which helps distinguish this reference lookup from search/analysis siblings, though it lacks an explicit verb in the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly ties the labels to the `generation` filter, implying use before search_cars or similar tools needing valid filter values. However, it gives no guidance on when to use the scoring profiles or any exclusions/alternatives, so usage guidance is partial.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_listingC

Full listing record with price history, change events, description flags, vehicle link and same-vehicle candidates.

ParametersJSON Schema
NameRequiredDescriptionDefault
listing_idYesLocal numeric id, 'autotrader:<uuid>', the source listing id, or the listing URL
include_photosNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden of behavioral disclosure. It does state what the returned record includes, but it does not clarify invocation behavior, freshness, error semantics, effect of include_photos, or whether this is a read-only operation. The description adds some return-content context but not enough behavioral transparency for an unannotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence that front-loads the core idea ('Full listing record') and then lists key contents. It is compact and generally scannable, though the phrase 'same-vehicle candidates' is somewhat jargon-heavy without further explanation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The call itself is simple: one required listing_id with a well-documented format, a self-explanatory boolean default, and an output schema that can carry return details. However, the description does not say when to choose this over the sibling tools, and with no annotations the safety/behavioral context is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, with listing_id well documented but include_photos left unexplained. The tool description does not compensate for this gap and does not mention include_photos at all. The parameter name and default give partial meaning, but the description adds no parameter-level value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a clear noun phrase, 'Full listing record,' and enumerates the distinct components it returns: price history, change events, description flags, vehicle link, and same-vehicle candidates. This differentiates it somewhat from sibling tools like get_vehicle, get_price_history, and get_listing_changes, though the differentiation is implicit rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use get_listing versus the many overlapping siblings such as get_vehicle, get_price_history, get_listing_changes, or get_comparables. An agent must infer usage from the name and the enumerated fields. There is no exclusion or alternative recommendation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_listing_changesC

Change events across the database (or for one listing) within a window.

ParametersJSON Schema
NameRequiredDescriptionDefault
makeNo
limitNoPage size (max 200).
modelNo
sinceNoWindow: '24h', '7d', ISO24h
offsetNoPagination offset.
price_maxNo
provincesNoProvince codes to include, e.g. ['ON','QC']. Omit for Canada-wide.
listing_idNo
event_typesNoFilter: new_listing, price_drop, price_increase, removed, not_observed, relisted, description_changed, seller_changed, mileage_changed

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It does disclose the scope (database-wide or one listing) and the temporal window, which are useful behavioral traits. However, it does not mention pagination, result ordering, or how the event-type filter behaves, so transparency is only partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler or redundant content. It front-loads the core scope and window, which is good, though it is so brief that it leaves significant context for other dimensions unaddressed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with no annotations and many siblings, a one-sentence description is incomplete. It lacks usage guidance, parameter semantics, and behavioral details, despite the output schema covering the return shape. An agent trying to choose between this and its siblings would need more context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 56%, with several parameters (make, model, price_max, listing_id) lacking descriptions. The description adds only minimal parameter meaning: 'for one listing' hints at listing_id and 'within a window' hints at since. It does not explain filtering semantics, event_types choices, or interactions between parameters beyond what the schema already shows.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states that the tool returns change events for listings, either across the entire database or for a single listing, within a time window. This makes the resource and scope clear, and distinguishes it from narrower siblings like get_new_listings and find_price_drops because it covers all change events rather than a specific subset. It does not explicitly enumerate the event types, but the schema provides those details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives such as get_new_listings, find_price_drops, or get_price_history. The phrase 'across the database (or for one listing)' implies a general audit use case, but there are no when-to-use, when-not-to-use, or alternative-selection conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_new_listingsB

Listings first observed since a given time (newest first).

ParametersJSON Schema
NameRequiredDescriptionDefault
makeNo
limitNoPage size (max 200).
modelNo
sinceNo'24h', '48h', '7d' or ISO timestamp24h
offsetNoPagination offset.
keywordsNo
locationNoFree-text centre for radius search: city ('Vaughan'), 'City, PROV', or postal code ('M5V 3L9').
price_maxNo
provincesNoProvince codes to include, e.g. ['ON','QC']. Omit for Canada-wide.
radius_kmNoRadius in km around `location` (or latitude/longitude).
seller_typeNo
transmissionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral disclosure burden. It mentions the core behavior (first observed since a time, newest first), which implies a read-only query, but it does not discuss pagination, auth needs, rate limits, or whether only active listings are returned. It is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, tight sentence with no redundancy. It front-loads the essential behavior ('first observed since a given time') and adds the sort order ('newest first'), earning its place without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 12 parameters, zero annotations, and many sibling query tools, this one-sentence description is too thin. It does not explain how filters interact, what 'first observed' means operationally, or how this differs from similar search/list tools, so an agent may struggle to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50% (6 of 12 parameters have descriptions), and the tool description adds no parameter meaning at all. Undocumented parameters like make, model, keywords, price_max, seller_type, and transmission remain without clarification, so the description does not compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns listings first observed since a given time, sorted newest first. It effectively distinguishes from siblings like search_cars and get_listing_changes through the 'first observed' concept, though it doesn't explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus siblings such as search_cars, find_deals, or get_listing_changes. The appropriate context is only implied by the name and one-line description, with no explicit 'use this when...' or 'not for...' direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_price_historyB

Price/mileage/status snapshots and the derived summary (days on market, drops, absolute/percent change).

ParametersJSON Schema
NameRequiredDescriptionDefault
listing_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains what the tool returns (snapshots and summary) but does not mention any side effects, data freshness, or limitations. It is not contradictory, but lacks depth beyond the output description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that front-loads the core purpose and derived summary. Every word contributes to understanding, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one parameter and an output schema exists, so return values are covered elsewhere. However, missing usage guidelines and lack of behavioral context make it incomplete for an agent deciding when to call it, especially given the many similar siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one parameter (listing_id) with 0% description coverage, and the description does not mention or elaborate on it. While the parameter name is self-explanatory, the description adds no value beyond the schema, failing to compensate for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provides 'Price/mileage/status snapshots and the derived summary' with specific derived fields (days on market, drops, absolute/percent change). This is a specific verb+resource, but it does not explicitly differentiate from siblings like get_status or find_price_drops, though the derived summary concept sets it apart implicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives such as get_status, get_listing_changes, or find_price_drops. There is no mention of context, exclusions, or recommended alternatives, leaving the agent to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_statusB

Collector health: DB counts by source/province, recent runs, HTTP metrics, provider capabilities.

ParametersJSON Schema
NameRequiredDescriptionDefault
check_providersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It lists what metrics are surfaced, which is useful, but it never explicitly states that the call is read-only, whether check_providers triggers live provider probing, whether there are side effects, or whether any auth or rate-limit considerations apply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded, scannable sentence using a colon + listing structure. Every word contributes meaning and there is no redundant restatement of the tool name or schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is an output schema, so return values do not need to be spelled out, and the description gives a coherent health-snapshot scope. However, the only parameter is unexplained, and the absence of any read-only or side-effect note leaves an agent uncertain about calling with check_providers enabled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the undocumented check_providers parameter, but it does not. The phrase 'provider capabilities' is vaguely related, but an agent cannot tell whether setting the flag performs a live check, changes response behavior, or impacts latency.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a collector health/status report and enumerates the kinds of data included: DB counts by source/province, recent runs, HTTP metrics, and provider capabilities. It is easy to distinguish from the car-search and listing-analysis sibling tools, though it uses a noun phrase rather than an explicit verb like 'retrieves'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The health framing implies this is for operational/diagnostic status checks, and no sibling appears to provide the same function. However, the description gives no explicit when-to-use guidance, no exclusions, and no mention of when the optional check_providers flag should be enabled.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vehicleB

A physical vehicle (dedupe cluster) with all listings that were matched to it across marketplaces/time.

ParametersJSON Schema
NameRequiredDescriptionDefault
vehicle_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It conveys that the tool aggregates listings across marketplaces and time, which is useful, but it does not state whether the operation is read-only (implicit from 'get'), potential performance implications, or behavior when no vehicle is found. It adds some context but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no filler words. However, it is structured as a definition rather than an action, which slightly reduces its effectiveness. The key concept of dedupe clustering is included without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description does not need to detail return structure. It explains the core purpose and the aggregation aspect. For a simple get-by-id tool with one parameter, this is largely sufficient. The main missing element is usage guidance, but that is covered under a separate dimension.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate by explaining the vehicle_id parameter. It does not mention the parameter at all. The name 'vehicle_id' is self-explanatory, but the description adds no additional meaning or usage context, leaving the agent to infer everything from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (physical vehicle / dedupe cluster) and its content (all matched listings across marketplaces/time). It distinguishes from get_listing, which presumably targets a single listing, by emphasizing the aggregation. However, it is phrased as a noun phrase rather than an explicit verb action like 'Retrieves...', which slightly reduces clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as get_listing, search_cars, or get_new_listings. The description implies that it is for obtaining a vehicle's aggregated listings, but it does not explicitly state conditions for selection or mention any sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_saved_searchesB

Saved (monitored) searches with schedule state.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states that saved searches have schedule state, without mentioning whether this is read-only, whether it returns all saved searches, authentication needs, pagination, or ordering. There is no contradiction, but the behavior is largely undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with no filler words, and the key concept 'saved searches' is front-loaded. It is appropriately sized for a zero-parameter tool, though the brevity leaves some semantic gaps.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter listing tool with an output schema, the description is nearly sufficient. However, in a sibling-rich context with no usage guidance and no annotations, an agent would still be uncertain about what exactly is listed and how schedule state is represented. It is minimally viable but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so there is nothing for the description to add about parameter meanings. Per the baseline for zero-parameter tools, this is fully adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource clearly ('saved searches') and adds a distinguishing feature ('schedule state'), so an agent can infer this is a listing operation. However, it lacks an explicit verb like 'List' and does not explicitly differentiate itself from sibling tools such as run_saved_search or delete_saved_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives like get_alerts, run_saved_search, or create_saved_search. The description provides no context, prerequisites, or exclusions, leaving selection entirely to inference from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

score_listingC

Project-car score (0-100) with per-component scores/weights/explanations under a named or custom profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoScoring profile name ('default','project_car_enthusiast','reliable_daily','flip_or_resale') or a custom dict {budget, likes[], does_not_prioritize[], major_negative[], weights{}, caps{}}.default
listing_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It describes the scoring computation and output components but does not state whether the operation is read-only, whether it has side effects, whether it requires special auth, or whether custom profiles affect computed results in any non-obvious way. The description does not contradict anything, but it leaves key behavioral traits unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence that packs in the score range, the component breakdown, and the profile flexibility without filler. It is easy to read, though a more explicit verb or slight restructuring, such as 'Returns a project-car score...', would improve clarity. No unnecessary words are present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The presence of an output schema covers return-value details, and the schema already documents the profile parameter well. Still, with no annotations and no sibling differentiation, the description leaves an agent to infer that this is a read-only scoring action and when to choose it over analyze_listing. For a two-parameter tool this is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, with listing_id having no description. The description adds some value by clarifying that the profile can be 'named or custom', which complements the schema's detailed profile enum/object. However, listing_id semantics are still only implied by the tool name, and the description does not fully compensate for the missing schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool produces a 0-100 project-car score with per-component scores, weights, and explanations. It identifies the resource (a listing) and the profile dimension, so an agent can infer the core purpose. However, it lacks an explicit verb and does not distinguish this from sibling tools like analyze_listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives such as analyze_listing, analyze_market, or find_deals. It does not mention when a named profile is preferable to a custom profile, nor when the tool should not be used. Usage context must be inferred entirely from the tool name and schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_carsA

Search the local historical database of collected listings with rich filters, geography and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
makeNo
sortNonewest | price_asc | price_desc | mileage_asc | distance | days_on_market | price_drop | year_desc | last_seennewest
trimNo
limitNoPage size (max 200).
modelNoModel or trim text, e.g. '3 Series', '328i', 'TT', 'WRX' (matches model, trim and title)
offsetNoPagination offset.
sourceNoMarketplace source filter, e.g. autotrader
statusNoactive (default) | any | not_observed | removedactive
has_vinNo
keywordsNoWords that must appear (in title/description/features); prefix - to exclude, quotes for phrases. e.g. '"one owner" -salvage manual'
latitudeNo
locationNoFree-text centre for radius search: city ('Vaughan'), 'City, PROV', or postal code ('M5V 3L9').
year_maxNo
year_minNo
fuel_typeNo
longitudeNo
price_maxNo
price_minNo
provincesNoProvince codes to include, e.g. ['ON','QC']. Omit for Canada-wide.
radius_kmNoRadius in km around `location` (or latitude/longitude).
body_styleNosedan | coupe | hatchback | wagon | convertible | suv | pickup | van | minivan
drivetrainNofwd | rwd | awd | 4wd
generationNoChassis/generation code such as 'E90', 'Mk4', 'NA', '8N'. See get_generation_codes for supported labels.
mileage_maxNo
mileage_minNo
seller_typeNoprivate | dealer
transmissionNomanual | automatic | cvt | dct
exclude_damagedNo
include_detailsNoInclude description, photos, seller and all fields for each item (larger payload)
min_price_dropsNo
max_days_on_marketNo
min_days_on_marketNo
newly_listed_sinceNoOnly listings first observed since: '24h', '7d', '2w' or ISO timestamp
price_drop_min_pctNoOnly listings whose current price is at least this % below their first observed price

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that this searches a 'local historical database' (implying offline, collected data) and mentions pagination. However, it doesn't disclose return format, default behavior when no filters are given, or whether results are sorted by relevance vs. newest. The description adds some context but leaves significant behavioral details to the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, dense sentence that front-loads the core purpose ('Search the local historical database of collected listings') and then summarizes capabilities. Every word earns its place; no fluff or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 34-parameter tool with no annotations, the description is minimal. The output schema exists, so return values are covered, and the schema documents many parameters. However, the description doesn't clarify key behavioral aspects like whether this is a read-only operation, how pagination interacts with sorting, or what 'historical' means in terms of data freshness. It's adequate but leaves gaps for a complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 53%, so the schema documents many parameters. The description adds the high-level concept of 'rich filters, geography and pagination' but doesn't explain any specific parameter semantics beyond what the schema already provides. With 34 parameters and 53% coverage, the description could have compensated for the undocumented half, but it doesn't. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Search'), a specific resource ('local historical database of collected listings'), and the key capabilities ('rich filters, geography and pagination'). It clearly distinguishes this from the sibling search_live_marketplace by emphasizing 'local historical database' vs. live marketplace. An agent can tell this is the offline/historical search tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is the tool for searching collected/historical listings, which contrasts with search_live_marketplace. However, it doesn't explicitly state when to use this vs. alternatives like get_new_listings, find_deals, or find_price_drops. The 'local historical database' phrasing gives clear context but no explicit exclusions or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_live_marketplaceA

Run a fresh marketplace search (stores everything with history), then return matching listings from the local DB including ones seen earlier. Use for up-to-the-minute results.

ParametersJSON Schema
NameRequiredDescriptionDefault
makeNo
sortNonewest | price_asc | price_desc | mileage_asc | distance | relevancenewest
limitNoPage size (max 200).
modelNo
keywordsNo
locationNoFree-text centre for radius search: city ('Vaughan'), 'City, PROV', or postal code ('M5V 3L9').
providerNoautotrader (others: cargurus/kijiji/facebook are placeholders)autotrader
provinceNoSingle province code; without `location` the crawl uses the province centroid + covering radius, and results are filtered exactly to the province locally
year_maxNo
year_minNo
fuel_typeNo
max_pagesNoResult pages to fetch (20 listings each). Politeness: ~1.5s per page.
price_maxNo
price_minNo
radius_kmNoRadius km (marketplace supports up to ~1000)
body_styleNo
drivetrainNo
mileage_maxNo
seller_typeNo
transmissionNo
fetch_detailsNoFetch detail pages for NEW listings (VIN, coordinates, drivetrain, features; ~1.5s each)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses a key side effect: 'stores everything with history', and clarifies that results are read from the local DB, not just live. This goes beyond a simple search description and informs the agent about persistence behavior, though it omits rate limits or other operational details present in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loads the essential behavior (fresh search, storage, local DB return), and avoids waste. Each sentence contributes a distinct, useful fact, making it highly efficient for its size.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema covering return values, the tool has 21 parameters with low schema coverage and no annotations. The description is too thin to be contextually complete: it does not explain parameter interplay, which filters are supported, or the implications of 'stores everything with history' for the agent's decision-making.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 38%, so the description must compensate for the many undocumented parameters. It does not mention or explain any of the 21 parameters (make, model, sort, price, etc.). The phrase 'matching listings' gives no concrete guidance on how filters map to behavior, leaving agents with inadequate parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb 'Run a fresh marketplace search' and resource 'local DB', and distinctly signals it returns 'matching listings from the local DB including ones seen earlier'. This differentiates it from sibling tools like search_cars and get_new_listings by emphasizing freshness, persistence, and historical inclusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear usage context: 'Use for up-to-the-minute results.' It does not explicitly name alternatives or state when not to use it, but the freshness cue implies when this tool is preferred over other search tools, which is adequate without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 23 tool updatesv0.1.0
    • First observedanalyze_listing
    • First observedanalyze_listing_images
    • First observedanalyze_market
    • First observedcompare_cars
    • First observedcreate_saved_search
    • First observeddelete_saved_search
    • First observedfind_deals
    • First observedfind_long_sitting_listings
    • First observedfind_price_drops
    • First observedget_alerts
    • First observedget_comparables
    • First observedget_generation_codes
    • First observedget_listing
    • First observedget_listing_changes
    • First observedget_new_listings
    • First observedget_price_history
    • First observedget_status
    • First observedget_vehicle
    • First observedlist_saved_searches
    • First observedrun_saved_search
    • First observedscore_listing
    • First observedsearch_cars
    • First observedsearch_live_marketplace

TDQS

A3.5/5.0

Scored across 23 tools

Disambiguation5/5

Each tool targets a distinct resource or analytical mode: search vs. live search, listing vs. vehicle vs. price history vs. changes, comparables vs. comparison vs. market analysis. Even the find_* tools are separated by clear signals (deals, price drops, long-sitting), so an agent should be able to select the right tool confidently.

Naming Consistency5/5

Tool names consistently follow a snake_case verb_noun pattern: search_cars, get_listing, find_deals, analyze_listing, list_saved_searches, delete_saved_search. Minor variations like search_live_marketplace or analyze_listing_images remain readable and fit the same convention.

Tool Count3/5

At 23 tools, the server is on the heavy side and falls into the 16-25 range that feels dense. The broad car-search/analysis domain justifies many of them, but the overall surface could be streamlined or grouped further.

Completeness5/5

The tool surface covers the full workflow: historical and live search, listing/vehicle detail, price history and changes, comparables, market analytics, image/listing analysis, scoring, saved-search lifecycle, and alert retrieval. Saved searches support create/update, run, list, and delete, so there are no obvious dead ends for the stated domain.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for structured public vehicle data from StartMyCar, providing tools to list makes, models, problems, reviews, fuse box data, manuals, guides, and compare models.
    9 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for analyzing Canadian federal spending data, offering tools for contract search, NLP, semantic search, anomaly detection, and money-flow tracing.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for the used-Mac market, enabling AI assistants to search live listings across multiple marketplaces, get price statistics, check listing trust, lookup serial numbers, retrieve condition reports, and create email alerts.
    24 npm
    2
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    MCP server for searching and monitoring RedFlagDeals deals. Provides tools to search deals, get deal details, and set up monitors for new deals.
    6
    -