MCP协议深度解析-为什么它是AI-Agent的USB接口
MCPModel Context Protocol是2024-2025年最火的AI协议之一。这篇文章从原理到实战带你彻底搞懂它。前言如果你关注AI Agent领域你一定听说过MCP。Anthropic在2024年底推出了这个协议短短几个月就被各大AI工具采用——Claude Desktop、Cursor、Kiro、Windsurf等等都支持了MCP。但大多数人对MCP的理解停留在它能让AI调用外部工具。这篇文章我会深入讲解MCP到底解决了什么问题、它的架构设计有多精妙、以及如何自己开发一个MCP Server。一、MCP解决了什么问题没有MCP之前的痛点假设你要让AI Agent能访问GitHub、查数据库、读文件你需要Agent ←自定义适配器→ GitHub API Agent ←自定义适配器→ MySQL Agent ←自定义适配器→ 文件系统 Agent ←自定义适配器→ 邮件服务 ...每接入一个新能力就要写一套定制代码。不同的AI平台ChatGPT Plugin、Claude Tool Use还有不同的接口规范。MCP的解法标准化协议Agent ←统一MCP协议→ GitHub MCP Server → MySQL MCP Server → 文件系统 MCP Server → 邮件 MCP Server → 任何MCP Server...类比MCP之于AI就像USB之于电脑。有了USB标准键盘、鼠标、U盘、打印机都能即插即用。有了MCP标准任何外部能力都能即插即用地给AI使用。二、MCP的核心架构三个角色┌──────────┐ MCP协议 ┌──────────────┐ │ Client │ ←─────────────→ │ Server │ │ (AI应用) │ │ (能力提供者) │ └──────────┘ └──────────────┘ │ │ │ │ Claude GitHub API Cursor 数据库 Kiro 文件系统 自己的应用 任何服务三种核心能力能力说明示例Tools可调用的函数查询数据库、发送邮件Resources可读取的数据文件内容、API响应Prompts预定义的提示模板代码审查模板、翻译模板通信方式1. stdio标准输入输出 - Client启动Server进程 - 通过stdin/stdout通信 - 适合本地工具 2. SSEServer-Sent Events - 基于HTTP - Server可以推送消息 - 适合远程服务 3. HTTPStreamable HTTP - 最新的传输方式 - 支持流式响应 - 生产环境推荐三、开发一个MCP ServerPython我们来做一个实用的MCP Server查询项目的待办事项和Bug列表连接GitHub Issues。3.1 环境准备# 安装MCP SDKpipinstallmcp[cli]# 或者用uv推荐uvaddmcp[cli]3.2 基础Server结构# github_issues_server.pyimportasyncioimporthttpxfrommcp.serverimportServerfrommcp.server.stdioimportstdio_serverfrommcp.typesimport(Tool,TextContent,Resource,ResourceTemplate)# 创建Server实例serverServer(github-issues)# GitHub配置GITHUB_TOKENyour-github-tokenGITHUB_OWNERyour-usernameGITHUB_REPOyour-repoBASE_URLhttps://api.github.comHEADERS{Authorization:ftoken{GITHUB_TOKEN},Accept:application/vnd.github.v3json}3.3 定义Toolsserver.list_tools()asyncdeflist_tools()-list[Tool]:列出所有可用工具return[Tool(namelist_issues,description获取GitHub仓库的Issue列表可按状态和标签筛选,inputSchema{type:object,properties:{state:{type:string,enum:[open,closed,all],description:Issue状态默认open,default:open},labels:{type:string,description:按标签筛选多个标签用逗号分隔如: bug,priority-high},limit:{type:integer,description:返回数量限制默认10,default:10}}}),Tool(namecreate_issue,description创建一个新的GitHub Issue,inputSchema{type:object,properties:{title:{type:string,description:Issue标题},body:{type:string,description:Issue正文内容支持Markdown},labels:{type:array,items:{type:string},description:标签列表}},required:[title]}),Tool(namesearch_issues,description搜索Issue支持关键词和高级搜索语法,inputSchema{type:object,properties:{query:{type:string,description:搜索关键词}},required:[query]})]server.call_tool()asyncdefcall_tool(name:str,arguments:dict)-list[TextContent]:执行工具调用asyncwithhttpx.AsyncClient()asclient:ifnamelist_issues:returnawait_list_issues(client,arguments)elifnamecreate_issue:returnawait_create_issue(client,arguments)elifnamesearch_issues:returnawait_search_issues(client,arguments)else:return[TextContent(typetext,textf未知工具:{name})]asyncdef_list_issues(client:httpx.AsyncClient,args:dict)-list[TextContent]:获取Issue列表params{state:args.get(state,open),per_page:args.get(limit,10),sort:updated,direction:desc}iflabelsinargs:params[labels]args[labels]responseawaitclient.get(f{BASE_URL}/repos/{GITHUB_OWNER}/{GITHUB_REPO}/issues,headersHEADERS,paramsparams)ifresponse.status_code!200:return[TextContent(typetext,textfAPI请求失败:{response.status_code})]issuesresponse.json()# 格式化输出result_lines[f##{GITHUB_OWNER}/{GITHUB_REPO}Issues ({args.get(state,open)})\n]forissueinissues:labels, .join([l[name]forlinissue.get(labels,[])])label_strf [{labels}]iflabelselseresult_lines.append(f- #{issue[number]}{issue[title]}{label_str}\nf 状态:{issue[state]}| 创建者:{issue[user][login]}| f更新:{issue[updated_at][:10]})ifnotissues:result_lines.append(没有找到符合条件的Issue)return[TextContent(typetext,text\n.join(result_lines))]asyncdef_create_issue(client:httpx.AsyncClient,args:dict)-list[TextContent]:创建Issuedata{title:args[title],body:args.get(body,),labels:args.get(labels,[])}responseawaitclient.post(f{BASE_URL}/repos/{GITHUB_OWNER}/{GITHUB_REPO}/issues,headersHEADERS,jsondata)ifresponse.status_code201:issueresponse.json()return[TextContent(typetext,textf✅ Issue创建成功!\nf编号: #{issue[number]}\nf标题:{issue[title]}\nf链接:{issue[html_url]})]else:return[TextContent(typetext,textf❌ 创建失败:{response.text})]asyncdef_search_issues(client:httpx.AsyncClient,args:dict)-list[TextContent]:搜索Issuequeryf{args[query]}repo:{GITHUB_OWNER}/{GITHUB_REPO}responseawaitclient.get(f{BASE_URL}/search/issues,headersHEADERS,params{q:query,per_page:10})ifresponse.status_code!200:return[TextContent(typetext,textf搜索失败:{response.status_code})]dataresponse.json()resultsdata.get(items,[])result_lines[f## 搜索结果: {args[query]} (共{data[total_count]}条)\n]foriteminresults:result_lines.append(f- #{item[number]}{item[title]}({item[state]}))return[TextContent(typetext,text\n.join(result_lines))]3.4 定义Resourcesserver.list_resources()asyncdeflist_resources()-list[Resource]:列出可用资源return[Resource(urifgithub://{GITHUB_OWNER}/{GITHUB_REPO}/readme,name项目README,description项目的README.md文件内容,mimeTypetext/markdown)]server.read_resource()asyncdefread_resource(uri:str)-str:读取资源ifuri.endswith(/readme):asyncwithhttpx.AsyncClient()asclient:responseawaitclient.get(f{BASE_URL}/repos/{GITHUB_OWNER}/{GITHUB_REPO}/readme,headers{**HEADERS,Accept:application/vnd.github.raw})ifresponse.status_code200:returnresponse.textreturnREADME未找到returnf未知资源:{uri}3.5 启动Serverasyncdefmain():启动MCP Serverasyncwithstdio_server()as(read_stream,write_stream):awaitserver.run(read_stream,write_stream,server.create_initialization_options())if__name____main__:asyncio.run(main())四、在AI工具中使用在Kiro/Cursor中配置// .kiro/settings/mcp.json{mcpServers:{github-issues:{command:python,args:[./github_issues_server.py],env:{GITHUB_TOKEN:your-token}}}}配置后AI就能自动调用你的MCP Server来管理GitHub Issues了。使用效果用户帮我看看项目里有哪些bug还没修 AI思考我需要查看GitHub Issues中标记为bug的未关闭Issue AI调用list_issues(stateopen, labelsbug) AI回答项目当前有3个未修复的Bug... 用户把上周五讨论的登录超时问题记录一个Issue AI调用create_issue(title登录页面token过期后未自动跳转, body..., labels[bug, auth]) AI回答✅ 已创建Issue #47...五、进阶实用的MCP Server 想法Server类型功能实用场景数据库查询执行SQL、查看表结构让AI帮你写查询日志分析读取/搜索日志AI帮你排查线上问题K8s管理查看Pod状态、查日志运维助手内部文档搜索Confluence/Notion知识库问答监控面板查询Prometheus指标智能告警分析CI/CD触发Pipeline、查看构建状态部署助手六、开发MCP Server的坑坑1工具描述决定AI是否能正确调用# ❌ 描述不清楚Tool(namequery,description查询数据)# ✅ 描述清楚参数和返回值Tool(namequery_database,description执行SQL查询并返回结果。支持SELECT语句。返回格式为JSON数组每个元素为一行数据。最多返回100行超出会被截断。,inputSchema{...})坑2返回结果太长导致上下文爆炸# ❌ 返回整个表的数据asyncdef_query(sql):resultsdb.execute(sql)returnstr(results)# 可能几MB# ✅ 截断 摘要asyncdef_query(sql):resultsdb.execute(sql)iflen(results)50:summaryf共{len(results)}行显示前50行:\nresultsresults[:50]returnsummaryformat_table(results)坑3错误处理不当导致Server崩溃# ❌ 异常未捕获Server直接crashserver.call_tool()asyncdefcall_tool(name,args):resultawaitrisky_operation()# 如果抛异常Server挂了return[TextContent(typetext,textresult)]# ✅ 始终catch异常返回友好错误server.call_tool()asyncdefcall_tool(name,args):try:resultawaitrisky_operation()return[TextContent(typetext,textresult)]exceptExceptionase:return[TextContent(typetext,textf操作失败:{str(e)})]坑4没有做超时控制# 外部API可能hang住要设超时asyncwithhttpx.AsyncClient(timeout10.0)asclient:responseawaitclient.get(url)七、MCP的未来MCP正在快速演进认证与授权OAuth 2.1支持安全调用远程MCP ServerServer发现类似npm registry搜索和安装MCP ServerElicitationServer主动向用户提问获取信息多模态支持图像、音频等非文本内容可以预见MCP会成为AI Agent生态的基础设施层。现在学习和开发MCP Server就像2015年写RESTful API一样是未来的基本功。写在最后MCP的精妙之处在于它的简单——协议本身非常轻量但它解决了一个巨大的问题让AI Agent的能力可以标准化、可组合、可复用。如果你是后端开发者强烈建议把你日常用到的内部工具封装成MCP Server。这不仅能提升你自己的效率还能让整个团队的AI工具链受益。觉得有帮助的话点个赞有问题评论区讨论下篇写多Agent协作的架构设计~

