mcpField
D
Decode VIN

Decode VIN

本地服务
github.com法律与政务01 天前更新

关于 Decode VIN

nitrovin 是面向开发者和车辆数据工作流的离线 VIN 解码器,内置一个月的 NHTSA vPIC 数据。它通过命令行、HTTP、库和 MCP 提供一致的解码结果。

主要功能

  1. 01使用内置 vPIC 数据离线解码 VIN
  2. 02解码部分填写或有误的 VIN
  3. 03支持文本、JSON 和详细输出格式
  4. 04翻译并列出车辆词汇表
  5. 05提供命令行、HTTP、stdio、Go 和 C 接口

适用场景

  1. 01在无网络环境中解码 VIN
  2. 02通过命令行批量处理 VIN
  3. 03从 MCP 客户端查询车辆信息

MCP 相关

通过 stdio MCP 提供 `decode_vin`、`translate` 和 `list` 工具,也可在 `/mcp` 使用 Streamable HTTP。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"joshuasprow-nitrovin": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/joshuasprow/nitrovin:v0.3.7"
]
}
}
}
启动命令docker run -i --rm ghcr.io/joshuasprow/nitrovin:v0.3.7

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocighcr.io/joshuasprow/nitrovin:v0.3.7

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

nitrovin

一款离线 VIN 解码器,解码结果与 NHTSA 的 vPIC 一致。它是 spVinDecode 的 Go 移植版;spVinDecode 是 NHTSA 在其每月更新的 vPIC 数据库中发布的解码程序。nitrovin 以单个二进制文件发布,其中内置了一个月的 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 行、供 AI 助手使用的 MCP 服务、Go 模块和 C 库。 nitrovin.app 为所有人运行最新版本的服务:表单、/v1 API(开放 CORS)和 MCP 端点 https://nitrovin.app/mcp,并按 IP 限流。

状态:v0.x 预发布版本。 v0 表示发布流程尚未最终签署通过,并不意味着 API 可能变更:接口契约已在 /v1 冻结。v1.0.0 还需通过 ADR 0007 中的关卡。 nitrovin 与 NHTSA 无关联,也未获其认可。

安装

每个版本都内置一个月的 vPIC 数据;nitrovin --version 会显示数据所属月份。

