惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
美团技术团队
腾讯CDC
V
V2EX
G
Google Developers Blog
博客园 - Franky
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
阮一峰的网络日志
阮一峰的网络日志
Microsoft Azure Blog
Microsoft Azure Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
罗磊的独立博客
C
Check Point Blog
MyScale Blog
MyScale Blog
aimingoo的专栏
aimingoo的专栏
F
Fortinet All Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
V2EX - 技术
V2EX - 技术
The Last Watchdog
The Last Watchdog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
有赞技术团队
有赞技术团队
Security Archives - TechRepublic
Security Archives - TechRepublic
S
Security @ Cisco Blogs
W
WeLiveSecurity
D
DataBreaches.Net
Forbes - Security
Forbes - Security
V
Visual Studio Blog
P
Proofpoint News Feed
S
Secure Thoughts
H
Help Net Security
Cloudbric
Cloudbric
云风的 BLOG
云风的 BLOG
Microsoft Security Blog
Microsoft Security Blog
N
News and Events Feed by Topic
Schneier on Security
Schneier on Security
Engineering at Meta
Engineering at Meta
Attack and Defense Labs
Attack and Defense Labs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
S
Security Affairs
L
LangChain Blog
Last Week in AI
Last Week in AI
Martin Fowler
Martin Fowler
Hacker News: Ask HN
Hacker News: Ask HN
H
Heimdal Security Blog
M
MIT News - Artificial intelligence
The Register - Security
The Register - Security

博客园 - 张善友

