import { z } from "zod";
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
import { ToolBase, ToolArgs, OperationType, ToolCategory, TelemetryToolMetadata } from "../tool.js";
import { Session } from "../../session.js";
import { UserConfig } from "../../config.js";
import { Telemetry } from "../../telemetry/telemetry.js";
export class ServerTimeTool extends ToolBase {
protected name = "get-server-time";
protected category: ToolCategory = "mongodb"; // 使用现有的category
protected operationType: OperationType = "metadata";
protected description = "获取服务器当前时间,使用Asia/Shanghai时区";
protected argsShape = {
format: z.string().optional().describe("时间格式,可选值:'iso'(ISO格式)、'unix'(Unix时间戳)、'readable'(可读格式),默认为'iso'")
};
constructor(session: Session, config: UserConfig, telemetry: Telemetry) {
super(session, config, telemetry);
}
protected async execute({ format = "iso" }: ToolArgs<typeof this.argsShape>): Promise<CallToolResult> {
try {
const now = new Date();
// 设置时区为Asia/Shanghai
const formatter = new Intl.DateTimeFormat('zh-CN', {
timeZone: 'Asia/Shanghai',
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false
});
let timeResult: any = {
timezone: 'Asia/Shanghai',
timestamp: now.getTime()
};
switch (format) {
case 'unix':
timeResult.time = Math.floor(now.getTime() / 1000);
timeResult.format = 'Unix timestamp (seconds)';
break;
case 'readable':
timeResult.time = formatter.format(now);
timeResult.format = 'Readable format (YYYY-MM-DD HH:mm:ss)';
break;
case 'iso':
default:
// 转换为Asia/Shanghai时区的ISO格式
const offset = 8 * 60; // Asia/Shanghai is UTC+8
const localTime = new Date(now.getTime() + offset * 60000);
timeResult.time = localTime.toISOString().replace('Z', '+08:00');
timeResult.format = 'ISO 8601 format with timezone';
break;
}
return {
content: [
{
type: "text",
text: JSON.stringify(timeResult, undefined, 2)
}
]
};
} catch (error) {
return {
content: [
{
type: "text",
text: JSON.stringify({
error: error instanceof Error ? error.message : String(error)
}, undefined, 2)
}
],
isError: true
};
}
}
protected resolveTelemetryMetadata(): TelemetryToolMetadata {
return {};
}
}