mcp-google-multi 5.2.0-alpha.2 → 5.2.0-alpha.4

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 (59) hide show
  1. package/README.md +2 -2
  2. package/dist/auth.js +33 -0
  3. package/dist/discovery-client.js +13 -0
  4. package/dist/index.js +4 -34
  5. package/dist/services.d.ts +11 -0
  6. package/dist/services.js +53 -0
  7. package/dist/tools/generated/admin.d.ts +2 -0
  8. package/dist/tools/generated/admin.js +1937 -0
  9. package/dist/tools/generated/appsmarket.d.ts +2 -0
  10. package/dist/tools/generated/appsmarket.js +33 -0
  11. package/dist/tools/generated/calendar.d.ts +2 -0
  12. package/dist/tools/generated/calendar.js +428 -0
  13. package/dist/tools/generated/chat.d.ts +2 -0
  14. package/dist/tools/generated/chat.js +666 -0
  15. package/dist/tools/generated/classroom.d.ts +2 -0
  16. package/dist/tools/generated/classroom.js +1610 -0
  17. package/dist/tools/generated/cloudidentity.d.ts +2 -0
  18. package/dist/tools/generated/cloudidentity.js +955 -0
  19. package/dist/tools/generated/cloudsearch.d.ts +2 -0
  20. package/dist/tools/generated/cloudsearch.js +754 -0
  21. package/dist/tools/generated/contacts.d.ts +2 -0
  22. package/dist/tools/generated/contacts.js +215 -0
  23. package/dist/tools/generated/drive.d.ts +2 -0
  24. package/dist/tools/generated/drive.js +543 -0
  25. package/dist/tools/generated/driveactivity.d.ts +2 -0
  26. package/dist/tools/generated/driveactivity.js +19 -0
  27. package/dist/tools/generated/drivelabels.d.ts +2 -0
  28. package/dist/tools/generated/drivelabels.js +389 -0
  29. package/dist/tools/generated/forms.d.ts +2 -0
  30. package/dist/tools/generated/forms.js +49 -0
  31. package/dist/tools/generated/gmail.d.ts +2 -0
  32. package/dist/tools/generated/gmail.js +835 -0
  33. package/dist/tools/generated/groupsmigration.d.ts +2 -0
  34. package/dist/tools/generated/groupsmigration.js +18 -0
  35. package/dist/tools/generated/groupssettings.d.ts +2 -0
  36. package/dist/tools/generated/groupssettings.js +47 -0
  37. package/dist/tools/generated/index.js +50 -0
  38. package/dist/tools/generated/keep.d.ts +2 -0
  39. package/dist/tools/generated/keep.js +102 -0
  40. package/dist/tools/generated/licensing.d.ts +2 -0
  41. package/dist/tools/generated/licensing.js +116 -0
  42. package/dist/tools/generated/meet.d.ts +2 -0
  43. package/dist/tools/generated/meet.js +186 -0
  44. package/dist/tools/generated/postmaster.d.ts +2 -0
  45. package/dist/tools/generated/postmaster.js +66 -0
  46. package/dist/tools/generated/reseller.d.ts +2 -0
  47. package/dist/tools/generated/reseller.js +249 -0
  48. package/dist/tools/generated/script.d.ts +2 -0
  49. package/dist/tools/generated/script.js +249 -0
  50. package/dist/tools/generated/searchconsole.d.ts +2 -0
  51. package/dist/tools/generated/searchconsole.js +19 -0
  52. package/dist/tools/generated/sheets.d.ts +2 -0
  53. package/dist/tools/generated/sheets.js +105 -0
  54. package/dist/tools/generated/vault.d.ts +2 -0
  55. package/dist/tools/generated/vault.js +479 -0
  56. package/dist/tools/generated/workspaceevents.d.ts +2 -0
  57. package/dist/tools/generated/workspaceevents.js +223 -0
  58. package/dist/tools/google-api.js +1 -0
  59. package/package.json +3 -2