数字员工的成本账:OpenClaw.NET 如何用工程化实现"成功任务的单位经济学"(下) AI 成本战的隐性成本与降本五层:从"成功率悖论"到"系统复杂度"(中) 从 Token 价格战到成功任务单位经济学:AI 成本战的真正主线(上) MCP + A2A 融合:协议层已就绪,信任层才是硬仗 22年微软MVP连任:一个.NET技术人的社区长跑 OpenClaw.NET 本体工程实践(一):数字员工的「语义大脑」不是数据库 当工厂里坐满了"数字员工":AI原生时代,NPI到量产正在被重写 当 AI 对话里直接弹出业务界面:MCP Apps 正在改写 SaaS 的集成逻辑 C# vs Go:Agentic 时代的语言分层 G#:当 Go、Kotlin 与 Swift 的美学遇见 .NET 运行时 从 Bun 的 Rust 重写,看 C# 如何重建 AI 基础设施层 .NET 10 File-Based Apps:一个 .cs 文件搞定一切,C# 终于也能像 Python 一样写脚本了! 从Kaplan到Test-Time Compute:Scaling Law的真实演变与中文媒体的叙事偏差 AI 基础设施的"去 Python 化":Rust 与 C# 的两条替代路径 你的 AI Agent 会在服务器上"修仙"——OpenClaw.NET 长持久会话技术解读 C# GeneratedRegex:面向对象语言的"底层性能突围 当 AI 不再只是"说话":OpenClaw.NET 率先原生支持 MCP Apps Token IO 架构的设计游戏:大模型产品形态四年演进的本质 将 Rust 绑定到 .NET 10:Oxigraph 的 FFI 桥接实践 Claude Code Dynamic Workflows vs OpenClaw.NET MetaSKILL C# ?? 链式回退:编写优雅的多级兜底逻辑 MetaSKILL 与 SKILL:多视角深度综述 Microsoft Agent Framework 1.0 正式接棒,.NET AI 进入 Agent-Native 时代 从 OpenClaw.NET 的 /loop 实现,看 Loop Engineering 如何从概念走向工程实践 OpenClaw.NET 祭出 TokenJuice:Agent 时代的"Token 瘦身引擎",让 LLM 上下文不再膨胀 OpenClaw.NET 重大更新:Goal 机制登场,让 AI Agent 不再"半途而废" OpenClaw.NET MetaSKILLs 系统深度解析:AI Agent 正在学会「自己给自己写技能」 OpenClaw.NET 上线 MetaSkills :软件工程第一性原理的工业级实践 当 AgentGateway 遇上 OpenClaw.NET:企业级智能体基础设施的深度协同实战 C# 内存安全性的重大演进:重新定义 unsafe 关键字 Qt Bridges for C# 深度技术解析 OpenClaw.NET 兼容性目录指南(Compatibility Catalog) .NET 10 桌面 UI 框架的范式演进:Jalium.UI 与 MewUI 架构深度对比 架构融合:Activity Host 作为确定性编排与认知智能代理的桥梁 MewUI 项目:面向 NativeAOT 的超轻量级.NET GUI 架构、底层图形管线与性能演进 人工智能原生时代的全栈工程范式转移:DeepSeek 人才战略与下一代 Agent 基础设施深度分析 OpenClaw.NET 外部 CLI 预设系统:从零编写第三方 CLI 集成指南 曝华为"白嫖"开源团队技术方案事件——网友评论总结 NuGet下载量数据分析与.NET生态全景观察:从数据洞察技术演进 .NET 11 Preview 4 正式发布:Runtime-Async 全面启用、Process API 大幅扩展 OpenClaw.NET:给智能以形态 OpenClaw.NET 外部 CLI 连接器 (External CLI Connectors) 详细技术总结 OpenHarmony.Avalonia 归档事件对中国自主软件生态的影响--信任的坍塌与生态的异化 Memgraph 与 Neo4j 图数据库对比及 .NET 生态适配分析 .NET生态系统中的A2A(Agent-to-Agent)协议支持与跨平台多智能体协同 OpenClaw.NET .NET 原生插件开发完全指南:以 Mempalace 插件为范例 为 openclaw.net 集成 ElBruno.MempalaceNet 记忆系统 Graphify-DotNet:AI 驱动的 .NET 代码知识图谱构建工具 SonnetDB:.NET 生态下的高性能嵌入式时序数据库 C# 原生编码智能体运行时 SharpClawCode SharpIDE: 基于 .NET 与 Godot 引擎的跨平台开源 IDE SharpDbg 与 netcoredbg 深度对比分析 .NET 调试器 netcoredbg 跨平台及其 LoongArch 架构支持进展 .NET生态下Native AOT兼容的Cron任务调度框架 Avalonia UI 12.0.0 正式发布:架构演进和性能飞跃 - 张善友 DotNetPy:现代.NET 与 Python 互操作 实战指南 微软发布的《生成式人工智能初学者.NET 10第二版》课程 Avalonia UI 12.0.0-RC1正式发布 自动导引车(AGV)与自主移动机器人(AMR)控制系统的 C# 开源封装库 AgentEval:面向 .NET 生态的企业级 AI 智能体评估框架 .NET 10 打造 OpenClaw Windows Node Microsoft Agent Framework:基于 DelegatingAIAgent 与 ChatClientAgent 的核心架构和协同范式 基于 Kubernetes 与多语言 SDK 的 OpenSandbox AI 代理沙箱编排 MCP C# SDK v1.0 正式发布 .NET 11 Preview 2 架构演进、技术深度解析 基于NativeAOT的 OpenClaw.NET 深度刨析 BMAD方法 v6 与 GitHub Copilot 在应用开发中的协同 C# 驱动的开源无人机机载飞控算法 《上海市卫生健康”信息技术应用创新”白皮书》C#/.NET “A组件”认定事件始末与最终结果 .NET 11 预览版 1 中的新兴架构演进:RISC-V 与 LoongArch 支持的深度技术解析与生态展望 .NET 11 预览版1:CoreCLR 在 WebAssembly 上的全面集成与性能突破 .NET 11与智能体人工智能的范式转移:架构演进、开发者生态与安全解析 Lucia 智能家居自治系统:基于多智能体编排与边缘计算融合 Model Context Protocol (MCP) C# SDK v0.9.0-preview.1 发布
C# MCP SDK 2.0 即将发布:去会话化、去握手、去运维噩梦
张善友 · 2026-07-24 · via 博客园 - 张善友

