Cardog
VIN decode, Canadian listings, market quotes, TC+NHTSA recalls. Full API: https://cardog.app/docs.md
使うべきか
品質と安全性
検出事項(2)
- HIGH
- MEDIUMcheck_recalls 内
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"mcp": {
"url": "https://mcp.cardog.io/mcp?api_key={api_key}"
}
}
}リモートエンドポイント
https://mcp.cardog.io/mcp?api_key={api_key}streamable-httphttps://mcp.cardog.io/sse?api_key={api_key}sseできること
ツール一覧
ツール(5)
🟢resolve_entity(query, domain, limit, context)
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",
"properties": {
"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."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"description": "Max candidates (default 5)"
},
"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.\""
}
},
"required": [
"query",
"context"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢identify_vehicle(vin, context)
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",
"properties": {
"vin": {
"type": "string",
"minLength": 1,
"description": "The 17-character VIN. Free text is NOT accepted here — 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.\""
}
},
"required": [
"vin",
"context"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢search_inventory(makes, models, bodyStyles, fuelTypes, driveTypes, ...)
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",
"properties": {
"makes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entity refs in the \"make\" domain, e.g. [\"make:mini\"]"
},
"models": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entity refs in the \"model\" domain, e.g. [\"model:mini/hardtop\"]"
},
"bodyStyles": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entity refs in the \"body-style\" domain, e.g. [\"body-style:sport-utility-vehicle-suv\"]"
},
"fuelTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entity refs in the \"fuel-type\" domain, e.g. [\"fuel-type:electric\"]"
},
"driveTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entity refs in the \"drive-type\" domain, e.g. [\"drive-type:awd-all-wheel-drive\"]"
},
"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\"]"
},
"vehicleTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entity refs in the \"vehicle-type\" domain, e.g. [\"vehicle-type:passenger-car\"]"
},
"nanos": {
"type": "array",
"items": {
"type": "string"
},
"description": "Entity refs in the \"nano\" domain, e.g. [\"nano:5TDGSKFCRS\"]"
},
"year": {
"type": "object",
"properties": {
"min": {
"type": "number"
},
"max": {
"type": "number"
}
},
"additionalProperties": false,
"description": "Model year range"
},
"price": {
"type": "object",
"properties": {
"min": {
"type": "number"
},
"max": {
"type": "number"
}
},
"additionalProperties": false,
"description": "Price (CAD) range"
},
"odometer": {
"type": "object",
"properties": {
"min": {
"type": "number"
},
"max": {
"type": "number"
}
},
"additionalProperties": false,
"description": "Odometer (km) range"
},
"spec": {
"type": "object",
"additionalProperties": {},
"description": "Canonical spec filters keyed by SpecAttributeId: numeric → {\"min\",\"max\"}, equipment → [\"standard\"|\"optional\"|\"unavailable\"]. Example: {\"fuelEconomyCombined\": {\"min\": 35}, \"heatedSeatsFront\": [\"standard\"]}. Bare scalars are invalid — \"standard\" must be [\"standard\"]; a wrong-shaped value errors with code \"invalid_spec_filter\". Unknown keys 400 with code \"unknown_spec_attributes\"."
},
"sort": {
"type": "object",
"properties": {
"field": {
"type": "string",
"enum": [
"price",
"year",
"odometer",
"createdAt",
"score"
]
},
"direction": {
"type": "string",
"enum": [
"asc",
"desc"
]
}
},
"additionalProperties": false
},
"page": {
"type": "integer",
"minimum": 1,
"description": "Page number (default 1)"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "Rows per page (default 10, max 50)"
},
"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.\""
}
},
"required": [
"context"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢market_quote(ref, window, context)
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",
"properties": {
"ref": {
"type": "string",
"minLength": 1,
"description": "Instrument ref: \"model-year:honda/cr-v/2026\" or \"squish:5TDGSKFCS\". Free text never quotes — resolve_entity first."
},
"window": {
"type": "string",
"enum": [
"1w",
"1m",
"3m",
"6m",
"ytd",
"1y",
"3y",
"5y",
"10y",
"all"
],
"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.\""
}
},
"required": [
"ref",
"context"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢check_recalls(vin, ref, limit, context)
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",
"properties": {
"vin": {
"type": "string",
"description": "17-character VIN — the per-vehicle recall check. Exclusive with `ref`."
},
"ref": {
"type": "string",
"description": "Entity ref scope: \"make:honda\", \"model:honda/cr-v\", or \"model-year:honda/cr-v/2026\". Exclusive with `vin`."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"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.\""
}
},
"required": [
"context"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}推奨プロンプト
search_inventorysearch_inventoryコミュニティ
エビデンス