vin-decode-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@vin-decode-mcpDecode VIN 1HGCM82633A004352"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
vin-decode-mcp
Decode VINs and query vehicle data from a curated NHTSA vPIC database — powered by the Model Context Protocol.
A standalone, offline-capable MCP server for LLMs to decode Vehicle Identification Numbers (VINs) and look up makes, models, and vehicle specifications using data from NHTSA's vPIC.
pip install vin-decode-mcp
vin-decode-mcp # Start the MCP serverWhy?
Offline: Works without internet access. The curated SQLite database (~4.5 MB) is self-contained.
No rate limits: Unlike calling the vPIC API directly, local queries are unlimited.
Fast: Pattern matching against the SQLite database takes microseconds.
LLM-native: Tools with rich docstrings, schema resources, and structured JSON output.
Open data: NHTSA vPIC is US government open data — free, no API key required.
Related MCP server: VIN MCP
Data Coverage
US-market vehicles, model year 1981 and forward
536 makes, 9,284 models, 88,267 VIN patterns (2026-08 vintage)
Passenger Cars, Trucks, MPVs, Motorcycles, Off-Road Vehicles
Excludes: Buses, Trailers, Low-Speed Vehicles, Incomplete Vehicles
Specifications only — this database does not include title, accident, odometer, or theft history (those require NMVTIS/commercial data sources).
Quick Start
Installation
pip install vin-decode-mcpOr from source:
git clone https://github.com/<org>/vin-decode-mcp.git
cd vin-decode-mcp
pip install -e .Running
# Default: stdio transport (for Claude Desktop, Cursor, etc.)
vin-decode-mcp
# HTTP transport
vin-decode-mcp --transport http --port 8765Using with Claude Desktop
Create a dedicated venv so the binary lands where you can reference it:
python3 -m venv ~/.local/venvs/vin-decode
source ~/.local/venvs/vin-decode/bin/activate
pip install vin-decode-mcp
deactivateAdd to ~/.config/claude-desktop/config.json (or ~/Library/Application Support/claude-desktop/config.json on macOS):
{
"mcpServers": {
"vin-decode": {
"command": "~/.local/venvs/vin-decode/bin/vin-decode-mcp"
}
}
}Replace the path with wherever you put the venv. Restart Claude Desktop. The model can now use VIN decoding tools in conversations.
Note: Claude Desktop spawns processes with a minimal
$PATHthat doesn't include conda environments or virtualenvs, so always use the absolute path to the binary — just putting"vin-decode-mcp"won't work.
Available Tools
Tool | Description |
| Decode a VIN → make, model, year, vehicle type |
| Match a partial VIN with |
| List all vehicle makes |
| List models for a make |
| Get production year range |
| Decode a WMI → manufacturer info |
| List available vehicle types |
| List vehicle types for a make |
Examples
>>> decode_vin("1HGCM82633A004352")
{
"vin": "1HGCM82633A004352",
"make": "Honda",
"model": "Accord",
"year": 2003,
"vehicle_type": "Passenger Car",
"wmi": "1HG",
"confidence": "full"
}
>>> get_model_years("Porsche", "911")
{"year_from": 1981, "year_to": null}
>>> decode_partial_vin("5UXWX7C5*BA")
[{"make": "BMW", "model": "X3", "year": 2011,
"vehicle_type": "Passenger Car", "confidence": "partial_match"}]Database
Download
The compiled database is hosted on Hugging Face:
Dataset: https://huggingface.co/datasets/joakes90/vpic-database Direct download: https://huggingface.co/datasets/joakes90/vpic-database/resolve/main/curated_vpic.db
Custom Database Path
# Set via environment variable
export VIN_MCP_DB_PATH=/path/to/curated_vpic.db
vin-decode-mcp
# Or via CLI flag
vin-decode-mcp --db-path /path/to/curated_vpic.dbRebuilding
The database is rebuilt from NHTSA's standalone PostgreSQL databases approximately every 6-12 months:
# Requires PostgreSQL installed (pg_restore, psql)
bash tools/rebuild.sh
# Or step by step:
# 1. Download NHTSA data: https://vpic.nhtsa.dot.gov/Downloads/
# 2. Convert to SQLite
python3 tools/convert_to_sqlite.py --input dump.sql --output tools/out/vpic_lite.db
# 3. Build curated database
python3 tools/build_db.py --source tools/out/vpic_lite.db --output tools/out/curated_vpic.dbSee docs/hf-setup.md for Hugging Face setup instructions.
Data Source & Attribution
Vehicle data sourced from NHTSA's vPIC — the National Highway Traffic Safety Administration's Vehicle Product Information Catalog and Vehicle Listing. NHTSA is a United States government agency.
Data license: US Government work (public domain)
API: No key or registration required
Refresh frequency: ~6-12 months
Report errors: Contact the NHTSA Manufacturer Helpdesk at manufacturerinfo@dot.gov or 1-888-399-3277
Architecture
User / LLM Agent
│
▼ MCP (stdio / HTTP)
┌──────────────────┐
│ vin-decode-mcp │ pip install vin-decode-mcp
│ (FastMCP server)│ env: VIN_MCP_DB_PATH=/path/to/curated_vpic.db
└────────┬─────────┘
│ sqlite3 (mode=ro)
▼
┌──────────────────────┐
│ curated_vpic.db │ ~4.5 MB, curated
│ (Hugging Face) │ makes + models + WMI + VIN patterns
└──────────────────────┘
▲
│ rebuilds from
┌──────────────────┐
│ NHTSA vPIC PG DB │ 69 MB, official
│ (NHTSA website) │ refreshed 2x/year
└──────────────────┘Project Structure
vin-decode-mcp/
├── src/vin_decode_mcp/
│ ├── __init__.py # Package init
│ ├── server.py # FastMCP server with all tools
│ ├── database.py # SQLite layer + VIN decoder
│ └── cli.py # CLI entry point
├── tools/
│ ├── build_db.py # Pipeline orchestrator
│ ├── convert_to_sqlite.py # PG → SQLite converter (COPY text format)
│ ├── vpic_pare_down.py # Curated pare-down + VIN decode tables
│ ├── rebuild.sh # Full rebuild script
│ ├── curation.json # Make/model curation rules
│ ├── overlay.json # Grey-import classic additions
│ └── README.md # Rebuild instructions
├── tests/
│ ├── conftest.py # Test fixtures
│ ├── test_decode.py # VIN decode canary + regression tests
│ ├── test_server.py # Bulk lookup tests
│ ├── test_convert.py # PostgreSQL COPY decoding tests
│ ├── test_real_db.py # Smoke tests against the curated DB
│ └── fixtures/
│ ├── build_test_db.py # Test database builder
│ └── test_vpic.db # Minimal test database
├── .github/workflows/
│ ├── ci.yml # CI: test + lint
│ └── rebuild-db.yml # Scheduled DB rebuild
├── docs/
│ └── hf-setup.md # Hugging Face setup guide
├── pyproject.toml
├── LICENSE
└── README.mdDevelopment
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
python -m pytest tests/ -v
# Lint
python -m ruff check src/ tests/
# Format
python -m ruff format src/ tests/Comparison with Other Solutions
vin-decode-mcp | NHTSA vPIC API | vin-mcp (NLMA) | |
Transport | Local SQLite | HTTP REST | HTTP REST |
Offline | ✅ | ❌ | ❌ |
Rate limited | No | Yes | Yes |
Data size | ~4.5 MB | N/A | N/A |
VIN fields | Make + Model + Year | ~130 fields | ~130 fields |
Makes/Models | ✅ 536/9,284 | ✅ Full catalog | ✅ Full catalog |
Install |
| None |
|
License
MIT License — Code is MIT. Data is US Government public domain.
See LICENSE for details.
Contributing
Contributions welcome! Please:
Fork and create a feature branch
Add tests for new functionality
Ensure CI passes
Submit a pull request
For major changes, open an issue first to discuss the approach.
Available Tools
8 toolsdecode_partial_vinDecode Partial VinA
Decode a partial VIN pattern with wildcards.
Supports * as a wildcard for exactly one character (matching the vPIC pattern format). Useful for matching a VIN you don't have the full 17 characters of, or for pattern-based lookups.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 20). | |
| pattern | Yes | Partial VIN with * wildcards (e.g. "5UXWX7C5*BA"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden and does well by explaining that * matches exactly one character and that it follows the vPIC pattern format. It does not discuss edge cases, errors, or authorization, but the operation is a read-only decode, and the output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded: the first sentence states the core purpose, and the second adds wildcard semantics and use cases. Every sentence contributes useful information without redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with an output schema and fully documented parameters, the description is nearly complete. It explains when to use the tool and the wildcard behavior, though it could be slightly more explicit about how this differs from decoding a full VIN.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value beyond the schema by specifying that the wildcard matches exactly one character and that the format aligns with vPIC. This clarifies pattern semantics beyond the schema's brief example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it decodes partial VIN patterns with wildcards, using a specific verb and resource. It differentiates from sibling decode_vin by emphasizing partial patterns and wildcard matching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says the tool is useful when you don't have the full 17-character VIN or need pattern-based lookups. It does not explicitly name decode_vin as the alternative for full VINs, but the context makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decode_vinDecode VinA
Decode a VIN to make, model, year, and vehicle type.
Returns the decoded make, model, model year, and vehicle type for a 17-character VIN. Uses the NHTSA vPIC pattern database for make/model resolution. Model year is computed from VIN position 10 unless you provide model_year explicitly.
Partial VINs (shorter than 17 characters) may still decode if the WMI (positions 1-3) matches a known manufacturer.
| Name | Required | Description | Default |
|---|---|---|---|
| vin | Yes | Vehicle Identification Number (17 chars, or shorter for partial). | |
| model_year | No | Optional explicit model year to improve decode accuracy. If omitted, computed from VIN position 10 + position 7. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclose useful context: use of the NHTSA vPIC database, model-year derivation from VIN position 10, and the WMI condition for partial VINs. It is slightly inaccurate because the schema says model year is computed from position 10 plus position 7, while the description omits position 7.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs move from purpose to return details to edge-case behavior, with the core action front-loaded. The return list in the first and second sentences is slightly redundant ('make, model, year' vs 'make, model, model year'), but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main behavior, data source, and partial-VIN edge case, and an output schema exists for return values. The major missing context is how this tool relates to decode_partial_vin, which is a sibling that appears to overlap, leaving the agent with no basis for choosing between them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining the model_year override behavior ('unless you provide model_year explicitly') and by specifying the WMI positions relevant for partial decoding, though the model-year formula inconsistency slightly qualifies the added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence 'Decode a VIN to make, model, year, and vehicle type' states a specific verb and resource, and the second paragraph names concrete outputs. However, it does not distinguish itself from sibling decode_partial_vin, and its partial-VIN caveat actually blurs the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given for when to use this tool over decode_partial_vin or when to avoid it. The statement that partial VINs may decode provides input tolerance, but not a decision rule; an agent cannot tell which decode tool to choose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_makesGet All MakesA
List all vehicle makes registered in vPIC.
Returns every make currently in the curated database. This includes makes from all vehicle types (cars, trucks, motorcycles, etc.) that passed the curation filter.
Returns: List of dicts with keys: id, name. Sorted alphabetically by name.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It explains the curation filter, that all vehicle types are included, the exact return shape (list of dicts with id and name), and alphabetical sorting — substantial transparency for a listing endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, then scopes the data ('all vehicle types', 'curation filter'), and finishes with a precise return contract. The only minor overlap is between 'registered in vPIC' and 'curated database,' but both add distinct context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list endpoint, the description is complete: it states what data is returned, the inclusion criteria, the output structure, and ordering. The presence of an output schema further covers return details, and no behavior needed to invoke the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and the schema already covers 100% of properties, so the baseline is 4. The description adds no parameter syntax, which is appropriate because no parameters exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List all vehicle makes registered in vPIC.' It reinforces the scope with 'every make currently in the curated database' and the return structure, making it easy to distinguish from siblings like get_models_for_make or decode_vin.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tool's zero-parameter, all-makes purpose makes its usage context clear, but the description does not explicitly name alternatives or give when-not-to-use guidance. Since siblings are all more specific (decoding VINs, model lookups), the intended use is still evident without exclusion statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_make_vehicle_typesGet Make Vehicle TypesA
List the vehicle types a given make produces.
Useful for understanding what categories a manufacturer covers (e.g. BMW produces "Motorcycle", "Passenger Car", "Truck").
| Name | Required | Description | Default |
|---|---|---|---|
| make | Yes | Make name (e.g. "BMW"). Case-insensitive. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the burden. It clearly indicates a read-only listing behavior, but it does not state how unknown makes are handled, whether results are sorted, or whether any special permissions are required. For a simple query tool this is acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences front-load the core operation and follow with a concrete useful example. No filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter lookup with an output schema, the description covers purpose and an example. It does not address the boundary with the sibling get_vehicle_types, which would be useful for disambiguation, but the tool is simple enough that this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the make parameter is documented with type, example, and case-insensitivity. The tool description adds only a contextual example, so it does not meaningfully extend the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific operation ('List') and resource ('vehicle types a given make produces'), which clearly distinguishes it from siblings like get_all_makes and get_models_for_make. The BMW example reinforces the scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence explicitly frames the appropriate use case: understanding what categories a manufacturer covers. It does not enumerate exclusions or name alternative tools, but the context is clear enough for the common case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_models_for_makeGet Models For MakeA
List all models for a given make.
Optionally filter by vehicle type to narrow results (e.g. get only car models or only motorcycle models for a make that produces both).
| Name | Required | Description | Default |
|---|---|---|---|
| make | Yes | Make name (e.g. "Honda"). Case-insensitive. Use get_all_makes() to list valid names; numeric make IDs are not accepted here. | |
| vehicle_type | No | Optional vehicle type filter ("Passenger Car", "Motorcycle", "Truck", etc.). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry the behavioral burden. The verb 'List' transparently signals a read-only operation, and the description states the optional narrowing behavior with a concrete example. It does not go into error cases or edge behavior, but for a simple look-up tool the core behavior is adequately disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loading the main purpose and then clarifying the optional filter with an example. Every sentence contributes; there is no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple 2-parameter shape, complete schema descriptions, and presence of an output schema, the description covers what an agent needs for a correct call. The only minor gap is the absence of explicit routing guidance among siblings, but that is not essential for this tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters at 100% coverage, so the baseline is 3. The description adds value by explaining that vehicle_type narrows the result set and by giving the car-versus-motorcycle example, reinforcing the parameter's intended effect. It doesn't add new details about the make parameter beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear directive: 'List all models for a given make.' This names the exact verb, resource, and scope, and the optional vehicle_type filter explains the only variant. It is easy to distinguish from siblings such as get_all_makes or get_model_years because the tool's target resource is explicitly 'models'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes the obvious use case—retrieving models for a specified make—and the optional filtering context. However, it never explicitly says when to prefer this over sibling lookup tools or when not to use it, leaving tool selection to inference from the names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_model_yearsGet Model YearsA
Get the model year range for a make/model pair.
| Name | Required | Description | Default |
|---|---|---|---|
| make | Yes | Make name (e.g. "Porsche"). Case-insensitive. | |
| model | Yes | Model name (e.g. "911"). Case-insensitive. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. 'Get the model year range' indicates a read-only lookup and gives a hint about the output shape, but it does not disclose edge cases such as unsupported make/model pairs or empty results. It does not contradict any annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no redundant wording. The action, resource, and scope are all present and front-loaded, which is appropriate for a tool of this simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a simple two-required-parameter lookup, full schema descriptions, and an existing output schema, the description is mostly sufficient for an agent to select and call the tool. It lacks explicit sibling routing, but the tool's straightforward shape makes the overall definition adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage for the two parameters, including examples and case-insensitivity notes. The description adds only the general notion of a make/model pair, so it does not meaningfully go beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Get') and a distinct resource ('model year range') scoped to a make/model pair, which differentiates it from sibling tools like get_all_makes and get_models_for_make. However, it does not explicitly name or exclude any sibling, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'for a make/model pair' qualifier implies the intended use case, and the required parameters reinforce it. But the description gives no explicit when-to-use vs alternatives guidance, no exclusions, and no mention of related tools like get_models_for_make when only a make is known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vehicle_typesGet Vehicle TypesA
List all available vehicle types.
Returns the vehicle types in the curated dataset (e.g. Passenger Car, Motorcycle, Truck, MPV, Off-Road Vehicle).
Returns: List of dicts with keys: id, name.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It clearly indicates this is a read-only listing operation and discloses the return shape as a list of dicts with keys 'id' and 'name', plus representative values. It could mention sorting or deterministic ordering, but for a zero-parameter lookup this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the primary action. There is minor redundancy between 'List all available vehicle types' and 'Returns the vehicle types in the curated dataset', but the examples and explicit return keys make the extra text worthwhile.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list endpoint, the description is complete: it states the scope, gives example values, and specifies the output structure. The only notable gap is not addressing the similar sibling get_make_vehicle_types, but that is more of a usage-guidance concern.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the description cannot add parameter-level meaning. The baseline for 0-parameter tools is 4, and the description appropriately focuses on what is returned rather than input details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List all available vehicle types') on a clear resource, and adds example values that make the scope concrete. It also distinguishes itself from get_make_vehicle_types by emphasizing 'all' rather than a make-specific subset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool through 'all available vehicle types', but it does not explicitly contrast it with the sibling get_make_vehicle_types or state when a make-filtered alternative would be preferred. There is no direct when-to-use / when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wmi_infoGet Wmi InfoA
Decode a World Manufacturer Identifier (WMI).
Returns manufacturer information for a 3- or 6-character WMI code (VIN positions 1-3, optionally + positions 12-14 for low-volume manufacturers).
| Name | Required | Description | Default |
|---|---|---|---|
| wmi | Yes | WMI code (3 chars for high-volume, 6 for low-volume manufacturers). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of explaining behavior. It communicates that this is a read-only lookup and defines the acceptable input scope, but it does not mention error handling, case sensitivity, or response format details. For a simple lookup tool, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no filler. The core purpose is front-loaded, and the additional positional detail earns its place by improving input accuracy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup with an output schema present, the description is essentially complete: it defines the input, its valid lengths, and the nature of the return value. Minor gaps like invalid-input behavior or character normalization are not critical for selecting and invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the wmi parameter well, so the baseline is 3. The description adds useful context about VIN positions and the low-volume manufacturer scenario, which helps an agent construct a valid WMI argument beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Decode') and resource ('World Manufacturer Identifier'), and clarifies it handles 3- or 6-character WMI codes rather than full VINs. This clearly distinguishes it from siblings like decode_vin and decode_partial_vin.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly signals the intended context: use this when you have a WMI code and need manufacturer information. It does not explicitly name sibling alternatives or state when not to use it, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
8 tool updates
v0.1.0- First observed
decode_partial_vin - First observed
decode_vin - First observed
get_all_makes - First observed
get_make_vehicle_types - First observed
get_model_years - First observed
get_models_for_make - First observed
get_vehicle_types - First observed
get_wmi_info
TDQS
Most tools are clearly separated by resource and action: decode_* covers VIN/WMI decoding, get_* covers lookup tables. The only potential confusion is between decode_vin and decode_partial_vin, since decode_vin already accepts short VINs, though the wildcard/pattern use case is explicitly distinguished.
All tool names follow a consistent verb_noun pattern starting with decode_ or get_, and resource nouns are used predictably. The naming makes the set easy to scan and understand.
Eight tools is well-scoped for a VIN decoding and vehicle reference server. Each lookup tool has a clear purpose and the count is neither too sparse nor bloated.
The server covers the core VIN decode workflow (full and wildcard partial VINs, WMI info) and the supporting reference queries needed to explore makes, models, model years, and vehicle types. There are no obvious dead ends for the stated domain.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Machine-readable utilities and datasets for AI agents.
- SnipgetOAuthai.snipget
300+ deterministic data utilities for AI agents: validate, normalize, parse, match, redact.
Deterministic web intake and data utilities for autonomous agents.
1Neutral freight reference + validation layer for AI agents: ADR, HS, UN/LOCODE, freight math
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables access to comprehensive vehicle information including VIN decoding, license plate OCR, vehicle history checks (theft, title, salvage records), market valuations, specifications, and warranty data for vehicles across North America and Europe.611MIT
- AlicenseNot gradedqualityDmaintenanceProvides comprehensive vehicle reports by aggregating data from multiple public sources to decode VINs, check recalls, and view safety ratings. It enables users to validate VINs locally and retrieve technical specifications, fuel economy, and vehicle photos without requiring API keys.16MIT
- FlicenseAqualityCmaintenanceExposes a connected-vehicle OBD-II/telematics platform to AI agents, enabling vehicle health scoring, live data queries, DTC decoding, maintenance prediction, and gated remote commands via a pluggable data layer.9-
- AlicenseAqualityBmaintenanceConnects Claude to NHTSA vehicle safety data, enabling VIN decoding, recall checks, crash-test ratings, and consumer complaints via natural language.5MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/joakes90/vin-decode-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server