当前位置: 首页 > article >正文

AI Agent实战一:MCP协议从入门到实践

AI辅助创作 | 专栏《2026 AI编程效率革命》第07篇前言MCPModel Context Protocol是Anthropic在2024年底推出的开放协议旨在标准化AI模型与外部工具、数据源的交互方式。到2026年MCP已经成为AI Agent开发的事实标准协议。本文将从零开始带你理解MCP协议的核心概念并通过实战代码搭建一个完整的MCP服务。一、MCP协议是什么1.1 为什么需要MCP在MCP出现之前AI工具集成面临以下问题每个AI应用都要为每个工具写单独的集成代码工具接口没有统一标准重复造轮子模型切换时工具链需要重写MCP的核心理念像USB-C统一接口一样统一AI与工具的连接方式。1.2 MCP架构┌─────────────┐ MCP协议 ┌─────────────┐ │ AI应用 │ ◄──────────────► │ MCP Server │ │ (Host) │ │ (工具提供方) │ │ 如: Cursor │ │ │ └─────────────┘ └──────┬───────┘ │ ┌──────┴───────┐ │ 外部资源 │ │ 数据库/API │ │ 文件系统等 │ └──────────────┘MCP定义了三种核心能力能力说明示例Tools可调用的函数查询数据库、发送邮件Resources可读取的数据文件内容、数据库记录Prompts预定义提示词代码审查模板二、MCP开发环境搭建2.1 安装MCP SDK# 安装MCP Python SDKuvaddmcp# 安装官方示例依赖uvaddhttpx pydantic2.2 项目结构mcp-demo/ ├── pyproject.toml ├── .env ├── server/ │ ├── __init__.py │ ├── weather_server.py # 天气查询MCP服务 │ ├── file_server.py # 文件管理MCP服务 │ └── db_server.py # 数据库查询MCP服务 ├── client/ │ ├── __init__.py │ └── mcp_client.py # MCP客户端 └── tests/ └── test_server.py三、实战创建你的第一个MCP Server3.1 天气查询MCP服务# server/weather_server.pyimporthttpxfrommcp.serverimportServerfrommcp.typesimportTool,TextContent# 创建MCP Server实例serverServer(weather-service)server.list_tools()asyncdeflist_tools()-list[Tool]:声明服务提供的工具列表return[Tool(nameget_weather,description获取指定城市的当前天气信息,inputSchema{type:object,properties:{city:{type:string,description:城市名称如北京、上海},unit:{type:string,enum:[celsius,fahrenheit],description:温度单位默认摄氏度,default:celsius}},required:[city]}),Tool(nameget_forecast,description获取未来3天天气预报,inputSchema{type:object,properties:{city:{type:string,description:城市名称}},required:[city]})]server.call_tool()asyncdefcall_tool(name:str,arguments:dict)-list[TextContent]:处理工具调用请求ifnameget_weather:returnawaitget_weather(arguments[city],arguments.get(unit,celsius))elifnameget_forecast:returnawaitget_forecast(arguments[city])else:raiseValueError(f未知工具:{name})asyncdefget_weather(city:str,unit:strcelsius)-list[TextContent]:查询天气使用模拟数据# 实际项目中调用天气APIweather_data{北京:{temp:22,humidity:45,condition:晴},上海:{temp:25,humidity:72,condition:多云},深圳:{temp:30,humidity:80,condition:阵雨},}dataweather_data.get(city,{temp:20,humidity:50,condition:未知})ifunitfahrenheit:data[temp]data[temp]*9/532result(f{city}当前天气\nf️ 温度:{data[temp]}{°Cifunitcelsiuselse°F}\nf 湿度:{data[humidity]}%\nf️ 状况:{data[condition]})return[TextContent(typetext,textresult)]asyncdefget_forecast(city:str)-list[TextContent]:获取天气预报forecast(f{city}未来3天预报\nf明天: 晴18-26°C\nf后天: 多云17-24°C\nf大后天: 小雨15-22°C)return[TextContent(typetext,textforecast)]# 启动服务if__name____main__:importasynciofrommcp.server.stdioimportstdio_serverasyncdefmain():asyncwithstdio_server()as(read_stream,write_stream):awaitserver.run(read_stream,write_stream)asyncio.run(main())3.2 文件管理MCP服务# server/file_server.pyimportosimportjsonfrompathlibimportPathfrommcp.serverimportServerfrommcp.typesimportTool,TextContent serverServer(file-manager)WORKSPACEPath(./workspace)server.list_tools()asyncdeflist_tools()-list[Tool]:return[Tool(namelist_files,description列出指定目录下的文件,inputSchema{type:object,properties:{path:{type:string,description:目录路径相对于workspace}},required:[path]}),Tool(nameread_file,description读取文件内容,inputSchema{type:object,properties:{path:{type:string,description:文件路径}},required:[path]}),Tool(namewrite_file,description写入文件,inputSchema{type:object,properties:{path:{type:string},content:{type:string}},required:[path,content]}),Tool(namesearch_files,description按名称搜索文件,inputSchema{type:object,properties:{pattern:{type:string,description:搜索关键词}},required:[pattern]})]server.call_tool()asyncdefcall_tool(name:str,arguments:dict)-list[TextContent]:ifnamelist_files:targetWORKSPACE/arguments[path]files[str(f.relative_to(WORKSPACE))forfintarget.rglob(*)iff.is_file()]return[TextContent(typetext,textjson.dumps(files[:50],indent2))]elifnameread_file:targetWORKSPACE/arguments[path]contenttarget.read_text(encodingutf-8)return[TextContent(typetext,textcontent)]elifnamewrite_file:targetWORKSPACE/arguments[path]target.parent.mkdir(parentsTrue,exist_okTrue)target.write_text(arguments[content],encodingutf-8)return[TextContent(typetext,textf已写入:{arguments[path]})]elifnamesearch_files:results[str(f.relative_to(WORKSPACE))forfinWORKSPACE.rglob(f*{arguments[pattern]}*)iff.is_file()]return[TextContent(typetext,textjson.dumps(results[:20],indent2))]raiseValueError(f未知工具:{name})if__name____main__:importasynciofrommcp.server.stdioimportstdio_serverasyncdefmain():asyncwithstdio_server()as(read_stream,write_stream):awaitserver.run(read_stream,write_stream)asyncio.run(main())四、MCP客户端开发4.1 连接MCP Server# client/mcp_client.pyimportasynciofrommcpimportClientSession,StdioServerParametersfrommcp.client.stdioimportstdio_clientclassMCPClient:def__init__(self):self.session:ClientSession|NoneNoneself.available_tools:list[]asyncdefconnect(self,server_command:list[str]):连接到MCP Serverserver_paramsStdioServerParameters(commandserver_command[0],argsserver_command[1:],)self.stdio_contextstdio_client(server_params)read_stream,write_streamawaitself.stdio_context.__aenter__()self.sessionClientSession(read_stream,write_stream)awaitself.session.__aenter__()awaitself.session.initialize()# 获取可用工具列表resultawaitself.session.list_tools()self.available_toolsresult.toolsprint(f已连接可用工具:{[t.namefortinself.available_tools]})asyncdefcall_tool(self,tool_name:str,arguments:dict):调用工具ifnotself.session:raiseRuntimeError(未连接到MCP Server)resultawaitself.session.call_tool(tool_name,arguments)returnresult.contentasyncdefdisconnect(self):断开连接ifself.session:awaitself.session.__aexit__(None,None,None)awaitself.stdio_context.__aexit__(None,None,None)asyncdefmain():clientMCPClient()# 连接天气服务awaitclient.connect([python,server/weather_server.py])# 调用工具resultawaitclient.call_tool(get_weather,{city:北京})print(result[0].text)resultawaitclient.call_tool(get_forecast,{city:上海})print(result[0].text)awaitclient.disconnect()if__name____main__:asyncio.run(main())五、与AI模型集成5.1 将MCP工具接入LangChain Agent# integration/langchain_mcp_agent.pyimportasyncioimportjsonfromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportcreate_tool_calling_agent,AgentExecutorfromlangchain_core.toolsimporttoolfromlangchain_core.promptsimportChatPromptTemplatefromclient.mcp_clientimportMCPClient# 创建MCP客户端mcp_clientMCPClient()toolasyncdefquery_weather(city:str)-str:查询指定城市的天气信息resultawaitmcp_client.call_tool(get_weather,{city:city})returnresult[0].texttoolasyncdefget_forecast(city:str)-str:获取城市未来3天天气预报resultawaitmcp_client.call_tool(get_forecast,{city:city})returnresult[0].textasyncdefrun_agent():# 连接MCP服务awaitmcp_client.connect([python,server/weather_server.py])# 创建LangChain AgentllmChatOpenAI(modelgpt-5.5,temperature0)tools[query_weather,get_forecast]promptChatPromptTemplate.from_messages([(system,你是一个天气助手可以查询天气和预报。用中文回复。),(human,{input}),(placeholder,{agent_scratchpad}),])agentcreate_tool_calling_agent(llm,tools,prompt)executorAgentExecutor(agentagent,toolstools,verboseTrue)# 测试resultawaitexecutor.ainvoke({input:北京和上海今天天气怎么样明天呢})print(result[output])awaitmcp_client.disconnect()if__name____main__:asyncio.run(run_agent())六、在Cursor中使用MCPCursor原生支持MCP协议配置方法// .cursor/mcp.json{mcpServers:{weather:{command:python,args:[server/weather_server.py]},file-manager:{command:python,args:[server/file_server.py]}}}配置完成后在Cursor的Agent模式中就可以直接调用这些MCP工具了。七、MCP生态与社区资源2026年MCP生态已经相当成熟MCP Hub官方工具市场数百个现成MCP Server常用MCP Server数据库(PostgreSQL/MySQL)、GitHub、Slack、Google Drive等多语言SDKPython、TypeScript、Java、Go总结MCP协议通过标准化AI与工具的交互方式解决了重复集成的问题。本文从协议原理讲到实战代码覆盖了MCP的核心概念Tools/Resources/PromptsMCP Server开发实战MCP客户端开发与LangChain Agent集成在Cursor中使用MCP下一篇我们将深入多Agent协作系统的搭建利用MCP协议构建更复杂的AI应用。免责声明本文为AI辅助创作内容代码示例仅供学习参考。MCP协议规范可能随版本更新而变化请以官方文档为准。实际项目中请注意API Key安全和数据隐私保护。专栏《2026 AI编程效率革命》| 第07篇发布日期2026-05-03

