22年老研发详解MCP:AI通用插拔协议,彻底告别胶水代码
文章目录
P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。
前言
见过无数工具对接方案,从早期简陋函数调用到各类私有插件,折腾到秃头。直到MCP出来,才算把AI调用外部工具的烂摊子彻底理顺。
段子:说个扎心段子:以前做Agent开发,对接10个第三方工具,我写了10套适配胶水代码,改其中一个参数,整套服务全要重新打包部署,上线那天熬到凌晨三点,产品还过来问我能不能再加3个接口,当时我差点把键盘砸显示器上。
很多同行跟我吐槽,现在AI工具生态完全碎片化,不同语言、不同厂商工具对接全是坑,今天咱们用大白话把MCP掰开揉碎讲清楚,看完直接上手写服务。
一、先搞懂:为啥必须要有MCP?传统方案全是痛点
1.1 LLM+Tools=Agent,但传统写法全是枷锁
做过AI助手、代码Agent的都熟悉这个公式:LLM + Tools = Agent。大模型本身只会生成文字,只有绑定读取文件、查询数据库、发送邮件这类工具,才能真正落地干活。
段子:大模型就像只会纸上谈兵的谋士,工具是跑腿干活的小兵,以前谋士和小兵没有统一沟通话术,每个小兵都要单独配一个翻译,翻译一多,维护成本直接翻倍。
传统硬编码对接有四大无解难题:
- 新增工具就要改主程序代码,重新打包部署,迭代效率极低
- 第三方服务商没有统一标准,每家接口规范不一样,对接成本爆炸
- Node、Python、Java、Rust写的工具互相割裂,跨语言调用全靠手写IPC胶水
- 本地工具和云端远程API通信逻辑完全两套,适配代码要写两份
段子:之前给客户做企业内部AI助手,对接OA、数据库、网盘三个系统,三套对接代码写了两周,客户换一套OA系统,我又重写一版,客户都嫌我开发周期太长,现在想想,要是当时有MCP,一天就能搞定。
1.2 一个大胆预判:未来八成独立App会消失
有统一MCP标准之后,用户不需要挨个打开各类软件,直接和AI对话就能完成订票、查快递、办公审批。AI通过MCP后台调用对应服务,所有操作对用户透明。
段子:以后手机里一堆App全是累赘,就像早年人人带一堆不同接口充电器,现在一个Type-C搞定所有充电,MCP就是AI世界的Type-C万能接口。
二、MCP到底是什么?一句话通俗定义
2.1 MCP基础概念
MCP全称Model Context Protocol(模型上下文协议),由Anthropic在2024年底推出,2025年完整开源贡献社区,是专门给大模型设计的通用开放接口标准。
核心逻辑特别简单:把所有工具、数据、提示模板打包成独立MCP服务进程,AI端启动时自动扫描服务能力,运行时按需调用,全程不用硬编码任何工具信息。
段子:以前AI调用工具,等于出门带十种不同接口充电头;用上MCP,一根万能线连所有设备,不用再挨个匹配转换头,开发直接少一半工作量。
2.2 理清关系:MCP Server和Tools不是并列关系
很多新手容易混淆,这里划重点:MCP是承载工具的容器,Tools是容器里的内容。
无MCP:工具全部硬编码在项目内部,新增工具改代码、重部署;
有MCP:工具统一封装进独立Server,AI动态发现能力,插拔即用,零改动主程序。
三、MCP三层架构:Host/Client/Server分工明细
MCP采用经典CS架构,三个角色各司其职,逻辑清晰不混乱,表格给大家整理明白:
| 角色 | 核心作用 | 实际案例 |
|---|---|---|
| MCP Host | AI应用主体,发起工具调用请求的大脑 | Cursor、Claude桌面端、自研Agent程序 |
| MCP Client | 内置在Host内部,和MCP Server一对一通信 | Cursor内置MCP客户端,读取mcp.json配置建立连接 |
| MCP Server | 轻量独立程序,向外暴露工具、数据资源 | 自己编写的用户查询、文件读取服务 |
3.1 MCP Server对外暴露三大核心能力
每一个MCP服务都能对外输出三类内容,覆盖AI所有上下文需求:
- Tools工具:AI可执行函数,查用户、读写文件、发送消息都属于工具
- Resources资源:AI可读取的静态上下文,数据库记录、本地文档、接口返回数据
- Prompts提示模板:可复用对话模板,固定任务直接调用,不用重复写prompt
段子:Tools是AI能动手干活的技能,Resources是AI查阅的资料,Prompts是AI现成的话术模板,三者打包交给MCP,AI一键解锁全套能力。
极简总结公式:Context = Tool + Resource + PromptTemplate
四、完整调用流程:7步看懂AI怎么通过MCP查数据
举个场景:在Cursor输入“查询用户002信息”,后台完整链路拆解,全程无硬编码工具信息。
- Host读取本地mcp.json配置文件,声明需要连接哪些MCP服务
- 内置Client发送初始化请求,Server主动返回自身全部工具列表(动态发现核心步骤)
- 用户输入自然语言任务,Host接收用户指令
- Host解析需求,从已获取工具清单里匹配对应可用函数
- Client发起工具调用指令,通过stdio/HTTP传输到远端MCP Server
- Server执行业务逻辑,把查询结果回传给Client
- 结果注入大模型上下文,模型结合数据生成最终回答
段子:动态发现是MCP封神的关键点,相当于AI打开工具箱,工具自己主动报家门能干啥、要什么参数,不用开发者提前挨个告诉AI。
4.1 基础配置文件mcp.json示例
{
"mcpServers": {
"my-mcp-server": {
"command": "node",
"args": ["my-mcp-server.mjs"]
}
}
}
配置极简,只需要声明启动服务的命令,Host自动完成后续通信,不用写任何适配代码。
五、两种通信传输方式,覆盖本地+远程全场景
MCP原生支持两套传输协议,本地开发、云端部署分开适配,不用自己封装通信层:
| 传输方式 | 适用场景 | 底层实现类 |
|---|---|---|
| stdio标准流 | 本地子进程调用,开发调试首选 | StdioServerTransport |
| Streamable HTTP | 云端远程服务,第三方线上API接入 | HttpServerTransport |
段子:本地调试用stdio,不用开端口、不用处理跨域;线上部署切HTTP,外网所有AI应用都能调用,一套服务两头通用,再也不用维护两套通信逻辑。
最大优势:天然跨语言,Node、Python、Rust写的MCP服务,Host不用关心底层语言,统一协议通信。
六、实战代码:从零手写一个用户查询MCP Server
6.1 项目依赖安装
pnpm add @modelcontextprotocol/sdk zod
6.2 完整服务代码 my-mcp-server.mjs
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
// 模拟数据库数据
const database = {
users: {
"001": { id: "001", name: "张三", email: "zhangsan@example.com", role: "admin" },
"002": { id: "002", name: "李四", email: "lisi@example.com", role: "user" },
"003": { id: "003", name: "王五", email: "wangwu@example.com", role: "user" },
}
};
// 创建MCP服务实例
const server = new McpServer({
name: 'my-mcp-server',
version: '1.0.0',
});
// 注册查询用户工具
server.registerTool('query-user', {
description: '查询数据库中的用户信息,输入用户ID返回姓名、邮箱、角色',
inputSchema: {
userId: z.string().describe("用户ID,示例:001、002、003"),
},
}, async ({ userId }) => {
const user = database.users[userId];
if (!user) {
return {
content: [{
type: 'text',
text: `用户ID ${userId} 不存在,可用ID:001,002,003`,
}],
};
}
return {
content: [{
type: 'text',
text: `用户信息:
- ID: ${user.id}
- 姓名: ${user.name}
- 邮箱: ${user.email}
- 角色: ${user.role}`,
}],
};
});
// 注册静态资源:使用文档
server.registerResource('使用指南', 'docs://guide', {
description: 'MCP服务操作文档',
mimeType: 'text/plain',
}, async () => {
return {
contents: [{
uri: 'docs://guide',
mimeType: 'text/plain',
text: 'MCP服务使用指南,提供用户查询工具能力',
}],
};
});
// 绑定本地stdio通信并启动
const transport = new StdioServerTransport();
await server.connect(transport);
6.3 MCP服务开发标准流程
- new McpServer():初始化服务实例,定义名称版本
- server.registerTool():注册可调用工具,配置描述、参数校验、执行回调
- server.registerResource():注册静态资源文档、数据
- server.registerPrompt():可选,注册复用提示模板
- new StdioServerTransport():选择通信传输方式
- server.connect(transport):启动服务,等待Host连接调用
段子:整个服务代码没有复杂通信逻辑,协议底层全部SDK封装,新手照着模板复制,半小时就能写出可运行的MCP服务,对比传统接口开发效率提升十倍。
七、自研Agent集成MCP:LangChain接入实战
MCP服务不局限于Cursor、Claude客户端,自研AI Agent通过LangChain适配器就能无缝接入,实现工具动态插拔。
import { MultiServerMCPClient } from '@langchain/mcp-adapters';
import { ChatOpenAI } from '@langchain/openai';
import { HumanMessage, ToolMessage } from '@langchain/core/messages';
// 初始化大模型
const model = new ChatOpenAI({
modelName: process.env.MODEL_NAME,
apiKey: process.env.OPENAI_API_KEY,
configuration: { baseURL: process.env.OPENAI_BASE_URL },
});
// 连接本地MCP服务
const mcpClient = new MultiServerMCPClient({
mcpServers: {
'my-mcp-server': {
command: 'node',
args: ['/path/to/my-mcp-server.mjs'],
},
},
});
// 自动发现全部工具
const tools = await mcpClient.getTools();
// 绑定工具到模型
const modelWithTools = model.bindTools(tools);
// Agent循环执行逻辑
async function runAgent(query, maxIterations = 30) {
const messages = [new HumanMessage(query)];
for (let i = < maxIterations; i++) {
const response = await modelWithTools.invoke(messages);
messages.push(response);
// 无工具调用,直接返回结果
if (!response.tool_calls || response.tool_calls.length === 0) {
return response.content;
}
// 执行工具并回填上下文
for (const toolCall of response.tool_calls) {
const foundTool = tools.find(t => t.name === toolCall.name);
if (foundTool) {
const toolResult = await foundTool.invoke(toolCall.args);
messages.push(new ToolMessage({
content: toolResult,
tool_call_id: toolCall.id,
}));
}
}
}
return messages[messages.length - 1].content;
}
// 执行查询任务
const result = await runAgent("查一下用户002的信息");
console.log(result);
await mcpClient.close();
段子:最香的就是getTools()动态发现,后续新增MCP服务,只需要改配置文件,主程序代码一行不用动,不用重新打包发布,运维都要给这个特性点赞。
八、全方位对比:传统工具对接 VS MCP方案
| 对比维度 | 传统硬编码方式 | MCP标准化方案 |
|---|---|---|
| 工具扩展 | 新增工具修改主代码,重新部署 | 动态发现,即插即用,无代码改动 |
| 跨语言兼容 | 手动开发IPC、RPC胶水代码,工作量巨大 | 统一协议,原生支持任意编程语言服务 |
| 第三方服务接入 | 每家自定义接口,重复开发适配层 | 一套标准,所有MCP服务直接接入 |
| 本地/远程适配 | 两套独立通信逻辑,维护成本翻倍 | stdio/HTTP双传输原生支持,一套代码适配两端 |
| 生态拓展 | 封闭私有,难以复用工具能力 | 开源开放,服务商可直接输出MCP服务对外提供能力 |
段子:干了22年开发,见过无数私有工具标准,各厂商闭门造车,开发者反复重复造轮子,MCP终于统一赛道,以后不用再做无意义的重复适配工作。
九、最后聊聊MCP真正的行业野心
MCP绝不只是一个简单工具调用协议,它的目标是打造AI时代通用交互标准,等同于硬件领域的USB-C接口。
未来所有软件、数据库、云端服务,都可以封装成MCP Server对外输出能力,AI作为超级统一入口,用户只需要自然语言对话,就能完成全部操作。
段子:以前手机装满二三十个App,每个都要单独点开操作;未来AI统一接管所有服务,就像现在语音助手控制智能家居,不用切换软件,一句话搞定全部需求,80%低频独立App会慢慢被淘汰。
💡 实操建议:新手先写本地stdio模式MCP服务调试,熟练后再切换HTTP做云端部署;做企业Agent项目优先采用MCP架构,后续迭代、第三方接入会省下大量开发工时。
整体上手门槛很低,配套SDK完善,跟着上面示例代码跑一遍,你就能独立开发、接入MCP服务,彻底告别胶水代码折磨。
P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。
更多推荐



所有评论(0)