渠道命令平台
Homebrewbrew install joshuasprow/tap/nitrovinmacOS、Linux
Scoopscoop bucket add joshuasprow https://github.com/joshuasprow/scoop-bucket 然后运行 scoop install nitrovinWindows amd64、arm64
wingetJoshuaSprow.Nitrovin,尚未提交(#78)Windows
Dockerdocker run --rm -p 8080:8080 ghcr.io/joshuasprow/nitrovinlinux/amd64、linux/arm64
Go 1.27+go install github.com/joshuasprow/nitrovin/cmd/nitrovin@latestGo 可构建的所有平台
压缩包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>.apklinux 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 镜像默认以非 root 用户运行 nitrovin serve --addr :8080,也可用其他命令替代(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;卸载软件包时会移除这三个文件。它们是发布附件,而非软件包仓库,因此没有任何机制会为 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 也会解码
model_year无已知的车型年份,作为提示
shapevpicvpic:vPIC 的 DecodeVinValues 键(Make、BodyClass);nitrovin:按变量名作为键,并包含元素和属性 ID
fullfalse添加 items,包含 NHTSA 程序输出的每一行及其来源和模式
now当前时间解码所依据的时刻;固定该值可获得可复现的输出

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,可选地在后面加逗号或制表符,再附上车型年份。无论错误代码为何,只要每个 VIN 都已解码,退出状态就是 0;如果 nitrovin 无法作答(数据无法加载、输入行被拒绝),则为 1;如果命令行中有误,例如参数中的 VIN 超过 17 个字符,则为 2。问题会以一行 JSON 的形式输出到 stderr。 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、可选的车型年份、格式和 full。表单由服务器渲染,每个解码结果都有可分享的 URL(/?vin=1HGCM82633A004352)。解码结果会按 vPIC 的分组显示元素(在 vpic 格式下,空值会隐藏,除非另行请求),以 NHTSA 的措辞显示错误代码,显示标出差异位置的建议 VIN,提供指向 NHTSA 解码器中相同 VIN 的链接,以及可供复制的解码 JSON、URL、curl 和 nitrovin decode 等效命令。空表单会说明如何安装、配置 MCP 并验证此版本,还提供指向其发布版本和数据月份的链接。唯一的脚本 /copy.js 用于添加复制按钮;即使没有 JavaScript,其他功能仍可正常使用,文本也仍可选中。该表单不属于 API:它未包含在 OpenAPI 文档中,且可能会更改。

POST /v1/decode 最多接收 1,000 个请求,并按顺序返回解码结果数组;POST /v1/translate 对翻译请求执行相同操作,GET /v1/translate 则通过带点号的查询参数接收单个请求(from.vocabulary=yard&from.entry.make=Dodge&from.entry.model=Ram%201500)。GET /v1/vocabularies 会列出已加载的词汇表,GET /v1/vocabularies/{name}/entries 会分页列出其中一个词汇表 (翻译,列表)。拒绝请求时会返回符合 RFC 9457 规范的 application/problem+json,其中包含指向违规值的 pointer。GET /v1/openapi.json 提供 OpenAPI 3.1 文档;GET /healthz 是探测端点。除非使用 --cors <origin>(或 --cors '*')指定允许调用 /v1 和 /mcp 的浏览器,否则不会发送 CORS 标头。收到 SIGINT 或 SIGTERM 后,服务会等待正在处理的请求完成,然后以状态码 0 退出。

stdio(JSON 行)
printf '{"id":1,"vin":"1HGCM82633A004352"}\n{"id":2,"vin":"5YJ3E1EA2JF000316","shape":"nitrovin"}\nnot json\n' | nitrovin stdio

每行输入一个请求,每个请求按顺序输出一行,并在每行后立即刷新:{"id": …, "decode": {…}} 或 {"id": …, "error": {…}}。包含 "op": "translate" 或 "op": "list" 的行则会通过 --vocab 文件执行翻译或列表操作,并在回复中以 translation 或 list 为键。格式错误的行会收到一行错误回复,之后会继续处理会话;遇到 EOF 时会结束会话。这是从另一种语言中保持一个解码器进程持续运行的最简单方式(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 输出的绝对路径:桌面应用无法读取 shell 的 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 会通过 /mcp 提供同一个服务,使用无状态的 Streamable HTTP 和 JSON 响应,适用于接受 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 请求,并原样返回 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 合约为权威说明。

验证发布版本

发布版本使用 cosign 进行签名,采用来自 GitHub Actions 的无密钥签名:无需获取密钥,证书会标明构建该发布版本的工作流。每个资源文件都有一个 <asset>.sigstore.json bundle,并在 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> 可直接验证单个资源文件。来自其他工作流或标签的签名都会被拒绝。

数据

这些数据来自 NHTSA 的 vPIC(车辆产品信息目录)。NHTSA 每月在下载页面发布一次 Postgres 转储文件,本项目移植的解码过程就包含在该转储文件中。NHTSA 的使用条款指出,这些信息“被视为公共信息,可以分发或复制”,且 NHTSA 不对其提供任何担保;作为美国政府的作品,它不受版权保护(17 U.S.C. § 105)。相关依据见转储文件研究。 参见 NOTICE。

数据月份(YYYY_MM)标识一个转储文件。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、数据月份和解码器版本共同决定,并会携带这五项信息;这五项相同,输出的字节就相同。实时 vPIC 使用的数据比任何月度转储都新,因此在同一天,它给出的结果可能与 nitrovin 不同。

词汇表

你为车辆和零件类型取的名称(例如车辆场的库存名称、零件目录的代码)可以作为词汇表文件,与数据一同加载;nitrovin 会将 VIN 或名称转换为每个已加载词汇表中的对应名称。文件采用 JSON Lines 格式,包含一个标题行和每个条目各一行 (vocabulary.schema.json),分为三种类型:词汇表将条目映射到 vPIC 的品牌和车型(按 ID 映射,可选车型年份范围和 Drive Type 等限定词),或映射到零件类型主干;扩展集用于创建 vPIC 中缺少的车辆;主干声明零件词汇表映射到的零件类型。 匹配采用一种固定的标准化方式(大小写和空格)后进行精确匹配;规则和模糊匹配由创建文件的人负责。 docs/vocabularies.md 介绍如何编写词汇表、检查词汇表,以及如何在每个界面上进行转换和列出词汇表。

使用 --vocab(可重复,适用于任何命令)或 NITROVIN_VOCAB 指定文件或目录。文件存在错误时,nitrovin 将无法启动;如果文件与数据月份不一致(例如某个 ID 已被 NHTSA 删除),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.jsonl,这是一个词汇表,其中列出了 EPA 燃油经济性数据 (vehicles.csv)提供的品牌和车型名称,并将其映射到当月 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 也不会加载任何词汇表。

一致性

nitrovin 对 VIN 的解码结果与 NHTSA 程序的结果一致,而非近似结果:程序输出的每一行、全部 15 列、精确字符串,均按每个 VIN 作为多重集进行比较。不设容差,也没有针对特定 VIN 的例外名单。作为对照的基准,是在 Postgres 17 中使用当月数据转储运行 NHTSA 自己的 spvindecode,并清空一张过时的缓存表:转储中缓存的有效字符与转储自身的模式行相矛盾,而实时 vPIC 的回答与重新计算的结果一致。这是唯一登记的偏差,即 stale-cache;受其影响的语料库 VIN 会随每个数据版本一同列出。

v0.1.2 中的 2026_10 数据通过了 刷新运行 42662006323: 18,339 次调用和 966,232 行数据,0 项不一致;当月 13,014 个 WMI 全部得到覆盖,25,293 个 VinSchema 中有 25,283 个得到覆盖;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 的流程不一致,则这是一个 bug,除非已登记的类别 能证明 NHTSA 数据存在缺陷,并提供机械检测器,以及一个实时 vPIC 与 nitrovin 结果一致的 VIN(ADR 0006、 登记表)。目前有一个类别。
  • vpic 布局与实时 DecodeVinValues 并非逐字节一致。 它没有 VIN 键,包含 PlantAddress,缺少 vPIC 中始终为空的 10 个旧版键;对于多值元素,它按字节顺序拼接,而 vPIC 的顺序 不稳定(详情)。奇偶校验仅针对两种布局共同构建所依据的项目。
  • 元素名称和代码属于数据,而非 API。 NHTSA 会按月更改这些名称;对于任何需要长期使用的内容,请固定 element_id 和 attribute_id。
  • 超过 17 个字符的输入会被拒绝。 NHTSA 的流程会因此抛出错误,所以没有可匹配的结果。
  • 不能直接替代 vPIC 的 URL。 serve 使用自己的 /v1 路由,而非 vPIC 的 /api/vehicles/...。
  • winget 尚未上线(#78)。 macOS 二进制文件未经公证(参见安装)。
  • C 库无法卸载;在 Linux 上需要 glibc 2.17+(不支持 musl),在 macOS 上需要 11+。

性能

在 Apple M5 Pro 的单核上,v0.1.2 通过带 JSON 输出的 nitrovin decode - 每秒可解码约 17,600 个 VIN(在 GOMAXPROCS=1 下,解码 25,000 个语料库 VIN 用时 1.42 秒);处理一个 VIN 的 nitrovin decode 进程耗时约 6 毫秒,占用 22 MB 内存。

贡献

欢迎提交问题和拉取请求。CONTRIBUTING.md 介绍了构建、测试、在自己的机器上运行 Postgres oracle,以及涉及解码的更改规则。决策记录位于 docs/adr/,术语见 GLOSSARY.md,计划见 wayfinder 地图。

致谢与许可

MIT 许可证,详见 LICENSE。数据来自 NHTSA。该移植项目的结构、 奇偶校验方法和偏差登记表参考了 Bryce Drennan 的 ultravin(MIT)这一参考实现;未复制任何 ultravin 源代码, 而已提交的奇偶校验语料库包含 ultravin 的 VIN 列表。详情见 NOTICE。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。