MCP 服务器

Cardog

app.cardog/mcp
电商与零售 数据与分析 公开且可连接 MCP 2025-11-25

此 MCP 可以做什么

Decodes vehicle VINs, searches Canadian listings, provides market quotes, resolves vehicle entities, and checks Transport Canada and NHTSA recalls.

check_recalls
The authoritative "is this vehicle under recall?" check — Transport Canada + NHTSA recall campaigns, fused and ref-keyed. Compliance guide: https://cardog.app/docs/compliance. Pass EXACTLY ONE of: - `vin` (17 characters) — the per-vehicle recall check. In the result, `resolved: false` means the VIN is not bridged into the graph yet — distinct from "no recalls" (`resolved: true, total: 0`). - `ref` — an entity ref scoping campaigns: "make:honda", "model:honda/cr-v", or "model-year:honda/cr-v/2026". A ref is `{domain}:{key}`, lowercase, with `/` separating composite key segments: "make:tesla", "model:mini/hardtop", "model-year:honda/cr-v/2026", "fuel-type:electric". (Exception: nano/squish keys are uppercase VIN charset — machine-derived, never typed from text.) Get refs from resolve_entity or identify_vehicle — never construct them from guessed names. Each campaign carries: authority (tc/nhtsa) + campaign number, component, defect/consequence summaries, the corrective action, recall date, units affected, and `affects` — the affected model-years as refs. `asOf` (VIN checks) is when the recall data was last updated, citable. Errors are instructions: every failure returns {code, message, hint, suggestions} — follow `hint` for the next call; `suggestions` lists nearest valid refs for a bad ref. Unknown-but-well-formed refs are a 400 naming the ref, NEVER a silent fuzzy match. Next: identify_vehicle({ vin }) for the vehicle's full identity; market_quote({ ref: "model-year:…" }); GET /v2/recalls/{recall-ref} for one campaign; GET /v2/recalls/feed for the newest campaigns.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['context'], 'properties': {'ref': {'type': 'string', 'description': 'Entity ref scope: "make:honda", "model:honda/cr-v", or "model-year:honda/cr-v/2026". Exclusive with `vin`.'}, 'vin': {'type': 'string', 'description': '17-character VIN â\x80\x94 the per-vehicle recall check. Exclusive with `ref`.'}, 'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Max campaigns for a ref-scoped query (default 25, max 100)'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}}}
identify_vehicle
Decode a 17-character VIN into its full Cardog identity: canonical entity refs, the market grains (nano/squish), spec highlights, and links to adjacent resources. VIN ONLY — this tool never fuzzy-matches. If you hold free text ("2021 Civic", a make or model name), do NOT call this: call resolve_entity — free text enters the platform in exactly one tool. A non-VIN input returns a redirect hint, not a decode. A ref is `{domain}:{key}`, lowercase, with `/` separating composite key segments: "make:tesla", "model:mini/hardtop", "model-year:honda/cr-v/2026", "fuel-type:electric". (Exception: nano/squish keys are uppercase VIN charset — machine-derived, never typed from text.) The result's `refs` block (make/model/modelYear/fuelType/…) contains the join keys for every other tool; a null ref means "not derivable for this VIN", never "unknown ref". `squish` (WMI+VDS+year) is always derivable and is a valid market_quote instrument; `nano` is the fungible build grain for dedup/comparables. `specHighlights` is a best-effort skim of the spec sheet (horsepower, economy, range, seating…), each value with its unit; `specHighlightsTrimDependent` names the highlights that differ between trims of the model year. The full sheet lives at GET /v2/specs/{refs.modelYear}. Errors are instructions: every failure returns {code, message, hint, suggestions} — follow `hint` for the next call; `suggestions` lists nearest valid refs for a bad ref. Unknown-but-well-formed refs are a 400 naming the ref, NEVER a silent fuzzy match. Next: check_recalls({ vin }) — outstanding recalls; market_quote({ ref: refs.modelYear ?? squish }); search_inventory({ models: [refs.model] }).
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['vin', 'context'], 'properties': {'vin': {'type': 'string', 'minLength': 1, 'description': 'The 17-character VIN. Free text is NOT accepted here â\x80\x94 use resolve_entity for text.'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}}}
market_quote
The live market card for one instrument: quote (live listing count, best/p25/median/p75 price, average days-on-market, 30-day price cuts), a daily-bar history summary, and a bounded sample of the live listings behind the numbers. `ref` must be an INSTRUMENT ref — one of two grains: - "model-year:{make}/{model}/{year}" (e.g. "model-year:honda/cr-v/2026") — lowercase, /-separated; get it from resolve_entity (domain "model-year") or identify_vehicle's refs.modelYear. - "squish:{9 uppercase VIN chars}" (e.g. "squish:5TDGSKFCS") — the exact-config grain; get it from identify_vehicle. (squish/nano keys are the ONLY uppercase refs; every other domain is lowercase.) No other ref domain quotes. Errors are instructions: every failure returns {code, message, hint, suggestions} — follow `hint` for the next call; `suggestions` lists nearest valid refs for a bad ref. Unknown-but-well-formed refs are a 400 naming the ref, NEVER a silent fuzzy match. Optional `window` picks the history span: 1w, 1m, 3m, 6m, ytd, 1y, 3y, 5y, 10y, all. Next: search_inventory with the model's refs to walk the full book; check_recalls({ ref }) on a model-year ref; GET /v2/tape/history/{ref} for every daily bar.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ref', 'context'], 'properties': {'ref': {'type': 'string', 'minLength': 1, 'description': 'Instrument ref: "model-year:honda/cr-v/2026" or "squish:5TDGSKFCS". Free text never quotes â\x80\x94 resolve_entity first.'}, 'window': {'enum': ['1w', '1m', '3m', '6m', 'ytd', '1y', '3y', '5y', '10y', 'all'], 'type': 'string', 'description': 'History window (server default when omitted)'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}}}
resolve_entity
Turn free text into canonical Cardog entity refs — THE text entry point for every other tool. A ref is `{domain}:{key}`, lowercase, with `/` separating composite key segments: "make:tesla", "model:mini/hardtop", "model-year:honda/cr-v/2026", "fuel-type:electric". (Exception: nano/squish keys are uppercase VIN charset — machine-derived, never typed from text.) Every other tool takes refs, never names. Call this FIRST whenever you hold text — "Civic", "2024 Model Y", a misspelling like "teslla" — then reuse the refs for the rest of the session. Returns candidates with confidence, best-first. `best` is the top candidate ONLY when it clears the confidence floor; otherwise it is null and YOU choose from `candidates` (or ask the user) — the API never guesses. Pass `domain` to constrain the search (use domain "model-year" when you need a market_quote instrument). Errors are instructions: every failure returns {code, message, hint, suggestions} — follow `hint` for the next call; `suggestions` lists nearest valid refs for a bad ref. Unknown-but-well-formed refs are a 400 naming the ref, NEVER a silent fuzzy match. Next steps (also echoed in each result's `next` block): search_inventory with make/model refs; market_quote with a model-year: ref; check_recalls with any make/model/model-year ref; dereference a ref (parents, children, counts) at GET /v2/entities/{ref}.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query', 'context'], 'properties': {'limit': {'type': 'integer', 'maximum': 10, 'minimum': 1, 'description': 'Max candidates (default 5)'}, 'query': {'type': 'string', 'minLength': 1, 'description': 'Free text to resolve, e.g. "2021 Civic", "teslla", "plug-in hybrid"'}, 'domain': {'type': 'string', 'description': 'Constrain candidates to one domain: "make", "model", "model-year", "body-style", "fuel-type", "drive-type", "transmission", "electrification-level", "vehicle-type". Omit to search across domains.'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}}}
search_inventory
Search live Canadian vehicle listings — ref-native. One call returns listings + facets + the total count. Filters take entity REFS from resolve_entity / identify_vehicle, never free-text names: makes: ["make:mini"], models: ["model:mini/hardtop"], fuelTypes: ["fuel-type:electric"] — plus year/price/odometer ranges and canonical spec filters, e.g. spec: {"fuelEconomyCombined": {"min": 35}, "heatedSeatsFront": ["standard"]} (numeric attrs take {min,max}; equipment attrs take ["standard"|"optional"|"unavailable"]). A ref is `{domain}:{key}`, lowercase, with `/` separating composite key segments: "make:tesla", "model:mini/hardtop", "model-year:honda/cr-v/2026", "fuel-type:electric". (Exception: nano/squish keys are uppercase VIN charset — machine-derived, never typed from text.) Errors are instructions: every failure returns {code, message, hint, suggestions} — follow `hint` for the next call; `suggestions` lists nearest valid refs for a bad ref. Unknown-but-well-formed refs are a 400 naming the ref, NEVER a silent fuzzy match. A typo'd or unknown ref 400s with code "unknown_entity_refs" naming it, with nearest-ref suggestions — correct the ref (usually via resolve_entity) and retry. Facets in the result are (ref, name, count) buckets over the MATCHING set — they double as the valid filter vocabulary for your next, narrower call. Every listing row carries its refs (makeRef/modelRef/nano). Next: market_quote({ ref: "model-year:…" }) for pricing context; check_recalls({ vin }) per listing; GET /v2/listings/vin/{vin} for the full canonical spec.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['context'], 'properties': {'page': {'type': 'integer', 'minimum': 1, 'description': 'Page number (default 1)'}, 'sort': {'type': 'object', 'properties': {'field': {'enum': ['price', 'year', 'odometer', 'createdAt', 'score'], 'type': 'string'}, 'direction': {'enum': ['asc', 'desc'], 'type': 'string'}}, 'additionalProperties': False}, 'spec': {'type': 'object', 'description': 'Canonical spec filters keyed by SpecAttributeId: numeric â\x86\x92 {"min","max"}, equipment â\x86\x92 ["standard"|"optional"|"unavailable"]. Example: {"fuelEconomyCombined": {"min": 35}, "heatedSeatsFront": ["standard"]}. Bare scalars are invalid â\x80\x94 "standard" must be ["standard"]; a wrong-shaped value errors with code "invalid_spec_filter". Unknown keys 400 with code "unknown_spec_attributes".', 'additionalProperties': {}}, 'year': {'type': 'object', 'properties': {'max': {'type': 'number'}, 'min': {'type': 'number'}}, 'description': 'Model year range', 'additionalProperties': False}, 'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'Rows per page (default 10, max 50)'}, 'makes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Entity refs in the "make" domain, e.g. ["make:mini"]'}, 'nanos': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Entity refs in the "nano" domain, e.g. ["nano:5TDGSKFCRS"]'}, 'price': {'type': 'object', 'properties': {'max': {'type': 'number'}, 'min': {'type': 'number'}}, 'description': 'Price (CAD) range', 'additionalProperties': False}, 'models': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Entity refs in the "model" domain, e.g. ["model:mini/hardtop"]'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}, 'odometer': {'type': 'object', 'properties': {'max': {'type': 'number'}, 'min': {'type': 'number'}}, 'description': 'Odometer (km) range', 'additionalProperties': False}, 'fuelTypes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Entity refs in the "fuel-type" domain, e.g. ["fuel-type:electric"]'}, 'bodyStyles': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Entity refs in the "body-style" domain, e.g. ["body-style:sport-utility-vehicle-suv"]'}, 'driveTypes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Entity refs in the "drive-type" domain, e.g. ["drive-type:awd-all-wheel-drive"]'}, 'vehicleTypes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Entity refs in the "vehicle-type" domain, e.g. ["vehicle-type:passenger-car"]'}, 'transmissions': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Entity refs in the "transmission" domain, e.g. ["transmission:automatic"]'}, 'electrificationLevels': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Entity refs in the "electrification-level" domain, e.g. ["electrification-level:bev-battery-electric-vehicle"]'}}}
window_sticker
The factory window sticker (Monroney label) we hold for a VIN, or why there is none. Guide: https://cardog.app/docs/window-sticker. Pass `vin` (17 characters). The result has exactly one of: - `label` — we hold the manufacturer's label: `issuer`, `retrievedAt`, `vinVerified` (true only when the VIN was read inside the file; false means the manufacturer's service returned it for this VIN and nothing stronger), and `document` (a stable identifier + SHA-256, and `downloadUrl`: a signed link to the PDF, good for 24 hours, free, no API key needed. You may give it to a person as a clickable link. Do not store the link: call this tool again for a fresh one, which bills the label again. `sha256` identifies the file). Costs 5 credits. - `unavailable` — no label, and `reason` says why. `not_yet_harvested` is the ONLY reason worth retrying later. `no_lane` (not collected for this manufacturer), `lane_us_only` (US-sold vehicles only), `issuer_has_no_record` (the manufacturer has none) and `pre_lane_model_year` (predates our coverage) are final. Costs 0 credits. Absence is a normal answer, not an error. The label's printed contents (options, MSRP, fuel economy) are not served yet. Errors are instructions: every failure returns {code, message, hint, suggestions} — follow `hint` for the next call; `suggestions` lists nearest valid refs for a bad ref. Unknown-but-well-formed refs are a 400 naming the ref, NEVER a silent fuzzy match. Next: identify_vehicle({ vin }) for the vehicle's identity and its refs (model-year:… for market_quote); check_recalls({ vin }) for open campaigns.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['vin', 'context'], 'properties': {'vin': {'type': 'string', 'description': '17-character VIN'}, 'context': {'type': 'string', 'description': 'Explain why you are calling this tool and how it fits into the user\'s overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person (\'I\', \'we\', \'you\') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization\'s repositories to find all open issues related to performance complaints and latency issues for team prioritization."'}}}
已更改
window_sticker
2026年10月1日 02:52
已添加
window_sticker
2026年9月29日 03:00
已添加
check_recalls
2026年9月17日 07:57
已添加
market_quote
2026年9月17日 07:57
已添加
search_inventory
2026年9月17日 07:57
已添加
identify_vehicle
2026年9月17日 07:57
已添加
resolve_entity
2026年9月17日 07:57