05-打通AI的工具生态-MCP协议实战
上一篇文章的Function Calling让AI获得了做事的能力。但你可能注意到了一个问题// Function Calling工具在编译时就写死了var options new ChatOptions{Tools [AIFunctionFactory.Create(GetWeatherInfo), // 写死在代码里AIFunctionFactory.Create(SearchWeb), // 想加新工具改代码重新编译]};这种方式有三个明显局限问题 说明静态注册 工具必须在编译时定义无法动态添加本地执行 工具函数必须在你的进程中运行重复开发 每个AI应用都要自己实现相同的工具想象一下如果你能让AI动态发现已有的各种工具服务——数据库查询、文件操作、API调用、代码执行……而不用为每个工具都写一遍代码那该多好这就是MCPModel Context Protocol 要解决的问题。什么是MCPMCP是由Anthropic提出的开放标准协议定义了AI模型与外部工具之间的通信规范。它的核心理念是一次实现处处接入。工具提供方只需实现一次MCP Server任何支持MCP的AI应用都能直接使用。核心概念┌───────────────────────────────────────────┐│ 你的AI应用MCP Client ││ ││ ┌─────────┐ ┌─────────────────────┐ ││ │ 大模型 │ │ MCP Client SDK │ ││ │ (LLM) │ │ │ ││ └────┬────┘ └──────────┬──────────┘ ││ │ │ │└───────┼────────────────────┼──────────────┘│ ││ Stdio / HTTP│ │┌───────┼────────────────────┼──────────────┐│ │ MCP Server A用户管理 ││ │ ┌──────────────┴──────────┐ ││ │ │ Tool: SearchUser │ ││ │ │ Tool: AddUser │ ││ │ └─────────────────────────┘ ││ │ ││ │ MCP Server B数据库查询 ││ │ ┌─────────────────────────┐ ││ │ │ Tool: run_query │ ││ │ │ Tool: list_tables │ ││ │ └─────────────────────────┘ │└───────┼───────────────────────────────────┘MCP Client你的AI应用负责发现工具、调用工具MCP Server独立的工具服务进程暴露工具列表和执行能力TransportClient与Server之间的通信方式Stdio或HTTPToolsServer暴露的工具包含名称、描述、参数Schema第一步构建自定义MCP Server本文的重点不只是用别人的MCP Server而是从零构建我们自己的MCP Server。在C#中借助官方的ModelContextProtocol.AspNetCore包这变得非常简单。项目结构AIHttpMcpServer/├── Program.cs # 服务入口配置MCP Server├── TestMcpTool.cs # 自定义工具定义└── AIHttpMcpServer.csproj安装依赖定义MCP工具在TestMcpTool.cs中定义两个用户管理工具using ModelContextProtocol.Server;using System.ComponentModel;[McpServerToolType]public class TestMcpTool{[McpServerTool][Description(“Search for a user by their username.”)]public string SearchUser(string userName){return $“Searching for user: {userName}”;}[McpServerTool] [Description(Add a new user by their username.)] public string AddUser(string userName) { return $Adding user: {userName}; }}和Function Calling类似[Description]是AI理解工具用途的关键。区别在于特性 Function Calling MCP Server工具标注 [Description] [McpServerTool] [Description]类标注 无 [McpServerToolType]执行位置 应用进程内 独立服务进程[McpServerToolType]告诉MCP框架这个类里有工具[McpServerTool]标注具体的工具方法。框架会自动扫描带这两个特性的类和方法将它们注册为MCP工具。配置MCP ServerProgram.cs中的配置非常简洁var builder WebApplication.CreateBuilder(args);builder.Services.AddMcpServer(options {options.ServerInfo new ModelContextProtocol.Protocol.Implementation{Name “AIHttpMcpServer”,Description “A simple AI HTTP MCP server.”,Version “1.0.0”};}).WithHttpTransport() // 启用HTTP传输.WithStdioServerTransport() // 同时支持Stdio传输.WithToolsFromAssembly(); // 自动扫描程序集中的工具var app builder.Build();app.MapGet(“/”, () “Hello World!”);app.MapMcp(“/mcp”); // 将MCP端点映射到 /mcp 路径app.Run();逐行解读AddMcpServer注册MCP Server服务配置Server的名称、描述、版本等元信息WithHttpTransport()启用HTTP传输模式允许远程客户端通过网络连接WithStdioServerTransport()同时支持Stdio传输本地进程间通信WithToolsFromAssembly()关键一行——自动扫描当前程序集中所有带[McpServerToolType]特性的类注册其中的工具方法MapMcp(“/mcp”)将MCP协议的HTTP端点映射到/mcp路径启动后我们的MCP Server就会在http://localhost:5144/mcp上监听客户端连接。运行MCP Servercd AIHttpMcpServerdotnet run服务启动后会在控制台显示监听地址。此时MCP Server已经就绪等待Client连接。第二步创建MCP Client连接Server现在切换到客户端项目AIMCPCallingConsole5让我们的AI应用连接到刚才构建的MCP Server。配置HTTP传输与上一篇文章使用Stdio不同这里我们使用HTTP传输连接自定义Serverusing ModelContextProtocol.Client;var config new HttpClientTransport(new HttpClientTransportOptions{Endpoint new Uri(“http://localhost:5144/mcp”),TransportMode HttpTransportMode.AutoDetect,});HttpTransportMode.AutoDetect 让客户端自动检测Server支持的传输模式SSE或Streamable HTTP无需手动指定。连接并发现工具// 创建MCP客户端并连接var mcpClient await McpClient.CreateAsync(config);// 动态发现Server暴露的所有工具var tools await mcpClient.ListToolsAsync();Console.WriteLine(“ 可用工具列表 ”);foreach (var tool in tools){Console.WriteLine($ {tool.Name}: {tool.Description});}运行后你会看到 可用工具列表 SearchUser: Search for a user by their username.AddUser: Add a new user by their username.这就是MCP的魔力——运行时动态发现工具 你不需要事先知道有哪些工具MCP Client会自动获取Server暴露的全部工具列表包括名称、描述和参数Schema。第三步将MCP工具接入AI对话发现工具后将它们注入到AI对话中// 创建AI客户端同前几篇IChatClient client new OpenAI.Chat.ChatClient(model,new ApiKeyCredential(apiKey),new OpenAI.OpenAIClientOptions { Endpoint new Uri(baseUrl) }).AsIChatClient();// 启用自动函数调用using var functionCallingChatClient new ChatClientBuilder(client).UseFunctionInvocation().Build();// 对话循环while (true){Console.Write(Prompt: );List messages [];messages.Add(new(ChatRole.User, Console.ReadLine()));// 关键直接把MCP工具列表传给ChatOptions.Tools await foreach (ChatResponseUpdate update in functionCallingChatClient .GetStreamingResponseAsync(messages, new() { Tools [.. tools] })) { foreach (var item in update.Contents) { if (item is TextReasoningContent textReasoning) { Console.Write(textReasoning.Text); } else if (item is TextContent text) { Console.Write(text.Text); } else if (item is UsageContent usageContent) { Console.WriteLine(); Console.WriteLine(JsonSerializer.Serialize(usageContent.Details)); } } } Console.WriteLine();}核心代码只有一行关键改动// Function Calling手动注册本地函数new ChatOptions { Tools [AIFunctionFactory.Create(GetWeatherInfo)] }// MCP直接传入动态发现的MCP工具列表new ChatOptions { Tools [… tools] }[… tools]使用了C#的spread语法将IList展开为工具数组。现在你可以对AI说帮我搜索用户Alice或添加一个新用户BobAI会自动调用我们自定义MCP Server中的SearchUser和AddUser工具MCP vs Function Calling 深度对比维度 Function Calling MCP工具来源 编译时硬编码 运行时动态发现执行位置 本地进程内 独立进程/远程服务工具更新 需要修改代码重新编译 只需更新ServerClient零改动工具数量 受限于代码维护能力 可接入任意多的Server协议标准 OpenAI Tool协议 MCP开放标准跨语言 函数必须在你的应用中实现 ✅ Server可以是任何语言部署复杂度 简单同一进程 稍复杂多进程管理适用场景 小型应用、少量工具 Agent平台、工具生态集成一个直观的比喻Function Calling 你雇了几个全职员工工具写死在代码里MCP 你接入了一个人才市场按需发现和调用各种工具服务MCP的两种传输方式MCP支持两种传输方式适用于不同场景方式 适用场景 特点Stdio 本地进程通信 通过标准输入输出简单可靠HTTPSSE 远程服务/跨网络 支持HTTP端点适合分布式部署Stdio方式本地进程var config new StdioClientTransport(new StdioClientTransportOptions(){Command “dnx”,Arguments [“NuGet.Mcp.Server”, “–source”, “https://api.nuget.org/v3/index.json”, “–yes”]});Client启动一个子进程通过进程的标准输入/输出交换JSON-RPC消息。HTTP方式远程服务var config new HttpClientTransport(new HttpClientTransportOptions{Endpoint new Uri(“http://localhost:5144/mcp”),TransportMode HttpTransportMode.AutoDetect,});Client通过HTTP连接到远程MCP Server。本文示例正是使用这种方式。MCP的底层通信通过项目中提供的HTTP拦截器详见06-番外篇我们可以观察到MCP的完整交互过程。MCP底层使用JSON-RPC 2.0协议初始化握手Client启动时会与Server进行握手// Client → Server{“jsonrpc”:“2.0”,“method”:“initialize”,“params”:{“protocolVersion”:“2024-11-05”,…}}// Server → Client{“jsonrpc”:“2.0”,“result”:{“protocolVersion”:“2024-11-05”,“capabilities”:{…}}}2. 工具发现// Client → Server{“jsonrpc”:“2.0”,“method”:“tools/list”}// Server → Client{“result”: {“tools”: [{“name”: “SearchUser”,“description”: “Search for a user by their username.”,“inputSchema”: {“type”: “object”,“properties”: {“userName”: { “type”: “string” }}}},{“name”: “AddUser”,“description”: “Add a new user by their username.”,“inputSchema”: {“type”: “object”,“properties”: {“userName”: { “type”: “string” }}}}]}}3. 工具调用当AI决定调用某个MCP工具时// Client → Server{“jsonrpc”: “2.0”,“method”: “tools/call”,“params”: {“name”: “SearchUser”,“arguments”: { “userName”: “Alice” }}}// Server → Client{“result”: {“content”: [{ “type”: “text”, “text”: “Searching for user: Alice” }]}}完整流程图用户“帮我搜索用户Alice”↓AI模型我需要调用SearchUser工具↓MCP Client → [JSON-RPC over HTTP] → 自定义MCP Server (localhost:5144)↓Server执行SearchUser(“Alice”)返回结果↓MCP Client将结果回传给AI模型↓AI模型基于结果生成回答“已为您搜索用户Alice的信息”构建你自己的MCP Server能做什么本文只是用TestMcpTool演示了两个简单的用户管理工具。在实际场景中你可以用同样的模式构建强大的MCP ServerMCP Server AI能做的事用户管理Server 搜索用户、添加用户、权限管理数据库Server 执行查询、列出表、分析数据文件Server 读写文件、管理目录、上传下载GitHub Server 查看PR、创建Issue、管理仓库运维Server 查看服务状态、管理容器、分析日志构建MCP Server的核心步骤始终只有三步定义工具用[McpServerTool] [Description]标注方法注册工具用WithToolsFromAssembly()自动扫描暴露端点用MapMcp(“/mcp”)映射HTTP路径安全注意事项MCP工具是真正执行操作的所以安全至关重要风险 应对措施AI调用危险工具如删除文件 工具白名单机制只暴露安全的工具参数注入如SQL注入 Server端做好参数校验和转义过度授权 最小权限原则MCP Server只拥有必要的权限敏感数据泄露 工具返回结果脱敏小结这篇文章我们学习了MCP协议的核心概念Client、Server、Tools、Transport构建自定义MCP Server用[McpServerTool]定义工具WithToolsFromAssembly()自动注册HTTP传输通过HttpClientTransport连接到远程MCP Server动态工具发现运行时获取Server暴露的工具列表与AI对话集成将MCP工具直接注入ChatOptions.Tools

