2026 年,MCP 已是 Agent 连接外部系统的默认协议。.NET 侧却缺一个"引用即开放"的通用框架。McpFramework 补上这一层:引用库、标特性、一行启动,控制台、Web、WinForms、WPF 都能被 Agent 通过 MCP 实时控制。
这篇文章先把"MCP 是什么"讲清楚,再给出接入方式、三种传输的差异、四类项目的改法,以及一个真实的 SSE 踩坑。所有代码都可运行,文末给出 Agent 侧配置。
一、先说清楚:MCP 是什么
MCP(Model Context Protocol,模型上下文协议),由 Claude 母公司 Anthropic 推出,是一个连接大模型与外部工具、数据源、应用系统的开放协议。它要解决一个具体问题:大模型以前只能靠提示词和静态上下文,碰不到你的文件、数据库、API。MCP 给出一条标准化通道,让模型按需访问这些资源、执行操作。
最贴切的比喻是 USB-C。USB-C 统一了设备与外设的接口;MCP 统一了模型与外部系统的接口。有了它,同一个工具写一次,就能被任何支持 MCP 的宿主复用。
图:MCP 像一根标准的 USB-C 线,一端接 MCP 客户端,另一端接远程服务与本地数据源。
三部分:Host、Client、Server
MCP 采用客户端—服务器架构,拆成三层:
- MCP Host:发起连接的宿主应用,比如 Claude Desktop、Cursor、Cline。
- MCP Client:宿主里的通信层,负责建连、发现能力(Tools/Resources/Prompts)、把模型的调用请求转成协议消息。
- MCP Server:能力提供方,把文件系统、数据库、API 封装成工具,收到请求就执行具体操作。
图:一个 Host 里可以挂多个 Client,各自连一个 Server;Server 再对接本地文件、数据库或互联网 API。
三个核心组件:Tools、Resources、Prompts
Server 对外只暴露三类东西:
- Tools(工具):可执行的能力,会改变系统状态。比如运行命令、调用 API、改文件。模型推理时决定调哪个、传什么参数。
- Resources(资源):只读的数据,给模型补上下文。比如文件内容、数据库记录、代码仓库。它不执行操作,只提供信息。
- Prompts(提示词):标准化的任务模板,规定模型"怎么做"。带输入输出 schema,可复用。
一句话区分:Tools 动手,Resources 给料,Prompts 定规矩。
工作流程
一次完整调用分七步:建连 → 协商规则 → 发现能力 → 模型思考选工具 → 客户端转标准格式发出 → 服务端调外部系统执行 → 结果回流并更新上下文。
图:从左到右是用户、MCP Client、MCP Server、以及被调用的外部工具;虚线表示请求与结果的双向流转。
二、三种传输:STDIO、SSE、Streamable HTTP
协议统一用 JSON-RPC,但底层怎么传,有三种方式。
图:从上到下是 LLM、MCP Client 层、传输通道(STDIO / HTTP / WebSocket)、MCP Server,再落到外部系统。
| 传输 | 适用场景 | 端点 | 特点 |
|---|---|---|---|
| STDIO | CLI、本地进程 | 进程 stdout | 父子进程直连,无网络、低延迟、强隔离 |
| SSE | 远程服务(旧) | /sse+/message | 单向流,服务端推送;需配额外 POST 通道 |
| Streamable HTTP | 远程服务(新) | /mcp | POST 请求,可一次性返回也可流式;易过网关、认证 |
STDIO是默认方式。宿主作为父进程拉起 Server 子进程,通过 stdin 发请求、stdout 收响应。整个过程无网络,像 USB 直插。代价是 stdout 必须是纯净 JSON,日志混进去就会破坏协议帧。
SSE基于 HTTP 长连接,服务端单向推事件。实现简单、天然流式,但通信是单向的,得再配一个 POST 接口才能完成请求—响应闭环。官方已在最新规范中弃用它。
Streamable HTTP是替代方案,也是现在推荐的方式。客户端 POST 请求,服务端可以一次返回,也可以按需流式返回中间结果。它不依赖单一长连接,更容易接认证、网关、负载均衡。
图:客户端 POST 一个请求,服务端返回 200 后持续推送 chunk,最后以 DONE 结束流。
三、官方 SDK 给了原语,没给"一键开放"
先看硬数据。Microsoft 的ModelContextProtocol2.3.0 与ModelContextProtocol.AspNetCore2.3.0,对应 2026-07-28 协议修订版。这版协议里,SEP-2567 取消了 Streamable HTTP 的会话机制(Mcp-Session-Id被移除)。
这两个包只含服务端类型。我们的自测客户端想调用McpClientFactory,在ModelContextProtocol2.3.0 里翻遍了都找不到,最后只能用裸 JSON-RPC 手搓。这不是 SDK 的错,它本来就只负责协议原语。
社区现状也不算空白。MCPSharp 走属性式 .NET 服务;Runiq.AI.Mcp 绑定 ASP.NET Core 管线;Python 那边有 FastMCP。但 .NET 侧缺一个"嵌入即开放"的通用 lib——你引用它,就能把应用里的方法变成 MCP 工具,不用读协议、不用写传输。
McpFramework 的定位很窄:对官方 SDK 做薄封装,把"开放能力"从读协议降到标特性。它不造协议,只造体验。
四、安装与接入三步
准备:安装 McpFramework
包已发布到 NuGet,包名McpFramework。一条命令装上:
dotnetaddpackage McpFramework或者手写PackageReference:
<PackageReferenceInclude="McpFramework"Version="1.0.0"/>包在 nuspec 里声明了Microsoft.AspNetCore.App框架引用,消费端会自动带上,不用手动加。它依赖官方ModelContextProtocol2.3.0 与ModelContextProtocol.AspNetCore2.3.0,dotnet restore时一并拉取。
还没上传到 nuget.org 的话,可以先用本地源安装:先把
McpFramework.1.0.0.nupkg放进一个目录,再执行dotnet add package McpFramework --source <该目录>。
第一步:把方法标成工具
usingSystem.ComponentModel;usingModelContextProtocol.Server;[McpServerToolType]publicstaticclassMyTools{[McpServerTool,Description("设置设备状态文本")]publicstaticstringSetStatus([Description("新文本")]stringtext){// 这里改你自己的运行时状态return"ok";}[McpServerTool,Description("读取当前状态")]publicstaticstringGetStatus()=>"running";}[McpServerToolType]标在类上,[McpServerTool]标在方法上,[Description]是写给 Agent 看的说明书。方法有几个参数、参数什么类型,SDK 会自动生成 JSON Schema,Agent 照着 schema 传参。
第二步:一行启动
Stdio 适合 CLI,由 Agent 当子进程拉起:
usingMcpFramework;awaitMcpServer.StartAsync(newMcpFrameworkOptions{Transport=McpTransport.Stdio,ServerName="ConsoleApp",Version="1.0.0"});Http 适合常驻程序,MCP 端点随应用一起跑:
awaitMcpServer.StartAsync(newMcpFrameworkOptions{Transport=McpTransport.Http