🚀 标准查找器 - RFC和互联网草案MCP服务器
标准查找器是一个综合性的Python MCP服务器,用于从IETF网站获取、解析和读取RFC(请求评论)和互联网草案。它提供了一系列工具和资源,可通过编程方式与RFC文档、互联网草案和IETF工作组文档进行交互。
我要感谢 @mjpitz/mcp-rfc 提供的基础。本解决方案是基于Python的移植和扩展,使用了 Kiro。
🚀 快速开始
标准查找器使用Python标准库,无需额外安装依赖。你可以直接运行以下命令启动服务器:
python3 standard_finder.py
python3 standard_finder.py --http
python3 standard_finder.py --http --port 8080
✨ 主要特性
RFC支持
- 按编号获取RFC文档。
- 按关键字搜索RFC。
- 从RFC文档中提取特定章节。
- 解析HTML和TXT格式的RFC文档。
互联网草案支持
- 按名称获取互联网草案文档(自动检测最新版本)。
- 使用IETF数据跟踪器API按关键字搜索互联网草案。
- 自动或明确获取互联网草案的最新版本。
- 从互联网草案中提取特定章节。
- 解析HTML和TXT格式的互联网草案。
- 支持版本感知处理(例如,
draft-name-05 与 draft-name 获取最新版本)。
OpenID基金会支持
- 按名称获取OpenID基金会规范。
- 按关键字搜索OpenID规范。
- 从OpenID规范中提取特定章节。
- 支持所有主要的OpenID规范(连接核心、发现、注册等)。
- 解析HTML格式的规范并提取元数据。
- 对长时间运行的操作提供进度通知。
工作组支持
- 完整的工作组文档:检索任何IETF工作组的所有RFC和互联网草案。
- 活动文档过滤:自动过滤掉过期、撤回或替换的草案。
- 工作组元数据:包括工作组信息、描述和状态。
- 灵活过滤:选择包含/排除RFC或草案,设置每种类型的限制。
- 流行工作组:已在httpbis、oauth、tls、quic、dnsop等工作组进行测试。
通用特性
- 智能缓存:提高重复请求的性能。
- 全面的元数据:提取作者、日期、状态、摘要等信息。
- 基于章节的解析:按章节和子章节浏览文档。
- 多种输出格式:完整文档、仅元数据或仅章节。
- 强大的错误处理:优雅的回退机制和详细的错误消息。
- 符合MCP协议:与MCP兼容的客户端和MCP检查器完全集成。
- 双传输模式支持:支持stdio和HTTP传输模式。
- 增强的RFC解析:改进了各种RFC格式的标题提取。
- 进度通知:对长时间运行的操作提供实时进度更新。
- 高级日志记录:全面的日志记录,详细跟踪初始化阶段。
- 与MCP检查器兼容:具有正确的工具模式格式和参数验证。
- 通知支持:正确处理所有标准MCP通知。
- 传输健壮性:增强的错误处理和连接管理。
- 符合JSON - RPC 2.0:完全符合JSON - RPC 2.0规范。
📦 安装指南
标准查找器仅使用Python标准库,无需额外安装依赖。你可以直接运行以下命令启动服务器:
python3 standard_finder.py
python3 standard_finder.py --http
python3 standard_finder.py --http --port 8080
💻 使用示例
基础用法
await mcp.call_tool('get_rfc', {'number': '2616', 'format': 'metadata'})
await mcp.call_tool('search_rfcs', {'query': 'http protocol', 'limit': 5})
高级用法
await mcp.call_tool('get_working_group_documents', {
"working_group": "httpbis",
"include_rfcs": true,
"include_drafts": true,
"limit": 20
})
📚 详细文档
可用工具
RFC工具
get_rfc
按编号获取RFC文档。
参数:
number(字符串,必需):RFC编号(例如 "2616")。
format(字符串,可选):输出格式(full、metadata、sections),默认:"full"。
示例:
{
"number": "2616",
"format": "metadata"
}
search_rfcs
按关键字搜索RFC。
参数:
query(字符串,必需):搜索关键字或短语。
limit(数字,可选):返回的最大结果数,默认:10。
示例:
{
"query": "http protocol",
"limit": 5
}
get_rfc_section
从RFC中获取特定章节。
参数:
number(字符串,必需):RFC编号(例如 "2616")。
section(字符串,必需):要检索的章节标题或编号。
示例:
{
"number": "2616",
"section": "Introduction"
}
互联网草案工具
get_internet_draft
按名称获取互联网草案文档。如果未指定版本,自动获取最新版本。
参数:
name(字符串,必需):互联网草案名称,可包含或不包含版本(例如 "draft - ietf - httpbis - http2 - 17" 或 "draft - ietf - httpbis - http2" 获取最新版本)。
format(字符串,可选):输出格式(full、metadata、sections),默认:"full"。
示例:
{
"name": "draft - ietf - httpbis - http2 - 17",
"format": "metadata"
}
{
"name": "draft - ietf - httpbis - http2",
"format": "full"
}
search_internet_drafts
按关键字搜索互联网草案。
参数:
query(字符串,必需):搜索关键字或短语。
limit(数字,可选):返回的最大结果数,默认:10。
示例:
{
"query": "http2 protocol",
"limit": 5
}
get_internet_draft_section
从互联网草案中获取特定章节。
参数:
name(字符串,必需):互联网草案名称(例如 "draft - ietf - httpbis - http2 - 17")。
section(字符串,必需):要检索的章节标题或编号。
示例:
{
"name": "draft - ietf - httpbis - http2 - 17",
"section": "Introduction"
}
get_working_group_documents
获取特定IETF工作组的所有活动RFC和互联网草案。
参数:
working_group(字符串,必需):IETF工作组缩写(例如 "httpbis"、"oauth"、"tls")。
include_rfcs(布尔值,可选):结果中是否包含RFC(默认:true)。
include_drafts(布尔值,可选):结果中是否包含互联网草案(默认:true)。
limit(数字,可选):每种类型的最大文档数(默认:50)。
示例:
{
"working_group": "httpbis",
"include_rfcs": true,
"include_drafts": true,
"limit": 20
}
响应包括:
- 工作组信息(名称、描述、状态)。
- 工作组发布的RFC列表。
- 工作组的活动互联网草案列表。
- 摘要统计信息(总数)。
OpenID基金会工具
get_openid_spec
按名称获取OpenID基金会规范。
参数:
name(字符串):OpenID规范的名称或标识符。
format(字符串,可选):输出格式 - "full"(默认)、"metadata" 或 "sections"。
示例:
await mcp.call_tool('get_openid_spec', {'name': 'openid - connect - core'})
await mcp.call_tool('get_openid_spec', {'name': 'openid - connect - discovery', 'format': 'metadata'})
await mcp.call_tool('get_openid_spec', {'name': 'oauth - 2.0 - multiple - response - types', 'format': 'sections'})
search_openid_specs
按关键字搜索OpenID基金会规范。
参数:
query(字符串):搜索查询/关键字。
limit(整数,可选):最大结果数(默认:10)。
示例:
await mcp.call_tool('search_openid_specs', {'query': 'connect'})
await mcp.call_tool('search_openid_specs', {'query': 'oauth', 'limit': 5})
get_openid_spec_section
从OpenID基金会规范中获取特定章节。
参数:
name(字符串):OpenID规范的名称。
section(字符串):要检索的章节标题或标识符。
示例:
await mcp.call_tool('get_openid_spec_section', {
'name': 'openid - connect - core',
'section': 'Authentication'
})
可用资源
RFC资源
rfc://{number}:按编号获取RFC文档。
rfc://search/{query}:按关键字搜索RFC。
互联网草案资源
draft://{name}:按名称获取互联网草案文档(如果未指定版本,获取最新版本)。
draft://search/{query}:按关键字搜索互联网草案。
draft://latest/{basename}:按基本名称获取互联网草案的最新版本。
工作组资源
wg://{group}:获取工作组的所有文档(RFC和互联网草案)。
wg://{group}/rfcs:仅获取工作组的RFC。
wg://{group}/drafts:仅获取工作组的互联网草案。
OpenID基金会资源
openid://{name}:按名称获取OpenID基金会规范。
openid://search/{query}:按关键字搜索OpenID规范。
命令行选项
python3 standard_finder.py --help
python3 standard_finder.py
python3 standard_finder.py --stdio
python3 standard_finder.py --http
python3 standard_finder.py --http --port 8080
python3 standard_finder.py --log - level DEBUG
python3 standard_finder.py --log - dir /var/log/rfc
日志记录
服务器包含全面的日志记录,具有自动轮转和增强的调试功能:
日志特性
- 特定实例的日志文件:每个服务器实例都有自己的日志文件。
- 自动轮转:日志文件在达到10MB时轮转,保留5个备份文件。
- 带时间戳的文件名:格式:
rfc_server_YYYYMMDD_HHMMSS_PID.log。
- 多个日志级别:DEBUG、INFO、WARNING、ERROR。
- 结构化日志:包括时间戳、函数名和行号。
- 增强的初始化日志:详细跟踪MCP初始化阶段。
- 请求/响应日志:完全可见MCP协议交换。
- 进度通知:对长时间运行的操作进行实时日志记录。
- 错误诊断:全面的错误报告,包含完整上下文。
日志位置
- 默认:
/tmp/rfc_server/。
- 自定义:使用
--log - dir 选项。
- 权限:确保目录可写。
日志内容
- 服务器生命周期:启动/关闭事件,包含详细配置。
- MCP协议:所有请求、响应和通知,包含完整JSON。
- 初始化阶段:客户端初始化过程的详细日志记录。
- 工具执行:RFC和互联网草案获取操作的时间记录。
- 错误条件:包含完整请求上下文的堆栈跟踪。
- 性能指标:缓存命中、响应大小和时间数据。
- 传输层:STDIO和HTTP连接管理。
- 验证:JSON - RPC 2.0合规性和模式验证。
增强的初始化日志
🚀 INITIALIZE REQUEST RECEIVED
Handling request: initialize (ID: 1)
Request timestamp: 2024 - 10 - 01T18:08:29.123456
Validating initialize request format:
✅ protocolVersion: str
Protocol version: 2024 - 11 - 05
✅ clientInfo: dict
Client name: mcp - client
Client version: 1.0.0
📤 SENDING INITIALIZE RESPONSE
==================================================
Initialize response being sent to client:
Response size: 456 bytes
Response ID: 1 (type: int)
Raw JSON: {"jsonrpc":"2.0","id":1,"result":...}
==================================================
✅ INITIALIZE RESPONSE SENT SUCCESSFULLY
📢 NOTIFICATIONS/INITIALIZED RECEIVED
✅ Client initialization confirmed - server is ready for requests
示例日志条目
2024 - 10 - 01 18:08:29,123 - rfc_server - INFO - main:45 - Starting RFC MCP Server with arguments: {'http': true, 'port': 3000}
2024 - 10 - 01 18:08:29,456 - rfc_server - INFO - handle_request:289 - 🚀 INITIALIZE REQUEST RECEIVED
2024 - 10 - 01 18:08:29,789 - rfc_server - INFO - handle_request:345 - ✅ JSON - RPC 2.0 version confirmed
2024 - 10 - 01 18:08:30,012 - rfc_server - INFO - run_stdio:837 - ✅ INITIALIZE RESPONSE SENT SUCCESSFULLY
2024 - 10 - 01 18:08:30,234 - rfc_server - INFO - handle_request:567 - 📢 NOTIFICATIONS/INITIALIZED RECEIVED
测试HTTP模式
启动HTTP服务器:
python3 standard_finder.py --http
测试端点:
curl http://localhost:3000/health
curl -X POST http://localhost:3000/mcp \
-H "Content - Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024 - 11 - 05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}'
curl -X POST http://localhost:3000/mcp \
-H "Content - Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
curl -X POST http://localhost:3000/mcp \
-H "Content - Type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_rfc","arguments":{"number":"2616","format":"metadata"}}}'
curl -X POST http://localhost:3000/mcp \
-H "Content - Type: application/json" \
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"get_working_group_documents","arguments":{"working_group":"oauth","limit":10}}}'
curl -X POST http://localhost:3000/mcp \
-H "Content - Type: application/json" \
-d '{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"get_openid_spec","arguments":{"name":"openid - connect - core","format":"metadata"}}}'
curl -X POST http://localhost:3000/mcp \
-H "Content - Type: application/json" \
-d '{"jsonrpc":"2.0","id":6,"method":"tools/call","params":{"name":"search_openid_specs","arguments":{"query":"oauth","limit":5}}}'
开发
项目结构
standard_finder.py # 主MCP服务器(零依赖)
requirements.txt # 可选的Python依赖
tests/
test_final.py # 全面的测试套件
README.md # 本文件
output/ # 生成的输出文件
运行测试
python3 tests/test_final.py
npm test
MCP检查器兼容性
服务器与 MCP检查器 完全兼容,可用于调试和测试MCP工具:
模式格式
- 包装参数:工具模式使用MCP检查器期望的格式,带有命名输入包装器(例如,
GetRfcInput、SearchRfcsInput)。
- 向后兼容性:仍然支持现有客户端的直接参数格式。
- 自动检测:自动检测并处理两种参数格式。
- 全面的模式:所有9个工具都有详细的JSON模式定义和正确的验证。
- 参数描述:丰富的参数描述和约束,以提供更好的用户体验。
协议合规性
- JSON - RPC 2.0:完全符合JSON - RPC 2.0规范。
- MCP通知:正确处理
notifications/initialized 和其他标准通知。
- ID一致性:保持请求和响应之间的ID类型一致性。
- 错误处理:正确的错误响应格式,带有适当的错误代码。
使用MCP检查器进行测试
python3 standard_finder.py --http --port 3000
调试功能
- 增强的日志记录:详细记录初始化阶段和所有MCP操作。
- 请求/响应跟踪:完全可见MCP协议交换。
- 验证日志:详细验证请求和响应。
- 错误诊断:全面的错误报告,带有堆栈跟踪。
传输模式
Stdio模式(默认)
- ✅ MCP标准:官方MCP传输协议。
- ✅ 基于进程:客户端将服务器作为子进程启动。
- ✅ 可靠:直接的进程通信。
- ✅ 安全:无网络暴露。
- ✅ 与Q CLI兼容:与MCP客户端完美配合。
HTTP模式
- 🌐 基于网络:服务器作为HTTP服务运行。
- 🔧 开发/测试:对调试有用。
- 🌍 Web集成:启用CORS以支持浏览器访问。
- 🔒 网络安全:需要额外的安全考虑。
快速开始示例
使用MCP客户端
配置完成后,你可以在任何MCP兼容的客户端中使用这些工具:
await mcp.call_tool('get_rfc', {'number': '2616', 'format': 'metadata'})
await mcp.call_tool('search_rfcs', {'query': 'HTTP', 'limit': 5})
await mcp.call_tool('get_internet_draft', {'name': 'draft - ietf - httpbis - http2'})
await mcp.call_tool('search_internet_drafts', {'query': 'websocket'})
await mcp.call_tool('get_working_group_documents', {
'working_group': 'oauth',
'include_rfcs': true,
'include_drafts': true,
'limit': 20
})
await mcp.call_tool('get_working_group_documents', {
'working_group': 'tls',
'include_rfcs': true,
'include_drafts': false,
'limit': 10
})
await mcp.call_tool('get_openid_spec', {
'name': 'openid - connect - core',
'format': 'metadata'
})
await mcp.call_tool('search_openid_specs', {
'query': 'oauth',
'limit': 5
})
使用资源
await mcp.read_resource('rfc://2616')
await mcp.read_resource('draft://draft - ietf - httpbis - http2')
await mcp.read_resource('rfc://search/HTTP')
await mcp.read_resource('wg://httpbis')
await mcp.read_resource('wg://oauth/rfcs')
await mcp.read_resource('wg://tls/drafts')
🔧 技术细节
服务器实现了三个主要组件:
- RFC服务:处理从RFC中获取、解析和提取数据,具有增强的标题解析功能。
- 互联网草案服务:处理从互联网草案中获取、解析和提取数据,支持工作组。
- MCP服务器:实现MCP协议,并通过stdio和HTTP传输暴露工具和资源。
标准查找器仅使用Python标准库,采用TXT格式解析以实现最大兼容性。互联网草案服务与IETF数据跟踪器API集成,以增强搜索功能和工作组文档检索。
关键特性
智能版本处理
互联网草案服务自动检测你是请求特定版本还是最新版本:
draft - ietf - httpbis - http2 - 17 → 专门获取版本17。
draft - ietf - httpbis - http2 → 自动获取最新可用版本。
工作组集成
- 完整的文档检索:获取任何IETF工作组的所有RFC和互联网草案。
- 实时数据:使用实时IETF数据跟踪器API获取最新信息。
- 智能过滤:自动排除过期、撤回或替换的文档。
- 灵活选项:根据需要选择文档类型并设置限制。
强大的错误处理
- 优雅地处理网络超时和故障。
- 无效的RFC/草案编号返回详细的错误消息。
- 回退机制确保最大兼容性。
- 全面的日志记录用于调试和监控。
性能优化
- 内存缓存减少重复的网络请求。
- 并发请求处理提高吞吐量。
- 高效解析HTML和纯文本格式。
- HTTP模式支持多个同时连接。
- 增强的RFC标题提取以获取更好的元数据。
数据源
- RFC:官方IETF RFC存储库(rfc - editor.org)。
- 互联网草案:IETF数据跟踪器(datatracker.ietf.org)。
- 工作组:IETF数据跟踪器API(datatracker.ietf.org/api)。
- 搜索:IETF数据跟踪器API,带有网页抓取回退机制。
支持的流行工作组
- httpbis - HTTP协议规范。
- oauth - OAuth身份验证和授权。
- tls - 传输层安全。
- quic - QUIC传输协议。
- dnsop - DNS操作。
- jose - JSON对象签名和加密。
- ietf - 一般IETF文档。
- 还有更多...
📄 许可证
本项目采用Apache许可证2.0 - 有关详细信息,请参阅 LICENSE 文件。
近期改进
版本0.2504.4 - 最新增强功能
MCP检查器兼容性
- 工具模式格式:更新为与MCP检查器兼容的格式,带有命名输入包装器。
- 参数处理:双格式支持 - 处理包装和直接参数格式。
- 自动检测:自动检测参数格式并相应处理。
- 全面的模式:所有9个工具都有详细的JSON模式定义。
协议合规性
- JSON - RPC 2.0:完全符合JSON - RPC 2.0规范。
- MCP通知:增加了对
notifications/initialized 和其他标准通知的支持。
- ID一致性:增强了请求和响应之间的ID类型保留。
- 错误处理:改进了错误响应格式,带有正确的错误代码。
增强的日志记录
- 初始化阶段跟踪:详细记录完整的MCP初始化序列。
- 请求/响应日志:完全可见所有MCP协议交换。
- 进度通知:对长时间运行的操作进行实时日志记录。
- 验证日志:全面验证请求和响应。
- 错误诊断:增强的错误报告,包含完整上下文和堆栈跟踪。
传输层改进
- STDIO健壮性:增强的错误处理和连接管理。
- 响应大小管理:在STDIO模式下自动截断大响应。
- 字符清理:改进了响应中特殊字符的处理。
- 连接跟踪:详细记录连接生命周期和状态。
工具增强
- 进度回调:为关键工具添加了进度通知支持。
- 参数验证:增强的参数验证,带有详细的错误消息。
- OpenID基金会支持:与OpenID规范目录完全集成。
- 工作组文档:增强的元数据和过滤功能。
兼容性
- 向后兼容:所有现有客户端无需更改即可继续工作。
- MCP检查器就绪:与MCP检查器完全兼容,用于调试。
- Q CLI兼容:与Q CLI和其他MCP客户端无缝配合。
- HTTP/STDIO双模式:两种传输模式都得到充分支持和测试。
故障排除
常见问题
MCP检查器连接问题
python3 standard_finder.py --http --port 3000
curl http://localhost:3000/health
curl -X POST http://localhost:3000/mcp \
-H "Content - Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024 - 11 - 05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
STDIO模式问题
- 大响应截断:在STDIO模式下,超过200KB的响应会自动截断。
- 字符编码:为了与STDIO兼容,会清理特殊字符。
- 连接中断:检查日志中的传输关闭问题。
日志记录和调试
python3 standard_finder.py --log - level DEBUG
ls -la /tmp/rfc_server/
tail -f /tmp/rfc_server/rfc_server_*.log
工具参数问题
- MCP检查器格式:使用包装参数,如
{"GetRfcInput": {"number": "2616"}}。
- 直接格式:使用直接参数,如
{"number": "2616", "format": "metadata"}。
- 自动检测:服务器自动检测并处理两种格式。
性能优化
- 缓存:响应在内存中缓存,以处理重复请求。
- 格式选择:当不需要完整内容时,使用
"metadata" 格式以获得更快的响应。
- 限制参数:在搜索操作中使用适当的限制,以避免超时。