相关新闻

晶体管 Cascode 与 FET Cascode 对比:3 种仿真场景下的带宽与输入阻抗分析

晶体管 Cascode 与 FET Cascode 对比:3 种仿真场景下的带宽与输入阻抗分析

晶体管 Cascode 与 FET Cascode 对比:3 种仿真场景下的带宽与输入阻抗分析高频放大电路设计工程师常面临一个经典难题:如何在保证增益的同时,兼顾带宽与输入阻抗?Cascode结构以其独特的拓扑形式,成为解决这一矛盾的利器…

2026/7/11 22:01:54阅读更多 →
TB67H480FNG与PIC18F86K90电机控制方案详解

TB67H480FNG与PIC18F86K90电机控制方案详解

1. TB67H480FNG与PIC18F86K90的黄金组合解析在电机控制领域,选择合适的驱动器和微控制器组合往往能决定项目的成败。TB67H480FNG作为东芝新一代PWM斩波型双极步进电机驱动器,搭配Microchip的PIC18F86K90高性能8位微控制器,形成了工业级电机控…

2026/7/11 22:01:54阅读更多 →
给开源项目接行情 API:多源价格冲突时先写一个 Quote Evidence Adapter

给开源项目接行情 API:多源价格冲突时先写一个 Quote Evidence Adapter