2026 年 7 月 28 日,MCP 协议将迎来史上最大修订。C# SDK 2.0 同步跟进——这不是一次常规升级,而是一次架构范式转移。

从有状态到无状态,从握手到自描述,从粘性路由到普通负载均衡。对于 .NET 开发者而言,这意味着 MCP 服务器终于可以像普通 HTTP API 一样部署、扩容和运维。


一、为什么 2.0 不是「升级」,是「重写底层」

MCP 协议自 2024 年 11 月发布以来,经历了从实验性到生产级的快速演进。但 v1 时代有一个致命的设计约束:有状态连接

每次客户端连接,必须先完成 initialize 握手,服务器返回 Mcp-Session-Id,后续所有请求必须携带这个 Session ID。这意味着:

  • 扩容噩梦:同一客户端必须打到同一实例,负载均衡器需要配置粘性路由(sticky session)
  • 共享存储依赖:Session 状态必须在实例间共享,Redis 或数据库成为瓶颈
  • 网关复杂度:深度包检测(DPI)才能识别会话归属,运维成本陡增

2026 年 7 月 28 日发布的 2026-07-28 协议版本,用六个 SEP(Specification Enhancement Proposal)彻底解决了这个问题。C# SDK 2.0.0 作为官方 Tier 1 SDK,完整实现了这一修订。


二、三大核心变化:砍掉什么,新增什么

变化 1:砍掉 initialize 握手(SEP-2575)

v1 时代

POST /mcp HTTP/1.1
Content-Type: application/json

{"jsonrpc":"2.0","id":1,"method":"initialize",
 "params":{"protocolVersion":"2025-11-25","capabilities":{},
           "clientInfo":{"name":"my-app","version":"1.0"}}}

服务器返回 Mcp-Session-Id,后续请求必须携带:

POST /mcp HTTP/1.1
Mcp-Session-Id: 1868a90c-3a3f-4f5b
Content-Type: application/json

{"jsonrpc":"2.0","id":2,"method":"tools/call",
 "params":{"name":"search","arguments":{"q":"otters"}}}

v2 时代

POST /mcp HTTP/1.1
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: search
Content-Type: application/json

{"jsonrpc":"2.0","id":1,"method":"tools/call",
 "params":{"name":"search","arguments":{"q":"otters"},
           "_meta":{"io.modelcontextprotocol/clientInfo":{"name":"my-app","version":"1.0"}}}}

差异一目了然

  • 没有 initialize 请求
  • 没有 Mcp-Session-Id 头部
  • 协议版本、客户端信息、能力声明全部塞进每个请求的 _meta 字段
  • 每个请求自包含,任意实例都能处理

变化 2:砍掉 Mcp-Session-Id(SEP-2567)

Session ID 的移除是运维层面的最大利好。v1 时代,MCP 服务器部署需要:

┌─────────────────────────────────────────┐
│  负载均衡器(粘性路由 / IP Hash)        │
│  → 同一客户端必须打到同一实例            │
├─────────────────────────────────────────┤
│  实例 A ←→ Redis Session Store ←→ 实例 B │
│  → Session 状态共享,Redis 成为单点      │
├─────────────────────────────────────────┤
│  网关 DPI(深度包检测)                  │
│  → 解析 JSON-RPC body 识别会话归属      │
└─────────────────────────────────────────┘

v2 时代,架构简化为:

┌─────────────────────────────────────────┐
│  普通负载均衡器(Round-Robin)          │
│  → 任意请求打到任意实例                  │
├─────────────────────────────────────────┤
│  实例 A    实例 B    实例 C             │
│  → 无共享状态,无 Session Store         │
├─────────────────────────────────────────┤
│  网关按 Mcp-Method / Mcp-Name 路由      │
│  → 无需解析 body,纯头部路由            │
└─────────────────────────────────────────┘

C# SDK 2.0 的实现细节

  • 客户端默认发送 server/discover 探测,携带 MCP-Protocol-Version: 2026-07-28
  • 服务器若支持 v2,直接返回能力列表,无握手,无会话
  • 若服务器不支持(返回 MethodNotFound 或超时 5s),客户端自动降级到 v1 的 initialize 握手
  • 三个「现代服务器」错误码(-32020 HeaderMismatch、-32021 MissingRequiredClientCapability、-32022 UnsupportedProtocolVersion)永远不会被视为降级信号,直接抛异常