相关文章:

AI Agent实战一:MCP协议从入门到实践

AI辅助创作 | 专栏《2026 AI编程效率革命》第07篇前言 MCP(Model Context Protocol)是Anthropic在2024年底推出的开放协议,旨在标准化AI模型与外部工具、数据源的交互方式。到2026年,MCP已经成为AI Agent开发的事实标准协议。本文…...

C# 13 Span<T>高频误用TOP5,含IL反编译证据链——你的代码可能正在泄漏栈内存

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;C# 13 Span<T>高性能处理方法 Span<T> 的核心优势 Span<T> 是 C# 7.2 引入的栈分配安全类型&#xff0c;在 C# 13 中进一步优化了编译器内联与边界检查消除能力。它允许对任意内存…...

别再只调Batch Size了!用DeepSpeed ZeRO-3配置,让你的多卡A100训练百亿模型效率翻倍

百亿参数模型训练实战&#xff1a;DeepSpeed ZeRO-3配置的黄金法则 当你的GPU集群开始训练百亿参数模型时&#xff0c;显存不足的警告就像午夜响起的火警铃声一样令人窒息。传统的数据并行方法在模型规模突破十亿参数后显得力不从心&#xff0c;而简单的batch size调整更像是用…...

Android蓝牙开发深度解析:从基础到实战

