UNPKG

local-file-operation-mcp

Version:

本地文件操作 MCP 服务器:安全的读写、编辑、搜索、比较、哈希、权限、压缩、监控、命令与任务管理工具集。

115 lines (96 loc) 3.23 kB
/** * 时间工具模块 * 提供获取当前时间的能力,支持多种格式与时区 */ class TimeTool { constructor(securityValidator) { this.securityValidator = securityValidator; } async handle(args = {}) { const { format = 'iso', time_zone: timeZone, include_milliseconds: includeMilliseconds = true } = args; const now = new Date(); const result = this.buildTimeResponse(now, { format, timeZone, includeMilliseconds }); return { content: [ { type: 'text', text: result.text }, { type: 'json', json: result.json } ] }; } buildTimeResponse(dateObj, options) { const { format, timeZone, includeMilliseconds } = options; // ISO 基准时间总是以 UTC 表示 const iso = includeMilliseconds ? dateObj.toISOString() : new Date(Math.floor(dateObj.getTime() / 1000) * 1000).toISOString(); // Unix 时间戳(秒/毫秒) const unixSeconds = Math.floor(dateObj.getTime() / 1000); const unixMilliseconds = dateObj.getTime(); // 本地与指定时区格式化 const locale = this.formatWithIntl(dateObj, undefined, includeMilliseconds); const zoned = this.formatWithIntl(dateObj, timeZone, includeMilliseconds); // RFC3339 与 ISO 基本一致(这里沿用 ISO 输出) const rfc3339 = iso; // 选择主显示文本 let primaryText; switch ((format || '').toLowerCase()) { case 'unix': primaryText = `当前时间(UNIX): ${unixSeconds}`; break; case 'unix_ms': primaryText = `当前时间(UNIX 毫秒): ${unixMilliseconds}`; break; case 'locale': primaryText = `当前时间(本地): ${locale}`; break; case 'rfc3339': primaryText = `当前时间(RFC3339): ${rfc3339}`; break; case 'iso': default: primaryText = `当前时间(ISO): ${iso}`; break; } const json = { iso, rfc3339, unix_seconds: unixSeconds, unix_milliseconds: unixMilliseconds, local: locale, time_zone: timeZone || Intl.DateTimeFormat().resolvedOptions().timeZone, zoned_time: zoned }; return { text: primaryText, json }; } formatWithIntl(dateObj, timeZone, includeMilliseconds) { try { const resolvedTz = timeZone || Intl.DateTimeFormat().resolvedOptions().timeZone; const parts = new Intl.DateTimeFormat('zh-CN', { timeZone: resolvedTz, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }).formatToParts(dateObj); const map = Object.fromEntries(parts.map(p => [p.type, p.value])); const ms = includeMilliseconds ? `.${String(dateObj.getMilliseconds()).padStart(3, '0')}` : ''; // 统一输出格式:YYYY-MM-DD HH:mm:ss(.SSS) [TZ] return `${map.year}-${map.month}-${map.day} ${map.hour}:${map.minute}:${map.second}${ms} [${resolvedTz}]`; } catch (e) { // 回退到默认 toString return dateObj.toString(); } } } module.exports = TimeTool;