@alanse/mcp-server-google-workspace 0.2.1 ā 1.0.2
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/README.md +250 -17
- package/dist/auth.js +6 -0
- package/dist/index.js +1 -1
- package/dist/lib/calendar-helpers.js +197 -0
- package/dist/lib/document-id-resolver.js +76 -0
- package/dist/lib/drive-helpers.js +263 -0
- package/dist/lib/gmail-helpers.js +204 -0
- package/dist/lib/response-formatter.js +82 -0
- package/dist/lib/validation.js +112 -0
- package/dist/tools/calendar/acl/calendar_acl_insert.js +80 -0
- package/dist/tools/calendar/acl/calendar_acl_list.js +82 -0
- package/dist/tools/calendar/basic/calendar_create_event.js +113 -0
- package/dist/tools/calendar/basic/calendar_delete_event.js +52 -0
- package/dist/tools/calendar/basic/calendar_get_event.js +52 -0
- package/dist/tools/calendar/basic/calendar_list_events.js +86 -0
- package/dist/tools/calendar/basic/calendar_update_event.js +116 -0
- package/dist/tools/calendar/calendarlist/calendar_calendarlist_get.js +73 -0
- package/dist/tools/calendar/calendarlist/calendar_calendarlist_list.js +87 -0
- package/dist/tools/calendar/calendars/calendar_calendars_get.js +52 -0
- package/dist/tools/calendar/calendars/calendar_calendars_insert.js +66 -0
- package/dist/tools/calendar/calendars/calendar_calendars_update.js +85 -0
- package/dist/tools/calendar/colors/calendar_colors_get.js +46 -0
- package/dist/tools/calendar/events_advanced/calendar_events_instances.js +81 -0
- package/dist/tools/calendar/events_advanced/calendar_events_move.js +63 -0
- package/dist/tools/calendar/events_advanced/calendar_events_quickadd.js +52 -0
- package/dist/tools/calendar/freebusy/calendar_freebusy_query.js +69 -0
- package/dist/tools/calendar/settings/calendar_settings_list.js +81 -0
- package/dist/tools/docs/basic/gdocs_create.js +37 -0
- package/dist/tools/docs/basic/gdocs_get_metadata.js +45 -0
- package/dist/tools/docs/basic/gdocs_list_documents.js +59 -0
- package/dist/tools/docs/basic/gdocs_read.js +62 -0
- package/dist/tools/docs/content/gdocs_append_text.js +57 -0
- package/dist/tools/docs/content/gdocs_apply_style.js +86 -0
- package/dist/tools/docs/content/gdocs_create_heading.js +89 -0
- package/dist/tools/docs/content/gdocs_create_list.js +86 -0
- package/dist/tools/docs/content/gdocs_delete_text.js +64 -0
- package/dist/tools/docs/content/gdocs_format_text.js +137 -0
- package/dist/tools/docs/content/gdocs_insert_text.js +62 -0
- package/dist/tools/docs/content/gdocs_replace_text.js +64 -0
- package/dist/tools/docs/content/gdocs_set_alignment.js +76 -0
- package/dist/tools/docs/content/gdocs_update_text.js +78 -0
- package/dist/tools/docs/elements/gdocs_batch_update.js +108 -0
- package/dist/tools/docs/elements/gdocs_create_table.js +73 -0
- package/dist/tools/docs/elements/gdocs_export.js +62 -0
- package/dist/tools/docs/elements/gdocs_insert_image.js +96 -0
- package/dist/tools/docs/elements/gdocs_insert_link.js +77 -0
- package/dist/tools/docs/elements/gdocs_insert_page_break.js +55 -0
- package/dist/tools/docs/elements/gdocs_insert_toc.js +71 -0
- package/dist/tools/docs/elements/gdocs_merge_documents.js +104 -0
- package/dist/tools/docs/elements/gdocs_suggest_mode.js +41 -0
- package/dist/tools/drive/advanced/drive_empty_trash.js +56 -0
- package/dist/tools/drive/advanced/drive_export_file.js +158 -0
- package/dist/tools/drive/advanced/drive_list_revisions.js +80 -0
- package/dist/tools/drive/basic/drive_get_metadata.js +49 -0
- package/dist/tools/drive/basic/drive_list_files.js +76 -0
- package/dist/tools/drive/file/drive_copy_file.js +79 -0
- package/dist/tools/drive/file/drive_create_file.js +72 -0
- package/dist/tools/drive/file/drive_delete_file.js +48 -0
- package/dist/tools/drive/file/drive_move_file.js +79 -0
- package/dist/tools/drive/file/drive_rename_file.js +58 -0
- package/dist/tools/drive/file/drive_update_file.js +106 -0
- package/dist/tools/drive/file/drive_upload_file.js +80 -0
- package/dist/tools/drive/folder/drive_create_folder.js +67 -0
- package/dist/tools/drive/folder/drive_list_folder_contents.js +68 -0
- package/dist/tools/drive/folder/drive_move_to_folder.js +59 -0
- package/dist/tools/drive/permissions/drive_list_permissions.js +115 -0
- package/dist/tools/drive/permissions/drive_remove_permission.js +71 -0
- package/dist/tools/drive/permissions/drive_share_file.js +116 -0
- package/dist/tools/drive/permissions/drive_update_permission.js +79 -0
- package/dist/tools/gmail/basic/gmail_get_message.js +95 -0
- package/dist/tools/gmail/basic/gmail_get_thread.js +46 -0
- package/dist/tools/gmail/basic/gmail_list_labels.js +54 -0
- package/dist/tools/gmail/basic/gmail_search_messages.js +59 -0
- package/dist/tools/gmail/batch/gmail_batch_modify_labels.js +74 -0
- package/dist/tools/gmail/batch/gmail_get_messages_batch.js +120 -0
- package/dist/tools/gmail/batch/gmail_get_threads_batch.js +102 -0
- package/dist/tools/gmail/labels/gmail_manage_label.js +131 -0
- package/dist/tools/gmail/labels/gmail_modify_labels.js +65 -0
- package/dist/tools/gmail/send/gmail_draft_message.js +117 -0
- package/dist/tools/gmail/send/gmail_send_message.js +109 -0
- package/dist/tools/index.js +386 -3
- package/package.json +8 -3
- package/dist/tools/basic/gsheets_add_sheet.js +0 -65
- package/dist/tools/basic/gsheets_copy_sheet.js +0 -56
- package/dist/tools/basic/gsheets_copy_to.js +0 -113
- package/dist/tools/basic/gsheets_create_spreadsheet.js +0 -88
- package/dist/tools/basic/gsheets_delete_columns.js +0 -69
- package/dist/tools/basic/gsheets_delete_rows.js +0 -69
- package/dist/tools/basic/gsheets_delete_sheet.js +0 -56
- package/dist/tools/basic/gsheets_duplicate_sheet.js +0 -72
- package/dist/tools/basic/gsheets_insert_columns.js +0 -69
- package/dist/tools/basic/gsheets_insert_rows.js +0 -69
- package/dist/tools/basic/gsheets_list_sheets.js +0 -53
- package/dist/tools/basic/gsheets_read.js +0 -120
- package/dist/tools/basic/gsheets_rename_sheet.js +0 -64
- package/dist/tools/charts/gsheets_add_bubble.js +0 -176
- package/dist/tools/charts/gsheets_add_candlestick.js +0 -192
- package/dist/tools/charts/gsheets_add_chart.js +0 -162
- package/dist/tools/charts/gsheets_add_combo.js +0 -169
- package/dist/tools/charts/gsheets_add_histogram.js +0 -143
- package/dist/tools/charts/gsheets_add_org_chart.js +0 -160
- package/dist/tools/charts/gsheets_add_treemap.js +0 -177
- package/dist/tools/charts/gsheets_add_waterfall.js +0 -155
- package/dist/tools/charts/gsheets_delete_chart.js +0 -56
- package/dist/tools/charts/gsheets_update_chart.js +0 -118
- package/dist/tools/data/gsheets_append_data.js +0 -68
- package/dist/tools/data/gsheets_batch_clear.js +0 -53
- package/dist/tools/data/gsheets_batch_update.js +0 -81
- package/dist/tools/data/gsheets_clear_data.js +0 -53
- package/dist/tools/data/gsheets_create_filter.js +0 -81
- package/dist/tools/data/gsheets_find_replace.js +0 -124
- package/dist/tools/data/gsheets_set_data_validation.js +0 -153
- package/dist/tools/data/gsheets_sort_range.js +0 -102
- package/dist/tools/data/gsheets_update_cell.js +0 -44
- package/dist/tools/formatting/gsheets_auto_resize.js +0 -75
- package/dist/tools/formatting/gsheets_format_cells.js +0 -161
- package/dist/tools/formatting/gsheets_freeze_columns.js +0 -67
- package/dist/tools/formatting/gsheets_freeze_rows.js +0 -67
- package/dist/tools/formatting/gsheets_merge_cells.js +0 -85
- package/dist/tools/formatting/gsheets_set_number_format.js +0 -116
- package/dist/tools/formatting/gsheets_unmerge_cells.js +0 -79
- package/dist/tools/formatting/gsheets_update_borders.js +0 -212
- package/dist/tools/gdrive/gdrive_read_file.js +0 -77
- package/dist/tools/gdrive/gdrive_search.js +0 -71
- package/dist/tools/gdrive_read_file.js +0 -77
- package/dist/tools/gdrive_search.js +0 -71
- package/dist/tools/gsheets_add_bubble.js +0 -176
- package/dist/tools/gsheets_add_candlestick.js +0 -192
- package/dist/tools/gsheets_add_chart.js +0 -162
- package/dist/tools/gsheets_add_combo.js +0 -169
- package/dist/tools/gsheets_add_conditional_format.js +0 -175
- package/dist/tools/gsheets_add_histogram.js +0 -143
- package/dist/tools/gsheets_add_named_range.js +0 -87
- package/dist/tools/gsheets_add_org_chart.js +0 -160
- package/dist/tools/gsheets_add_protected_range.js +0 -127
- package/dist/tools/gsheets_add_sheet.js +0 -65
- package/dist/tools/gsheets_add_treemap.js +0 -177
- package/dist/tools/gsheets_add_waterfall.js +0 -155
- package/dist/tools/gsheets_append_data.js +0 -68
- package/dist/tools/gsheets_auto_resize.js +0 -75
- package/dist/tools/gsheets_batch_clear.js +0 -53
- package/dist/tools/gsheets_batch_update.js +0 -81
- package/dist/tools/gsheets_clear_data.js +0 -53
- package/dist/tools/gsheets_copy_sheet.js +0 -56
- package/dist/tools/gsheets_copy_to.js +0 -113
- package/dist/tools/gsheets_create_filter.js +0 -81
- package/dist/tools/gsheets_create_spreadsheet.js +0 -88
- package/dist/tools/gsheets_delete_chart.js +0 -56
- package/dist/tools/gsheets_delete_columns.js +0 -69
- package/dist/tools/gsheets_delete_named_range.js +0 -56
- package/dist/tools/gsheets_delete_protected_range.js +0 -56
- package/dist/tools/gsheets_delete_rows.js +0 -69
- package/dist/tools/gsheets_delete_sheet.js +0 -56
- package/dist/tools/gsheets_duplicate_sheet.js +0 -72
- package/dist/tools/gsheets_find_replace.js +0 -124
- package/dist/tools/gsheets_format_cells.js +0 -161
- package/dist/tools/gsheets_freeze_columns.js +0 -67
- package/dist/tools/gsheets_freeze_rows.js +0 -67
- package/dist/tools/gsheets_insert_columns.js +0 -69
- package/dist/tools/gsheets_insert_rows.js +0 -69
- package/dist/tools/gsheets_list_sheets.js +0 -53
- package/dist/tools/gsheets_merge_cells.js +0 -85
- package/dist/tools/gsheets_read.js +0 -120
- package/dist/tools/gsheets_rename_sheet.js +0 -64
- package/dist/tools/gsheets_set_data_validation.js +0 -153
- package/dist/tools/gsheets_set_number_format.js +0 -116
- package/dist/tools/gsheets_sort_range.js +0 -102
- package/dist/tools/gsheets_unmerge_cells.js +0 -79
- package/dist/tools/gsheets_update_borders.js +0 -212
- package/dist/tools/gsheets_update_cell.js +0 -44
- package/dist/tools/gsheets_update_chart.js +0 -118
- package/dist/tools/gsheets_update_named_range.js +0 -112
- package/dist/tools/gsheets_update_protected_range.js +0 -110
- package/dist/tools/protection/gsheets_add_conditional_format.js +0 -175
- package/dist/tools/protection/gsheets_add_named_range.js +0 -87
- package/dist/tools/protection/gsheets_add_protected_range.js +0 -127
- package/dist/tools/protection/gsheets_delete_named_range.js +0 -56
- package/dist/tools/protection/gsheets_delete_protected_range.js +0 -56
- package/dist/tools/protection/gsheets_update_named_range.js +0 -112
- package/dist/tools/protection/gsheets_update_protected_range.js +0 -110
- /package/dist/tools/drive/{drive_read_file.js ā basic/drive_read_file.js} +0 -0
- /package/dist/tools/drive/{drive_search.js ā basic/drive_search.js} +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
import { ResponseFormatter } from "../../../lib/response-formatter.js";
|
|
3
|
+
export const schema = {
|
|
4
|
+
name: "gmail_modify_labels",
|
|
5
|
+
description: "Add or remove labels from a Gmail message. Can add and remove multiple labels in a single operation. Use gmail_list_labels to get available label IDs.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object",
|
|
8
|
+
properties: {
|
|
9
|
+
messageId: {
|
|
10
|
+
type: "string",
|
|
11
|
+
description: "The Gmail message ID to modify",
|
|
12
|
+
},
|
|
13
|
+
addLabelIds: {
|
|
14
|
+
type: "array",
|
|
15
|
+
items: { type: "string" },
|
|
16
|
+
description: "Array of label IDs to add (e.g., ['INBOX', 'STARRED', 'Label_123'])",
|
|
17
|
+
optional: true,
|
|
18
|
+
},
|
|
19
|
+
removeLabelIds: {
|
|
20
|
+
type: "array",
|
|
21
|
+
items: { type: "string" },
|
|
22
|
+
description: "Array of label IDs to remove (e.g., ['UNREAD', 'SPAM'])",
|
|
23
|
+
optional: true,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
required: ["messageId"],
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
export async function modifyLabels(args) {
|
|
30
|
+
try {
|
|
31
|
+
const gmail = google.gmail("v1");
|
|
32
|
+
const { messageId, addLabelIds = [], removeLabelIds = [] } = args;
|
|
33
|
+
// Validate at least one operation
|
|
34
|
+
if (addLabelIds.length === 0 && removeLabelIds.length === 0) {
|
|
35
|
+
return ResponseFormatter.error(new Error("At least one of addLabelIds or removeLabelIds must be provided"));
|
|
36
|
+
}
|
|
37
|
+
// Modify labels
|
|
38
|
+
const response = await gmail.users.messages.modify({
|
|
39
|
+
userId: "me",
|
|
40
|
+
id: messageId,
|
|
41
|
+
requestBody: {
|
|
42
|
+
addLabelIds: addLabelIds.length > 0 ? addLabelIds : undefined,
|
|
43
|
+
removeLabelIds: removeLabelIds.length > 0 ? removeLabelIds : undefined,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
const updatedLabels = response.data.labelIds || [];
|
|
47
|
+
let output = `ā
Successfully modified labels for message: ${messageId}\n\n`;
|
|
48
|
+
if (addLabelIds.length > 0) {
|
|
49
|
+
output += `ā Added labels: ${addLabelIds.join(", ")}\n`;
|
|
50
|
+
}
|
|
51
|
+
if (removeLabelIds.length > 0) {
|
|
52
|
+
output += `ā Removed labels: ${removeLabelIds.join(", ")}\n`;
|
|
53
|
+
}
|
|
54
|
+
output += `\nš Current labels: ${updatedLabels.join(", ") || "(none)"}`;
|
|
55
|
+
return ResponseFormatter.success({
|
|
56
|
+
messageId,
|
|
57
|
+
addedLabels: addLabelIds,
|
|
58
|
+
removedLabels: removeLabelIds,
|
|
59
|
+
currentLabels: updatedLabels,
|
|
60
|
+
}, output);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return ResponseFormatter.error(error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
import { ResponseFormatter } from "../../../lib/response-formatter.js";
|
|
3
|
+
import { prepareGmailMessage, generateGmailWebUrl, } from "../../../lib/gmail-helpers.js";
|
|
4
|
+
export const schema = {
|
|
5
|
+
name: "gmail_draft_message",
|
|
6
|
+
description: "Create a draft email message in Gmail. The draft is saved but not sent, allowing for later editing or sending. Supports plain text or HTML body, CC/BCC recipients, and threading.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
subject: {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "Email subject line",
|
|
13
|
+
},
|
|
14
|
+
body: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "Email body content (plain text or HTML)",
|
|
17
|
+
},
|
|
18
|
+
bodyFormat: {
|
|
19
|
+
type: "string",
|
|
20
|
+
enum: ["plain", "html"],
|
|
21
|
+
description: "Body format type (default: plain)",
|
|
22
|
+
optional: true,
|
|
23
|
+
},
|
|
24
|
+
to: {
|
|
25
|
+
type: "string",
|
|
26
|
+
description: "Recipient email address(es). Multiple addresses can be comma-separated.",
|
|
27
|
+
optional: true,
|
|
28
|
+
},
|
|
29
|
+
cc: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "CC recipient(s). Multiple addresses can be comma-separated.",
|
|
32
|
+
optional: true,
|
|
33
|
+
},
|
|
34
|
+
bcc: {
|
|
35
|
+
type: "string",
|
|
36
|
+
description: "BCC recipient(s). Multiple addresses can be comma-separated.",
|
|
37
|
+
optional: true,
|
|
38
|
+
},
|
|
39
|
+
threadId: {
|
|
40
|
+
type: "string",
|
|
41
|
+
description: "Thread ID to reply to (makes this a reply draft in an existing conversation)",
|
|
42
|
+
optional: true,
|
|
43
|
+
},
|
|
44
|
+
inReplyTo: {
|
|
45
|
+
type: "string",
|
|
46
|
+
description: "Message-ID header of the message being replied to (for threading)",
|
|
47
|
+
optional: true,
|
|
48
|
+
},
|
|
49
|
+
references: {
|
|
50
|
+
type: "string",
|
|
51
|
+
description: "References header for email threading (space-separated Message-IDs)",
|
|
52
|
+
optional: true,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
required: ["subject", "body"],
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
export async function draftMessage(args) {
|
|
59
|
+
try {
|
|
60
|
+
const gmail = google.gmail("v1");
|
|
61
|
+
const { subject, body, bodyFormat = "plain", to, cc, bcc, threadId, inReplyTo, references, } = args;
|
|
62
|
+
// Prepare base64url encoded MIME message
|
|
63
|
+
const encodedMessage = prepareGmailMessage({
|
|
64
|
+
to: to || "",
|
|
65
|
+
subject,
|
|
66
|
+
body,
|
|
67
|
+
bodyFormat,
|
|
68
|
+
cc,
|
|
69
|
+
bcc,
|
|
70
|
+
inReplyTo,
|
|
71
|
+
references,
|
|
72
|
+
});
|
|
73
|
+
// Create the draft
|
|
74
|
+
const response = await gmail.users.drafts.create({
|
|
75
|
+
userId: "me",
|
|
76
|
+
requestBody: {
|
|
77
|
+
message: {
|
|
78
|
+
raw: encodedMessage,
|
|
79
|
+
threadId: threadId || undefined,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
const draft = response.data;
|
|
84
|
+
const draftId = draft.id || "";
|
|
85
|
+
const messageId = draft.message?.id || "";
|
|
86
|
+
const draftThreadId = draft.message?.threadId || "";
|
|
87
|
+
let output = `ā
Draft created successfully!\n\n`;
|
|
88
|
+
output += `Draft ID: ${draftId}\n`;
|
|
89
|
+
output += `Message ID: ${messageId}\n`;
|
|
90
|
+
if (draftThreadId)
|
|
91
|
+
output += `Thread ID: ${draftThreadId}\n`;
|
|
92
|
+
output += `Web URL: ${generateGmailWebUrl(messageId)}\n\n`;
|
|
93
|
+
output += `š§ Details:\n`;
|
|
94
|
+
if (to)
|
|
95
|
+
output += ` To: ${to}\n`;
|
|
96
|
+
if (cc)
|
|
97
|
+
output += ` CC: ${cc}\n`;
|
|
98
|
+
if (bcc)
|
|
99
|
+
output += ` BCC: ${bcc}\n`;
|
|
100
|
+
output += ` Subject: ${subject}\n`;
|
|
101
|
+
output += ` Format: ${bodyFormat}\n`;
|
|
102
|
+
if (threadId)
|
|
103
|
+
output += ` Reply to thread: ${threadId}\n`;
|
|
104
|
+
output += `\nš” The draft is saved in your Gmail Drafts folder and can be edited or sent later.`;
|
|
105
|
+
return ResponseFormatter.success({
|
|
106
|
+
draftId,
|
|
107
|
+
messageId,
|
|
108
|
+
threadId: draftThreadId,
|
|
109
|
+
subject,
|
|
110
|
+
bodyFormat,
|
|
111
|
+
to: to || null,
|
|
112
|
+
}, output);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
return ResponseFormatter.error(error);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
import { ResponseFormatter } from "../../../lib/response-formatter.js";
|
|
3
|
+
import { prepareGmailMessage, generateGmailWebUrl, } from "../../../lib/gmail-helpers.js";
|
|
4
|
+
export const schema = {
|
|
5
|
+
name: "gmail_send_message",
|
|
6
|
+
description: "Send an email message via Gmail. Supports plain text or HTML body, CC/BCC recipients, and threading (replies). The message will be sent immediately.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
to: {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "Recipient email address(es). Multiple addresses can be comma-separated.",
|
|
13
|
+
},
|
|
14
|
+
subject: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "Email subject line",
|
|
17
|
+
},
|
|
18
|
+
body: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Email body content (plain text or HTML)",
|
|
21
|
+
},
|
|
22
|
+
bodyFormat: {
|
|
23
|
+
type: "string",
|
|
24
|
+
enum: ["plain", "html"],
|
|
25
|
+
description: "Body format type (default: plain)",
|
|
26
|
+
optional: true,
|
|
27
|
+
},
|
|
28
|
+
cc: {
|
|
29
|
+
type: "string",
|
|
30
|
+
description: "CC recipient(s). Multiple addresses can be comma-separated.",
|
|
31
|
+
optional: true,
|
|
32
|
+
},
|
|
33
|
+
bcc: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "BCC recipient(s). Multiple addresses can be comma-separated.",
|
|
36
|
+
optional: true,
|
|
37
|
+
},
|
|
38
|
+
threadId: {
|
|
39
|
+
type: "string",
|
|
40
|
+
description: "Thread ID to reply to (makes this a reply in an existing conversation)",
|
|
41
|
+
optional: true,
|
|
42
|
+
},
|
|
43
|
+
inReplyTo: {
|
|
44
|
+
type: "string",
|
|
45
|
+
description: "Message-ID header of the message being replied to (for threading)",
|
|
46
|
+
optional: true,
|
|
47
|
+
},
|
|
48
|
+
references: {
|
|
49
|
+
type: "string",
|
|
50
|
+
description: "References header for email threading (space-separated Message-IDs)",
|
|
51
|
+
optional: true,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
required: ["to", "subject", "body"],
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
export async function sendMessage(args) {
|
|
58
|
+
try {
|
|
59
|
+
const gmail = google.gmail("v1");
|
|
60
|
+
const { to, subject, body, bodyFormat = "plain", cc, bcc, threadId, inReplyTo, references, } = args;
|
|
61
|
+
// Prepare base64url encoded MIME message
|
|
62
|
+
const encodedMessage = prepareGmailMessage({
|
|
63
|
+
to,
|
|
64
|
+
subject,
|
|
65
|
+
body,
|
|
66
|
+
bodyFormat,
|
|
67
|
+
cc,
|
|
68
|
+
bcc,
|
|
69
|
+
inReplyTo,
|
|
70
|
+
references,
|
|
71
|
+
});
|
|
72
|
+
// Send the message
|
|
73
|
+
const response = await gmail.users.messages.send({
|
|
74
|
+
userId: "me",
|
|
75
|
+
requestBody: {
|
|
76
|
+
raw: encodedMessage,
|
|
77
|
+
threadId: threadId || undefined,
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
const sentMessage = response.data;
|
|
81
|
+
const messageId = sentMessage.id || "";
|
|
82
|
+
const sentThreadId = sentMessage.threadId || "";
|
|
83
|
+
let output = `ā
Message sent successfully!\n\n`;
|
|
84
|
+
output += `Message ID: ${messageId}\n`;
|
|
85
|
+
output += `Thread ID: ${sentThreadId}\n`;
|
|
86
|
+
output += `Web URL: ${generateGmailWebUrl(messageId)}\n\n`;
|
|
87
|
+
output += `š§ Details:\n`;
|
|
88
|
+
output += ` To: ${to}\n`;
|
|
89
|
+
if (cc)
|
|
90
|
+
output += ` CC: ${cc}\n`;
|
|
91
|
+
if (bcc)
|
|
92
|
+
output += ` BCC: ${bcc}\n`;
|
|
93
|
+
output += ` Subject: ${subject}\n`;
|
|
94
|
+
output += ` Format: ${bodyFormat}\n`;
|
|
95
|
+
if (threadId)
|
|
96
|
+
output += ` Reply to thread: ${threadId}\n`;
|
|
97
|
+
return ResponseFormatter.success({
|
|
98
|
+
messageId,
|
|
99
|
+
threadId: sentThreadId,
|
|
100
|
+
labelIds: sentMessage.labelIds || [],
|
|
101
|
+
to,
|
|
102
|
+
subject,
|
|
103
|
+
bodyFormat,
|
|
104
|
+
}, output);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return ResponseFormatter.error(error);
|
|
108
|
+
}
|
|
109
|
+
}
|