Decode VIN について
nitrovin は、開発者や車両データのワークフロー向けのオフライン VIN デコーダーです。NHTSA vPIC の月次データを内蔵し、CLI、HTTP、ライブラリ、MCP で一貫した結果を返します。
主な機能
- 01内蔵 vPIC データによるオフライン VIN デコード
- 02一部入力や誤記のある VIN のデコード
- 03テキスト、JSON、詳細な出力形式
- 04車両用語集の翻訳と一覧表示
- 05CLI、HTTP、stdio、Go、C の各インターフェース
活用シーン
- 01ネットワークなしでの VIN デコード
- 02コマンドラインでの VIN 一括処理
- 03MCP クライアントからの車両情報検索
MCP 対応
stdio MCP で `decode_vin`、`translate`、`list` ツールを提供し、`/mcp` では Streamable HTTP も利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/joshuasprow/nitrovin:v0.3.7ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/joshuasprow/nitrovin:v0.3.7stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
nitrovin
NHTSA の vPIC のように回答する、オフラインの VIN デコーダーです。NHTSA が毎月公開している vPIC データベースに含まれるデコード手順 spVinDecode を Go に移植したもので、1 か月分の vPIC データを内蔵した単一のバイナリとして提供されます。ネットワークも、データベースも、API キーも必要ありません。
各月のデータは、公開前に Postgres 上で実行する NHTSA 独自の手順と照合されます。18,318 件の VIN コーパスに含まれるすべての VIN の全行が、バイト単位で一致しなければ、その月のデータは公開されません(パリティの意味)。
$ nitrovin decode -o text 1HGCM82633A004352 | grep -E '^(VIN|Make|Manufacturer Name|Model|Model Year|Body Class|Plant City|Error Code) '
VIN 1HGCM82633A004352
Body Class Coupe
Make HONDA
Manufacturer Name AMERICAN HONDA MOTOR CO., INC.
Model Accord
Model Year 2003
Plant City MARYSVILLE
Error Code 0
これらは、この VIN のデコード結果である 43 要素のうち 7 つです(--shape nitrovin で一覧表示できます)。
同じデコードを、CLI、HTTP サーバー、stdio 経由の JSON lines、AI アシスタント向け MCP サーバー、Go モジュール、C ライブラリの 6 通りで利用できます。nitrovin.app では、誰でも最新リリースのサーバーを利用できます。フォーム、/v1 API(CORS はオープン)、および https://nitrovin.app/mcp の MCP があり、IP ごとにレート制限されています。
ステータス:v0.x プレリリース。 v0 はリリースパイプラインの承認がまだ完了していないことを示すもので、API が変更される可能性を意味するものではありません。コントラクトは /v1 で凍結されています。v1.0.0 の公開は、ADR 0007 のゲートが満たされるまで保留されています。nitrovin は NHTSA とは提携しておらず、NHTSA の推奨を受けているものでもありません。
- インストール
- 使い方:CLI、HTTP、stdio、MCP、Go、C
- リリースの検証
- データ
- 語彙:車両名と部品の種類名を独自の名称に変換します
- パリティ
- 既知の制限
- パフォーマンス
- コントリビューション
- クレジットとライセンス
インストール
各リリースには、1 か月分の vPIC データが組み込まれています。nitrovin --version でその月を確認できます。
| 配布方法 | コマンド | プラットフォーム |
|---|---|---|
| Homebrew | brew install joshuasprow/tap/nitrovin | macOS、Linux |
| Scoop | scoop bucket add joshuasprow https://github.com/joshuasprow/scoop-bucket の後に scoop install nitrovin | Windows amd64、arm64 |
| winget | JoshuaSprow.Nitrovin。まだ申請されていません(#78) | Windows |
| Docker | docker run --rm -p 8080:8080 ghcr.io/joshuasprow/nitrovin | linux/amd64、linux/arm64 |
| Go 1.27+ | go install github.com/joshuasprow/nitrovin/cmd/nitrovin@latest | Go がビルドできる環境 |
| アーカイブ | GitHub Releases:nitrovin_<version>_<os>_<arch>.tar.gz(Windows は .zip) | linux、darwin、windows × amd64、arm64 |
| Linux パッケージ | 同じリリースから入手できます:sudo apt install ./nitrovin_<version>_linux_<arch>.deb、sudo dnf install ./nitrovin_<version>_linux_<arch>.rpm、sudo apk add --allow-untrusted ./nitrovin_<version>_linux_<arch>.apk | linux amd64、arm64 |
| C ライブラリ | 同じリリースから入手できます:libnitrovin_<version>_<os>_<arch> | linux、darwin、windows × amd64、arm64 |
$ nitrovin --version
nitrovin v0.1.2 (data 2026_10)
バイナリは約 70 MB で、その大部分をデータが占めます。アーカイブは約 21 MB です。Docker イメージは、デフォルトで nitrovin serve --addr :8080 を非 root ユーザーとして実行します。また、別のコマンドを指定すると、そのコマンドを実行します(docker run --rm ghcr.io/joshuasprow/nitrovin decode 1HGCM82633A004352)。タグは vX.Y.Z、vX.Y、vX、latest、data-<YYYY_MM> です。
Linux パッケージは /usr/bin/nitrovin をインストールし、LICENSE と NOTICE を /usr/share/doc/nitrovin に配置します。パッケージを削除すると、これら 3 つすべてが削除されます。これらはリリースアセットであり、パッケージリポジトリではないため、apt、dnf、apk 向けの署名はありません(そのため --allow-untrusted が必要です)。インストール前に cosign で検証するか、
TAG=v0.1.5
cosign verify-blob --bundle nitrovin_${TAG#v}_linux_amd64.deb.sigstore.json \
--certificate-identity https://github.com/joshuasprow/nitrovin/.github/workflows/release.yml@refs/tags/$TAG \
--certificate-oidc-issuer https://token.actions.githubusercontent.com nitrovin_${TAG#v}_linux_amd64.deb
リリースの検証の説明に従って、checksums.txt と照合してください。
バイナリは Apple による公証を受けていません。Homebrew を使うと、隔離フラグが自動的に削除されます。ブラウザーでダウンロードした macOS バイナリは、次の操作を行うまで起動時に停止されます。
xattr -d com.apple.quarantine nitrovin
使い方
どのインターフェースでも同じリクエストを受け取り、同じデコード結果を返します (API コントラクト):
| リクエストフィールド | デフォルト | 意味 |
|---|---|---|
vin | 必須 | 1~17 文字です。一部のみ(*)の VIN や、入力を間違えた VIN もデコードされます |
model_year | なし | すでに分かっているモデル年のヒントです |
shape | vpic | vpic:vPIC の DecodeVinValues キー(Make、BodyClass)です。nitrovin:変数名をキーとし、element ID と attribute ID を含みます |
full | false | items を追加します。NHTSA の手順で出力されるすべての行と、その出典およびパターンが含まれます |
now | 現在時刻 | デコード結果の基準となる時点です。再現可能な出力にするには固定してください |
VIN がエラーになることはありません。VIN の問題は error_codes(vPIC のコードで、[0] は問題なし)に示され、手順で候補が提示される場合は corrected_vin と候補値も含まれます。すべてのデコードには data_month と decoder_version が含まれます。
CLI
nitrovin decode 1HGCM82633A004352 # JSON, pretty on a terminal
nitrovin decode -o text --model-year 2003 1HGCM82633A004352 # two columns
nitrovin decode --shape nitrovin --full 1HGCM82633A004352 # by variable name, with items
printf '1HGCM82633A004352,2003\n5YJ3E1EA2JF000316\n' | nitrovin decode - # one JSON line per VIN
nitrovin info # version, data month, artifact hash, elements
decode - は VIN を 1 行につき 1 つ読み込み、必要に応じてカンマまたはタブの後にモデル年を指定できます。すべての VIN がデコードされた場合は、エラーコードにかかわらず終了ステータスは 0 です。nitrovin が応答できない場合(読み込めないデータや拒否された入力行)は 1、コマンドライン上の誤り(引数で指定した VIN が 17 文字を超える場合など)は 2 です。問題は stderr に JSON の 1 行として出力されます。
CLI コントラクト。
HTTP
nitrovin serve # 127.0.0.1:8080; --addr, or $PORT, to change
curl localhost:8080/v1/decode/1HGCM82633A004352
curl 'localhost:8080/v1/decode/1HGCM82633A004352?model_year=2003&shape=nitrovin'
curl localhost:8080/v1/decode -d '[{"vin":"1HGCM82633A004352"},{"vin":"5YJ3E1EA2JF000316","shape":"nitrovin"}]'
curl localhost:8080/v1/info
curl 'localhost:8080/v1/translate?from.vin=1HGCM82633A004352'
curl localhost:8080/v1/vocabularies
curl 'localhost:8080/v1/vocabularies/vpic/entries?where.make=474&limit=5'
アドレスをブラウザーで開くと、VIN、任意のモデル年、shape、full を指定できるデコードフォームが表示されます。フォームはサーバー側でレンダリングされ、各デコードは共有可能な URL(/?vin=1HGCM82633A004352)になります。デコード結果には、vPIC のグループ別にまとめられた要素(vpic shape では、指定するまで空の値は非表示)、NHTSA の表記によるエラーコード、異なる位置を示した候補 VIN、NHTSA のデコーダーで同じ VIN を開くリンク、コピーできるデコード結果の JSON、URL、curl、nitrovin decode の各形式が表示されます。空のフォームには、インストール方法、MCP の設定方法、このバージョンの確認方法が記載され、リリースとデータ月へのリンクもあります。唯一のスクリプト /copy.js はコピーボタンを追加します。JavaScript がなくてもその他の機能はすべて動作し、テキストを選択できます。フォームは API の一部ではなく、OpenAPI ドキュメントにも含まれていないため、変更される可能性があります。
POST /v1/decode は最大 1,000 件のリクエストを受け付け、順序どおりにデコード結果の配列を返します。POST /v1/translate も同様に translate リクエストを処理します。GET /v1/translate では、ドット区切りのクエリパラメーターでリクエストを 1 件指定します(from.vocabulary=yard&from.entry.make=Dodge&from.entry.model=Ram%201500)。GET /v1/vocabularies は読み込み済みの項目を一覧表示し、GET /v1/vocabularies/{name}/entries はその項目をページ分割して表示します(Translation、Listing)。リクエストが拒否された場合は、問題の値を示す pointer を含む application/problem+json(RFC 9457)が返されます。GET /v1/openapi.json はOpenAPI 3.1 ドキュメントを提供し、GET /healthz は稼働状態を確認するエンドポイントです。--cors <origin>(または --cors '*')で /v1 と /mcp を呼び出せるブラウザーを指定しない限り、CORS ヘッダーはありません。SIGINT または SIGTERM を受信すると、処理中のリクエストを完了してから終了コード 0 で終了します。
stdio(JSON Lines)
printf '{"id":1,"vin":"1HGCM82633A004352"}\n{"id":2,"vin":"5YJ3E1EA2JF000316","shape":"nitrovin"}\nnot json\n' | nitrovin stdio
入力は 1 行につき 1 リクエスト、出力はリクエストごとに 1 行で、順序どおりに各行の出力後すぐにフラッシュされます。形式は {"id": …, "decode": {…}} または {"id": …, "error": {…}} です。"op": "translate" または "op": "list" を含む行では、--vocab ファイルを使って翻訳または一覧表示を行い、応答のキーは translation または list になります。不正な行にはエラー行を返し、セッションは継続します。EOF で終了します。別の言語からデコーダープロセスを 1 つ起動したままにする最も簡単な方法です(docker run --rm -i ghcr.io/joshuasprow/nitrovin stdio でも動作します)。
stdio コントラクト。
MCP
nitrovin mcp は stdio 経由で動作する MCP サーバーで、引数が上記のリクエストである decode_vin と、--vocab が読み込む語彙に基づいて応答する translate および list のツールを提供します
(ツールの定義)。Claude Desktop(macOS では
~/Library/Application Support/Claude/claude_desktop_config.json、Windows では %APPDATA%\Claude\claude_desktop_config.json)および Cursor
(~/.cursor/mcp.json)では、同じエントリを使用します:
{
"mcpServers": {
"nitrovin": {
"command": "/opt/homebrew/bin/nitrovin",
"args": ["mcp"]
}
}
}
which nitrovin が出力する絶対パスを使用してください。デスクトップアプリからはシェルの
PATH が見えないためです。代わりに Docker を使う場合は、"command": "docker" と
"args": ["run", "--rm", "-i", "ghcr.io/joshuasprow/nitrovin", "mcp"] を指定します。
MCP Registry からインストールするクライアントでは、このサーバーを io.github.joshuasprow/nitrovin として見つけられます。リリースタグの Docker イメージを mcp を指定して実行します。
クライアントを使わずに試すには、スニペットを claude_desktop_config.json として保存し、MCP Inspector でツールを呼び出します:
npx @modelcontextprotocol/inspector --cli --config claude_desktop_config.json --server nitrovin \
--method tools/call --tool-name decode_vin --tool-arg vin=1HGCM82633A004352
nitrovin serve は、ステートレスで JSON レスポンスを返す同じサーバーを /mcp で Streamable HTTP 経由で提供します。コマンドの代わりに URL を指定するクライアント向けです("url": "http://127.0.0.1:8080/mcp"):
npx @modelcontextprotocol/inspector --cli http://127.0.0.1:8080/mcp --transport http \
--method tools/call --tool-name decode_vin --tool-arg vin=1HGCM82633A004352
または、インストール不要のホスト版 https://nitrovin.app/mcp を使用します。
Go モジュール
go get github.com/joshuasprow/nitrovin/pkg/nitrovin@latest
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/joshuasprow/nitrovin/pkg/contract"
"github.com/joshuasprow/nitrovin/pkg/nitrovin"
)
func main() {
d, err := nitrovin.Embedded() // or nitrovin.Open("nitrovin-2026_10.artifact")
if err != nil {
log.Fatal(err)
}
req, err := contract.ParseRequest([]byte(`{"vin": "1HGCM82633A004352"}`))
if err != nil {
log.Fatal(err)
}
dec, err := d.Decode(req) // a VIN is never an error: see dec.ErrorCodes
if err != nil {
log.Fatal(err)
}
out, err := json.Marshal(dec)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(out))
}
Decoder は並行使用しても安全です。nitrovin.Embedded は約 61 MB のデータをバイナリにリンクします。このデータはモジュールのダウンロードにも含まれています(github.com/joshuasprow/nitrovin-data の 20 MB の zip ファイル)。一方、nitrovin.Open はアーティファクトファイルを読み込みます。Embedded を呼び出さないバイナリにはデータは含まれません。すべての pkg/ パッケージは公開 API です:
pkg.go.dev。
C ライブラリ
libnitrovin(.so、.dylib、.dll)と nitrovin.h にはデータは含まれません:
nitrovin_open は、nitrovin-data のリリースからアーティファクトを読み込みます。これは --data が読み込むものと同じファイルです。
nitrovin_decode は stdio のリクエスト行を 1 行受け取り、nitrovin stdio が書き込むものと完全に同じ応答行を返します。nitrovin_open_vocab は、translate と list の行で使用するために、隣接する語彙を含むアーティファクトを開きます
(C ライブラリ)。
#include <stdio.h>
#include "nitrovin.h"
int main(void) {
char *err = NULL;
nitrovin_t *h = nitrovin_open("nitrovin-2026_10.artifact", &err);
if (h == NULL) {
fprintf(stderr, "%s\n", err);
nitrovin_free(err);
return 1;
}
char *reply = nitrovin_decode(h, "{\"id\":1,\"vin\":\"1HGCM82633A004352\"}");
puts(reply); /* {"id":1,"decode":{...}}, as `nitrovin stdio` writes it */
nitrovin_free(reply);
nitrovin_close(h);
return 0;
}
cc -o decode decode.c -L. -lnitrovin -Wl,-rpath,. && ./decode
返された文字列はすべて nitrovin_free で解放してください。free() は使用せず、ライブラリもアンロードしないでください。docs/c-library.md にダウンロード方法、ctypes を使った Python からの利用方法、および各種ルールが記載されています;
C ABI の仕様が正式な情報源です。
リリースの検証
リリースには、GitHub Actions による cosign のキーレス署名が付与されています。取得する鍵は不要で、証明書にはリリースをビルドしたワークフローが記載されています。各アセットには <asset>.sigstore.json バンドルと checksums.txt 内の行が用意されています。
nitrovin の場合は、ダウンロードしたアセットのディレクトリで実行します:
TAG=v0.1.2
cosign verify-blob --bundle checksums.txt.sigstore.json \
--certificate-identity https://github.com/joshuasprow/nitrovin/.github/workflows/release.yml@refs/tags/$TAG \
--certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
sha256sum --check --ignore-missing checksums.txt
cosign verify ghcr.io/joshuasprow/nitrovin:$TAG \
--certificate-identity https://github.com/joshuasprow/nitrovin/.github/workflows/release.yml@refs/tags/$TAG \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
nitrovin-data の場合は、データリリースを対象にします(タグではなく main から署名されています):
cosign verify-blob --bundle checksums.txt.sigstore.json \
--certificate-identity https://github.com/joshuasprow/nitrovin-data/.github/workflows/release.yml@refs/heads/main \
--certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
sha256sum --check checksums.txt
cosign verify-blob --bundle <asset>.sigstore.json … <asset> を使うと、アセットを 1 つずつ直接検証できます。ほかのワークフローまたはタグによる署名は拒否されます。
データ
データは、NHTSA の vPIC(Vehicle Product Information Catalog)です。NHTSA は毎月、ダウンロードページで Postgres ダンプとして公開しており、このプロジェクトが移植したデコード手順はそのダンプに含まれています。NHTSA の利用規約には、この情報は「公開情報とみなされ、配布またはコピーできる」と記載されており、NHTSA は一切の保証を否認しています。また、米国政府の著作物であるため著作権はありません(17 U.S.C. § 105)。この内容の根拠となるダンプの調査結果はこちらです。NOTICEを参照してください。
データ月(YYYY_MM)は、1つのダンプを表します。nitrovin はダンプをアーティファクトに変換します。これは、同じダンプから変換すれば常に同じバイト列になる、61 MB のインデックス付きファイルです。nitrovin-dataはこれを v<format>.<YYYYMM>.<rebuild>(v1.202610.1)としてリリースします。各データリリースには、アーティファクト、NHTSA のダンプ zip(NHTSA によるホスティング終了後もその月のデータを再確認できるようにするため)、manifest.json(ダンプの URL、サイズ、SHA-256、アーティファクトの blake3、行数、インポーターのコミット)、その月の固定されたパリティキー、古いキャッシュのリスト、EPA の語彙(語彙)が永久に保持されます。
$ nitrovin info | jq '{decoder_version, data_month, data_source, artifact_hash}'
{
"decoder_version": "v0.1.2",
"data_month": "2026_10",
"data_source": "embedded",
"artifact_hash": "blake3:7518c5b46c4264fe94a8e5158cb1949b000e50803b36d388fec9ebe914a780cb"
}
別の月のデータでデコードするには、そのアーティファクトをダウンロードし、--data(任意のコマンドで使用可能)または NITROVIN_DATA に指定します。優先順位は --data、NITROVIN_DATA、埋め込みデータの順です。
nitrovin --data nitrovin-2026_10.artifact info
NITROVIN_DATA=nitrovin-2026_10.artifact nitrovin serve
アーティファクトは、その形式のメジャーバージョンがバイナリのものと一致する場合に読み込まれます(現在の形式は 1 です)。一致しない場合は、両方のバージョンを示すエラーになります。NHTSA が新しい月のデータを公開すると、自動更新によってビルドとゲートチェックが行われ、合格すれば、すべてのチャネルを通じてそのデータを含む nitrovin のパッチリリースが公開されます。そのため、新しいデータを取得するには nitrovin を更新します。チェックに不合格となった月のデータはリリースされず、前月のデータが引き続き最新となります。nitrovin updateはありません。
デコードは、VIN、モデルイヤーのヒント、now、データ月、デコーダーバージョンの5つを入力とする関数であり、その5つすべてを保持します。同じ5つの入力からは、同じバイト列が得られます。ライブの vPIC は月次ダンプより新しいデータで動作するため、同じ日でも nitrovin とは異なる回答を返すことがあります。
ボキャブラリー
車両名や部品タイプ名(ヤードの在庫名、部品カタログのコードなど)は、ボキャブラリーファイルとしてデータと一緒に読み込まれます。nitrovin は VIN または名前を、読み込まれたすべてのボキャブラリーの名前に変換します。ファイルは JSON Lines 形式で、ヘッダーとエントリーごとの 1 行からなります(vocabulary.schema.json。種類は次の 3 つです。ボキャブラリーは、エントリーを vPIC のメーカーとモデル(ID による指定で、モデルイヤーの範囲や Drive Type などの修飾子を任意で指定できます)、または部品タイプのスパインに対応付けます。拡張セットは、vPIC にない車両を追加します。スパインは、部品ボキャブラリーの対応先となる部品タイプを定義します。一律の正規化(大文字小文字とスペース)の後に完全一致で照合されます。ルールやあいまい一致は、ファイルを作成する側に委ねられています。
docs/vocabularies.mdでは、ボキャブラリーの作成、検証、あらゆるインターフェースでの変換と一覧表示の方法を説明しています。
--vocab(繰り返し指定可能で、任意のコマンドで使用できます)または NITROVIN_VOCAB で、ファイルまたはディレクトリを指定します。不備のあるファイルがあると nitrovin の起動は停止します。ファイルの内容がデータ月と一致しない場合(たとえば、NHTSA が削除した ID など)、nitrovin は標準エラー出力と nitrovin info に警告を表示しますが、そのまま提供します。nitrovin vocab check は CI 向けに、どちらの場合も失敗します。チェックアウトから、testdata/vocab 内の合成ボキャブラリーを使って実行する場合:
nitrovin vocab check testdata/vocab
nitrovin --vocab testdata/vocab list # what is loaded
nitrovin --vocab testdata/vocab list yard --where make=dodge # a vocabulary's entries, paged
nitrovin --vocab testdata/vocab translate --to yard 1C6RR7LT5FS123456 # a VIN to your names
nitrovin --vocab testdata/vocab serve # /v1/translate, /v1/vocabularies
各データリリースには、EPA の燃費データ(vehicles.csv)に記載されたメーカー名とモデル名を集めたボキャブラリー epa-vehicles.jsonl も含まれます。これは、その月の vPIC のメーカーとモデルに対応付けられており、名前から読み取れる場合は Drive Type と Series の修飾子も付与されます。月次更新では、その日の vehicles.csv を新しい月のデータと照合して作成し、不備なく読み込めた場合にのみ公開します。バージョンは EPA の最新レコードの日付とデータ月(2026-11-03+2026_10)で構成され、更新 PR には差分が報告されます。バイナリに組み込まれている月のリリース(nitrovin --version で確認できます)、または最新リリースからダウンロードしてください。
curl -fsSLO https://github.com/joshuasprow/nitrovin-data/releases/latest/download/epa-vehicles.jsonl
nitrovin --vocab epa-vehicles.jsonl info | jq '.vocabularies[] | {name, version, drift}'
nitrovin --vocab epa-vehicles.jsonl translate --to epa-vehicles 1C6RR7LT5FS123456
別の月を基に作成されたボキャブラリーも読み込めますが、NHTSA が変更した ID ごとに差分の警告が表示されます。同じリリースにある checksums.txt にも含まれています(リリースの検証)。nitrovin に同梱されるボキャブラリーはほかになく、nitrovin.appもボキャブラリーを読み込みません。
同等性
VIN に対する nitrovin の回答は、NHTSA の手順による回答そのものであり、近似値ではありません。手順が出力するすべての行と 15 個の列を、文字列の完全一致で VIN ごとの多重集合として比較します。許容誤差はなく、VIN ごとの例外リストもありません。照合基準は、対象月のダンプを使い、Postgres 17 上で実行した NHTSA 独自の spvindecode です。ただし、古いキャッシュテーブルを 1 つ空にしています。ダンプにある有効文字のキャッシュは、同じダンプにあるパターン行と矛盾しており、実際の vPIC は再計算した結果と同じ回答を返すためです。これが登録済みの唯一の差異、stale-cacheです。これに該当するコーパスの VIN は、各データリリースに記載されています。
v0.1.2 の 2026_10 データは、更新実行 42662006323に合格しました。18,339 回の呼び出しと 966,232 行で不一致は 0 件でした。その月の 13,014 個の WMI すべてと 25,293 個中 25,283 個の VinSchema に到達し、stale-cache に該当する呼び出しは 52 件でした。また、差異を示す 7 つの証拠すべてが、253 個のフィールドで実際の vPIC と一致しました。レポートは更新 PRの本文にあります。
docs/parity.mdでは、コーパスとゲート、各月のレポートの掲載場所、およびリリースの同等性チェックを自分で数秒で再実行する方法を説明しています。
既知の制限
- 10 個の VinSchema は一度も実行されません。 2026_10 では、試したすべての VIN で、スキーマ 4329、5046、 6173、11117、11146、11395、11396、13555、15597、21187 は、同じ WMI と年の別の スキーマに負けるため、条件を満たす VIN がこれらに到達しません (実行 42662006323、 #72)。
- 差異はクラスであり、VIN ではありません。 nitrovin が NHTSA の手順と異なる場合、NHTSA のデータに欠陥があることを登録済みのクラスが証明し、機械的な検出器と、実際の vPIC が nitrovin と一致する VIN が示されない限り、バグです (ADR 0006、 レジストリ)。クラスは 1 つあります。
vpicのレイアウトは、実際のDecodeVinValuesとバイト単位で一致しません。VINキーがなく、PlantAddressがあり、vPIC の常に空のレガシーキー 10 個がなく、複数値の要素は、順序が不安定な vPIC とは異なりバイト順で結合されます (詳細)。パリティ検証の対象は、両方のレイアウトが基にする項目に限られます。- 要素名とコードはデータであり、API ではありません。 NHTSA は月ごとに名前を変更するため、長期にわたって使用するものには
element_idとattribute_idを固定してください。 - 17 文字を超える VIN は拒否されます。 NHTSA の手順はその場合にエラーを発生させるため、照合できる結果はありません。
- vPIC の URL とそのまま置き換えることはできません。
serveには独自の/v1ルートがあり、vPIC の/api/vehicles/...ルートはありません。 - winget はまだ利用できません (#78)。 macOS バイナリは公証されていません(インストールを参照)。
- C ライブラリはアンロードできず、Linux では glibc 2.17 以降が必要です(musl は非対応)。macOS では 11 以降が必要です。
パフォーマンス
Apple M5 Pro の 1 コアで、v0.1.2 は JSON 出力で nitrovin decode - を実行すると、毎秒約 17,600 件の VIN をデコードします(GOMAXPROCS=1 で 25,000 件のコーパス VIN を 1.42 秒で処理)。1 件の VIN を処理する nitrovin decode プロセスは、約 6 ms、メモリ 22 MB を要します。
貢献
Issue やプルリクエストを歓迎します。CONTRIBUTING.md では、ビルド、テスト、お使いのマシンでの Postgres オラクル、およびデコードに関わる変更のルールについて説明しています。判断の記録は
docs/adr/、用語は GLOSSARY.md、計画は
wayfinder map にあります。
クレジットとライセンス
MIT。詳しくは LICENSE を参照してください。データは NHTSA のものです。この移植版の構成、パリティ検証の手法、差異レジストリは、リファレンス実装である Bryce
Drennan による ultravin(MIT)に倣っています。ultravin のソースコードはコピーしていませんが、コミット済みのパリティコーパスには ultravin の VIN リストが含まれています。詳細は NOTICE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。