{"name":"app.cardog/mcp","slug":"cardog-mcp","title":"Cardog","description":"VIN decode, Canadian listings, market quotes, TC+NHTSA recalls. Full API: https://cardog.app/docs.md","url":"https://mcp.market/server/cardog-mcp","rating":null,"grade":"B","score":72,"certified":false,"status":"active","category":"productivity","tags":["productivity"],"presence":{"score":14,"stars":1,"forks":0,"downloads_week":null,"last_push_at":"2026-03-21T00:35:18.000Z","license":null},"uptime":null,"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/cardog-ai/mcp-server","website":"https://cardog.app/docs","version":"2.0.1","remotes":[{"type":"streamable-http","url":"https://mcp.cardog.io/mcp?api_key={api_key}","variables":{"api_key":{"description":"Cardog API key from cardog.app/account/api","isRequired":true,"isSecret":true}}},{"type":"sse","url":"https://mcp.cardog.io/sse?api_key={api_key}","variables":{"api_key":{"description":"Cardog API key from cardog.app/account/api","isRequired":true,"isSecret":true}}}],"packages":[],"tools":[{"name":"check_recalls","description":"The authoritative \"is this vehicle under recall?\" check — Transport Canada + NHTSA recall campaigns, fused and ref-keyed. Compliance guide: https://cardog.app/docs/compliance.\n\nPass EXACTLY ONE of:\n- `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`).\n- `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.\n\nEach 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.\n\nErrors 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.\n\nNext: 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.","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"identify_vehicle","description":"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.\n\nVIN 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.\n\nA 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.)\n\nThe 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}.\n\nErrors 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.\n\nNext: check_recalls({ vin }) — outstanding recalls; market_quote({ ref: refs.modelYear ?? squish }); search_inventory({ models: [refs.model] }).","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"market_quote","description":"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.\n\n`ref` must be an INSTRUMENT ref — one of two grains:\n- \"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.\n- \"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.)\n\nNo 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.\n\nOptional `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.","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"resolve_entity","description":"Turn free text into canonical Cardog entity refs — THE text entry point for every other tool.\n\nA 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.)\n\nEvery 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).\n\nErrors 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.\n\nNext 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}.","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"search_inventory","description":"Search live Canadian vehicle listings — ref-native. One call returns listings + facets + the total count.\n\nFilters 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\"]).\n\nA 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.)\n\nErrors 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.\n\nFacets 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.","write_action":false,"price_micros":0,"input_schema":{"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#"}}],"scan":{"score":72,"grade":"B","scanned_at":"2026-09-24T17:24:38.869Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-24T17:24:38.796Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":17,"max":20,"notes":["remote reachable in 3654ms"]},"poisoning":{"score":15,"max":15,"notes":["5 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":4,"max":15,"notes":["last push 188 days ago"]},"identity":{"score":8,"max":10,"notes":["namespace and repository owner differ","GitHub account older than a year","website matches verified namespace"]}},"findings":[],"inputs":{"probes":[{"url":"https://mcp.cardog.io/mcp?api_key={api_key}","reachable":true,"authRequired":false,"latencyMs":3654,"serverInfo":{"name":"Cardog Public MCP","version":"2.0.0"}},{"url":"https://mcp.cardog.io/sse?api_key={api_key}","reachable":true,"authRequired":false,"latencyMs":1499,"serverInfo":{"name":"Cardog Public MCP","version":"2.0.0"}}],"packages":[],"repo":{"found":true,"owner":"cardog-ai","repo":"mcp-server","archived":false,"pushedAt":"2026-03-21T00:35:18Z","stars":1,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/135272583?v=4","ownerCreatedAt":"2023-06-01T19:57:24Z"},"icon":{"url":"https://cardog.app/favicon.ico","source":"site","width":48,"height":48},"presence":{"stars":1,"forks":0,"downloadsWeek":null,"license":null,"lastPushAt":"2026-03-21T00:35:18.000Z","score":14}}}},"grade_history":[],"reviews":[]}