Moonshot Lab (demo)
Server Details
Agent car inventory index. Synthetic demo data, not real inventory, not an offer.
- Status
- Healthy
- Uptime
- 100.0% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 17 tools
The dense pricing cluster (get_price_breakdown, estimate_out_the_door, get_payment_estimate, compare_payment_scenarios) is explicitly delineated in each description, so an agent can pick correctly despite surface similarity. Remaining overlap is mild: get_ontology vs list_searchable_fields both expose schema/vocabulary, and get_dealer vs list_dealers differ mainly in scope (one vs all 20).
All 17 names are snake_case verb-first (get_*, list_*, search_*, save_*, cancel_*, estimate_*, compare_*, prepare_*, register_*). No camelCase or noun-only outliers, and the verb choice reflects the action accurately.
17 tools is just above the comfortable band, but each maps to a distinct step in the car-shopping flow (search, inspect, price, finance, save search, handoff, meta). Nothing looks redundant or gratuitous; the count is slightly heavy rather than bloated.
Core lifecycle is covered: search, listing/dealer/media detail, itemized pricing, financing scenarios, trade-in inputs, saved searches with new-match polling, and a dealer handoff package. Minor gaps: there is no tool to read or list saved searches (save_search returns a search_id but only cancel_search and get_new_matches consume it), and leases/add-on pricing are explicitly out of scope.
Available Tools
17 toolscancel_searchAInspect
DEMO. Cancel a saved search. Any shopper email stored for it is deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| search_id | Yes | search_id from save_search. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it discloses the non-obvious and consequential side effect that stored shopper email is deleted — the most important behavioral fact for an agent to surface before calling. It omits whether cancellation is irreversible, idempotent, or what occurs if the search_id no longer exists, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the DEMO marker and the action, followed by the single risk disclosure. Nothing is padded and every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no annotations and no output schema, the definition covers purpose and the destructive side effect but says nothing about the success response, failure modes, or irreversibility. Adequate to call correctly, thin on what to expect back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already says "search_id from save_search"; the description adds no format, nullability, or lookup detail beyond that. The baseline of 3 applies since the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Cancel a saved search"), which pairs unambiguously against the sibling save_search. It does not explicitly name the sibling or the create/cancel relationship, but the resource is specific enough to distinguish it from the listing/dealer/inventory tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the tool operates on a search previously persisted by save_search, and the schema's required search_id makes that prerequisite inferable. There is no explicit statement of when to use this versus save_search, nor any condition for when cancellation is inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_payment_scenariosAInspect
Use this to compare several financing what-ifs for ONE listing side by side in one call (for example cash down, term, credit tier or APR, trade-in, incentives). Each scenario reruns the itemized out-the-door estimate and returns estimated_out_the_door, amount_financed_estimate, apr_percent and apr_source, term_months, estimated_monthly_payment (rounded to $5) with the unrounded value and an outward-rounded range, total_interest_estimate, total_cost_including_trade_equity (PRIMARY total: cash down plus all payments plus net trade equity given up), cash_outlay_excluding_trade_equity (cash down plus payments only; total_cost_estimate is its deprecated alias) and financing_eligibility with flags (demo rules), plus lowest_monthly, lowest_total_cost (decided by total_cost_including_trade_equity) and lowest_cash_outlay_excluding_trade_equity. Those lowest_* keys are UNFILTERED math winners. Present recommended_scenario, lowest_monthly_eligible or lowest_total_cost_eligible instead: they skip scenarios the demo financing rules flag, so an ineligible scenario is never the recommendation. A scenario {"name":"cash","cash":true} prices paying cash (no loan, no interest); cash_purchase always gives the cash amount due. Each scenario has trade_risk (negative_equity_rolled_in, loan_to_value_pct and warnings, for example LTV over 110%) and credit_tier_source. Prefer this over repeated get_payment_estimate calls. Up to 6 scenarios. For a single scenario use get_payment_estimate. Estimate, not an offer; dealer sets price, lender sets rate. Leases are not modeled.
| Name | Required | Description | Default |
|---|---|---|---|
| buyer_zip | No | Buyer's five-digit ZIP. Alone it resolves buyer state, county and city (echoed in tax_location.resolution with the source). | |
| scenarios | Yes | 1 to 6 what-if scenarios, e.g. [{"name":"0 down"},{"name":"3k down 72","down_payment":3000,"term_months":72}]. Omitted fields default to $0 down, 60 months, good credit. | |
| buyer_city | No | Buyer's city. | |
| listing_id | Yes | dealer_key:VIN from search_inventory. | |
| buyer_state | No | Buyer's two-letter state for tax and fees. Default: the selling store's state. | |
| buyer_county | No | Buyer's county without 'County'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that lowest_* keys are UNFILTERED math winners, that recommended_scenario/lowest_*_eligible skip demo-rule-flagged scenarios, that an ineligible scenario is never recommended, what cash=true does, and the 'estimate, not an offer; leases are not modeled' caveat. This is rich behavioral context an agent could not infer from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the sibling routing, and every clause carries operational information (return keys, eligibility filtering, caveats). It is dense and run-on, with a heavy enumeration of return fields, but given the tool's complexity and the absence of an output schema that content largely earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, 6-parameter tool with no annotations and no output schema, it covers purpose, alternatives, defaults, eligibility semantics, return keys, and limitations. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description adds value by mapping scenario dimensions (cash down, term, credit tier/APR, trade-in, incentives) and spelling out the cash scenario and the $0 down/60 month/good credit defaults. It complements rather than merely repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb (compare) and resource (financing what-ifs for ONE listing), plus the scope constraint 'side by side in one call'. It explicitly names the sibling it differs from (repeated get_payment_estimate calls / get_payment_estimate for a single scenario), so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not: 'Prefer this over repeated get_payment_estimate calls' and 'For a single scenario use get_payment_estimate', with a hard limit of 'Up to 6 scenarios'. Alternatives and selection conditions are fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_out_the_doorAInspect
Use this for the buyer's TOTAL price of ONE listing: an itemized out-the-door DEMO ESTIMATE for the buyer's state, county and city, built with real public tax and fee rules for the 8 covered states. Lines include the price, dealer fees, eligible incentives, state and local sales tax, title and registration fees, and a trade-in block (allowance, payoff, equity, tax credit). Every line has a source and confidence; unknowns become ranges. Read estimated_out_the_door with estimate_range and confidence. With a trade-in, estimated_out_the_door is the balance due after the trade (negative equity added); deal.vehicle_out_the_door_before_trade is the car alone. Use get_price_breakdown instead for only the dealer's listed price and fees, and get_payment_estimate to turn this total into a monthly finance payment (this tool returns payments: null). Read warnings, for example when the shopper's state differs from the store's state. Not an offer, not a quote, not penny-accurate. Inputs are not stored.
| Name | Required | Description | Default |
|---|---|---|---|
| payoff | No | Loan payoff in USD still owed on the trade-in. | |
| financed | No | True if the purchase will be financed, false for cash. Some fees and incentives depend on it; if omitted they are flagged as uncertain. | |
| buyer_zip | No | Buyer's five-digit ZIP. Alone it resolves buyer state, county and city (echoed in tax_location.resolution with the source). | |
| buyer_city | No | Shopper's city, e.g. Chicago. Some city taxes depend on it; it can also imply the county. | |
| listing_id | Yes | dealer_key:VIN from search_inventory. | |
| buyer_state | No | Shopper's two-letter state; sets the tax and fee state. Defaults to the selling store's state, or the state of buyer_zip. States outside the 8 covered return a low-confidence estimate without tax and government fees. | |
| lender_name | No | Lender holding the trade-in loan (optional, not stored). | |
| trade_value | No | Trade-in allowance in USD offered or expected for the shopper's car. | |
| buyer_county | No | Shopper's county name without the word County, e.g. Harris, Cook, Orange. Improves local tax lines. | |
| plate_transfer | No | True to transfer existing plates where the state allows it. | |
| registration_state | No | State where the car will be registered, if different from buyer_state. | |
| vehicle_weight_lbs | No | Vehicle weight, used by weight-based registration fees. | |
| eligible_incentive_labels | No | label_raw values of conditional incentives from get_price_breakdown that the shopper qualifies for (case-insensitive). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so: it discloses that every line has a source and confidence, that unknowns become ranges, that payments is null, that states outside the 8 covered return a low-confidence estimate without tax and government fees, and that inputs are not stored. It also sets accuracy expectations ('not an offer, not a quote, not penny-accurate').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: the core purpose, the covered scope, and the produced lines come first, followed by output-field guidance and alternative routing. Every sentence carries information, though the middle section on output fields is packed tightly and could be marginally streamlined.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with no annotations and no output schema, the description covers purpose, inputs' effect (trade-in, buyer location), return structure (itemized lines, sources, confidence, ranges, warnings, payments null, tax_location.resolution), limitations, and routing to siblings. Nothing essential for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 13 parameters, including field-level notes like buyer_zip resolving state/county/city. The description adds little parameter-level detail beyond clarifying trade-in handling (negative equity added, balance due after trade), which is mainly output semantics. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: an itemized out-the-door estimate for ONE listing, scoped to the buyer's state, county and city, for the 8 covered states. It enumerates the cost lines it produces and explicitly distinguishes itself from get_price_breakdown (price/fees only) and get_payment_estimate (monthly payment). An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names alternatives and the exact conditions that select them: 'Use get_price_breakdown instead for only the dealer's listed price and fees, and get_payment_estimate to turn this total into a monthly finance payment.' It also tells the agent to read warnings and explains the trade-in case where the total becomes the balance due.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dealerBInspect
Fictional dealer profile: registry entity, stores (selling locations) with fictional addresses and 555 phone numbers, group, state rules and a page of inventory. Not a real business; do not tell anyone to call or visit.
| Name | Required | Description | Default |
|---|---|---|---|
| dealer_key | Yes | Dealer key from list_dealers or a search result, e.g. bluebonnetridge. | |
| inventory_limit | No | Inventory rows to include. | |
| inventory_offset | No | Paging offset for inventory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It valuably discloses that the data is fictional and warns against telling users to call or visit (555 numbers), and it notes inventory is paged. It does not disclose auth requirements, error behavior, or rate limits, so gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single tight sentence listing the returned entities, with no wasted words. The important safety warning lands at the end rather than being front-loaded, but the overall size is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description usefully enumerates what a returned dealer profile contains, which is exactly the compensating detail needed. The remaining gap is usage/routing guidance, which the description leaves to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters, including the dealer_key source and the inventory limit/offset semantics. The description only loosely echoes paging via 'a page of inventory' and adds no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (dealer profile) and enumerates its contents — registry entity, stores with addresses and 555 numbers, group, state rules, and an inventory page — so an agent can tell it apart from the list-style siblings. It lacks an explicit retrieval verb, but the content scope is clear and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use guidance and never mentions the sibling alternatives (list_dealers to find the key, search_inventory for inventory queries). The only routing hint lives in the schema's dealer_key description, not in the tool description itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listingAInspect
Full synthetic listing record with per-value provenance (method 'synthetic'). listing_id is dealer_key:VIN (as returned by search_inventory) or the urn. The vehicle-to-store link is in listing.selling_location (link_status, selling_location_id, candidates, flags such as group_site_lists_sister_store or multi_store_unstated); the dealer block is the advertising dealer. For price and fees in a compact form, use get_price_breakdown.
| Name | Required | Description | Default |
|---|---|---|---|
| listing_id | Yes | dealer_key:VIN from search_inventory, or the listing urn. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does useful work: it discloses that records are synthetic (method 'synthetic') with per-value provenance, and explains what listing.selling_location contains (link_status, selling_location_id, candidates, flags like group_site_lists_sister_store/multi_store_unstated). It omits error/missing-listing behavior and any auth or rate-limit context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads what the record is and its provenance, and every following clause adds concrete field-level information rather than filler. It is dense with nested parentheticals, which costs some readability but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the record's key sub-structures (selling_location link, dealer block) and routing price/fee questions elsewhere. It still leaves the overall response shape and failure modes unstated, so it is strong but not exhaustive for a record-retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is fully documented there. The description restates the same listing_id format (dealer_key:VIN or urn) without adding syntax, validation, or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and scope: a full synthetic listing record with per-value provenance, retrieved by listing_id. It distinguishes itself from get_price_breakdown (compact price/fees) and anchors listing_id to search_inventory, so an agent can tell it apart from its siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names one alternative with an explicit selecting condition ('For price and fees in a compact form, use get_price_breakdown') and implies the upstream flow via 'as returned by search_inventory'. It does not state when this tool is the wrong choice beyond price lookups, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mediaAInspect
Media block for a listing: self-generated SVG placeholder images labeled DEMO (photo, video poster, spin), with rights notes. They are not photos of a real car. No video or 360 viewer exists in the demo.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum items, 0 to 100. | |
| types | No | Filter by item type: photo, video (poster image only) or spin_exterior. | |
| listing_id | Yes | dealer_key:VIN from search_inventory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose substantive behavioral context: the media are self-generated SVG placeholders labeled DEMO, are not real car photos, and no video or 360 viewer exists. That is genuinely useful for an agent to avoid misinterpreting results. It remains silent on auth, rate limits, and pagination behavior, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences front-load the resource identity, with the DEMO caveats following. The phrasing is slightly dense, but every clause carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a sideless read tool with no output schema and no annotations, the description covers what the payload contains and flags its synthetic nature, which is the key risk an agent needs to know. Minor gaps remain around result volume and ordering, but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented, including the limit range and type filter values. The description's mention of photo/video/spin echoes the types enum without adding syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource clearly ('Media block for a listing') and enumerates what it contains (photo, video poster, spin, rights notes), which cleanly separates it from siblings like get_listing and get_dealer. The retrieval verb is only implicit in the fragment phrasing, but the resource and scope are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the listing_id format ('dealer_key:VIN from search_inventory') hints at the calling sequence, but there is no explicit when-to-use statement, no exclusions, and no comparison against alternatives such as get_listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_new_matchesBInspect
DEMO. New cars that started matching a saved search after it was saved (or after since).
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Optional ISO 8601 time; only matches after it (use checked_at from your last call). | |
| search_id | Yes | search_id from save_search. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden. It does disclose one genuinely useful behavioral trait the schema cannot: results are a delta of cars that *started* matching after the save/since point, so already-known matches are not re-returned. It says nothing about read-only safety, empty-result behavior, result ordering, or what 'DEMO' implies about data fidelity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single economical sentence with the scoping condition front-loaded, no filler. The unexplained 'DEMO.' prefix consumes the most prominent position without telling the agent what it means.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No annotations and no output schema, so the description is the only place to learn the return shape, pagination/limits, and whether search_id must come from save_search — none of which it covers. For a tool with zero structured behavioral metadata, one sentence is too thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented there, including the checked_at idiom for `since`. The description only restates '(or after `since`)' without adding format or boundary semantics (inclusive/exclusive, timezone), so it stays at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The clause 'New cars that started matching a saved search after it was saved' names a specific resource (new matches for a saved search) and a precise temporal scope, which distinguishes it from search_inventory (general browsing) and save_search (creation). The weak point is that the verb is only implied by the tool name and the leading 'DEMO.' is unexplained.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this rather than search_inventory or save_search, and no prerequisites (e.g. 'requires a prior save_search'). Polling intent is only inferable from the phrase 'or after `since`', and the more actionable hint ('use checked_at from your last call') lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ontologyAInspect
Schema links, schema version, covered states, condition values, search sorts and the value-wrapper format ({v, m, c, src}). For the list of filterable fields and allowed values, use list_searchable_fields.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the return content and even the value-wrapper shape ({v, m, c, src}), which helps an agent decode results. However, it never states that this is a read-only/no-side-effect metadata call, nor any auth or caching/rate-limit behavior, leaving basic behavioral facts to inference.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the sibling routing clause is placed at the end where it belongs. The first sentence is a bare noun-list fragment rather than a full sentence, which slightly hurts readability but not density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey what comes back, and it does so at a high level (schema version, states, condition values, sorts, wrapper format). Enough for an agent to know when this returns the information it needs, though the specifics of each item remain unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description appropriately adds no parameter discussion and none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description enumerates the specific metadata the tool returns (schema links, schema version, covered states, condition values, search sorts, value-wrapper format), which is enough to identify it as a schema/ontology introspection tool. It clearly distinguishes itself from list_searchable_fields by naming it as the sibling to use for filterable fields. It falls short of a crisp verb+resource statement, reading as a list of return contents rather than 'returns the data model ontology'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent away for one case: 'For the list of filterable fields and allowed values, use list_searchable_fields.' That is a concrete alternative with the condition that selects it. It gives no explicit when-to-use guidance for the tool itself beyond implying it is for reading schema metadata.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payment_estimateAInspect
Use this to answer 'what would my monthly payment be' for ONE listing. It runs the same itemized out-the-door calculation as estimate_out_the_door (always treated as financed) and turns it into a DEMO monthly finance payment: out-the-door total minus down payment and trade equity, amortized at the APR (or a demo APR by credit_tier) over term_months. Returns finance.estimated_monthly_payment rounded to $5 with monthly_payment_unrounded, monthly_payment_range (rounded outward, so it always contains the unrounded value), financing_eligibility (demo lender rules: minimum amount financed, max term by vehicle age and mileage, with flags), amount_financed_estimate, total_of_payments, finance_charge and every assumption, plus the out-the-door figure it used, a one-line assumptions_summary and any dealer-advertised payment shown separately (not comparable unless the terms match). Totals: total_cost_including_trade_equity (PRIMARY: cash down plus payments plus net trade equity given up) and cash_outlay_excluding_trade_equity (cash down plus payments); total_cost_estimate is a deprecated alias of the latter, kept for one version. For ONE set of terms only: to compare two or more down, term, trade or credit options, call compare_payment_scenarios once instead of calling this tool repeatedly. Use get_price_breakdown instead for the dealer's listed price and fees only, and estimate_out_the_door for the full itemized total without a payment. To find cars by payment across many listings, use search_inventory with max_monthly_payment (canonical; payment_max is a deprecated alias). Estimate, not an offer; dealer sets price, lender sets rate. Not penny-accurate. Leases are not modeled.
| Name | Required | Description | Default |
|---|---|---|---|
| apr | No | APR percent, 0 to 36. If omitted, a demo APR is picked by credit_tier. | |
| payoff | No | Loan payoff owed on the trade-in, USD (negative equity is added to the amount financed). | |
| buyer_zip | No | Buyer's five-digit ZIP. Alone it resolves buyer state, county and city (echoed in tax_location.resolution with the source). | |
| buyer_city | No | Buyer's city, for local tax lines. | |
| listing_id | Yes | dealer_key:VIN from search_inventory. | |
| buyer_state | No | Buyer's two-letter state for tax and fees. Default: the selling store's state, or the state of buyer_zip. | |
| credit_tier | No | excellent, good (default), fair or poor. Picks the demo APR when apr is omitted (used and cpo rates are higher than new). | |
| term_months | No | Loan term in months, 12 to 96. Default 60. | |
| trade_value | No | Trade-in allowance in USD. Passed to the out-the-door step, so it gets the state's trade-in tax credit where allowed. | |
| buyer_county | No | Buyer's county without 'County', for local tax lines. | |
| down_payment | No | Cash down in USD, subtracted from the out-the-door total. Default 0. | |
| trade_equity | No | Net trade equity in USD when allowance and payoff are unknown (negative if upside down). Subtracted after tax, so no trade-in tax credit is applied. | |
| eligible_incentive_labels | No | label_raw values of conditional incentives from get_price_breakdown that the buyer qualifies for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the description discloses the calculation path, demo APR behavior by credit_tier, $5 rounding and range semantics, demo lender eligibility flags, assumptions, deprecated aliases, and the 'estimate, not offer' limitation. This is strong behavioral disclosure for a tool without annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and routing guidance are front-loaded, and the length is justified by the complex calculation and lack of an output schema. The second sentence is dense, but most details earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description still explains return fields, assumptions, total-cost metrics, a deprecated alias, and key limitations such as leases not being modeled. It gives an agent enough context to invoke and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 13 parameters are already documented in the schema. The description adds useful context about parameter interaction—down payment and trade equity reduce the financed amount, APR or demo APR is selected by credit_tier—but this is largely redundant with the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the exact user question and resource: 'what would my monthly payment be' for ONE listing. It clearly distinguishes the tool from estimate_out_the_door, get_price_breakdown, compare_payment_scenarios, and search_inventory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly limits use to ONE set of terms and directs agents to compare_payment_scenarios for multiple down, term, trade, or credit options. It also names alternatives for dealer price/fees, out-the-door totals without payment, and finding cars by payment across listings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_price_breakdownAInspect
Use this to see what the dealer LISTS for ONE listing, as published: headline price, MSRP (new cars), price_components, dealer fees (doc fee and others) and fee bundles (parts marked part_of_bundle, not double counted), flags such as whether the advertised price already includes fees, options, incentives split into all_buyer (already in the price) and conditional (not in the price), and the state's public tax and fee RULES with data-flag checks. It takes no buyer inputs and computes no tax amounts or total. Use estimate_out_the_door next for the buyer's total with tax, title, registration and fees, and get_payment_estimate for a monthly payment. Pass conditional incentive label_raw values to those tools as eligible_incentive_labels only if the shopper qualifies. A dealer-advertised monthly payment, when present, is a price_components item of type payment_quote: dealer ad text, not a calculation. Each price_component has a plain label, source_text and method_text; fees and incentives carry tax_treatment (taxable or reduces_taxable_amount, whether it is inside the advertised price, and why).
| Name | Required | Description | Default |
|---|---|---|---|
| listing_id | Yes | dealer_key:VIN from search_inventory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it states that the tool takes no buyer inputs, computes no tax amounts or total, and that a dealer-advertised monthly payment is ad text rather than a calculation. It also describes output structure details such as price_component labels, source_text, method_text, and tax_treatment metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary purpose and remains dense with useful details rather than filler. It is somewhat long and clause-heavy, but the length is justified by the complexity of the output and the need to route the agent to adjacent tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema and annotations, the description is complete enough for an agent to call the tool correctly. It explains the returned price components, fee and incentive treatment, tax-rule checks, and the distinction between published ad text and calculated amounts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% description coverage for listing_id, including its dealer_key:VIN format from search_inventory. The description reinforces that the tool operates on ONE listing but does not add new syntax or meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: seeing what the dealer lists for ONE listing as published, including headline price, MSRP, fees, incentives, and tax/fee rules. It clearly distinguishes this tool from estimate_out_the_door and get_payment_estimate by naming those siblings and describing their different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool to see the dealer's published listing breakdown, then directs the agent to use estimate_out_the_door next for the buyer's total and get_payment_estimate for a monthly payment. It also explains conditional incentive handling, including passing label_raw values only if the shopper qualifies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trade_in_scenariosAInspect
Ready-made demo trade-in scenarios (one per state) with trade_value and payoff to pass to estimate_out_the_door or get_payment_estimate.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the transparency burden and does disclose a key behavioral trait: the data is 'ready-made demo' (pre-canned, not live inventory), plus the shape of the returned fields. It does not explicitly state side-effect-free/read-only behavior, but for a parameterless catalog getter the residual risk is low.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the resource and appends the intended consumers. Every clause earns its place; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, no-annotation, no-output-schema tool, the description tells the agent what the data is, that it is demo/pre-canned, and how to use it. There is no meaningful remaining gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description adds value by naming the fields the object will contain (trade_value, payoff), which is not parameter information but does orient the caller.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (ready-made demo trade-in scenarios) and its contents (trade_value, payoff, one per state), which is well beyond a tautology. It also distinguishes itself implicitly from siblings by naming the two tools its output feeds, though the term 'state' is left ambiguous (US state vs. status).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States clear downstream context: the returned values are meant to be passed to estimate_out_the_door or get_payment_estimate. There are no alternatives to choose from and no exclusions stated, but the usage path is unambiguous for a zero-parameter helper.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dealersBInspect
All 20 fictional demo dealers with group and store counts (each dealer lists its stores with group_id, region_id and store_id), the dealer hierarchy (Group, then Region, then Store), the 4 fictional dealer groups and a coverage summary: which metros have demo stores, with dealer, store and new/used listing counts per metro.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that this is a fixed fictional/demo dataset (20 dealers, 4 groups), which tells the agent the data is static and pre-seeded. It does not state that it is a read-only operation or mention any auth or rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence that front-loads the core resource ('All 20 fictional demo dealers') before the detail. It is information-rich but slightly sprawling with nested parentheticals; no wasted sentences, though the structure could be broken up.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must describe returns, and it does so thoroughly: dealers, stores, hierarchy, groups and per-metro coverage counts. The main gap is the relationship to get_dealer and any scoping/pagination behavior for an agent choosing between the two.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to clarify beyond the schema. Baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names a specific verb+resource (listing dealers) and precisely enumerates what the response covers: the 20 demo dealers, their stores with group_id/region_id/store_id, the Group→Region→Store hierarchy, the 4 dealer groups, and a metro coverage summary. It does not, however, distinguish itself from the sibling get_dealer, so an agent must infer the list-vs-single distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of when to prefer get_dealer over this tool, and no note on whether results are paginated or filterable. Usage is only implied by the tool's verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_searchable_fieldsAInspect
Every filterable ontology field (vehicle, listing, store, dealer, price, fee, incentive, media, payment) with its type, range or allowed values, shortcut names, the operators (eq, any_of, contains, range, bool, exists, negate) and example filters for search_inventory. The full compact list is about 30 KB, so narrow it with prefix or query.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Only fields whose name or description contains this text, e.g. fee, color, payment. | |
| detail | No | compact (default): type, range or up to 12 values. full: up to 40 allowed values, examples and counts; use it with prefix or query. | compact |
| prefix | No | Only fields starting with this, e.g. canonical, price_summary, incentives, store, dealer_profile, media_block, derived, payment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose a key behavioral trait: the full compact list is about 30 KB, warning the agent of a large payload and prompting it to scope. It doesn't cover caching or whether output is static, but the size disclosure is genuinely useful and not derivable from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no waste, and the enumeration of content comes first followed by the size warning and the remedy. Front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must characterize the return value, and it does (fields with types, ranges, operators, example filters plus the 30 KB size). For a read-only introspection tool with no annotations, this is nearly complete, only missing minor notes on freshness/static nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents query, detail, and prefix with examples. The description's 'narrow it with prefix or query' largely restates that, so baseline 3 is appropriate with little added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Every filterable ontology field') and enumerates exactly what is returned (type, range/allowed values, shortcut names, operators, example filters). It ties the resource to its consumer ('for search_inventory'), which differentiates it from the adjacent get_ontology sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives practical usage advice on how to call it ('narrow it with prefix or query'), which is real guidance. However, it never states when to reach for this vs. get_ontology or the other introspection siblings, so the when-to-use-vs-alternative decision is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_dealer_handoffAInspect
Use this when the shopper has picked a car and a deal structure and wants to take it to the dealer. Builds a structured dealer handoff package for ONE configured deal: vehicle and VIN, the full itemized out-the-door estimate (with excluded items such as optional add-ons), the chosen financing scenario with demo financing eligibility, trade and negative-equity details (loan-to-value), all warnings, the assistant name and session reference, a timestamp (UTC and America/Chicago) and an estimate-not-offer disclaimer. Returns the package as JSON plus a ready-to-send email body (email.subject, email.text, email.html) with no recipient filled in. THIS TOOL SENDS NOTHING and contacts no one: delivery.status is not_sent, and delivery happens later, with the shopper's consent, through the dealer's chosen channel (email, desking or F&I). No dealer email is invented; dealer.handoff_contact is null until the dealer provides one. On synthetic data the package is labeled DEMO. Before calling, ask the shopper for a phone number or email for the dealer (with their OK); the call fails without a phone, email, or a name plus preferred_contact. The deal (date, shopper name and contact, car, payment, status) is saved to the store's dealer dashboard, where only that store, its region and group can see the contact info and address. Optional extras the dealer will use: trade_details (VIN, miles, plate, color, who the loan is with and how much), buyer_address (with county, for tax and registration), financing_details (deposit, cash down and rebates as separate lines, and any lender pre-approval the shopper already has) and add_on_interest (yes, no or unsure for service contract, GAP, maintenance, other; never priced). The email has a deal sheet in buyer's order line order including the store's dealer fees. NEVER ask the shopper for a Social Security number (or any part of one), date of birth or income; the tool rejects them. Leases, add-on pricing and payment dates are left to the dealer.
| Name | Required | Description | Default |
|---|---|---|---|
| vin | No | 17-character VIN, if listing_id is not known. Rejected if several dealers list it. | |
| payoff | No | Loan payoff owed on the trade-in, USD. | |
| scenario | No | The financing scenario the shopper chose, same shape as one compare_payment_scenarios scenario (down_payment, term_months, credit_tier or apr, trade fields, or cash=true). Default: $0 down, 60 months, good credit. | |
| assistant | No | Optional assistant reference: name, session_ref, contact. | |
| buyer_zip | No | Buyer's five-digit ZIP; alone it resolves state, county and city. | |
| buyer_city | No | Buyer's city. | |
| listing_id | No | dealer_key:VIN from search_inventory. Either this or vin is required. | |
| buyer_state | No | Buyer's two-letter state. | |
| trade_value | No | Trade-in allowance in USD (used when the scenario does not set it). | |
| buyer_county | No | Buyer's county without 'County'. | |
| trade_equity | No | Net trade equity if allowance and payoff are unknown (no tax credit). | |
| buyer_address | No | Optional shopper address (street, city, state, zip, county), with their OK. Sets tax and registration; visible only to the deal's store, region and group. | |
| trade_details | No | Optional trade-in details from the shopper: year, make, model, trim, vin, odometer, plate, plate_state, color, payoff_lender, payoff_amount. | |
| trade_vehicle | No | Short description of the trade, e.g. '2021 Ford F-150 XLT, 48k mi'. | |
| add_on_interest | No | Optional: is the shopper interested in service_contract, gap, maintenance, other (yes, no or unsure)? No prices; the dealer covers these. | |
| shopper_contact | No | REQUIRED. Ask the shopper how the dealer should reach them, and share only with their OK: name, phone and/or email, preferred_contact (call, text or email), notes. Needs a phone or email, or a name plus preferred_contact. | |
| financing_details | No | Optional separate deposit, cash_down and rebates (they add up to the down payment), plus pre_approval (has_pre_approval, lender_name, approved_amount, rate_percent; the rate is used for the payment unless scenario.apr is set). NEVER ask for a Social Security number or any part of one, date of birth or income. | |
| eligible_incentive_labels | No | Conditional incentive label_raw values the shopper qualifies for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it states THIS TOOL SENDS NOTHING, that delivery.status is not_sent, that no dealer email is invented (dealer.handoff_contact is null), that synthetic data is labeled DEMO, and that the deal is persisted to a dashboard scoped to store/region/group. It also declares the hard failure condition (no phone, email, or name plus preferred_contact) and that SSN/DOB/income inputs are rejected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The trigger condition is front-loaded, followed by contents, then the no-send guarantee, then prerequisites and optional extras — a sensible order for a complex 18-param tool. It is long and has some repetition (the no-price rule for add-ons appears twice), so it is efficient rather than tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe returns, and it does: the JSON package contents plus email.subject/email.text/email.html with no recipient. It also covers prerequisites, privacy scoping, persistence side effects and the DEMO labeling, which is everything an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by grouping parameters into meaningful blocks (optional extras the dealer will use: trade_details, buyer_address, financing_details, add_on_interest) and by stating the practical constraint on shopper_contact. It adds policy-level meaning the schema cannot express, notably that financing lines are separate and that add-on interest is never priced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb (builds a handoff package) and resource (structured dealer handoff package for ONE configured deal), and the body enumerates exactly what the artifact contains. It is clearly distinguishable from the pricing siblings (estimate_out_the_door, compare_payment_scenarios) because the package is an assembled deliverable, not a calculator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when the shopper has picked a car and a deal structure and wants to take it to the dealer" gives a clear triggering condition, and scope exclusions are stated (leases, add-on pricing and payment dates are left to the dealer). It does not explicitly name which sibling produces the upstream deal structure or when to prefer a lesser tool, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_agentAInspect
Optional and free. Registers your agent and returns an agent key (shown once) that gives it a durable, anonymous id in Moonshot Lab's bot analytics. Send it as the X-MoonshotLab-Agent-Key header, or add ?agent_key= to the MCP URL. Nothing else changes: anonymous use keeps working, limits are the same, and no personal data is collected. Dealers only ever see aggregate demand by platform name.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Optional: platform it runs on, e.g. ChatGPT, Claude, custom. | |
| agent_name | No | Optional: your agent or product name (no personal data). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses that the key is shown once, exactly how to transmit it (X-MoonshotLab-Agent-Key header or ?agent_key= query param), that limits and anonymous access are unchanged, that no personal data is collected, and what downstream parties see.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The most decision-relevant facts ('Optional and free', key shown once) are front-loaded, and the operational details follow in a logical order. It runs slightly long with the dealer-visibility sentence, but nothing is genuinely redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly explains the return value (a one-time-shown agent key) and how to use it. For a two-optional-parameter, no-side-effect tool, an agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already documented there with their optionality and examples. The description adds only indirect color (no personal data collected, platform appears only in aggregate), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (registers) and resource (your agent) and names the concrete artifact produced (an agent key). It is trivially distinguishable from every sibling, which are all read/estimation tools for dealer and inventory data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly framed as optional and free, and clarifies that anonymous use keeps working, which tells the agent it can skip this without penalty. It does not need to route to an alternative tool, but it stops short of stating a positive condition for when registration is worth doing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_searchAInspect
DEMO. Save a car search and get alerted when new cars match. Returns a search_id (keep it; it is the only way to read or cancel the search) and an expiry (default 30 days, renewable). Check for new cars with get_new_matches, or give a callback_url. Shopper email alerts are optional and need explicit consent. On this demo, email sending is switched off (alerts are logged, not sent) and new arrivals are simulated.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | Shopper's five-digit ZIP, the center of the search area. | |
| make | No | Make, e.g. Toyota. | |
| trim | No | Trim. | |
| model | No | Model, e.g. RAV4. | |
| state | No | Two-letter state of the selling store. | |
| year_max | No | Newest model year. | |
| year_min | No | Oldest model year. | |
| condition | No | new, used or cpo. | |
| fuel_type | No | e.g. gasoline, hybrid, electric. | |
| price_max | No | Highest advertised price, USD. | |
| body_style | No | e.g. suv, sedan, truck. | |
| drivetrain | No | e.g. awd, fwd. | |
| credit_tier | No | excellent, good, fair or poor, for the payment estimate. | |
| max_mileage | No | Most miles. | |
| term_months | No | Loan term for the payment estimate. | |
| callback_url | No | Optional HTTPS webhook for new matches. Public addresses only; HMAC-signed (X-MoonshotLab-Signature: t=<unix>,v1=<hex HMAC-SHA256 of '<t>.<body>'>). | |
| down_payment | No | Down payment used for the payment estimate, USD. | |
| radius_miles | No | Miles from zip (needs zip). | |
| email_consent | No | true only if the shopper explicitly agreed to alert emails. | |
| shopper_email | No | Optional: shopper's email for alert emails. Only with email_consent=true after the shopper agreed. Every email has a one-click unsubscribe. | |
| expires_in_days | No | Days until the search ends (default 30, max 90). Renew any time. | |
| renew_search_id | No | Pass an existing search_id to renew it instead of saving a new one. | |
| max_monthly_payment | No | Highest estimated monthly payment, USD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden and does well: it warns that the returned search_id is the only handle for reading or cancelling, states the default 30-day expiry and renewability, and flags demo-mode behavior (emails logged not sent, arrivals simulated). It does not say whether repeated saves with the same filters create duplicates, or that saving may require prior registration via register_agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, and each following sentence adds a distinct operational fact (return handle, expiry, alternatives, consent, demo caveat) with no filler. The single dense paragraph could be broken into return/usage/demo segments for faster scanning, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-parameter, zero-required tool with no annotations and no output schema, the description covers the essentials: what is created, what comes back (search_id, expiry), how to consume matches, and the demo-mode caveat. It falls short of complete because it never states what makes a valid search given that every filter is optional, nor how it composes with register_agent or prepare_dealer_handoff.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds real meaning beyond it: it explains the lifetime semantics of expiry (default 30 days, renewable), the purpose of callback_url as an alternative to polling, and the consent precondition on email. It still leaves the 23 optional filters unexplained as a group, so an agent gets no hint about which combination forms a valid search (e.g. radius_miles needing zip).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Save a car search and get alerted when new cars match') and names the follow-up sibling get_new_matches. It also clarifies the relationship to cancel_search via the search_id ('the only way to read or cancel the search'), so an agent can place it in the workflow without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage conditions: use get_new_matches to poll for new cars, or supply a callback_url for push; pass renew_search_id to extend an existing search rather than creating a new one; email alerts only with explicit consent. It never mentions search_inventory as the alternative for a one-off search, so the most likely sibling confusion is left unaddressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_inventoryAInspect
Search the SYNTHETIC demo inventory (about 860 fictional vehicles at 20 fictional dealers in TX, CA, FL, GA, AZ, IL, NY and OH). Results are not real vehicles for sale; say so when you show them. Each result has listing_id (dealer_key:VIN), vehicle basics, headline_price (before tax, title and fees), dealer_name, and selling_location: the store that holds the unit, with address and phone. link_status is linked, or ambiguous when the listing does not say which of the dealer's stores holds it (see selling_location_candidates). A unit can be held at a sister store run by another dealer in the same group; operated_by_dealer_id then differs from dealer_id. Matching is exact on vocabularies, so a total of 0 often means a wrong value: check the parameter descriptions, widen radius_miles or drop a filter; a zero total also returns hints. The named parameters are shortcuts. filters reaches every other attribute: for example {"field": "canonical.vin", "op": "eq", "value": ""} finds a VIN, {"field": "price_summary.doc_fee", "op": "range", "max": 300}, {"field": "incentives[].label_raw", "op": "eq", "value": "Military Appreciation"}. Payment search: payment_max / payment_min filter on a DEMO monthly finance estimate computed per listing from its itemized out-the-door estimate (tax, title, registration, dealer fees) for the buyer location, minus down payment and trade equity, at a demo APR by credit tier unless apr is given. Each result then has estimated_payment (rounded to $5, with a range) and dealer_advertised_payment when the listing shows one; the response has payment_assumptions and a one-line assumptions_summary to read back to the shopper. For 'under $300/month' pass max_monthly_payment=300. With a cap, near_misses lists up to 3 cars just above it, and a zero result returns to_reach_target (extra down payment, or a 72 or 84 month term). To compare scenarios for one car, use compare_payment_scenarios. Every result has estimated_out_the_door (exact, same as estimate_out_the_door for the buyer location), availability (status, price_valid_until, last_updated, observed_at), seating_capacity, third_row and cargo_capacity_cu_ft (synthetic demo specs). sort=best_value score = 0.35 * cost_score + 0.30 * age_score + 0.35 * mileage_score (formula in best_value_formula). A zero result with zip returns coverage: nearest_store, nearest_new_inventory and nearest_qualifying_inventory with distance, match count and lowest out the door, plus a coverage_note. estimated_out_the_door on results and near_misses carries the same warnings and excluded_items (for example an optional add-on's name and price) that estimate_out_the_door returns. Each result has group_id, region_id and store_id (dealer hierarchy; also filterable) and dealer_segment / dealer_type, third_row_type and sliding_doors. With payment inputs, estimated_payment has financing_eligibility, credit_tier and credit_tier_source (default when not given), negative_equity_rolled_in, loan_to_value_pct and warnings; the response has financing_summary. Pass financeable_only=true to drop listings the demo financing rules flag. Estimate, not an offer; dealer sets price, lender sets rate. Not penny-accurate.
| Name | Required | Description | Default |
|---|---|---|---|
| apr | No | APR percent for payment estimates. If omitted, a demo APR by credit_tier is used. | |
| zip | No | Five-digit US ZIP of the shopper. With radius_miles, filters by straight-line distance to the selling store and adds distance_miles to each result. | |
| city | No | Exact city of the selling store (for example Houston, Katy, Plano). Suburbs are separate cities, so for 'in or near a city' prefer zip plus radius_miles. | |
| make | No | Make, case-insensitive, e.g. Honda, Ford, Tesla. 14 makes are present. | |
| sort | No | price_asc (default), price_desc, year_desc, mileage_asc, distance_asc (needs zip), payment_asc, payment_desc, otd_asc (estimated out the door) or best_value (documented score over out-the-door cost, age and mileage; each result gets ranking_rationale). | price_asc |
| trim | No | Trim name, e.g. LX, EX-L, Lariat. | |
| limit | No | Results per page, 1 to 50. Each result is about 2 KB; 5 to 10 is usually enough. | |
| model | No | Model with its punctuation, case-insensitive: CR-V, F-150, Model 3, Mustang Mach-E. | |
| state | No | Two-letter code of the selling store's state: TX, CA, FL, GA, AZ, IL, NY or OH. Not the full name. | |
| offset | No | Paging offset. | |
| payoff | No | Loan payoff owed on the trade-in, USD. | |
| filters | No | Generic filters on ANY ontology field (vehicle, listing, store, dealer, price, fee, incentive, media, payment). All filters must match. See list_searchable_fields. | |
| group_id | No | Dealer group id (hierarchy: Group, then Region, then Store), e.g. meridian. See list_dealers. | |
| store_id | No | Store id, dealer_key plus store ZIP, e.g. bluebonnetridge-75201. | |
| year_max | No | Latest model year. | |
| year_min | No | Earliest model year. | |
| buyer_zip | No | Buyer's ZIP; fills any missing buyer state, county and city. If no buyer location is given, zip is used, then the selling store (see out_the_door_assumptions.buyer). | |
| condition | No | new, used or cpo (certified pre-owned). used also returns cpo units. | |
| fuel_type | No | gasoline, hybrid, plug_in_hybrid or electric. Use electric for EV or BEV. | |
| price_max | No | Maximum headline price in USD (before tax, title and dealer fees). For a budget that includes taxes and fees, check estimate_out_the_door. | |
| price_min | No | Minimum headline price in USD (before tax, title and dealer fees). | |
| region_id | No | Region inside a group, as group_id/region_id (e.g. meridian/dfw-metro) or a bare region id. | |
| scenarios | No | Optional what-if finance scenarios (up to 6). Each returned listing gets payment_scenarios with payment, amount financed, total interest and total cost per scenario. Filter and sort still use the main inputs. | |
| third_row | No | True for third row seating only, false to exclude it (synthetic demo spec). | |
| body_style | No | suv, sedan, pickup, hatchback, minivan or wagon. Use pickup for trucks. | |
| buyer_city | No | Buyer's city for payment tax lines. | |
| dealer_key | No | Dealer key from list_dealers, e.g. lonemesa. | |
| drivetrain | No | fwd, awd, rwd or 4wd. | |
| buyer_state | No | Buyer's two-letter state for payment tax and fees. Default: the selling store's state. | |
| credit_tier | No | excellent, good (default), fair or poor; picks the demo APR when apr is omitted. Credit tiers (demo APR new / used): excellent about 720 and up (6.0% / 8.5%); good about 660 to 719 (7.5% / 11.0%); fair about 620 to 659 (11.5% / 16.0%); poor below about 620 (15.5% / 20.0%). | |
| max_mileage | No | Maximum odometer miles. | |
| payment_max | No | DEPRECATED alias of max_monthly_payment (still accepted; the lower wins if both are given). | |
| payment_min | No | Minimum estimated monthly finance payment in USD (demo estimate). | |
| seating_min | No | Minimum seats, e.g. 7 for a third row family vehicle (synthetic demo spec). | |
| term_months | No | Loan term in months, 12 to 96. Default 60. | |
| trade_value | No | Trade-in allowance in USD (gets the trade-in tax credit where the state allows it). | |
| buyer_county | No | Buyer's county (without 'County') for payment tax lines. | |
| down_payment | No | Cash down in USD for payment estimates. Default 0. | |
| radius_miles | No | Radius in miles around zip. | |
| trade_equity | No | Net trade equity in USD if allowance and payoff are unknown (negative for upside-down); no tax credit is applied for it. | |
| sliding_doors | No | True for sliding rear doors (minivans). | |
| dealer_segment | No | franchise, independent_used or bhph (buy-here-pay-here). Each result shows dealer_segment and dealer_type. | |
| exterior_color | No | Exterior color family: white, black, silver, gray, blue, red, green or bronze. | |
| third_row_type | No | full (adult-usable, car-seat capable) or compact (small, occasional; e.g. Tiguan). Demo spec. | |
| include_payment | No | True to add estimated_payment to every result without filtering on it. | |
| best_value_needs | No | With sort=best_value, shopper needs that also score: seats, cargo, full_third_row, sliding_doors, low_mileage, newer, budget_headroom (needs max_out_the_door). Score = 0.70 x base + 0.30 x mean need score; ranking_rationale shows each part. | |
| financeable_only | No | True to drop listings whose payment estimate fails the demo financing rules (minimum amount financed, max term by age and mileage) at these terms. Recommended with max_monthly_payment; financing_summary counts what was dropped. | |
| max_out_the_door | No | Maximum estimated out-the-door total in USD for the buyer location (tax, title, registration, dealer fees, minus trade). Exact, unrounded, and the same figure estimate_out_the_door returns for the same inputs. | |
| min_out_the_door | No | Minimum estimated out-the-door total in USD (same basis as max_out_the_door). | |
| include_near_misses | No | With a payment cap, also return up to 3 listings within $25 above it in near_misses, flagged above_target. Default true. | |
| max_monthly_payment | No | Canonical monthly payment cap: the shopper's monthly budget in USD, e.g. 300 for 'under $300/month' (demo estimate). | |
| eligible_incentive_labels | No | label_raw values of conditional incentives the buyer says they qualify for; applied to payment estimates where a listing offers them. Off by default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: synthetic data (must be disclosed to the shopper), exact-match vocabulary semantics where 0 often means a wrong value, zero-result hints and zip-based coverage output, near_misses behavior, financeable_only dropping listings, payment assumption defaults, and the 'estimate, not an offer... not penny-accurate' caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is a dense run-on covering result fields, payments, coverage, financing and caveats with no headings or grouping. Nearly every clause carries information, yet the volume and lack of structure make it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 52-parameter tool with no output schema and no annotations, the description covers the data model, per-result fields, payment assumptions, zero-result and coverage behavior, and disclaimers. An agent has what it needs to invoke and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description still adds value: worked filters examples with dotted field paths, the payment_min/payment_max semantics tied to the demo out-the-door estimate, and the best_value score formula. This meaningfully supplements rather than repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: searching a synthetic demo inventory of ~860 fictional vehicles at 20 dealers across named states. It distinguishes its data universe from real listings and points to compare_payment_scenarios for the scenario-comparison sibling, so an agent can place it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives actionable routing: check parameter descriptions, widen radius_miles or drop a filter on a zero total, pass max_monthly_payment=300 for 'under $300/month', and use compare_payment_scenarios to compare one car's scenarios. It does not state when NOT to use this versus get_listing/estimate_out_the_door, so it stops short of full exclusion guidance.
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 tool update
- Changed
prepare_dealer_handoff1 field changed- changed
Input schema / $defs / FinancingDetails / properties / rebates / descriptionPrevious value: -"Rebates the shopper expects (applied like cash down)"New value: +"Rebates the shopper expects. Taken off the amount due, and off the taxed amount where the state allows it (not CA)"
1 tool update
- Changed
prepare_dealer_handoff9 fields changed- added
Input schema / $defs / AddOnInterestAdded value: +{ + "additionalProperties": false, + "description": "Is the shopper interested in these products? No prices: the dealer goes over them with the shopper.", + "properties": { + "gap": { + "anyOf": [ + { + "enum": [ + "yes", + "no", + "unsure" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Gap" + }, + "maintenance": { + "anyOf": [ + { + "enum": [ + "yes", + "no", + "unsure" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Maintenance" + }, + "other": { + "anyOf": [ + { + "enum": [ + "yes", + "no", + "unsure" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Other" + }, + "other_description": { + "anyOf": [ + { + "maxLength": 120, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Other Description" + }, + "service_contract": { + "anyOf": [ + { + "enum": [ + "yes", + "no", + "unsure" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Service contract or extended warranty", + "title": "Service Contract" + } + }, + "title": "AddOnInterest", + "type": "object" +} - added
Input schema / $defs / BuyerAddressAdded value: +{ + "additionalProperties": false, + "description": "Shopper's home address, shared with their OK. Used for tax and registration (county matters in Texas).\nSaved with the deal and visible only to that store, its region and group.", + "properties": { + "city": { + "anyOf": [ + { + "maxLength": 120, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "City" + }, + "county": { + "anyOf": [ + { + "maxLength": 120, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "County without 'County'", + "title": "County" + }, + "state": { + "anyOf": [ + { + "maxLength": 2, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "State" + }, + "street": { + "anyOf": [ + { + "maxLength": 160, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Street" + }, + "street2": { + "anyOf": [ + { + "maxLength": 80, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Street2" + }, + "zip": { + "anyOf": [ + { + "maxLength": 10, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Zip" + } + }, + "title": "BuyerAddress", + "type": "object" +} - added
Input schema / $defs / FinancingDetailsAdded value: +{ + "additionalProperties": false, + "description": "Money the shopper is putting toward the car, as separate lines. Together they are the down payment.", + "properties": { + "cash_down": { + "anyOf": [ + { + "maximum": 500000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Cash down at signing", + "title": "Cash Down" + }, + "deposit": { + "anyOf": [ + { + "maximum": 500000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Deposit already paid or to be paid to hold the car", + "title": "Deposit" + }, + "pre_approval": { + "anyOf": [ + { + "$ref": "#/$defs/PreApproval" + }, + { + "type": "null" + } + ], + "default": null + }, + "rebates": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Rebates the shopper expects (applied like cash down)", + "title": "Rebates" + } + }, + "title": "FinancingDetails", + "type": "object" +} - added
Input schema / $defs / PreApprovalAdded value: +{ + "additionalProperties": false, + "description": "Only what the shopper already knows from a lender. Never ask for a Social Security number, date of birth or income.", + "properties": { + "approved_amount": { + "anyOf": [ + { + "maximum": 500000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Approved Amount" + }, + "has_pre_approval": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Has Pre Approval" + }, + "lender_name": { + "anyOf": [ + { + "maxLength": 120, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Lender Name" + }, + "rate_percent": { + "anyOf": [ + { + "maximum": 40, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Rate Percent" + } + }, + "title": "PreApproval", + "type": "object" +} - added
Input schema / $defs / TradeDetailsAdded value: +{ + "additionalProperties": false, + "description": "Optional trade-in details the shopper gives. Every field is optional; skip what the shopper does not know.", + "properties": { + "color": { + "anyOf": [ + { + "maxLength": 60, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Color" + }, + "make": { + "anyOf": [ + { + "maxLength": 60, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Make" + }, + "model": { + "anyOf": [ + { + "maxLength": 60, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Model" + }, + "odometer": { + "anyOf": [ + { + "maximum": 999999, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Miles on the trade-in", + "title": "Odometer" + }, + "payoff_amount": { + "anyOf": [ + { + "maximum": 500000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "What the shopper still owes (same as payoff)", + "title": "Payoff Amount" + }, + "payoff_lender": { + "anyOf": [ + { + "maxLength": 120, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Who the trade-in loan is with", + "title": "Payoff Lender" + }, + "plate": { + "anyOf": [ + { + "maxLength": 12, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "License plate", + "title": "Plate" + }, + "plate_state": { + "anyOf": [ + { + "maxLength": 2, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Plate State" + }, + "trim": { + "anyOf": [ + { + "maxLength": 60, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Trim" + }, + "vin": { + "anyOf": [ + { + "maxLength": 20, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "17-character VIN of the trade-in", + "title": "Vin" + }, + "year": { + "anyOf": [ + { + "maximum": 2030, + "minimum": 1950, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Year" + } + }, + "title": "TradeDetails", + "type": "object" +} - added
Input schema / properties / add_on_interestAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/AddOnInterest" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional: is the shopper interested in service_contract, gap, maintenance, other (yes, no or unsure)? No prices; the dealer covers these." +} - added
Input schema / properties / buyer_addressAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/BuyerAddress" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional shopper address (street, city, state, zip, county), with their OK. Sets tax and registration; visible only to the deal's store, region and group." +} - added
Input schema / properties / financing_detailsAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/FinancingDetails" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional separate deposit, cash_down and rebates (they add up to the down payment), plus pre_approval (has_pre_approval, lender_name, approved_amount, rate_percent; the rate is used for the payment unless scenario.apr is set). NEVER ask for a Social Security number or any part of one, date of birth or income." +} - added
Input schema / properties / trade_detailsAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/TradeDetails" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional trade-in details from the shopper: year, make, model, trim, vin, odometer, plate, plate_state, color, payoff_lender, payoff_amount." +}
1 tool update
- Changed
prepare_dealer_handoff4 fields changed- changed
Input schema / $defs / HandoffContact / descriptionPrevious value: -"Shopper contact, shared only with the shopper's consent. Not stored."New value: +"How the dealer can reach the shopper. Ask the shopper first and share only with their OK. Give a phone or email, or at least a name plus preferred_contact." - added
Input schema / $defs / HandoffContact / properties / email / descriptionAdded value: +"Shopper email, e.g. name@example.com" - added
Input schema / $defs / HandoffContact / properties / phone / descriptionAdded value: +"Shopper US phone with area code, e.g. 214-555-0100" - changed
Input schema / properties / shopper_contact / descriptionPrevious value: -"Optional, only with the shopper's consent: name, email, phone, preferred_contact, notes."New value: +"REQUIRED. Ask the shopper how the dealer should reach them, and share only with their OK: name, phone and/or email, preferred_contact (call, text or email), notes. Needs a phone or email, or a name plus preferred_contact."
3 tool updates
- Added
cancel_search - Added
get_new_matches - Added
save_search
2 tool updates
- Added
register_agent - Changed
search_inventory3 fields changed- added
Input schema / properties / group_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Dealer group id (hierarchy: Group, then Region, then Store), e.g. meridian. See list_dealers.", + "title": "Group Id" +} - added
Input schema / properties / region_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Region inside a group, as group_id/region_id (e.g. meridian/dfw-metro) or a bare region id.", + "title": "Region Id" +} - added
Input schema / properties / store_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Store id, dealer_key plus store ZIP, e.g. bluebonnetridge-75201.", + "title": "Store Id" +}
1 tool update
- Added
prepare_dealer_handoff
2 tool updates
- Changed
compare_payment_scenarios1 field changed- added
Input schema / $defs / PaymentScenario / properties / cashAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "True to price paying cash: no loan or interest; omit apr, term_months, credit_tier and down_payment.", + "title": "Cash" +}
- Changed
search_inventory6 fields changed- added
Input schema / $defs / PaymentScenario / properties / cashAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "True to price paying cash: no loan or interest; omit apr, term_months, credit_tier and down_payment.", + "title": "Cash" +} - added
Input schema / properties / best_value_needsAdded value: +{ + "anyOf": [ + { + "items": { + "enum": [ + "seats", + "cargo", + "full_third_row", + "sliding_doors", + "low_mileage", + "newer", + "budget_headroom" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "With sort=best_value, shopper needs that also score: seats, cargo, full_third_row, sliding_doors, low_mileage, newer, budget_headroom (needs max_out_the_door). Score = 0.70 x base + 0.30 x mean need score; ranking_rationale shows each part.", + "title": "Best Value Needs" +} - added
Input schema / properties / dealer_segmentAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "franchise, independent_used or bhph (buy-here-pay-here). Each result shows dealer_segment and dealer_type.", + "title": "Dealer Segment" +} - added
Input schema / properties / financeable_onlyAdded value: +{ + "default": false, + "description": "True to drop listings whose payment estimate fails the demo financing rules (minimum amount financed, max term by age and mileage) at these terms. Recommended with max_monthly_payment; financing_summary counts what was dropped.", + "title": "Financeable Only", + "type": "boolean" +} - added
Input schema / properties / sliding_doorsAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "True for sliding rear doors (minivans).", + "title": "Sliding Doors" +} - added
Input schema / properties / third_row_typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "full (adult-usable, car-seat capable) or compact (small, occasional; e.g. Tiguan). Demo spec.", + "title": "Third Row Type" +}
4 tool updates
- Changed
compare_payment_scenarios1 field changed- changed
Input schema / properties / buyer_zip / descriptionPrevious value: -"Buyer's five-digit ZIP; sets state and city when buyer_state is omitted."New value: +"Buyer's five-digit ZIP. Alone it resolves buyer state, county and city (echoed in tax_location.resolution with the source)."
- Changed
estimate_out_the_door2 fields changed- changed
Input schema / properties / buyer_state / descriptionPrevious value: -"Shopper's two-letter state; sets the tax and fee state. Defaults to the selling store's state. A ZIP alone does not change it here. States outside the 8 covered return a low-confidence estimate without tax and government fees."New value: +"Shopper's two-letter state; sets the tax and fee state. Defaults to the selling store's state, or the state of buyer_zip. States outside the 8 covered return a low-confidence estimate without tax and government fees." - changed
Input schema / properties / buyer_zip / descriptionPrevious value: -"Shopper's five-digit ZIP, recorded with the location. Pass buyer_state and county or city as well; the ZIP alone does not set them in this tool."New value: +"Buyer's five-digit ZIP. Alone it resolves buyer state, county and city (echoed in tax_location.resolution with the source)."
- Changed
get_payment_estimate1 field changed- changed
Input schema / properties / buyer_zip / descriptionPrevious value: -"Buyer's five-digit ZIP. Here it sets buyer state and city when buyer_state is omitted."New value: +"Buyer's five-digit ZIP. Alone it resolves buyer state, county and city (echoed in tax_location.resolution with the source)."
- Changed
search_inventory8 fields changed- changed
Input schema / properties / buyer_zip / descriptionPrevious value: -"Buyer's ZIP; sets buyer state and city when buyer_state is omitted. If no buyer location is given, zip is used, then the selling store (see payment_assumptions.buyer.source)."New value: +"Buyer's ZIP; fills any missing buyer state, county and city. If no buyer location is given, zip is used, then the selling store (see out_the_door_assumptions.buyer)." - changed
Input schema / properties / max_monthly_payment / descriptionPrevious value: -"Same as payment_max: the shopper's monthly budget in USD, e.g. 300 for 'under $300/month'. The lower of the two wins if both are given."New value: +"Canonical monthly payment cap: the shopper's monthly budget in USD, e.g. 300 for 'under $300/month' (demo estimate)." - added
Input schema / properties / max_out_the_doorAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maximum estimated out-the-door total in USD for the buyer location (tax, title, registration, dealer fees, minus trade). Exact, unrounded, and the same figure estimate_out_the_door returns for the same inputs.", + "title": "Max Out The Door" +} - added
Input schema / properties / min_out_the_doorAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Minimum estimated out-the-door total in USD (same basis as max_out_the_door).", + "title": "Min Out The Door" +} - changed
Input schema / properties / payment_max / descriptionPrevious value: -"Maximum estimated monthly finance payment in USD (demo estimate), e.g. 450."New value: +"DEPRECATED alias of max_monthly_payment (still accepted; the lower wins if both are given)." - added
Input schema / properties / seating_minAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Minimum seats, e.g. 7 for a third row family vehicle (synthetic demo spec).", + "title": "Seating Min" +} - changed
Input schema / properties / sort / descriptionPrevious value: -"price_asc (default), price_desc, year_desc, mileage_asc, distance_asc (needs zip), payment_asc or payment_desc."New value: +"price_asc (default), price_desc, year_desc, mileage_asc, distance_asc (needs zip), payment_asc, payment_desc, otd_asc (estimated out the door) or best_value (documented score over out-the-door cost, age and mileage; each result gets ranking_rationale)." - added
Input schema / properties / third_rowAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "True for third row seating only, false to exclude it (synthetic demo spec).", + "title": "Third Row" +}
2 tool updates
- Changed
compare_payment_scenarios1 field changed- changed
Input schema / $defs / PaymentScenario / properties / credit_tier / descriptionPrevious value: -"Picks the demo APR when apr is omitted."New value: +"Picks the demo APR when apr is omitted. Credit tiers (demo APR new / used): excellent about 720 and up (6.0% / 8.5%); good about 660 to 719 (7.5% / 11.0%); fair about 620 to 659 (11.5% / 16.0%); poor below about 620 (15.5% / 20.0%)."
- Changed
search_inventory2 fields changed- changed
Input schema / $defs / PaymentScenario / properties / credit_tier / descriptionPrevious value: -"Picks the demo APR when apr is omitted."New value: +"Picks the demo APR when apr is omitted. Credit tiers (demo APR new / used): excellent about 720 and up (6.0% / 8.5%); good about 660 to 719 (7.5% / 11.0%); fair about 620 to 659 (11.5% / 16.0%); poor below about 620 (15.5% / 20.0%)." - changed
Input schema / properties / credit_tier / descriptionPrevious value: -"excellent, good (default), fair or poor; picks the demo APR when apr is omitted."New value: +"excellent, good (default), fair or poor; picks the demo APR when apr is omitted. Credit tiers (demo APR new / used): excellent about 720 and up (6.0% / 8.5%); good about 660 to 719 (7.5% / 11.0%); fair about 620 to 659 (11.5% / 16.0%); poor below about 620 (15.5% / 20.0%)."
2 tool updates
- Added
compare_payment_scenarios - Changed
search_inventory6 fields changed- added
Input schema / $defs / PaymentScenarioAdded value: +{ + "description": "One what-if finance scenario. Omitted fields use the call's defaults ($0 down, 60 months, good credit).", + "properties": { + "apr": { + "anyOf": [ + { + "maximum": 36, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "APR percent; overrides credit_tier.", + "title": "Apr" + }, + "credit_tier": { + "anyOf": [ + { + "enum": [ + "excellent", + "good", + "fair", + "poor" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Picks the demo APR when apr is omitted.", + "title": "Credit Tier" + }, + "down_payment": { + "anyOf": [ + { + "maximum": 500000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Cash down in USD.", + "title": "Down Payment" + }, + "eligible_incentive_labels": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "label_raw values of conditional incentives the buyer qualifies for.", + "title": "Eligible Incentive Labels" + }, + "name": { + "anyOf": [ + { + "maxLength": 60, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Short label, e.g. '3k down 72 mo'.", + "title": "Name" + }, + "payoff": { + "anyOf": [ + { + "maximum": 500000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Loan payoff owed on the trade-in, USD.", + "title": "Payoff" + }, + "term_months": { + "anyOf": [ + { + "maximum": 96, + "minimum": 12, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Loan term in months, 12 to 96.", + "title": "Term Months" + }, + "trade_equity": { + "anyOf": [ + { + "maximum": 500000, + "minimum": -500000, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Net trade equity if allowance and payoff are unknown; no tax credit.", + "title": "Trade Equity" + }, + "trade_value": { + "anyOf": [ + { + "maximum": 500000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Trade-in allowance in USD (gets the state's trade-in tax credit).", + "title": "Trade Value" + } + }, + "title": "PaymentScenario", + "type": "object" +} - changed
Input schema / properties / buyer_zip / descriptionPrevious value: -"Buyer's ZIP; sets buyer state and city when buyer_state is omitted."New value: +"Buyer's ZIP; sets buyer state and city when buyer_state is omitted. If no buyer location is given, zip is used, then the selling store (see payment_assumptions.buyer.source)." - added
Input schema / properties / eligible_incentive_labelsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "label_raw values of conditional incentives the buyer says they qualify for; applied to payment estimates where a listing offers them. Off by default.", + "title": "Eligible Incentive Labels" +} - added
Input schema / properties / include_near_missesAdded value: +{ + "default": true, + "description": "With a payment cap, also return up to 3 listings within $25 above it in near_misses, flagged above_target. Default true.", + "title": "Include Near Misses", + "type": "boolean" +} - added
Input schema / properties / max_monthly_paymentAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Same as payment_max: the shopper's monthly budget in USD, e.g. 300 for 'under $300/month'. The lower of the two wins if both are given.", + "title": "Max Monthly Payment" +} - added
Input schema / properties / scenariosAdded value: +{ + "anyOf": [ + { + "items": { + "$ref": "#/$defs/PaymentScenario" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional what-if finance scenarios (up to 6). Each returned listing gets payment_scenarios with payment, amount financed, total interest and total cost per scenario. Filter and sort still use the main inputs.", + "title": "Scenarios" +}
2 tool updates
- Changed
estimate_out_the_door4 fields changed- changed
Input schema / properties / buyer_city / descriptionPrevious value: -"Shopper's city, e.g. Chicago. Some city taxes depend on it."New value: +"Shopper's city, e.g. Chicago. Some city taxes depend on it; it can also imply the county." - changed
Input schema / properties / buyer_state / descriptionPrevious value: -"Shopper's two-letter state. Defaults to the selling store's state. Other states return a low-confidence estimate without tax and government fees."New value: +"Shopper's two-letter state; sets the tax and fee state. Defaults to the selling store's state. A ZIP alone does not change it here. States outside the 8 covered return a low-confidence estimate without tax and government fees." - changed
Input schema / properties / buyer_zip / descriptionPrevious value: -"Shopper's five-digit ZIP."New value: +"Shopper's five-digit ZIP, recorded with the location. Pass buyer_state and county or city as well; the ZIP alone does not set them in this tool." - changed
Input schema / properties / financed / descriptionPrevious value: -"True if the purchase will be financed (some fees and incentives depend on it)."New value: +"True if the purchase will be financed, false for cash. Some fees and incentives depend on it; if omitted they are flagged as uncertain."
- Changed
get_payment_estimate11 fields changed- changed
Input schema / properties / apr / descriptionPrevious value: -"APR percent. If omitted, a demo APR by credit_tier is used."New value: +"APR percent, 0 to 36. If omitted, a demo APR is picked by credit_tier." - changed
Input schema / properties / buyer_city / descriptionPrevious value: -"Buyer's city."New value: +"Buyer's city, for local tax lines." - changed
Input schema / properties / buyer_county / descriptionPrevious value: -"Buyer's county without 'County'."New value: +"Buyer's county without 'County', for local tax lines." - changed
Input schema / properties / buyer_state / descriptionPrevious value: -"Buyer's two-letter state. Default: the selling store's state."New value: +"Buyer's two-letter state for tax and fees. Default: the selling store's state, or the state of buyer_zip." - changed
Input schema / properties / buyer_zip / descriptionPrevious value: -"Buyer's five-digit ZIP; sets state and city when buyer_state is omitted."New value: +"Buyer's five-digit ZIP. Here it sets buyer state and city when buyer_state is omitted." - changed
Input schema / properties / credit_tier / descriptionPrevious value: -"excellent, good (default), fair or poor."New value: +"excellent, good (default), fair or poor. Picks the demo APR when apr is omitted (used and cpo rates are higher than new)." - changed
Input schema / properties / down_payment / descriptionPrevious value: -"Cash down in USD. Default 0."New value: +"Cash down in USD, subtracted from the out-the-door total. Default 0." - changed
Input schema / properties / eligible_incentive_labels / descriptionPrevious value: -"Conditional incentive label_raw values the buyer qualifies for."New value: +"label_raw values of conditional incentives from get_price_breakdown that the buyer qualifies for." - changed
Input schema / properties / payoff / descriptionPrevious value: -"Loan payoff owed on the trade-in, USD."New value: +"Loan payoff owed on the trade-in, USD (negative equity is added to the amount financed)." - changed
Input schema / properties / trade_equity / descriptionPrevious value: -"Net trade equity in USD when allowance and payoff are unknown; no tax credit applied."New value: +"Net trade equity in USD when allowance and payoff are unknown (negative if upside down). Subtracted after tax, so no trade-in tax credit is applied." - changed
Input schema / properties / trade_value / descriptionPrevious value: -"Trade-in allowance in USD."New value: +"Trade-in allowance in USD. Passed to the out-the-door step, so it gets the state's trade-in tax credit where allowed."
8 tool updates
- Changed
estimate_out_the_door13 fields changed- added
Input schema / properties / buyer_city / descriptionAdded value: +"Shopper's city, e.g. Chicago. Some city taxes depend on it." - added
Input schema / properties / buyer_county / descriptionAdded value: +"Shopper's county name without the word County, e.g. Harris, Cook, Orange. Improves local tax lines." - added
Input schema / properties / buyer_state / descriptionAdded value: +"Shopper's two-letter state. Defaults to the selling store's state. Other states return a low-confidence estimate without tax and government fees." - added
Input schema / properties / buyer_zip / descriptionAdded value: +"Shopper's five-digit ZIP." - added
Input schema / properties / eligible_incentive_labels / descriptionAdded value: +"label_raw values of conditional incentives from get_price_breakdown that the shopper qualifies for (case-insensitive)." - added
Input schema / properties / financed / descriptionAdded value: +"True if the purchase will be financed (some fees and incentives depend on it)." - added
Input schema / properties / lender_name / descriptionAdded value: +"Lender holding the trade-in loan (optional, not stored)." - added
Input schema / properties / listing_id / descriptionAdded value: +"dealer_key:VIN from search_inventory." - added
Input schema / properties / payoff / descriptionAdded value: +"Loan payoff in USD still owed on the trade-in." - added
Input schema / properties / plate_transfer / descriptionAdded value: +"True to transfer existing plates where the state allows it." - added
Input schema / properties / registration_state / descriptionAdded value: +"State where the car will be registered, if different from buyer_state." - added
Input schema / properties / trade_value / descriptionAdded value: +"Trade-in allowance in USD offered or expected for the shopper's car." - added
Input schema / properties / vehicle_weight_lbs / descriptionAdded value: +"Vehicle weight, used by weight-based registration fees."
- Changed
get_dealer3 fields changed- added
Input schema / properties / dealer_key / descriptionAdded value: +"Dealer key from list_dealers or a search result, e.g. bluebonnetridge." - added
Input schema / properties / inventory_limit / descriptionAdded value: +"Inventory rows to include." - added
Input schema / properties / inventory_offset / descriptionAdded value: +"Paging offset for inventory."
- Changed
get_listing1 field changed- added
Input schema / properties / listing_id / descriptionAdded value: +"dealer_key:VIN from search_inventory, or the listing urn."
- Changed
get_media3 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum items, 0 to 100." - added
Input schema / properties / listing_id / descriptionAdded value: +"dealer_key:VIN from search_inventory." - added
Input schema / properties / types / descriptionAdded value: +"Filter by item type: photo, video (poster image only) or spin_exterior."
- Added
get_payment_estimate - Changed
get_price_breakdown1 field changed- added
Input schema / properties / listing_id / descriptionAdded value: +"dealer_key:VIN from search_inventory."
- Added
list_searchable_fields - Changed
search_inventory37 fields changed- added
Input schema / $defsAdded value: +{ + "FieldFilter": { + "description": "One generic filter on any ontology field (see list_searchable_fields).", + "properties": { + "field": { + "description": "Dotted field path from list_searchable_fields, e.g. canonical.exterior_color.family, price_summary.doc_fee, incentives[].label_raw, store.name, payment.estimated_monthly. Shortcut names such as make, model, color, price, state also work.", + "title": "Field", + "type": "string" + }, + "max": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Upper bound for range (inclusive).", + "title": "Max" + }, + "min": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Lower bound for range (inclusive).", + "title": "Min" + }, + "negate": { + "default": false, + "description": "True to invert the filter.", + "title": "Negate", + "type": "boolean" + }, + "op": { + "default": "eq", + "description": "eq exact (case-insensitive text); any_of with values; contains (text substring); range with min and/or max (numbers or ISO dates, inclusive); bool with value true/false; exists.", + "enum": [ + "eq", + "any_of", + "contains", + "range", + "bool", + "exists" + ], + "title": "Op", + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "number" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Value for eq, contains, bool or exists.", + "title": "Value" + }, + "values": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Values for any_of.", + "title": "Values" + } + }, + "required": [ + "field" + ], + "title": "FieldFilter", + "type": "object" + } +} - added
Input schema / properties / aprAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "APR percent for payment estimates. If omitted, a demo APR by credit_tier is used.", + "title": "Apr" +} - added
Input schema / properties / body_style / descriptionAdded value: +"suv, sedan, pickup, hatchback, minivan or wagon. Use pickup for trucks." - added
Input schema / properties / buyer_cityAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Buyer's city for payment tax lines.", + "title": "Buyer City" +} - added
Input schema / properties / buyer_countyAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Buyer's county (without 'County') for payment tax lines.", + "title": "Buyer County" +} - added
Input schema / properties / buyer_stateAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Buyer's two-letter state for payment tax and fees. Default: the selling store's state.", + "title": "Buyer State" +} - added
Input schema / properties / buyer_zipAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Buyer's ZIP; sets buyer state and city when buyer_state is omitted.", + "title": "Buyer Zip" +} - added
Input schema / properties / city / descriptionAdded value: +"Exact city of the selling store (for example Houston, Katy, Plano). Suburbs are separate cities, so for 'in or near a city' prefer zip plus radius_miles." - added
Input schema / properties / condition / descriptionAdded value: +"new, used or cpo (certified pre-owned). used also returns cpo units." - added
Input schema / properties / credit_tierAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "excellent, good (default), fair or poor; picks the demo APR when apr is omitted.", + "title": "Credit Tier" +} - added
Input schema / properties / dealer_key / descriptionAdded value: +"Dealer key from list_dealers, e.g. lonemesa." - added
Input schema / properties / down_paymentAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Cash down in USD for payment estimates. Default 0.", + "title": "Down Payment" +} - added
Input schema / properties / drivetrain / descriptionAdded value: +"fwd, awd, rwd or 4wd." - added
Input schema / properties / exterior_colorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Exterior color family: white, black, silver, gray, blue, red, green or bronze.", + "title": "Exterior Color" +} - added
Input schema / properties / filtersAdded value: +{ + "anyOf": [ + { + "items": { + "$ref": "#/$defs/FieldFilter" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Generic filters on ANY ontology field (vehicle, listing, store, dealer, price, fee, incentive, media, payment). All filters must match. See list_searchable_fields.", + "title": "Filters" +} - added
Input schema / properties / fuel_type / descriptionAdded value: +"gasoline, hybrid, plug_in_hybrid or electric. Use electric for EV or BEV." - added
Input schema / properties / include_paymentAdded value: +{ + "default": false, + "description": "True to add estimated_payment to every result without filtering on it.", + "title": "Include Payment", + "type": "boolean" +} - added
Input schema / properties / limit / descriptionAdded value: +"Results per page, 1 to 50. Each result is about 2 KB; 5 to 10 is usually enough." - added
Input schema / properties / make / descriptionAdded value: +"Make, case-insensitive, e.g. Honda, Ford, Tesla. 14 makes are present." - added
Input schema / properties / max_mileage / descriptionAdded value: +"Maximum odometer miles." - added
Input schema / properties / model / descriptionAdded value: +"Model with its punctuation, case-insensitive: CR-V, F-150, Model 3, Mustang Mach-E." - added
Input schema / properties / offset / descriptionAdded value: +"Paging offset." - added
Input schema / properties / payment_maxAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maximum estimated monthly finance payment in USD (demo estimate), e.g. 450.", + "title": "Payment Max" +} - added
Input schema / properties / payment_minAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Minimum estimated monthly finance payment in USD (demo estimate).", + "title": "Payment Min" +} - added
Input schema / properties / payoffAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Loan payoff owed on the trade-in, USD.", + "title": "Payoff" +} - added
Input schema / properties / price_max / descriptionAdded value: +"Maximum headline price in USD (before tax, title and dealer fees). For a budget that includes taxes and fees, check estimate_out_the_door." - added
Input schema / properties / price_min / descriptionAdded value: +"Minimum headline price in USD (before tax, title and dealer fees)." - added
Input schema / properties / radius_miles / descriptionAdded value: +"Radius in miles around zip." - added
Input schema / properties / sort / descriptionAdded value: +"price_asc (default), price_desc, year_desc, mileage_asc, distance_asc (needs zip), payment_asc or payment_desc." - added
Input schema / properties / state / descriptionAdded value: +"Two-letter code of the selling store's state: TX, CA, FL, GA, AZ, IL, NY or OH. Not the full name." - added
Input schema / properties / term_monthsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Loan term in months, 12 to 96. Default 60.", + "title": "Term Months" +} - added
Input schema / properties / trade_equityAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Net trade equity in USD if allowance and payoff are unknown (negative for upside-down); no tax credit is applied for it.", + "title": "Trade Equity" +} - added
Input schema / properties / trade_valueAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Trade-in allowance in USD (gets the trade-in tax credit where the state allows it).", + "title": "Trade Value" +} - added
Input schema / properties / trim / descriptionAdded value: +"Trim name, e.g. LX, EX-L, Lariat." - added
Input schema / properties / year_max / descriptionAdded value: +"Latest model year." - added
Input schema / properties / year_min / descriptionAdded value: +"Earliest model year." - added
Input schema / properties / zip / descriptionAdded value: +"Five-digit US ZIP of the shopper. With radius_miles, filters by straight-line distance to the selling store and adds distance_miles to each result."
9 tool updates
- First observed
estimate_out_the_door - First observed
get_dealer - First observed
get_listing - First observed
get_media - First observed
get_ontology - First observed
get_price_breakdown - First observed
get_trade_in_scenarios - First observed
list_dealers - First observed
search_inventory
Related MCP Connectors
Automotive inventory search for AI assistants: vehicles, dealers, deals, and market data.
Live franchised-dealer inventory, quotes, and consented salesperson handoffs.
Search live US dealership inventory, get market prices, and send buyer inquiries. Free, no API key.
This server allows AI agents to search our catalogue of vehicles that are for sale throught affiliated dealerships. Information on the vehicle is provided by the dealership. We add information on financing options, both business and consumer, to this. Target audience for this service is The Netherlands.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to search and aggregate used-vehicle listings across Cars.com, Autotrader, and KBB, with filters for price, mileage, dealer information, and CARFAX-style history conditions.1MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to search live used-car inventory, verify whether asking prices are fair market value, estimate annual road tax and running costs, and initiate contact with sellers for the Portuguese market.645 npmMIT
- AlicenseBqualityDmaintenanceA Model Context Protocol server that provides discovery-first vehicle inventory search through the Stock API. Enables users to explore inventory with overviews, sample vehicles, and intelligent refinement suggestions.1MIT
- AlicenseAqualityCmaintenanceEnables users to search CarMax and Carvana inventory, retrieve vehicle details and sell/trade-in offers, and schedule CarMax test drives through automated browser workflows.8MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.