@aaronsb/google-workspace-mcp 3.0.0 → 4.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.
Files changed (145) hide show
  1. package/LICENSE +201 -21
  2. package/LICENSE-MIT +21 -0
  3. package/NOTICE +24 -0
  4. package/README.md +71 -52
  5. package/build/accounts/auth.d.ts +1 -1
  6. package/build/accounts/auth.js +1 -1
  7. package/build/accounts/oauth.js +3 -3
  8. package/build/accounts/oauth.js.map +1 -1
  9. package/build/accounts/token-service.js +1 -1
  10. package/build/accounts/token-service.js.map +1 -1
  11. package/build/coverage/analyze.d.ts +1 -1
  12. package/build/coverage/analyze.js +6 -4
  13. package/build/coverage/analyze.js.map +1 -1
  14. package/build/coverage/baseline.js +37 -20
  15. package/build/coverage/baseline.js.map +1 -1
  16. package/build/coverage/compare.d.ts +1 -1
  17. package/build/coverage/compare.js +19 -10
  18. package/build/coverage/compare.js.map +1 -1
  19. package/build/coverage/discover.d.ts +5 -5
  20. package/build/coverage/discover.js +71 -155
  21. package/build/coverage/discover.js.map +1 -1
  22. package/build/coverage/report.js +3 -3
  23. package/build/coverage/report.js.map +1 -1
  24. package/build/coverage/types.d.ts +19 -4
  25. package/build/executor/index.d.ts +0 -3
  26. package/build/executor/index.js +1 -2
  27. package/build/executor/index.js.map +1 -1
  28. package/build/factory/defaults.js +30 -4
  29. package/build/factory/defaults.js.map +1 -1
  30. package/build/factory/generator.d.ts +10 -2
  31. package/build/factory/generator.js +54 -69
  32. package/build/factory/generator.js.map +1 -1
  33. package/build/factory/manifest/README.md +4 -3
  34. package/build/factory/manifest/calendar.yaml +1 -11
  35. package/build/factory/manifest/docs.yaml +15 -6
  36. package/build/factory/manifest/drive.yaml +1 -5
  37. package/build/factory/manifest/gmail.yaml +9 -24
  38. package/build/factory/manifest/meet.yaml +1 -1
  39. package/build/factory/manifest/sheets.yaml +2 -5
  40. package/build/factory/manifest/tasks.yaml +40 -2
  41. package/build/factory/patches.js +2 -0
  42. package/build/factory/patches.js.map +1 -1
  43. package/build/factory/safety.js +4 -4
  44. package/build/factory/safety.js.map +1 -1
  45. package/build/factory/types.d.ts +16 -15
  46. package/build/google/client.d.ts +45 -0
  47. package/build/google/client.js +232 -0
  48. package/build/google/client.js.map +1 -0
  49. package/build/google/descriptor.d.ts +40 -0
  50. package/build/google/descriptor.js +37 -0
  51. package/build/google/descriptor.js.map +1 -0
  52. package/build/google/descriptor.json +5271 -0
  53. package/build/google/errors.d.ts +45 -0
  54. package/build/google/errors.js +44 -0
  55. package/build/google/errors.js.map +1 -0
  56. package/build/google/methods.d.ts +37 -0
  57. package/build/google/methods.js +13 -0
  58. package/build/google/methods.js.map +1 -0
  59. package/build/index.js +3 -3
  60. package/build/index.js.map +1 -1
  61. package/build/node-floor.js +1 -1
  62. package/build/node-floor.js.map +1 -1
  63. package/build/server/formatting/markdown.d.ts +1 -1
  64. package/build/server/formatting/markdown.js +1 -1
  65. package/build/server/formatting/next-steps.js +1 -1
  66. package/build/server/formatting/next-steps.js.map +1 -1
  67. package/build/server/handlers/accounts.js +2 -2
  68. package/build/server/handlers/accounts.js.map +1 -1
  69. package/build/server/scratchpad/adapters/import-doc.js +15 -13
  70. package/build/server/scratchpad/adapters/import-doc.js.map +1 -1
  71. package/build/server/scratchpad/adapters/import-drive.js +16 -11
  72. package/build/server/scratchpad/adapters/import-drive.js.map +1 -1
  73. package/build/server/scratchpad/adapters/import-email.js +3 -15
  74. package/build/server/scratchpad/adapters/import-email.js.map +1 -1
  75. package/build/server/scratchpad/adapters/import-meet.js +5 -17
  76. package/build/server/scratchpad/adapters/import-meet.js.map +1 -1
  77. package/build/server/scratchpad/adapters/import-sheet.js +5 -6
  78. package/build/server/scratchpad/adapters/import-sheet.js.map +1 -1
  79. package/build/server/scratchpad/adapters/send-calendar.js +18 -13
  80. package/build/server/scratchpad/adapters/send-calendar.js.map +1 -1
  81. package/build/server/scratchpad/adapters/send-doc.js +22 -17
  82. package/build/server/scratchpad/adapters/send-doc.js.map +1 -1
  83. package/build/server/scratchpad/adapters/send-email-draft.d.ts +1 -1
  84. package/build/server/scratchpad/adapters/send-email-draft.js +17 -25
  85. package/build/server/scratchpad/adapters/send-email-draft.js.map +1 -1
  86. package/build/server/scratchpad/adapters/send-email.d.ts +2 -2
  87. package/build/server/scratchpad/adapters/send-email.js +21 -25
  88. package/build/server/scratchpad/adapters/send-email.js.map +1 -1
  89. package/build/server/scratchpad/adapters/send-sheet.js +10 -10
  90. package/build/server/scratchpad/adapters/send-sheet.js.map +1 -1
  91. package/build/server/scratchpad/adapters/send-task.js +9 -8
  92. package/build/server/scratchpad/adapters/send-task.js.map +1 -1
  93. package/build/server/scratchpad/handler.js +22 -28
  94. package/build/server/scratchpad/handler.js.map +1 -1
  95. package/build/server/scratchpad/manager.d.ts +1 -1
  96. package/build/server/server.js +13 -10
  97. package/build/server/server.js.map +1 -1
  98. package/build/server/session/tracker.js +21 -25
  99. package/build/server/session/tracker.js.map +1 -1
  100. package/build/server/tools.d.ts +1 -1
  101. package/build/server/tools.js +3 -3
  102. package/build/server/tools.js.map +1 -1
  103. package/build/services/calendar/patch.js +178 -68
  104. package/build/services/calendar/patch.js.map +1 -1
  105. package/build/services/docs/patch.d.ts +5 -3
  106. package/build/services/docs/patch.js +89 -19
  107. package/build/services/docs/patch.js.map +1 -1
  108. package/build/services/drive/patch.d.ts +1 -1
  109. package/build/services/drive/patch.js +115 -143
  110. package/build/services/drive/patch.js.map +1 -1
  111. package/build/services/gmail/attachments.js +10 -15
  112. package/build/services/gmail/attachments.js.map +1 -1
  113. package/build/services/gmail/mail.d.ts +34 -0
  114. package/build/services/gmail/mail.js +245 -0
  115. package/build/services/gmail/mail.js.map +1 -0
  116. package/build/services/gmail/mime.d.ts +45 -4
  117. package/build/services/gmail/mime.js +138 -4
  118. package/build/services/gmail/mime.js.map +1 -1
  119. package/build/services/gmail/patch.js +69 -83
  120. package/build/services/gmail/patch.js.map +1 -1
  121. package/build/services/meet/patch.js +24 -31
  122. package/build/services/meet/patch.js.map +1 -1
  123. package/build/services/sheets/patch.js +30 -35
  124. package/build/services/sheets/patch.js.map +1 -1
  125. package/build/services/tasks/patch.d.ts +18 -0
  126. package/build/services/tasks/patch.js +37 -0
  127. package/build/services/tasks/patch.js.map +1 -0
  128. package/build/version.d.ts +1 -1
  129. package/build/version.js +1 -1
  130. package/package.json +11 -6
  131. package/build/executor/errors.d.ts +0 -15
  132. package/build/executor/errors.js +0 -37
  133. package/build/executor/errors.js.map +0 -1
  134. package/build/executor/gws.d.ts +0 -26
  135. package/build/executor/gws.js +0 -197
  136. package/build/executor/gws.js.map +0 -1
  137. package/build/server/handlers/calendar.d.ts +0 -2
  138. package/build/server/handlers/calendar.js +0 -97
  139. package/build/server/handlers/calendar.js.map +0 -1
  140. package/build/server/handlers/drive.d.ts +0 -2
  141. package/build/server/handlers/drive.js +0 -58
  142. package/build/server/handlers/drive.js.map +0 -1
  143. package/build/server/handlers/email.d.ts +0 -2
  144. package/build/server/handlers/email.js +0 -119
  145. package/build/server/handlers/email.js.map +0 -1
