@node2flow/google-calendar-mcp 1.0.0

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 ADDED
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Google Calendar MCP Server
4
+ *
5
+ * Community edition — connects directly to Google Calendar API v3.
6
+ *
7
+ * Usage (stdio - for Claude Desktop / Cursor / VS Code):
8
+ * GOOGLE_CLIENT_ID=xxx GOOGLE_CLIENT_SECRET=xxx GOOGLE_REFRESH_TOKEN=xxx npx @node2flow/google-calendar-mcp
9
+ *
10
+ * Usage (HTTP - Streamable HTTP transport):
11
+ * GOOGLE_CLIENT_ID=xxx GOOGLE_CLIENT_SECRET=xxx GOOGLE_REFRESH_TOKEN=xxx npx @node2flow/google-calendar-mcp --http
12
+ */
13
+ import { randomUUID } from 'node:crypto';
14
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
15
+ import { StreamableHTTPServerTransport, } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
16
+ import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
17
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
18
+ import { createServer } from './server.js';
19
+ import { TOOLS } from './tools.js';
20
+ function getConfig() {
21
+ const clientId = process.env.GOOGLE_CLIENT_ID;
22
+ const clientSecret = process.env.GOOGLE_CLIENT_SECRET;
23
+ const refreshToken = process.env.GOOGLE_REFRESH_TOKEN;
24
+ if (!clientId || !clientSecret || !refreshToken)
25
+ return null;
26
+ return { clientId, clientSecret, refreshToken };
27
+ }
28
+ async function startStdio() {
29
+ const config = getConfig();
30
+ const server = createServer(config ?? undefined);
31
+ const transport = new StdioServerTransport();
32
+ await server.connect(transport);
33
+ console.error('Google Calendar MCP Server running on stdio');
34
+ console.error(`OAuth: ${config ? '***configured***' : '(not configured — set GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN)'}`);
35
+ console.error(`Tools available: ${TOOLS.length}`);
36
+ console.error('Ready for MCP client\n');
37
+ }
38
+ async function startHttp() {
39
+ const port = parseInt(process.env.PORT || '3000', 10);
40
+ const app = createMcpExpressApp({ host: '0.0.0.0' });
41
+ const transports = {};
42
+ app.post('/mcp', async (req, res) => {
43
+ const url = new URL(req.url, `http://${req.headers.host}`);
44
+ const qClientId = url.searchParams.get('GOOGLE_CLIENT_ID');
45
+ const qClientSecret = url.searchParams.get('GOOGLE_CLIENT_SECRET');
46
+ const qRefreshToken = url.searchParams.get('GOOGLE_REFRESH_TOKEN');
47
+ if (qClientId)
48
+ process.env.GOOGLE_CLIENT_ID = qClientId;
49
+ if (qClientSecret)
50
+ process.env.GOOGLE_CLIENT_SECRET = qClientSecret;
51
+ if (qRefreshToken)
52
+ process.env.GOOGLE_REFRESH_TOKEN = qRefreshToken;
53
+ const sessionId = req.headers['mcp-session-id'];
54
+ try {
55
+ let transport;
56
+ if (sessionId && transports[sessionId]) {
57
+ transport = transports[sessionId];
58
+ }
59
+ else if (!sessionId && isInitializeRequest(req.body)) {
60
+ transport = new StreamableHTTPServerTransport({
61
+ sessionIdGenerator: () => randomUUID(),
62
+ onsessioninitialized: (sid) => {
63
+ transports[sid] = transport;
64
+ },
65
+ });
66
+ transport.onclose = () => {
67
+ const sid = transport.sessionId;
68
+ if (sid && transports[sid]) {
69
+ delete transports[sid];
70
+ }
71
+ };
72
+ const config = getConfig();
73
+ const server = createServer(config ?? undefined);
74
+ await server.connect(transport);
75
+ await transport.handleRequest(req, res, req.body);
76
+ return;
77
+ }
78
+ else {
79
+ res.status(400).json({
80
+ jsonrpc: '2.0',
81
+ error: { code: -32000, message: 'Bad Request: No valid session ID provided' },
82
+ id: null,
83
+ });
84
+ return;
85
+ }
86
+ await transport.handleRequest(req, res, req.body);
87
+ }
88
+ catch (error) {
89
+ console.error('Error handling MCP request:', error);
90
+ if (!res.headersSent) {
91
+ res.status(500).json({
92
+ jsonrpc: '2.0',
93
+ error: { code: -32603, message: 'Internal server error' },
94
+ id: null,
95
+ });
96
+ }
97
+ }
98
+ });
99
+ app.get('/mcp', async (req, res) => {
100
+ const sessionId = req.headers['mcp-session-id'];
101
+ if (!sessionId || !transports[sessionId]) {
102
+ res.status(400).send('Invalid or missing session ID');
103
+ return;
104
+ }
105
+ await transports[sessionId].handleRequest(req, res);
106
+ });
107
+ app.delete('/mcp', async (req, res) => {
108
+ const sessionId = req.headers['mcp-session-id'];
109
+ if (!sessionId || !transports[sessionId]) {
110
+ res.status(400).send('Invalid or missing session ID');
111
+ return;
112
+ }
113
+ await transports[sessionId].handleRequest(req, res);
114
+ });
115
+ app.get('/', (_req, res) => {
116
+ res.json({
117
+ name: 'google-calendar-mcp',
118
+ version: '1.0.0',
119
+ status: 'ok',
120
+ tools: TOOLS.length,
121
+ transport: 'streamable-http',
122
+ endpoints: { mcp: '/mcp' },
123
+ });
124
+ });
125
+ const config = getConfig();
126
+ app.listen(port, () => {
127
+ console.log(`Google Calendar MCP Server (HTTP) listening on port ${port}`);
128
+ console.log(`OAuth: ${config ? '***configured***' : '(not configured — set GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN)'}`);
129
+ console.log(`Tools available: ${TOOLS.length}`);
130
+ console.log(`MCP endpoint: http://localhost:${port}/mcp`);
131
+ });
132
+ process.on('SIGINT', async () => {
133
+ console.log('\nShutting down...');
134
+ for (const sessionId in transports) {
135
+ try {
136
+ await transports[sessionId].close();
137
+ delete transports[sessionId];
138
+ }
139
+ catch { /* ignore */ }
140
+ }
141
+ process.exit(0);
142
+ });
143
+ }
144
+ async function main() {
145
+ const useHttp = process.argv.includes('--http');
146
+ if (useHttp) {
147
+ await startHttp();
148
+ }
149
+ else {
150
+ await startStdio();
151
+ }
152
+ }
153
+ export default function createSmitheryServer(opts) {
154
+ if (opts?.config?.GOOGLE_CLIENT_ID)
155
+ process.env.GOOGLE_CLIENT_ID = opts.config.GOOGLE_CLIENT_ID;
156
+ if (opts?.config?.GOOGLE_CLIENT_SECRET)
157
+ process.env.GOOGLE_CLIENT_SECRET = opts.config.GOOGLE_CLIENT_SECRET;
158
+ if (opts?.config?.GOOGLE_REFRESH_TOKEN)
159
+ process.env.GOOGLE_REFRESH_TOKEN = opts.config.GOOGLE_REFRESH_TOKEN;
160
+ const config = getConfig();
161
+ return createServer(config ?? undefined);
162
+ }
163
+ main().catch((error) => {
164
+ console.error('Fatal error:', error);
165
+ process.exit(1);
166
+ });
167
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shared MCP Server — used by both Node.js (index.ts) and CF Worker (worker.ts)
3
+ */
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { CalendarClient } from './calendar-client.js';
6
+ export interface CalendarMcpConfig {
7
+ clientId: string;
8
+ clientSecret: string;
9
+ refreshToken: string;
10
+ }
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): McpServer;
13
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
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,aAyLtD"}
package/dist/server.js ADDED
@@ -0,0 +1,401 @@
1
+ /**
2
+ * Shared MCP Server — used by both Node.js (index.ts) and CF Worker (worker.ts)
3
+ */
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
6
+ import { CalendarClient } from './calendar-client.js';
7
+ import { TOOLS } from './tools.js';
8
+ export function handleToolCall(toolName, args, client) {
9
+ switch (toolName) {
10
+ // ========== Events ==========
11
+ case 'gcal_list_events':
12
+ return client.listEvents({
13
+ calendarId: args.calendar_id,
14
+ timeMin: args.time_min,
15
+ timeMax: args.time_max,
16
+ q: args.q,
17
+ maxResults: args.max_results,
18
+ pageToken: args.page_token,
19
+ singleEvents: args.single_events,
20
+ orderBy: args.order_by,
21
+ timeZone: args.time_zone,
22
+ showDeleted: args.show_deleted,
23
+ });
24
+ case 'gcal_get_event':
25
+ return client.getEvent({
26
+ calendarId: args.calendar_id,
27
+ eventId: args.event_id,
28
+ timeZone: args.time_zone,
29
+ });
30
+ case 'gcal_create_event':
31
+ return client.createEvent({
32
+ calendarId: args.calendar_id,
33
+ summary: args.summary,
34
+ description: args.description,
35
+ location: args.location,
36
+ startDateTime: args.start_date_time,
37
+ startDate: args.start_date,
38
+ startTimeZone: args.start_time_zone,
39
+ endDateTime: args.end_date_time,
40
+ endDate: args.end_date,
41
+ endTimeZone: args.end_time_zone,
42
+ attendees: args.attendees,
43
+ recurrence: args.recurrence,
44
+ colorId: args.color_id,
45
+ visibility: args.visibility,
46
+ transparency: args.transparency,
47
+ sendUpdates: args.send_updates,
48
+ });
49
+ case 'gcal_update_event':
50
+ return client.updateEvent({
51
+ calendarId: args.calendar_id,
52
+ eventId: args.event_id,
53
+ summary: args.summary,
54
+ description: args.description,
55
+ location: args.location,
56
+ startDateTime: args.start_date_time,
57
+ startDate: args.start_date,
58
+ startTimeZone: args.start_time_zone,
59
+ endDateTime: args.end_date_time,
60
+ endDate: args.end_date,
61
+ endTimeZone: args.end_time_zone,
62
+ attendees: args.attendees,
63
+ recurrence: args.recurrence,
64
+ colorId: args.color_id,
65
+ visibility: args.visibility,
66
+ transparency: args.transparency,
67
+ sendUpdates: args.send_updates,
68
+ });
69
+ case 'gcal_patch_event':
70
+ return client.patchEvent({
71
+ calendarId: args.calendar_id,
72
+ eventId: args.event_id,
73
+ summary: args.summary,
74
+ description: args.description,
75
+ location: args.location,
76
+ startDateTime: args.start_date_time,
77
+ startDate: args.start_date,
78
+ startTimeZone: args.start_time_zone,
79
+ endDateTime: args.end_date_time,
80
+ endDate: args.end_date,
81
+ endTimeZone: args.end_time_zone,
82
+ attendees: args.attendees,
83
+ colorId: args.color_id,
84
+ visibility: args.visibility,
85
+ transparency: args.transparency,
86
+ sendUpdates: args.send_updates,
87
+ });
88
+ case 'gcal_delete_event':
89
+ return client.deleteEvent({
90
+ calendarId: args.calendar_id,
91
+ eventId: args.event_id,
92
+ sendUpdates: args.send_updates,
93
+ });
94
+ case 'gcal_quick_add':
95
+ return client.quickAdd({
96
+ calendarId: args.calendar_id,
97
+ text: args.text,
98
+ sendUpdates: args.send_updates,
99
+ });
100
+ case 'gcal_move_event':
101
+ return client.moveEvent({
102
+ calendarId: args.calendar_id,
103
+ eventId: args.event_id,
104
+ destination: args.destination,
105
+ sendUpdates: args.send_updates,
106
+ });
107
+ case 'gcal_list_instances':
108
+ return client.listInstances({
109
+ calendarId: args.calendar_id,
110
+ eventId: args.event_id,
111
+ timeMin: args.time_min,
112
+ timeMax: args.time_max,
113
+ maxResults: args.max_results,
114
+ pageToken: args.page_token,
115
+ timeZone: args.time_zone,
116
+ });
117
+ case 'gcal_import_event':
118
+ return client.importEvent({
119
+ calendarId: args.calendar_id,
120
+ iCalUID: args.ical_uid,
121
+ summary: args.summary,
122
+ description: args.description,
123
+ location: args.location,
124
+ startDateTime: args.start_date_time,
125
+ startDate: args.start_date,
126
+ startTimeZone: args.start_time_zone,
127
+ endDateTime: args.end_date_time,
128
+ endDate: args.end_date,
129
+ endTimeZone: args.end_time_zone,
130
+ });
131
+ // ========== CalendarList ==========
132
+ case 'gcal_list_calendars':
133
+ return client.listCalendars({
134
+ maxResults: args.max_results,
135
+ pageToken: args.page_token,
136
+ showDeleted: args.show_deleted,
137
+ showHidden: args.show_hidden,
138
+ });
139
+ case 'gcal_get_calendar_entry':
140
+ return client.getCalendarEntry({
141
+ calendarId: args.calendar_id,
142
+ });
143
+ case 'gcal_add_calendar':
144
+ return client.addCalendar({
145
+ id: args.id,
146
+ colorId: args.color_id,
147
+ summaryOverride: args.summary_override,
148
+ hidden: args.hidden,
149
+ selected: args.selected,
150
+ });
151
+ case 'gcal_update_calendar_entry':
152
+ return client.updateCalendarEntry({
153
+ calendarId: args.calendar_id,
154
+ colorId: args.color_id,
155
+ summaryOverride: args.summary_override,
156
+ hidden: args.hidden,
157
+ selected: args.selected,
158
+ defaultReminders: args.default_reminders,
159
+ });
160
+ case 'gcal_remove_calendar':
161
+ return client.removeCalendar({
162
+ calendarId: args.calendar_id,
163
+ });
164
+ // ========== Calendars ==========
165
+ case 'gcal_get_calendar':
166
+ return client.getCalendar({
167
+ calendarId: args.calendar_id,
168
+ });
169
+ case 'gcal_create_calendar':
170
+ return client.createCalendar({
171
+ summary: args.summary,
172
+ description: args.description,
173
+ location: args.location,
174
+ timeZone: args.time_zone,
175
+ });
176
+ case 'gcal_update_calendar':
177
+ return client.updateCalendar({
178
+ calendarId: args.calendar_id,
179
+ summary: args.summary,
180
+ description: args.description,
181
+ location: args.location,
182
+ timeZone: args.time_zone,
183
+ });
184
+ case 'gcal_delete_calendar':
185
+ return client.deleteCalendar({
186
+ calendarId: args.calendar_id,
187
+ });
188
+ case 'gcal_clear_calendar':
189
+ return client.clearCalendar({
190
+ calendarId: args.calendar_id,
191
+ });
192
+ // ========== ACL ==========
193
+ case 'gcal_list_acl':
194
+ return client.listAcl({
195
+ calendarId: args.calendar_id,
196
+ maxResults: args.max_results,
197
+ pageToken: args.page_token,
198
+ showDeleted: args.show_deleted,
199
+ });
200
+ case 'gcal_get_acl':
201
+ return client.getAcl({
202
+ calendarId: args.calendar_id,
203
+ ruleId: args.rule_id,
204
+ });
205
+ case 'gcal_create_acl':
206
+ return client.createAcl({
207
+ calendarId: args.calendar_id,
208
+ role: args.role,
209
+ scopeType: args.scope_type,
210
+ scopeValue: args.scope_value,
211
+ sendNotifications: args.send_notifications,
212
+ });
213
+ case 'gcal_update_acl':
214
+ return client.updateAcl({
215
+ calendarId: args.calendar_id,
216
+ ruleId: args.rule_id,
217
+ role: args.role,
218
+ sendNotifications: args.send_notifications,
219
+ });
220
+ case 'gcal_delete_acl':
221
+ return client.deleteAcl({
222
+ calendarId: args.calendar_id,
223
+ ruleId: args.rule_id,
224
+ });
225
+ // ========== Utility ==========
226
+ case 'gcal_query_freebusy':
227
+ return client.queryFreeBusy({
228
+ timeMin: args.time_min,
229
+ timeMax: args.time_max,
230
+ timeZone: args.time_zone,
231
+ calendarIds: args.calendar_ids,
232
+ });
233
+ case 'gcal_get_colors':
234
+ return client.getColors();
235
+ case 'gcal_list_settings':
236
+ return client.listSettings({
237
+ maxResults: args.max_results,
238
+ pageToken: args.page_token,
239
+ });
240
+ default:
241
+ throw new Error(`Unknown tool: ${toolName}`);
242
+ }
243
+ }
244
+ export function createServer(config) {
245
+ const server = new McpServer({
246
+ name: 'google-calendar-mcp',
247
+ version: '1.0.0',
248
+ });
249
+ let client = null;
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) => {
256
+ const clientId = config?.clientId ||
257
+ args.GOOGLE_CLIENT_ID;
258
+ const clientSecret = config?.clientSecret ||
259
+ args.GOOGLE_CLIENT_SECRET;
260
+ const refreshToken = config?.refreshToken ||
261
+ args.GOOGLE_REFRESH_TOKEN;
262
+ if (!clientId || !clientSecret || !refreshToken) {
263
+ return {
264
+ content: [{ type: 'text', text: 'Error: GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, and GOOGLE_REFRESH_TOKEN are all required.' }],
265
+ isError: true,
266
+ };
267
+ }
268
+ if (!client || config?.clientId !== clientId) {
269
+ client = new CalendarClient({ clientId, clientSecret, refreshToken });
270
+ }
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
+ }],
323
+ }));
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: [{
372
+ uri: 'gcal://server-info',
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),
388
+ }],
389
+ }));
390
+ // Override tools/list handler to return raw JSON Schema with property descriptions
391
+ server.server.setRequestHandler(ListToolsRequestSchema, () => ({
392
+ tools: TOOLS.map(tool => ({
393
+ name: tool.name,
394
+ description: tool.description,
395
+ inputSchema: tool.inputSchema,
396
+ annotations: tool.annotations,
397
+ })),
398
+ }));
399
+ return server;
400
+ }
401
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 28 Google Calendar MCP Tool Definitions
3
+ */
4
+ import type { MCPToolDefinition } from './types.js';
5
+ export declare const TOOLS: MCPToolDefinition[];
6
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,KAAK,EAAE,iBAAiB,EA0epC,CAAC"}