mcpbeat Sign in

Cardog MCP Server

answering

Cardog is answering right now. Last checked 2 min ago. It exposes 8 tools. Last commit 21 Mar 2026.

VIN decode, Canadian listings, market quotes, TC+NHTSA recalls. Full API: https://cardog.app/docs.md

Uptime history 91 days of history · worst day 47%
91 days agonow
50.3%
Uptime 24h
92 of 183 checks
8
Tools
read from the server
1108 ms
Response time
average over 24h
1
Stars
last commit 21 Mar 2026

What changed 14

Every tool that appeared, vanished or quietly changed what it asks for. Recorded since 14 September 2026. No other catalogue keeps this.

27 Oct 2 tools appeared carrier_lookup, vehicle_operators
26 Oct a tool description was rewritten check_recalls
26 Oct a tool changed the parameters it asks for check_recalls
17 Oct 2 tool descriptions were rewritten identify_vehicle, search_inventory
17 Oct a tool changed the parameters it asks for search_inventory
15 Oct 3 tool descriptions were rewritten check_recalls, identify_vehicle, window_sticker
15 Oct a tool changed the parameters it asks for check_recalls
29 Sep a tool description was rewritten window_sticker
28 Sep a tool appeared window_sticker
14 Sep a tool description was rewritten identify_vehicle

Cardog does not always answer

Over the last week it answered 50.0% of our checks. We check every 15 minutes, so you hear about the next outage within the hour — not from your users.

Three servers free · no card

Connect this server

Endpoint below is the one we actually reach during checks — not the one copied from a README. Last verified 2 min ago.

run in your terminal
claude mcp add mcp --transport http 'https://mcp.cardog.io/mcp?api_key={api_key}'
Settings → Connectors → Add custom connector, then paste this address
https://mcp.cardog.io/mcp?api_key={api_key}
~/.codex/config.toml
[mcp_servers.mcp]
url = "https://mcp.cardog.io/mcp?api_key={api_key}"
.cursor/mcp.json
{
  "mcpServers": {
    "mcp": {
      "url": "https://mcp.cardog.io/mcp?api_key={api_key}"
    }
  }
}
.vscode/mcp.json
{
  "servers": {
    "mcp": {
      "type": "http",
      "url": "https://mcp.cardog.io/mcp?api_key={api_key}"
    }
  }
}

This server publishes 1 more address. The block above uses the one we reach during checks; the full list is under Endpoints below, and the author may intend a particular one for your client.

Available tools 8

Read directly from the server with tools/list, grouped by what they act on. If a tool disappears, we record the date.

