Skip to main content
Glama
vin-decode-mcp

vin-decode-mcp

by joakes90

vin-decode-mcp

Декодируйте VIN-номера и запрашивайте данные о транспортных средствах из курируемой базы данных NHTSA vPIC — на базе Model Context Protocol.

Автономный MCP-сервер для LLM, поддерживающий работу без подключения к сети, для декодирования идентификационных номеров транспортных средств (VIN) и поиска марок, моделей и технических характеристик автомобилей с использованием данных NHTSA's vPIC.

pip install vin-decode-mcp
vin-decode-mcp  # Start the MCP server

Зачем?

  • Офлайн: работает без доступа в интернет. Курируемая база данных SQLite (~4.5 MB) является автономной.

  • Без лимитов запросов: в отличие от прямого вызова vPIC API, локальные запросы не ограничены.

  • Быстро: сопоставление с шаблонами в базе данных SQLite занимает микросекунды.

  • Ориентированность на LLM: инструменты с подробными docstrings, ресурсами схем и структурированным JSON-выводом.

  • Открытые данные: NHTSA vPIC — это открытые данные правительства США: бесплатно, без необходимости API-ключа.

Related MCP server: VIN MCP

Охват данных

  • Автомобили для рынка США, модельный год 1981 и новее

  • 534 марки, 9 175 моделей, 88 140 VIN-шаблонов

  • Легковые автомобили, грузовики, многоцелевые автомобили, мотоциклы, внедорожники

  • Исключены: автобусы, прицепы, тихоходные транспортные средства, незавершённые транспортные средства

Только технические характеристики — эта база данных не включает историю владения, аварий, одометра или историю угонов (для этого требуются данные NMVTIS/коммерческих источников).

Быстрый старт

Установка

pip install vin-decode-mcp

Или из исходного кода:

git clone https://github.com/<org>/vin-decode-mcp.git
cd vin-decode-mcp
pip install -e .

Запуск

# Default: stdio transport (for Claude Desktop, Cursor, etc.)
vin-decode-mcp

# HTTP transport
vin-decode-mcp --transport http --port 8765

Использование с Claude Desktop

Добавьте в ~/.config/claude-desktop/config.json (или ~/Library/Application Support/claude-desktop/config.json на macOS):

{
  "mcpServers": {
    "vin-decode": {
      "command": "vin-decode-mcp"
    }
  }
}

Перезапустите Claude Desktop. Теперь модель может использовать инструменты декодирования VIN в диалогах.

Доступные инструменты

Инструмент

Описание

decode_vin(vin, model_year?)

Декодирует VIN → марку, модель, год, тип транспортного средства

decode_partial_vin(pattern, limit?)

Сопоставляет частичный VIN с подстановочными символами *

get_all_makes()

Список всех марок транспортных средств

get_models_for_make(make, vehicle_type?)

Список моделей для марки

get_model_years(make, model)

Диапазон годов выпуска

get_wmi_info(wmi)

Декодирует WMI → информацию о производителе

get_vehicle_types()

Список доступных типов транспортных средств

get_make_vehicle_types(make)

Список типов транспортных средств для марки

Примеры

>>> 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": "X5", "year": 2011, "confidence": "partial_match"}]

База данных

Загрузка

Скомпилированная база данных размещена на Hugging Face:

Набор данных: https://huggingface.co/datasets/vin-decode-mcp/vpic-database Прямая загрузка: https://huggingface.co/datasets/vin-decode-mcp/vpic-database/resolve/main/vpic_decode.db

Пользовательский путь к базе данных

# Set via environment variable
export VIN_MCP_DB_PATH=/path/to/vpic_decode.db
vin-decode-mcp

# Or via CLI flag
vin-decode-mcp --db-path /path/to/vpic_decode.db

Пересборка

База данных пересобирается из автономных баз данных PostgreSQL NHTSA примерно каждые 6-12 месяцев:

# 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 vpic_lite.db
# 3. Build curated database
python3 tools/build_db.py --source vpic_lite.db --output vpic_decode.db