相关新闻

Grok Build:基于大语言模型的自然语言应用构建实战

Grok Build:基于大语言模型的自然语言应用构建实战

在数字化转型浪潮中,技术工具的易用性正成为决定其能否广泛普及的关键。对于许多非技术背景的从业者——如产品经理、运营、市场人员乃至业务部门的决策者——他们常常面临一个困境:拥有绝佳的业务构想,却因技术门槛的阻隔,无法快…

2026/10/5 22:53:46 阅读更多 →
ReadCat:当你厌倦了广告和付费墙,这款开源阅读器带来了什么惊喜?

ReadCat:当你厌倦了广告和付费墙,这款开源阅读器带来了什么惊喜?

ReadCat:当你厌倦了广告和付费墙,这款开源阅读器带来了什么惊喜? 【免费下载链接】read-cat 一款免费、开源、简洁、纯净、无广告的小说阅读器 项目地址: https://gitcode.com/gh_mirrors/re/read-cat 还记得上一次沉浸式阅读是什么时…

2026/10/5 17:55:43 阅读更多 →
如何快速掌握AI视频创作:新手必看的完整MoneyPrinterPlus教程

如何快速掌握AI视频创作:新手必看的完整MoneyPrinterPlus教程

如何快速掌握AI视频创作:新手必看的完整MoneyPrinterPlus教程 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,GPTSoV…

