打通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安装依赖PackageReference IncludeModelContextProtocol.AspNetCore Version1.4.0 /定义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 CallingMCP 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 AIHttpMcpServer dotnet 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: ); ListChatMessage 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语法将IListMcpTool展开为工具数组。现在你可以对AI说帮我搜索用户Alice或添加一个新用户BobAI会自动调用我们自定义MCP Server中的SearchUser和AddUser工具MCP vs Function Calling 深度对比维度Function CallingMCP工具来源编译时硬编码运行时动态发现执行位置本地进程内独立进程/远程服务工具更新需要修改代码重新编译只需更新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协议1. 初始化握手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 ServerAI能做的事用户管理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.ToolsMCP vs Function Calling的本质区别静态绑定 vs 动态生态底层通信JSON-RPC协议的握手、发现、调用流程

相关新闻

Agentic AI与低代码平台融合:企业智能体应用构建指南

Agentic AI与低代码平台融合:企业智能体应用构建指南

前言 Fortune Business Insights报告显示,全球Agentic AI市场从2025年72.9亿美元→2026年91.4亿美元→2034年1391.9亿美元。Gartner判断2026年40%企业级应用将内置AI智能体(2025年不到5%),但同时超40%的Agentic AI项目将因成本失控…

2026/7/7 7:48:20阅读更多 →
树莓派4B机械臂工程化实践:从脚本到实时控制平台

树莓派4B机械臂工程化实践:从脚本到实时控制平台

1. 为什么“脚本级控制”在机械臂项目里注定会崩盘我第一次把4-DOF机械臂接上树莓派4B时,用Python写了个50行的arm_control.py:串口发指令、读回传、用time.sleep()卡延时、GUI用tkinter画了四个滑块。运行起来——能动,但一卡一卡的&#xf…

2026/7/7 7:48:20阅读更多 →
DockDoor深度体验:重新定义macOS窗口管理的5个关键技巧

DockDoor深度体验:重新定义macOS窗口管理的5个关键技巧

DockDoor深度体验:重新定义macOS窗口管理的5个关键技巧 【免费下载链接】DockDoor Window peeking, alt-tab and other enhancements for macOS 项目地址: https://gitcode.com/gh_mirrors/do/DockDoor 还在为macOS上混乱的窗口管理而烦恼吗?Dock…

2026/7/7 7:48:20阅读更多 →
KMS_VL_ALL_AIO:企业级智能激活解决方案的技术深度解析

KMS_VL_ALL_AIO:企业级智能激活解决方案的技术深度解析

KMS_VL_ALL_AIO:企业级智能激活解决方案的技术深度解析 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在Windows和Office激活领域,技术爱好者经常面临激活失效、安全风险…

2026/7/7 8:53:26阅读更多 →
药性平和的参苓健脾丸,日常脾胃调理知识科普

药性平和的参苓健脾丸,日常脾胃调理知识科普

在日常生活中,很多人都有脾胃方面的问题,像功能性消化不良、慢性腹泻、病后体虚、老年脾虚、慢性胃炎等。想要调理脾胃,选对药很关键。复盛公参苓健脾丸就很不错。它源出健脾名方,如今市面生产厂家少,复盛公独家承袭&a…

2026/7/7 8:53:26阅读更多 →
通达信缠论可视化分析插件:3分钟掌握智能缠论技术

通达信缠论可视化分析插件:3分钟掌握智能缠论技术

通达信缠论可视化分析插件:3分钟掌握智能缠论技术 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 你是否曾经面对复杂的缠论图表感到困惑?是否在手工绘制中枢和线段时耗费数小时却…

2026/7/7 8:53:26阅读更多 →
10分钟安装REPENTOGON:解锁《以撒的结合》脚本扩展器完整指南

10分钟安装REPENTOGON:解锁《以撒的结合》脚本扩展器完整指南

10分钟安装REPENTOGON:解锁《以撒的结合》脚本扩展器完整指南 【免费下载链接】REPENTOGON Script extender for The Binding of Isaac: Repentance 项目地址: https://gitcode.com/gh_mirrors/re/REPENTOGON 你是否厌倦了《以撒的结合》传统MOD的兼容性问题…

2026/7/7 8:53:26阅读更多 →
收藏!小白也能看懂:多模态医疗大模型如何革新你的就医体验?

收藏!小白也能看懂:多模态医疗大模型如何革新你的就医体验?

医疗行业正从单一指标诊疗转向全维度数据诊疗,多模态医疗大模型通过融合影像、病历、检验等多数据,打破数据孤岛。传统诊疗痛点在于数据碎片化,AI实现跨数据融合研判,辅助医生更全面评估病情。已在三甲医院落地,提升效…

2026/7/7 8:53:26阅读更多 →
3分钟上手:终极小说下载工具,200+网站智能解析方案

3分钟上手:终极小说下载工具,200+网站智能解析方案

3分钟上手:终极小说下载工具,200网站智能解析方案 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 还在为心爱的小说突然消失而烦恼吗?novel-downl…

2026/7/7 8:48:26阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

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

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

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

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

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

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

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

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

2026/7/7 1:03:28阅读更多 →
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8…

2026/7/7 0:02:41阅读更多 →
国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot) 🌐 演示地址:http://ruoyioffice.com | 📦 源码1GitHub:ruoyi-office | 📦 源码2GitCode:ruoyi-o…

2026/7/7 0:02:41阅读更多 →
CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS SSH连接故障排查:从基础检查到深度修复的完整指南引言当你尝试通过Xshell或其他SSH客户端连接CentOS服务器时,突然遭遇"Connection refused"或"Connection timed out"的错误提示,这种经历对任何运维人员或开发者来…

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

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

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

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

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

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

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/7 5:11:21阅读更多 →