service_advisor_lookup
Vehicle data · Read-only
The one-call answer: due maintenance, candidate labor with pricing, TSBs, and specs for a vehicle.
Usage
This is the tool most conversations should reach for first — it resolves the vehicle internally, so a broad question needs no prior resolve_vehicle call.
Three contracts matter more than the rest:
- Candidates are a menu, not a bill. Labor candidates carry per-option pricing for alternatives that cannot all apply. Present them, let the advisor choose, and re-call with
selectedApplicationIdsfor aselectedTotal. Never sum the menu. - The two stages mirror shop reality.
diagnosereturns inspection and diagnostic operations only — no shop quotes a repair before diagnosis.quotereturns the named repair with parts, specs, and pricing. A symptom sent without a stage returns{ambiguous: true, kind: "stage", question, options}; relay the question. - Indicator-based schedules are real. When
scheduleTypeis"indicator-based"(Honda Maintenance Minder), the vehicle computes its own timing and no general mileage table exists. Re-call withserviceCode— the code on the dash — for that code's work. That work is priced like any repair: each operation carries MOTOR's book time (read from its detail payload, not the summary) and appears inlaborEstimate, so a B4 service is selected and totalled withselectedApplicationIdsand needs no symptom. An operation MOTOR carries no time for comes backbillable: false— included in the service, not free.
Every response carries a callTrace of the upstream MOTOR requests behind it: path, status, and latency per call.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
vehicle | Resolve by VIN, or Resolve by year/make/model | Yes | The vehicle to resolve — either {vin} or {year, make, model, trim?}. Example: {"vin": "2HGFA1F5"} |
vehicle.vin | string | Yes | Partial (3+ characters) or full 17-character VIN. Example: "2HGFA1F5" |
vehicle.year | number, or string | Yes | Model year. Sandbox covers 2010, 2015, 2016 only. Example: 2010 |
vehicle.make | string | Yes | Make name, case-insensitive. Example: "Honda" |
vehicle.model | string | Yes | Model name, case-insensitive. Example: "Civic" |
vehicle.trim | string | No | Trim/submodel, case-insensitive. Omit to see all candidates when unsure. Example: "LX" |
mileage | positive integer | No | Current odometer miles — enables due-at-mileage maintenance selection. Example: 62000 |
symptom | string | No | Customer-reported symptom in plain words — drives labor, bulletin, and spec search. Example: "AC blows warm" |
laborRateCents | positive integer | No | Shop labor rate in integer cents per hour. Example: 15000 (= $150.00/hr) |
selectedApplicationIds | array of positive integer | No | Labor operations the advisor chose from a previous call's candidates. Omit on the first call to get the menu; re-call with the chosen ids to get a selectedTotal. An id selects exactly that application: where a candidate groups variants with differing hours (bookHoursRange), pass the specific variant's id, and the costed line lists the variants it displaced under variantAlternatives — surface those to the advisor when their hours differ. Never sum candidates yourself. Example: [25785330, 26903691] |
serviceCode | string | No | Indicator service code shown on the dash, for indicator-scheduled vehicles (Honda Maintenance Minder). Returns the maintenance work tagged with that code instead of a mileage slice. Example: "B" (combined displays like "B2" also work) |
stage | "diagnose" | "quote" | No | Repair stage. "diagnose" = fault not confirmed: inspection/diagnostic operations, TSBs, diagnostic content, NO repair operations. "quote" = repair known: the named operation with parts, specs, and pricing. Omit with a symptom and the tool asks which stage — relay that question, never guess. Example: "diagnose" |
specValueCap | integer | No | How many specifications get their actual value+unit resolved per answer, most relevant first (default 4). Specs past the cap return name-only and the section note says how many were omitted. Example: 4 |
configuration | object | No | Known vehicle configuration. Rows whose qualifiers contradict it are filtered out; unknown attributes that materially change the answer come back as one targeted question under needsConfiguration. Engine and trim auto-populate in service_advisor_lookup. Example: {"transmission": "automatic"} |
configuration.transmission | "automatic" | "manual" | No | Transmission type, once the user has confirmed it. Example: "automatic" |
configuration.drivetrain | "fwd" | "rwd" | "awd" | "4wd" | No | Drivetrain, once known. Example: "fwd" |
configuration.bodyStyle | "sedan" | "coupe" | "hatchback" | "wagon" | No | Body style, once known. Example: "sedan" |
configuration.engine | string | No | Engine displacement or designation. Auto-populated from resolution in service_advisor_lookup — only pass it to list_content. Example: "1.8L" |
configuration.trim | string | No | Trim/submodel, case-insensitive. Omit to see all candidates when unsure. Example: "LX" |
configuration.rearBrakes | "disc" | "drum" | No | Rear brake type, once the advisor has confirmed it — VIN resolution cannot determine it, and brake work-time variants (e.g. rear pads vs shoes) hinge on it. Example: "disc" |
configuration.options | array of string | No | Option packages present on the vehicle (presence-only assertions). Example: ["Sunroof"] |
Description advertised to clients
The exact description a fully entitled MCP client discovers — the workflow contracts travel with the tool, so a client with no system prompt still uses it correctly. An account missing a licence for content this tool reaches sees the same text behind a [Licensed content — not enabled on this account] or [Partially available] notice:
The one-call answer for a service advisor: given a vehicle (plus optional mileage, symptom, and labor rate), returns due maintenance, CANDIDATE labor operations with per-option pricing, matching technical service bulletins, and relevant specifications in one structured result with per-section status and a call trace. The labor candidates are a menu, not a bill: present them with their individual prices, let the advisor choose which apply, then re-call with selectedApplicationIds to get a selectedTotal. NEVER add candidate prices together yourself — alternatives for different configurations must not be summed. If the maintenance section reports scheduleType "indicator-based" (e.g. Honda Maintenance Minder), the vehicle computes its own service timing and no general mileage table exists: say so, treat severeServiceConditional items as applying ONLY under their stated conditions, and re-call with serviceCode (the code on the dash, e.g. "B") for that code's work. A service code's work is priced work: each operation carries MOTOR's book time and appears in laborEstimate, so it is selected and totalled exactly like a repair — pass its applicationIds in selectedApplicationIds (no symptom needed), and those same ids are accepted by create_quote_snapshot. Where the schedule maps one operation per engine or transmission the candidate carries bookHoursRange and variantAlternatives: relay the mappings and let the advisor pick one, never average them. An operation MOTOR carries no book time for comes back billable:false — present it as included in the service, never as free or as zero hours. Shop workflow has TWO STAGES and the tool follows them. stage "diagnose" (fault not yet confirmed): inspection/diagnostic operations, TSBs, and diagnostic content — deliberately NO repair operations, because no shop quotes a repair before diagnosis. stage "quote" (repair known): the named operation with parts, specifications, and per-option pricing. Quote parts rows carry OEM LIST pricing under
pricing(oemPartNumber, listPrice, listPriceCents) where MOTOR prices them — an anchor for the advisor, never the sell price, and a row withoutpricingis unpriced, not free. A symptom sent without a stage returns {ambiguous: true, kind: "stage", question, options}: relay the question to the advisor and re-call with their answer — do NOT pick a stage yourself. Configuration works the same way: engine and trim are auto-populated from resolution; pass other attributes (transmission, drivetrain, ...) via configuration once known, and treat a needsConfiguration entry as ONE targeted question to relay — never present both alternatives, never guess. A candidate whose hours vary by configuration arrives with a needsVariantChoice prompt (question + per-variant applicationId and hours): relay it and re-call with the chosen variant's applicationId in selectedApplicationIds. Resolves the vehicle internally, so it can be the FIRST call for broad questions. Any payload in a response carrying a question with options (a stage prompt, a needsConfiguration entry, a needsVariantChoice menu, ambiguous vehicle candidates) is a prompt: relay the question verbatim and present its options as a selectable list the user picks from — easier than typing option text — then re-call with the chosen option's value (stage, attribute value, or applicationId). On clients that support MCP elicitation, this server already showed the user that choice as a clickable form and resolved it before answering — a result with no question in it needs no re-ask; present it as final. If the result is {ambiguous: true, question, candidates: [...]}, relay the question and present the candidates as a selectable list (numbered options the user can pick from, never a request to type details back). Do NOT pick a candidate yourself, do NOT retry with a guess — a confident answer about the wrong trim is the worst possible outcome. The evaluation sandbox covers model years 2010, 2015, and 2016 ONLY. Empty results for other vehicles are correct behaviour, not an error — tell the user the vehicle is not covered rather than retrying.
Example — Diagnostic-stage lookup for an A/C complaint
Captured from the live server, 2026-08-20. Maintenance, diagnostics, and call-trace sections truncated.
Request
{
"vehicle": {
"vin": "2HGFA1F5"
},
"mileage": 62000,
"symptom": "AC blows warm",
"laborRateCents": 15000,
"stage": "diagnose"
}
Response
{
"vehicle": {
"ambiguous": false,
"baseVehicleId": 22124,
"description": "2010 Honda Civic LX, 1.8L L4 (R18A1) GAS FI",
"year": 2010,
"make": "Honda",
"model": "Civic",
"trim": "LX"
},
"mileage": 62000,
"symptom": "AC blows warm",
"workFocus": "Air Conditioning",
"stage": "diagnose",
"laborRate": "$150.00/hr",
"maintenanceDue": {
"status": "ok",
"note": "This vehicle uses indicator-based (Maintenance Minder) scheduling — the vehicle computes service timing and the OEM publishes no general mileage table. Severe-service items listed here apply only under their stated conditions; re-call with serviceCode (the code on the dash, e.g. \"B\") for that code's work.",
"data": {
"atMiles": 62000,
"scheduleType": "indicator-based",
"due": [],
"severeServiceConditional": [
"…"
]
}
},
"laborEstimate": {
"status": "ok",
"note": "Diagnostic-stage operations only. Once the tech confirms the fault, re-call with stage \"quote\" and the repair to price. Candidate operations only — no total until the advisor selects which apply (re-call with selectedApplicationIds).",
"data": {
"candidates": [
{
"operation": "Air Conditioning",
"applicationId": 25785330,
"name": "Air Conditioning System Leak Inspection",
"serviceType": "Inspect",
"bookHours": 0.6,
"skillCode": "g",
"skillName": "General",
"hourlyRate": "$150.00",
"rateCentsPerHour": 15000,
"lineTotal": "$90.00"
},
{
"operation": "Air Conditioning",
"applicationId": 26903691,
"name": "HVAC System Diagnosis & Testing",
"serviceType": "Inspect",
"bookHours": 0.6,
"skillCode": "p",
"skillName": "Precision",
"hourlyRate": "$150.00",
"rateCentsPerHour": 15000,
"lineTotal": "$90.00"
}
]
}
},
"bulletins": {
"status": "ok",
"data": [
{
"applicationId": 474099311,
"title": "A/C Leak Detection",
"manufacturerNumber": "07-030",
"issueDate": "2023-12-08T00:00:00",
"tsbType": "Service Bulletin"
},
{
"applicationId": 468452808,
"title": "Air Conditioning System Performance Test",
"manufacturerNumber": "96-012",
"issueDate": "2011-02-11T00:00:00",
"tsbType": "Service Bulletin"
}
]
},
"specifications": {
"status": "skipped",
"note": "Specifications are quote-stage content; re-call with stage \"quote\" and the repair to price."
},
"parts": {
"status": "skipped",
"note": "Parts are returned in the quote stage."
},
"callTrace": [
{
"path": "/v1/Information/Vehicles/Search/ByVIN",
"query": "VIN=2HGFA1F5",
"status": 200,
"ms": 159,
"atMs": 2
},
{
"path": "/v1/Information/Vehicles/Attributes/BaseVehicleID/22124/Content/Summaries/Of/EstimatedWorkTimes",
"query": "ItemsPerPage=30&PageIndex=0&SearchTerm=Air Conditioning",
"status": 200,
"ms": 352,
"atMs": 163
},
"… six further upstream calls"
]
}
Per-section status means partial answers degrade gracefully — a section can fail or be skipped without taking the whole answer down.