在移动应用开发领域,蓝牙技术已成为Android设备互联的核心功能,广泛应用于物联网、健康监测、智能家居等场景。本文基于Android开发工程师职位描述,将核心内容聚焦于蓝牙技术,探讨如何高效实现蓝牙功能、解决常见问题,并优化用户体验。文章涵盖蓝牙基础知识、Android开发框…...

为OpenClaw智能体工作流配置统一的模型调用后端

为OpenClaw智能体工作流配置统一的模型调用后端 1. 场景需求与方案概述 在构建基于OpenClaw的自动化工作流时&#xff0c;开发者常面临多模型供应商切换带来的运维复杂度。通过将模型调用后端统一配置为Taotoken平台&#xff0c;可实现以下工程价值&#xff1a; 通过单一API…...

OpenDroneMap终极指南:如何用免费开源工具将无人机照片转为专业级3D模型

OpenDroneMap终极指南&#xff1a;如何用免费开源工具将无人机照片转为专业级3D模型 【免费下载链接】ODM A command line toolkit to generate maps, point clouds, 3D models and DEMs from drone, balloon or kite images. &#x1f4f7; 项目地址: https://gitcode.com/g…...

体验taotoken多模型路由在高峰时段的请求成功率

体验 Taotoken 多模型路由在高峰时段的请求成功率 1. 测试背景与场景设定 近期我们在业务高峰期对 Taotoken 的多模型路由能力进行了持续测试。测试场景为每日 9:00-11:00 和 14:00-16:00 两个典型高峰时段&#xff0c;通过自动化脚本以固定频率调用 API&#xff0c;模型选择…...

哔咔漫画下载器:告别龟速等待,开启漫画下载革命性体验

哔咔漫画下载器&#xff1a;告别龟速等待&#xff0c;开启漫画下载革命性体验 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器&#xff0c;带图形界面 带收藏夹&#xff0c;已打包exe 下载速度飞快 项目地址: https://gitc…...