2026/10/16 20:27:26 阅读更多 →

最新新闻

开源小恐龙跑酷游戏实战:C++与SDL2架构设计及手感调优

开源小恐龙跑酷游戏实战:C++与SDL2架构设计及手感调优

做“小恐龙”这种横版跑酷游戏,听起来确实不算什么大工程,但真正动手把它从“能跑起来”打磨到“手感顺滑、节奏紧凑、还能开源放出去给别人玩”,中间踩过的坑比想象中多得多。这个 3.0 版本是我把之前的代码全部推倒重写之后的成果&#xff…

2026/10/17 18:37:01 阅读更多 →
Java项目管理平台毕设:Spring Boot+MyBatis-Plus四件套实战解析

Java项目管理平台毕设:Spring Boot+MyBatis-Plus四件套实战解析

简介:面向计算机科学与技术、软件工程等专业毕业设计场景,Java项目管理平台完整资源包提供从选题、开题到答辩的一站式参考。系统基于Java EE分层设计,综合运用Servlet、JSP、MySQL数据库及Myeclipse开发工具,围绕管理员角色实现项…

2026/10/17 18:37:01 阅读更多 →
CNN实战避坑指南:LeNet-5推导、AlexNet多卡切分与ZCA白化参数手册

CNN实战避坑指南:LeNet-5推导、AlexNet多卡切分与ZCA白化参数手册

