关于 iana-registries-mcp-server
这是一款用于查询 IANA 协议注册表及核对 RFC、Internet-Draft 状态的 MCP 服务,面向需要结构化网络标识信息的开发者和 Agent。它涵盖常见注册项目,也支持搜索和读取其他 IANA 注册表。
主要功能
- 01查询端口和媒体类型
- 02搜索 HTTP 状态码与字段
- 03查看 URI 方案和 PEN
- 04验证 BCP 47 语言标签
- 05核对 RFC 和草案状态
- 06搜索注册表并读取记录
适用场景
- 01配置服务时核实端口分配
- 02确认 HTTP 字段或 URI 方案
- 03规范化语言标签
- 04查找注册表记录或 RFC 更新
MCP 相关
通过 MCP 向客户端提供十种注册表查询与搜索工具,支持 STDIO 和 Streamable HTTP。另提供公共托管端点。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://iana-registries.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-iana-registries https://iana-registries.caseyjhand.com/mcp{"mcpServers":{"cyanheads-iana-registries":{"type":"http","url":"https://iana-registries.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-iana-registries":{"type":"http","url":"https://iana-registries.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-iana-registries":{"type":"http","url":"https://iana-registries.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-iana-registries":{"serverUrl":"https://iana-registries.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
10| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| port | integer | 否 | 端口号,0–65535("443" 等数字字符串也可)。返回该端口的所有行,以及包含该端口的范围行。请且仅传入 port、service 或 keyword 之一。 |
| limit | integer | 否 | 要返回的最大结果数,1–100。默认值为 25。 |
| offset | integer | 否 | 要跳过的关键词匹配项数;传入上次响应中的 next_offset 以获取下一页。默认值为 0。 |
| keyword | string | 否 | 按完整词元与服务名称和描述匹配的词语,例如 "network time"。请且仅传入 port、service 或 keyword 之一。 |
| service | string | 否 | 精确服务名称,不区分大小写,最多 15 个字符,例如 "postgresql" 或 "whois++"。port、service 或 keyword 必须且只能传入一个。 |
| transport | enum | 否 | 仅保留使用此传输协议的行。没有传输协议的行(大多数范围行以及所有没有端口的服务名称)始终保留。适用于所有模式。tcp | udp | sctp | dccp |
详细介绍
@cyanheads/iana-registries-mcp-server
通过 MCP 查询 IANA 端口、媒体类型、HTTP 状态码和字段、URI 方案、企业编号及 BCP 47 语言标签;检查 RFC 状态;搜索并读取任意 IANA 注册表。支持 STDIO 或 Streamable HTTP。
概述
官方 IANA 协议注册表,以及 RFC 和 Internet-Draft 状态。查询端口、媒体类型、HTTP 状态码和标头、URI 方案、企业编号及语言标签;搜索其他任意注册表;并检查 RFC 是否仍然有效、已被废止或已更新。无需 API 密钥。
工具
| 工具 | 描述 |
|---|---|
iana_lookup_port | 按端口号、服务名称或关键词查询各传输协议的服务名称和端口分配情况,以及端口的 RFC 6335 类别 |
iana_lookup_media_type | 按完整类型或关键词查询已注册的媒体(MIME)类型,以及状态、替代项和注册模板声明 |
iana_lookup_http_status | 按数字查询 HTTP 状态码,或按关键词查询原因短语;未分配的代码会报告其范围 |
iana_lookup_http_field | 查询已注册的 HTTP 字段(标头和尾部字段)名称、状态和结构化字段类型 |
iana_lookup_uri_scheme | 查询已注册的 URI 方案、状态、描述和知名 URI 支持情况 |
iana_lookup_pen | 按数字或 1.3.6.1.4.1 下的 OID 查询私有企业编号,或按组织名称查询 |
iana_lookup_language_tag | 按子标签验证并规范化 BCP 47 语言标签,或按描述搜索子标签 |
iana_get_rfc_status | 每次调用最多查询 10 个 RFC、Internet-Draft 或 BCP/STD/FYI 系列的当前状态和关联关系 |
iana_search_registries | 按关键词在 IANA 协议索引中查找任意注册表或子注册表 |
iana_get_registry_records | 读取并筛选任意 IANA XML 注册表中指定 id 的记录 |
能力参考
iana_lookup_port 工具
- 指定
port(0–65535)、service(精确名称)或keyword之一;transport(tcp、udp、sctp、dccp)可筛选所有模式 - 每行包含
state(assigned、reserved、unassigned、unnamed)和对应的传输协议;端口模式还会添加port_class(system、user、dynamic),以及包含该端口的范围行
iana_lookup_media_type 工具
- 指定
type(例如application/json;会移除;之后的参数)或keyword之一;top_level可缩小关键词模式的范围 keyword会匹配已注册的类型名称和状态注释,不会匹配文件扩展名;如果形似扩展名的单词关键词(jpg、.mp3、*.jpg),会收到相应提示,除非该词是已注册的顶级类型或子类型(png不会触发提示,因为存在image/png)status为current、deprecated或obsoleted;如果注册表指定了替代项,则会提供replaced_bytype模式还会读取注册模板,并在模板包含相关声明时,于template下返回文件扩展名、预期用途和已弃用别名声明;无法读取模板时,template.fetched为false;当 IANA 未为该类型发布模板(image/gif、text/plain)时,template.available为false
iana_lookup_http_status 工具
- 指定
code(100–599)或在已注册的原因短语中搜索keyword之一 - 返回
class和state(assigned、temporary、obsoleted、unused),以及定义该状态的参考文献和章节;对于未分配的代码,返回found: false和其unassigned_range
iana_lookup_http_field 工具
- 指定
name(不区分大小写)或在名称和注释中搜索keyword之一;status可筛选两种模式 - 返回
status(permanent、provisional、deprecated、obsoleted)、已注册时的structured_type、注释以及定义该字段的参考文献
iana_lookup_uri_scheme 工具
- 指定
scheme(末尾的:或://会被忽略)或keyword之一;status(permanent、provisional、historical)可筛选两种模式 - 返回描述、参考文献、
well_known_uri_support,以及发布了注册模板时的template_url
iana_lookup_pen 工具
- 指定
pen(数字,或1.3.6.1.4.1下的 OID)或组织名称中的词语之一 - 每个条目都包含其
oid前缀和state(assigned、reserved、unassigned);如果某行组织信息因混有联系方式而被隐去,则organization_withheld: true - 如果 OID 包含企业编号以下的弧段,则返回
requested_oid和sub_arcs;这些弧段由企业分配,而非由 IANA 分配
iana_lookup_language_tag 工具
tag(下划线按连字符读取)或description二选一;subtag_type用于缩小描述模式的范围- 标签模式会返回
well_formed、valid、canonical_tag(仅适用于有效标签)、subtags[]中的各个部分,以及issues[]:kind为unknown和wrong_position会使标签无效,而deprecated、variant_prefix_mismatch、suppress_script_redundant和extension_not_validated仅供参考 - 单个子标签输入会在
also_registered_as中列出同一子标签下其他类型的记录 - 规范化会保留变体顺序,同时消除首选值冲突;已注册的
ja-Latn-hepburn-heploc上下文会转换为ja-Latn-alalc97,并保留无关部分 - 扩展部分会添加扩展分配信息
extension(allocated、unallocated或unavailable)、描述、定义它的 RFC 以及组织管理机构;extension_source会记录所使用的副本。分配状态不会改变基础有效性,也不会验证扩展内容。可选的分配信息读取会在 3 秒内停止;如果失败,则返回基础分析结果和重试指南,或返回标记为过期的分配信息副本
iana_get_rfc_status 工具
- 最多接受 1,000 个经过规范化的非空白
ids,并在选择每次调用的十个 ID 前进行规范去重:任何常见格式的 RFC 编号;BCP、STD 和 FYI 编号(BCP 14);带或不带修订后缀的草案名称;RFC 和草案文件名(rfc2616.txt、draft-ietf-httpbis-semantics-19.txt);datatracker.ietf.org、tools.ietf.org 或 ietf.org 上 RFC 或草案的 URL,或 rfc-editor.org 上 RFC 的 URL(https://tools.ietf.org/html/rfc7231);以及 rfc-editor.org/info/ 或 datatracker.ietf.org/doc/ 下的系列 URL(https://datatracker.ietf.org/doc/bcp14/)。URL 的查询参数和片段会被删除 total_ids统计不同 ID 的数量;deferred_ids预览接下来的十个 ID,而deferred_count统计剩余的全部 ID。要继续处理,请将相同的原始ids与next_ids_offset作为ids_offset一起重新提交。deferred_reason: "batch_limit"和deferred_guidance会说明截断原因;偏移量达到或超出末尾时,会返回空页且不发起上游请求documents[]会为 RFC 提供当前状态和发布时状态、流、工作组、废止和更新关系、所属系列(is_also)以及勘误页面;为草案提供其状态、IESG 状态、替代文档以及became_rfc;为系列提供其成员 RFC(kind: "series")。未知 ID 的结果为found: false,并附有guidance;高于最新版本的草案修订仍会判定为已找到,并由guidance指明最新版本- 查找失败的 ID 会进入
failed[],其他 ID 仍会正常返回;失败项包含reason,并在失败信息中说明时包含retryable(如果再次调用仍以相同方式失败,则为false);仅当所有 ID 均失败时,整个调用才会失败。一次调用最多发起 20 个 Datatracker 请求(一个 RFC 或系列需要 1 个请求,另加每次调用为 RFC 系列查询所需的 1 个请求;一个草案需要 3 个请求,带修订后缀时需要 4 个);超出限制的 ID 会以原因request_limit返回在failed[]中,供重新提交
iana_search_registries 工具
query中的词会与注册表标题、类别和 ID 匹配,不区分单复数(ethertype可找到 "Ethertypes");每个词都必须匹配,包括for和the;limit接受 1–1,000,000,超出时会限制为 50,默认为 15,并通过offset分页- 完全匹配的注册表或子注册表 ID 排名靠前;以词语形式给出的注册表 ID 也会排名靠前(
protocol numbers→protocol-numbers);最接近的标题随后列出 - 在多个协议类别下列出的注册表只会返回一次,其类别以
;拼接 - 每个条目都包含
iana_get_registry_records使用的registry_id和subregistry_id,以及注册流程、定义文档、页面 URL 和 XML URL
iana_get_registry_records 工具
- 一个
registryID 或iana.org/assignmentsURL、可选的subregistry,以及筛选条件value(与键列精确匹配,或与列field名称匹配)和contains(匹配任意字段中的词语;字段值相同的记录优先) - 数字形式的
value会与数字单元格精确比较(0443可找到443),或与十进制范围比较,包括 64 位端点。单个0x词元会按数值与单个0x单元格比较(0x5可找到0x05),或与十六进制范围比较;其他0x形式则按原样比较其数字,不论逗号、空格或花括号的写法 - 如果
value未匹配,结果会列出包含该值的其他列及其行数,因此可通过field按助记符或服务名称查找;如果匹配,结果会说明是否还有不含键单元格但包含该值的行 - 按
cursor/next_cursor分页(第一页之后的页面会携带offset),并受有效limit限制(最多 100,默认 25)及 48,000 个字符的记录预算限制;超过 2,000 个字符的字段会被截断,每条记录最多保留 16 个字段,cut_fields会列出被截断的字段 - 如果某个注册表包含多个子注册表且未指定子注册表,则返回
subregistries[],而不是记录;包含嵌套表格的表会在第一页的subregistries[]中列出这些表,读取子注册表时会在registry_notes[]中附带注册表自身的说明和脚注 - 失败时会返回
unknown_registry、unknown_subregistry、unknown_field、non_xml_registry、invalid_cursor或cursor_mismatch
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及支持可选 OpenTelemetry 跟踪的结构化日志记录。
IANA 专属功能:
- 实时、无需密钥地读取 IANA 注册表文件、RFC Editor 的逐 RFC JSON 文件以及 IETF Datatracker
- 注册表在首次使用时加载,并缓存 24 小时后重新验证;刷新失败时,最多 7 天前的缓存副本仍可用于响应,且
source.stale: true - 按主机控制请求节奏(iana.org、rfc-editor.org、datatracker.ietf.org),每次工具调用共用 45 秒预算,涵盖所有重试和队列等待
- 通用记录使用注册表的 XML 元素名称作为字段名称(
rec是 Recommended 列) - 不返回联系人、指定专家和注册人个人信息字段,并将自由文本中的电子邮件地址替换为
[email removed]
便于 Agent 使用的输出:
- 未匹配是结果,而非错误:查无结果时,查找会返回
found: false,并通过notice说明下一步;遇到未知 RFC 或草案时,返回found: false和guidance;语言标签无效时,返回valid: false和issues[]。未匹配意味着 IANA 没有相关注册,并不代表该值在实际中未被使用 - 统一的查找约定:每次查找必须且只能指定一个模式键,否则返回
mode_required;正的安全整数limit最大为 1,000,000,超过 100 时会被限制为 100(iana_search_registries除外,其默认值为 15、上限为 50)。受限调用在两种接口中都会披露requested_limit和effective_limit,包括精确匹配和空模式。列表模式(keyword、organization、description)使用offset分页,并返回next_offset、totalCount、shown和truncated - 每个注册表响应均包含来源信息:
source携带注册表文件、registry_updated、fetched_at和stale - 带恢复提示的类型化失败:每个工具都会声明
upstream_unreadable(搜索时为index_unreadable)和pacer_shed;当此服务自身的请求队列已满时,后者会携带retryAfter
快速开始
公共托管实例
公共实例位于 https://iana-registries.caseyjhand.com/mcp,无需安装。通过 Streamable HTTP 将任意 MCP 客户端指向该实例:
{
"mcpServers": {
"iana-registries-mcp-server": {
"type": "streamable-http",
"url": "https://iana-registries.caseyjhand.com/mcp"
}
}
}
自托管 / 本地
将以下内容添加到 MCP 客户端配置文件中。
{
"mcpServers": {
"iana-registries-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/iana-registries-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或使用 npx(无需 Bun):
{
"mcpServers": {
"iana-registries-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/iana-registries-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或使用 Docker:
{
"mcpServers": {
"iana-registries-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/iana-registries-mcp-server:latest"]
}
}
}
对于 Streamable HTTP,设置传输方式并启动服务:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bunx @cyanheads/iana-registries-mcp-server@latest
# Server listens at http://localhost:3010/mcp
前置条件
- Bun v1.4.0 或更高版本(或 Node.js v24+)。
- 无需 API 密钥或账户:IANA、RFC Editor 和 IETF Datatracker 均无需密钥。
安装
- 克隆仓库:
git clone https://github.com/cyanheads/iana-registries-mcp-server.git
- 进入目录:
cd iana-registries-mcp-server
- 安装依赖项:
bun install
- 配置环境(可选):
cp .env.example .env
# the server needs no variables of its own; edit framework overrides as needed
配置
此服务自身不读取任何环境变量。以下框架设置适用:
| 变量 | 描述 | 默认值 |
|---|---|---|
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_PORT | HTTP 服务端口。 | 3010 |
MCP_HTTP_HOST | HTTP 服务主机。 | 127.0.0.1 |
MCP_HTTP_ENDPOINT_PATH | HTTP 端点路径。 | /mcp |
MCP_SESSION_MODE | HTTP 会话模式:stateless、stateful 或 auto。 | stateless |
MCP_AUTH_MODE | 身份验证:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(debug、info、warning、error 等)。 | info |
LOGS_DIR | 日志文件目录(仅限 Node.js)。 | <app-root>/logs |
STORAGE_PROVIDER_TYPE | 存储后端:in-memory、filesystem、supabase、cloudflare-kv/r2/d1。 | in-memory |
OTEL_ENABLED | 启用 OpenTelemetry。 | false |
完整的框架覆盖项列表请参阅 .env.example。
运行服务
本地开发
-
构建并运行生产版本:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
运行检查和测试:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
项目结构
| 目录 | 用途 |
|---|---|
src/index.ts | createApp() 入口点:注册工具,并启动和停止服务。 |
src/mcp-server/tools/definitions | 工具定义(*.tool.ts),共 10 个工具。 |
src/mcp-server/tools/shared | 工具共用的架构、列表分页与通知,以及 Markdown 辅助函数。 |
src/services/upstream | 面向 iana.org、rfc-editor.org 和 datatracker.ietf.org 的限速、预算控制 HTTP 客户端。 |
src/services/registry | 注册表缓存和解析器:XML 注册表、PEN 列表、语言子标签和扩展注册表、协议索引及其排序搜索、BCP 47 标签分析,以及个人数据清理。 |
src/services/media-template | 媒体类型注册模板读取器。 |
src/services/ietf | RFC Editor 和 Datatracker 文档状态。 |
tests/ | 单元测试和工具测试,结构与 src/ 对应。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md。简要说明:
- 处理器抛出异常,框架负责捕获——工具逻辑中不要使用
try/catch - 使用
ctx.log记录日志;注册表文本来自第三方,因此format()会通过quote()和inline()辅助函数进行渲染 - 在
src/mcp-server/tools/definitions/index.ts的汇总文件中注册新工具 - 封装外部 API 调用:验证原始数据 → 规范化为领域类型 → 返回输出架构;切勿编造缺失字段
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
本项目采用 Apache 2.0 许可证。详情请参阅 LICENSE 文件。
IANA 和 IETF Trust 根据 CC0 1.0 将协议注册表献给公有领域(许可条款,2021 年 11 月 10 日联合声明)。RFC 文档不在该声明范围内;此服务仅返回 RFC 元数据,不返回 RFC 正文。本项目独立于 IANA、IETF 和 RFC Editor。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。