ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MCP模型上下文协议入门指南:用加法示例带你理解AI与外部程序通信!

MCP模型上下文协议入门指南:用加法示例带你理解AI与外部程序通信! 1. 从一个加法函数说起AI 为什么需要 MCP你可能已经习惯了在对话框里让 AI 帮你算数、写代码、查资料但有没有想过一个问题AI 本身只会“生成文本”它怎么知道去调用一个真实存在的函数、读一个本地文件、或者查一次数据库答案就是模型上下文协议英文全称 Model Context Protocol简称 MCP。它做的事情说白了就是给 AI 和外部程序之间定一套“普通话”让任何支持这套协议的 AI 应用都能调用任何符合协议的外部工具不用每接一个工具就重写一遍胶水代码。这篇内容聚焦 MCP 协议的基础概念和 AI 调用外部程序的通信流程用一个最小的加法工具作为示例带你从零跑通“配置 MCP 服务端 → 客户端发现工具 → 调用工具 → 拿到结果”的完整链路。适合谁看如果你写过 Node.js、用过 VSCode、对 AI 应用开发感兴趣但还没真正动手接过一个 MCP Server那这篇就是给你准备的。全程不需要你懂什么高深协议跟着敲一遍加法跑通了换成查天气、读文件、调接口都是同一套骨架。我试过把 MCP 理解成“AI 世界的 USB 接口”以前每个外设都要专属驱动现在统一成 USB-C插上就能用。MCP 就是 AI 应用和外部程序之间的那个 USB-C。下面从最朴素的加法函数开始一步步把它改造成一个真正的 MCP Server。2. 前置准备TaoToken 与本地环境在动手写 MCP Server 之前先把两件事准备好一个是能调用大模型的入口一个是本地运行环境。MCP 本身只负责“AI 应用 ↔ 外部程序”的通信真正判断“用户说 23 该调用 add 工具”的是背后的大模型。所以你需要一个稳定、兼容 OpenAI 接口的模型服务来驱动整个流程。TaoToken 在这里扮演的就是模型接入层。它提供统一的 API 入口兼容主流大模型调用格式你不需要为每个模型单独改代码。对于 MCP 这种需要频繁做“意图判断 工具选择”的场景一个稳定的模型入口能省掉很多联调麻烦。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 注意 API 地址不带 UTM 参数配置时别写错。本地环境这块我用的是 Node.js v18.20.0 加 VSCode。Node 版本建议 18 以上因为 MCP 官方 SDK 用到了较新的 ESM 和顶层 await 语法。检查版本node -v npm -v如果版本太低去 Node 官网下个 LTS 包装上就行。VSCode 这边需要装 GitHub Copilot 插件因为后面调用 MCP 工具要靠它来触发。没有 Copilot 的话也可以用支持 MCP 的其他客户端但本文以 VSCode Copilot 为主线演示。注意MCP Server 本身不依赖大模型它只是一个按协议响应请求的进程。大模型负责“决定调哪个工具”MCP Server 负责“执行工具并返回结果”两者职责分开这也是 MCP 设计上比较清爽的地方。3. 可复制配置从裸 JSON-RPC 到 MCP Server3.1 先看最原始的通信长什么样在引入 SDK 之前先用最裸的方式理解 MCP 的通信本质。MCP 推荐的本地通信方式是 stdio也就是标准输入输出。父进程客户端通过 stdin 发消息子进程服务端通过 stdout 回消息。消息格式基于 JSON-RPC 2.0。一个最简的加法服务端可以这样写process.stdin.setEncoding(utf-8); const funcs { add({ a, b }) { return a b; }, }; process.stdin.on(data, (chunk) { const req JSON.parse(chunk); const func req.method; const params req.params; const result funcs[func](params); const res { jsonrpc: 2.0, result, id: req.id, }; process.stdout.write(JSON.stringify(res)); });客户端发过来的请求长这样{jsonrpc:2.0,method:add,params:{a:1,b:2},id:3}服务端返回{jsonrpc:2.0,result:3,id:3}看到没核心就是“请求带方法名和参数响应带结果和同一个 id”。id 用来做请求响应配对因为 stdio 是异步流可能同时有多个请求在飞。这就是 MCP 通信格式的底层逻辑SDK 只是把这套东西封装得更规范、更安全。3.2 用官方 SDK 搭一个规范的 MCP Server裸写 JSON-RPC 能跑但缺少初始化握手、工具发现、错误处理这些规范环节。实际开发用modelcontextprotocol/sdk更省事。先初始化项目并安装依赖npm init -y npm i modelcontextprotocol/sdk zod然后在src/demo/mcp-server.js里写服务端骨架import { McpServer, ResourceTemplate } from modelcontextprotocol/sdk/server/mcp.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import { z } from zod; const server new McpServer({ name: mcp-server, version: 1.0.0, }); server.registerTool( add, { title: 加法, description: 两个数相加, inputSchema: { a: z.number(), b: z.number() }, }, async ({ a, b }) ({ content: [{ type: text, text: String(a b) }], }) ); server.registerResource( greeting, new ResourceTemplate(greeting://{name}, { list: undefined }), { title: 请求资源, description: 动态请求生成器, }, async (uri, { name }) ({ contents: [ { uri: uri.href, text: Hello, ${name}!, }, ], }) ); const transport new StdioServerTransport(); await server.connect(transport);这段代码做了三件事注册了一个叫add的工具输入是两个数字输出是它们的和注册了一个动态资源greeting按名字返回问候语最后用 stdio 传输层把服务端挂起来等待客户端连接。zod负责参数校验如果客户端传的不是数字SDK 会直接拒绝不用你自己写 if 判断。3.3 在 VSCode 里配置 MCP Server服务端写好了接下来让 VSCode 知道它的存在。在项目根目录建.vscode/mcp.json{ servers: { mcp-server: { type: stdio, command: node, args: [src/demo/mcp-server.js] } }, inputs: [] }这个配置告诉 VSCode启动一个叫mcp-server的服务用node命令跑src/demo/mcp-server.js通信方式是 stdio。保存后 VSCode 会在 Copilot 的 MCP 面板里显示这个服务并自动列出它注册的工具。提示如果你的项目用了 ESM确保package.json里有type: module否则import语法会报错。这是新手最容易踩的坑之一。4. 验证请求让 AI 真的调用加法工具4.1 用 Inspector 先单独测服务端在接入 AI 应用之前建议先用官方调试工具单独验证服务端能不能正常工作。运行npx modelcontextprotocol/inspector它会自动打开浏览器界面上能看到你注册的工具列表。点进add工具填入a2、b3点调用右侧会返回{ content: [ { type: text, text: 5 } ] }这一步能跑通说明服务端的工具注册、参数校验、stdio 通信都没问题。如果这里就报错先别急着接 AI把服务端本身调通再说。4.2 在 VSCode 里通过 Copilot 触发调用服务端验证通过后回到 VSCode。打开 Copilot Chat确认 MCP 面板里mcp-server处于运行状态工具列表里能看到add。然后在对话框里输入用 add 工具计算 23Copilot 会把这句话交给大模型做意图判断模型识别出“需要调用 add 工具参数 a2、b3”然后通过 MCP Client 向服务端发请求。服务端执行加法返回 5Copilot 把结果展示给你。整个过程里你只说了句自然语言模型自动完成了工具选择、参数提取、调用、结果整合。这里的关键角色有两个MCP Host指的是 AI 应用本身也就是 VSCode Copilot它负责发现服务端和工具列表MCP Client是 Host 内部用来和服务端通信的客户端通常每启动一个 MCP Server 就对应开一个 Client。Host 面向用户Client 面向协议分工明确。4.3 换成 TaoToken 驱动模型调用如果你不想依赖 Copilot 内置的模型或者想在自己的应用里复现这套流程可以用 TaoToken 的 API 来驱动。核心思路是把你的 MCP 工具列表转成模型能理解的 function calling 格式发给模型模型返回要调用的工具和参数你再通过 MCP Client 执行。先拿 API Key去 https://taotoken.net/api-keys 创建然后调用模型对话接口测试连通性。模型对话入口在 https://taotoken.net/model-chat 。一个简化的调用逻辑const response await fetch(https://taotoken.net/api/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${process.env.TAOTOKEN_API_KEY}, }, body: JSON.stringify({ model: gpt-4o-mini, messages: [{ role: user, content: 用 add 工具计算 23 }], tools: [ { type: function, function: { name: add, description: 两个数相加, parameters: { type: object, properties: { a: { type: number }, b: { type: number }, }, required: [a, b], }, }, }, ], }), }); const data await response.json(); console.log(JSON.stringify(data, null, 2));模型返回的tool_calls字段里会带上add和参数{a:2, b:3}你拿到后通过 MCP Client 发给服务端服务端返回 5再把结果作为 tool 消息回传给模型模型生成最终回复。这就是 AI 与外部程序通信的完整闭环。5. 本篇常见错排查报错一Cannot use import statement outside a module这是 ESM 和 CommonJS 混用导致的。解决办法是在package.json里加type: module或者把文件后缀改成.mjs。如果你用的是较老的 Node 版本升级到 18 以上。报错二Inspector 打开后工具列表是空的先检查服务端有没有正常启动。手动跑node src/demo/mcp-server.js如果进程直接退出说明server.connect(transport)没执行到可能是顶层 await 没生效或者 import 路径写错。另外确认registerTool的调用在connect之前。报错三Copilot 不调用工具只是自己编答案这种情况通常是模型没识别出工具或者 MCP Server 没被 Host 正确加载。检查.vscode/mcp.json里的路径是不是相对项目根目录command用node时确保系统 PATH 里有 node。还有一个常见原因是工具描述写得太模糊把description写清楚比如“两个数相加返回数值结果”模型判断会更准。报错四调用返回Invalid params多半是参数类型不对。inputSchema里声明了z.number()客户端传了字符串2就会被拒。检查调用方传参时有没有做类型转换。用 Inspector 测试时注意输入框里填的是数字还是文本。报错五TaoToken API 返回 401检查 API Key 有没有正确放到Authorization头里格式是Bearer sk-xxx。另外确认请求地址是https://taotoken.net/api/v1/chat/completions不要多加斜杠或漏掉v1。如果还是不通去控制台 https://taotoken.net/console 看下 Key 的状态和额度。6. 继续往下走把加法换成你的真实工具加法跑通之后你会发现 MCP 的骨架是通用的。把add换成queryWeather、readFile、searchDatabase流程完全一样注册工具、定义输入 schema、写执行逻辑、返回 content。真正需要花心思的是工具描述怎么写才能让模型准确判断调用时机以及参数 schema 怎么设计才能覆盖各种边界情况。如果你打算长期做 MCP 相关的编码和 Agent 开发可以关注一下 Coding Plan它更适合需要频繁调用模型、反复调试工具链的场景入口在 https://taotoken.net/coding-plan 。接入文档在 https://taotoken.net/doc 里面有完整的 API 说明和示例代码遇到协议细节可以对照查。回到最开始那个问题AI 为什么需要 MCP因为大模型再强它的能力边界也止于“生成文本”。要让它真正操作外部世界就需要一套标准协议把“意图”翻译成“调用”。MCP 就是这层翻译标准而加法示例只是它最小可运行的一个切片。你把这个切片跑通了剩下的就是不断往工具列表里加东西。
返回列表