简介:本资源是一份面向计算机专业学生、深度学习初学者及AI技术爱好者的卷积神经网络(CNN)系统性入门文档,聚焦图像识别等视觉任务的核心原理与演进脉络,有效解决概念抽象、发展线索模糊、结构理解困难等学习痛点。文档…

2026/10/17 18:37:01 阅读更多 →
OpenClaw自定义技能开发:从需求拆解到协议设计的实战指南

OpenClaw自定义技能开发:从需求拆解到协议设计的实战指南

1. 动手写代码前,先想明白一件事:技能不是提示词1.1 我对技能机制的误解是怎么被纠正的前十三篇把OpenClaw的基础功能梳理得差不多了,但真正常态化使用,是从我下定决心从零写一个自定义技能开始的。一开始我把"技能"理解…

2026/10/17 18:37:01 阅读更多 →
科研数据FAIR化落地:CKAN+Dataverse轻量级服务搭建指南

科研数据FAIR化落地:CKAN+Dataverse轻量级服务搭建指南

简介:本资源是一份聚焦科研范式转型背景下数据治理路径的深度分析文档,面向高校科研管理者、图书馆信息服务中心人员、科研资助机构政策制定者及开放科学实践者。文档系统阐释了数据管理服务如何成为贯通开放获取、开放数据与开放科学三大理念的关键枢纽…

2026/10/17 18:37:01 阅读更多 →
用蒙特卡洛模拟网约车司机生存账本:叙事新闻游戏开发实战

用蒙特卡洛模拟网约车司机生存账本:叙事新闻游戏开发实战

简介:这是一款由英国《金融时报》制作的叙事性新闻游戏,围绕优步司机的经济处境与真实生活展开,玩家需在一周内尝试赚取1000美元,并在接受采访的真实司机面前做出抉择。资源面向对零工经济、交互叙事与新闻游戏开发感兴趣的读者&a…

2026/10/17 18:36:00 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →