ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

什么是 MCP(模型上下文协议)?.NET 开发者如何抢占 AI 工具链新风口

什么是 MCP(模型上下文协议)?.NET 开发者如何抢占 AI 工具链新风口 1. 从一次内部工单说起MCP 到底解决什么问题先说结论MCPModel Context Protocol模型上下文协议是一套让大模型调用外部工具和数据源的开放协议你可以把它理解成 AI 应用和业务系统之间的 USB-C 接口。它是什么、能做什么、适合谁这三个问题我用一个真实场景讲清楚。我所在的团队维护着一套跑了七八年的 .NET 订单系统运营同事每天要查订单状态、翻库存、看日志。过去想让 AI 帮忙得给每个模型单独写一套对接代码接 Claude 写一遍换 GPT 再写一遍接内部工单系统又写一遍。M 个模型乘 N 个数据源胶水代码越堆越多换一个模型就得推倒重来。MCP 的做法是在中间插一层标准协议。Host 是 AI 应用本身Client 负责和每个 Server 建立一对一连接Server 才是真正提供能力的一方。通信走 JSON-RPC 2.0能力在握手阶段协商。开发者最常打交道的是三个原语Tools 是 AI 可以调用的函数类似 POST 请求可能有副作用比如 QueryOrders、CreateTicketResources 是只读上下文类似 GET比如配置文件、表结构、日志片段Prompts 是可复用的提示词模板把复杂工作流固化下来。传输层有两种开箱即用的选择。Stdio 走本机进程间通信零网络开销适合 CLI、IDE 插件、本地代理Streamable HTTP 支持跨网络和远端托管走 OAuth2.1 或 Bearer 认证适合企业内网服务。类比一下MCP 之于 AI 应用约等于 LSP 之于编辑器——一次实现处处可插。对 .NET 开发者来说这件事的分量更重。企业核心业务系统大量躺在 .NET 上ERP、MES、金融清算、政务内网、遗留 WCF 服务。过去要让大模型碰这些系统要么写 Python 中间件做桥接要么把业务重写成 Python两条路都不划算。MCP 的 C# SDK 由微软和 Anthropic 协同维护把这件事变成了给老代码贴标签。存量代码几乎零改写属性标注就能接入这才是 .NET 开发者该盯这块的真正原因。2. 接入前的准备TaoToken 与 MCP C# SDK 环境搭建动手之前先把两样东西准备好一个能用的模型服务入口以及 MCP 的 C# SDK。模型服务这块我用的是 TaoToken它提供统一的 API 入口模型对话、Coding Plan、API Keys 管理都在一个控制台里省得在多个平台之间来回切换。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。先说 SDK 的安装。MCP 的 C# 包叫 ModelContextProtocol配套还有 .Core 和 .AspNetCore 两个子包。打开你的项目目录执行下面几条命令dotnet new console -n MyMcpServer cd MyMcpServer dotnet add package ModelContextProtocol dotnet add package Microsoft.Extensions.Hosting如果你要做远端 HTTP 版本再加一个dotnet add package ModelContextProtocol.AspNetCore这里有个坑我踩过ModelContextProtocol 的版本要和 .NET SDK 版本对齐。我一开始用的是 .NET 6 的项目装完包编译报了一堆关于 HostApplicationBuilder 找不到的错误后来把项目升到 .NET 8 才顺过去。建议直接用 .NET 8 或更高版本Native AOT 支持也更完整。接下来是模型服务的配置。在 TaoToken 控制台里创建一个 API Key然后把它写进环境变量别硬编码在代码里export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/apiWindows 下用 PowerShell$env:TAOTOKEN_API_KEYsk-你的key $env:TAOTOKEN_BASE_URLhttps://taotoken.net/api如果你用的是 Claude Code 这类工具配置方式略有不同。Claude Code 的配置文件在用户目录下的 .claude/settings.json需要写全三件套Base URL、Key、Model ID。下面是一个可复制的片段{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }注意 Base URL 这里不要带 UTM 参数API 入口就是干净的 https://taotoken.net/api 。Model ID 按你实际开通的模型填别照抄。环境准备好之后先别急着写业务逻辑。我建议先用一个最小的 stdio Server 把链路跑通确认工具能被正确列出和调用再去接真实的数据库或内部 API。这样出问题的时候排查范围小得多。3. 可复制配置把 .NET 业务包成 MCP Server这一节是全文的核心给你两套可以直接复制的配置一套 stdio 本地版一套 ASP.NET Core HTTP 远端版。先看 stdio 版这是最快能跑起来的形态。新建一个 Program.cs把下面的代码贴进去using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using ModelContextProtocol.Server; using System.ComponentModel; var builder Host.CreateApplicationBuilder(args); builder.Services .AddMcpServer() .WithStdioServerTransport() .WithToolsFromAssembly(); await builder.Build().RunAsync(); [McpServerToolType] public static class OrderTools { [McpServerTool, Description(按客户ID查询最近订单)] public static string QueryOrders( [Description(客户唯一标识)] string customerId) { // 这里调你现有的 EF Core / Dapper / gRPC return $customer{customerId} orders: SO-1001, SO-1002; } }几个关键点解释一下。AddMcpServer 注册 MCP 服务WithStdioServerTransport 指定走标准输入输出WithToolsFromAssembly 会自动扫描当前程序集里所有带 McpServerToolType 特性的类。工具方法上的 Description 特性很重要它会自动生成 JSON SchemaClaude、Cursor、Copilot 这些 Host 靠它来理解你的工具是干什么的。描述写得越清楚模型选工具的准确率越高。跑起来dotnet run如果控制台没有报错、进程挂起等待输入说明 stdio Server 已经就绪。这时候它不会打印任何东西因为它在等 JSON-RPC 消息。接下来是 HTTP 远端版适合把内部系统暴露给其他部门的 Agent 调用using ModelContextProtocol.AspNetCore; var builder WebApplication.CreateBuilder(args); builder.Services.AddMcpServer() .WithHttpTransport() .WithToolsFromAssembly(); var app builder.Build(); app.MapMcp(); app.Run();WithHttpTransport 换成 Streamable HTTP 传输app.MapMcp() 把 MCP 端点挂到路由上。默认路径是 /mcp你可以通过 MapMcp 的参数自定义。真实场景里QueryOrders 这个方法体可以换成各种东西用 Npgsql 直连 PostgreSQL 做表结构探测用 HttpClient 调内部 ERP 接口用 Kubernetes 客户端拉 Pod 日志。方法签名和特性标注不用变变的只是里面的业务逻辑。如果你要在 .NET 里写 MCP Client给自有系统接上模型能力配置是这样的using Microsoft.Extensions.AI; using ModelContextProtocol.Client; var transport new StdioClientTransport(new StdioClientTransportOptions { Name LocalTools, Command dotnet, Arguments [run, --project, ../MyMcpServer] }); var mcp await McpClient.CreateAsync(transport); var tools await mcp.ListToolsAsync(); IChatClient chat new ChatClientBuilder( new AzureOpenAIClient( new Uri(https://taotoken.net/api), new DefaultAzureCredential()) .GetChatClient(gpt-4o).AsIChatClient()) .UseFunctionInvocation() .Build();这段代码的价值在于你的 WinForms、Web API、后台服务不用改架构就能让运营人员用自然语言查订单、排工单、审日志。UseFunctionInvocation 是关键它负责把模型的工具调用请求转发给 MCP Client再把结果喂回模型。4. 验证请求本地启动、调用工具、核对日志配置写完不算完得验证它真的能跑。这一节给你一套完整的验证动作从启动服务到核对返回结果每一步都有明确的预期输出。第一步启动 stdio Server。在 MyMcpServer 目录下执行 dotnet run进程会挂起等待输入。这时候打开另一个终端用 MCP Inspector 或者手写 JSON-RPC 消息来测试。手写的话往标准输入里发一条初始化消息{jsonrpc:2.0,id:1,method:initialize,params:{protocolVersion:2024-11-05,capabilities:{},clientInfo:{name:test,version:1.0}}}预期返回里会包含 serverInfo 和 capabilitiescapabilities 里应该有 tools 字段。如果返回里没有 tools说明 WithToolsFromAssembly 没扫到你的工具类检查一下类上有没有 McpServerToolType 特性。第二步列出工具。发一条{jsonrpc:2.0,id:2,method:tools/list,params:{}}预期返回里能看到 QueryOrdersinputSchema 里应该有 customerId 这个必填参数。这一步能过说明工具发现链路是通的。第三步调用工具。发一条{jsonrpc:2.0,id:3,method:tools/call,params:{name:QueryOrders,arguments:{customerId:C-1001}}}预期返回是 customerC-1001 orders: SO-1001, SO-1002。如果返回的是错误先看错误码-32601 是方法不存在-32602 是参数不合法这两个多半是工具名或参数名拼错了。第四步核对日志。在 Program.cs 里加一行日志输出把每次工具调用记下来builder.Logging.AddConsole();然后在工具方法里注入 ILogger把 customerId 和返回结果打出来。跑一遍完整调用确认日志里能看到请求和响应成对出现。这一步在排查线上问题时特别有用因为 MCP 的调用是异步的出错了光看返回很难定位。如果你用的是 HTTP 版验证方式换成 curlcurl -X POST http://localhost:5000/mcp \ -H Content-Type: application/json \ -d {jsonrpc:2.0,id:1,method:tools/list,params:{}}预期返回和 stdio 版一致。HTTP 版还要注意一点默认没有认证别直接绑公网。生产环境务必上 OAuth2.1 或 Bearer TokenMCP 规范里明确说了 Tool 等于任意代码执行裸奔的后果很严重。验证通过之后你可以把 MCP Server 接到 VS Code 的 Copilot Agent Mode 或者 Cursor 里让模型自己发现并调用你的工具。这一步跑通整个链路就算闭环了。5. 常见报错排查401、local proxy failed、reading choices这一节把我踩过的坑和社区里高频的报错整理出来对照着排查能省不少时间。401 Unauthorized 是最常见的。如果你在调模型服务时遇到这个先检查 API Key 有没有写对再检查 Base URL 是不是 https://taotoken.net/api 。有个细节容易忽略有些工具会在 Base URL 后面自动拼 /v1如果你的配置里已经带了路径就会变成 /api/v1/v1直接 401。解决办法是把 Base URL 写成不带尾斜杠的干净地址让工具自己去拼。local proxy failed 这个报错通常出现在本地 MCP Client 连 Server 的时候。原因多半是 StdioClientTransport 里的 Command 或 Arguments 写错了。比如你的 Server 项目路径是 ../MyMcpServer但实际目录名是 MyMcpServer2就会连不上。排查方法是在终端里手动执行一遍 Command 加 Arguments看能不能跑起来。另外Windows 下 dotnet 命令的路径有时候需要写全用 where dotnet 查一下实际位置。reading choices 这个报错一般出现在模型返回流式响应的时候。如果你用的是 OpenAI 兼容接口返回体里 choices 字段为空或者格式不对就会报这个。先确认你请求的 Model ID 在 TaoToken 控制台里是开通状态再确认请求体里的 stream 参数和你的解析代码匹配。流式和非流式的解析方式不一样混用就会出问题。OAuth 相关的报错在 HTTP 传输里比较常见。如果你给 MCP Server 配了 OAuth2.1但 Client 没带 Token会返回 401 加 WWW-Authenticate 头。检查 Client 的配置里有没有把 Token 放进 Authorization 头。另外PKCE 流程里 code_verifier 和 code_challenge 必须成对少一个就会在换 Token 那一步失败。还有一个不报错但很坑的情况工具被列出了但模型从来不调用它。这多半是 Description 写得太模糊。比如你写「查询订单」模型不知道要传什么参数、什么时候该用。改成「按客户ID查询该客户最近30天的订单返回订单号和状态」调用率会明显上升。工具描述是给模型看的文档别糊弄。最后提醒一句MCP 的 Tool 本质上是任意代码执行规范里明确要求走用户显式授权、最小权限、工具描述不可信原则。别为了方便把 WithHttpTransport 直接绑公网也别在工具方法里执行用户传入的任意 SQL。安全边界这件事出事之前没人觉得重要出事之后补都来不及。6. 从跑通到落地.NET 开发者的接入路径链路跑通之后接下来是怎么把它用起来。我按从浅到深给你四条路径你可以根据自己的情况选。第一条工具化存量。挑三到五个高频内部操作比如查权限、查库存、发通知先包成 MCP Tools接到 VS Code 加 Copilot Agent Mode 里自测。这一步的收益最直接团队里谁都能感知到。我试过把订单查询包成 Tool 之后运营同事直接在编辑器里用自然语言查单省掉了切系统、记查询条件的时间。第二条服务化对外。把核心业务系统用 ModelContextProtocol.AspNetCore 暴露成内网 MCP 端点配上 OAuth2.1 和 Scopes让其他部门的 Agent 自助接入。这一步做完你的角色从需求接单人变成平台提供方价值完全不一样。第三条Client 嵌入式。在自有产品里嵌 MCP Client支持用户自带 MCP Server。比如客户把自己的 CRM 挂进来你的产品瞬间变成可编排的 AI 工作台。这条路径适合做 SaaS 的团队能显著提升产品的可扩展性。第四条组合式 Agent。MCP 加上 Microsoft Agent Framework 或 Semantic Kernel把多个 MCP Server 拼成多步工作流做审批链、运维巡检、报表生成。这条路径的技术门槛最高但天花板也最高。不管走哪条路接入的入口都是一样的。模型服务用 TaoToken 的 API 入口 https://taotoken.net/api API Key 在控制台里创建接入文档里有各语言的示例。如果你要验证模型效果可以直接用模型对话功能试如果要做长期编码或 Agent 开发Coding Plan 更划算。最该做的动作其实很简单这周挑一个你最熟的 .NET 服务用 ModelContextProtocol 包两个 Tool先跑通 stdio再换成 ASP.NET Core HTTP 版。跑通那一刻你就从用 AI 的人变成了被 AI 调用的人。这个位置才是工具链风口里真正值钱的地方。
返回列表