如何将Node.js REST API转换为AI专用的MCP服务器

大语言模型(LLM)与代理型AI的演进要求应用能力暴露范式发生根本性转变。传统REST API专为软件间通信设计,开发者需通过文档说明与定制化代码实现集成。模型上下文协议(Model Context Protocol, MCP)作为开放标准,通过构建统一的机器可读接口,使AI代理能够动态发现并交互。

本文将详述如何使用官方TypeScript SDK,将现有Node.js REST API转换为MCP服务器,重点聚焦架构改造及由此解锁的关键应用场景。

范式转变:从REST到MCP


维度传统REST APIMCP服务器(AI优先)
主要用户人类开发者、客户端应用AI代理、大语言模型、AI驱动IDE
接口HTTP动词、路径变量、查询参数、自定义请求体标准化JSON-RPC消息(工具/资源/提示)
发现机制通过OpenAPI/Swagger文档手动配置通过`list_tools()`或`list_resources()`动态发现
功能粒度细粒度原子端点(`GET /users/{id}`)高层语义化操作(如`manage_user_profile`)


关键说明:转换并非简单端口映射,而是通过抽象层将现有Node.js业务逻辑封装为MCP层。该层将标准化的MCP调用转换为API可理解的REST请求。

步骤1:搭建Node.js MCP环境

官方工具:Model Context Protocol TypeScript SDK

1. 初始化项目并安装依赖

npm init -y
npm install @modelcontextprotocol/sdk zod node-fetch
npm install -D typescript @types/node ts-node

2. 创建MCP服务器实例`mcp-server.ts`

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "MyNodeAPIServer",
version: "1.0.0",
capabilities: { tools: {}, resources: {}, prompts: {} },
});
const transport = new StdioServerTransport();
async function startServer() {
await server.connect(transport);
console.log("MCP Server is running on standard I/O...");
};
startServer().catch(console.error);

步骤2:设计MCP工具与资源

核心原则:避免暴露细粒度REST端点,转而构建AI友好的高层语义工具

1. 设计LLM友好的工具

错误示范(REST中心化):`get_user_by_id`、`update_user_name`

正确示范(MCP中心化):`manage_user_profile(userId: string, newName: string, newEmail: string)`

2. 实现工具处理器(以更新用户信息为例)

const UpdateUserSchema = z.object({
userId: z.string().describe("需更新的用户唯一ID"),
newEmail: z.string().email().optional().describe("新邮箱地址"),
newSubscriptionPlan: z.enum(['basic', 'premium', 'pro']).optional().describe("新订阅计划")
});
server.registerTool("manage_subscription", {
title: "管理用户订阅与资料",
description: "更新用户邮箱及/或订阅计划(需用户ID)",
argsSchema: UpdateUserSchema,
outputSchema: z.object({
status: z.string(),
updatedFields: z.array(z.string())
})
}, async (args) => {
const { userId, newEmail, newSubscriptionPlan } = args;
const updatedFields: string[] = [];
const REST_API_BASE = "https://api.example.com";
// 1. 调用用户微服务更新用户信息
await fetch(`${REST_API_BASE}/users`, { method: "POST", body: JSON.stringify({ userId, ...args }) });
// 2. 调用计费服务处理订阅
if (newSubscriptionPlan) {
await fetch(`${REST_API_BASE}/billing`, { method: "POST", body: JSON.stringify({ userId, plan: newSubscriptionPlan }) });
}
// 3. 邮件服务发送通知
if (newEmail) {
await fetch(`${REST_API_BASE}/email`, { method: "POST", body: JSON.stringify({ userId, email: newEmail }) });
}
return {
status: "success",
updatedFields: [newEmail ? "邮箱" : "", newSubscriptionPlan ? "订阅计划" : ""].filter(Boolean)
};
});
// 注册客户订单资源
server.registerResource("customer_orders", {
getCustomerOrderHistory: {
description: "获取客户订单历史",
params: { customerId: z.string() }
}
});

关键应用场景

1. 智能客服自动化

场景:客服人员询问“Alice的订单状态,能否申请10%折扣?”

MCP实现:资源`get_customer_order_history`(customerId)工具`apply_discount_to_order`(orderId, 10%)

优势:AI自主链式调用数据与执行操作,无需人工介入

2. 客户入驻工作流

场景:LLM指令“为Jane Doe创建新客户入驻流程”

MCP实现:工具`onboard_new_customer`(name, email)

后台逻辑:调用用户微服务(REST POST)调用计费服务(REST POST)调用邮件服务(REST POST)

优势:LLM通过单一语义指令完成多微服务协同

结论:面向自主AI的标准化集成成为构建应用的前瞻性布局

核心价值:避免简单端点封装 → 通过主动语义化设计(而非API结构)构建高阶工具

在代理生态中显著提升系统级可用性

关键提示:MCP的真正力量在于深度语义裁剪——将用户意图转化为可执行操作,而非简单映射技术接口。这将彻底重构API在自主智能体生态中的价值定位。

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):

昵称:
邮箱:
内容: