import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import {
CallToolRequestSchema,
ListToolsRequestSchema,
ErrorCode,
McpError,
} from '@modelcontextprotocol/sdk/types.js';
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
import { getCurrentTime } from './tools/time.js';
import type { HTTPTransportOptions } from './transport.js';
import { logger } from './utils/logger.js';
/**
* 创建并配置 MCP 服务器
*/
export async function createServer(): Promise<Server> {
const server = new Server(
{
name: 'time-mcp',
version: '1.0.0',
},
{
capabilities: {
tools: {},
},
}
);
// 注册工具列表处理器
server.setRequestHandler(ListToolsRequestSchema, async () => {
logger.debug('Handling ListTools request');
const tools = [
{
name: 'getCurrentTime',
description: 'Get the current UTC time in ISO 8601 format along with Unix timestamp',
inputSchema: {
type: 'object',
properties: {},
},
},
];
logger.info(`Returning ${tools.length} tool(s)`);
return { tools };
});
// 注册工具调用处理器
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
logger.info(`Calling tool: ${name}`, { arguments: args });
try {
switch (name) {
case 'getCurrentTime': {
logger.debug('Executing getCurrentTime tool');
const result = getCurrentTime();
logger.debug('getCurrentTime tool executed successfully', { result });
return {
content: [
{
type: 'text',
text: JSON.stringify(result, null, 2),
},
],
};
}
default:
logger.warn(`Unknown tool requested: ${name}`);
throw new McpError(
ErrorCode.MethodNotFound,
`Unknown tool: ${name}`
);
}
} catch (error) {
if (error instanceof McpError) {
logger.error(`Tool execution failed (MCP Error): ${name}`, error);
throw error;
}
logger.error(`Tool execution failed (Internal Error): ${name}`, error);
throw new McpError(
ErrorCode.InternalError,
`Error executing tool ${name}: ${error instanceof Error ? error.message : 'Unknown error'}`
);
}
});
return server;
}
/**
* 启动服务器
*/
export async function startServer(transport: Transport): Promise<void> {
logger.info('Creating MCP server');
const server = await createServer();
logger.info('Connecting server to transport');
await server.connect(transport);
logger.info('MCP server started successfully');
}