@xiaozhi-client/datetime-mcp 1.0.0 → 1.9.7-beta.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -296
- package/dist/index.js.map +1 -1
- package/package.json +6 -1
package/dist/index.js
CHANGED
|
@@ -1,299 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
#!/usr/bin/env node
|
|
3
|
-
|
|
4
|
-
// src/index.ts
|
|
5
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
7
|
-
import { z } from "zod";
|
|
8
|
-
var logger = {
|
|
9
|
-
info: (message) => {
|
|
10
|
-
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
11
|
-
console.error(`${timestamp} - DateTime - INFO - ${message}`);
|
|
12
|
-
},
|
|
13
|
-
error: (message) => {
|
|
14
|
-
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
15
|
-
console.error(`${timestamp} - DateTime - ERROR - ${message}`);
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
var server = new McpServer({
|
|
19
|
-
name: "@xiaozhi-client/datetime-mcp",
|
|
20
|
-
version: "1.0.0"
|
|
21
|
-
});
|
|
22
|
-
server.tool(
|
|
23
|
-
"get_current_time",
|
|
24
|
-
"\u83B7\u53D6\u5F53\u524D\u65F6\u95F4\uFF0C\u652F\u6301\u591A\u79CD\u683C\u5F0F",
|
|
25
|
-
{
|
|
26
|
-
format: z.string().optional().describe("\u65F6\u95F4\u683C\u5F0F\uFF1A'iso'\uFF08\u9ED8\u8BA4\uFF09\u3001'timestamp'\u3001'locale'\u3001'time-only'")
|
|
27
|
-
},
|
|
28
|
-
async ({ format = "iso" }) => {
|
|
29
|
-
try {
|
|
30
|
-
const now = /* @__PURE__ */ new Date();
|
|
31
|
-
let result;
|
|
32
|
-
switch (format) {
|
|
33
|
-
case "timestamp":
|
|
34
|
-
result = now.getTime();
|
|
35
|
-
break;
|
|
36
|
-
case "locale":
|
|
37
|
-
result = now.toLocaleString();
|
|
38
|
-
break;
|
|
39
|
-
case "time-only":
|
|
40
|
-
result = now.toLocaleTimeString();
|
|
41
|
-
break;
|
|
42
|
-
case "iso":
|
|
43
|
-
default:
|
|
44
|
-
result = now.toISOString();
|
|
45
|
-
break;
|
|
46
|
-
}
|
|
47
|
-
logger.info(`\u83B7\u53D6\u5F53\u524D\u65F6\u95F4\uFF0C\u683C\u5F0F\uFF1A${format}\uFF0C\u7ED3\u679C\uFF1A${result}`);
|
|
48
|
-
return {
|
|
49
|
-
content: [
|
|
50
|
-
{
|
|
51
|
-
type: "text",
|
|
52
|
-
text: JSON.stringify({
|
|
53
|
-
success: true,
|
|
54
|
-
result,
|
|
55
|
-
format
|
|
56
|
-
})
|
|
57
|
-
}
|
|
58
|
-
]
|
|
59
|
-
};
|
|
60
|
-
} catch (error) {
|
|
61
|
-
logger.error(`\u83B7\u53D6\u5F53\u524D\u65F6\u95F4\u9519\u8BEF\uFF1A${error.message}`);
|
|
62
|
-
return {
|
|
63
|
-
content: [
|
|
64
|
-
{
|
|
65
|
-
type: "text",
|
|
66
|
-
text: JSON.stringify({
|
|
67
|
-
success: false,
|
|
68
|
-
error: error.message
|
|
69
|
-
})
|
|
70
|
-
}
|
|
71
|
-
],
|
|
72
|
-
isError: true
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
);
|
|
77
|
-
server.tool(
|
|
78
|
-
"get_current_date",
|
|
79
|
-
"\u83B7\u53D6\u5F53\u524D\u65E5\u671F\uFF0C\u652F\u6301\u591A\u79CD\u683C\u5F0F",
|
|
80
|
-
{
|
|
81
|
-
format: z.string().optional().describe("\u65E5\u671F\u683C\u5F0F\uFF1A'iso'\uFF08\u9ED8\u8BA4\uFF09\u3001'locale'\u3001'date-only'\u3001'yyyy-mm-dd'")
|
|
82
|
-
},
|
|
83
|
-
async ({ format = "iso" }) => {
|
|
84
|
-
try {
|
|
85
|
-
const now = /* @__PURE__ */ new Date();
|
|
86
|
-
let result;
|
|
87
|
-
switch (format) {
|
|
88
|
-
case "locale":
|
|
89
|
-
result = now.toLocaleDateString();
|
|
90
|
-
break;
|
|
91
|
-
case "date-only":
|
|
92
|
-
result = now.toDateString();
|
|
93
|
-
break;
|
|
94
|
-
case "yyyy-mm-dd":
|
|
95
|
-
result = now.toISOString().split("T")[0];
|
|
96
|
-
break;
|
|
97
|
-
case "iso":
|
|
98
|
-
default:
|
|
99
|
-
result = now.toISOString();
|
|
100
|
-
break;
|
|
101
|
-
}
|
|
102
|
-
logger.info(`\u83B7\u53D6\u5F53\u524D\u65E5\u671F\uFF0C\u683C\u5F0F\uFF1A${format}\uFF0C\u7ED3\u679C\uFF1A${result}`);
|
|
103
|
-
return {
|
|
104
|
-
content: [
|
|
105
|
-
{
|
|
106
|
-
type: "text",
|
|
107
|
-
text: JSON.stringify({
|
|
108
|
-
success: true,
|
|
109
|
-
result,
|
|
110
|
-
format
|
|
111
|
-
})
|
|
112
|
-
}
|
|
113
|
-
]
|
|
114
|
-
};
|
|
115
|
-
} catch (error) {
|
|
116
|
-
logger.error(`\u83B7\u53D6\u5F53\u524D\u65E5\u671F\u9519\u8BEF\uFF1A${error.message}`);
|
|
117
|
-
return {
|
|
118
|
-
content: [
|
|
119
|
-
{
|
|
120
|
-
type: "text",
|
|
121
|
-
text: JSON.stringify({
|
|
122
|
-
success: false,
|
|
123
|
-
error: error.message
|
|
124
|
-
})
|
|
125
|
-
}
|
|
126
|
-
],
|
|
127
|
-
isError: true
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
);
|
|
132
|
-
server.tool(
|
|
133
|
-
"format_datetime",
|
|
134
|
-
"\u5C06\u7ED9\u5B9A\u7684\u65E5\u671F\u65F6\u95F4\u5B57\u7B26\u4E32\u6216\u65F6\u95F4\u6233\u683C\u5F0F\u5316\u4E3A\u6307\u5B9A\u683C\u5F0F",
|
|
135
|
-
{
|
|
136
|
-
datetime: z.string().describe("\u8981\u683C\u5F0F\u5316\u7684\u65E5\u671F\u65F6\u95F4\u5B57\u7B26\u4E32\u6216\u65F6\u95F4\u6233"),
|
|
137
|
-
format: z.string().optional().describe("\u8F93\u51FA\u683C\u5F0F\uFF1A'iso'\u3001'locale'\u3001'timestamp'\u3001'yyyy-mm-dd'\u3001'custom'"),
|
|
138
|
-
custom_format: z.string().optional().describe("\u81EA\u5B9A\u4E49\u683C\u5F0F\u5B57\u7B26\u4E32\uFF08\u5F53 format \u4E3A 'custom' \u65F6\u4F7F\u7528\uFF09")
|
|
139
|
-
},
|
|
140
|
-
async ({ datetime, format = "iso", custom_format }) => {
|
|
141
|
-
try {
|
|
142
|
-
let date;
|
|
143
|
-
if (!isNaN(Number(datetime))) {
|
|
144
|
-
date = new Date(Number(datetime));
|
|
145
|
-
} else {
|
|
146
|
-
date = new Date(datetime);
|
|
147
|
-
}
|
|
148
|
-
if (isNaN(date.getTime())) {
|
|
149
|
-
throw new Error("\u65E0\u6548\u7684\u65E5\u671F\u65F6\u95F4\u683C\u5F0F");
|
|
150
|
-
}
|
|
151
|
-
let result;
|
|
152
|
-
switch (format) {
|
|
153
|
-
case "timestamp":
|
|
154
|
-
result = date.getTime();
|
|
155
|
-
break;
|
|
156
|
-
case "locale":
|
|
157
|
-
result = date.toLocaleString();
|
|
158
|
-
break;
|
|
159
|
-
case "yyyy-mm-dd":
|
|
160
|
-
result = date.toISOString().split("T")[0];
|
|
161
|
-
break;
|
|
162
|
-
case "custom":
|
|
163
|
-
if (custom_format) {
|
|
164
|
-
result = custom_format.replace("YYYY", String(date.getFullYear())).replace("MM", String(date.getMonth() + 1).padStart(2, "0")).replace("DD", String(date.getDate()).padStart(2, "0")).replace("HH", String(date.getHours()).padStart(2, "0")).replace("mm", String(date.getMinutes()).padStart(2, "0")).replace("ss", String(date.getSeconds()).padStart(2, "0"));
|
|
165
|
-
} else {
|
|
166
|
-
result = date.toISOString();
|
|
167
|
-
}
|
|
168
|
-
break;
|
|
169
|
-
case "iso":
|
|
170
|
-
default:
|
|
171
|
-
result = date.toISOString();
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
logger.info(`\u683C\u5F0F\u5316\u65E5\u671F\u65F6\u95F4\uFF1A${datetime} \u4E3A\u683C\u5F0F\uFF1A${format}\uFF0C\u7ED3\u679C\uFF1A${result}`);
|
|
175
|
-
return {
|
|
176
|
-
content: [
|
|
177
|
-
{
|
|
178
|
-
type: "text",
|
|
179
|
-
text: JSON.stringify({
|
|
180
|
-
success: true,
|
|
181
|
-
result,
|
|
182
|
-
original: datetime,
|
|
183
|
-
format
|
|
184
|
-
})
|
|
185
|
-
}
|
|
186
|
-
]
|
|
187
|
-
};
|
|
188
|
-
} catch (error) {
|
|
189
|
-
logger.error(`\u683C\u5F0F\u5316\u65E5\u671F\u65F6\u95F4\u9519\u8BEF\uFF1A${error.message}`);
|
|
190
|
-
return {
|
|
191
|
-
content: [
|
|
192
|
-
{
|
|
193
|
-
type: "text",
|
|
194
|
-
text: JSON.stringify({
|
|
195
|
-
success: false,
|
|
196
|
-
error: error.message
|
|
197
|
-
})
|
|
198
|
-
}
|
|
199
|
-
],
|
|
200
|
-
isError: true
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
);
|
|
205
|
-
server.tool(
|
|
206
|
-
"add_time",
|
|
207
|
-
"\u5728\u7ED9\u5B9A\u7684\u65E5\u671F\u65F6\u95F4\u57FA\u7840\u4E0A\u589E\u52A0\u6216\u51CF\u5C11\u65F6\u95F4",
|
|
208
|
-
{
|
|
209
|
-
datetime: z.string().describe("\u57FA\u51C6\u65E5\u671F\u65F6\u95F4\u5B57\u7B26\u4E32\u6216\u65F6\u95F4\u6233"),
|
|
210
|
-
amount: z.number().describe("\u8981\u589E\u52A0\uFF08\u6B63\u6570\uFF09\u6216\u51CF\u5C11\uFF08\u8D1F\u6570\uFF09\u7684\u6570\u91CF"),
|
|
211
|
-
unit: z.string().describe("\u65F6\u95F4\u5355\u4F4D\uFF1A'milliseconds'\u3001'seconds'\u3001'minutes'\u3001'hours'\u3001'days'\u3001'weeks'\u3001'months'\u3001'years'")
|
|
212
|
-
},
|
|
213
|
-
async ({ datetime, amount, unit }) => {
|
|
214
|
-
try {
|
|
215
|
-
let date;
|
|
216
|
-
if (!isNaN(Number(datetime))) {
|
|
217
|
-
date = new Date(Number(datetime));
|
|
218
|
-
} else {
|
|
219
|
-
date = new Date(datetime);
|
|
220
|
-
}
|
|
221
|
-
if (isNaN(date.getTime())) {
|
|
222
|
-
throw new Error("\u65E0\u6548\u7684\u65E5\u671F\u65F6\u95F4\u683C\u5F0F");
|
|
223
|
-
}
|
|
224
|
-
const newDate = new Date(date);
|
|
225
|
-
switch (unit.toLowerCase()) {
|
|
226
|
-
case "milliseconds":
|
|
227
|
-
newDate.setTime(newDate.getTime() + amount);
|
|
228
|
-
break;
|
|
229
|
-
case "seconds":
|
|
230
|
-
newDate.setTime(newDate.getTime() + amount * 1e3);
|
|
231
|
-
break;
|
|
232
|
-
case "minutes":
|
|
233
|
-
newDate.setTime(newDate.getTime() + amount * 60 * 1e3);
|
|
234
|
-
break;
|
|
235
|
-
case "hours":
|
|
236
|
-
newDate.setTime(newDate.getTime() + amount * 60 * 60 * 1e3);
|
|
237
|
-
break;
|
|
238
|
-
case "days":
|
|
239
|
-
newDate.setDate(newDate.getDate() + amount);
|
|
240
|
-
break;
|
|
241
|
-
case "weeks":
|
|
242
|
-
newDate.setDate(newDate.getDate() + amount * 7);
|
|
243
|
-
break;
|
|
244
|
-
case "months":
|
|
245
|
-
newDate.setMonth(newDate.getMonth() + amount);
|
|
246
|
-
break;
|
|
247
|
-
case "years":
|
|
248
|
-
newDate.setFullYear(newDate.getFullYear() + amount);
|
|
249
|
-
break;
|
|
250
|
-
default:
|
|
251
|
-
throw new Error(`\u4E0D\u652F\u6301\u7684\u65F6\u95F4\u5355\u4F4D\uFF1A${unit}`);
|
|
252
|
-
}
|
|
253
|
-
const result = newDate.toISOString();
|
|
254
|
-
logger.info(`\u5728 ${datetime} \u57FA\u7840\u4E0A\u589E\u52A0 ${amount} ${unit}\uFF0C\u7ED3\u679C\uFF1A${result}`);
|
|
255
|
-
return {
|
|
256
|
-
content: [
|
|
257
|
-
{
|
|
258
|
-
type: "text",
|
|
259
|
-
text: JSON.stringify({
|
|
260
|
-
success: true,
|
|
261
|
-
result,
|
|
262
|
-
original: datetime,
|
|
263
|
-
amount,
|
|
264
|
-
unit
|
|
265
|
-
})
|
|
266
|
-
}
|
|
267
|
-
]
|
|
268
|
-
};
|
|
269
|
-
} catch (error) {
|
|
270
|
-
logger.error(`\u65F6\u95F4\u52A0\u51CF\u9519\u8BEF\uFF1A${error.message}`);
|
|
271
|
-
return {
|
|
272
|
-
content: [
|
|
273
|
-
{
|
|
274
|
-
type: "text",
|
|
275
|
-
text: JSON.stringify({
|
|
276
|
-
success: false,
|
|
277
|
-
error: error.message
|
|
278
|
-
})
|
|
279
|
-
}
|
|
280
|
-
],
|
|
281
|
-
isError: true
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
);
|
|
286
|
-
async function main() {
|
|
287
|
-
const transport = new StdioServerTransport();
|
|
288
|
-
await server.connect(transport);
|
|
289
|
-
logger.info("DateTime MCP \u670D\u52A1\u5DF2\u542F\u52A8");
|
|
290
|
-
}
|
|
291
|
-
main().catch((error) => {
|
|
292
|
-
logger.error(`\u542F\u52A8\u670D\u52A1\u5931\u8D25\uFF1A${error.message}`);
|
|
293
|
-
process.exit(1);
|
|
294
|
-
});
|
|
295
|
-
var src_default = server;
|
|
296
|
-
export {
|
|
297
|
-
src_default as default
|
|
298
|
-
};
|
|
3
|
+
import{McpServer as l}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as m}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as o}from"zod";var i={info:t=>{let e=new Date().toISOString()},error:t=>{let e=new Date().toISOString()}};function a(t){return t instanceof Error?t.message:String(t)}var c=new l({name:"@xiaozhi-client/datetime-mcp",version:"1.0.0"});c.tool("get_current_time","\u83B7\u53D6\u5F53\u524D\u65F6\u95F4\uFF0C\u652F\u6301\u591A\u79CD\u683C\u5F0F",{format:o.string().optional().describe("\u65F6\u95F4\u683C\u5F0F\uFF1A'iso'\uFF08\u9ED8\u8BA4\uFF09\u3001'timestamp'\u3001'locale'\u3001'time-only'")},async({format:t="iso"})=>{try{let e=new Date,n;switch(t){case"timestamp":n=e.getTime();break;case"locale":n=e.toLocaleString();break;case"time-only":n=e.toLocaleTimeString();break;default:n=e.toISOString();break}return i.info(`\u83B7\u53D6\u5F53\u524D\u65F6\u95F4\uFF0C\u683C\u5F0F\uFF1A${t}\uFF0C\u7ED3\u679C\uFF1A${n}`),{content:[{type:"text",text:JSON.stringify({success:!0,result:n,format:t})}]}}catch(e){return i.error(`\u83B7\u53D6\u5F53\u524D\u65F6\u95F4\u9519\u8BEF\uFF1A${a(e)}`),{content:[{type:"text",text:JSON.stringify({success:!1,error:a(e)})}],isError:!0}}});c.tool("get_current_date","\u83B7\u53D6\u5F53\u524D\u65E5\u671F\uFF0C\u652F\u6301\u591A\u79CD\u683C\u5F0F",{format:o.string().optional().describe("\u65E5\u671F\u683C\u5F0F\uFF1A'iso'\uFF08\u9ED8\u8BA4\uFF09\u3001'locale'\u3001'date-only'\u3001'yyyy-mm-dd'")},async({format:t="iso"})=>{try{let e=new Date,n;switch(t){case"locale":n=e.toLocaleDateString();break;case"date-only":n=e.toDateString();break;case"yyyy-mm-dd":n=e.toISOString().split("T")[0];break;default:n=e.toISOString();break}return i.info(`\u83B7\u53D6\u5F53\u524D\u65E5\u671F\uFF0C\u683C\u5F0F\uFF1A${t}\uFF0C\u7ED3\u679C\uFF1A${n}`),{content:[{type:"text",text:JSON.stringify({success:!0,result:n,format:t})}]}}catch(e){return i.error(`\u83B7\u53D6\u5F53\u524D\u65E5\u671F\u9519\u8BEF\uFF1A${a(e)}`),{content:[{type:"text",text:JSON.stringify({success:!1,error:a(e)})}],isError:!0}}});c.tool("format_datetime","\u5C06\u7ED9\u5B9A\u7684\u65E5\u671F\u65F6\u95F4\u5B57\u7B26\u4E32\u6216\u65F6\u95F4\u6233\u683C\u5F0F\u5316\u4E3A\u6307\u5B9A\u683C\u5F0F",{datetime:o.string().describe("\u8981\u683C\u5F0F\u5316\u7684\u65E5\u671F\u65F6\u95F4\u5B57\u7B26\u4E32\u6216\u65F6\u95F4\u6233"),format:o.string().optional().describe("\u8F93\u51FA\u683C\u5F0F\uFF1A'iso'\u3001'locale'\u3001'timestamp'\u3001'yyyy-mm-dd'\u3001'custom'"),custom_format:o.string().optional().describe("\u81EA\u5B9A\u4E49\u683C\u5F0F\u5B57\u7B26\u4E32\uFF08\u5F53 format \u4E3A 'custom' \u65F6\u4F7F\u7528\uFF09")},async({datetime:t,format:e="iso",custom_format:n})=>{try{let s;if(Number.isNaN(Number(t))?s=new Date(t):s=new Date(Number(t)),Number.isNaN(s.getTime()))throw new Error("\u65E0\u6548\u7684\u65E5\u671F\u65F6\u95F4\u683C\u5F0F");let r;switch(e){case"timestamp":r=s.getTime();break;case"locale":r=s.toLocaleString();break;case"yyyy-mm-dd":r=s.toISOString().split("T")[0];break;case"custom":n?r=n.replace("YYYY",String(s.getFullYear())).replace("MM",String(s.getMonth()+1).padStart(2,"0")).replace("DD",String(s.getDate()).padStart(2,"0")).replace("HH",String(s.getHours()).padStart(2,"0")).replace("mm",String(s.getMinutes()).padStart(2,"0")).replace("ss",String(s.getSeconds()).padStart(2,"0")):r=s.toISOString();break;default:r=s.toISOString();break}return i.info(`\u683C\u5F0F\u5316\u65E5\u671F\u65F6\u95F4\uFF1A${t} \u4E3A\u683C\u5F0F\uFF1A${e}\uFF0C\u7ED3\u679C\uFF1A${r}`),{content:[{type:"text",text:JSON.stringify({success:!0,result:r,original:t,format:e})}]}}catch(s){return i.error(`\u683C\u5F0F\u5316\u65E5\u671F\u65F6\u95F4\u9519\u8BEF\uFF1A${a(s)}`),{content:[{type:"text",text:JSON.stringify({success:!1,error:a(s)})}],isError:!0}}});c.tool("add_time","\u5728\u7ED9\u5B9A\u7684\u65E5\u671F\u65F6\u95F4\u57FA\u7840\u4E0A\u589E\u52A0\u6216\u51CF\u5C11\u65F6\u95F4",{datetime:o.string().describe("\u57FA\u51C6\u65E5\u671F\u65F6\u95F4\u5B57\u7B26\u4E32\u6216\u65F6\u95F4\u6233"),amount:o.number().describe("\u8981\u589E\u52A0\uFF08\u6B63\u6570\uFF09\u6216\u51CF\u5C11\uFF08\u8D1F\u6570\uFF09\u7684\u6570\u91CF"),unit:o.string().describe("\u65F6\u95F4\u5355\u4F4D\uFF1A'milliseconds'\u3001'seconds'\u3001'minutes'\u3001'hours'\u3001'days'\u3001'weeks'\u3001'months'\u3001'years'")},async({datetime:t,amount:e,unit:n})=>{try{let s;if(Number.isNaN(Number(t))?s=new Date(t):s=new Date(Number(t)),Number.isNaN(s.getTime()))throw new Error("\u65E0\u6548\u7684\u65E5\u671F\u65F6\u95F4\u683C\u5F0F");let r=new Date(s);switch(n.toLowerCase()){case"milliseconds":r.setTime(r.getTime()+e);break;case"seconds":r.setTime(r.getTime()+e*1e3);break;case"minutes":r.setTime(r.getTime()+e*60*1e3);break;case"hours":r.setTime(r.getTime()+e*60*60*1e3);break;case"days":r.setDate(r.getDate()+e);break;case"weeks":r.setDate(r.getDate()+e*7);break;case"months":r.setMonth(r.getMonth()+e);break;case"years":r.setFullYear(r.getFullYear()+e);break;default:throw new Error(`\u4E0D\u652F\u6301\u7684\u65F6\u95F4\u5355\u4F4D\uFF1A${n}`)}let g=r.toISOString();return i.info(`\u5728 ${t} \u57FA\u7840\u4E0A\u589E\u52A0 ${e} ${n}\uFF0C\u7ED3\u679C\uFF1A${g}`),{content:[{type:"text",text:JSON.stringify({success:!0,result:g,original:t,amount:e,unit:n})}]}}catch(s){return i.error(`\u65F6\u95F4\u52A0\u51CF\u9519\u8BEF\uFF1A${a(s)}`),{content:[{type:"text",text:JSON.stringify({success:!1,error:a(s)})}],isError:!0}}});async function u(){let t=new m;await c.connect(t),i.info("DateTime MCP \u670D\u52A1\u5DF2\u542F\u52A8")}u().catch(t=>{i.error(`\u542F\u52A8\u670D\u52A1\u5931\u8D25\uFF1A${a(t)}`),process.exit(1)});var b=c;export{b as default};
|
|
299
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * MCP DateTime Server\n * 提供日期时间功能的 MCP 服务\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\n\n// 日志工具\nconst logger = {\n info: (message: string) => {\n const timestamp = new Date().toISOString();\n console.error(`${timestamp} - DateTime - INFO - ${message}`);\n },\n error: (message: string) => {\n const timestamp = new Date().toISOString();\n console.error(`${timestamp} - DateTime - ERROR - ${message}`);\n },\n};\n\n// 创建 MCP 服务器实例\nconst server = new McpServer({\n name: \"@xiaozhi-client/datetime-mcp\",\n version: \"1.0.0\",\n});\n\n// 注册获取当前时间工具\nserver.tool(\n \"get_current_time\",\n \"获取当前时间,支持多种格式\",\n {\n format: z\n .string()\n .optional()\n .describe(\"时间格式:'iso'(默认)、'timestamp'、'locale'、'time-only'\"),\n },\n async ({ format = \"iso\" }) => {\n try {\n const now = new Date();\n let result: string | number;\n\n switch (format) {\n case \"timestamp\":\n result = now.getTime();\n break;\n case \"locale\":\n result = now.toLocaleString();\n break;\n case \"time-only\":\n result = now.toLocaleTimeString();\n break;\n case \"iso\":\n default:\n result = now.toISOString();\n break;\n }\n\n logger.info(`获取当前时间,格式:${format},结果:${result}`);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: true,\n result,\n format,\n }),\n },\n ],\n };\n } catch (error) {\n logger.error(`获取当前时间错误:${error.message}`);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: false,\n error: error.message,\n }),\n },\n ],\n isError: true,\n };\n }\n }\n);\n\n// 注册获取当前日期工具\nserver.tool(\n \"get_current_date\",\n \"获取当前日期,支持多种格式\",\n {\n format: z\n .string()\n .optional()\n .describe(\"日期格式:'iso'(默认)、'locale'、'date-only'、'yyyy-mm-dd'\"),\n },\n async ({ format = \"iso\" }) => {\n try {\n const now = new Date();\n let result: string;\n\n switch (format) {\n case \"locale\":\n result = now.toLocaleDateString();\n break;\n case \"date-only\":\n result = now.toDateString();\n break;\n case \"yyyy-mm-dd\":\n result = now.toISOString().split(\"T\")[0];\n break;\n case \"iso\":\n default:\n result = now.toISOString();\n break;\n }\n\n logger.info(`获取当前日期,格式:${format},结果:${result}`);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: true,\n result,\n format,\n }),\n },\n ],\n };\n } catch (error) {\n logger.error(`获取当前日期错误:${error.message}`);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: false,\n error: error.message,\n }),\n },\n ],\n isError: true,\n };\n }\n }\n);\n\n// 注册格式化日期时间工具\nserver.tool(\n \"format_datetime\",\n \"将给定的日期时间字符串或时间戳格式化为指定格式\",\n {\n datetime: z.string().describe(\"要格式化的日期时间字符串或时间戳\"),\n format: z\n .string()\n .optional()\n .describe(\"输出格式:'iso'、'locale'、'timestamp'、'yyyy-mm-dd'、'custom'\"),\n custom_format: z\n .string()\n .optional()\n .describe(\"自定义格式字符串(当 format 为 'custom' 时使用)\"),\n },\n async ({ datetime, format = \"iso\", custom_format }) => {\n try {\n let date: Date;\n\n // 尝试解析输入的日期时间\n if (!isNaN(Number(datetime))) {\n // 是时间戳\n date = new Date(Number(datetime));\n } else {\n // 是日期字符串\n date = new Date(datetime);\n }\n\n if (isNaN(date.getTime())) {\n throw new Error(\"无效的日期时间格式\");\n }\n\n let result: string | number;\n switch (format) {\n case \"timestamp\":\n result = date.getTime();\n break;\n case \"locale\":\n result = date.toLocaleString();\n break;\n case \"yyyy-mm-dd\":\n result = date.toISOString().split(\"T\")[0];\n break;\n case \"custom\":\n if (custom_format) {\n // 简单的自定义格式化\n result = custom_format\n .replace(\"YYYY\", String(date.getFullYear()))\n .replace(\"MM\", String(date.getMonth() + 1).padStart(2, \"0\"))\n .replace(\"DD\", String(date.getDate()).padStart(2, \"0\"))\n .replace(\"HH\", String(date.getHours()).padStart(2, \"0\"))\n .replace(\"mm\", String(date.getMinutes()).padStart(2, \"0\"))\n .replace(\"ss\", String(date.getSeconds()).padStart(2, \"0\"));\n } else {\n result = date.toISOString();\n }\n break;\n case \"iso\":\n default:\n result = date.toISOString();\n break;\n }\n\n logger.info(`格式化日期时间:${datetime} 为格式:${format},结果:${result}`);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: true,\n result,\n original: datetime,\n format,\n }),\n },\n ],\n };\n } catch (error) {\n logger.error(`格式化日期时间错误:${error.message}`);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: false,\n error: error.message,\n }),\n },\n ],\n isError: true,\n };\n }\n }\n);\n\n// 注册时间加减工具\nserver.tool(\n \"add_time\",\n \"在给定的日期时间基础上增加或减少时间\",\n {\n datetime: z.string().describe(\"基准日期时间字符串或时间戳\"),\n amount: z.number().describe(\"要增加(正数)或减少(负数)的数量\"),\n unit: z\n .string()\n .describe(\"时间单位:'milliseconds'、'seconds'、'minutes'、'hours'、'days'、'weeks'、'months'、'years'\"),\n },\n async ({ datetime, amount, unit }) => {\n try {\n let date: Date;\n\n // 尝试解析输入的日期时间\n if (!isNaN(Number(datetime))) {\n date = new Date(Number(datetime));\n } else {\n date = new Date(datetime);\n }\n\n if (isNaN(date.getTime())) {\n throw new Error(\"无效的日期时间格式\");\n }\n\n // 根据单位计算新日期\n const newDate = new Date(date);\n\n switch (unit.toLowerCase()) {\n case \"milliseconds\":\n newDate.setTime(newDate.getTime() + amount);\n break;\n case \"seconds\":\n newDate.setTime(newDate.getTime() + amount * 1000);\n break;\n case \"minutes\":\n newDate.setTime(newDate.getTime() + amount * 60 * 1000);\n break;\n case \"hours\":\n newDate.setTime(newDate.getTime() + amount * 60 * 60 * 1000);\n break;\n case \"days\":\n newDate.setDate(newDate.getDate() + amount);\n break;\n case \"weeks\":\n newDate.setDate(newDate.getDate() + amount * 7);\n break;\n case \"months\":\n newDate.setMonth(newDate.getMonth() + amount);\n break;\n case \"years\":\n newDate.setFullYear(newDate.getFullYear() + amount);\n break;\n default:\n throw new Error(`不支持的时间单位:${unit}`);\n }\n\n const result = newDate.toISOString();\n logger.info(`在 ${datetime} 基础上增加 ${amount} ${unit},结果:${result}`);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: true,\n result,\n original: datetime,\n amount,\n unit,\n }),\n },\n ],\n };\n } catch (error) {\n logger.error(`时间加减错误:${error.message}`);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: false,\n error: error.message,\n }),\n },\n ],\n isError: true,\n };\n }\n }\n);\n\n// 启动服务器\nasync function main() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info(\"DateTime MCP 服务已启动\");\n}\n\nmain().catch((error) => {\n logger.error(`启动服务失败:${error.message}`);\n process.exit(1);\n});\n\nexport default server;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * MCP DateTime Server\n * 提供日期时间功能的 MCP 服务\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\n\n// 日志工具\nconst logger = {\n info: (message: string) => {\n const timestamp = new Date().toISOString();\n console.error(`${timestamp} - DateTime - INFO - ${message}`);\n },\n error: (message: string) => {\n const timestamp = new Date().toISOString();\n console.error(`${timestamp} - DateTime - ERROR - ${message}`);\n },\n};\n\n// 安全获取错误信息\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n// 创建 MCP 服务器实例\nconst server = new McpServer({\n name: \"@xiaozhi-client/datetime-mcp\",\n version: \"1.0.0\",\n});\n\n// 注册获取当前时间工具\nserver.tool(\n \"get_current_time\",\n \"获取当前时间,支持多种格式\",\n {\n format: z\n .string()\n .optional()\n .describe(\"时间格式:'iso'(默认)、'timestamp'、'locale'、'time-only'\"),\n },\n async ({ format = \"iso\" }) => {\n try {\n const now = new Date();\n let result: string | number;\n\n switch (format) {\n case \"timestamp\":\n result = now.getTime();\n break;\n case \"locale\":\n result = now.toLocaleString();\n break;\n case \"time-only\":\n result = now.toLocaleTimeString();\n break;\n default:\n result = now.toISOString();\n break;\n }\n\n logger.info(`获取当前时间,格式:${format},结果:${result}`);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: true,\n result,\n format,\n }),\n },\n ],\n };\n } catch (error) {\n logger.error(`获取当前时间错误:${getErrorMessage(error)}`);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: false,\n error: getErrorMessage(error),\n }),\n },\n ],\n isError: true,\n };\n }\n }\n);\n\n// 注册获取当前日期工具\nserver.tool(\n \"get_current_date\",\n \"获取当前日期,支持多种格式\",\n {\n format: z\n .string()\n .optional()\n .describe(\"日期格式:'iso'(默认)、'locale'、'date-only'、'yyyy-mm-dd'\"),\n },\n async ({ format = \"iso\" }) => {\n try {\n const now = new Date();\n let result: string;\n\n switch (format) {\n case \"locale\":\n result = now.toLocaleDateString();\n break;\n case \"date-only\":\n result = now.toDateString();\n break;\n case \"yyyy-mm-dd\":\n result = now.toISOString().split(\"T\")[0];\n break;\n default:\n result = now.toISOString();\n break;\n }\n\n logger.info(`获取当前日期,格式:${format},结果:${result}`);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: true,\n result,\n format,\n }),\n },\n ],\n };\n } catch (error) {\n logger.error(`获取当前日期错误:${getErrorMessage(error)}`);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: false,\n error: getErrorMessage(error),\n }),\n },\n ],\n isError: true,\n };\n }\n }\n);\n\n// 注册格式化日期时间工具\nserver.tool(\n \"format_datetime\",\n \"将给定的日期时间字符串或时间戳格式化为指定格式\",\n {\n datetime: z.string().describe(\"要格式化的日期时间字符串或时间戳\"),\n format: z\n .string()\n .optional()\n .describe(\n \"输出格式:'iso'、'locale'、'timestamp'、'yyyy-mm-dd'、'custom'\"\n ),\n custom_format: z\n .string()\n .optional()\n .describe(\"自定义格式字符串(当 format 为 'custom' 时使用)\"),\n },\n async ({ datetime, format = \"iso\", custom_format }) => {\n try {\n let date: Date;\n\n // 尝试解析输入的日期时间\n if (!Number.isNaN(Number(datetime))) {\n // 是时间戳\n date = new Date(Number(datetime));\n } else {\n // 是日期字符串\n date = new Date(datetime);\n }\n\n if (Number.isNaN(date.getTime())) {\n throw new Error(\"无效的日期时间格式\");\n }\n\n let result: string | number;\n switch (format) {\n case \"timestamp\":\n result = date.getTime();\n break;\n case \"locale\":\n result = date.toLocaleString();\n break;\n case \"yyyy-mm-dd\":\n result = date.toISOString().split(\"T\")[0];\n break;\n case \"custom\":\n if (custom_format) {\n // 简单的自定义格式化\n result = custom_format\n .replace(\"YYYY\", String(date.getFullYear()))\n .replace(\"MM\", String(date.getMonth() + 1).padStart(2, \"0\"))\n .replace(\"DD\", String(date.getDate()).padStart(2, \"0\"))\n .replace(\"HH\", String(date.getHours()).padStart(2, \"0\"))\n .replace(\"mm\", String(date.getMinutes()).padStart(2, \"0\"))\n .replace(\"ss\", String(date.getSeconds()).padStart(2, \"0\"));\n } else {\n result = date.toISOString();\n }\n break;\n default:\n result = date.toISOString();\n break;\n }\n\n logger.info(\n `格式化日期时间:${datetime} 为格式:${format},结果:${result}`\n );\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: true,\n result,\n original: datetime,\n format,\n }),\n },\n ],\n };\n } catch (error) {\n logger.error(`格式化日期时间错误:${getErrorMessage(error)}`);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: false,\n error: getErrorMessage(error),\n }),\n },\n ],\n isError: true,\n };\n }\n }\n);\n\n// 注册时间加减工具\nserver.tool(\n \"add_time\",\n \"在给定的日期时间基础上增加或减少时间\",\n {\n datetime: z.string().describe(\"基准日期时间字符串或时间戳\"),\n amount: z.number().describe(\"要增加(正数)或减少(负数)的数量\"),\n unit: z\n .string()\n .describe(\n \"时间单位:'milliseconds'、'seconds'、'minutes'、'hours'、'days'、'weeks'、'months'、'years'\"\n ),\n },\n async ({ datetime, amount, unit }) => {\n try {\n let date: Date;\n\n // 尝试解析输入的日期时间\n if (!Number.isNaN(Number(datetime))) {\n date = new Date(Number(datetime));\n } else {\n date = new Date(datetime);\n }\n\n if (Number.isNaN(date.getTime())) {\n throw new Error(\"无效的日期时间格式\");\n }\n\n // 根据单位计算新日期\n const newDate = new Date(date);\n\n switch (unit.toLowerCase()) {\n case \"milliseconds\":\n newDate.setTime(newDate.getTime() + amount);\n break;\n case \"seconds\":\n newDate.setTime(newDate.getTime() + amount * 1000);\n break;\n case \"minutes\":\n newDate.setTime(newDate.getTime() + amount * 60 * 1000);\n break;\n case \"hours\":\n newDate.setTime(newDate.getTime() + amount * 60 * 60 * 1000);\n break;\n case \"days\":\n newDate.setDate(newDate.getDate() + amount);\n break;\n case \"weeks\":\n newDate.setDate(newDate.getDate() + amount * 7);\n break;\n case \"months\":\n newDate.setMonth(newDate.getMonth() + amount);\n break;\n case \"years\":\n newDate.setFullYear(newDate.getFullYear() + amount);\n break;\n default:\n throw new Error(`不支持的时间单位:${unit}`);\n }\n\n const result = newDate.toISOString();\n logger.info(\n `在 ${datetime} 基础上增加 ${amount} ${unit},结果:${result}`\n );\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: true,\n result,\n original: datetime,\n amount,\n unit,\n }),\n },\n ],\n };\n } catch (error) {\n logger.error(`时间加减错误:${getErrorMessage(error)}`);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: false,\n error: getErrorMessage(error),\n }),\n },\n ],\n isError: true,\n };\n }\n }\n);\n\n// 启动服务器\nasync function main() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info(\"DateTime MCP 服务已启动\");\n}\n\nmain().catch((error) => {\n logger.error(`启动服务失败:${getErrorMessage(error)}`);\n process.exit(1);\n});\n\nexport default server;\n"],"mappings":"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","names":["McpServer","StdioServerTransport","z","logger","message","timestamp","getErrorMessage","error","server","format","now","result","datetime","custom_format","date","amount","unit","newDate","main","transport","src_default"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xiaozhi-client/datetime-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.7-beta.13",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "小智日期时间 MCP 服务,提供日期时间处理功能",
|
|
6
6
|
"bin": {
|
|
7
7
|
"xiaozhi-datetime-mcp": "dist/index.js"
|
|
8
8
|
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/shenjingnan/xiaozhi-client.git",
|
|
12
|
+
"directory": "packages/shared-types"
|
|
13
|
+
},
|
|
9
14
|
"files": [
|
|
10
15
|
"dist",
|
|
11
16
|
"README.md"
|