内容
# 危险品法规查询工具
完整的49 CFR 172.101危险品表格,作为AI代理的MCP工具 - 每个字段都引用了固定的eCFR修订版。
[](https://github.com/andretaki/hazmat-cfr-mcp/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/hazmat-cfr-mcp)
[](https://modelcontextprotocol.io/)
[](LICENSE)

为Claude、Cursor、Codex和其他MCP客户端提供DOT危险品查询、分类和验证工具,支持完整的危险品表格 - 而不是样本。
询问代理:
> 我可以在仅限货物的飞机上运输60 L的丙酮吗?它的标签、包装和特殊规定要求是什么?
它返回正确的运输名称、危险类别、包装组、标签代码、包装参考、飞机限制、船舶存放、解码的特殊规定和CFR引用 - 以结构化的JSON格式。
使用方法有两种:
- `hazmat-cfr-mcp` - 代理的MCP_stdio服务器
- `hazmat-cfr` - 用于人类、测试和脚本的本地CLI
无需API密钥。无需客户数据。无需承运人合同。无需NMFC。仅限公共CFR。
## 工具内容
- **约2,700个危险品表格条目**(49 CFR 172.101)- 每个UN/NA条目以及禁止物质,直接从官方eCFR中提取。
- **特殊规定解码** - 所有约420个第7列代码(49 CFR 172.102:数字,A,B,IB,IP,N,R,T,TP,W)扩展为其监管文本。
- **图例解码** - 第1列符号(`+ A D G I W`),第10A列船舶存放类别和第8A-8C列包装参考解析为第173部分。
- **固定到一个有日期的eCFR快照**,因此每个答案都可重现并引用到确切的修订版。
- **精选的同义词/CAS层**,使得“IPA”,“盐酸”或“漂白剂”能够解析 - 清楚地与监管数据分开。
## 10秒试用
```bash
npx -y hazmat-cfr-mcp --help
npx -y hazmat-cfr lookup UN1088 # 不是在任何“样本”中 - 这里有整个表格
npx -y hazmat-cfr decode-sp IB2 T8 A3
```
## 为什么存在
基础模型在监管运输细节方面很弱。它们可能知道什么是丙酮,但它们不应该猜测运输描述是否完整,`IB2`是什么意思,或者哪个CFR字段支持标签要求。
该服务器为代理提供了一个明确的、引用的、**完整的**危险品工具表面,以便它们用法规而不是幻觉来回答。
## 准确性和验证
这是一个与合规相关的工具,因此正确性由构建过程强制执行,而不是靠希望:
- 数据集是从eCFR版本API生成的,并提交到存储库(参见[docs/data-pipeline.md](docs/data-pipeline.md))。它从不被手动编辑。
- 如果表格引用的任何特殊规定代码在172.102中无法解析,则摄取 **失败**(文档源错误,例如`IP16`,被解析为明确的“已引用但未定义”注释 - 绝不捏造)。
- `test/data-integrity.test.ts`重新检查条目计数、结构有效性、引用完整性和约22个手动验证的现成检查。
- 解析器针对`test/fixtures/`中的固定进行单元测试。
> ⚠️ **免责声明。** 这是一个信息辅助工具,旨在提供公共CFR文本。 **不是法律建议**,不是合规认证,也不是受过培训的危险品员工的替代品。始终将任何运输决定与当前的[eCFR](https://www.ecfr.gov/current/title-49)进行验证。
## 安装和运行
```bash
npx hazmat-cfr-mcp # MCP_stdio服务器
npx hazmat-cfr lookup UN1090 # CLI
```
从克隆:
```bash
git clone https://github.com/andretaki/hazmat-cfr-mcp.git
cd hazmat-cfr-mcp
npm install
npm run build
npm run demo
```
CLI:
```bash
npx hazmat-cfr lookup UN1090
npx hazmat-cfr requirements UN1830 # 运输所需的一切,一个调用
npx hazmat-cfr placard 2.3
npx hazmat-cfr validate "UN1090, Acetone, 3, PG II"
npx hazmat-cfr segregation 3 5.1 8
npx hazmat-cfr lq 3 II 1000 12 true
npx hazmat-cfr decode-sp IB2 T8 A3
npx hazmat-cfr decode-pkg nonBulk 202
```
## MCP客户端配置
```json
{
"mcpServers": {
"hazmat-cfr": {
"command": "npx",
"args": ["hazmat-cfr-mcp"]
}
}
}
```
对于本地检查,指向`command`到`node`,并指向`args`到`dist/server.js`。
## 工具
| 工具 | 用途 |
| --- | --- |
| `lookup_hazmat_entry` | 按UN/NA编号或正确运输名称查找;返回匹配的条目,解码符号和特殊规定。 |
| `get_shipping_requirements` | **一次调用→运输物料所需的一切:** 身份、标签、解码包装、特殊规定、船舶存放、标志牌和引用。 |
| `classify_shipping_description` | 将自由文本解析为结构化字段,然后验证。 |
| `validate_basic_hazmat_description` | 验证结构化字段是否符合完整的172.101表格。 |
| `get_label_requirements` | 返回危险标签代码和注意事项。 |
| `get_placard` | 49 CFR 172.504的标志牌名称 + 危险类别的数量阈值。 |
| `check_basic_segregation` | 保守的成对隔离发现(49 CFR 177.848子集)。 |
| `check_limited_quantity_eligibility` | 保守的3类/8类LQ候选人筛选。 |
| `decode_special_provision` | 将第7列代码(例如`IB2`、`T8`、`A3`)扩展为49 CFR 172.102文本。 |
| `decode_packaging_reference` | 将第8A/8B/8C值解析为其第173部分。 |
| `explain_cfr_source` | 解释哪个公共CFR源支持字段或规则。 |
示例调用:
```json
{ "query": "UN1090" }
```
## 库使用
```ts
import { defaultCatalog, decodeSpecialProvisions, ECFR_SNAPSHOT_DATE } from "hazmat-cfr-mcp";
const acetone = defaultCatalog.lookup("UN1090");
const provisions = decodeSpecialProvisions(acetone.entries[0].specialProvisions);
console.log(`Backed by eCFR snapshot ${ECFR_SNAPSHOT_DATE}`);
```
## 刷新数据
```bash
# 在src/data/snapshot.ts中修改ECFR_SNAPSHOT_DATE,然后:
npm run ingest -- --fresh
npm test
```
参见[docs/data-pipeline.md](docs/data-pipeline.md)获取完整流程。
## 非目标
不是法律建议;不是受过培训的危险品员工的替代品;不是完整的合规认证引擎;不是NMFC分类;不是承运人合同/费率分析。 本存储库中不属于任何私有客户数据、合同费率或内部业务记录。
## 安全
```bash
npm test
npm run typecheck
npm run scan:secrets
```
## 维护者
Andre Taki — [Alliance Chemical](https://alliancechemical.com) — andre@alliancechemical.com
## 许可证
MIT — 潜在的49 CFR文本是美国政府的公共领域作品。