Skip to main content
Glama

nhtsa-vehicle-safety-mcp-server

Nhtsa Lookup Vehicles

nhtsa_lookup_vehicles
Read-only

Look up makes, models, vehicle types, and manufacturer details in NHTSA's VPIC catalog, or list the model names NHTSA's datasets file a make and model year under. VPIC names often differ from the names complaints and NCAP ratings use (Silverado vs SILVERADO 1500), and a vehicle's recalls can be split between a series name and a base name. When a recall, complaint, or rating search comes back empty or partial, call operation="dataset_models" with make and modelYear, then search under each name it lists. No list enumerates recall names, so search recalls under both the series name and the base name.

Input Schema

NameRequiredDescriptionDefault
makeNoMake name (required for "models", "vehicle_types", and "dataset_models"). VPIC matches partial names in "models" and "vehicle_types"; "dataset_models" takes the full make name (e.g., "Chevrolet").
limitNoResults per page. Defaults to 100; at most 200 per page.
offsetNoPagination offset into the full result list. Defaults to 0.
modelYearNoModel year, a whole number. Filters "models" to that year; required for "dataset_models". Not accepted by other operations.
operationYes"makes" (all VPIC makes), "models" (VPIC models for a make), "vehicle_types" (types for a make), "manufacturer" (manufacturer details), "dataset_models" (the model names NHTSA's complaint, NCAP, and VPIC lists carry for a make and model year; requires make and modelYear).
manufacturerNoManufacturer name or ID (for "manufacturer" operation). Partial match supported.

Output Schema

NameRequiredDescriptionDefault
capNoMaximum manufacturer records a single lookup retrieves.
errorNoPresent when the call failed. Absent on success.
limitNoPagination limit used for this response
makesNoResults for "makes" operation
shownNoManufacturer records retrieved before pagination, when the cap was reached.
modelsNoResults for "models" operation
noticeNoGuidance when the result set is empty, the page is out of bounds, or limit was lowered to the page maximum.
offsetNoPagination offset used for this response
returnedNoNumber of results in the returned slice
operationNoThe operation that was performed
truncatedNoTrue when the "manufacturer" lookup stopped at its retrieval cap and further matches may exist upstream.
totalCountNoResults retrieved before pagination. For "manufacturer" this is capped — check the truncated field, since VPIC reports no match total.
vehicleTypesNoResults for "vehicle_types" operation
datasetModelsNoResults for "dataset_models" operation, sorted by name
manufacturersNoResults for "manufacturer" operation
effectiveQueryNoThe operation with key args, e.g. "models make=Toyota year=2020".

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Max results in the returned slice. Defaults to 100; max 200."New value: +"Results per page. Defaults to 100; at most 200 per page."
    • removedInput schema / properties / limit / maximum
      Removed value: -200
    • addedInput schema / properties / limit / multipleOf
      Added value: +1
    • changedInput schema / properties / limit / type
      Previous value: -"integer"New value: +"number"
    • changedInput schema / properties / make / description
      Previous value: -"Make name (required for \"models\" and \"vehicle_types\"). Partial match supported."New value: +"Make name (required for \"models\", \"vehicle_types\", and \"dataset_models\"). VPIC matches partial names in \"models\" and \"vehicle_types\"; \"dataset_models\" takes the full make name (e.g., \"Chevrolet\")."
    • changedInput schema / properties / modelYear / description
      Previous value: -"Filter models to a specific year, a whole number. Only for \"models\" operation."New value: +"Model year, a whole number. Filters \"models\" to that year; required for \"dataset_models\". Not accepted by other operations."
    • changedInput schema / properties / operation / description
      Previous value: -"\"makes\" (all NHTSA makes), \"models\" (models for a make), \"vehicle_types\" (types for a make), \"manufacturer\" (manufacturer details)."New value: +"\"makes\" (all VPIC makes), \"models\" (VPIC models for a make), \"vehicle_types\" (types for a make), \"manufacturer\" (manufacturer details), \"dataset_models\" (the model names NHTSA's complaint, NCAP, and VPIC lists carry for a make and model year; requires make and modelYear)."
    • changedInput schema / properties / operation / enum
      Previous value: -[
      -  "makes",
      -  "models",
      -  "vehicle_types",
      -  "manufacturer"
      -]New value: +[
      +  "makes",
      +  "models",
      +  "vehicle_types",
      +  "manufacturer",
      +  "dataset_models"
      +]
    • addedOutput schema / properties / datasetModels
      Added value: +{
      +  "description": "Results for \"dataset_models\" operation, sorted by name",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "A model name merged across the lists",
      +    "properties": {
      +      "listedBy": {
      +        "description": "Lists carrying this name: \"products\" (the names complaint searches match), \"ncap\" (the names NCAP rating searches match), \"vpic\" (VPIC base names, which some recall campaigns are filed under)",
      +        "items": {
      +          "enum": [
      +            "products",
      +            "ncap",
      +            "vpic"
      +          ],
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "modelName": {
      +        "description": "Model name, uppercase",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "modelName",
      +      "listedBy"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `inactive_argument`: An argument is not used by the chosen operation. `missing_operation_arg`: A required argument for the chosen operation was not provided. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `inactive_argument`: An argument is not used by the chosen operation. `missing_operation_arg`: A required argument for the chosen operation was not provided. `limit_too_large`: limit exceeds the 200-row page maximum on a server set to reject an over-maximum limit rather than lower it. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "inactive_argument",
      -  "missing_operation_arg"
      -]New value: +[
      +  "inactive_argument",
      +  "missing_operation_arg",
      +  "limit_too_large"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when the result set is empty or the page is out of bounds."New value: +"Guidance when the result set is empty, the page is out of bounds, or limit was lowered to the page maximum."
  2. Changed2 schema fields changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `missing_operation_arg`: A required argument for the chosen operation was not provided. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `inactive_argument`: An argument is not used by the chosen operation. `missing_operation_arg`: A required argument for the chosen operation was not provided. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "missing_operation_arg"
      -]New value: +[
      +  "inactive_argument",
      +  "missing_operation_arg"
      +]
  3. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "operation",
      +      "totalCount",
      +      "returned",
      +      "offset",
      +      "limit",
      +      "effectiveQuery"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `missing_operation_arg`: A required argument for the chosen operation was not provided. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "missing_operation_arg"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "operation",
      -  "totalCount",
      -  "returned",
      -  "offset",
      -  "limit",
      -  "effectiveQuery"
      -]
  4. Changed8 schema fields changed
    • changedInput schema / properties / modelYear / description
      Previous value: -"Filter models to a specific year. Only for \"models\" operation."New value: +"Filter models to a specific year, a whole number. Only for \"models\" operation."
    • addedInput schema / properties / modelYear / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / modelYear / minimum
      Added value: +-9007199254740991
    • changedInput schema / properties / modelYear / type
      Previous value: -"number"New value: +"integer"
    • addedOutput schema / properties / cap
      Added value: +{
      +  "description": "Maximum manufacturer records a single lookup retrieves.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / shown
      Added value: +{
      +  "description": "Manufacturer records retrieved before pagination, when the cap was reached.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / totalCount / description
      Previous value: -"Total results matching before pagination"New value: +"Results retrieved before pagination. For \"manufacturer\" this is capped — check the truncated field, since VPIC reports no match total."
    • addedOutput schema / properties / truncated
      Added value: +{
      +  "description": "True when the \"manufacturer\" lookup stopped at its retrieval cap and further matches may exist upstream.",
      +  "type": "boolean"
      +}
  5. Changed4 schema fields changed
    • addedOutput schema / properties / effectiveQuery
      Added value: +{
      +  "description": "The operation with key args, e.g. \"models make=Toyota year=2020\".",
      +  "type": "string"
      +}
    • removedOutput schema / properties / message
      Removed value: -{
      -  "description": "Contextual guidance populated when the result set is empty",
      -  "type": "string"
      -}
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Guidance when the result set is empty or the page is out of bounds.",
      +  "type": "string"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "operation",
      -  "totalCount",
      -  "returned",
      -  "offset",
      -  "limit"
      -]New value: +[
      +  "operation",
      +  "totalCount",
      +  "returned",
      +  "offset",
      +  "limit",
      +  "effectiveQuery"
      +]
  6. Changed5 schema fields changed
    • addedOutput schema / properties / makes / items / description
      Added value: +"A single make entry"
    • addedOutput schema / properties / manufacturers / items / description
      Added value: +"A single manufacturer entry"
    • addedOutput schema / properties / manufacturers / items / properties / vehicleTypes / items / description
      Added value: +"A single vehicle-type entry produced by this manufacturer"
    • addedOutput schema / properties / models / items / description
      Added value: +"A single model entry"
    • addedOutput schema / properties / vehicleTypes / items / description
      Added value: +"A single vehicle-type entry"
  7. Changed8 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"For \"makes\" only: maximum makes to return. Defaults to 100; max 200. Ignored for other operations."New value: +"Max results in the returned slice. Defaults to 100; max 200."
    • changedInput schema / properties / offset / description
      Previous value: -"For \"makes\" only: pagination offset into the full makes list. Defaults to 0. Ignored for other operations."New value: +"Pagination offset into the full result list. Defaults to 0."
    • changedInput schema / properties / operation / description
      Previous value: -"\"makes\" (paginated slice of all makes), \"models\" (models for a make), \"vehicle_types\" (types for a make), \"manufacturer\" (manufacturer details)."New value: +"\"makes\" (all NHTSA makes), \"models\" (models for a make), \"vehicle_types\" (types for a make), \"manufacturer\" (manufacturer details)."
    • removedOutput schema / properties / count
      Removed value: -{
      -  "description": "Number of results returned in this response",
      -  "type": "number"
      -}
    • addedOutput schema / properties / returned
      Added value: +{
      +  "description": "Number of results in the returned slice",
      +  "type": "number"
      +}
    • removedOutput schema / properties / totalAvailable
      Removed value: -{
      -  "description": "Total results available before pagination, when relevant",
      -  "type": "number"
      -}
    • addedOutput schema / properties / totalCount
      Added value: +{
      +  "description": "Total results matching before pagination",
      +  "type": "number"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "operation",
      -  "count"
      -]New value: +[
      +  "operation",
      +  "totalCount",
      +  "returned",
      +  "offset",
      +  "limit"
      +]
  8. Changed1 schema field changed
    • addedOutput schema / properties / message
      Added value: +{
      +  "description": "Contextual guidance populated when the result set is empty",
      +  "type": "string"
      +}
  9. Changed9 schema fields changed
    • addedInput schema / properties / limit
      Added value: +{
      +  "description": "For \"makes\" only: maximum makes to return. Defaults to 100; max 200. Ignored for other operations.",
      +  "maximum": 200,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / offset
      Added value: +{
      +  "description": "For \"makes\" only: pagination offset into the full makes list. Defaults to 0. Ignored for other operations.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedInput schema / properties / operation / description
      Previous value: -"\"makes\" (all makes — warning: 12K+ results), \"models\" (models for a make), \"vehicle_types\" (types for a make), \"manufacturer\" (manufacturer details)."New value: +"\"makes\" (paginated slice of all makes), \"models\" (models for a make), \"vehicle_types\" (types for a make), \"manufacturer\" (manufacturer details)."
    • changedOutput schema / properties / count / description
      Previous value: -"Number of results"New value: +"Number of results returned in this response"
    • addedOutput schema / properties / limit
      Added value: +{
      +  "description": "Pagination limit used for this response",
      +  "type": "number"
      +}
    • changedOutput schema / properties / manufacturers / items / properties / country / description
      Previous value: -"Country of origin"New value: +"Country of origin when provided"
    • changedOutput schema / properties / manufacturers / items / required
      Previous value: -[
      -  "manufacturerId",
      -  "manufacturerName",
      -  "country",
      -  "vehicleTypes"
      -]New value: +[
      +  "manufacturerId",
      +  "manufacturerName",
      +  "vehicleTypes"
      +]
    • addedOutput schema / properties / offset
      Added value: +{
      +  "description": "Pagination offset used for this response",
      +  "type": "number"
      +}
    • addedOutput schema / properties / totalAvailable
      Added value: +{
      +  "description": "Total results available before pagination, when relevant",
      +  "type": "number"
      +}
  10. First observed

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, and the description adds real domain behavior on top: VPIC names diverge from complaint/NCAP names (Silverado vs SILVERADO 1500) and recall results can be split across a series name and a base name. It stops short of describing result shape, empty-response semantics, or pagination behavior, which the schema and output schema partly cover, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the capability, then the naming caveat, then the concrete recovery workflow. Every sentence carries information; the only mild cost is density, since the naming-mismatch and recall-splitting points are packed into single long clauses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter, five-operation lookup tool with full schema coverage, annotations, and an output schema, the description supplies exactly the missing piece: the cross-dataset naming pitfall and the follow-up search procedure. Nothing an agent needs to invoke it correctly or interpret a thin result is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including per-operation requirements for make, modelYear, and manufacturer, so the baseline is 3. The description reinforces why make and modelYear matter for dataset_models and the full-vs-partial make distinction, but it does not add syntax, defaults, or constraints beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource set: looking up makes, models, vehicle types and manufacturer details in NHTSA's VPIC catalog, plus a second mode listing the model names NHTSA datasets use for a make/year. It also distinguishes this from the complaint and NCAP siblings by naming the naming mismatch between them, so an agent can tell which tool to reach for without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit conditional trigger: when a recall, complaint, or rating search comes back empty or partial, call operation="dataset_models" with make and modelYear, then re-search under each name returned. It also states an exclusion-like rule for recalls (search both series name and base name, since no list enumerates recall names), which is genuine when-to-use and when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.