变化 3:显式状态句柄替代隐式会话

去会话化不等于去状态化。v2 协议明确推荐:状态由应用层管理,协议层不插手

具体做法:工具返回一个显式句柄(如 basket_idtask_id),模型在后续调用中作为普通参数传回。

[McpServerTool]
public static async Task<CallToolResult> CreateBasket(...)
{
    var handle = Guid.NewGuid().ToString();
    await _store.SetAsync(handle, new BasketState { ... });
    return new CallToolResult 
    { 
        Content = [new TextContentBlock { Text = $"Basket created: {handle}" }]
    };
}

[McpServerTool]
public static async Task<CallToolResult> AddItem(string basket_id, string sku, int qty)
{
    var basket = await _store.GetAsync(basket_id);
    basket.Items.Add(new Item { Sku = sku, Qty = qty });
    await _store.SetAsync(basket_id, basket);
    return new CallToolResult { ... };
}

这个模式比隐式 Session 更强大:模型可以组合句柄、推理句柄生命周期、在不同工具间传递句柄——这些在 v1 的隐藏 Session 中是不可能做到的。


三、C# SDK 2.0 的 API 变化:向后兼容是底线

官方 Release Notes 明确承诺:2.0.0 SDK 与 v1.x 服务器和客户端完全向后兼容