TestDisk终极指南:免费找回丢失分区和误删文件的完整解决方案

TestDisk终极指南&#xff1a;免费找回丢失分区和误删文件的完整解决方案 【免费下载链接】testdisk TestDisk & PhotoRec 项目地址: https://gitcode.com/gh_mirrors/te/testdisk 你是否经历过硬盘分区突然消失的恐慌&#xff1f;或者误删了重要文件却无法从回收站…...

GitHub访问受阻?用快马AI五分钟搭建一个待办事项应用原型

最近在做一个个人项目时&#xff0c;突然发现GitHub访问不太稳定&#xff0c;原本想参考的开源项目代码无法获取。作为一个习惯在GitHub上找灵感的开发者&#xff0c;这确实让人有点头疼。不过好在发现了InsCode(快马)平台&#xff0c;它让我在没有GitHub的情况下&#xff0c;也…...

Swoole:低抽象。你需要自己处理 HTTP 协议解析、路由分发、静态文件服务、Session 管理。

更准确的说法是&#xff1a;Swoole 提供了“原语级”的网络能力&#xff0c;而非“业务级”的 Web 功能。 它给了你构建 Web 服务器的砖块和水泥&#xff0c;而不是直接给你一栋精装房。 如果把 Web 开发比作建房&#xff1a; Laravel/ThinkPHP (FPM)&#xff1a;是精装公寓。拎…...

如何快速解决Windows 11更新后TranslucentTB启动失败的完整指南

如何快速解决Windows 11更新后TranslucentTB启动失败的完整指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB是一款广受…...

C++实时控制代码为何在产线突然失效?:揭秘未被静态分析捕获的3类ASIL-D级内存缺陷及MCU级修复模板

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;工业控制 C 功能安全编码指南 在工业控制系统&#xff08;ICS&#xff09;中&#xff0c;C 代码的可靠性直接关系到人身安全、设备完整性与生产连续性。功能安全&#xff08;Functional Safety&#xf…...

AI辅助开发:让快马智能生成九么动漫推荐系统交互页面

AI辅助开发&#xff1a;让快马智能生成九么动漫推荐系统交互页面 最近想做一个动漫推荐系统的小项目&#xff0c;正好看到"九么1.0.31免费版"这个动漫资源平台&#xff0c;就想试试能不能做个简单的交互页面。作为一个前端开发新手&#xff0c;我决定尝试用AI辅助开…...

5分钟快速上手:打造macOS桌面歌词显示的终极解决方案

5分钟快速上手&#xff1a;打造macOS桌面歌词显示的终极解决方案 【免费下载链接】Lyrics Swift-based iTunes plug-in to display lyrics on the desktop. 项目地址: https://gitcode.com/gh_mirrors/lyr/Lyrics 还在为macOS上缺少专业的桌面歌词显示工具而烦恼吗&…...

3个数据洞察让《碧蓝幻想:Relink》输出效率翻倍:GBFR Logs实战指南

3个数据洞察让《碧蓝幻想&#xff1a;Relink》输出效率翻倍&#xff1a;GBFR Logs实战指南 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/gh_mirrors…...

STC32F12单片机驱动WS2812B灯带:一个IO口搞定炫彩灯效(附完整代码)

STC32F12单片机驱动WS2812B灯带&#xff1a;单线控制实现专业级灯光秀 1. 项目构思与硬件选型 在智能家居和创意装饰领域&#xff0c;可编程LED灯带因其丰富的色彩表现和灵活的布局方式&#xff0c;已成为DIY爱好者的首选材料。WS2812B作为市面上最流行的智能RGB LED灯珠&#…...

Hitboxer:游戏键盘输入的革命性仲裁器

Hitboxer&#xff1a;游戏键盘输入的革命性仲裁器 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在《街头霸王6》中因为同时按下W和S键导致角色原地卡顿而错失连招&#xff1f;是否在《CS2》中急停转向…...

使用Taotoken CLI工具快速为团队项目初始化统一的大模型环境

使用Taotoken CLI工具快速为团队项目初始化统一的大模型环境 1. 准备工作 在开始配置前&#xff0c;请确保团队项目已具备以下基础条件&#xff1a;Node.js运行环境&#xff08;建议v16及以上版本&#xff09;、Python环境&#xff08;建议3.8&#xff09;以及项目目录的写入…...

别再乱用memcpy了!STM32通信协议解析,你得先搞定结构体对齐

STM32通信协议解析&#xff1a;结构体对齐与memcpy的隐秘陷阱 当你在STM32项目中使用memcpy将字节流直接复制到结构体时&#xff0c;是否遇到过数据错位的诡异现象&#xff1f;这背后隐藏着嵌入式开发中一个关键但常被忽视的概念——结构体内存对齐。与桌面开发不同&#xff0c…...