一、问题:两个价格,该信谁 你给开源项目接了两个行情数据源。同一个 symbol,同一时间附近,一个返回 100.12,另一个返回 100.18。 接口都返回了 200。价格都看起来正常。你的第一反应可能是:其中有一个错了。…

2026/7/11 22:01:54阅读更多 →
STM32H7 DMA 数据一致性实战:3种MPU配置方案对比与性能实测

STM32H7 DMA 数据一致性实战:3种MPU配置方案对比与性能实测

STM32H7 DMA数据一致性实战:3种MPU配置方案对比与性能实测在嵌入式开发中,DMA与Cache的数据一致性问题一直是开发者面临的棘手挑战。STM32H7作为高性能Cortex-M7内核微控制器,其内置的MPU(内存保护单元)为解决这一问题…

2026/7/11 22:57:00阅读更多 →
立创EDA专业版 PCB 逆向生成原理图实战:千元件级工程恢复与3个关键避坑点

立创EDA专业版 PCB 逆向生成原理图实战:千元件级工程恢复与3个关键避坑点

立创EDA专业版PCB逆向生成原理图实战:千元件级工程恢复与3个关键避坑点在电子设计领域,逆向工程一直是个充满挑战的技术活。想象一下这样的场景:你接手了一个遗留项目,手头只有PCB文件,原理图早已不知所踪;…

