MCP TypeScript SDK
VishvendraTomar
README
MCP TypeScript SDK

目录
概述
模型上下文协议 (Model Context Protocol) 允许应用程序以标准化的方式为 LLM 提供上下文,将提供上下文的关注点与实际的 LLM 交互分离。 这个 TypeScript SDK 实现了完整的 MCP 规范,使其易于:
- 构建可以连接到任何 MCP 服务器的 MCP 客户端
- 创建暴露资源、提示词和工具的 MCP 服务器
- 使用标准传输方式,如 stdio 和 SSE
- 处理所有 MCP 协议消息和生命周期事件
安装
npm install @modelcontextprotocol/sdk
快速开始
让我们创建一个简单的 MCP 服务器,它暴露一个计算器工具和一些数据:
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
// 创建一个 MCP 服务器
const server = new McpServer({
name: "Demo",
version: "1.0.0"
});
// 添加一个加法工具
server.tool("add",
{ a: z.number(), b: z.number() },
async ({ a, b }) => ({
content: [{ type: "text", text: String(a + b) }]
})
);
// 添加一个动态的问候资源
server.resource(
"greeting",
new ResourceTemplate("greeting://{name}", { list: undefined }),
async (uri, { name }) => ({
contents: [{
uri: uri.href,
text: `Hello, ${name}!`
}]
})
);
// 开始在 stdin 上接收消息并在 stdout 上发送消息
const transport = new StdioServerTransport();
await server.connect(transport);
什么是 MCP?
模型上下文协议 (MCP) 允许你构建服务器,以安全、标准化的方式向 LLM 应用程序暴露数据和功能。 可以把它想象成一个 Web API,但专门为 LLM 交互而设计。 MCP 服务器可以:
- 通过 资源 暴露数据(可以把它们想象成 GET 端点;它们用于将信息加载到 LLM 的上下文中)
- 通过 工具 提供功能(有点像 POST 端点;它们用于执行代码或以其他方式产生副作用)
- 通过 提示词 定义交互模式(用于 LLM 交互的可重用模板)
- 还有更多!
核心概念
服务器
McpServer 是你与 MCP 协议的核心接口。 它处理连接管理、协议合规性和消息路由:
const server = new McpServer({
name: "My App",
version: "1.0.0"
});
资源
资源是你如何向 LLM 暴露数据。 它们类似于 REST API 中的 GET 端点 - 它们提供数据,但不应执行重要的计算或产生副作用:
// 静态资源
server.resource(
"config",
"config://app",
async (uri) => ({
contents: [{
uri: uri.href,
text: "App configuration here"
}]
})
);
// 带有参数的动态资源
server.resource(
"user-profile",
new ResourceTemplate("users://{userId}/profile", { list: undefined }),
async (uri, { userId }) => ({
contents: [{
uri: uri.href,
text: `Profile data for user ${userId}`
}]
})
);
工具
工具允许 LLM 通过你的服务器采取行动。 与资源不同,工具应该执行计算并产生副作用:
// 带有参数的简单工具
server.tool(
"calculate-bmi",
{
weightKg: z.number(),
heightM: z.number()
},
async ({ weightKg, heightM }) => ({
content: [{
type: "text",
text: String(weightKg / (heightM * heightM))
}]
})
);
// 带有外部 API 调用的异步工具
server.tool(
"fetch-weather",
{ city: z.string() },
async ({ city }) => {
const response = await fetch(`https://api.weather.com/${city}`);
const data = await response.text();
return {
content: [{ type: "text", text: data }]
};
}
);
提示词
提示词是可重用的模板,可帮助 LLM 有效地与你的服务器交互:
server.prompt(
"review-code",
{ code: z.string() },
({ code }) => ({
messages: [{
role: "user",
content: {
type: "text",
text: `Please review this code:\n\n${code}`
}
}]
})
);
运行你的服务器
TypeScript 中的 MCP 服务器需要连接到传输方式才能与客户端通信。 如何启动服务器取决于传输方式的选择:
stdio
对于命令行工具和直接集成:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new McpServer({
name: "example-server",
version: "1.0.0"
});
// ... 设置服务器资源、工具和提示词 ...
const transport = new StdioServerTransport();
await server.connect(transport);
HTTP with SSE
对于远程服务器,启动一个带有 Server-Sent Events (SSE) 端点的 Web 服务器,以及一个单独的端点供客户端向其发送消息:
import express, { Request, Response } from "express";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
const server = new McpServer({
name: "example-server",
version: "1.0.0"
});
// ... 设置服务器资源、工具和提示词 ...
const app = express();
// 为了支持多个同时连接,我们有一个从 sessionId 到 transport 的查找对象
const transports: {[sessionId: string]: SSEServerTransport} = {};
app.get("/sse", async (_: Request, res: Response) => {
const transport = new SSEServerTransport('/messages', res);
transports[transport.sessionId] = transport;
res.on("close", () => {
delete transports[transport.sessionId];
});
await server.connect(transport);
});
app.post("/messages", async (req: Request, res: Response) => {
const sessionId = req.query.sessionId as string;
const transport = transports[sessionId];
if (transport) {
await transport.handlePostMessage(req, res);
} else {
res.status(400).send('No transport found for sessionId');
}
});
app.listen(3001);
测试和调试
要测试你的服务器,你可以使用 MCP Inspector。 有关更多信息,请参阅其 README。
示例
Echo 服务器
一个简单的服务器,演示了资源、工具和提示词:
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
const server = new McpServer({
name: "Echo",
version: "1.0.0"
});
server.resource(
"echo",
new ResourceTemplate("echo://{message}", { list: undefined }),
async (uri, { message }) => ({
contents: [{
uri: uri.href,
text: `Resource echo: ${message}`
}]
})
);
server.tool(
"echo",
{ message: z.string() },
async ({ message }) => ({
content: [{ type: "text", text: `Tool echo: ${message}` }]
})
);
server.prompt(
"echo",
{ message: z.string() },
({ message }) => ({
messages: [{
role: "user",
content: {
type: "text",
text: `Please process this message: ${message}`
}
}]
})
);
SQLite 浏览器
一个更复杂的示例,展示了数据库集成:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import sqlite3 from "sqlite3";
import { promisify } from "util";
import { z } from "zod";
const server = new McpServer({
name: "SQLite Explorer",
version: "1.0.0"
});
// 帮助程序创建 DB 连接
const getDb = () => {
const db = new sqlite3.Database("database.db");
return {
all: promisify<string, any[]>(db.all.bind(db)),
close: promisify(db.close.bind(db))
};
};
server.resource(
"schema",
"schema://main",
async (uri) => {
const db = getDb();
try {
const tables = await db.all(
"SELECT sql FROM sqlite_master WHERE type='table'"
);
return {
contents: [{
uri: uri.href,
text: tables.map((t: {sql: string}) => t.sql).join("\n")
}]
};
} finally {
await db.close();
}
}
);
server.tool(
"query",
{ sql: z.string() },
async ({ sql }) => {
const db = getDb();
try {
const results = await db.all(sql);
return {
content: [{
type: "text",
text: JSON.stringify(results, null, 2)
}]
};
} catch (err: unknown) {
const error = err as Error;
return {
content: [{
type: "text",
text: `Error: ${error.message}`
}],
isError: true
};
} finally {
await db.close();
}
}
);
高级用法
底层服务器
为了获得更多控制,你可以直接使用底层 Server 类:
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
ListPromptsRequestSchema,
GetPromptRequestSchema
} from "@modelcontextprotocol/sdk/types.js";
const server = new Server(
{
name: "example-server",
version: "1.0.0"
},
{
capabilities: {
prompts: {}
}
}
);
server.setRequestHandler(ListPromptsRequestSchema, async () => {
return {
prompts: [{
name: "example-prompt",
description: "An example prompt template",
arguments: [{
name: "arg1",
description: "Example argument",
required: true
}]
}]
};
});
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
if (request.params.name !== "example-prompt") {
throw new Error("Unknown prompt");
}
return {
description: "Example prompt",
messages: [{
role: "user",
content: {
type: "text",
text: "Example prompt text"
}
}]
};
});
const transport = new StdioServerTransport();
await server.connect(transport);
编写 MCP 客户端
SDK 提供了一个高级客户端接口:
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const transport = new StdioClientTransport({
command: "node",
args: ["server.js"]
});
const client = new Client(
{
name: "example-client",
version: "1.0.0"
},
{
capabilities: {
prompts: {},
resources: {},
tools: {}
}
}
);
await client.connect(transport);
// 列出提示词
const prompts = await client.listPrompts();
// 获取一个提示词
const prompt = await client.getPrompt("example-prompt", {
arg1: "value"
});
// 列出资源
const resources = await client.listResources();
// 读取一个资源
const resource = await client.readResource("file:///example.txt");
// 调用一个工具
const result = await client.callTool({
name: "example-tool",
arguments: {
arg1: "value"
}
});
文档
贡献
欢迎在 GitHub 上提交 issue 和 pull request:https://github.com/modelcontextprotocol/typescript-sdk。
许可
本项目已获得 MIT 许可——有关详细信息,请参阅 LICENSE 文件。
推荐服务器
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
MCP Package Docs Server
促进大型语言模型高效访问和获取 Go、Python 和 NPM 包的结构化文档,通过多语言支持和性能优化来增强软件开发。
Claude Code MCP
一个实现了 Claude Code 作为模型上下文协议(Model Context Protocol, MCP)服务器的方案,它可以通过标准化的 MCP 接口来使用 Claude 的软件工程能力(代码生成、编辑、审查和文件操作)。
@kazuph/mcp-taskmanager
用于任务管理的模型上下文协议服务器。它允许 Claude Desktop(或任何 MCP 客户端)在基于队列的系统中管理和执行任务。
mermaid-mcp-server
一个模型上下文协议 (MCP) 服务器,用于将 Mermaid 图表转换为 PNG 图像。
Jira-Context-MCP
MCP 服务器向 AI 编码助手(如 Cursor)提供 Jira 工单信息。

Linear MCP Server
一个模型上下文协议(Model Context Protocol)服务器,它与 Linear 的问题跟踪系统集成,允许大型语言模型(LLM)通过自然语言交互来创建、更新、搜索和评论 Linear 问题。

Sequential Thinking MCP Server
这个服务器通过将复杂问题分解为顺序步骤来促进结构化的问题解决,支持修订,并通过完整的 MCP 集成来实现多条解决方案路径。
Curri MCP Server
通过管理文本笔记、提供笔记创建工具以及使用结构化提示生成摘要,从而实现与 Curri API 的交互。