@node2flow/google-calendar-mcp 1.0.2 → 1.0.3
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.d.ts +1 -34
- package/dist/index.d.ts.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +139 -159
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
- package/src/server.ts +171 -191
package/dist/index.d.ts
CHANGED
|
@@ -16,38 +16,5 @@ export default function createSmitheryServer(opts?: {
|
|
|
16
16
|
GOOGLE_CLIENT_SECRET?: string;
|
|
17
17
|
GOOGLE_REFRESH_TOKEN?: string;
|
|
18
18
|
};
|
|
19
|
-
}): import("@modelcontextprotocol/sdk/server").
|
|
20
|
-
method: string;
|
|
21
|
-
params?: {
|
|
22
|
-
[x: string]: unknown;
|
|
23
|
-
_meta?: {
|
|
24
|
-
[x: string]: unknown;
|
|
25
|
-
progressToken?: string | number | undefined;
|
|
26
|
-
"io.modelcontextprotocol/related-task"?: {
|
|
27
|
-
taskId: string;
|
|
28
|
-
} | undefined;
|
|
29
|
-
} | undefined;
|
|
30
|
-
} | undefined;
|
|
31
|
-
}, {
|
|
32
|
-
method: string;
|
|
33
|
-
params?: {
|
|
34
|
-
[x: string]: unknown;
|
|
35
|
-
_meta?: {
|
|
36
|
-
[x: string]: unknown;
|
|
37
|
-
progressToken?: string | number | undefined;
|
|
38
|
-
"io.modelcontextprotocol/related-task"?: {
|
|
39
|
-
taskId: string;
|
|
40
|
-
} | undefined;
|
|
41
|
-
} | undefined;
|
|
42
|
-
} | undefined;
|
|
43
|
-
}, {
|
|
44
|
-
[x: string]: unknown;
|
|
45
|
-
_meta?: {
|
|
46
|
-
[x: string]: unknown;
|
|
47
|
-
progressToken?: string | number | undefined;
|
|
48
|
-
"io.modelcontextprotocol/related-task"?: {
|
|
49
|
-
taskId: string;
|
|
50
|
-
} | undefined;
|
|
51
|
-
} | undefined;
|
|
52
|
-
}>;
|
|
19
|
+
}): import("@modelcontextprotocol/sdk/server/mcp.js").McpServer;
|
|
53
20
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AA2JH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAClD,MAAM,CAAC,EAAE;QACP,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;CACH
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AA2JH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAClD,MAAM,CAAC,EAAE;QACP,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;CACH,+DAMA"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared MCP Server — used by both Node.js (index.ts) and CF Worker (worker.ts)
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
5
|
import { CalendarClient } from './calendar-client.js';
|
|
6
6
|
export interface CalendarMcpConfig {
|
|
7
7
|
clientId: string;
|
|
@@ -9,5 +9,5 @@ export interface CalendarMcpConfig {
|
|
|
9
9
|
refreshToken: string;
|
|
10
10
|
}
|
|
11
11
|
export declare function handleToolCall(toolName: string, args: Record<string, unknown>, client: CalendarClient): Promise<import("./types.js").EventList> | Promise<import("./types.js").Event> | Promise<void> | Promise<import("./types.js").CalendarListList> | Promise<import("./types.js").Calendar> | Promise<import("./types.js").AclList> | Promise<import("./types.js").AclRule> | Promise<import("./types.js").FreeBusyResponse> | Promise<import("./types.js").Colors> | Promise<import("./types.js").SettingsList>;
|
|
12
|
-
export declare function createServer(config?: CalendarMcpConfig):
|
|
12
|
+
export declare function createServer(config?: CalendarMcpConfig): McpServer;
|
|
13
13
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,cAAc,gZAiPvB;AAED,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,iBAAiB,aA4LtD"}
|
package/dist/server.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared MCP Server — used by both Node.js (index.ts) and CF Worker (worker.ts)
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
import { ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
6
6
|
import { CalendarClient } from './calendar-client.js';
|
|
7
7
|
import { TOOLS } from './tools.js';
|
|
8
8
|
export function handleToolCall(toolName, args, client) {
|
|
@@ -242,30 +242,23 @@ export function handleToolCall(toolName, args, client) {
|
|
|
242
242
|
}
|
|
243
243
|
}
|
|
244
244
|
export function createServer(config) {
|
|
245
|
-
const server = new
|
|
245
|
+
const server = new McpServer({
|
|
246
|
+
name: 'google-calendar-mcp',
|
|
247
|
+
version: '1.0.0',
|
|
248
|
+
});
|
|
246
249
|
let client = null;
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
description: tool.description,
|
|
254
|
-
...(hasProperties ? { inputSchema: tool.inputSchema } : {}),
|
|
255
|
-
annotations: tool.annotations,
|
|
256
|
-
};
|
|
257
|
-
}),
|
|
258
|
-
}));
|
|
259
|
-
// Handle tool calls
|
|
260
|
-
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
261
|
-
const { name, arguments: args } = request.params;
|
|
262
|
-
try {
|
|
250
|
+
for (const tool of TOOLS) {
|
|
251
|
+
server.registerTool(tool.name, {
|
|
252
|
+
description: tool.description,
|
|
253
|
+
inputSchema: tool.inputSchema,
|
|
254
|
+
annotations: tool.annotations,
|
|
255
|
+
}, async (args) => {
|
|
263
256
|
const clientId = config?.clientId ||
|
|
264
|
-
args
|
|
257
|
+
args.GOOGLE_CLIENT_ID;
|
|
265
258
|
const clientSecret = config?.clientSecret ||
|
|
266
|
-
args
|
|
259
|
+
args.GOOGLE_CLIENT_SECRET;
|
|
267
260
|
const refreshToken = config?.refreshToken ||
|
|
268
|
-
args
|
|
261
|
+
args.GOOGLE_REFRESH_TOKEN;
|
|
269
262
|
if (!clientId || !clientSecret || !refreshToken) {
|
|
270
263
|
return {
|
|
271
264
|
content: [{ type: 'text', text: 'Error: GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, and GOOGLE_REFRESH_TOKEN are all required.' }],
|
|
@@ -275,150 +268,137 @@ export function createServer(config) {
|
|
|
275
268
|
if (!client || config?.clientId !== clientId) {
|
|
276
269
|
client = new CalendarClient({ clientId, clientSecret, refreshToken });
|
|
277
270
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
271
|
+
try {
|
|
272
|
+
const result = await handleToolCall(tool.name, args, client);
|
|
273
|
+
const text = result === undefined ? '{"success": true}' : JSON.stringify(result, null, 2);
|
|
274
|
+
return {
|
|
275
|
+
content: [{ type: 'text', text }],
|
|
276
|
+
isError: false,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
return {
|
|
281
|
+
content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
282
|
+
isError: true,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
// Register prompts
|
|
288
|
+
server.prompt('schedule-and-manage', 'Guide for creating events, recurring schedules, attendees, and reminders', async () => ({
|
|
289
|
+
messages: [{
|
|
290
|
+
role: 'user',
|
|
291
|
+
content: {
|
|
292
|
+
type: 'text',
|
|
293
|
+
text: [
|
|
294
|
+
'You are a Google Calendar scheduling assistant.',
|
|
295
|
+
'',
|
|
296
|
+
'Creating events:',
|
|
297
|
+
'1. **Timed event** — gcal_create_event with start_date_time + end_date_time (RFC 3339)',
|
|
298
|
+
'2. **All-day event** — Use start_date + end_date (YYYY-MM-DD). Single day: start=15, end=16',
|
|
299
|
+
'3. **Quick add** — gcal_quick_add with natural language ("Meeting tomorrow 3pm")',
|
|
300
|
+
'4. **Attendees** — Pass email addresses array, set send_updates="all" to notify',
|
|
301
|
+
'',
|
|
302
|
+
'Recurring events:',
|
|
303
|
+
'1. **Daily** — recurrence: ["RRULE:FREQ=DAILY"]',
|
|
304
|
+
'2. **Weekly** — recurrence: ["RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR"]',
|
|
305
|
+
'3. **Monthly** — recurrence: ["RRULE:FREQ=MONTHLY;BYMONTHDAY=15"]',
|
|
306
|
+
'4. **Until date** — Add ;UNTIL=20261231T235959Z',
|
|
307
|
+
'5. **Count** — Add ;COUNT=10 for 10 occurrences',
|
|
308
|
+
'6. **Exceptions** — Add EXDATE entries to skip dates',
|
|
309
|
+
'7. **View instances** — gcal_list_instances to see individual occurrences',
|
|
310
|
+
'',
|
|
311
|
+
'Reminders:',
|
|
312
|
+
'- Default reminders: { "useDefault": true }',
|
|
313
|
+
'- Custom: { "useDefault": false, "overrides": [{ "method": "popup", "minutes": 10 }, { "method": "email", "minutes": 60 }] }',
|
|
314
|
+
'',
|
|
315
|
+
'Tips:',
|
|
316
|
+
'- Use "primary" as calendar_id for the main calendar',
|
|
317
|
+
'- Set transparency="transparent" for events that don\'t block time',
|
|
318
|
+
'- Use gcal_patch_event to change only specific fields without affecting others',
|
|
319
|
+
'- Use gcal_move_event to transfer events between calendars',
|
|
320
|
+
].join('\n'),
|
|
321
|
+
},
|
|
322
|
+
}],
|
|
298
323
|
}));
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
'You are a Google Calendar organization assistant.',
|
|
348
|
-
'',
|
|
349
|
-
'Searching events:',
|
|
350
|
-
'- **By text** — q parameter searches summary, description, location, attendees',
|
|
351
|
-
'- **By time** — time_min + time_max (RFC 3339) to filter date range',
|
|
352
|
-
'- **Expand recurring** — single_events=true to see individual instances',
|
|
353
|
-
'- **Sort** — order_by="startTime" (requires singleEvents) or "updated"',
|
|
354
|
-
'- **Pagination** — Use max_results + page_token for large result sets',
|
|
355
|
-
'',
|
|
356
|
-
'Managing calendars:',
|
|
357
|
-
'1. **List all** — gcal_list_calendars to see subscribed calendars',
|
|
358
|
-
'2. **Create** — gcal_create_calendar for a new secondary calendar',
|
|
359
|
-
'3. **Customize** — gcal_update_calendar_entry for display color, name override',
|
|
360
|
-
'4. **Subscribe** — gcal_add_calendar to add a shared calendar',
|
|
361
|
-
'5. **Unsubscribe** — gcal_remove_calendar (doesn\'t delete the calendar)',
|
|
362
|
-
'',
|
|
363
|
-
'Sharing calendars (ACL):',
|
|
364
|
-
'- **freeBusyReader** — Can only see free/busy',
|
|
365
|
-
'- **reader** — Can see event details',
|
|
366
|
-
'- **writer** — Can create and edit events',
|
|
367
|
-
'- **owner** — Full control including sharing',
|
|
368
|
-
'- scope_type: "user" (email), "group" (group email), "domain", or "default" (public)',
|
|
369
|
-
'',
|
|
370
|
-
'Checking availability:',
|
|
371
|
-
'- gcal_query_freebusy with time range and calendar IDs',
|
|
372
|
-
'- Returns busy time blocks for each calendar',
|
|
373
|
-
'- Use to find free slots for scheduling meetings',
|
|
374
|
-
'',
|
|
375
|
-
'Colors:',
|
|
376
|
-
'- gcal_get_colors for color palette (IDs 1-24 for calendars, 1-11 for events)',
|
|
377
|
-
'- Apply to events: color_id in gcal_create_event',
|
|
378
|
-
'- Apply to calendars: color_id in gcal_update_calendar_entry',
|
|
379
|
-
].join('\n'),
|
|
380
|
-
},
|
|
381
|
-
}],
|
|
382
|
-
};
|
|
383
|
-
}
|
|
384
|
-
throw new Error(`Unknown prompt: ${name}`);
|
|
385
|
-
});
|
|
386
|
-
// List resources
|
|
387
|
-
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
388
|
-
resources: [{
|
|
324
|
+
server.prompt('search-and-organize', 'Guide for searching events, managing calendars, sharing, and checking availability', async () => ({
|
|
325
|
+
messages: [{
|
|
326
|
+
role: 'user',
|
|
327
|
+
content: {
|
|
328
|
+
type: 'text',
|
|
329
|
+
text: [
|
|
330
|
+
'You are a Google Calendar organization assistant.',
|
|
331
|
+
'',
|
|
332
|
+
'Searching events:',
|
|
333
|
+
'- **By text** — q parameter searches summary, description, location, attendees',
|
|
334
|
+
'- **By time** — time_min + time_max (RFC 3339) to filter date range',
|
|
335
|
+
'- **Expand recurring** — single_events=true to see individual instances',
|
|
336
|
+
'- **Sort** — order_by="startTime" (requires singleEvents) or "updated"',
|
|
337
|
+
'- **Pagination** — Use max_results + page_token for large result sets',
|
|
338
|
+
'',
|
|
339
|
+
'Managing calendars:',
|
|
340
|
+
'1. **List all** — gcal_list_calendars to see subscribed calendars',
|
|
341
|
+
'2. **Create** — gcal_create_calendar for a new secondary calendar',
|
|
342
|
+
'3. **Customize** — gcal_update_calendar_entry for display color, name override',
|
|
343
|
+
'4. **Subscribe** — gcal_add_calendar to add a shared calendar',
|
|
344
|
+
'5. **Unsubscribe** — gcal_remove_calendar (doesn\'t delete the calendar)',
|
|
345
|
+
'',
|
|
346
|
+
'Sharing calendars (ACL):',
|
|
347
|
+
'- **freeBusyReader** — Can only see free/busy',
|
|
348
|
+
'- **reader** — Can see event details',
|
|
349
|
+
'- **writer** — Can create and edit events',
|
|
350
|
+
'- **owner** — Full control including sharing',
|
|
351
|
+
'- scope_type: "user" (email), "group" (group email), "domain", or "default" (public)',
|
|
352
|
+
'',
|
|
353
|
+
'Checking availability:',
|
|
354
|
+
'- gcal_query_freebusy with time range and calendar IDs',
|
|
355
|
+
'- Returns busy time blocks for each calendar',
|
|
356
|
+
'- Use to find free slots for scheduling meetings',
|
|
357
|
+
'',
|
|
358
|
+
'Colors:',
|
|
359
|
+
'- gcal_get_colors for color palette (IDs 1-24 for calendars, 1-11 for events)',
|
|
360
|
+
'- Apply to events: color_id in gcal_create_event',
|
|
361
|
+
'- Apply to calendars: color_id in gcal_update_calendar_entry',
|
|
362
|
+
].join('\n'),
|
|
363
|
+
},
|
|
364
|
+
}],
|
|
365
|
+
}));
|
|
366
|
+
// Register resource
|
|
367
|
+
server.resource('server-info', 'gcal://server-info', {
|
|
368
|
+
description: 'Connection status and available tools for this Google Calendar MCP server',
|
|
369
|
+
mimeType: 'application/json',
|
|
370
|
+
}, async () => ({
|
|
371
|
+
contents: [{
|
|
389
372
|
uri: 'gcal://server-info',
|
|
390
|
-
name: 'server-info',
|
|
391
|
-
description: 'Connection status and available tools for this Google Calendar MCP server',
|
|
392
373
|
mimeType: 'application/json',
|
|
374
|
+
text: JSON.stringify({
|
|
375
|
+
name: 'google-calendar-mcp',
|
|
376
|
+
version: '1.0.0',
|
|
377
|
+
connected: !!config,
|
|
378
|
+
has_oauth: !!(config?.clientId),
|
|
379
|
+
tools_available: TOOLS.length,
|
|
380
|
+
tool_categories: {
|
|
381
|
+
events: 10,
|
|
382
|
+
calendar_list: 5,
|
|
383
|
+
calendars: 5,
|
|
384
|
+
acl: 5,
|
|
385
|
+
utility: 3,
|
|
386
|
+
},
|
|
387
|
+
}, null, 2),
|
|
393
388
|
}],
|
|
394
389
|
}));
|
|
395
|
-
//
|
|
396
|
-
server.setRequestHandler(
|
|
397
|
-
|
|
398
|
-
|
|
390
|
+
// Override tools/list handler to return raw JSON Schema with property descriptions
|
|
391
|
+
server.server.setRequestHandler(ListToolsRequestSchema, () => ({
|
|
392
|
+
tools: TOOLS.map(tool => {
|
|
393
|
+
const hasProperties = Object.keys(tool.inputSchema.properties).length > 0;
|
|
399
394
|
return {
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
name: 'google-calendar-mcp',
|
|
405
|
-
version: '1.0.0',
|
|
406
|
-
connected: !!config,
|
|
407
|
-
has_oauth: !!(config?.clientId),
|
|
408
|
-
tools_available: TOOLS.length,
|
|
409
|
-
tool_categories: {
|
|
410
|
-
events: 10,
|
|
411
|
-
calendar_list: 5,
|
|
412
|
-
calendars: 5,
|
|
413
|
-
acl: 5,
|
|
414
|
-
utility: 3,
|
|
415
|
-
},
|
|
416
|
-
}, null, 2),
|
|
417
|
-
}],
|
|
395
|
+
name: tool.name,
|
|
396
|
+
description: tool.description,
|
|
397
|
+
...(hasProperties ? { inputSchema: tool.inputSchema } : {}),
|
|
398
|
+
annotations: tool.annotations,
|
|
418
399
|
};
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
});
|
|
400
|
+
}),
|
|
401
|
+
}));
|
|
422
402
|
return server;
|
|
423
403
|
}
|
|
424
404
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@node2flow/google-calendar-mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "MCP server for Google Calendar — create events, manage calendars, check availability, and share calendars through 28 tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
package/src/server.ts
CHANGED
|
@@ -2,15 +2,8 @@
|
|
|
2
2
|
* Shared MCP Server — used by both Node.js (index.ts) and CF Worker (worker.ts)
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
CallToolRequestSchema,
|
|
8
|
-
ListToolsRequestSchema,
|
|
9
|
-
ListPromptsRequestSchema,
|
|
10
|
-
GetPromptRequestSchema,
|
|
11
|
-
ListResourcesRequestSchema,
|
|
12
|
-
ReadResourceRequestSchema,
|
|
13
|
-
} from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
+
import { ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
14
7
|
import { CalendarClient } from './calendar-client.js';
|
|
15
8
|
import { TOOLS } from './tools.js';
|
|
16
9
|
|
|
@@ -266,205 +259,192 @@ export function handleToolCall(
|
|
|
266
259
|
}
|
|
267
260
|
}
|
|
268
261
|
|
|
269
|
-
export function createServer(config?: CalendarMcpConfig)
|
|
270
|
-
const server = new
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
);
|
|
262
|
+
export function createServer(config?: CalendarMcpConfig) {
|
|
263
|
+
const server = new McpServer({
|
|
264
|
+
name: 'google-calendar-mcp',
|
|
265
|
+
version: '1.0.0',
|
|
266
|
+
});
|
|
274
267
|
|
|
275
268
|
let client: CalendarClient | null = null;
|
|
276
269
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
return {
|
|
282
|
-
name: tool.name,
|
|
270
|
+
for (const tool of TOOLS) {
|
|
271
|
+
server.registerTool(
|
|
272
|
+
tool.name,
|
|
273
|
+
{
|
|
283
274
|
description: tool.description,
|
|
284
|
-
|
|
275
|
+
inputSchema: tool.inputSchema as any,
|
|
285
276
|
annotations: tool.annotations,
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
|
|
277
|
+
},
|
|
278
|
+
async (args: Record<string, unknown>) => {
|
|
279
|
+
const clientId =
|
|
280
|
+
config?.clientId ||
|
|
281
|
+
(args as Record<string, unknown>).GOOGLE_CLIENT_ID as string;
|
|
282
|
+
const clientSecret =
|
|
283
|
+
config?.clientSecret ||
|
|
284
|
+
(args as Record<string, unknown>).GOOGLE_CLIENT_SECRET as string;
|
|
285
|
+
const refreshToken =
|
|
286
|
+
config?.refreshToken ||
|
|
287
|
+
(args as Record<string, unknown>).GOOGLE_REFRESH_TOKEN as string;
|
|
289
288
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
289
|
+
if (!clientId || !clientSecret || !refreshToken) {
|
|
290
|
+
return {
|
|
291
|
+
content: [{ type: 'text' as const, text: 'Error: GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, and GOOGLE_REFRESH_TOKEN are all required.' }],
|
|
292
|
+
isError: true,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
293
295
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
(args as Record<string, unknown>)?.GOOGLE_CLIENT_ID as string;
|
|
298
|
-
const clientSecret =
|
|
299
|
-
config?.clientSecret ||
|
|
300
|
-
(args as Record<string, unknown>)?.GOOGLE_CLIENT_SECRET as string;
|
|
301
|
-
const refreshToken =
|
|
302
|
-
config?.refreshToken ||
|
|
303
|
-
(args as Record<string, unknown>)?.GOOGLE_REFRESH_TOKEN as string;
|
|
296
|
+
if (!client || config?.clientId !== clientId) {
|
|
297
|
+
client = new CalendarClient({ clientId, clientSecret, refreshToken });
|
|
298
|
+
}
|
|
304
299
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
300
|
+
try {
|
|
301
|
+
const result = await handleToolCall(tool.name, args, client);
|
|
302
|
+
const text = result === undefined ? '{"success": true}' : JSON.stringify(result, null, 2);
|
|
303
|
+
return {
|
|
304
|
+
content: [{ type: 'text' as const, text }],
|
|
305
|
+
isError: false,
|
|
306
|
+
};
|
|
307
|
+
} catch (error) {
|
|
308
|
+
return {
|
|
309
|
+
content: [{ type: 'text' as const, text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
310
|
+
isError: true,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
310
313
|
}
|
|
314
|
+
);
|
|
315
|
+
}
|
|
311
316
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
content:
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
'2. **All-day event** — Use start_date + end_date (YYYY-MM-DD). Single day: start=15, end=16',
|
|
354
|
-
'3. **Quick add** — gcal_quick_add with natural language ("Meeting tomorrow 3pm")',
|
|
355
|
-
'4. **Attendees** — Pass email addresses array, set send_updates="all" to notify',
|
|
356
|
-
'',
|
|
357
|
-
'Recurring events:',
|
|
358
|
-
'1. **Daily** — recurrence: ["RRULE:FREQ=DAILY"]',
|
|
359
|
-
'2. **Weekly** — recurrence: ["RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR"]',
|
|
360
|
-
'3. **Monthly** — recurrence: ["RRULE:FREQ=MONTHLY;BYMONTHDAY=15"]',
|
|
361
|
-
'4. **Until date** — Add ;UNTIL=20261231T235959Z',
|
|
362
|
-
'5. **Count** — Add ;COUNT=10 for 10 occurrences',
|
|
363
|
-
'6. **Exceptions** — Add EXDATE entries to skip dates',
|
|
364
|
-
'7. **View instances** — gcal_list_instances to see individual occurrences',
|
|
365
|
-
'',
|
|
366
|
-
'Reminders:',
|
|
367
|
-
'- Default reminders: { "useDefault": true }',
|
|
368
|
-
'- Custom: { "useDefault": false, "overrides": [{ "method": "popup", "minutes": 10 }, { "method": "email", "minutes": 60 }] }',
|
|
369
|
-
'',
|
|
370
|
-
'Tips:',
|
|
371
|
-
'- Use "primary" as calendar_id for the main calendar',
|
|
372
|
-
'- Set transparency="transparent" for events that don\'t block time',
|
|
373
|
-
'- Use gcal_patch_event to change only specific fields without affecting others',
|
|
374
|
-
'- Use gcal_move_event to transfer events between calendars',
|
|
375
|
-
].join('\n'),
|
|
376
|
-
},
|
|
377
|
-
}],
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
if (name === 'search-and-organize') {
|
|
382
|
-
return {
|
|
383
|
-
messages: [{
|
|
384
|
-
role: 'user' as const,
|
|
385
|
-
content: {
|
|
386
|
-
type: 'text' as const,
|
|
387
|
-
text: [
|
|
388
|
-
'You are a Google Calendar organization assistant.',
|
|
389
|
-
'',
|
|
390
|
-
'Searching events:',
|
|
391
|
-
'- **By text** — q parameter searches summary, description, location, attendees',
|
|
392
|
-
'- **By time** — time_min + time_max (RFC 3339) to filter date range',
|
|
393
|
-
'- **Expand recurring** — single_events=true to see individual instances',
|
|
394
|
-
'- **Sort** — order_by="startTime" (requires singleEvents) or "updated"',
|
|
395
|
-
'- **Pagination** — Use max_results + page_token for large result sets',
|
|
396
|
-
'',
|
|
397
|
-
'Managing calendars:',
|
|
398
|
-
'1. **List all** — gcal_list_calendars to see subscribed calendars',
|
|
399
|
-
'2. **Create** — gcal_create_calendar for a new secondary calendar',
|
|
400
|
-
'3. **Customize** — gcal_update_calendar_entry for display color, name override',
|
|
401
|
-
'4. **Subscribe** — gcal_add_calendar to add a shared calendar',
|
|
402
|
-
'5. **Unsubscribe** — gcal_remove_calendar (doesn\'t delete the calendar)',
|
|
403
|
-
'',
|
|
404
|
-
'Sharing calendars (ACL):',
|
|
405
|
-
'- **freeBusyReader** — Can only see free/busy',
|
|
406
|
-
'- **reader** — Can see event details',
|
|
407
|
-
'- **writer** — Can create and edit events',
|
|
408
|
-
'- **owner** — Full control including sharing',
|
|
409
|
-
'- scope_type: "user" (email), "group" (group email), "domain", or "default" (public)',
|
|
410
|
-
'',
|
|
411
|
-
'Checking availability:',
|
|
412
|
-
'- gcal_query_freebusy with time range and calendar IDs',
|
|
413
|
-
'- Returns busy time blocks for each calendar',
|
|
414
|
-
'- Use to find free slots for scheduling meetings',
|
|
415
|
-
'',
|
|
416
|
-
'Colors:',
|
|
417
|
-
'- gcal_get_colors for color palette (IDs 1-24 for calendars, 1-11 for events)',
|
|
418
|
-
'- Apply to events: color_id in gcal_create_event',
|
|
419
|
-
'- Apply to calendars: color_id in gcal_update_calendar_entry',
|
|
420
|
-
].join('\n'),
|
|
421
|
-
},
|
|
422
|
-
}],
|
|
423
|
-
};
|
|
424
|
-
}
|
|
317
|
+
// Register prompts
|
|
318
|
+
server.prompt(
|
|
319
|
+
'schedule-and-manage',
|
|
320
|
+
'Guide for creating events, recurring schedules, attendees, and reminders',
|
|
321
|
+
async () => ({
|
|
322
|
+
messages: [{
|
|
323
|
+
role: 'user' as const,
|
|
324
|
+
content: {
|
|
325
|
+
type: 'text' as const,
|
|
326
|
+
text: [
|
|
327
|
+
'You are a Google Calendar scheduling assistant.',
|
|
328
|
+
'',
|
|
329
|
+
'Creating events:',
|
|
330
|
+
'1. **Timed event** — gcal_create_event with start_date_time + end_date_time (RFC 3339)',
|
|
331
|
+
'2. **All-day event** — Use start_date + end_date (YYYY-MM-DD). Single day: start=15, end=16',
|
|
332
|
+
'3. **Quick add** — gcal_quick_add with natural language ("Meeting tomorrow 3pm")',
|
|
333
|
+
'4. **Attendees** — Pass email addresses array, set send_updates="all" to notify',
|
|
334
|
+
'',
|
|
335
|
+
'Recurring events:',
|
|
336
|
+
'1. **Daily** — recurrence: ["RRULE:FREQ=DAILY"]',
|
|
337
|
+
'2. **Weekly** — recurrence: ["RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR"]',
|
|
338
|
+
'3. **Monthly** — recurrence: ["RRULE:FREQ=MONTHLY;BYMONTHDAY=15"]',
|
|
339
|
+
'4. **Until date** — Add ;UNTIL=20261231T235959Z',
|
|
340
|
+
'5. **Count** — Add ;COUNT=10 for 10 occurrences',
|
|
341
|
+
'6. **Exceptions** — Add EXDATE entries to skip dates',
|
|
342
|
+
'7. **View instances** — gcal_list_instances to see individual occurrences',
|
|
343
|
+
'',
|
|
344
|
+
'Reminders:',
|
|
345
|
+
'- Default reminders: { "useDefault": true }',
|
|
346
|
+
'- Custom: { "useDefault": false, "overrides": [{ "method": "popup", "minutes": 10 }, { "method": "email", "minutes": 60 }] }',
|
|
347
|
+
'',
|
|
348
|
+
'Tips:',
|
|
349
|
+
'- Use "primary" as calendar_id for the main calendar',
|
|
350
|
+
'- Set transparency="transparent" for events that don\'t block time',
|
|
351
|
+
'- Use gcal_patch_event to change only specific fields without affecting others',
|
|
352
|
+
'- Use gcal_move_event to transfer events between calendars',
|
|
353
|
+
].join('\n'),
|
|
354
|
+
},
|
|
355
|
+
}],
|
|
356
|
+
}),
|
|
357
|
+
);
|
|
425
358
|
|
|
426
|
-
|
|
427
|
-
|
|
359
|
+
server.prompt(
|
|
360
|
+
'search-and-organize',
|
|
361
|
+
'Guide for searching events, managing calendars, sharing, and checking availability',
|
|
362
|
+
async () => ({
|
|
363
|
+
messages: [{
|
|
364
|
+
role: 'user' as const,
|
|
365
|
+
content: {
|
|
366
|
+
type: 'text' as const,
|
|
367
|
+
text: [
|
|
368
|
+
'You are a Google Calendar organization assistant.',
|
|
369
|
+
'',
|
|
370
|
+
'Searching events:',
|
|
371
|
+
'- **By text** — q parameter searches summary, description, location, attendees',
|
|
372
|
+
'- **By time** — time_min + time_max (RFC 3339) to filter date range',
|
|
373
|
+
'- **Expand recurring** — single_events=true to see individual instances',
|
|
374
|
+
'- **Sort** — order_by="startTime" (requires singleEvents) or "updated"',
|
|
375
|
+
'- **Pagination** — Use max_results + page_token for large result sets',
|
|
376
|
+
'',
|
|
377
|
+
'Managing calendars:',
|
|
378
|
+
'1. **List all** — gcal_list_calendars to see subscribed calendars',
|
|
379
|
+
'2. **Create** — gcal_create_calendar for a new secondary calendar',
|
|
380
|
+
'3. **Customize** — gcal_update_calendar_entry for display color, name override',
|
|
381
|
+
'4. **Subscribe** — gcal_add_calendar to add a shared calendar',
|
|
382
|
+
'5. **Unsubscribe** — gcal_remove_calendar (doesn\'t delete the calendar)',
|
|
383
|
+
'',
|
|
384
|
+
'Sharing calendars (ACL):',
|
|
385
|
+
'- **freeBusyReader** — Can only see free/busy',
|
|
386
|
+
'- **reader** — Can see event details',
|
|
387
|
+
'- **writer** — Can create and edit events',
|
|
388
|
+
'- **owner** — Full control including sharing',
|
|
389
|
+
'- scope_type: "user" (email), "group" (group email), "domain", or "default" (public)',
|
|
390
|
+
'',
|
|
391
|
+
'Checking availability:',
|
|
392
|
+
'- gcal_query_freebusy with time range and calendar IDs',
|
|
393
|
+
'- Returns busy time blocks for each calendar',
|
|
394
|
+
'- Use to find free slots for scheduling meetings',
|
|
395
|
+
'',
|
|
396
|
+
'Colors:',
|
|
397
|
+
'- gcal_get_colors for color palette (IDs 1-24 for calendars, 1-11 for events)',
|
|
398
|
+
'- Apply to events: color_id in gcal_create_event',
|
|
399
|
+
'- Apply to calendars: color_id in gcal_update_calendar_entry',
|
|
400
|
+
].join('\n'),
|
|
401
|
+
},
|
|
402
|
+
}],
|
|
403
|
+
}),
|
|
404
|
+
);
|
|
428
405
|
|
|
429
|
-
//
|
|
430
|
-
server.
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
406
|
+
// Register resource
|
|
407
|
+
server.resource(
|
|
408
|
+
'server-info',
|
|
409
|
+
'gcal://server-info',
|
|
410
|
+
{
|
|
434
411
|
description: 'Connection status and available tools for this Google Calendar MCP server',
|
|
435
412
|
mimeType: 'application/json',
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
413
|
+
},
|
|
414
|
+
async () => ({
|
|
415
|
+
contents: [{
|
|
416
|
+
uri: 'gcal://server-info',
|
|
417
|
+
mimeType: 'application/json',
|
|
418
|
+
text: JSON.stringify({
|
|
419
|
+
name: 'google-calendar-mcp',
|
|
420
|
+
version: '1.0.0',
|
|
421
|
+
connected: !!config,
|
|
422
|
+
has_oauth: !!(config?.clientId),
|
|
423
|
+
tools_available: TOOLS.length,
|
|
424
|
+
tool_categories: {
|
|
425
|
+
events: 10,
|
|
426
|
+
calendar_list: 5,
|
|
427
|
+
calendars: 5,
|
|
428
|
+
acl: 5,
|
|
429
|
+
utility: 3,
|
|
430
|
+
},
|
|
431
|
+
}, null, 2),
|
|
432
|
+
}],
|
|
433
|
+
}),
|
|
434
|
+
);
|
|
442
435
|
|
|
443
|
-
|
|
436
|
+
// Override tools/list handler to return raw JSON Schema with property descriptions
|
|
437
|
+
(server as any).server.setRequestHandler(ListToolsRequestSchema, () => ({
|
|
438
|
+
tools: TOOLS.map(tool => {
|
|
439
|
+
const hasProperties = Object.keys(tool.inputSchema.properties).length > 0;
|
|
444
440
|
return {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
name: 'google-calendar-mcp',
|
|
450
|
-
version: '1.0.0',
|
|
451
|
-
connected: !!config,
|
|
452
|
-
has_oauth: !!(config?.clientId),
|
|
453
|
-
tools_available: TOOLS.length,
|
|
454
|
-
tool_categories: {
|
|
455
|
-
events: 10,
|
|
456
|
-
calendar_list: 5,
|
|
457
|
-
calendars: 5,
|
|
458
|
-
acl: 5,
|
|
459
|
-
utility: 3,
|
|
460
|
-
},
|
|
461
|
-
}, null, 2),
|
|
462
|
-
}],
|
|
441
|
+
name: tool.name,
|
|
442
|
+
description: tool.description,
|
|
443
|
+
...(hasProperties ? { inputSchema: tool.inputSchema } : {}),
|
|
444
|
+
annotations: tool.annotations,
|
|
463
445
|
};
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
throw new Error(`Unknown resource: ${uri}`);
|
|
467
|
-
});
|
|
446
|
+
}),
|
|
447
|
+
}));
|
|
468
448
|
|
|
469
449
|
return server;
|
|
470
450
|
}
|