mcp-registry/app.opendealer/mcp · v2.3.0
As of 2026-10-26 16:37 UTC, the Opendealer MCP server is up with a Glimind reliability score of 100/100 (grade A). Over the last 30 days it answered 100% of Glimind's liveness checks. It had 3 outages in 90 days, with a median recovery of 3 minutes.
Automotive inventory search for AI assistants: vehicles, dealers, deals, and market data.
Point your MCP client at this streamable-http endpoint: https://mcp.opendealer.app/rpc
3 tool definition(s) exceed ~1,200 tokens each (largest: search_vehicles, ~2,114).
Move long reference material out of descriptions (link a doc or expose a resource), drop repeated examples, and collapse large enums. Trimming these to ~600 tokens saves ~3,575 tokens every session. How to fix →
23 parameter(s) across 10 tool(s) have no description.
Add a "description" to each parameter with its format and an example ("ISO 8601 date, e.g. 2026-10-17"). This is the commonest cause of wrong arguments on the first call. How to fix →
8 tool(s) have parameters with no type (no type/enum/anyOf/$ref).
Give every parameter a "type" (or "enum"/"anyOf"). Untyped parameters make models guess — strings for numbers, objects for arrays. How to fix →
In the last 30 days: 2 tool(s) removed and 93 schema change(s).
Add new tools or optional parameters instead of renaming or removing; deprecate first (say so in the description) and remove later. Agents cache tool contracts. How to fix →
Paste-ready definitions with the problems above fixed. Changes marked verify need a human look. 10 tool(s) still need parameter descriptions written by someone who knows the API. All of them as JSON: /v1/readiness/mcp-registry%2Fapp.opendealer%2Fmcp/fixes
{
"name": "check_recalls",
"description": "Open safety recalls for a listing.\n\nPass vertical when the request names one. Cars use NHTSA (year, make, and model; a campaign may not apply to every VIN). Off-road uses CPSC. Call this with the off-road listing id; the tool reads GET /v2/listings/{listingId}/recalls and does not use the cars-only /v1 path for that id.\n\nEvery response names the source and states one outcome in words: \"confirmed for this VIN\", \"possible for this year, make, and model\", \"no matching published recall\", or \"coverag",
"inputSchema": {
"type": "object",
"properties": {
"vin": {
"description": "17-character Vehicle Identification Number",
"type": "string"
},
"vertical": {
"type": "string",
"minLength": 1,
"description": "Shopper vertical. Omit for every public vertical (cars today). Live verticals come from list_verticals."
},
"listingId": {
"type": "string",
"maxLength": 300,
"minLength": 1,
"description": "Canonical listing id (`dealerId-or-slug:VIN`). Required for an off-road unit when the VIN is listed at more than one rooftop. Same path key as GET /v2/listings/{listingId}/recalls."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
},
"title": "Check Recalls"
}{
"name": "dealers_near",
"description": "Find dealerships near a location.\n\nLocation modes (choose ONE):\n• zip + radius (miles)\n• lat + lng + radius\n• city + state + radius\n• county + state + radius\n\nReturns dealer information including:\n• Name, address, phone, website\n• Slug (the public handle for get_dealer and dealer_inventory; the public list does not include internal dealer UUIDs)\n• Distance from search location\n• Current inventory count\n• Business hours (when available)\n\nResponse `total` is the full match count for the query (ign",
"inputSchema": {
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"minLength": 2,
"description": "Whole-token filter on dealer name, slug, or city. Same as GET /v1/dealers q."
},
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "Latitude coordinate"
},
"lng": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "Longitude coordinate"
},
"zip": {
"type": "string",
"pattern": "^[0-9]{5}$",
"description": "5-digit US ZIP code (e.g., 92688)"
},
"city": {
"type": "string",
"minLength": 1,
"description": "City name"
},
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Maximum number of dealers to return (1-200). Omit to use the Runtime API default of 100."
},
"state": {
"description": "2-letter US state code (e.g., CA, TX)",
"type": "string"
},
"county": {
"type": "string",
"minLength": 1,
"description": "County name"
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"description": "Number of results to skip. The window is the next `limit` vehicles starting at this offset (default 0)."
},
"radius": {
"type": "integer",
"maximum": 250,
"minimum": 1,
"description": "Search radius in miles (1-250). Omit to use the platform default of 150 miles, the same as the shop and the Runtime API."
},
"vertical": {
"type": "string",
"minLength": 1,
"description": "Shopper vertical. Omit for every public vertical (cars today). Live verticals come from list_verticals."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
},
"title": "Find Nearby Dealers"
}{
"name": "filter_vehicles",
"description": "Preferred structured inventory lookup when make/model/year/color/location are known.\n\nExact hard filters only via GET /v1/vehicles (same Meilisearch collection as search_vehicles). Totals match the filters you pass. Listings with zero photos are omitted. fuelType is the canonical label. transmission and drivetrain match every indexed raw string in that bucket (automatic includes \"8-Speed Automatic\"). A 503 powertrain_filter_unavailable means that facet list could not be read, not that zero cars ",
"inputSchema": {
"type": "object",
"properties": {
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "Latitude coordinate"
},
"lng": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "Longitude coordinate"
},
"zip": {
"type": "string",
"pattern": "^[0-9]{5}$",
"description": "5-digit US ZIP code (e.g., 92688)"
},
"city": {
"type": "string",
"minLength": 1
},
"make": {
"type": "string",
"minLength": 1,
"description": "Vehicle make (resolve via list_research_makes if unsure)"
},
"near": {
"type": "string",
"minLength": 1,
"description": "Location string (ZIP or city, state). Same as GET /v1/vehicles near."
},
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number (1-based). Same as GET /v1/vehicles page."
},
"year": {
"type": "integer",
"maximum": 2100,
"minimum": 1900,
"description": "Alias for vehicleModelDate. Same as GET /v1/vehicles year."
},
"class": {
"enum": [
"side-by-side",
"atv",
"snowmobile"
],
"type": "string",
"description": "Off-road class. Legal when vertical=offroad. side-by-side, atv, or snowmobile."
},
"color": {
"type": "string",
"minLength": 1,
"description": "Exterior color family. Same as GET /v1/vehicles color."
},
"drive": {
"enum": [
"2wd",
"4wd",
"awd"
],
"type": "string",
"description": "Drive: 2wd, 4wd, or awd. Legal when vertical=offroad. Same as GET /v2/listings drive."
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1,
"description": "Maximum number of results to return (1-100, default: 25)"
},
"model": {
"type": "string",
"minLength": 1,
"description": "Vehicle model (resolve via list_research_models if unsure)"
},
"seats": {
"type": "integer",
"maximum": 12,
"minimum": 1,
"description": "Seating capacity. Legal when vertical=offroad. Same as GET /v2/listings seats."
},
"state": {
"description": "2-letter US state code (e.g., CA, TX)",
"type": "string"
},
"county": {
"type": "string",
"minLength": 1,
"description": "County name"
},
"fields": {
"type": "string",
"description": "Sparse field selection (comma-separated). Same as GET /v1/vehicles fields."
},
"radius": {
"type": "integer",
"maximum": 250,
"minimum": 1,
"description": "Search radius in miles (1-250). Omit to use the platform default of 150 miles, the same as the shop and the Runtime API."
},
"sortBy": {
"enum": [
"price",
"vehiclemodeldate",
"distance",
"updatedat",
"mileage",
"daysonlot",
"make",
"model",
"pricechange"
],
"type": "string",
"description": "Sort field. Same as GET /v1/vehicles sortBy: price, vehiclemodeldate, distance, updatedat, mileage, daysonlot, make, model, pricechange."
},
"subtype": {
"enum": [
"sport",
"utility",
"youth"
],
"type": "string",
"description": "Off-road sub-type: sport, utility, or youth. Legal when vertical=offroad. Same as GET /v2/listings subtype."
},
"yearMax": {
"type": "integer",
"maximum": 2030,
"minimum": 1990,
"description": "Maximum model year. Same as GET /v1/vehicles yearMax."
},
"yearMin": {
"type": "integer",
"maximum": 2030,
"minimum": 1990,
"description": "Minimum model year. Same as GET /v1/vehicles yearMin."
},
"bodyType": {
"enum": [
"sedan",
"suv",
"truck",
"coupe",
"van",
"wagon",
"convertible",
"hatchback"
],
"type": "string",
"description": "Vehicle body style. Same as GET /v1/vehicles bodyType."
},
"dealerId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Filter to a single dealer UUID. Same as GET /v1/vehicles dealerId."
},
"fuelType": {
"enum": [
"gasoline",
"diesel",
"electric",
"hybrid",
"plug-in-hybrid"
],
"type": "string",
"description": "Fuel type. Same as GET /v1/vehicles fuelType."
},
"priceMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Maximum price in USD. Same as GET /v1/vehicles priceMax."
},
"priceMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Minimum price in USD. Same as GET /v1/vehicles priceMin."
},
"vertical": {
"type": "string",
"minLength": 1,
"description": "Shopper vertical. Omit for every public vertical (cars today). Live verticals come from list_verticals."
},
"certified": {
"type": "boolean",
"description": "Certified pre-owned only. Same as GET /v1/vehicles certified."
},
"condition": {
"enum": [
"new",
"used",
"cpo"
],
"type": "string",
"description": "Listing condition. Same as GET /v1/vehicles condition: new, used, or cpo. The value certified is a deprecated alias of cpo."
},
"hasImages": {
"type": "boolean",
"description": "Listings with zero photos are omitted. Same as GET /v1/vehicles hasImages=true."
},
"sortOrder": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort direction. Same as GET /v1/vehicles sortOrder."
},
"dealerSlug": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Filter to a dealer slug. Same as GET /v1/vehicles dealerSlug."
},
"drivetrain": {
"enum": [
"fwd",
"rwd",
"awd",
"4wd"
],
"type": "string",
"description": "Drivetrain configuration. Same as GET /v1/vehicles drivetrain."
},
"identifier": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "VIN, 12-character HIN, or internal id. Looks the unit up across the verticals this request searches, without a dealer. Same as GET /v2/listings identifier."
},
"mileageMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Maximum mileage. Same as GET /v1/vehicles mileageMax."
},
"transmission": {
"enum": [
"automatic",
"manual",
"cvt"
],
"type": "string",
"description": "Transmission type. Same as GET /v1/vehicles transmission."
},
"priceChangeMax": {
"type": "number",
"description": "Maximum indexed priceChange (USD delta vs first recorded ask; use -1 to exclude unchanged listings)"
},
"priceChangeMin": {
"type": "number",
"description": "Minimum indexed priceChange (USD delta vs first recorded ask; negative means a drop)"
},
"strictLocation": {
"type": "boolean",
"description": "When true, a bare near city that matches several states or none returns an empty collection (same as GET /v1/llm/filter). ZIP and city+state are unchanged. Omit to keep the highest-population city pick. Same as GET /v1/vehicles strictLocation."
},
"displacementMax": {
"type": "number",
"minimum": 0,
"description": "Maximum engine displacement in cc. Legal when vertical=offroad. Same as GET /v2/listings displacementMax."
},
"displacementMin": {
"type": "number",
"minimum": 0,
"description": "Minimum engine displacement in cc. Legal when vertical=offroad. Same as GET /v2/listings displacementMin."
},
"vehicleModelDate": {
"type": "integer",
"maximum": 2100,
"minimum": 1900,
"description": "Exact model year. Same as GET /v1/vehicles vehicleModelDate."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
},
"title": "Filter Vehicles (Structured)"
}Get an email or webhook when this server's readiness drops by 10+ points, tool-poisoning text appears, or a tool breaks:
curl -X POST https://glimind.com/v1/subscriptions -H 'content-type: application/json' -d '{"tools":["mcp-registry/app.opendealer/mcp"],"email":"[email protected]"}'Agents: watch_tool({"toolId": "mcp-registry/app.opendealer/mcp"}) over MCP.
search_vehicles ~2,114 tokensfilter_vehicles ~1,936 tokensdealer_inventory ~1,325 tokensdealers_near ~545 tokensget_vehicle ~510 tokensStatic checks of the advertised tools/list (schema, descriptions, annotations, tool-poisoning patterns, names, size) plus observed protocol, uptime, latency and contract changes. Read-only: no tool is ever called. Weights: schema 15, docs 20, safety 15, efficiency 15, compatibility 15, protocol 5, reliability 10, stability 5. Token counts are estimates (~3.6 characters per token).
Operator? Fix these, then re-check live. Embed the readiness badge:
[](https://glimind.com/server/mcp-registry%2Fapp.opendealer%2Fmcp?ref=badge)
<a href="https://glimind.com/server/mcp-registry%2Fapp.opendealer%2Fmcp?ref=badge"><img src="https://glimind.com/v1/readiness/badge/mcp-registry%2Fapp.opendealer%2Fmcp.svg" alt="MCP agent-readiness"></a>
.. image:: https://glimind.com/v1/readiness/badge/mcp-registry%2Fapp.opendealer%2Fmcp.svg :target: https://glimind.com/server/mcp-registry%2Fapp.opendealer%2Fmcp?ref=badge :alt: MCP agent-readiness
Glimind records every version of this server's tool definitions in a signed, append-only transparency log. Current manifest sha256:0c5903e9ee4f9219…, first seen 2026-10-24, included at leaf 60273 of 74,131. Version history · verify what your client received.
Compare: most reliable data servers · most reliable search servers · most reliable knowledge servers · most reliable finance servers
Glimind tells agents whether a server is up right now and how to call it, then fails over to a live alternative when it isn't.
Claude Code
claude mcp add --transport http glimind https://glimind.com/mcp
Claude Desktop · Windsurf · Cline (mcpServers JSON)
{
"mcpServers": {
"glimind": {
"type": "http",
"url": "https://glimind.com/mcp"
}
}
}
As of 2026-10-26 16:37 UTC, the Opendealer MCP server is up with a Glimind reliability score of 100/100 (grade A). Over the last 30 days it answered 100% of Glimind's liveness checks. It had 3 outages in 90 days, with a median recovery of 3 minutes.
Opendealer MCP server advertises 26 tools, including check_recalls, compare_market, compare_models, compare_vehicles, dealer_inventory.
Point your MCP client at this streamable-http endpoint: https://mcp.opendealer.app/rpc
Glimind scanned all 26 tool definitions for tool-poisoning patterns — hidden or invisible characters, instructions that override the model, concealment from the user, requests to read credential or MCP config files, conversation exfiltration and cross-tool shadowing — and found none. This checks what the server tells the model, not what its code does; review the source before granting access to sensitive data.
Status page: 90-day uptime, every outage and how long it lasted.
Claim this listing to get the Verified operator marker, a remediation checklist and owner analytics, or embed the live badge from any of the tool pages above. Maintainers: alerts, deploy attestation and monthly reports.
Status is an automated estimate from Glimind's liveness checks (handshake and tool listing only; no tool is ever called) and may lag or differ from your network. Glimind is not affiliated with this server or its operator. Operator? Request a correction or opt out at https://glimind.com/opt-out.