在人工智能快速迭代的今天,大语言模型(LLM)的“工具箱”正在变得空前丰富。从调用搜索引擎到操作数据库,从生成图表到控制物联网设备,AI agent 的潜力取决于它与外部世界的连接能力。而作为连接桥梁的模型上下文协议(Model Context Protocol,简称MCP),正凭借其开放性、轻量化以及标准化设计,迅速成为开发者社区关注的焦点。那么,如果你是一位Node.js/JavaScript开发者,如何从零开始掌握MCP?本文将为你梳理一条清晰的学习路径。
一、MCP是什么?为什么值得学?
MCP由Anthropic公司提出并开源,是一套用于AI模型与外部工具、数据源交互的通用协议。类似HTTP为Web通信提供了统一规则,MCP则为AI agent与“上下文”(工具、资源、工作流)之间定义了标准接口。它的核心优势在于:
- 互换性:一次开发的MCP服务器可被任何兼容的AI客户端(包括Claude Desktop、自定义agent等)复用。
- 安全性:通过受限的“工具”和“资源”抽象,避免模型直接操作底层API。
- 容易扩展:你可以把任意Node.js包封装成MCP服务,比如文件系统、GitHub API、数据库连接器等。
对于JavaScript生态的开发者而言,MCP的官方SDK已经提供了完善的Node.js支持,这意味着你完全可以利用已有的JS技能快速上手。
二、学习前的准备:环境与核心概念
在动手之前,建议你确保本地已安装Node.js 18+和npm。然后重点理解MCP的几个基础抽象:
- 资源(Resource):暴露给模型读取的数据,如文件内容、API响应。可以从
resources/list和resources/read请求访问。 - 工具(Tool):模型可调用的函数,如发送邮件、执行代码。通过
tools/list和tools/call实现。 - 提示模板(Prompt):预定义的对话模板,帮助模型理解特定场景。
- 传输层(Transport):MCP通信载体,最常用的是stdio传输(通过标准输入输出管道)和HTTP传输(通过SSE流)。
三、从零搭建第一个MCP服务器
我们用最轻量的方式开始:创建一个通过stdio与客户端通信的MCP服务器。这个服务器提供两个功能:获取当前时间(工具)和读取一个简单的备忘录文件(资源)。
1. 初始化项目与安装SDK
mkdir my-first-mcp-server
cd my-first-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk
2. 编写服务器代码(server.js)
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new Server(
{ name: 'TimeAndMemo', version: '1.0.0' },
{ capabilities: { tools: {}, resources: {} } }
);
// 注册工具:获取当前时间
server.setRequestHandler('tools/list', async () => ({
tools: [{
name: 'get_current_time',
description: '返回当前的系统时间(含时区)',
inputSchema: { type: 'object', properties: {} }
}]
}));
server.setRequestHandler('tools/call', async (request) => {
if (request.params.name === 'get_current_time') {
return { content: [{ type: 'text', text: new Date().toISOString() }] };
}
throw new Error('未知工具');
});
// 注册资源:读取memo.txt
server.setRequestHandler('resources/list', async () => ({
resources: [{
uri: 'file:///memo.txt',
name: 'Memo',
mimeType: 'text/plain'
}]
}));
server.setRequestHandler('resources/read', async (request) => {
if (request.params.uri === 'file:///memo.txt') {
const fs = await import('fs/promises');
const text = await fs.readFile('./memo.txt', 'utf-8');
return { contents: [{ uri: request.params.uri, mimeType: 'text/plain', text }] };
}
throw new Error('资源未找到');
});
// 启动服务器
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('MCP server running over stdio');
3. 创建测试客户端(client.js)
你可以直接用官方提供的mcp-cli,或者用SDK的Client类实现一个简易客户端:
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
import { spawn } from 'child_process';
const child = spawn('node', ['./server.js']);
const transport = new StdioClientTransport({ childProcess: child });
const client = new Client({ name: 'test-client', version: '1.0.0' });
await client.connect(transport);
// 测试工具调用
const tools = await client.listTools();
console.log('可用工具:', tools);
const result = await client.callTool({ name: 'get_current_time', arguments: {} });
console.log('当前时间:', result.content[0].text);
// 测试资源读取
const resources = await client.listResources();
console.log('可用资源:', resources);
const resContent = await client.readResource({ uri: 'file:///memo.txt' });
console.log('备忘录内容:', resContent.contents[0].text);
运行客户端前,先创建一个memo.txt文件放些文本,然后执行node client.js,你会看到MCP协议在后台通过stdio完成了所有请求/响应交换。
四、进阶学习:从原生到生产
掌握基础服务器后,你可以探索以下方向:
- 错误处理与安全:给工具增加参数校验,避免模型传入恶意输入。
- HTTP传输:使用
@modelcontextprotocol/sdk/server/http.js构建WebSocket/SSE服务,让远程AI客户端也能调用。 - 集成流行工具:用
axios封装GitHub API返回仓库信息,或利用sqlite3提供数据库查询能力。 - 发布与共享:将你的MCP服务器打包为npm包,并在MCP市场(如Smithery)上注册,让其他AI应用一键集成。
五、学习资源推荐
- 官方文档:modelcontextprotocol.io 提供了最权威的协议规范与TypeScript示例(JS可直接复用)。
- GitHub示例:anthropics/anthropic-cookbook 中有多个MCP实际案例(如MCP Server for PostgreSQL)。
- 社区工具:Smithery.ai 整理了上百个现成的MCP服务器,适合逆向学习。
六、为什么选择Node.js/JavaScript?
Node.js的异步模型与MCP的请求/响应模式天然契合,而且JavaScript开发者无需学习新语言即可参与AI agent生态。随着Claude Desktop、Cursor等工具原生支持MCP,掌握这项技能意味着你能为任何AI应用快速构建自定义插件。
从零开始学习MCP并不复杂——它本质上是用JSON-RPC封装你的业务逻辑。现在,花30分钟运行上面的代码,你就已经迈出了成为MCP贡献者的第一步。未来,当更多AI agent需要“拿起工具”时,你写的那些小小的MCP服务器,或许就是它们能力的关键拼图。