carrier
carrier_lookup
Find a motor carrier and read its record: name → US DOT number → every unit observed under it. Guide: https://cardog.app/docs/carriers. Pass `q`: a carrier name or part of one ("bison transport"), a US DOT number ("245330"), or a 17-character VIN (the carriers that unit was observed under). Optional `state` and `country` (two letters) narrow a name match; `limit` caps matches (default 5, max 50). The result lists matches, best first, each with `dotNumber`, `legalName`, `dbaName`, `domicile` (city, state, country), `operation` and declared `powerUnits`. When exactly one carrier matches, or `q` was a DOT number, the result also carries `carrier`: the full read with `declared` (what it filed about itself, dated by `filedOn`, self-reported) and `observed` (what roadside inspections and crash reports recorded: distinct units, inspections, crashes, first and last seen). Declared and observed never mix. The carrier's ref is `org:usdot/{dotNumber}`, the `{domain}:{key}` grammar every Cardog ref uses. Pass `vehicles: true` to also return the first page of units observed under that carrier, most recently seen first, each with a link to every carrier it ran under. A DOT number the road record names but the register does not still reads: `legalName` and every `declared` field null, `observed` filled. COVERAGE: the US federal register and roadside record: US DOT-regulated carriers, including Canadian and Mexican carriers that cross the border. A fleet that only runs inside one province is absent. Fleet rows are observed associations on dated rows, not a confirmed current fleet and not ownership. COST: the tool chains the calls. The search is 1 credit. When it narrows to one carrier (a DOT number, or exactly one name match) the tool also reads the carrier, 5 more, so that call is 6; with `vehicles: true` it also fetches the first fleet page, 5 more, so up to 11. A name search with several matches is 1. 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: vehicle_operators({ vin }) for every carrier a unit in the fleet ran under.
identify
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; a highlight the trims of the model year do not share is absent. 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 }) — recalls listed for the model year; market_quote({ ref: refs.modelYear ?? squish }); search_inventory({ models: [refs.model] }).
inventory
search_inventory
Search live vehicle listings — ref-native. One call returns listings + facets + the total count. The market defaults to Canada, which is the only inventory market today: prices are in each listing's own currency (CAD for Canadian listings) and odometers in km. 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.
market
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.
recalls
check_recalls
Recall campaigns LISTED for a vehicle's model year in its market of sale, ref-keyed, one record per authority, never merged. Default market CA: Transport Canada safety recalls and ECCC emissions notices (each row carries `regime`; never call an emissions notice a safety recall). Pass `market` when the user's market is known (US, AU, …), `include_other: true` to see other markets' records (NHTSA for a Canadian car) uncounted, `authority` to pick authorities. This is a possible-recall list, not a VIN-level determination: campaigns match by model year, not by the campaign's VIN range, and Cardog does not see remedy status. Every result carries `applicability: "listed_for_model_year"`. When you tell a user about these, say they MAY apply and that the manufacturer's own VIN recall lookup (in Canada) or a dealer confirms; never say "open", "outstanding" or "critical", and never say "no recalls" as a clearance. Compliance guide: https://cardog.app/docs/compliance. Pass EXACTLY ONE of: - `vin` (17 characters) — resolves the VIN to its model year, then lists that model year's campaigns. In the result, `resolved: false` means the VIN is not bridged into the graph yet; `resolved: true, total: 0` means none are listed for the model year (not that the vehicle is clear). - `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, eccc, nhtsa, au, …), market and regime + 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.
resolve
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}.
vehicle
vehicle_operators
Every motor carrier a commercial vehicle was observed running under, from the US federal roadside record. Guide: https://cardog.app/docs/carriers. Pass `vin` (17 characters). The result is one item per day a roadside inspection or crash report put a carrier on the unit, most recent first. Each item has `observedAt`, `source` and `value` (`dotNumber`, and `ref` in the `{domain}:{key}` grammar every Cardog ref uses: `org:usdot/{dotNumber}`). The tool always asks for `detail` (which record it was, an inspection or a crash, and the carrier as it stands on the register: legal name, domicile, declared power units). These are observed associations on dated records, not ownership: a leased unit is run by a carrier that does not own it. Covers the power unit (tractor or straight truck). A trailer's carriers come from carrier_lookup({ q: vin }). A consumer car returns no items; that is not evidence of anything. Costs 3 credits when there is at least one item, 0 when there is none. 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: carrier_lookup({ q: "<dotNumber>" }) for the carrier and everything else it ran; identify_vehicle({ vin }) for what the unit is.
window
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 campaigns listed for the model year.

Endpoints

URLTransportStateLatencyChecked
https://mcp.cardog.io/mcp?api_key={api_key} streamable-http answering 838 ms 2 min ago
https://mcp.cardog.io/sse?api_key={api_key} sse answering 79 ms 3 min ago

Alternatives to Cardog

same job, measured the same way
Vin MCP
by carwhere

Decode any US-market VIN, check NHTSA recalls, and look up verified buyer-paid car prices. Free.

92 installs/wk local only
CheckMyVIN
by checkmyvin

Decode US-market VINs and list NHTSA recall campaigns for the make, model and year. Free, no auth.

2 tools answering
OmniaAuto — Canadian Vehicle Listings
by omniaauto

Live Canadian vehicle listings, VIN decode and market valuations, province by province.

7 tools answering
Carstat
by carstat

Vehicle specs, VIN decoding, NHTSA recalls and safety ratings by year, make, model or VIN.

answering
Recallroll
by workers-cybermax-tools-cybermax

VIN recall API + MCP: VIN decode + every NHTSA recall, Do Not Drive first. $19/mo; 50 free/day.

2 tools answering
MarketCheck API
by marketcheck

MarketCheck automotive data: search US/UK listings, predict prices, decode VINs, market history.

13 tools answering
RecallScout
by yc-droid

US vehicle, car-seat, product and food recalls, VIN decoding and crash ratings (NHTSA, CPSC, FDA).

8 tools answering
Nhtsa MCP
by mrfentmen

NHTSA: VIN decoding, safety recalls, owner complaints, make and model catalogues — keyless.

546 installs/wk local only

Cardog — questions

Answers built from our own checks of this server.

What can Cardog do?
It exposes 8 tools, read directly from the server on our last check. Among them: carrier_lookup, check_recalls, identify_vehicle, market_quote, resolve_entity, search_inventory and 2 more. The full list with descriptions is on this page — we take it from the server itself via tools/list, not from a README. How MCP servers expose tools in the first place →
Is Cardog working right now?
We send a real MCP handshake every 15 minutes. Over the last 24 hours 92 of 183 checks got a reply (50.3%), average response time 1108 ms. The bar chart above shows every period we have measured.
How do I connect Cardog?
Copy the ready config from this page. We generate it for Claude Code, Claude Desktop, Codex, Cursor and VS Code, each in the form that client actually reads. It is a remote server, so there is nothing to install — the client connects to the address.
Does Cardog need an API key?
No. Cardog completed a full MCP handshake with us as an anonymous client and listed its tools without asking for anything. All 8 of them are readable on this page. This is what we observed, not what the docs claim.
How fast is Cardog?
It answers our handshake in 1108 ms on average, which is faster than 5% of all working MCP servers we measure. That is on the slow side — worth knowing if the tool sits inside an interactive loop. The comparison comes from our own checks across the whole registry, every 15 minutes.
Is Cardog open source?
We cannot say either way: 1 stars on GitHub, but we could not determine the licence, and without one the code is not open source by default.