破坏性变更仅限两类:

  1. 废弃能力 API:Roots、Sampling、Logging 能力被新规范废弃,相关 API 标记 [Obsolete](诊断码 MCP9005),并给出迁移指引
  2. 实验性 API 调整:预览期 API 的契约随规范最终化而调整(如 MCPEXP001MCPEXP002MCPEXP003

稳定的非废弃 API 从 1.x 继续工作,无需修改

服务器端配置变化

v1.x 的 HttpServerTransportOptions

builder.Services.AddMcpServer()
    .WithHttpTransport(options => 
    {
        options.Stateless = true;  // 显式启用无状态
    });

v2.0 中,无状态成为默认或首选模式。若服务器需要保持有状态(如兼容旧客户端),显式设置:

builder.Services.AddMcpServer()
    .WithHttpTransport(options => 
    {
        options.Stateless = false;  // 拒绝 v2 协议,强制客户端降级
    });

此时服务器返回诊断码 MCP9006,客户端自动回退到 2025-11-25initialize 握手。


四、新特性:不只是砍东西,还有加法

1. 多轮往返请求(Multi Round-Trip Requests, SEP-2322)

v1 时代,服务器向客户端发起请求(如elicitation)需要保持 SSE 长连接。v2 改为返回 InputRequiredResult,客户端收集输入后重试原调用,携带 requestState

{
  "resultType": "inputRequired",
  "inputRequests": {
    "confirm": {
      "type": "elicitation",
      "message": "Delete 3 files?",
      "schema": { "type": "boolean" }
    }
  },
  "requestState": "eyJzdGVwIjoxLCJmaWxlcyI6WyJhIiwiYiIsImMiXX0="
}

关键优势:任何实例都能处理重试,因为 requestState 自包含所有上下文。

2. 可路由、可缓存、可追踪(SEP-2243 / SEP-2549 / SEP-414)

  • Mcp-MethodMcp-Name 头部:负载均衡器无需解析 body 即可路由
  • ttlMscacheScopetools/list 响应可缓存,客户端知道新鲜度
  • W3C Trace Context_meta 中固定 traceparenttracestatebaggage 键名,分布式追踪贯穿 SDK、网关、下游服务

3. Extensions 框架正式化(SEP-2133)

扩展从「实验性核心功能」变为「独立轨道」:

  • 反向 DNS ID 标识(如 io.modelcontextprotocol.apps
  • 通过 extensions map 协商
  • 独立仓库、独立维护者、独立版本
  • 两条晋升路径:Extensions Track(实验→稳定)和 Standards Track(进核心规范)

两个官方扩展已发布

  • MCP Apps(SEP-1865):服务器渲染 HTML UI,宿主在沙箱 iframe 中运行
  • Tasks 扩展:从核心规范毕业为扩展,生命周期围绕无状态模型重构——服务器返回 task handle,客户端用 tasks/gettasks/updatetasks/cancel 驱动

4. 完整 JSON Schema 2020-12(SEP-2106)

Tool 的 inputSchemaoutputSchema 升级到完整 JSON Schema 2020-12:

  • 支持 oneOf / anyOf / allOf 组合
  • 支持条件 schema(if/then/else
  • 支持 $ref / $defs 引用(但不自动解引用外部 URI)
  • structuredContent 可以是任意 JSON 值,不限于 object

五、对 .NET 开发者的实际影响

部署侧:从「特殊服务」到「普通服务」

维度 v1.x v2.0
负载均衡 粘性路由(IP Hash / Cookie) 普通轮询
Session 存储 Redis / 数据库(必需) 可选(应用层句柄)
网关配置 DPI + 自定义规则 标准 HTTP 头部路由
自动扩缩容 受 Session 分布限制 无限制,任意实例
冷启动影响 Session 重建延迟 无(无状态)

代码侧:几乎无感迁移

现有 v1.x 代码:

var client = await McpClient.CreateAsync(transport, new McpClientOptions());

升级到 v2.0,无需修改。客户端自动探测 v2 服务器,失败则降级到 v1。

若需强制 v1 行为:

var options = new McpClientOptions
{
    ProtocolVersion = "2025-11-25"  // 禁用自动降级
};

性能侧:开销可忽略

  • server/discover 探测超时默认 5s(可配置 McpClientOptions.DiscoverProbeTimeout
  • 每个请求增加 _meta 字段,典型大小增加 < 200 bytes
  • 验证开销:Ed25519 签名验证 < 1ms(AIP 基准数据)

六、时间线与行动建议

时间节点 事件
2026-05-21 协议 Release Candidate 锁定
2026-07-28 协议最终版发布
现在 C# SDK v2.0.0-preview.3 已可用(NuGet 预发布包)
未来 稳定版随协议最终版同步发布

给 .NET 开发者的建议

  1. 现在可以开始试用:v2.0.0-preview.3 已完整实现 2026-07-28 协议,向后兼容 v1.x
  2. 优先验证无状态部署:将现有 MCP 服务器切换到 Stateless = true,验证负载均衡器无需粘性路由
  3. 规划显式句柄迁移:将隐式 Session 状态重构为工具返回的显式句柄 + 外部存储(Redis/Postgres)
  4. 关注 Extensions:MCP Apps 和 Tasks 扩展可能改变交互范式,提前评估业务场景
  5. 保留降级路径:生产环境建议同时支持 v1/v2 双协议,直到所有客户端升级完成

结语:MCP 的「HTTP 时刻」

1991 年,HTTP 从有状态的 FTP 会话中解放出来,成为无状态协议,奠定了现代互联网的基础设施。2026 年,MCP 正在经历同样的蜕变。

C# SDK 2.0 的意义不在于新增了多少 API,而在于它让 MCP 服务器变成了普通的 HTTP 服务——可以放在 nginx 后面,可以用 Kubernetes HPA 自动扩缩容,可以用标准的 OpenTelemetry 链路追踪,可以用普通的缓存策略。

对于 OpenClaw.NET 的数字员工架构而言,这意味着 Harness Agent 和 MetaSkill DAG 中的每个 MCP Server 节点,都可以无缝接入现有的 .NET 云原生基础设施,无需为 MCP 单独设计运维方案。

协议层解决「怎么连」,SDK 层解决「怎么写」,去会话化解决「怎么运维」——三层叠加,MCP 才真正具备了生产级部署的底气。


本文基于 Model Context Protocol 官方博客、C# SDK GitHub Release Notes 及 2026-07-28 协议草案整理。