在上一篇文章中,我们详细介绍了MCP开发环境的搭建。本文作为MCP TypeScript-SDK系列的第二篇,将深入探讨MCP基础服务器开发的核心内容,包括服务器创建与生命周期管理、McpServer与Server的区别与选择、各种配置选项的详解,以及基本启动与调试技巧。通过本文学习,你将能够构建稳定、高效的MCP服务器,为后续开发高级功能打下坚实基础。
MCP服务器是MCP应用的核心组件,负责处理客户端请求、管理资源和工具、协调模型交互等核心功能。在TypeScript-SDK中,服务器实例是应用程序的中央控制点,具有完整的生命周期管理机制。
MCP TypeScript-SDK提供了两种创建服务器的方式:
import {
McpServer } from '@modelcontextprotocol/sdk';
// 创建服务器实例
const server = new McpServer({
name: 'my-mcp-server',
description: '我的MCP服务器',
version: '1.0.0',
});
import {
McpServerBuilder } from '@modelcontextprotocol/sdk';
// 使用构建器模式创建
const server = new McpServerBuilder()
.withName('my-mcp-server')
.withDescription('我的MCP服务器')
.withVersion('1.0.0')
.withHttp({
port: 8080 })
.build();
MCP服务器具有明确的生命周期阶段,理解和正确管理这些阶段对于开发稳定的应用至关重要:
服务器创建后但尚未启动的阶段,适合进行资源注册、工具注册等准备工作:
// 初始化阶段配置
server.registerTool({
name: 'greeting',
description: '发送问候',
parameters: z.object({
name: z.string().describe('被问候者的名字'),
}),
execute: async ({
name }) => {
return `你好,${
name}!`;
},
});
服务器开始接受连接的阶段,此时完成所有传输层初始化:
// 启动服务器
await server.start();
console.log('服务器已启动,正在监听请求...');
服务器正常运行,处理客户端请求的阶段。在这个阶段,您可以动态修改服务器的工具和资源:
// 动态注册新工具
server.registerTool({
name: 'dynamicTool',
description: '运行时添加的工具',
parameters: z.object({
}),
execute: async () => {
return '这是运行时添加的工具';
},
});
优雅地终止服务器,释放资源的阶段:
// 优雅关闭服务器
await server.shutdown();
console.log('服务器已安全关闭');
MCP服务器提供了丰富的事件机制,允许开发者在不同生命周期阶段执行自定义逻辑:
// 监听服务器启动事件
server.on('start', () => {
console.log('服务器启动事件触发');
// 执行启动后的初始化工作
});
// 监听服务器关闭事件
server.on('shutdown', () => {
console.log('服务器关闭事件触发');
// 执行资源清理工作
});
// 监听错误事件
server.on('error', (error) => {
console.error('服务器发生错误:', error);
// 错误处理逻辑
});
MCP TypeScript-SDK提供了两种服务器实现:McpServer
和Server
,了解它们的区别对于选择合适的服务器类型至关重要。
McpServer
是符合MCP协议规范的完整实现,提供了全面的功能支持:
特点:
适用场景:
import {
McpServer } from '@modelcontextprotocol/sdk';
const mcpServer = new McpServer({
name: 'standard-mcp-server',
description: '标准MCP服务器实现',
version: '1.0.0',
// MCP协议的完整配置选项
});
Server
是一个更轻量级的实现,专注于核心功能,适合特定场景:
特点:
适用场景:
import {
Server } from '@modelcontextprotocol/sdk';
const lightServer = new Server({
name: 'light-server',
// 简化的配置选项
});
在选择服务器类型时,可以参考以下指南:
考虑因素 | McpServer | Server |
---|---|---|
协议兼容性 | 完全兼容MCP标准 | 部分兼容 |
资源占用 | 较高 | 较低 |
功能完整性 | 完整功能集 | 核心功能集 |
配置复杂度 | 较复杂 | 较简单 |
扩展灵活性 | 标准化扩展 | 高度灵活 |
适用范围 | 大中型应用 | 小型或特定场景 |
在某些情况下,你可能需要在两种服务器类型之间进行转换或互操作:
import {
McpServer, Server, convertToMcpServer } from '@modelcontextprotocol/sdk';
// 从轻量服务器升级到完整MCP服务器
const lightServer = new Server({
name: