前言
不知道你有没有遇到过这样的场景:想让AI帮你查公司附近的咖啡店,把评分最高的3家信息截图保存到本地,再自动发钉钉消息给同事。
以前要实现这个功能,你得分别对接地图API、浏览器自动化工具、文件系统接口、钉钉开放平台,写一堆胶水代码做参数转换、异常处理,光是联调就要耗大半天。
直到我用上了MCP的多服务器架构,整个过程只需要一句自然语言指令,AI会自动调用对应的工具完成所有操作,代码量直接减少了70%。
今天就把这套可落地的多服务器架构方案拆解清楚,附带完整可运行的代码,新手也能直接抄走用。
一、先搞懂:MCP多服务器架构到底解决了什么问题?
MCP的核心价值是把工具调用标准化,相当于给AI装了个通用的"工具接口",而多服务器架构就是让AI能同时连接多个不同的工具服务,按需调用。
它的核心优势有三个:
- 一次开发,到处复用:你封装好的地图MCP Server,任何支持MCP协议的AI应用都能直接调用,不用重复造轮子
- 解耦工具与AI:工具升级、更换不影响AI逻辑,只要符合MCP协议就能无缝接入
- 多工具协同:AI可以根据任务需求,自动串联多个工具完成复杂工作流,不用手动写调度逻辑
举个直观的例子:你输入"帮我查北京南站附近的咖啡店,把前3家的名称、评分、距离保存到本地result.txt",AI会自动完成三步操作:调用地图MCP查询周边咖啡店→筛选前3家信息→调用文件系统MCP写入本地文件,全程不需要你手动干预。
二、架构设计:整体流程一目了然
我们先理清楚整个系统的组件关系,避免写代码的时候搞混:
scss
┌─────────────────────────────────────────────────────┐
│ AI Agent(以DeepSeek为例) │
│ 解析自然语言指令 → 决策调用哪些工具 │
└──────────────────────┬──────────────────────────────┘
│ 绑定工具集
┌──────────────────────▼──────────────────────────────┐
│ MultiServerMCPClient │
│ 统一管理多个MCP Server暴露的工具 │
└──┬──────────┬──────────────┬──────────────┬─────────┘
│ HTTP │ stdio │ stdio │ stdio
┌──▼────┐ ┌───▼──────┐ ┌────▼──────┐ ┌───▼─────────┐
│ 高德 │ │ 自定义 │ │ Chrome │ │ FileSystem │
│ 地图 │ │ 加法MCP │ │ DevTools │ │ MCP │
│ MCP │ │ Server │ │ MCP │ │ (本地) │
│(远程) │ │ (本地) │ │ (本地) │ │ │
└───────┘ └──────────┘ └───────────┘ └─────────────┘
这里我们接入4个MCP Server做演示:
- 高德地图MCP(远程) :调用官方提供的HTTP服务,查询周边POI、路线规划等能力
- 自定义加法MCP(本地) :演示如何自己封装本地工具
- Chrome DevTools MCP(本地) :控制浏览器做截图、点击等操作
- FileSystem MCP(本地) :读写本地文件
三、环境准备:3分钟搭好开发环境
我们选Node.js技术栈,对前端开发者更友好,所有代码都可以直接跑。
第一步:初始化项目
bash
mkdir mcp-multi-server-demo
cd mcp-multi-server-demo
npm init -y
第二步:安装核心依赖
bash
npm install @langchain/mcp-adapters @langchain/openai @modelcontextprotocol/sdk zod dotenv
几个核心依赖的作用说清楚,避免大家装错:
@langchain/mcp-adapters:LangChain官方提供的MCP适配层,核心是MultiServerMCPClient,用来统一管理多个MCP Server@langchain/openai:兼容OpenAI协议的模型调用库,这里我们用来连DeepSeek的API@modelcontextprotocol/sdk:MCP官方SDK,用来封装自定义的本地MCP Serverzod:TypeScript的Schema校验库,用来定义工具的参数格式,AI会根据这个理解工具需要什么参数
第三步:配置环境变量
在项目根目录创建.env文件,填入你的API Key:
ini
# DeepSeek API配置,去platform.deepseek.com申请
DEEPSEEK_API_KEY=sk-xxxxxx
DEEPSEEK_BASE_URL=https://api.deepseek.com
# 高德地图MCP远程服务地址,官方提供的公共测试地址
AMAP_MCP_URL=https://mcp.amap.com/sse?key=你的高德Key
四、核心代码实现:分步骤上手
1. 先封装你自己的本地MCP Server
我们先从最简单的开始,写一个本地的加法计算工具,熟悉MCP Server的开发流程。
创建文件custom-mcp-server.mjs:
css
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
// 1. 创建MCP Server实例,定义名称和版本
const server = new McpServer({
name: 'custom-calculator',
version: '1.0.0',
});
// 2. 注册加法工具,定义名称、描述、参数Schema和处理逻辑
server.tool(
'add',
'计算两个数字的和',
{
a: z.number().describe('第一个加数'),
b: z.number().describe('第二个加数'),
},
async ({ a, b }) => ({
content: [{ type: 'text', text: `计算结果:${a + b}` }],
})
);
// 3. 注册乘法工具,演示一个Server可以暴露多个工具
server.tool(
'multiply',
'计算两个数字的乘积',
{
a: z.number().describe('第一个乘数'),
b: z.number().describe('第二个乘数'),
},
async ({ a, b }) => ({
content: [{ type: 'text', text: `计算结果:${a * b}` }],
})
);
// 4. 通过stdio协议启动服务,等待客户端连接
const transport = new StdioServerTransport();
await server.connect(transport);
这里有两个关键知识点:
- 每个工具必须有三个核心要素:唯一名称、参数Schema(用zod定义)、处理逻辑,AI会通过名称区分工具,通过Schema理解需要什么参数
- stdio协议适合本地工具,通过标准输入输出通信,不需要额外配置端口,本地调试更方便
2. 配置多服务器客户端
接下来我们把所有MCP Server统一接入客户端,创建文件agent.mjs:
javascript
import { MultiServerMCPClient } from '@langchain/mcp-adapters';
import { ChatOpenAI } from '@langchain/openai';
import dotenv from 'dotenv';
dotenv.config();
// 1. 初始化大模型,这里用DeepSeek,兼容OpenAI协议
const model = new ChatOpenAI({
modelName: 'deepseek-chat',
openAIApiKey: process.env.DEEPSEEK_API_KEY,
configuration: {
baseURL: process.env.DEEPSEEK_BASE_URL,
},
temperature: 0,
});
// 2. 配置多个MCP Server的连接信息
const client = new MultiServerMCPClient({
// 远程HTTP服务,比如高德地图MCP
amap: {
transport: 'sse',
url: process.env.AMAP_MCP_URL,
},
// 本地stdio服务,对应刚才写的自定义Server
calculator: {
transport: 'stdio',
command: 'node',
args: ['custom-mcp-server.mjs'],
},
// 本地文件系统MCP,用官方提供的包
filesystem: {
transport: 'stdio',
command: 'npx',
args: ['-y', '@modelcontextprotocol/server-filesystem', './output'],
},
// Chrome浏览器MCP,需要先安装Chrome DevTools MCP
browser: {
transport: 'stdio',
command: 'npx',
args: ['-y', '@anthropic/mcp-server-chrome-devtools'],
},
});
async function runAgent() {
// 3. 获取所有MCP Server暴露的工具
const tools = await client.getTools();
// 4. 把工具绑定到大模型
const modelWithTools = model.bindTools(tools);
// 5. 发送自然语言指令
const response = await modelWithTools.invoke(
'帮我计算123+456的结果,然后把结果保存到output/result.txt文件中'
);
console.log('AI响应:', response.content);
// 6. 执行工具调用(如果有)
if (response.tool_calls?.length > 0) {
for (const toolCall of response.tool_calls) {
console.log(`调用工具:${toolCall.name},参数:`, toolCall.args);
// 这里可以进一步处理工具调用的结果,串联多个工具
}
}
// 7. 关闭所有MCP连接
await client.close();
}
runAgent().catch(console.error);
3. 运行测试
先确保你的项目结构是这样的:
lua
mcp-multi-server-demo/
├── .env
├── custom-mcp-server.mjs
├── agent.mjs
├── output/(用来存放生成的文件)
└── package.json
然后运行node agent.mjs,你会看到AI自动调用了加法工具和文件写入工具,最终把计算结果保存到了output/result.txt里。
五、进阶玩法:串联多个工具完成复杂任务
刚才的演示只是简单的工具调用,实际业务中我们更常用的是多工具串联的工作流。比如"查北京南站附近的咖啡店,把前3家的信息保存到本地文件",AI会自动按顺序完成三步操作:
- 调用高德地图MCP的
search_around工具,查询周边咖啡店 - 筛选出前3家的名称、评分、距离信息
- 调用文件系统MCP的
write_file工具,把信息写入本地文件
整个过程不需要你写任何调度逻辑,AI会根据任务需求自动决策调用顺序,这就是多服务器架构的核心优势。
六、避坑指南:这些坑我替你踩过了
实际开发中这几个问题很容易遇到,提前说清楚能省很多时间:
- 本地stdio服务的命令路径问题 :如果
npx找不到,可以用绝对路径,比如/usr/local/bin/npx,Windows用户用npx.cmd - 工具参数描述要写清楚 :AI完全依赖参数的
describe描述来理解参数的含义,描述越清晰,调用准确率越高 - 远程MCP服务的鉴权:很多官方MCP服务需要在URL里带API Key,不要直接把Key写在代码里,用环境变量管理更安全
- 工具调用的异常处理:如果某个工具调用失败,AI可能会重试或者换其他工具,建议给工具加上错误返回,让AI能感知到失败原因
七、总结
MCP多服务器架构的本质是把"AI调用工具"这件事标准化了,你不需要再为每个工具写适配代码,只需要关注业务逻辑本身。
这套方案特别适合这几类场景:
- 自动化办公:串联日历、邮件、文档工具,实现自动排日程、发邮件、生成报告
- 数据采集:串联浏览器、文件、数据库工具,实现自动抓取网页数据并存储
- 运维自动化:串联监控、日志、告警工具,实现故障自动诊断和处理