package/README.md CHANGED
@@ -9,7 +9,7 @@ A **local** [MCP](https://modelcontextprotocol.io) server that gives Claude Code
9
9
  - 🔑 **Multi-account** — drive any number of your Google accounts from one server, each by a short alias.
10
10
  - 🔒 **Secure by default** — refresh tokens **encrypted at rest** (AES-256-GCM); **writes are deny-by-default**; no telemetry — it talks only to Google.
11
11
  - 📦 **npm-first** — install and run with `npx`; everything configured through env vars.
12
- - 🧰 **~175 tools** across 13 services → full list in **[COVERAGE.md](./COVERAGE.md)**.
12
+ - 🧰 **Exhaustive coverage** — every OAuth-reachable Workspace API method is a named tool: **871 tools across 28 services** (182 hand-curated + 689 generated from Google's API Discovery), plus an escape hatch for anything else → full list in **[COVERAGE.md](./COVERAGE.md)**.
13
13
 
14
14
  > v5 is **local + user-OAuth only**. Service accounts and hosting (and the APIs they unlock) are on the [roadmap](https://github.com/bakissation/mcp-google-multi/milestones). **Upgrading from v4?** Jump to [Upgrading](#upgrading-from-v4).
15
15
 
@@ -126,7 +126,7 @@ Reads are never gated. **Every create/update/delete is off until you opt in**
126
126
 
127
127
  ## What's covered
128
128
 
129
- ~175 tools across Gmail, Drive, Calendar, Sheets, Docs, Contacts, Search Console, Tasks, Meet, and (optional) Slides, Forms, Chat, Workspace Admin. **Full per-tool list → [COVERAGE.md](./COVERAGE.md).** Every tool takes an `account` argument matching one of your aliases.
129
+ Every OAuth-reachable Workspace API method is a named tool — 871 across 28 services. Core services (Gmail, Drive, Calendar, Sheets, Docs, Contacts, Search Console, Tasks, Meet) are on by default; Slides, Forms, Chat, Classroom, Vault, Keep, Apps Script, Cloud Search, Drive Labels and more enable via `GOOGLE_OPTIONAL_SCOPES` bundles, and Workspace Admin APIs via `GOOGLE_ADMIN_ACCOUNTS`. Curated tools give shaped, token-lean responses for everyday operations; generated tools (from Google's API Discovery documents) cover the long tail with the same write-control and account fan-out. **Full per-tool list → [COVERAGE.md](./COVERAGE.md).** Every tool takes an `account` argument matching one of your aliases.
130
130
 
131
131
  ## Google Cloud setup
132
132
 
package/dist/auth.js CHANGED
@@ -39,6 +39,39 @@ export const OPTIONAL_SCOPE_BUNDLES = {
39
39
  'https://www.googleapis.com/auth/chat.messages',
40
40
  'https://www.googleapis.com/auth/chat.messages.create',
41
41
  ],
42
+ classroom: [
43
+ 'https://www.googleapis.com/auth/classroom.courses',
44
+ 'https://www.googleapis.com/auth/classroom.coursework.me',
45
+ 'https://www.googleapis.com/auth/classroom.coursework.students',
46
+ 'https://www.googleapis.com/auth/classroom.courseworkmaterials',
47
+ 'https://www.googleapis.com/auth/classroom.rosters',
48
+ 'https://www.googleapis.com/auth/classroom.announcements',
49
+ 'https://www.googleapis.com/auth/classroom.topics',
50
+ ],
51
+ cloudidentity: [
52
+ 'https://www.googleapis.com/auth/cloud-identity.groups',
53
+ 'https://www.googleapis.com/auth/cloud-identity.devices',
54
+ ],
55
+ cloudsearch: ['https://www.googleapis.com/auth/cloud_search'],
56
+ vault: ['https://www.googleapis.com/auth/ediscovery'],
57
+ keep: ['https://www.googleapis.com/auth/keep'],
58
+ driveactivity: ['https://www.googleapis.com/auth/drive.activity.readonly'],
59
+ drivelabels: [
60
+ 'https://www.googleapis.com/auth/drive.labels',
61
+ 'https://www.googleapis.com/auth/drive.admin.labels',
62
+ ],
63
+ script: [
64
+ 'https://www.googleapis.com/auth/script.projects',
65
+ 'https://www.googleapis.com/auth/script.deployments',
66
+ 'https://www.googleapis.com/auth/script.processes',
67
+ 'https://www.googleapis.com/auth/script.metrics',
68
+ ],
69
+ postmaster: ['https://www.googleapis.com/auth/postmaster.readonly'],
70
+ groupssettings: ['https://www.googleapis.com/auth/apps.groups.settings'],
71
+ groupsmigration: ['https://www.googleapis.com/auth/apps.groups.migration'],
72
+ licensing: ['https://www.googleapis.com/auth/apps.licensing'],
73
+ reseller: ['https://www.googleapis.com/auth/apps.order'],
74
+ appsmarket: ['https://www.googleapis.com/auth/appsmarketplace.license'],
42
75
  };
43
76
  export const ADMIN_SCOPES = [
44
77
  'https://www.googleapis.com/auth/admin.reports.audit.readonly',
@@ -18,7 +18,20 @@ export const WORKSPACE_APIS = {
18
18
  drivelabels: { id: 'drivelabels', version: 'v2' },
19
19
  admin_directory: { id: 'admin', version: 'directory_v1' },
20
20
  admin_reports: { id: 'admin', version: 'reports_v1' },
21
+ admin_datatransfer: { id: 'admin', version: 'datatransfer_v1' },
21
22
  groupssettings: { id: 'groupssettings', version: 'v1' },
23
+ appsmarket: { id: 'appsmarket', version: 'v2' },
24
+ classroom: { id: 'classroom', version: 'v1' },
25
+ cloudidentity: { id: 'cloudidentity', version: 'v1' },
26
+ cloudsearch: { id: 'cloudsearch', version: 'v1' },
27
+ groupsmigration: { id: 'groupsmigration', version: 'v1' },
28
+ keep: { id: 'keep', version: 'v1' },
29
+ licensing: { id: 'licensing', version: 'v1' },
30
+ postmaster: { id: 'gmailpostmastertools', version: 'v1' },
31
+ reseller: { id: 'reseller', version: 'v1' },
32
+ script: { id: 'script', version: 'v1' },
33
+ vault: { id: 'vault', version: 'v1' },
34
+ workspaceevents: { id: 'workspaceevents', version: 'v1' },
22
35
  };
23
36
  const TTL_MS = 7 * 24 * 60 * 60 * 1000;
24
37
  const STALE_RETRY_MS = 5 * 60 * 1000;
package/dist/index.js CHANGED
@@ -5,21 +5,8 @@ import { fileURLToPath } from 'node:url';
5
5
  import path from 'node:path';
6
6
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
7
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
- import { registerGmailTools } from './tools/gmail.js';
9
- import { registerDriveTools } from './tools/drive.js';
10
- import { registerCalendarTools } from './tools/calendar.js';
11
- import { registerSheetsTools } from './tools/sheets.js';
12
- import { registerDocsTools } from './tools/docs.js';
13
- import { registerContactsTools } from './tools/contacts.js';
14
- import { registerSearchConsoleTools } from './tools/searchconsole.js';
15
- import { registerTasksTools } from './tools/tasks.js';
16
- import { registerMeetTools } from './tools/meet.js';
17
- import { registerSlidesTools } from './tools/slides.js';
18
- import { registerFormsTools } from './tools/forms.js';
19
- import { registerChatTools } from './tools/chat.js';
20
- import { registerAdminTools } from './tools/admin.js';
21
- import { getOptionalBundles, getAdminAccounts } from './auth.js';
22
8
  import { GENERATED_SERVICES } from './tools/generated/index.js';
9
+ import { GENERATED_GATES, SERVICES } from './services.js';
23
10
  import { ToolRegistry } from './registry.js';
24
11
  import { registerDiscoverTools } from './discover.js';
25
12
  import { registerEscapeTools } from './tools/google-api.js';
@@ -28,24 +15,6 @@ import { getToolsets, toolsetEnabled } from './toolsets.js';
28
15
  import { resolvePolicy, isAllowed, describePolicy } from './write-control.js';
29
16
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
30
17
  const pkg = JSON.parse(readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8'));
31
- const SERVICES = [
32
- { name: 'gmail', register: registerGmailTools },
33
- { name: 'drive', register: registerDriveTools },
34
- { name: 'calendar', register: registerCalendarTools },
35
- { name: 'sheets', register: registerSheetsTools },
36
- { name: 'docs', register: registerDocsTools },
37
- { name: 'contacts', register: registerContactsTools },
38
- { name: 'searchconsole', register: registerSearchConsoleTools },
39
- { name: 'tasks', register: registerTasksTools },
40
- { name: 'meet', register: registerMeetTools },
41
- { name: 'slides', register: registerSlidesTools, enabled: () => new Set(getOptionalBundles()).has('slides') },
42
- { name: 'forms', register: registerFormsTools, enabled: () => new Set(getOptionalBundles()).has('forms') },
43
- { name: 'chat', register: registerChatTools, enabled: () => new Set(getOptionalBundles()).has('chat') },
44
- { name: 'admin', register: registerAdminTools, enabled: () => getAdminAccounts().length > 0 },
45
- ];
46
- // Opt-in gates for generated-only services whose scopes are not granted by
47
- // default; shared services (admin, forms, chat) reuse their curated gate below.
48
- const GENERATED_GATES = {};
49
18
  function buildRegistry(server, policy) {
50
19
  const registry = new ToolRegistry(server, policy);
51
20
  const toolsets = getToolsets();
@@ -83,9 +52,10 @@ function buildRegistry(server, policy) {
83
52
  gen.register(registry);
84
53
  }
85
54
  if (registry.services().length === 0) {
55
+ const known = [...new Set([...SERVICES.map((s) => s.name), ...GENERATED_SERVICES.map((s) => s.name)])].sort();
86
56
  throw new Error(`GOOGLE_TOOLSETS="${process.env.GOOGLE_TOOLSETS ?? ''}" selected no enabled services. ` +
87
- `Known services: ${SERVICES.map((s) => s.name).join(', ')}. ` +
88
- `Note: slides/forms/chat require GOOGLE_OPTIONAL_SCOPES, admin requires GOOGLE_ADMIN_ACCOUNTS.`);
57
+ `Known services: ${known.join(', ')}. ` +
58
+ `Note: optional services require their bundle in GOOGLE_OPTIONAL_SCOPES, admin requires GOOGLE_ADMIN_ACCOUNTS.`);
89
59
  }
90
60
  registerDiscoverTools(registry, policy);
91
61
  registerEscapeTools(registry, policy);
@@ -0,0 +1,11 @@
1
+ import type { ToolRegistry } from './registry.js';
2
+ export interface ServiceEntry {
3
+ name: string;
4
+ register: (registry: ToolRegistry) => void;
5
+ enabled?: () => boolean;
6
+ }
7
+ export declare const SERVICES: ServiceEntry[];
8
+ export declare const GENERATED_GATES: Record<string, {
9
+ enabled: () => boolean;
10
+ hint: string;
11
+ }>;
@@ -0,0 +1,53 @@
1
+ import { registerGmailTools } from './tools/gmail.js';
2
+ import { registerDriveTools } from './tools/drive.js';
3
+ import { registerCalendarTools } from './tools/calendar.js';
4
+ import { registerSheetsTools } from './tools/sheets.js';
5
+ import { registerDocsTools } from './tools/docs.js';
6
+ import { registerContactsTools } from './tools/contacts.js';
7
+ import { registerSearchConsoleTools } from './tools/searchconsole.js';
8
+ import { registerTasksTools } from './tools/tasks.js';
9
+ import { registerMeetTools } from './tools/meet.js';
10
+ import { registerSlidesTools } from './tools/slides.js';
11
+ import { registerFormsTools } from './tools/forms.js';
12
+ import { registerChatTools } from './tools/chat.js';
13
+ import { registerAdminTools } from './tools/admin.js';
14
+ import { getOptionalBundles, getAdminAccounts } from './auth.js';
15
+ export const SERVICES = [
16
+ { name: 'gmail', register: registerGmailTools },
17
+ { name: 'drive', register: registerDriveTools },
18
+ { name: 'calendar', register: registerCalendarTools },
19
+ { name: 'sheets', register: registerSheetsTools },
20
+ { name: 'docs', register: registerDocsTools },
21
+ { name: 'contacts', register: registerContactsTools },
22
+ { name: 'searchconsole', register: registerSearchConsoleTools },
23
+ { name: 'tasks', register: registerTasksTools },
24
+ { name: 'meet', register: registerMeetTools },
25
+ { name: 'slides', register: registerSlidesTools, enabled: () => new Set(getOptionalBundles()).has('slides') },
26
+ { name: 'forms', register: registerFormsTools, enabled: () => new Set(getOptionalBundles()).has('forms') },
27
+ { name: 'chat', register: registerChatTools, enabled: () => new Set(getOptionalBundles()).has('chat') },
28
+ { name: 'admin', register: registerAdminTools, enabled: () => getAdminAccounts().length > 0 },
29
+ ];
30
+ // Opt-in gates for generated-only services whose scopes are not granted by
31
+ // default; shared services (admin, forms, chat) reuse their curated gate in
32
+ // buildRegistry. workspaceevents has no dedicated scope (subscriptions use the
33
+ // underlying resource scopes), so it registers ungated.
34
+ const bundleGate = (name) => ({
35
+ enabled: () => new Set(getOptionalBundles()).has(name),
36
+ hint: `add "${name}" to GOOGLE_OPTIONAL_SCOPES`,
37
+ });
38
+ export const GENERATED_GATES = {
39
+ appsmarket: bundleGate('appsmarket'),
40
+ classroom: bundleGate('classroom'),
41
+ cloudidentity: bundleGate('cloudidentity'),
42
+ cloudsearch: bundleGate('cloudsearch'),
43
+ driveactivity: bundleGate('driveactivity'),
44
+ drivelabels: bundleGate('drivelabels'),
45
+ groupsmigration: bundleGate('groupsmigration'),
46
+ groupssettings: bundleGate('groupssettings'),
47
+ keep: bundleGate('keep'),
48
+ licensing: bundleGate('licensing'),
49
+ postmaster: bundleGate('postmaster'),
50
+ reseller: bundleGate('reseller'),
51
+ script: bundleGate('script'),
52
+ vault: bundleGate('vault'),
53
+ };
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from '../../registry.js';
2
+ export declare function registerAdminGeneratedTools(registry: ToolRegistry): void;