尧图精选

MCP搭建全攻略:从协议原理到Server开发实战

🕒 发布时间:2026/9/26 7:59:18 📁 来源:尧图网络
讲个真实感受MCP这个关键词最近在技术社区里刷屏的频率高得吓人。我随手搜了一下光是围绕它的热搜词就能排出几十个——蓝湖MCP、Figma MCP、BurpSuite MCP、Playwright MCP、Blender MCP、12306 MCP甚至还有人问Vivado的MCP怎么搭。这说明什么说明MCP已经从“AI圈内小众协议”变成了整个开发工具链里的基础设施级话题。但是搜得越多越容易糊涂MCP到底是什么、我自己要不要搭、从哪儿下手很多人其实没搞明白。这篇文章就从实操角度把“搭建MCP”这件事讲透。我会先从协议本身的逻辑讲起然后带你从零跑通一个自己的MCP Server再切换到客户端视角把Curosr、Claude Code、Codex这些常见场景的接入方式过一遍最后集中处理调试、日志、超时这类高频问题。内容适配三类人想在公司内部落地AI工具链的开发者、做设计/测试/自动化场景集成的前端与测试工程师、以及被各种MCP热搜词搞懵但想系统搞懂的初学者。不管你现在处于哪个阶段按这篇文章走完一遍你至少能自己判断“哪儿该用MCP哪儿不该用”。1. MCP到底是什么为什么突然到处都是1.1 一个协议解决“AI接工具”的混乱MCP的全称是Model Context Protocol模型上下文协议。2024年底由Anthropic开源到现在已经成为AI Agent场景里事实上的标准连接层。它的核心思路非常朴素AI模型本身不具备直接操作外部世界的能力它不读文件、不点按钮、不查数据库也不会调用你们公司内部的工单系统。但是通过MCP你可以把“操作能力”抽象成标准接口让模型按需调用。我更喜欢用一个生活化的类比来解释MCP就像手机上的USB-C接口。USB-C本身不生产电、不传数据但它定义了一套通用的物理接口标准。有了它充电器、显示器、硬盘、耳机都能插上同一个口不用每换一个设备就换一套线。MCP干的事情一模一样——它不负责具体的业务逻辑只负责统一“AI怎么请求外部能力”和“外部能力怎么响应AI”这个交互标准。在MCP出现之前每个AI平台都在搞自己的插件体系。OpenAI有GPTs的ActionsAnthropic有早期工具调用示例各家的Agent框架各自定义自己的function calling格式。看起来百花齐放实际上重复造轮子。你给Claude写了一个工具调用换个平台就得重写一遍你给某个内部系统做了AI接入换一个客户端又得再对一遍协议。MCP把这一层彻底标准化了服务端实现一次任何支持MCP的客户端都能直接复用。1.2 MCP和API、插件、RAG的区别要分清很多人会把MCP和另外几个概念搞混。我先用最直白的方式把它们切开。API是接口MCP是接口的标准化包装。传统API调用需要开发者写代码去“编排”——先请求什么、拿到结果后判断下一步、再请求什么整个流程是程序预先定死的。MCP做的事情是给API加上“机器可读的描述”让AI自己决定什么时候调用、传什么参数、拿到结果后怎么用。换句话说API是“我给你一个函数你调用它”MCP是“我给你一组能力清单你按需选择”。插件是“为某个应用定制”MCP是“通用标准”。Curosr的插件只能在Curosr里用Chrome的扩展只能在浏览器里用。MCP恰好相反同一个MCP Server可以被Curosr、Claude Code、Codex、甚至你自研的Agent同时使用。热搜词里有个“谷歌浏览器扩展设置中启用mcp连接”Chrome DevTools MCP其实就是把浏览器调试能力暴露给AI这和“为浏览器写插件”是两回事——前者是通用协议后者是平台定制。RAG解决的是“知识怎么进上下文”MCP解决的是“能力怎么给到AI”。RAG的常见做法是把你私有文档切成块、做向量化、存到向量数据库里用户提问时检索最相关的段落塞给模型当参考资料。MCP完全不涉及检索和向量化它关心的是“AI想执行一个动作时怎么调起外部工具”。一个负责“让AI知道”一个负责“让AI做到”两者是互补关系不是替代关系。有些方案会把MCP Server做成一个带知识检索能力的数据源那属于组合使用而不是互相包含。2. 搭建前需要搞清楚的三件套2.1 两种传输方式本地stdio和远程HTTP真正动手搭建之前先把MCP协议的两个传输层搞明白。目前主流MCP支持两类传输方式。stdio是本地标准输入输出传输。客户端启动一个本地子进程通过标准输入输出流和MCP Server通信。这种方式最适合个人本地开发“claude code cli安装mcp mysql本地”这一类的热搜词基本都属于stdio场景。优点是零网络配置、权限模型简单、天然利用本地文件系统权限缺点是Server必须跑在客户端同一台机器上没法做跨机器调用。本地文件类MCP、代码仓库类MCP几乎都走stdio。HTTP系传输主要指SSE和Streamable HTTP。这类方式允许MCP Server作为一个远程服务存在客户端通过HTTP请求连接。适合Team级别的共享服务比如一个部门内部共用一个工单查询MCP或者你想把某个线上API包装成MCP给多个同事用。配置远程Server时需要考虑鉴权、网络隔离、限流这些事复杂度比本地高一个量级。一个简单的选择标准如果你只是想让自己电脑上的AI工具链更顺手选stdio别折腾如果你在规划团队级的Agent基础设施一开始就按远程服务设计否则后面改传输层会非常痛苦。2.2 三类原语工具、资源、提示词MCP协议定义了三个核心原语理解它们是你设计Server的基础。Tools是“可执行的动作”。比如“查询订单状态”“调用Figma获取设计稿信息”“执行一段SQL”。Tools由Server注册好在对话中Agent会看到工具列表和描述自己判断是否需要调用。这是目前使用频率最高的一类原语热搜词里90%的MCP功能都是Tools属性。Resources是“可读取的数据”。它面向“把数据暴露给AI”的场景通常以只读方式提供。比如一个项目的全部文档列表、一个配置文件的完整内容。在MCP的JSON-RPC结构里Resources通过resources/list和resources/read两个方法暴露。对AI来说工具适合“做完一件事”资源适合“了解某件事”。Prompts是“预置的提示词模板”。服务端可以预定义一些标准化的交互流程比如“把这段日志格式化成指定JSON结构”或“生成一份代码审查意见”。客户端通过prompts/list获取本质上是把高频的Prompt模式沉淀成标准动作。实际开发里我的建议是优先考虑Tools。Tools的反馈足够即时有明确动作目标做出来之后用户感知最明显。Resource和Prompt更适合后续迭代别在第一个版本里贪多。2.3 客户端与服务端谁会用到哪一头“搭建MCP”这个需求其实可以拆成两个完全不同的方向开发MCP Server给别人用或者配置MCP客户端去使用现有Server。如果你手上有一批业务数据、内部系统、专用工具想让AI能操作它们你的角色是MCP Server开发者核心工作是写接口、注册Tool、定义参数和描述、处理传输和鉴权。这个方向需要写代码门槛相对高但做出来的东西通用性极强。“mcp开发 workbuddy”“tia portal openness mcp 完整交付包”这一类热搜词指向的就是这个方向。如果你是Cursor、Codex、Claude Code的普通用户想让这些工具连接到现成的MCP Server你的角色是MCP Client配置者核心工作是用好配置格式、管理Server进程、排查连接异常、给Server配好环境变量。“cursor打开mcp”“rae设置mcp加figma ai bridge”这类词指向的是配置侧。本文主体的路线是先讲透Server开发第3章再讲客户端配置第3、4章穿插最后集中处理调试和踩坑第5、6章。这样不管你是哪一头都能找到自己需要的部分跳读。3. 从零跑通第一个MCP Server3.1 环境准备和SDK选型搭建MCP开发环境不需要很重的依赖。我推荐两条主流技术路线TypeScript路线使用官方modelcontextprotocol/sdkPython路线底层同样是官方SDK但有一个非常顺手的封装mcp包可以直接通过FastMCP类定义Server。从实际开发效率看Python的FastMCP封装是新手友好的No.1选择。它把服务定义、工具注册、参数说明全都收敛成了装饰器写法写出来的代码直观而且官方维护坑少。本文所有示例用Python实现。环境准备三步走# 1. 创建虚拟环境 python -m venv .venv source .venv/bin/activate # 2. 安装依赖 pip install mcp[cli] # 3. 验证安装 python -c import mcp; print(mcp.__version__)安装完成后你还会获得一个关键调试工具mcp命令行。官方SDK自带MCP Inspector通过mcp inspector启动一个网页调试面板可以在浏览器里直接和服务端对话、查看协议请求响应、反复测试工具调用。这个工具后面专门说先装好。3.2 用Python写一个最小可用的Server直接上代码我写一个极简但有演示价值的Server它提供一个“本地时间查询”工具和一个“文本文件片段读取”工具。选择这两个是因为它们能覆盖网络请求和本地文件两个最常见的能力方向。from mcp.server.fastmcp import FastMCP import datetime import os mcp FastMCP(demo-server) mcp.tool() def get_current_time(timezone: str local) - str: 获取当前时间支持传入时区偏移描述如Asia/Shanghai或local if timezone local: return f当前本地时间为: {datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)} try: from zoneinfo import ZoneInfo now datetime.datetime.now(ZoneInfo(timezone)) return f时区 {timezone} 的当前时间为: {now.strftime(%Y-%m-%d %H:%M:%S)} except Exception as e: return f时区解析失败: {str(e)} mcp.tool() def read_file_snippet(file_path: str, start_line: int 1, line_count: int 50) - str: 读取文本文件的指定行范围file_path必须是绝对路径 if not os.path.isabs(file_path): return f错误: 需要绝对路径收到: {file_path} try: with open(file_path, r, encodingutf-8) as f: lines f.readlines() total len(lines) end_line min(start_line line_count - 1, total) snippet lines[start_line-1:end_line] header f文件共 {total} 行显示第 {start_line} 到 {end_line} 行:\n return header .join(snippet) except FileNotFoundError: return f文件不存在: {file_path} except Exception as e: return f读取失败: {str(e)} if __name__ __main__: mcp.run(transportstdio)注意几个细节。工具函数名就是Agent调用时的标识所以要语义化比如get_current_time。docstring极其重要它会被原样发给模型做工具选择判断写得越清楚AI越不容易乱调。参数尽量带默认值减少模型瞎猜参数的几率。文件读取这类工具第一行就做绝对路径校验防的就是Agent在无意识情况下读到不相关路径。3.3 连接Claude Code、Curosr和Codex并验证Server写好了连接方式只看你手头客户端。我先讲Claude Code它是MCP生态里支持最完整、配置最顺滑的客户端之一。Claude Code官方支持通过CLI注册MCP Serverclaude mcp add demo-server -- python /绝对路径/server.py这里--后面的命令就是实际启动子进程的语句原理上等价于终端手动执行python /绝对路径/server.py。注册后用claude mcp list确认状态状态显示connected就说明Server挂载成功。进入对话后你可以直接问“现在几点了”模型会自己决定调用get_current_time。Curosr遵循的是mcp.json配置文件方式。路径在项目的.cursor/mcp.json下{ mcpServers: { demo-server: { command: python, args: [/绝对路径/server.py] } } }Curosr会读取项目级配置在对话中通过“使用工具”开关展示可用MCP工具打开开关即可调用。这个路径在较新版本的Curosr里已经是标准配置方式了旧版本用过全局settings.json的mcpServers键注意区分。Codex的配置方式走config.toml[mcp_servers.demo-server] command python args [/绝对路径/server.py]配置文件通常在~/.codex/config.toml。配置完毕后重启Codex用codex mcp list验证连接。这台演示Server接上后你可以让它“读取某个日志文件的前60行”测试文件读取工具是否成功拉起。排查连接时不光看客户端提示还要直接看进程是否在跑。本地stdio模式下Server进程是由客户端拉起的一个子进程如果Python环境没找对、路径配错、或者Server启动就抛异常客户端会反复报“连接失败”但不会告诉你具体原因。这时候最有效的排查方式是在当前终端手动执行一遍启动命令看有没有报错输出。这一步能过滤掉一半以上的配置问题。4. 进阶接入设计、浏览器、接口类MCP4.1 设计稿方向Figma和蓝湖怎么选MCP热度最高的细分场景之一就是设计稿和前端协作。热搜词里的“figma mcp”“蓝湖mcp使用”“lanhu mcp”“figma mcp可以直接切图吗”都是这个方向。Figma官方推出了Dev Mode MCP Server它能在设计的上下文中获取选中图层的信息、样式详情、以及设计稿的某些规范数据。配置方式通常走个人访问令牌Personal Access Token方式连接。回答一个高频问题Figma MCP能直接切图吗严格来说不能一键“导出切图文件”它能做的是读取设计稿的图层结构、尺寸、填充色、圆角、字号字重等样式数据把数据交给AI生成贴近设计稿的前端代码。切图本身还是要在Figma Dev Mode的导出功能里完成或者用第三方工具。如果你脑子里的“切图”指的是“AI拿到设计稿后我不用自己量尺寸写样式”那MCP确实做到了只不过它给的是数据不是图片文件。蓝湖MCP是国产设计协作工具蓝湖Lanhu提供的MCP接入能力。蓝湖本身是设计交付和协作平台设计稿上传后可以通过蓝湖MCP把设计数据暴露给AI工具链。相比Figma官方MCP“蓝湖MCP使用”的实际体验取决于团队是否已经把设计稿同步到了蓝湖平台以及蓝湖账号的权限配置。它的价值在于国内团队普遍使用蓝湖做交付MCP能让AI直接读取到项目里的设计标注和切图资源信息省掉了不少手动对照标注的活。我个人的建议是设计资产在Figma上优先Figma官方MCP如果团队链路上蓝湖是必经环节就用蓝湖MCP。两个都配也并不冲突只要不同时在同一个对话里调用同一类型工具上下文不会乱。4.2 浏览器与自动化Playwright和Chrome DevTools浏览器自动化方向绝对算MCP的“明星应用区”。热搜里的“playwright mcp”“chrome devtools mcp使用”“browserskill和agent browser以及playwrite mcp”都指向这里。Playwright MCP由微软官方维护它的核心能力是把浏览器自动化能力包装给AIAI可以操控浏览器导航、点击、输入、截图、读取页面DOM。对测试团队来说这个太实用了。以前写E2E测试用例要先学Playwright API、再手写选择器现在可以在支持MCP的客户端里用自然语言让AI完成“打开这个页面点击登录按钮截图看看发生了什么”AI会自己控制浏览器执行并返回结果。配置方式同样是两种本地stdio方式启动playwright/mcp服务或远程SSE方式连接。Chrome DevTools MCP则侧重于给AI“开一扇窗”看浏览器内部。它暴露的是调试器协议的能力包括读取网络请求、控制台日志、页面性能数据甚至监听特定事件。前端排障场景非常适用AI读取Network面板的请求列表帮你分析有没有请求失败读Console日志帮你找报错原因。关注本地的用法就是通过Chrome DevTools MCP把调试数据一股脑提供给AI做分析。实践里我建议Demo阶段先试试Playwright MCP因为它的动作反馈非常直观截图返回结果会让非技术背景的人也能感知“AI真的在操作浏览器”。Chrome DevTools MCP更适合有明确排查目标的场景毕竟网络请求和console日志这种原始数据不给模型过滤边界的话它容易淹没在噪音里。4.3 接口集成、安全测试与更多场景再说两类热搜词指向的场景一类是安全测试相关的“burpsuite mcp”“yakit mcp”“ida mcp”“ida pro9.3 mcp插件”一类是接口工具类的“apipost mcp”“google search console怎么建mcp”。安全测试领域的MCP核心价值在于让AI辅助分析安全工具的输出数据。BurpSuite MCP能把Burp抓到的HTTP请求、扫描结果、漏洞信息暴露给AIAI帮你做初步分析、建议下一步测试方向。IDA MCP是逆向方向的把反汇编结果、函数列表、交叉引用信息交给AI辅助做逆向推理。这类MCP的坑在于工具自身输出量极大——一个扫描报告可能几百上千条记录直接全部暴露给AI会撑爆上下文。所以这类Server设计时通常要提供过滤能力按域名过滤、按严重程度过滤、按时间框定。接口工具类的MCP相对简单。Apipost这类工具做MCP Server思路是把自己维护的接口文档、请求示例、调试结果通过Protocol暴露给AIAI写代码时直接查询接口格式、Mock数据减少去翻文档的频率。“google search console怎么建mcp”这个东西目前没有官方的标准MCP一般是利用Search Console的开放API自己包一层MCP Server原理和我们第3章写的demo完全一致只是把底层HTTP调用换成了谷歌搜索控制台的后台API。5. 调试MCP的实用方法与日志5.1 用MCP Inspector看协议交互不管Server写得多顺调试阶段都逃不开“AI调了工具但结果不对”的情况。这时候最忌讳的就是对着客户端界面瞎猜。MCP官方给出了标准调试工具Inspector用法很简单mcp inspector python /绝对路径/server.py启动后浏览器打开Inspector面板它相当于一个“MCP客户端观察窗口”你能看到协议层所有的JSON-RPC请求和响应。打开“Tools”标签页能看到Server注册了哪些工具、每个工具的输入Schema长什么样、描述有没有正确暴露。展开具体工具点击“Call”手动模拟AI发起一次调用输入参数后看返回结果。整个过程里右上角的日志面板会逐条列出initialize、tools/list、tools/call的请求和响应原文。用Inspector能帮你快速判断“问题出在协议的哪一层”如果tools/list响应里你的工具都没列出问题在Server注册逻辑如果列出了但调用报参数错误问题在函数签名、参数类型、或者docstring引导如果调用正常但返回数据不是AI期望的问题在工具内部的业务逻辑和MCP协议没关系。这个分层排查思路能省下大量无效调试时间。5.2 服务端自定义日志的管理方式第2章讲了stdio模式下Server是子进程这意味着一个天然痛点服务端的print输出会污染MCP协议的通信数据绝对不能直接打印。但开发过程中你一定会想打日志。正确做法是使用logging模块把日志输出到独立文件或stderr以外的目标。这里有一个常见坑stdio传输本身使用的是标准输入和标准输出stderr是可以用的但很多客户端会混合读取stderr容易和报错混淆我建议日志直接落到文件。import logging import logging.handlers logger logging.getLogger(mcp-server) logger.setLevel(logging.INFO) file_handler logging.handlers.RotatingFileHandler( /tmp/mcp-server.log, maxBytes5*1024*1024, backupCount3, encodingutf-8 ) formatter logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s) file_handler.setFormatter(formatter) logger.addHandler(file_handler) # 在tool内部记录日志 logger.info(fget_current_time called, timezone{timezone})选择RotatingFileHandler而不是普通FileHandler是因为MCP Server可能长期运行日志文件无限增长会是个隐患。按大小滚动切分保留最近三个文件控制在15MB上下比较合适。如果业务里存在多实例部署还可以按实例在日志里加上进程ID或实例标识方便末期排查。日志级别上INFO记录调用入口、参数摘要、返回是否正常DEBUG记录协议层的原始请求响应WARNING记录异常路径但没导致失败的情况ERROR记录工具抛异常的位置。养成“每个工具开头打一条参数日志、结尾打一条耗时日志”的习惯遇到偶发问题你会非常感谢这些记录。5.3 排查超时与连接失败问题热搜词里有一条非常具体“mcp client for codex_apps timed out after 30 seconds”。这是Codex这类客户端对MCP工具调用设置的默认超时。30秒听起来不短但AI工具调用的大头往往不是执行本身而是“模型生成工具调用参数”和“大模型在长上下文下等待响应”的时间。排查超时问题按顺序做三件事。第一件确认你的工具动作是不是真的能在几秒内完成。如果是并且Codex还是频繁报超时就要看是不是工具列表太多。MCP会在每次调用时把全部工具列表和描述发给模型工具数量超过10个、每个描述超过几十字时模型推理时间会明显变长。解决方法是精简工具数量、金属描述长度。第二件确认你的工具是否包含同步的耗时网络请求。比如查工单系统要等外部API响应某个API本身慢出天际就会连累整个调用。这类工具的弹性做法是“先做预检查再执行”或者考虑把耗时的动作降级为异步任务工具调用返回“任务已创建任务ID是xxx请稍后用query_task_status查询结果”模型下一次再调用查询工具获取结果。这种模式虽然多两轮交互但把单次调用时间控制在了稳定范围内。第三件检查超时配置本身。Codex的config.toml里存在连接相关的超时参数确认没有在客户端侧误配了过低的超时值。有些客户端允许在MCP Server配置项里指定timeout字段如果找不到相关文档就把排查重点回到工具执行时长上。6. 写MCP Server的经验清单与避坑6.1 工具设计向简短参数尽量少MCP工具和普通API函数有一个本质区别调用者不是你的同事而是一个语言模型。模型不会像人一样读你2000字的接口文档还保证理解正确。它只能通过name、description、参数Schema来判断怎么用。工具描述超过200字就开始有噪声参数超过5个就容易生成错误值。我在实际项目里的经验准则是一个工具只做一件事参数能省则省。比如“查询订单”和“导出订单Excel”拆成两个工具而不是搞一个export: bool参数。把bool参数交给模型它大概率会在不需要导出的时候传true。再比如“读取当前时间”和“读取指定时区的时间”可以合并但如果时区列表本身有枚举限制就把合法的时区枚举写进参数Schema里不要放任模型自己填。Schema写得越紧模型越不容易犯错。6.2 会话与资源管理一次调用不要办太多事MCP Server被多个客户端接入时资源管理会成为隐形炸弹。特别是本地stdio模式每个客户端连接都可能拉起多个Server实例。如果Server内部打开了数据库连接池、加载了模型文件、持有了大内存缓存就需要思考实例隔离和资源释放。简单做法是客户端在启动时初始化资源、每次工具调用使用独立连接并在finally里释放而不是每个工具都反复初始化。这个和普通Web服务的资源管理套路一致而且在MCP场景下更重要——因为子进程生命周期完全由客户端掌握Server无法主动感知自己即将被销毁。另外一个很容易踩的坑是“一次调用办太多事”。AI控制的工具调用和程序内函数调用不同程序函数可以安全地循环调用一万次AI不会。如果工具打算“批量处理200个文件”它的执行时间大概率超过30秒超时线输出可能撑大上下文。把批处理改成“每轮只处理5个文件返回进度和下一批标识”可能是更优策略配合模型的多轮对话能力反而能把这个任务平稳跑完。6.3 扩展方向从个人脚本到团队网关MCP Server从个人脚本走向团队基础设施时有几个方向值得提前规划。一是统一鉴权远程HTTP系Server一定要有OAuth或Token校验不要裸奔。二是配置中心化把Server启动参数、密钥、数据库地址放到环境变量或配置中心而不是硬编码到Server代码里。三是网关化团队内所有MCP Server由统一网关注册和管理方便审计工具的调用次数、耗时、失败率。这个不一定要上重框架简单用Nginx做一层反向代理都行。很多团队还会纠结“要不要自研MCP”。我的建议是第一优先级永远是接入现成的官方SDK加现成的Server组合能覆盖大部分场景。只有当你们有明确的私有系统接入需求内部工单、专属数据库、私有部署工具才值得自研Server。而且自研也不要从协议层开始造轮子直接用官方SDK的FastMCP封装把精力烧在业务逻辑上。7. 写在最后的几句实在话搭了这么多MCP相关的系统我个人的体会是MCP的价值不是让AI变聪明而是让AI从“只在对话框里聊天”变成“能碰到你真实的工具链”。这个转变的收益是巨大的——一个靠自然语言驱动你本地开发环境的设计助手、一个能自动翻阅浏览器调试信息的排障Agent、一个能直接把蓝湖设计数据喂给我们前端代码工具的桥梁这些都是以前做不到的。但MCP也不是银弹。它引入了一层抽象就会有对应复杂度调试成本、工具列表对上下文的占用、超时管理、权限控制都是实实在在的工程问题。我的建议是先从一个小而具体的场景切入比如把你自己最常用的一个脚本包装成MCP工具接上Claude Code或者Curosr跑两周亲身感受完这个工作流再决定要不要大干一场。最后再分享一个小细节给每个MCP Server的版本号写清楚客户端配置里带上版本信息。等你维护超过三个Server之后就知道这件事有多重要了。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →