MCP 是个啥玩意儿写给连命令行都没摸过的人2026 年 7 月一、先说个事儿现在大伙儿聊 AI离不开俩词大模型 和 Agent。大模型就是 ChatGPT、DeepSeek 这类能聊天的。Agent 是上回讲过的那个能自己动手干活的。但有个事大伙儿可能没注意——AI 跑在人家公司的服务器上。你电脑里的文件它摸不着你电脑装的软件它也用不了。就好比你养了一只特别聪明的狗关在邻居家。你隔着墙跟它说话它能听懂但你让它帮你拿个拖鞋那不行——它够不着你家的拖鞋。MCP 就是给这只狗开了个传送门让它能跑到你家来。开玩笑的。其实 MCP 没那么玄乎就是个「说话规矩」。MCP 全称 Model Context Protocol翻译过来就是「模型上下文协议」。光听名字你肯定一脸懵没关系拆开看•Model AI 模型就是那只狗•Context 它能摸到的东西•Protocol 说话的规矩所以 MCP 合起来就是AI 跟外部工具之间说话的标准格式。二、它是怎么个运作法就三个角色记住三个词就行别整复杂了角色 干嘛的 说人话客户端 (Client) 你用的那个 AI 软件 雇主服务器 (Server) 你写的小工具跑在你电脑上 员工协议 (Protocol) 它俩聊天的 JSON 格式 工作流程举个最常见的场景你在 Claude Desktop 里打了句「现在几点」。Claude 脑子一转你这电脑里装了个叫 mcp-demo 的小工具里面有个 get_current_time 的功能正好能用。然后它就朝那个小工具喊了一嗓子——用 JSON 格式「调一下 get_current_time」。小工具跑了一下拿到当前时间15:57再用 JSON 格式把结果传回去。Claude 看了结果跟你说「下午 3 点 57。」全程你啥也没干连命令行都没碰。三、那它跟别的有啥不一样你可能听过 LangChain、Function Calling、Skills、Plugin 这些词跟 MCP 啥关系一句话版本MCP 是「标准」别的是「方言」。按 MCP 标准写出来的小工具谁家的 AI 都能用。按 LangChain 写的只能在 LangChain 里用。按 OpenAI Function Calling 写的只能 OpenAI 的模型用。MCP 这玩意儿是 Anthropic就是做 Claude 那家2024 年推出来的2025 年开始火。火的原因就一个它简单、开放、不绑死任何一家。一个直观点的类比你电脑上的 USB 口知道吧。鼠标、键盘、U 盘、硬盘不管哪家做的插上就能用。为啥因为大家都按 USB 标准做。MCP 就是 AI 这边的 USB 标准。我写一个小工具按 MCP 规范来你用 Claude Desktop 能用你同事用 Cursor 也能用以后哪个新 AI 出来支持 MCP照样能用。这就是标准的价值——一次开发到处能用。四、看看代码长啥样讲再多不如看代码。下面这个就是完整的 server.js加了注释方便你读// server.jsimport { McpServer } from ‘modelcontextprotocol/sdk/server/mcp.js’;import { StdioServerTransport } from ‘modelcontextprotocol/sdk/server/stdio.js’;import { z } from ‘zod’;const server new McpServer({ name: ‘mcp-demo’, version: ‘1.0.0’ });// 注册一个工具叫 get_current_timeserver.tool(‘get_current_time’, // 工具名字‘获取当前的本地时间’, // 工具说明AI 看到这句决定要不要用{timezone: z.string().optional().describe(‘时区比如 Asia/Shanghai’),},async ({ timezone }) { // 具体干活的函数const now new Date();return {content: [{ type: ‘text’, text: now.toLocaleString(‘zh-CN’) }],};});// 启动开等客户端连const transport new StdioServerTransport();await server.connect(transport);完事。是不是没你想的那么复杂核心就那个 server.tool() 调用。四样东西工具名、说明、参数、长啥样、咋干活的。AI 客户端连上来问「你这儿有啥」你注册啥它就能用啥。五、咱们这个 demo 装了啥文件都在这C:\Users\35118\.qclaw\workspace-agent-4895da3d\mcp-demo\文件 干嘛的server.js MCP server 主体被客户端拉起来跑的小进程client-test.js 本地测试脚本验证 server 能不能用package.json 依赖声明README.md 英文版使用说明server.js 里挂了三个工具get_current_time - 拿时间你说「现在几点了」AI 调一下这个工具拿到时间告诉你。没啥好说的new Date() 就完事了。calculate - 算数你说「算一下 (12)*3 的平方」AI 拼成 (12)3**2 传进来返回 27。if (!/1$/.test(expression)) {return { isError: true, content: [{ type: ‘text’, text: ‘包含不允许的字符’ }] };}上面这段很重要是个安全过滤。为啥要过滤因为 execute 是个危险函数不限制的话用户随便传process.exit() 这种东西你电脑直接关机。所以只允许数字、运算符、括号、小数点。生产环境建议用 mathjs 这种正经库。search_files - 搜文件你说「找一下我电脑里所有 .docx」AI 调这个dir 传你电脑路径keyword 传 docx返回文件列表。代码里有个细节if (e.name ‘node_modules’ || e.name ‘.git’) continue;跳过 node_modules 和 .git。为啥这俩目录里文件巨多跑全搜索能卡半小时。不跳过的话AI 客户端直接超时。任何做文件搜索的工具都得有这种过滤不然后期会出大事。六、怎么把它跑起来五步复制粘贴就行。第一步装 Node.js按 WinR输入 cmd回车弹个黑窗口。输入node --version能看到类似 v22.16.0 这种版本号就说明你装过了。没装去 nodejs.org 官网下 LTS 版双击安装一路 Next中间啥都别改。第二步装依赖继续在黑窗口里cd C:\Users\35118\.qclaw\workspace-agent-4895da3d\mcp-demonpm install等几秒看到 added 93 packages 就完事了。看不懂这步在干啥没事你不需要懂照着敲就行。npm 就是帮你在后台装一堆别人写好的代码包。第三步先测一下能不能跑在同一个黑窗口里node client-test.js出来一段输出长这样 1. 列出所有工具 get_current_time: 获取当前的本地时间…calculate: 计算一个数学表达式…search_files: 在指定目录里递归搜索文件名… 2. 调用 get_current_time 2026/07/02 15:54:53 3. 调用 calculate (12)*3**2 100/4 52 4. 调用 search_files 找到 4 个文件…✅ 测试完成看到这些就说明 server 没毛病。没看到截个图发给我看看是啥错。第四步接到 Claude DesktopClaude Desktop 是 Anthropic 出的桌面 AI原生支持 MCP。1.打开 Claude Desktop2.左上角点三横线菜单→ Settings → Developer 标签3.点 Edit Config会弹出一个叫 claude_desktop_config.json 的文件4.把文件内容替换成下面这堆{‘mcpServers’: {‘demo’: {‘command’: ‘node’,‘args’: [‘C:\\Users\\35118\\.qclaw\\workspace-agent-4895da3d\\mcp-demo\\server.js’]}}}5.保存完全退出 Claude Desktop注意是完全退出不是关窗口6.重新打开左下角应该有个小图标接上之后你跟 Claude 说「现在几点」它会自动调你写的工具拿时间。第五步接到 CursorCursor 是带 AI 的代码编辑器跟 VS Code 长得像也支持 MCP。File → Preferences → Cursor Settings → MCP → 点 Add new global MCP server把上面那段 JSON 贴进去保存。重启 Cursor搞定。七、想加新工具咋办这是最常做的事。模板就这五行照着改server.tool(‘工具名’,‘工具说人话AI 看到这句决定要不要用’,{参数1: z.string().describe(‘参数1干啥用的’),},async ({ 参数1 }) {// 你的逻辑return { content: [{ type: ‘text’, text: ‘返回给 AI 的内容’ }] };});举几个真能用的例子例 1读一个 txt 文件server.tool(‘read_text_file’,‘读一个文本文件’,{ path: z.string().describe(‘文件的绝对路径’) },async ({ path: filePath }) {const content await fs.readFile(filePath, ‘utf-8’);return { content: [{ type: ‘text’, text: content }] };});例 2查个天气server.tool(‘get_weather’,‘查某个城市的天气’,{ city: z.string().describe(‘城市名比如 上海’) },async ({ city }) {const res await fetch(https://wttr.in/${city}?formatj1);const data await res.json();return { content: [{ type: ‘text’, text: JSON.stringify(data) }] };});例 3跑一段 Pythonserver.tool(‘run_python’,‘跑一段 Python 代码返回输出’,{ code: z.string().describe(‘Python 代码’) },async ({ code: pyCode }) {const { stdout } await execAsync(python -c ${JSON.stringify(pyCode)});return { content: [{ type: ‘text’, text: stdout }] };});改完保存重启客户端注意是重启不是最小化新工具就生效了。八、能拿它干点啥时间、计算、搜文件——单看没啥意思组合起来就有点用了。场景 1写代码顺便自己跑测试你说「写个快排跑一下给我看结果」→ AI 写代码 → 调 run_python 跑 → 拿结果给你。你电脑没装 Python 都行因为工具用的是服务器上的 Python。场景 2聊代码你说「这个项目里所有用到 User 实体的地方在哪」→ AI 调 search_files grep → 给你一个清单。比你自己一个个翻快多了。场景 3自动发周报你说「生成本周周报发到我邮箱」→ AI 拉 git log用 git_log 工具→ 调 send_email 工具发出去。周一周五各跑一次这辈子都不用写周报了。场景 4自动抓网页你说「这篇 36 氪文章说了啥总结 200 字」→ AI 调 fetch_url 抓页面 → 自己读 → 自己总结。你天天看的那些号都可以扔给 AI 先过一遍挑你想看的。场景 5操作数据库你说「上个月订单数多少按地区分个组」→ AI 拼 SQL → 调 sql_query → 给你结果。比开 Navicat 写 SQL 方便。九、几个坑新手必看坑 1在 server.js 里写 console.logMCP server 跟客户端是用 stdio标准输入输出通信的。你在 server.js 里写 console.log输出会污染通信整个 server 直接挂。// ❌ 错的console.log(‘server started’);// ✅ 对的console.error(‘server started’);console.error 写到 stderr不会污染协议。这是新手最容易犯的错没有之一。坑 2路径变成 C:\C:\xxx 这种鬼东西Windows 下用 new URL().pathname 拿本地路径会拼出个 C:\C:\xxx 的东西。解决办法用 fileURLToPathimport { fileURLToPath } from ‘node:url’;const serverPath fileURLToPath(new URL(‘./server.js’, import.meta.url));坑 3改完代码不重启MCP server 不是热加载的。你改了代码必须完全退出客户端重开最小化再打开没用。尤其在 Windows 上最小化和完全退出是两码事。坑 4eval 不做安全过滤任何让用户传代码再执行的工具都是定时炸弹。必须做白名单过滤或者用正经沙箱库isolated-vm、quickjs 这些。别偷懒偷懒就等着被攻击。// ❌ 直接 eval等着出事const result eval(userCode);// ✅ 白名单过滤if (!/2*$/.test(userCode)) {return { isError: true, content: [{ type: ‘text’, text: ‘不允许的字符’ }] };}坑 5忘了跳过 node_modules上一章说过一遍了再强调一次——做文件搜索、代码扫描这类工具必须默认跳过 node_modules、.git、dist、build。不然一个搜索跑半小时AI 客户端超时session 断了体验极差。const SKIP new Set([‘node_modules’, ‘.git’, ‘dist’, ‘build’, ‘.next’]);if (SKIP.has(e.name)) continue;坑 6一次返回太多内容MCP 工具的返回内容会塞进 AI 的上下文窗口。你一口气返回 10 万字后面 AI 直接傻了——它撑不下了。怎么办•长内容截断最多返回前 5000 字•返回的是路径让 AI 自己按需读•返回结构化 JSON让 AI 自己挑想要的字段十、现在这玩意儿生态咋样谁支持 MCP客户端 支持没 说两句Claude Desktop ✅ 原生支持 Anthropic 出的体验最好Cursor ✅ 支持 AI 代码编辑器写代码用Cline / Continue ✅ 支持 VS Code 里的 AI 插件Zed ✅ 支持 性能怪物的代码编辑器Windsurf ✅ 支持 Codeium 出的 IDEChatGPT Desktop ❌ 没支持 OpenAI 还在观望现成能用的 servernpm 上搜 mcp-server 一堆都不用自己写•modelcontextprotocol/server-filesystem - 官方文件系统工具•modelcontextprotocol/server-git - 操作 git 仓库•modelcontextprotocol/server-postgres - 调 Postgres•modelcontextprotocol/server-puppeteer - 浏览器自动化•GitHub MCP Server - 操 Issues、PR•Notion MCP Server - 操 Notion 文档直接 npm install 装一下就能用。国产 AI 这边呢情况是参差不齐。有的在观望有的偷偷支持了还有的想自己搞一套另起炉灶。我的判断是 MCP 赢面大——简单、开放、有 Claude 这种头部客户背书。就跟当年 HTTP 干掉各种私有协议一样标准永远赢。所以别押注平台押注标准。十一、几句大实话MCP 不是万能药MCP 解决的是「AI 怎么调本地工具」的问题。它不解决•AI 模型本身是笨蛋的问题垃圾模型挂 MCP 还是垃圾•你的工具写得烂的问题垃圾工具挂 MCP 还是垃圾•权限安全问题MCP 工具能操作你电脑给 AI 装 MCP 等于给 AI 开门MCP 就是「让 AI 能用工具」用得好不好看的是工具本身。别一上来就堆工具新手最容易犯的错——一口气注册 20 个工具结果 AI 不知道该用哪个。建议你7.先做 1-2 个核心的跑通8.用着觉得缺啥再补一个9.总数控制在 5-10 个以内10.每个工具的说明第二参数写人话啥时候用一次说清讲真AI 看不懂「这是一个用于处理 X 业务场景的 Y 类工具」。它看得懂「读一个 txt 文件」。就这么简单。最后说一句MCP 本质就是「给 AI 装手装脚的标准」。写一个 server能在所有支持 MCP 的客户端上用。学 MCP本质就是学怎么给 AI 做工具——这事儿 2025 年开始有用了以后会越来越有用。看完就想跑一遍的话照第五章抄一遍就行。有坑不知道咋办把报错截个图发出来——但愿我能答上来。\d\s\-*/%().eE ↩︎\d\s\-*/%().eE ↩︎