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.
- package/README.md +2 -2
- package/dist/auth.js +33 -0
- package/dist/discovery-client.js +13 -0
- package/dist/index.js +4 -34
- package/dist/services.d.ts +11 -0
- package/dist/services.js +53 -0
- package/dist/tools/generated/admin.d.ts +2 -0
- package/dist/tools/generated/admin.js +1937 -0
- package/dist/tools/generated/appsmarket.d.ts +2 -0
- package/dist/tools/generated/appsmarket.js +33 -0
- package/dist/tools/generated/calendar.d.ts +2 -0
- package/dist/tools/generated/calendar.js +428 -0
- package/dist/tools/generated/chat.d.ts +2 -0
- package/dist/tools/generated/chat.js +666 -0
- package/dist/tools/generated/classroom.d.ts +2 -0
- package/dist/tools/generated/classroom.js +1610 -0
- package/dist/tools/generated/cloudidentity.d.ts +2 -0
- package/dist/tools/generated/cloudidentity.js +955 -0
- package/dist/tools/generated/cloudsearch.d.ts +2 -0
- package/dist/tools/generated/cloudsearch.js +754 -0
- package/dist/tools/generated/contacts.d.ts +2 -0
- package/dist/tools/generated/contacts.js +215 -0
- package/dist/tools/generated/drive.d.ts +2 -0
- package/dist/tools/generated/drive.js +543 -0
- package/dist/tools/generated/driveactivity.d.ts +2 -0
- package/dist/tools/generated/driveactivity.js +19 -0
- package/dist/tools/generated/drivelabels.d.ts +2 -0
- package/dist/tools/generated/drivelabels.js +389 -0
- package/dist/tools/generated/forms.d.ts +2 -0
- package/dist/tools/generated/forms.js +49 -0
- package/dist/tools/generated/gmail.d.ts +2 -0
- package/dist/tools/generated/gmail.js +835 -0
- package/dist/tools/generated/groupsmigration.d.ts +2 -0
- package/dist/tools/generated/groupsmigration.js +18 -0
- package/dist/tools/generated/groupssettings.d.ts +2 -0
- package/dist/tools/generated/groupssettings.js +47 -0
- package/dist/tools/generated/index.js +50 -0
- package/dist/tools/generated/keep.d.ts +2 -0
- package/dist/tools/generated/keep.js +102 -0
- package/dist/tools/generated/licensing.d.ts +2 -0
- package/dist/tools/generated/licensing.js +116 -0
- package/dist/tools/generated/meet.d.ts +2 -0
- package/dist/tools/generated/meet.js +186 -0
- package/dist/tools/generated/postmaster.d.ts +2 -0
- package/dist/tools/generated/postmaster.js +66 -0
- package/dist/tools/generated/reseller.d.ts +2 -0
- package/dist/tools/generated/reseller.js +249 -0
- package/dist/tools/generated/script.d.ts +2 -0
- package/dist/tools/generated/script.js +249 -0
- package/dist/tools/generated/searchconsole.d.ts +2 -0
- package/dist/tools/generated/searchconsole.js +19 -0
- package/dist/tools/generated/sheets.d.ts +2 -0
- package/dist/tools/generated/sheets.js +105 -0
- package/dist/tools/generated/vault.d.ts +2 -0
- package/dist/tools/generated/vault.js +479 -0
- package/dist/tools/generated/workspaceevents.d.ts +2 -0
- package/dist/tools/generated/workspaceevents.js +223 -0
- package/dist/tools/google-api.js +1 -0
- 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
|
-
- 🧰
|
|
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
|
-
|
|
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',
|
package/dist/discovery-client.js
CHANGED
|
@@ -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: ${
|
|
88
|
-
`Note:
|
|
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
|
+
}>;
|
package/dist/services.js
ADDED
|
@@ -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
|
+
};
|