摘要:挑战时间 2026年02月14日 前不久, 万众瞩目的 Claude Opus 4.6 和 GPT-5.3-Codex 发布.headers方法, 参数为HashMap<http::HeaderName, http::HeaderValue>`.
方法, 参数为
协议理解得分: 4 综合得分 MiniMax-M2.5: 5.4 2.
2026年02月14日
前不久, 万众瞩目的 Claude Opus 4.6 和 GPT-5.3-Codex 发布. 这两天, 热度拉满的国产大模型 MiniMax-M2.5, GLM-5, Doubao-Seed-2.0-Code 陆续发布, 基本都在对标 Opus 4.5. 根据宣传语, 略落后 Opus 4.5. 但是我个人的预期是 Sonnet 4.5, 因为 Sonnet 4.5 基本就是目前的"能用"线水平. 只要有 Sonnet 4.5 的水平, 就可以考虑投入生产环境使用了.
所以本次参赛选手为:
在使用 github remote mcp server 时, 它默认会返回所有的 tools (目前有 40 个), 大量占据 context. 所以 github remote mcp server 支持了通过注入自定义的 headers 来筛选 tools, 从而减小 context.
遗憾的是, mcp 的官方 rust sdk 目前不支持注入自定义 HTTP headers, 所以本次挑战的内容就是让各大模型来为其支持这个功能, 并且添加完整的单元测试 + 集成测试.
本次挑战基于 bb534a7a68933b587b03167431fa7dc0fcd6d40e commit.
这是 mcp rust sdk 仓库, 目前不支持自定义 HTTP headers, 请你为其增添注入自定义 headers 的功能, 并补充单元测试 + 集成测试. 1. 我希望 api 如下: ```rust let config = StreamableHttpClientTransportConfig::with_uri("https://api.githubcopilot.com/mcp/") .auth_header(github_token) .custom_headers(custom_headers); let transport = StreamableHttpClientTransport::from_config(config); ``` 目前只有 `auth_header` 方法, 请你增加一个 `custom_headers` 方法, 参数为 `HashMap<http::HeaderName, http::HeaderValue>`. 2. 当用户传入的 custom headers 里包含 reserved headers 时, 需要在发请求时报错, 告诉用户这个 header 是保留头, 被 mcp 协议所使用, 所以不能自定义. 你需要翻阅 https://modelcontextprotocol.io/specification/2025-11-25/basic/transports 来梳理所有 client HTTP headers 的保留头. 3. 对于集成测试, 你不需要写一个 mcp server 来读取 headers, 用一个简单的 axum server 即可. 4. 在适当的地方需要补充 docs; 不要引入新的依赖; 请着重考虑性能; 5. 需要保证新增和已有的所有测试用例通过, 包括 docs test.
和第一期从 0 开始做一个小项目不同, 这个任务的难点主要在于对已有的中型复杂仓库的整体理解. AI 需要追溯调用链, 精准找到最底层使用 reqwest client 发请求的相关代码, 然后实现注入逻辑. 本身的工作量很小, 难点在于上下文理解.
由于网络环境影响, 速度不在测试范围内. 除非慢到离谱, 否则不会影响最终分数.
整体表现挺一般的. 虽然考虑了性能, 但是优先用了引用而不是 Arc<HashMap<HeaderName, HeaderValue>>, 导致报了很久的生命周期错误. 并且由于集成测试一直通不过, 索性放弃, 改写了一个很基础的没啥用的测试. 在我要求写正规的集成测试后, 它居然因为启动 axum server 有问题, 直接改用 std::net::TcpListener 和 std::thread::spawn, 然后理所应当地失败了.
Arc<HashMap<HeaderName, HeaderValue>>
std::net::TcpListener
std::thread::spawn
Pros:
Arc
HashMap
Cons:
custom_headers
static RECEIVED_HEADERS: std::sync::OnceLock<HeaderMap> = std::sync::OnceLock::new();
headers
RESERVED_HEADERS
代码质量得分: 6
5 次. 主要是集成测试一直写不好.
Prompt 次数得分: 5
判断出的保留头为:
很离谱啊, 关键的 mcp-protocol-version 没有列出来, 倒是列出了一堆无关的.
mcp-protocol-version
协议理解得分: 4
MiniMax-M2.5: 5.4
GLM-5 真的慢, 真的慢...首次请求在那 Thinking 了半天, 我还以为卡了准备重启. 不过后续请求会好一些. 在首次 prompt 后, 基本功能都实现了, 但是集成测试没有写好, 里面实际上全都是单元测试.
eq_ignore_ascii_case
to_lowercase
HashMap<HeaderName, HeaderValue>
http::HeaderMap
HeaderMap
代码质量得分: 5
2 次. 集成测试出了一次问题.
Prompt 次数得分: 8
漏掉了一个 mcp-protocol-version.
协议理解得分: 7
GLM-5: 6.4
Doubao-Seed-2.0-Code 和 Sonnet 4.5 的产出代码惊人地类似, 但是存在以下两个问题:
just test
Result
for name in headers.keys() { let name_str = name.as_str().to_lowercase(); if name_str == ACCEPT.as_str() || name_str == AUTHORIZATION.as_str() || name_str == CONTENT_TYPE.as_str() || name_str == "mcp-session-id" || name_str == "last-event-id" { return Err(StreamableHttpError::ReservedHeader(name.to_string())); } }
在循环里调用了 to_lowercase, 产生 allocation. 应该使用 eq_ignore_ascii_case 来对比, 这个函数不会产生 allocation. 并且用几个 ||, 而不是维护一个数组.
||
代码质量得分: 7
3 次. 同样是测试的问题.
Prompt 次数得分: 7
Doubao-Seed-2.0-Code: 7
Sonnet 4.5 的表现差强人意, 在两次 prompt 后完成. 整体虽然完成了挑战, 但是有一个致命问题: 写出了两个卡死的集成测试用例, 并且在卡死之后放弃修复, 直接宣告完成.
to_ascii_lowercase
std::sync::Arc<std::collections::HashMap<http::HeaderName, http::HeaderValue>>
use
2 次. 测试问题 +1.
勉强符合预期, 实际上真正使用的只有 accept, mcp-session-id, mcp-protocol-version, last-event-id 这 4 个. origin, authorization 其实是应该允许修改的.
accept
mcp-session-id
last-event-id
origin
authorization
协议理解得分: 9
Claude Sonnet 4.5: 7.6
Opus 4.6 这次测试结果大跌眼镜, 连 Sonnet 4.5 都不如. 而且更离谱的是测 Sonnet 4.5 的时候第一次不小心模型设置成了 Opus 4.5, 看了一下输出质量还不错. 本以为 Opus 4.6 会更强, 没想到居然退步了.
HeaderName::from_bytes
HeaderValue::from_bytes
builder.build
expect
post_message
tokio::spawn
StreamableHttpError::TransportChannelClosed
代码质量得分: 4
1 次. (Opus 一般会进入 plan mode, 然后让用户 review plan. 我直接点的确定, 所以不算一次 prompt)
Prompt 次数得分: 10
同样的 7 个头, 勉强符合预期.
Claude Opus 4.6: 6.9
GPT-5.3-Codex 的表现非常亮眼, 几乎没有瑕疵, 除了最后疯狂在那 cargo fmt 和执行测试, 有点对自己的格式修改不自信.
cargo fmt
代码质量得分: 9
1 次.
完美! GPT 完全理解了协议内容, 只列出了这 4 个被实际使用的, 而不是把所有提到的都列出来. 满分!
协议理解得分: 10
GPT-5.3-Codex: 9.5
协议理解得分: 4 综合得分 MiniMax-M2.5: 5.4 2.
挑战时间
2026年02月14日
前不久, 万众瞩目的 Claude Opus 4.6 和 GPT-5.3-Codex 发布. 这两天, 热度拉满的国产大模型 MiniMax-M2.5, GLM-5, Doubao-Seed-2.0-Code 陆续发布, 基本都在对标 Opus 4.5. 根据宣传语, 略落后 Opus 4.5. 但是我个人的预期是 Sonnet 4.5, 因为 Sonnet 4.5 基本就是目前的"能用"线水平. 只要有 Sonnet 4.5 的水平, 就可以考虑投入生产环境使用了.
所以本次参赛选手为:
挑战内容
在使用 github remote mcp server 时, 它默认会返回所有的 tools (目前有 40 个), 大量占据 context. 所以 github remote mcp server 支持了通过注入自定义的 headers 来筛选 tools, 从而减小 context.
遗憾的是, mcp 的官方 rust sdk 目前不支持注入自定义 HTTP headers, 所以本次挑战的内容就是让各大模型来为其支持这个功能, 并且添加完整的单元测试 + 集成测试.
本次挑战基于 bb534a7a68933b587b03167431fa7dc0fcd6d40e commit.
Prompt
这是 mcp rust sdk 仓库, 目前不支持自定义 HTTP headers, 请你为其增添注入自定义 headers 的功能, 并补充单元测试 + 集成测试. 1. 我希望 api 如下: ```rust let config = StreamableHttpClientTransportConfig::with_uri("https://api.githubcopilot.com/mcp/") .auth_header(github_token) .custom_headers(custom_headers); let transport = StreamableHttpClientTransport::from_config(config); ``` 目前只有 `auth_header` 方法, 请你增加一个 `custom_headers` 方法, 参数为 `HashMap<http::HeaderName, http::HeaderValue>`. 2. 当用户传入的 custom headers 里包含 reserved headers 时, 需要在发请求时报错, 告诉用户这个 header 是保留头, 被 mcp 协议所使用, 所以不能自定义. 你需要翻阅 https://modelcontextprotocol.io/specification/2025-11-25/basic/transports 来梳理所有 client HTTP headers 的保留头. 3. 对于集成测试, 你不需要写一个 mcp server 来读取 headers, 用一个简单的 axum server 即可. 4. 在适当的地方需要补充 docs; 不要引入新的依赖; 请着重考虑性能; 5. 需要保证新增和已有的所有测试用例通过, 包括 docs test.难度分析
和第一期从 0 开始做一个小项目不同, 这个任务的难点主要在于对已有的中型复杂仓库的整体理解. AI 需要追溯调用链, 精准找到最底层使用 reqwest client 发请求的相关代码, 然后实现注入逻辑. 本身的工作量很小, 难点在于上下文理解.
评分维度
由于网络环境影响, 速度不在测试范围内. 除非慢到离谱, 否则不会影响最终分数.
1. MiniMax-M2.5 (Trae)
整体表现挺一般的. 虽然考虑了性能, 但是优先用了引用而不是
Arc<HashMap<HeaderName, HeaderValue>>, 导致报了很久的生命周期错误. 并且由于集成测试一直通不过, 索性放弃, 改写了一个很基础的没啥用的测试. 在我要求写正规的集成测试后, 它居然因为启动 axum server 有问题, 直接改用std::net::TcpListener和std::thread::spawn, 然后理所应当地失败了.代码质量
Pros:
Arc包裹HashMap, 考虑到了性能.Cons:
custom_headers, 一个个插入到请求头里, 没有封装成函数.static RECEIVED_HEADERS: std::sync::OnceLock<HeaderMap> = std::sync::OnceLock::new();来收集headers, 导致这个文件里只能写一个测试用例.RESERVED_HEADERS数组里, 没有复用已定义的常量.代码质量得分: 6
Prompt 次数
5 次. 主要是集成测试一直写不好.
Prompt 次数得分: 5
协议理解
判断出的保留头为:
很离谱啊, 关键的
mcp-protocol-version没有列出来, 倒是列出了一堆无关的.协议理解得分: 4
综合得分
MiniMax-M2.5: 5.4
2. GLM-5 (Trae)
GLM-5 真的慢, 真的慢...首次请求在那 Thinking 了半天, 我还以为卡了准备重启. 不过后续请求会好一些. 在首次 prompt 后, 基本功能都实现了, 但是集成测试没有写好, 里面实际上全都是单元测试.
代码质量
Pros:
eq_ignore_ascii_case来判断是否和保留头冲突, 避免了to_lowercase的 allocation (大力表扬! 我都不知道有这个方法, 而且没有几个 AI 用了这个方法).Cons:
HashMap<HeaderName, HeaderValue>类型要求, 而是自作主张用了http::HeaderMap.HeaderMap没有用Arc包裹, 而是到处 clone. 这个结构体里面还比较复杂, clone 有性能代价.代码质量得分: 5
Prompt 次数
2 次. 集成测试出了一次问题.
Prompt 次数得分: 8
协议理解
判断出的保留头为:
漏掉了一个
mcp-protocol-version.协议理解得分: 7
综合得分
GLM-5: 6.4
3. Doubao-Seed-2.0-Code (Trae)
Doubao-Seed-2.0-Code 和 Sonnet 4.5 的产出代码惊人地类似, 但是存在以下两个问题:
just test跑全量测试, 导致甚至存在一些编译错误, 但是它直接结束说成功了.代码质量
Pros:
Arc包裹HashMap, 考虑到了性能.Cons:
custom_headers方法里. 虽然这样可能更符合最佳实践, 但是还是违背了 prompt 的需求, 同时导致了与 prompt 里给的例子不匹配:custom_headers返回了一个Result, 需要用户做错误处理.for name in headers.keys() { let name_str = name.as_str().to_lowercase(); if name_str == ACCEPT.as_str() || name_str == AUTHORIZATION.as_str() || name_str == CONTENT_TYPE.as_str() || name_str == "mcp-session-id" || name_str == "last-event-id" { return Err(StreamableHttpError::ReservedHeader(name.to_string())); } }在循环里调用了
to_lowercase, 产生 allocation. 应该使用eq_ignore_ascii_case来对比, 这个函数不会产生 allocation. 并且用几个||, 而不是维护一个数组.代码质量得分: 7
Prompt 次数
3 次. 同样是测试的问题.
Prompt 次数得分: 7
协议理解
判断出的保留头为:
漏掉了一个
mcp-protocol-version.协议理解得分: 7
综合得分
Doubao-Seed-2.0-Code: 7
4. Claude Sonnet 4.5 (Claude Code)
Sonnet 4.5 的表现差强人意, 在两次 prompt 后完成. 整体虽然完成了挑战, 但是有一个致命问题: 写出了两个卡死的集成测试用例, 并且在卡死之后放弃修复, 直接宣告完成.
代码质量
Pros:
Arc包裹HashMap, 考虑到了性能.Cons:
custom_headers方法里, 同样导致了与 prompt 里给的例子不匹配:custom_headers返回了一个Result, 需要用户做错误处理.to_ascii_lowercase, 会产生 allocation. 应该使用eq_ignore_ascii_case来对比, 这个函数不会产生 allocation.custom_headers, 一个个插入到请求头里, 没有封装成函数.std::sync::Arc<std::collections::HashMap<http::HeaderName, http::HeaderValue>>这种类型, 没有在开头use进来. 小问题, 无伤大雅.代码质量得分: 7
Prompt 次数
2 次. 测试问题 +1.
Prompt 次数得分: 8
协议理解
判断出的保留头为:
勉强符合预期, 实际上真正使用的只有
accept,mcp-session-id,mcp-protocol-version,last-event-id这 4 个.origin,authorization其实是应该允许修改的.协议理解得分: 9
综合得分
Claude Sonnet 4.5: 7.6
5. Claude Opus 4.6 (Claude Code)
Opus 4.6 这次测试结果大跌眼镜, 连 Sonnet 4.5 都不如. 而且更离谱的是测 Sonnet 4.5 的时候第一次不小心模型设置成了 Opus 4.5, 看了一下输出质量还不错. 本以为 Opus 4.6 会更强, 没想到居然退步了.
代码质量
Pros:
Cons:
HeaderName::from_bytes,HeaderValue::from_bytes, reqwest 的builder.build使用了expect, 会对用户的错误输入直接 panic.to_ascii_lowercase, 产生 allocation.custom_headers调用时, 也不是在post_message发请求时, 而是在初始化的tokio::spawn里, 在和 mcp server 的初始连接请求发送之前检测, 并且没有新增一个错误类型来返回, 而是用了已有的StreamableHttpError::TransportChannelClosed, 错误表达不够清晰准确.代码质量得分: 4
Prompt 次数
1 次. (Opus 一般会进入 plan mode, 然后让用户 review plan. 我直接点的确定, 所以不算一次 prompt)
Prompt 次数得分: 10
协议理解
同样的 7 个头, 勉强符合预期.
协议理解得分: 9
综合得分
Claude Opus 4.6: 6.9
6. GPT-5.3-Codex (Cursor, Extra High)
GPT-5.3-Codex 的表现非常亮眼, 几乎没有瑕疵, 除了最后疯狂在那
cargo fmt和执行测试, 有点对自己的格式修改不自信.代码质量
Pros:
Arc包裹HashMap, 考虑到了性能.Cons:
代码质量得分: 9
Prompt 次数
1 次.
Prompt 次数得分: 10
协议理解
判断出的保留头为:
完美! GPT 完全理解了协议内容, 只列出了这 4 个被实际使用的, 而不是把所有提到的都列出来. 满分!
协议理解得分: 10
综合得分
GPT-5.3-Codex: 9.5
排名
总结