@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.
Files changed (182) hide show
  1. package/README.md +250 -17
  2. package/dist/auth.js +6 -0
  3. package/dist/index.js +1 -1
  4. package/dist/lib/calendar-helpers.js +197 -0
  5. package/dist/lib/document-id-resolver.js +76 -0
  6. package/dist/lib/drive-helpers.js +263 -0
  7. package/dist/lib/gmail-helpers.js +204 -0
  8. package/dist/lib/response-formatter.js +82 -0
  9. package/dist/lib/validation.js +112 -0
  10. package/dist/tools/calendar/acl/calendar_acl_insert.js +80 -0
  11. package/dist/tools/calendar/acl/calendar_acl_list.js +82 -0
  12. package/dist/tools/calendar/basic/calendar_create_event.js +113 -0
  13. package/dist/tools/calendar/basic/calendar_delete_event.js +52 -0
  14. package/dist/tools/calendar/basic/calendar_get_event.js +52 -0
  15. package/dist/tools/calendar/basic/calendar_list_events.js +86 -0
  16. package/dist/tools/calendar/basic/calendar_update_event.js +116 -0
  17. package/dist/tools/calendar/calendarlist/calendar_calendarlist_get.js +73 -0
  18. package/dist/tools/calendar/calendarlist/calendar_calendarlist_list.js +87 -0
  19. package/dist/tools/calendar/calendars/calendar_calendars_get.js +52 -0
  20. package/dist/tools/calendar/calendars/calendar_calendars_insert.js +66 -0
  21. package/dist/tools/calendar/calendars/calendar_calendars_update.js +85 -0
  22. package/dist/tools/calendar/colors/calendar_colors_get.js +46 -0
  23. package/dist/tools/calendar/events_advanced/calendar_events_instances.js +81 -0
  24. package/dist/tools/calendar/events_advanced/calendar_events_move.js +63 -0
  25. package/dist/tools/calendar/events_advanced/calendar_events_quickadd.js +52 -0
  26. package/dist/tools/calendar/freebusy/calendar_freebusy_query.js +69 -0
  27. package/dist/tools/calendar/settings/calendar_settings_list.js +81 -0
  28. package/dist/tools/docs/basic/gdocs_create.js +37 -0
  29. package/dist/tools/docs/basic/gdocs_get_metadata.js +45 -0
  30. package/dist/tools/docs/basic/gdocs_list_documents.js +59 -0
  31. package/dist/tools/docs/basic/gdocs_read.js +62 -0
  32. package/dist/tools/docs/content/gdocs_append_text.js +57 -0
  33. package/dist/tools/docs/content/gdocs_apply_style.js +86 -0
  34. package/dist/tools/docs/content/gdocs_create_heading.js +89 -0
  35. package/dist/tools/docs/content/gdocs_create_list.js +86 -0
  36. package/dist/tools/docs/content/gdocs_delete_text.js +64 -0
  37. package/dist/tools/docs/content/gdocs_format_text.js +137 -0
  38. package/dist/tools/docs/content/gdocs_insert_text.js +62 -0
  39. package/dist/tools/docs/content/gdocs_replace_text.js +64 -0
  40. package/dist/tools/docs/content/gdocs_set_alignment.js +76 -0
  41. package/dist/tools/docs/content/gdocs_update_text.js +78 -0
  42. package/dist/tools/docs/elements/gdocs_batch_update.js +108 -0
  43. package/dist/tools/docs/elements/gdocs_create_table.js +73 -0
  44. package/dist/tools/docs/elements/gdocs_export.js +62 -0
  45. package/dist/tools/docs/elements/gdocs_insert_image.js +96 -0
  46. package/dist/tools/docs/elements/gdocs_insert_link.js +77 -0
  47. package/dist/tools/docs/elements/gdocs_insert_page_break.js +55 -0
  48. package/dist/tools/docs/elements/gdocs_insert_toc.js +71 -0
  49. package/dist/tools/docs/elements/gdocs_merge_documents.js +104 -0
  50. package/dist/tools/docs/elements/gdocs_suggest_mode.js +41 -0
  51. package/dist/tools/drive/advanced/drive_empty_trash.js +56 -0
  52. package/dist/tools/drive/advanced/drive_export_file.js +158 -0
  53. package/dist/tools/drive/advanced/drive_list_revisions.js +80 -0
  54. package/dist/tools/drive/basic/drive_get_metadata.js +49 -0
  55. package/dist/tools/drive/basic/drive_list_files.js +76 -0
  56. package/dist/tools/drive/file/drive_copy_file.js +79 -0
  57. package/dist/tools/drive/file/drive_create_file.js +72 -0
  58. package/dist/tools/drive/file/drive_delete_file.js +48 -0
  59. package/dist/tools/drive/file/drive_move_file.js +79 -0
  60. package/dist/tools/drive/file/drive_rename_file.js +58 -0
  61. package/dist/tools/drive/file/drive_update_file.js +106 -0
  62. package/dist/tools/drive/file/drive_upload_file.js +80 -0
  63. package/dist/tools/drive/folder/drive_create_folder.js +67 -0
  64. package/dist/tools/drive/folder/drive_list_folder_contents.js +68 -0
  65. package/dist/tools/drive/folder/drive_move_to_folder.js +59 -0
  66. package/dist/tools/drive/permissions/drive_list_permissions.js +115 -0
  67. package/dist/tools/drive/permissions/drive_remove_permission.js +71 -0
  68. package/dist/tools/drive/permissions/drive_share_file.js +116 -0
  69. package/dist/tools/drive/permissions/drive_update_permission.js +79 -0
  70. package/dist/tools/gmail/basic/gmail_get_message.js +95 -0
  71. package/dist/tools/gmail/basic/gmail_get_thread.js +46 -0
  72. package/dist/tools/gmail/basic/gmail_list_labels.js +54 -0
  73. package/dist/tools/gmail/basic/gmail_search_messages.js +59 -0
  74. package/dist/tools/gmail/batch/gmail_batch_modify_labels.js +74 -0
  75. package/dist/tools/gmail/batch/gmail_get_messages_batch.js +120 -0
  76. package/dist/tools/gmail/batch/gmail_get_threads_batch.js +102 -0
  77. package/dist/tools/gmail/labels/gmail_manage_label.js +131 -0
  78. package/dist/tools/gmail/labels/gmail_modify_labels.js +65 -0
  79. package/dist/tools/gmail/send/gmail_draft_message.js +117 -0
  80. package/dist/tools/gmail/send/gmail_send_message.js +109 -0
  81. package/dist/tools/index.js +386 -3
  82. package/package.json +8 -3
  83. package/dist/tools/basic/gsheets_add_sheet.js +0 -65
  84. package/dist/tools/basic/gsheets_copy_sheet.js +0 -56
  85. package/dist/tools/basic/gsheets_copy_to.js +0 -113
  86. package/dist/tools/basic/gsheets_create_spreadsheet.js +0 -88
  87. package/dist/tools/basic/gsheets_delete_columns.js +0 -69
  88. package/dist/tools/basic/gsheets_delete_rows.js +0 -69
  89. package/dist/tools/basic/gsheets_delete_sheet.js +0 -56
  90. package/dist/tools/basic/gsheets_duplicate_sheet.js +0 -72
  91. package/dist/tools/basic/gsheets_insert_columns.js +0 -69
  92. package/dist/tools/basic/gsheets_insert_rows.js +0 -69
  93. package/dist/tools/basic/gsheets_list_sheets.js +0 -53
  94. package/dist/tools/basic/gsheets_read.js +0 -120
  95. package/dist/tools/basic/gsheets_rename_sheet.js +0 -64
  96. package/dist/tools/charts/gsheets_add_bubble.js +0 -176
  97. package/dist/tools/charts/gsheets_add_candlestick.js +0 -192
  98. package/dist/tools/charts/gsheets_add_chart.js +0 -162
  99. package/dist/tools/charts/gsheets_add_combo.js +0 -169
  100. package/dist/tools/charts/gsheets_add_histogram.js +0 -143
  101. package/dist/tools/charts/gsheets_add_org_chart.js +0 -160
  102. package/dist/tools/charts/gsheets_add_treemap.js +0 -177
  103. package/dist/tools/charts/gsheets_add_waterfall.js +0 -155
  104. package/dist/tools/charts/gsheets_delete_chart.js +0 -56
  105. package/dist/tools/charts/gsheets_update_chart.js +0 -118
  106. package/dist/tools/data/gsheets_append_data.js +0 -68
  107. package/dist/tools/data/gsheets_batch_clear.js +0 -53
  108. package/dist/tools/data/gsheets_batch_update.js +0 -81
  109. package/dist/tools/data/gsheets_clear_data.js +0 -53
  110. package/dist/tools/data/gsheets_create_filter.js +0 -81
  111. package/dist/tools/data/gsheets_find_replace.js +0 -124
  112. package/dist/tools/data/gsheets_set_data_validation.js +0 -153
  113. package/dist/tools/data/gsheets_sort_range.js +0 -102
  114. package/dist/tools/data/gsheets_update_cell.js +0 -44
  115. package/dist/tools/formatting/gsheets_auto_resize.js +0 -75
  116. package/dist/tools/formatting/gsheets_format_cells.js +0 -161
  117. package/dist/tools/formatting/gsheets_freeze_columns.js +0 -67
  118. package/dist/tools/formatting/gsheets_freeze_rows.js +0 -67
  119. package/dist/tools/formatting/gsheets_merge_cells.js +0 -85
  120. package/dist/tools/formatting/gsheets_set_number_format.js +0 -116
  121. package/dist/tools/formatting/gsheets_unmerge_cells.js +0 -79
  122. package/dist/tools/formatting/gsheets_update_borders.js +0 -212
  123. package/dist/tools/gdrive/gdrive_read_file.js +0 -77
  124. package/dist/tools/gdrive/gdrive_search.js +0 -71
  125. package/dist/tools/gdrive_read_file.js +0 -77
  126. package/dist/tools/gdrive_search.js +0 -71
  127. package/dist/tools/gsheets_add_bubble.js +0 -176
  128. package/dist/tools/gsheets_add_candlestick.js +0 -192
  129. package/dist/tools/gsheets_add_chart.js +0 -162
  130. package/dist/tools/gsheets_add_combo.js +0 -169
  131. package/dist/tools/gsheets_add_conditional_format.js +0 -175
  132. package/dist/tools/gsheets_add_histogram.js +0 -143
  133. package/dist/tools/gsheets_add_named_range.js +0 -87
  134. package/dist/tools/gsheets_add_org_chart.js +0 -160
  135. package/dist/tools/gsheets_add_protected_range.js +0 -127
  136. package/dist/tools/gsheets_add_sheet.js +0 -65
  137. package/dist/tools/gsheets_add_treemap.js +0 -177
  138. package/dist/tools/gsheets_add_waterfall.js +0 -155
  139. package/dist/tools/gsheets_append_data.js +0 -68
  140. package/dist/tools/gsheets_auto_resize.js +0 -75
  141. package/dist/tools/gsheets_batch_clear.js +0 -53
  142. package/dist/tools/gsheets_batch_update.js +0 -81
  143. package/dist/tools/gsheets_clear_data.js +0 -53
  144. package/dist/tools/gsheets_copy_sheet.js +0 -56
  145. package/dist/tools/gsheets_copy_to.js +0 -113
  146. package/dist/tools/gsheets_create_filter.js +0 -81
  147. package/dist/tools/gsheets_create_spreadsheet.js +0 -88
  148. package/dist/tools/gsheets_delete_chart.js +0 -56
  149. package/dist/tools/gsheets_delete_columns.js +0 -69
  150. package/dist/tools/gsheets_delete_named_range.js +0 -56
  151. package/dist/tools/gsheets_delete_protected_range.js +0 -56
  152. package/dist/tools/gsheets_delete_rows.js +0 -69
  153. package/dist/tools/gsheets_delete_sheet.js +0 -56
  154. package/dist/tools/gsheets_duplicate_sheet.js +0 -72
  155. package/dist/tools/gsheets_find_replace.js +0 -124
  156. package/dist/tools/gsheets_format_cells.js +0 -161
  157. package/dist/tools/gsheets_freeze_columns.js +0 -67
  158. package/dist/tools/gsheets_freeze_rows.js +0 -67
  159. package/dist/tools/gsheets_insert_columns.js +0 -69
  160. package/dist/tools/gsheets_insert_rows.js +0 -69
  161. package/dist/tools/gsheets_list_sheets.js +0 -53
  162. package/dist/tools/gsheets_merge_cells.js +0 -85
  163. package/dist/tools/gsheets_read.js +0 -120
  164. package/dist/tools/gsheets_rename_sheet.js +0 -64
  165. package/dist/tools/gsheets_set_data_validation.js +0 -153
  166. package/dist/tools/gsheets_set_number_format.js +0 -116
  167. package/dist/tools/gsheets_sort_range.js +0 -102
  168. package/dist/tools/gsheets_unmerge_cells.js +0 -79
  169. package/dist/tools/gsheets_update_borders.js +0 -212
  170. package/dist/tools/gsheets_update_cell.js +0 -44
  171. package/dist/tools/gsheets_update_chart.js +0 -118
  172. package/dist/tools/gsheets_update_named_range.js +0 -112
  173. package/dist/tools/gsheets_update_protected_range.js +0 -110
  174. package/dist/tools/protection/gsheets_add_conditional_format.js +0 -175
  175. package/dist/tools/protection/gsheets_add_named_range.js +0 -87
  176. package/dist/tools/protection/gsheets_add_protected_range.js +0 -127
  177. package/dist/tools/protection/gsheets_delete_named_range.js +0 -56
  178. package/dist/tools/protection/gsheets_delete_protected_range.js +0 -56
  179. package/dist/tools/protection/gsheets_update_named_range.js +0 -112
  180. package/dist/tools/protection/gsheets_update_protected_range.js +0 -110
  181. /package/dist/tools/drive/{drive_read_file.js → basic/drive_read_file.js} +0 -0
  182. /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
+ }