@@ -1,58 +0,0 @@
1
- import { execute } from '../../executor/gws.js';
2
- import { formatFileList, formatFileDetail } from '../formatting/markdown.js';
3
- import { nextSteps } from '../formatting/next-steps.js';
4
- import { requireEmail, requireString, clamp } from './validate.js';
5
- export async function handleDrive(params) {
6
- const operation = params.operation;
7
- const email = requireEmail(params);
8
- switch (operation) {
9
- case 'search': {
10
- const result = await execute([
11
- 'drive', 'files', 'list',
12
- '--params', JSON.stringify({
13
- q: params.query || undefined,
14
- pageSize: clamp(params.maxResults, 10, 50),
15
- fields: 'files(id, name, mimeType, modifiedTime, size, webViewLink)',
16
- }),
17
- ], { account: email });
18
- const formatted = formatFileList(result.data);
19
- return {
20
- text: formatted.text + nextSteps('drive', 'search', { email }),
21
- refs: formatted.refs,
22
- };
23
- }
24
- case 'get': {
25
- const fileId = requireString(params, 'fileId');
26
- const result = await execute([
27
- 'drive', 'files', 'get',
28
- '--params', JSON.stringify({
29
- fileId,
30
- fields: 'id, name, mimeType, modifiedTime, size, webViewLink, owners, shared',
31
- }),
32
- ], { account: email });
33
- const formatted = formatFileDetail(result.data);
34
- return {
35
- text: formatted.text + nextSteps('drive', 'get', { email, fileId }),
36
- refs: formatted.refs,
37
- };
38
- }
39
- case 'upload': {
40
- const filePath = requireString(params, 'filePath');
41
- const args = ['drive', '+upload', filePath];
42
- if (params.name)
43
- args.push('--name', String(params.name));
44
- if (params.parentFolderId)
45
- args.push('--parent', String(params.parentFolderId));
46
- const result = await execute(args, { account: email });
47
- const data = result.data;
48
- return {
49
- text: `File uploaded: **${data.name ?? filePath}**\n\n**File ID:** ${data.id ?? 'unknown'}` +
50
- nextSteps('drive', 'upload', { email }),
51
- refs: { id: data.id, fileId: data.id, name: data.name },
52
- };
53
- }
54
- default:
55
- throw new Error(`Unknown drive operation: ${operation}`);
56
- }
57
- }
58
- //# sourceMappingURL=drive.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drive.js","sourceRoot":"","sources":["../../../src/server/handlers/drive.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { HandlerResponse } from '../handler.js';
2
- export declare function handleEmail(params: Record<string, unknown>): Promise<HandlerResponse>;
@@ -1,119 +0,0 @@
1
- import { execute } from '../../executor/gws.js';
2
- import { formatEmailList, formatEmailDetail } from '../formatting/markdown.js';
3
- import { nextSteps } from '../formatting/next-steps.js';
4
- import { requireEmail, requireString, clamp } from './validate.js';
5
- /**
6
- * Gmail messages.list only returns IDs. This hydrates each message
7
- * with metadata (From, Subject, Date, snippet) via parallel gets.
8
- */
9
- async function hydrateMessages(messageIds, account) {
10
- const hydrated = await Promise.all(messageIds.map(async (msg) => {
11
- try {
12
- const result = await execute([
13
- 'gmail', 'users', 'messages', 'get',
14
- '--params', JSON.stringify({
15
- userId: 'me',
16
- id: msg.id,
17
- format: 'metadata',
18
- metadataHeaders: ['From', 'Subject', 'Date'],
19
- }),
20
- ], { account });
21
- const data = result.data;
22
- const headers = (data.payload?.headers ?? []);
23
- const getHeader = (name) => headers.find(h => h.name.toLowerCase() === name.toLowerCase())?.value;
24
- return {
25
- id: data.id,
26
- threadId: data.threadId,
27
- from: getHeader('from'),
28
- subject: getHeader('subject'),
29
- date: getHeader('date'),
30
- snippet: data.snippet,
31
- };
32
- }
33
- catch {
34
- // If individual hydration fails, return the bare ID
35
- return { id: msg.id };
36
- }
37
- }));
38
- return hydrated;
39
- }
40
- export async function handleEmail(params) {
41
- const operation = params.operation;
42
- const email = requireEmail(params);
43
- switch (operation) {
44
- case 'search': {
45
- const result = await execute([
46
- 'gmail', 'users', 'messages', 'list',
47
- '--params', JSON.stringify({
48
- userId: 'me',
49
- q: params.query || '',
50
- maxResults: clamp(params.maxResults, 10, 50),
51
- }),
52
- ], { account: email });
53
- // messages.list only returns IDs — hydrate with metadata
54
- const raw = result.data;
55
- const ids = (raw?.messages ?? []);
56
- const messages = ids.length > 0 ? await hydrateMessages(ids, email) : [];
57
- const formatted = formatEmailList({
58
- messages,
59
- resultSizeEstimate: raw?.resultSizeEstimate ?? 0,
60
- query: params.query ?? '',
61
- });
62
- return {
63
- text: formatted.text + nextSteps('email', 'search', { email }),
64
- refs: formatted.refs,
65
- };
66
- }
67
- case 'read': {
68
- const messageId = requireString(params, 'messageId');
69
- const result = await execute([
70
- 'gmail', 'users', 'messages', 'get',
71
- '--params', JSON.stringify({ userId: 'me', id: messageId }),
72
- ], { account: email });
73
- const formatted = formatEmailDetail(result.data);
74
- return {
75
- text: formatted.text + nextSteps('email', 'read', { email, messageId }),
76
- refs: formatted.refs,
77
- };
78
- }
79
- case 'send': {
80
- const to = requireString(params, 'to');
81
- const subject = requireString(params, 'subject');
82
- const body = requireString(params, 'body');
83
- const result = await execute([
84
- 'gmail', '+send',
85
- '--to', to, '--subject', subject, '--body', body,
86
- ], { account: email });
87
- const data = result.data;
88
- return {
89
- text: `Email sent to ${to}.\n\n**Subject:** ${subject}\n**Message ID:** ${data.id ?? 'unknown'}` +
90
- nextSteps('email', 'send', { email }),
91
- refs: { id: data.id, threadId: data.threadId, to, subject },
92
- };
93
- }
94
- case 'reply': {
95
- const messageId = requireString(params, 'messageId');
96
- const body = requireString(params, 'body');
97
- const result = await execute([
98
- 'gmail', '+reply', '--message-id', messageId, '--body', body,
99
- ], { account: email });
100
- const data = result.data;
101
- return {
102
- text: `Reply sent.\n\n**Message ID:** ${data.id ?? 'unknown'}` +
103
- nextSteps('email', 'reply', { email }),
104
- refs: { id: data.id, threadId: data.threadId, messageId },
105
- };
106
- }
107
- case 'triage': {
108
- const result = await execute(['gmail', '+triage'], { account: email, format: 'json' });
109
- const formatted = formatEmailList(result.data);
110
- return {
111
- text: formatted.text + nextSteps('email', 'triage', { email }),
112
- refs: formatted.refs,
113
- };
114
- }
115
- default:
116
- throw new Error(`Unknown email operation: ${operation}`);
117
- }
118
- }
119
- //# sourceMappingURL=email.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email.js","sourceRoot":"","sources":["../../../src/server/handlers/email.ts"],"names":[],"mappings":"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"}