@prmichaelsen/google-calendar-mcp 2.2.0 → 2.3.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/build/server-factory.js +12 -12
- package/build/server-factory.js.map +1 -1
- package/package.json +1 -1
package/build/server-factory.js
CHANGED
|
@@ -44,7 +44,7 @@ function createGoogleCalendarServer(userEmail, userId, options) {
|
|
|
44
44
|
);
|
|
45
45
|
const tools = [
|
|
46
46
|
{
|
|
47
|
-
name: "
|
|
47
|
+
name: "google_calendar_create_calendar_event",
|
|
48
48
|
description: "Create a new event in Google Calendar with specified details including title, description, start/end times, and optional attendees",
|
|
49
49
|
inputSchema: {
|
|
50
50
|
type: "object",
|
|
@@ -103,7 +103,7 @@ function createGoogleCalendarServer(userEmail, userId, options) {
|
|
|
103
103
|
}
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
|
-
name: "
|
|
106
|
+
name: "google_calendar_list_calendar_events",
|
|
107
107
|
description: "List upcoming events from Google Calendar within a specified time range",
|
|
108
108
|
inputSchema: {
|
|
109
109
|
type: "object",
|
|
@@ -125,7 +125,7 @@ function createGoogleCalendarServer(userEmail, userId, options) {
|
|
|
125
125
|
}
|
|
126
126
|
},
|
|
127
127
|
{
|
|
128
|
-
name: "
|
|
128
|
+
name: "google_calendar_update_calendar_event",
|
|
129
129
|
description: "Update an existing calendar event by event ID. Can modify title, description, times, location, and attendees.",
|
|
130
130
|
inputSchema: {
|
|
131
131
|
type: "object",
|
|
@@ -188,7 +188,7 @@ function createGoogleCalendarServer(userEmail, userId, options) {
|
|
|
188
188
|
}
|
|
189
189
|
},
|
|
190
190
|
{
|
|
191
|
-
name: "
|
|
191
|
+
name: "google_calendar_send_email",
|
|
192
192
|
description: "Send an email from the configured Gmail account. Supports plain text and HTML emails with optional attachments.",
|
|
193
193
|
inputSchema: {
|
|
194
194
|
type: "object",
|
|
@@ -226,7 +226,7 @@ function createGoogleCalendarServer(userEmail, userId, options) {
|
|
|
226
226
|
}
|
|
227
227
|
},
|
|
228
228
|
{
|
|
229
|
-
name: "
|
|
229
|
+
name: "google_calendar_list_emails",
|
|
230
230
|
description: "List emails from Gmail inbox with optional search query. Returns email metadata including ID, subject, sender, and snippet.",
|
|
231
231
|
inputSchema: {
|
|
232
232
|
type: "object",
|
|
@@ -244,7 +244,7 @@ function createGoogleCalendarServer(userEmail, userId, options) {
|
|
|
244
244
|
}
|
|
245
245
|
},
|
|
246
246
|
{
|
|
247
|
-
name: "
|
|
247
|
+
name: "google_calendar_read_email",
|
|
248
248
|
description: "Read the full content of an email by its ID. Returns subject, sender, recipients, body, and metadata.",
|
|
249
249
|
inputSchema: {
|
|
250
250
|
type: "object",
|
|
@@ -274,22 +274,22 @@ function createGoogleCalendarServer(userEmail, userId, options) {
|
|
|
274
274
|
}
|
|
275
275
|
let result;
|
|
276
276
|
switch (name) {
|
|
277
|
-
case "
|
|
277
|
+
case "google_calendar_create_calendar_event":
|
|
278
278
|
result = await createCalendarEvent(calendar, calendarId, args);
|
|
279
279
|
break;
|
|
280
|
-
case "
|
|
280
|
+
case "google_calendar_list_calendar_events":
|
|
281
281
|
result = await listCalendarEvents(calendar, calendarId, args);
|
|
282
282
|
break;
|
|
283
|
-
case "
|
|
283
|
+
case "google_calendar_update_calendar_event":
|
|
284
284
|
result = await updateCalendarEvent(calendar, calendarId, args);
|
|
285
285
|
break;
|
|
286
|
-
case "
|
|
286
|
+
case "google_calendar_send_email":
|
|
287
287
|
result = await sendEmail(gmail, args);
|
|
288
288
|
break;
|
|
289
|
-
case "
|
|
289
|
+
case "google_calendar_list_emails":
|
|
290
290
|
result = await listEmails(gmail, args);
|
|
291
291
|
break;
|
|
292
|
-
case "
|
|
292
|
+
case "google_calendar_read_email":
|
|
293
293
|
result = await readEmail(gmail, args);
|
|
294
294
|
break;
|
|
295
295
|
default:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/server-factory.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Server factory for Google Calendar MCP Server\n * Creates per-user server instances for multi-tenant deployments\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n Tool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { google } from \"googleapis\";\nimport {\n createCalendarEvent,\n listCalendarEvents,\n updateCalendarEvent,\n} from \"./tools/calendar-tools.js\";\nimport {\n sendEmail,\n listEmails,\n readEmail,\n} from \"./tools/email-tools.js\";\n\nexport interface GoogleCalendarServerOptions {\n serviceAccountKeyPath: string;\n calendarId?: string;\n}\n\n/**\n * Create a Google Calendar MCP server instance for a specific user\n * @param userEmail - Email address to impersonate (must be in Google Workspace domain)\n * @param userId - Platform user ID for tracking/logging\n * @param options - Server configuration options\n * @returns Configured MCP Server instance\n */\nexport function createGoogleCalendarServer(\n userEmail: string,\n userId: string,\n options: GoogleCalendarServerOptions\n): Server {\n // Initialize service account auth with user impersonation\n const auth = new google.auth.GoogleAuth({\n keyFile: options.serviceAccountKeyPath,\n scopes: [\n \"https://www.googleapis.com/auth/calendar\",\n \"https://www.googleapis.com/auth/gmail.send\",\n \"https://www.googleapis.com/auth/gmail.readonly\",\n \"https://www.googleapis.com/auth/gmail.modify\",\n ],\n clientOptions: {\n subject: userEmail, // Impersonate this user\n },\n });\n\n const calendar = google.calendar({ version: \"v3\", auth });\n const gmail = google.gmail({ version: \"v1\", auth });\n const calendarId = options.calendarId || \"primary\";\n\n // Create MCP server\n const server = new Server(\n {\n name: \"google-calendar-mcp-server\",\n version: \"2.0.0\",\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Define tools with google_ prefix (required by mcp-auth pattern)\n const tools: Tool[] = [\n {\n name: \"google_create_calendar_event\",\n description:\n \"Create a new event in Google Calendar with specified details including title, description, start/end times, and optional attendees\",\n inputSchema: {\n type: \"object\",\n properties: {\n summary: {\n type: \"string\",\n description: \"Event title/summary\",\n },\n description: {\n type: \"string\",\n description: \"Event description (optional)\",\n },\n start_time: {\n type: \"string\",\n description: \"Start time in ISO 8601 format (e.g., 2024-12-25T10:00:00-08:00)\",\n },\n end_time: {\n type: \"string\",\n description: \"End time in ISO 8601 format (e.g., 2024-12-25T11:00:00-08:00)\",\n },\n attendees: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"List of attendee email addresses (optional)\",\n },\n location: {\n type: \"string\",\n description: \"Event location (optional)\",\n },\n send_notifications: {\n type: \"boolean\",\n description: \"Send email notifications to attendees (default: true)\",\n default: true,\n },\n reminders: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n method: {\n type: \"string\",\n enum: [\"email\", \"popup\"],\n description: \"Reminder method: 'email' or 'popup'\",\n },\n minutes: {\n type: \"number\",\n description: \"Minutes before event to send reminder (e.g., 10, 1440 for 1 day)\",\n },\n },\n required: [\"method\", \"minutes\"],\n },\n description: \"Event reminders (optional). Example: [{method: 'popup', minutes: 10}, {method: 'email', minutes: 1440}]\",\n },\n },\n required: [\"summary\", \"start_time\", \"end_time\"],\n },\n },\n {\n name: \"google_list_calendar_events\",\n description:\n \"List upcoming events from Google Calendar within a specified time range\",\n inputSchema: {\n type: \"object\",\n properties: {\n max_results: {\n type: \"number\",\n description: \"Maximum number of events to return (default: 10)\",\n default: 10,\n },\n time_min: {\n type: \"string\",\n description:\n \"Lower bound for event start time in ISO 8601 format (default: now)\",\n },\n time_max: {\n type: \"string\",\n description: \"Upper bound for event start time in ISO 8601 format (optional)\",\n },\n },\n },\n },\n {\n name: \"google_update_calendar_event\",\n description:\n \"Update an existing calendar event by event ID. Can modify title, description, times, location, and attendees.\",\n inputSchema: {\n type: \"object\",\n properties: {\n event_id: {\n type: \"string\",\n description: \"Event ID to update (required)\",\n },\n summary: {\n type: \"string\",\n description: \"Event title/summary (optional)\",\n },\n description: {\n type: \"string\",\n description: \"Event description (optional)\",\n },\n start_time: {\n type: \"string\",\n description: \"Start time in ISO 8601 format (optional)\",\n },\n end_time: {\n type: \"string\",\n description: \"End time in ISO 8601 format (optional)\",\n },\n attendees: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"List of attendee email addresses (optional)\",\n },\n location: {\n type: \"string\",\n description: \"Event location (optional)\",\n },\n send_notifications: {\n type: \"boolean\",\n description: \"Send email notifications to attendees about the update (default: true)\",\n default: true,\n },\n reminders: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n method: {\n type: \"string\",\n enum: [\"email\", \"popup\"],\n description: \"Reminder method: 'email' or 'popup'\",\n },\n minutes: {\n type: \"number\",\n description: \"Minutes before event to send reminder\",\n },\n },\n required: [\"method\", \"minutes\"],\n },\n description: \"Event reminders (optional)\",\n },\n },\n required: [\"event_id\"],\n },\n },\n {\n name: \"google_send_email\",\n description:\n \"Send an email from the configured Gmail account. Supports plain text and HTML emails with optional attachments.\",\n inputSchema: {\n type: \"object\",\n properties: {\n to: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Recipient email addresses\",\n },\n subject: {\n type: \"string\",\n description: \"Email subject\",\n },\n body: {\n type: \"string\",\n description: \"Email body (plain text or HTML)\",\n },\n cc: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"CC email addresses (optional)\",\n },\n bcc: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"BCC email addresses (optional)\",\n },\n is_html: {\n type: \"boolean\",\n description: \"Whether body is HTML (default: false)\",\n default: false,\n },\n },\n required: [\"to\", \"subject\", \"body\"],\n },\n },\n {\n name: \"google_list_emails\",\n description:\n \"List emails from Gmail inbox with optional search query. Returns email metadata including ID, subject, sender, and snippet.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Gmail search query (e.g., 'from:alice@example.com', 'subject:meeting', 'is:unread')\",\n },\n max_results: {\n type: \"number\",\n description: \"Maximum number of emails to return (default: 10, max: 100)\",\n default: 10,\n },\n },\n },\n },\n {\n name: \"google_read_email\",\n description:\n \"Read the full content of an email by its ID. Returns subject, sender, recipients, body, and metadata.\",\n inputSchema: {\n type: \"object\",\n properties: {\n email_id: {\n type: \"string\",\n description: \"Email ID to read (from list_emails)\",\n },\n mark_as_read: {\n type: \"boolean\",\n description: \"Mark email as read after fetching (default: false)\",\n default: false,\n },\n },\n required: [\"email_id\"],\n },\n },\n ];\n\n // Register tools\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return { tools };\n });\n\n // Handle tool calls\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n try {\n const { name, arguments: args } = request.params;\n\n if (!args) {\n throw new Error(\"No arguments provided\");\n }\n\n let result: string;\n switch (name) {\n case \"google_create_calendar_event\":\n result = await createCalendarEvent(calendar, calendarId, args);\n break;\n case \"google_list_calendar_events\":\n result = await listCalendarEvents(calendar, calendarId, args);\n break;\n case \"google_update_calendar_event\":\n result = await updateCalendarEvent(calendar, calendarId, args);\n break;\n case \"google_send_email\":\n result = await sendEmail(gmail, args);\n break;\n case \"google_list_emails\":\n result = await listEmails(gmail, args);\n break;\n case \"google_read_email\":\n result = await readEmail(gmail, args);\n break;\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n\n return {\n content: [{ type: \"text\", text: result }],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${error.message}`,\n },\n ],\n isError: true,\n };\n }\n });\n\n return server;\n}\n"],
|
|
4
|
+
"sourcesContent": ["/**\n * Server factory for Google Calendar MCP Server\n * Creates per-user server instances for multi-tenant deployments\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n Tool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { google } from \"googleapis\";\nimport {\n createCalendarEvent,\n listCalendarEvents,\n updateCalendarEvent,\n} from \"./tools/calendar-tools.js\";\nimport {\n sendEmail,\n listEmails,\n readEmail,\n} from \"./tools/email-tools.js\";\n\nexport interface GoogleCalendarServerOptions {\n serviceAccountKeyPath: string;\n calendarId?: string;\n}\n\n/**\n * Create a Google Calendar MCP server instance for a specific user\n * @param userEmail - Email address to impersonate (must be in Google Workspace domain)\n * @param userId - Platform user ID for tracking/logging\n * @param options - Server configuration options\n * @returns Configured MCP Server instance\n */\nexport function createGoogleCalendarServer(\n userEmail: string,\n userId: string,\n options: GoogleCalendarServerOptions\n): Server {\n // Initialize service account auth with user impersonation\n const auth = new google.auth.GoogleAuth({\n keyFile: options.serviceAccountKeyPath,\n scopes: [\n \"https://www.googleapis.com/auth/calendar\",\n \"https://www.googleapis.com/auth/gmail.send\",\n \"https://www.googleapis.com/auth/gmail.readonly\",\n \"https://www.googleapis.com/auth/gmail.modify\",\n ],\n clientOptions: {\n subject: userEmail, // Impersonate this user\n },\n });\n\n const calendar = google.calendar({ version: \"v3\", auth });\n const gmail = google.gmail({ version: \"v1\", auth });\n const calendarId = options.calendarId || \"primary\";\n\n // Create MCP server\n const server = new Server(\n {\n name: \"google-calendar-mcp-server\",\n version: \"2.0.0\",\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Define tools with google_calendar_ prefix (matches resourceType: 'google-calendar')\n const tools: Tool[] = [\n {\n name: \"google_calendar_create_calendar_event\",\n description:\n \"Create a new event in Google Calendar with specified details including title, description, start/end times, and optional attendees\",\n inputSchema: {\n type: \"object\",\n properties: {\n summary: {\n type: \"string\",\n description: \"Event title/summary\",\n },\n description: {\n type: \"string\",\n description: \"Event description (optional)\",\n },\n start_time: {\n type: \"string\",\n description: \"Start time in ISO 8601 format (e.g., 2024-12-25T10:00:00-08:00)\",\n },\n end_time: {\n type: \"string\",\n description: \"End time in ISO 8601 format (e.g., 2024-12-25T11:00:00-08:00)\",\n },\n attendees: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"List of attendee email addresses (optional)\",\n },\n location: {\n type: \"string\",\n description: \"Event location (optional)\",\n },\n send_notifications: {\n type: \"boolean\",\n description: \"Send email notifications to attendees (default: true)\",\n default: true,\n },\n reminders: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n method: {\n type: \"string\",\n enum: [\"email\", \"popup\"],\n description: \"Reminder method: 'email' or 'popup'\",\n },\n minutes: {\n type: \"number\",\n description: \"Minutes before event to send reminder (e.g., 10, 1440 for 1 day)\",\n },\n },\n required: [\"method\", \"minutes\"],\n },\n description: \"Event reminders (optional). Example: [{method: 'popup', minutes: 10}, {method: 'email', minutes: 1440}]\",\n },\n },\n required: [\"summary\", \"start_time\", \"end_time\"],\n },\n },\n {\n name: \"google_calendar_list_calendar_events\",\n description:\n \"List upcoming events from Google Calendar within a specified time range\",\n inputSchema: {\n type: \"object\",\n properties: {\n max_results: {\n type: \"number\",\n description: \"Maximum number of events to return (default: 10)\",\n default: 10,\n },\n time_min: {\n type: \"string\",\n description:\n \"Lower bound for event start time in ISO 8601 format (default: now)\",\n },\n time_max: {\n type: \"string\",\n description: \"Upper bound for event start time in ISO 8601 format (optional)\",\n },\n },\n },\n },\n {\n name: \"google_calendar_update_calendar_event\",\n description:\n \"Update an existing calendar event by event ID. Can modify title, description, times, location, and attendees.\",\n inputSchema: {\n type: \"object\",\n properties: {\n event_id: {\n type: \"string\",\n description: \"Event ID to update (required)\",\n },\n summary: {\n type: \"string\",\n description: \"Event title/summary (optional)\",\n },\n description: {\n type: \"string\",\n description: \"Event description (optional)\",\n },\n start_time: {\n type: \"string\",\n description: \"Start time in ISO 8601 format (optional)\",\n },\n end_time: {\n type: \"string\",\n description: \"End time in ISO 8601 format (optional)\",\n },\n attendees: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"List of attendee email addresses (optional)\",\n },\n location: {\n type: \"string\",\n description: \"Event location (optional)\",\n },\n send_notifications: {\n type: \"boolean\",\n description: \"Send email notifications to attendees about the update (default: true)\",\n default: true,\n },\n reminders: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n method: {\n type: \"string\",\n enum: [\"email\", \"popup\"],\n description: \"Reminder method: 'email' or 'popup'\",\n },\n minutes: {\n type: \"number\",\n description: \"Minutes before event to send reminder\",\n },\n },\n required: [\"method\", \"minutes\"],\n },\n description: \"Event reminders (optional)\",\n },\n },\n required: [\"event_id\"],\n },\n },\n {\n name: \"google_calendar_send_email\",\n description:\n \"Send an email from the configured Gmail account. Supports plain text and HTML emails with optional attachments.\",\n inputSchema: {\n type: \"object\",\n properties: {\n to: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Recipient email addresses\",\n },\n subject: {\n type: \"string\",\n description: \"Email subject\",\n },\n body: {\n type: \"string\",\n description: \"Email body (plain text or HTML)\",\n },\n cc: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"CC email addresses (optional)\",\n },\n bcc: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"BCC email addresses (optional)\",\n },\n is_html: {\n type: \"boolean\",\n description: \"Whether body is HTML (default: false)\",\n default: false,\n },\n },\n required: [\"to\", \"subject\", \"body\"],\n },\n },\n {\n name: \"google_calendar_list_emails\",\n description:\n \"List emails from Gmail inbox with optional search query. Returns email metadata including ID, subject, sender, and snippet.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Gmail search query (e.g., 'from:alice@example.com', 'subject:meeting', 'is:unread')\",\n },\n max_results: {\n type: \"number\",\n description: \"Maximum number of emails to return (default: 10, max: 100)\",\n default: 10,\n },\n },\n },\n },\n {\n name: \"google_calendar_read_email\",\n description:\n \"Read the full content of an email by its ID. Returns subject, sender, recipients, body, and metadata.\",\n inputSchema: {\n type: \"object\",\n properties: {\n email_id: {\n type: \"string\",\n description: \"Email ID to read (from list_emails)\",\n },\n mark_as_read: {\n type: \"boolean\",\n description: \"Mark email as read after fetching (default: false)\",\n default: false,\n },\n },\n required: [\"email_id\"],\n },\n },\n ];\n\n // Register tools\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return { tools };\n });\n\n // Handle tool calls\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n try {\n const { name, arguments: args } = request.params;\n\n if (!args) {\n throw new Error(\"No arguments provided\");\n }\n\n let result: string;\n switch (name) {\n case \"google_calendar_create_calendar_event\":\n result = await createCalendarEvent(calendar, calendarId, args);\n break;\n case \"google_calendar_list_calendar_events\":\n result = await listCalendarEvents(calendar, calendarId, args);\n break;\n case \"google_calendar_update_calendar_event\":\n result = await updateCalendarEvent(calendar, calendarId, args);\n break;\n case \"google_calendar_send_email\":\n result = await sendEmail(gmail, args);\n break;\n case \"google_calendar_list_emails\":\n result = await listEmails(gmail, args);\n break;\n case \"google_calendar_read_email\":\n result = await readEmail(gmail, args);\n break;\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n\n return {\n content: [{ type: \"text\", text: result }],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${error.message}`,\n },\n ],\n isError: true,\n };\n }\n });\n\n return server;\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|