Skip to main content
Glama

prepare_dealer_handoff

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.

Input Schema

NameRequiredDescriptionDefault
vinNo17-character VIN, if listing_id is not known. Rejected if several dealers list it.
payoffNoLoan payoff owed on the trade-in, USD.
scenarioNoThe 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.
assistantNoOptional assistant reference: name, session_ref, contact.
buyer_zipNoBuyer's five-digit ZIP; alone it resolves state, county and city.
buyer_cityNoBuyer's city.
listing_idNodealer_key:VIN from search_inventory. Either this or vin is required.
buyer_stateNoBuyer's two-letter state.
trade_valueNoTrade-in allowance in USD (used when the scenario does not set it).
buyer_countyNoBuyer's county without 'County'.
trade_equityNoNet trade equity if allowance and payoff are unknown (no tax credit).
buyer_addressNoOptional 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_detailsNoOptional trade-in details from the shopper: year, make, model, trim, vin, odometer, plate, plate_state, color, payoff_lender, payoff_amount.
trade_vehicleNoShort description of the trade, e.g. '2021 Ford F-150 XLT, 48k mi'.
add_on_interestNoOptional: is the shopper interested in service_contract, gap, maintenance, other (yes, no or unsure)? No prices; the dealer covers these.
shopper_contactNoREQUIRED. 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_detailsNoOptional 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_labelsNoConditional incentive label_raw values the shopper qualifies for.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / $defs / FinancingDetails / properties / rebates / description
      Previous 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)"
  2. Changed9 schema fields changed
    • addedInput schema / $defs / AddOnInterest
      Added 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"
      +}
    • addedInput schema / $defs / BuyerAddress
      Added 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"
      +}
    • addedInput schema / $defs / FinancingDetails
      Added 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"
      +}
    • addedInput schema / $defs / PreApproval
      Added 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"
      +}
    • addedInput schema / $defs / TradeDetails
      Added 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"
      +}
    • addedInput schema / properties / add_on_interest
      Added 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."
      +}
    • addedInput schema / properties / buyer_address
      Added 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."
      +}
    • addedInput schema / properties / financing_details
      Added 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."
      +}
    • addedInput schema / properties / trade_details
      Added 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."
      +}
  3. Changed4 schema fields changed
    • changedInput schema / $defs / HandoffContact / description
      Previous 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."
    • addedInput schema / $defs / HandoffContact / properties / email / description
      Added value: +"Shopper email, e.g. name@example.com"
    • addedInput schema / $defs / HandoffContact / properties / phone / description
      Added value: +"Shopper US phone with area code, e.g. 214-555-0100"
    • changedInput schema / properties / shopper_contact / description
      Previous 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."
  4. Added

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources