在人工智能快速迭代的今天,大语言模型(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/listresources/read请求访问。
  • 工具(Tool):模型可调用的函数,如发送邮件、执行代码。通过tools/listtools/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完成了所有请求/响应交换。

四、进阶学习:从原生到生产

掌握基础服务器后,你可以探索以下方向:

  1. 错误处理与安全:给工具增加参数校验,避免模型传入恶意输入。
  2. HTTP传输:使用@modelcontextprotocol/sdk/server/http.js构建WebSocket/SSE服务,让远程AI客户端也能调用。
  3. 集成流行工具:用axios封装GitHub API返回仓库信息,或利用sqlite3提供数据库查询能力。
  4. 发布与共享:将你的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服务器,或许就是它们能力的关键拼图。