2026/7/11 22:57:00阅读更多 →
2026年天津统招专升本培训保过班来袭,为你提供实实在在的录取保障!

2026年天津统招专升本培训保过班来袭,为你提供实实在在的录取保障!

在高等教育竞争日益激烈的当下,统招专升本成为众多专科生提升学历、开启美好未来的关键途径。然而,天津统招专升本考试充满挑战,考生们面临着诸多痛点。2026 年,津诚育才培训学校推出的统招专升本培训保过班,为考生们带…

2026/7/11 22:57:00阅读更多 →
Anaconda 2024.10.1 + PyCharm 2024.2:3步配置Python 3.12项目环境(含清华源)

Anaconda 2024.10.1 + PyCharm 2024.2:3步配置Python 3.12项目环境(含清华源)

Anaconda 2024.10.1 PyCharm 2024.2:Python 3.12项目环境极速配置指南(含国内镜像优化)在数据科学和机器学习领域,高效的环境配置是项目成功的第一步。本文将带你快速搭建基于最新Anaconda 2024.10.1和PyCharm 2024.2的Python 3.…

2026/7/11 22:57:00阅读更多 →
NBM5100A与STM32F405ZG的低功耗电源管理方案

NBM5100A与STM32F405ZG的低功耗电源管理方案

1. 项目背景与核心挑战在便携式电子设备设计中,电池寿命和电流输出能力始终是工程师面临的两大核心难题。NBM5100A作为Nexperia推出的电池寿命增强器IC,配合STM32F405ZG这类高性能微控制器,能够有效解决低电压场景下的系统稳定性问题。我在最…

2026/7/11 22:56:59阅读更多 →
电机功率环 PID 控制 C 代码实现:从 80W 目标到速度环的 4 路输出

电机功率环 PID 控制 C 代码实现:从 80W 目标到速度环的 4 路输出

电机功率环PID控制的工程化实现:从结构体设计到四路速度环耦合在机器人底盘、电动工具等高动态负载场景中,传统的速度环控制往往难以应对突变的阻力矩。上周调试一台自动割草机时,当刀片遇到厚实的草团,电机转速骤降导致电流飙升—…

2026/7/11 22:51:59阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/11 18:37:06阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/11 15:18:12阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/11 15:11:32阅读更多 →
Premiere Pro 2025安装失败原因与AGSIS验证绕过指南

Premiere Pro 2025安装失败原因与AGSIS验证绕过指南

1. 为什么2025版PR安装比以往更“磨人”?——从弹窗警告到路径陷阱的真实处境 Premiere Pro 2025版不是简单的一次版本迭代,它是一道分水岭。我从去年底开始帮影视工作室、高校剪辑实验室和自由职业者部署2025环境,累计处理了137台设备&#…

2026/7/11 0:03:43阅读更多 →
5款实用macOS系统优化工具:让你的Mac运行更流畅更高效

5款实用macOS系统优化工具:让你的Mac运行更流畅更高效

5款实用macOS系统优化工具:让你的Mac运行更流畅更高效 【免费下载链接】open-source-mac-os-apps 🚀 Awesome list of open source applications for macOS. https://t.me/s/opensourcemacosapps 项目地址: https://gitcode.com/gh_mirrors/op/open-so…

2026/7/11 0:03:43阅读更多 →
5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:03:43阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/11 16:20:28阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/10 22:20:33阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/11 18:12:23阅读更多 →