提升模型部署效率:基于快马平台将omlx模型快速封装为生产级API

最近在做一个机器学习模型上线的项目&#xff0c;用到了omlx格式的模型文件。omlx确实解决了不同框架模型互操作的问题&#xff0c;但要把模型真正部署成生产可用的API服务&#xff0c;还是有不少工作要做。经过一番摸索&#xff0c;我发现用InsCode(快马)平台可以大大简化这个…...

保姆级教程:在ROS Noetic下用move_base让你的机器人学会自主探索(附完整代码包)

从零实现ROS机器人自主探索&#xff1a;move_base实战全解析 在机器人研究领域&#xff0c;让机器具备自主移动能力始终是核心挑战之一。想象一下&#xff0c;当你第一次看到扫地机器人避开障碍物、规划最优路径完成全屋清洁时&#xff0c;那种科技带来的震撼感。现在&#xff…...

模拟IC设计中的那些“反直觉”现象:为什么正反馈也能稳定?PLL死区到底有几种?

模拟IC设计中的那些“反直觉”现象&#xff1a;为什么正反馈也能稳定&#xff1f;PLL死区到底有几种&#xff1f; 在模拟集成电路设计的迷宫中&#xff0c;工程师们常常会遇到一些看似违背直觉的现象——就像走进一间镜子屋&#xff0c;你以为向左转就能避开障碍&#xff0c;却…...

OpenClaw Agents:模块化AI智能体设计、部署与工程化实践指南

1. 项目概述&#xff1a;OpenClaw Agents 是什么&#xff1f;如果你和我一样&#xff0c;对把大语言模型&#xff08;LLM&#xff09;塞进一个能真正干活的“数字员工”感兴趣&#xff0c;并且对数据隐私和完全控制权有执念&#xff0c;那么tim-dickey/OpenClaw-agents这个项目…...

别再死记硬背了!用URP Shader Library里的方法,让你的HLSL代码更简洁高效

别再死记硬背了&#xff01;用URP Shader Library里的方法&#xff0c;让你的HLSL代码更简洁高效 在Unity的Shader开发中&#xff0c;很多开发者习惯手动编写各种坐标转换和矩阵运算&#xff0c;这不仅增加了代码量&#xff0c;还容易引入错误。实际上&#xff0c;URP&#xff…...

DDR5内存的On Die ECC到底有啥用?和传统ECC内存条有啥区别?

DDR5内存的On Die ECC技术解析&#xff1a;消费级与服务器级纠错方案的本质差异 最近在装机论坛看到不少关于DDR5内存的讨论&#xff0c;有个概念反复被提及却总让人云里雾里——On Die ECC。作为从DDR4时代就开始折腾内存超频的老玩家&#xff0c;我第一次在商品页面看到这个术…...

Shiro框架下Secure Cookie引发的302循环重定向,一个配置项如何让登录接口‘罢工’?

Shiro框架下Secure Cookie引发的302循环重定向问题深度解析 1. 问题现象与初步诊断 最近在调试一个基于Shiro框架的登录系统时&#xff0c;遇到了一个令人困惑的现象&#xff1a;每当尝试访问登录接口&#xff0c;浏览器就会陷入无限循环的302重定向。打开开发者工具&#xf…...

自动驾驶安全新视角:用DriveAct数据集,聊聊如何让AI看懂司机的‘小动作’

自动驾驶安全新视角&#xff1a;用Drive&Act数据集解码驾驶员行为密码 当特斯拉Autopilot系统在高速公路上突然提醒"请保持注意力"时&#xff0c;后座的孩子总会好奇地问&#xff1a;"爸爸&#xff0c;车怎么知道你没看路&#xff1f;"这个看似简单的交…...

多级泛型接口嵌套

多级泛型接口嵌套的设计模式&#xff0c;从基础到业务逐层扩展&#xff1a;---层级设计 IBaseDao[T] // 最基础&#xff1a;单实体 CRUD↑ IGeneralDao[T, R] // 通用层&#xff1a;实体 返回类型分离↑ IBusinessDao[T, Q, R] // 业务层&#xff1a;实体 查询条…...

GDSDecomp终极指南:如何高效反编译Godot游戏资源与脚本

GDSDecomp终极指南&#xff1a;如何高效反编译Godot游戏资源与脚本 【免费下载链接】gdsdecomp Godot reverse engineering tools 项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp 在游戏开发领域&#xff0c;Godot引擎因其开源特性和强大的功能而备受青睐…...