Инструкции по настройке Hugging Face см. в docs/hf-setup.md.

Источник данных и атрибуция

Данные о транспортных средствах получены из NHTSA's vPIC — Vehicle Product Information Catalog and Vehicle Listing агентства National Highway Traffic Safety Administration. NHTSA является правительственным агентством США.

  • Лицензия на данные: результат работы правительства США (общественное достояние)

  • API: ключ и регистрация не требуются

  • Частота обновления: ~6-12 месяцев

  • Сообщение об ошибках: обращайтесь в службу поддержки производителей NHTSA по адресу manufacturerinfo@dot.gov или по телефону 1-888-399-3277

Архитектура

User / LLM Agent
       │
       ▼  MCP (stdio / HTTP)
┌──────────────────┐
│  vin-decode-mcp  │  pip install vin-decode-mcp
│  (FastMCP server)│  env: VIN_MCP_DB_PATH=/path/to/vpic_decode.db
└────────┬─────────┘
         │  sqlite3 (mode=ro)
         ▼
┌──────────────────┐
│ vpic_decode.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
└──────────────────┘

Структура проекта

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
│   ├── rebuild.sh               # Full rebuild script
│   ├── build_db.py              # Curated DB builder (orchestrator for the pipeline)
│   ├── 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 tests
│   ├── test_server.py           # Bulk lookup tests
│   └── 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.md
└── vpic_pare_down.py            # Pare-down pipeline (original)

Разработка

# 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/

Сравнение с другими решениями

vin-decode-mcp

NHTSA vPIC API

vin-mcp (NLMA)

Транспорт

Локальная SQLite

HTTP REST

HTTP REST

Офлайн

✅

❌

❌

Лимит запросов

Нет

Да

Да

Размер данных

~4.5 MB

N/A

N/A

Поля VIN

Марка + Модель + Год

~130 полей

~130 полей

Марки/Модели

✅ 534/9 175

✅ Полный каталог

✅ Полный каталог

Установка

pip install

Не требуется

pip install

Лицензия

MIT License — код распространяется по лицензии MIT. Данные — общественное достояние правительства США.

Подробнее см. в LICENSE.

Участие в разработке

Вклад приветствуется! Пожалуйста:

  1. Сделайте форк и создайте ветку для новой функции

  2. Добавьте тесты для новой функциональности

  3. Убедитесь, что CI проходит

  4. Отправьте pull request

Для значительных изменений сначала откройте issue, чтобы обсудить подход.

Available Tools

8 tools
decode_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.

NameRequiredDescriptionDefault
limitNoMaximum number of results (default 20).
patternYesPartial VIN with * wildcards (e.g. "5UXWX7C5*BA").

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
vinYesVehicle Identification Number (17 chars, or shorter for partial).
model_yearNoOptional explicit model year to improve decode accuracy. If omitted, computed from VIN position 10 + position 7.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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").

NameRequiredDescriptionDefault
makeYesMake name (e.g. "BMW"). Case-insensitive.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

NameRequiredDescriptionDefault
makeYesMake name (e.g. "Honda"). Case-insensitive. Use get_all_makes() to list valid names; numeric make IDs are not accepted here.
vehicle_typeNoOptional vehicle type filter ("Passenger Car", "Motorcycle", "Truck", etc.).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
makeYesMake name (e.g. "Porsche"). Case-insensitive.
modelYesModel name (e.g. "911"). Case-insensitive.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

NameRequiredDescriptionDefault
wmiYesWMI code (3 chars for high-volume, 6 for low-volume manufacturers).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 8 tool updatesv0.1.0
    • First observeddecode_partial_vin
    • First observeddecode_vin
    • First observedget_all_makes
    • First observedget_make_vehicle_types
    • First observedget_model_years
    • First observedget_models_for_make
    • First observedget_vehicle_types
    • First observedget_wmi_info

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Enables 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.
    61
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides 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.
    8 npm
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Exposes 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
    -