mcp-google-multi 6.0.0-beta.2 → 6.0.0-beta.3
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/dist/accounts.d.ts +17 -1
- package/dist/accounts.js +52 -15
- package/dist/api-probe.d.ts +5 -0
- package/dist/api-probe.js +20 -15
- package/dist/arg-normalize.js +6 -5
- package/dist/arg-strict.d.ts +7 -0
- package/dist/arg-strict.js +34 -4
- package/dist/auth.d.ts +4 -3
- package/dist/auth.js +11 -13
- package/dist/boot-gates.d.ts +26 -0
- package/dist/boot-gates.js +38 -0
- package/dist/cimd-cache.d.ts +38 -0
- package/dist/cimd-cache.js +117 -0
- package/dist/client.d.ts +32 -2
- package/dist/client.js +0 -0
- package/dist/compose.d.ts +11 -0
- package/dist/compose.js +109 -0
- package/dist/config-file.d.ts +13 -0
- package/dist/config-file.js +37 -1
- package/dist/discover.js +3 -1
- package/dist/discovery-client.d.ts +3 -0
- package/dist/discovery-client.js +25 -2
- package/dist/doctor.d.ts +6 -2
- package/dist/doctor.js +119 -23
- package/dist/executor.d.ts +3 -0
- package/dist/executor.js +4 -2
- package/dist/fanout.d.ts +9 -1
- package/dist/fanout.js +44 -10
- package/dist/fs-atomic.d.ts +11 -0
- package/dist/fs-atomic.js +219 -28
- package/dist/hint-provider.d.ts +129 -0
- package/dist/hint-provider.js +64 -0
- package/dist/http-transport.d.ts +62 -4
- package/dist/http-transport.js +343 -24
- package/dist/identity.d.ts +4 -1
- package/dist/identity.js +25 -6
- package/dist/index.js +66 -138
- package/dist/master-key.js +13 -5
- package/dist/mcp-token.d.ts +136 -19
- package/dist/mcp-token.js +569 -72
- package/dist/migrate-config.js +2 -2
- package/dist/oauth-as.d.ts +103 -3
- package/dist/oauth-as.js +374 -79
- package/dist/oauth-consent.d.ts +10 -0
- package/dist/oauth-consent.js +16 -0
- package/dist/outbound-allowlist.js +5 -2
- package/dist/reauth-hint.d.ts +1 -1
- package/dist/reauth-hint.js +12 -8
- package/dist/registry-transfer.d.ts +5 -0
- package/dist/registry-transfer.js +65 -5
- package/dist/registry.d.ts +18 -1
- package/dist/registry.js +71 -15
- package/dist/scope-catalog.d.ts +11 -0
- package/dist/scope-catalog.js +23 -6
- package/dist/scope-observability.d.ts +8 -6
- package/dist/scope-observability.js +29 -13
- package/dist/services.d.ts +15 -10
- package/dist/services.js +59 -15
- package/dist/ssrf-guard.d.ts +23 -9
- package/dist/ssrf-guard.js +101 -62
- package/dist/tenant-purge.d.ts +26 -0
- package/dist/tenant-purge.js +67 -0
- package/dist/token-store.d.ts +20 -2
- package/dist/token-store.js +0 -0
- package/dist/tools/_errors.d.ts +3 -0
- package/dist/tools/_errors.js +53 -24
- package/dist/tools/_local-files.d.ts +9 -0
- package/dist/tools/_local-files.js +18 -0
- package/dist/tools/account-wizard.d.ts +10 -1
- package/dist/tools/account-wizard.js +74 -17
- package/dist/tools/accounts-tool.d.ts +7 -0
- package/dist/tools/accounts-tool.js +34 -18
- package/dist/tools/admin.d.ts +10 -1
- package/dist/tools/admin.js +15 -11
- package/dist/tools/analytics.d.ts +10 -1
- package/dist/tools/analytics.js +13 -8
- package/dist/tools/calendar.d.ts +2 -1
- package/dist/tools/calendar.js +18 -14
- package/dist/tools/chat.d.ts +10 -1
- package/dist/tools/chat.js +13 -8
- package/dist/tools/contacts.d.ts +2 -1
- package/dist/tools/contacts.js +17 -13
- package/dist/tools/docs.d.ts +2 -1
- package/dist/tools/docs.js +34 -30
- package/dist/tools/drive.d.ts +2 -1
- package/dist/tools/drive.js +65 -50
- package/dist/tools/forms.d.ts +10 -1
- package/dist/tools/forms.js +19 -12
- package/dist/tools/generated/_shared.d.ts +2 -1
- package/dist/tools/generated/_shared.js +7 -3
- package/dist/tools/generated/admin.d.ts +2 -1
- package/dist/tools/generated/admin.js +265 -265
- package/dist/tools/generated/analytics.d.ts +2 -1
- package/dist/tools/generated/analytics.js +125 -125
- package/dist/tools/generated/appsmarket.d.ts +2 -1
- package/dist/tools/generated/appsmarket.js +5 -5
- package/dist/tools/generated/calendar.d.ts +2 -1
- package/dist/tools/generated/calendar.js +55 -55
- package/dist/tools/generated/chat.d.ts +2 -1
- package/dist/tools/generated/chat.js +95 -95
- package/dist/tools/generated/classroom.d.ts +2 -1
- package/dist/tools/generated/classroom.js +209 -209
- package/dist/tools/generated/cloudidentity.d.ts +2 -1
- package/dist/tools/generated/cloudidentity.js +133 -133
- package/dist/tools/generated/cloudsearch.d.ts +2 -1
- package/dist/tools/generated/cloudsearch.js +99 -99
- package/dist/tools/generated/contacts.d.ts +2 -1
- package/dist/tools/generated/contacts.js +29 -29
- package/dist/tools/generated/drive.d.ts +2 -1
- package/dist/tools/generated/drive.js +71 -71
- package/dist/tools/generated/driveactivity.d.ts +2 -1
- package/dist/tools/generated/driveactivity.js +3 -3
- package/dist/tools/generated/drivelabels.d.ts +2 -1
- package/dist/tools/generated/drivelabels.js +53 -53
- package/dist/tools/generated/forms.d.ts +2 -1
- package/dist/tools/generated/forms.js +7 -7
- package/dist/tools/generated/gmail.d.ts +2 -1
- package/dist/tools/generated/gmail.js +117 -117
- package/dist/tools/generated/groupsmigration.d.ts +2 -1
- package/dist/tools/generated/groupsmigration.js +3 -3
- package/dist/tools/generated/groupssettings.d.ts +2 -1
- package/dist/tools/generated/groupssettings.js +7 -7
- package/dist/tools/generated/index.d.ts +2 -1
- package/dist/tools/generated/keep.d.ts +2 -1
- package/dist/tools/generated/keep.js +15 -15
- package/dist/tools/generated/licensing.d.ts +2 -1
- package/dist/tools/generated/licensing.js +15 -15
- package/dist/tools/generated/meet.d.ts +2 -1
- package/dist/tools/generated/meet.js +27 -27
- package/dist/tools/generated/postmaster.d.ts +2 -1
- package/dist/tools/generated/postmaster.js +9 -9
- package/dist/tools/generated/reseller.d.ts +2 -1
- package/dist/tools/generated/reseller.js +35 -35
- package/dist/tools/generated/script.d.ts +2 -1
- package/dist/tools/generated/script.js +33 -33
- package/dist/tools/generated/searchconsole.d.ts +2 -1
- package/dist/tools/generated/searchconsole.js +3 -3
- package/dist/tools/generated/sheets.d.ts +2 -1
- package/dist/tools/generated/sheets.js +15 -15
- package/dist/tools/generated/tasks.d.ts +2 -1
- package/dist/tools/generated/tasks.js +5 -5
- package/dist/tools/generated/vault.d.ts +2 -1
- package/dist/tools/generated/vault.js +67 -67
- package/dist/tools/generated/workspaceevents.d.ts +2 -1
- package/dist/tools/generated/workspaceevents.js +31 -31
- package/dist/tools/gmail.d.ts +2 -1
- package/dist/tools/gmail.js +45 -33
- package/dist/tools/google-api.d.ts +2 -3
- package/dist/tools/google-api.js +30 -16
- package/dist/tools/meet.d.ts +10 -1
- package/dist/tools/meet.js +13 -9
- package/dist/tools/searchconsole.d.ts +2 -1
- package/dist/tools/searchconsole.js +17 -13
- package/dist/tools/sheets.d.ts +2 -1
- package/dist/tools/sheets.js +36 -32
- package/dist/tools/slides.d.ts +10 -1
- package/dist/tools/slides.js +17 -10
- package/dist/tools/tasks.d.ts +2 -1
- package/dist/tools/tasks.js +19 -15
- package/dist/trim.d.ts +5 -0
- package/dist/trim.js +20 -0
- package/dist/usage-metrics.d.ts +23 -0
- package/dist/usage-metrics.js +65 -47
- package/dist/write-control.js +10 -2
- package/package.json +27 -1
package/dist/tools/google-api.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { isAllowed, writeDisabledResult } from '../write-control.js';
|
|
3
|
-
import {
|
|
3
|
+
import { accountArgLive } from '../accounts.js';
|
|
4
4
|
import { getClient } from '../client.js';
|
|
5
5
|
import { coerceJson } from './_coerce.js';
|
|
6
6
|
import { getToolsets, toolsetEnabled } from '../toolsets.js';
|
|
7
|
-
import { editDistance } from '../scope-catalog.js';
|
|
7
|
+
import { editDistance, SUGGEST_MAX_INPUT } from '../scope-catalog.js';
|
|
8
8
|
import { executeApiMethod, jsonResult } from '../executor.js';
|
|
9
|
-
import { SUPPORTED_APIS, resolveApiAliases, cudFromMethod, loadMethodIndex, searchMethods, } from '../discovery-client.js';
|
|
10
|
-
|
|
9
|
+
import { SUPPORTED_APIS, resolveApiAliases, cudFromMethod, loadMethodIndex, searchMethods, MAX_SEARCH_QUERY, } from '../discovery-client.js';
|
|
10
|
+
import { hints } from '../hint-provider.js';
|
|
11
11
|
// Policy/toolset namespace for each API alias must match the NAMED tools' service
|
|
12
12
|
// names, or user deny globs and GOOGLE_TOOLSETS silently miss escape-hatch calls.
|
|
13
13
|
const SERVICE_FOR_ALIAS = {
|
|
@@ -32,12 +32,21 @@ const SERVICE_FOR_ALIAS = {
|
|
|
32
32
|
analyticsadmin: 'analytics',
|
|
33
33
|
analyticsdata: 'analytics',
|
|
34
34
|
};
|
|
35
|
+
/** Discovery ids are short dotted identifiers; the bound keeps a caller from
|
|
36
|
+
* sending megabytes through lookup, suggestion and the echoed message. */
|
|
37
|
+
const MAX_METHOD_ID = 256;
|
|
38
|
+
const MAX_API_ALIAS = 64;
|
|
35
39
|
/** Up to three closest known ids for the unknown_method did-you-mean hint;
|
|
36
40
|
* bounded distance so unrelated ids never masquerade as suggestions. */
|
|
37
41
|
export function nearestMethodIds(methodId, index) {
|
|
42
|
+
if (methodId.length > SUGGEST_MAX_INPUT)
|
|
43
|
+
return [];
|
|
38
44
|
const maxDist = Math.max(3, Math.floor(methodId.length / 3));
|
|
45
|
+
const wanted = methodId.toLowerCase();
|
|
39
46
|
return index
|
|
40
|
-
|
|
47
|
+
// the distance is at least the length gap, so most ids skip the DP
|
|
48
|
+
.filter((m) => Math.abs(m.id.length - wanted.length) <= maxDist)
|
|
49
|
+
.map((m) => ({ id: m.id, d: editDistance(wanted, m.id.toLowerCase()) }))
|
|
41
50
|
.filter((x) => x.d <= maxDist)
|
|
42
51
|
.sort((a, b) => a.d - b.d)
|
|
43
52
|
.slice(0, 3)
|
|
@@ -55,6 +64,8 @@ function describeMethod(m) {
|
|
|
55
64
|
};
|
|
56
65
|
}
|
|
57
66
|
export function registerEscapeTools(registry, policy, deps = {}) {
|
|
67
|
+
// Live per-registry account validation (S1.10), same as the curated files.
|
|
68
|
+
const accountEnum = accountArgLive(() => registry.accountAliases()).optional();
|
|
58
69
|
const getClientFn = deps.getClientFn ?? getClient;
|
|
59
70
|
const toolsets = deps.toolsets ?? getToolsets();
|
|
60
71
|
const serviceForAlias = (alias) => SERVICE_FOR_ALIAS[alias] ?? alias;
|
|
@@ -63,19 +74,22 @@ export function registerEscapeTools(registry, policy, deps = {}) {
|
|
|
63
74
|
};
|
|
64
75
|
const enabledApis = Object.keys(SUPPORTED_APIS).filter(apiEnabled);
|
|
65
76
|
const apiList = enabledApis.join(', ');
|
|
66
|
-
const toolsetDisabled = (alias) =>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
77
|
+
const toolsetDisabled = (alias) => {
|
|
78
|
+
const rendered = hints()?.render({ kind: 'toolset_disabled', api: alias, service: serviceForAlias(alias) });
|
|
79
|
+
return jsonResult({
|
|
80
|
+
error: 'toolset_disabled',
|
|
81
|
+
message: rendered?.message ?? `API "${alias}" maps to service "${serviceForAlias(alias)}", which is excluded by GOOGLE_TOOLSETS.`,
|
|
82
|
+
hint: rendered?.hint ?? 'Add the service to GOOGLE_TOOLSETS (or unset it) to use this API.',
|
|
83
|
+
retriable: false,
|
|
84
|
+
}, true);
|
|
85
|
+
};
|
|
72
86
|
registry.registerMeta('google_api_search', {
|
|
73
87
|
description: 'Search the Google API Discovery index for any Workspace REST method, including ones with no ' +
|
|
74
88
|
'dedicated tool here. Returns method ids + parameters to invoke via google_api_call. ' +
|
|
75
89
|
`APIs: ${apiList}.`,
|
|
76
90
|
inputSchema: {
|
|
77
|
-
query: z.string().describe('Keywords, e.g. "slides create presentation" or "drive revisions"'),
|
|
78
|
-
api: z.string().optional().describe('Restrict the search to one API alias'),
|
|
91
|
+
query: z.string().max(MAX_SEARCH_QUERY).describe('Keywords, e.g. "slides create presentation" or "drive revisions"'),
|
|
92
|
+
api: z.string().max(MAX_API_ALIAS).optional().describe('Restrict the search to one API alias'),
|
|
79
93
|
maxResults: z.number().min(1).max(25).default(10).optional(),
|
|
80
94
|
},
|
|
81
95
|
annotations: { openWorldHint: true },
|
|
@@ -125,8 +139,8 @@ export function registerEscapeTools(registry, policy, deps = {}) {
|
|
|
125
139
|
'drive.files.export) use drive_download / drive_export instead.',
|
|
126
140
|
inputSchema: {
|
|
127
141
|
account: accountEnum.describe('Google account alias (omit for the default account)'),
|
|
128
|
-
api: z.string().describe(`API alias: ${apiList}`),
|
|
129
|
-
methodId: z.string().min(1).describe('Discovery method id, e.g. "drive.revisions.list"'),
|
|
142
|
+
api: z.string().max(MAX_API_ALIAS).describe(`API alias: ${apiList}`),
|
|
143
|
+
methodId: z.string().min(1).max(MAX_METHOD_ID).describe('Discovery method id, e.g. "drive.revisions.list"'),
|
|
130
144
|
pathParams: coerceJson(z.record(z.string(), z.union([z.string(), z.number()])).optional())
|
|
131
145
|
.describe('Values for {placeholders} in the method path'),
|
|
132
146
|
queryParams: coerceJson(z
|
|
@@ -203,6 +217,6 @@ export function registerEscapeTools(registry, policy, deps = {}) {
|
|
|
203
217
|
pathParams: pathParams,
|
|
204
218
|
queryParams: queryParams,
|
|
205
219
|
body,
|
|
206
|
-
}, { getClientFn });
|
|
220
|
+
}, { getClientFn, scopeDeps: deps.scopeDeps });
|
|
207
221
|
});
|
|
208
222
|
}
|
package/dist/tools/meet.d.ts
CHANGED
|
@@ -1,2 +1,11 @@
|
|
|
1
1
|
import type { ToolRegistry } from '../registry.js';
|
|
2
|
-
|
|
2
|
+
import type { Account } from '../accounts.js';
|
|
3
|
+
import { type CuratedToolDeps } from '../client.js';
|
|
4
|
+
export declare function registerMeetTools(server: ToolRegistry, deps?: CuratedToolDeps): void;
|
|
5
|
+
export declare function handleMeetError(error: any, account: Account): {
|
|
6
|
+
content: {
|
|
7
|
+
type: "text";
|
|
8
|
+
text: string;
|
|
9
|
+
}[];
|
|
10
|
+
isError: true;
|
|
11
|
+
};
|
package/dist/tools/meet.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { meet as meetClient } from '@googleapis/meet';
|
|
3
|
-
import {
|
|
3
|
+
import { accountArgLive } from '../accounts.js';
|
|
4
4
|
import { getClient } from '../client.js';
|
|
5
5
|
import { handleGoogleApiError } from './_errors.js';
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
export function registerMeetTools(server, deps = {}) {
|
|
7
|
+
// Per-registry, LIVE account enum + injectable client (S1.10): the
|
|
8
|
+
// schema follows the registry's account view at parse time, and the
|
|
9
|
+
// custody path is the context's, not the process global.
|
|
10
|
+
const accountEnum = accountArgLive(() => server.accountAliases()).optional();
|
|
11
|
+
const getClientFn = deps.getClientFn ?? getClient;
|
|
8
12
|
// ─── Conference records (past meetings) ────────────────────────────────
|
|
9
13
|
server.registerTool('meet_conference_records_list', {
|
|
10
14
|
description: 'List past conference records (completed Meet sessions) the user has access to',
|
|
@@ -16,7 +20,7 @@ export function registerMeetTools(server) {
|
|
|
16
20
|
},
|
|
17
21
|
}, async ({ account, pageSize, pageToken, filter }) => {
|
|
18
22
|
try {
|
|
19
|
-
const auth = await
|
|
23
|
+
const auth = await getClientFn(account);
|
|
20
24
|
const meet = meetClient({ version: 'v2', auth });
|
|
21
25
|
const res = await meet.conferenceRecords.list({
|
|
22
26
|
pageSize: pageSize ?? 20,
|
|
@@ -39,7 +43,7 @@ export function registerMeetTools(server) {
|
|
|
39
43
|
},
|
|
40
44
|
}, async ({ account, name }) => {
|
|
41
45
|
try {
|
|
42
|
-
const auth = await
|
|
46
|
+
const auth = await getClientFn(account);
|
|
43
47
|
const meet = meetClient({ version: 'v2', auth });
|
|
44
48
|
const res = await meet.conferenceRecords.get({ name });
|
|
45
49
|
return {
|
|
@@ -61,7 +65,7 @@ export function registerMeetTools(server) {
|
|
|
61
65
|
},
|
|
62
66
|
}, async ({ account, parent, pageSize, pageToken }) => {
|
|
63
67
|
try {
|
|
64
|
-
const auth = await
|
|
68
|
+
const auth = await getClientFn(account);
|
|
65
69
|
const meet = meetClient({ version: 'v2', auth });
|
|
66
70
|
const res = await meet.conferenceRecords.recordings.list({
|
|
67
71
|
parent,
|
|
@@ -87,7 +91,7 @@ export function registerMeetTools(server) {
|
|
|
87
91
|
},
|
|
88
92
|
}, async ({ account, parent, pageSize, pageToken }) => {
|
|
89
93
|
try {
|
|
90
|
-
const auth = await
|
|
94
|
+
const auth = await getClientFn(account);
|
|
91
95
|
const meet = meetClient({ version: 'v2', auth });
|
|
92
96
|
const res = await meet.conferenceRecords.transcripts.list({
|
|
93
97
|
parent,
|
|
@@ -112,7 +116,7 @@ export function registerMeetTools(server) {
|
|
|
112
116
|
},
|
|
113
117
|
}, async ({ account, parent, pageSize, pageToken }) => {
|
|
114
118
|
try {
|
|
115
|
-
const auth = await
|
|
119
|
+
const auth = await getClientFn(account);
|
|
116
120
|
const meet = meetClient({ version: 'v2', auth });
|
|
117
121
|
const res = await meet.conferenceRecords.transcripts.entries.list({
|
|
118
122
|
parent,
|
|
@@ -128,7 +132,7 @@ export function registerMeetTools(server) {
|
|
|
128
132
|
}
|
|
129
133
|
});
|
|
130
134
|
}
|
|
131
|
-
function handleMeetError(error, account) {
|
|
135
|
+
export function handleMeetError(error, account) {
|
|
132
136
|
return handleGoogleApiError(error, account, {
|
|
133
137
|
scope: 'Meet needs the meetings.space.readonly scope and the Google Meet API enabled in Cloud Console. Confirm both for this account.',
|
|
134
138
|
resource: `Meet denied this conference record to "${account}". Meet exposes records only to the organizer or a participant, so check which account hosted the meeting.`,
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import type { ToolRegistry } from '../registry.js';
|
|
2
|
-
|
|
2
|
+
import { type CuratedToolDeps } from '../client.js';
|
|
3
|
+
export declare function registerSearchConsoleTools(server: ToolRegistry, deps?: CuratedToolDeps): void;
|
|
@@ -2,11 +2,15 @@ import { z } from 'zod';
|
|
|
2
2
|
import { coerceArray, coerceJson } from './_coerce.js';
|
|
3
3
|
import { searchconsole as searchconsoleClient } from '@googleapis/searchconsole';
|
|
4
4
|
import { webmasters as webmastersClient } from '@googleapis/webmasters';
|
|
5
|
-
import {
|
|
5
|
+
import { accountArgLive } from '../accounts.js';
|
|
6
6
|
import { getClient } from '../client.js';
|
|
7
7
|
import { handleGoogleApiError } from './_errors.js';
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
export function registerSearchConsoleTools(server, deps = {}) {
|
|
9
|
+
// Per-registry, LIVE account enum + injectable client (S1.10): the
|
|
10
|
+
// schema follows the registry's account view at parse time, and the
|
|
11
|
+
// custody path is the context's, not the process global.
|
|
12
|
+
const accountEnum = accountArgLive(() => server.accountAliases()).optional();
|
|
13
|
+
const getClientFn = deps.getClientFn ?? getClient;
|
|
10
14
|
// ─── Sites ───────────────────────────────────────────────
|
|
11
15
|
server.registerTool('searchconsole_sites_list', {
|
|
12
16
|
description: 'List all sites (properties) the account has access to in Google Search Console',
|
|
@@ -15,7 +19,7 @@ export function registerSearchConsoleTools(server) {
|
|
|
15
19
|
},
|
|
16
20
|
}, async ({ account }) => {
|
|
17
21
|
try {
|
|
18
|
-
const auth = await
|
|
22
|
+
const auth = await getClientFn(account);
|
|
19
23
|
const wm = webmastersClient({ version: 'v3', auth });
|
|
20
24
|
const res = await wm.sites.list();
|
|
21
25
|
return {
|
|
@@ -34,7 +38,7 @@ export function registerSearchConsoleTools(server) {
|
|
|
34
38
|
},
|
|
35
39
|
}, async ({ account, siteUrl }) => {
|
|
36
40
|
try {
|
|
37
|
-
const auth = await
|
|
41
|
+
const auth = await getClientFn(account);
|
|
38
42
|
const wm = webmastersClient({ version: 'v3', auth });
|
|
39
43
|
const res = await wm.sites.get({ siteUrl });
|
|
40
44
|
return {
|
|
@@ -53,7 +57,7 @@ export function registerSearchConsoleTools(server) {
|
|
|
53
57
|
},
|
|
54
58
|
}, async ({ account, siteUrl }) => {
|
|
55
59
|
try {
|
|
56
|
-
const auth = await
|
|
60
|
+
const auth = await getClientFn(account);
|
|
57
61
|
const wm = webmastersClient({ version: 'v3', auth });
|
|
58
62
|
await wm.sites.add({ siteUrl });
|
|
59
63
|
return {
|
|
@@ -72,7 +76,7 @@ export function registerSearchConsoleTools(server) {
|
|
|
72
76
|
},
|
|
73
77
|
}, async ({ account, siteUrl }) => {
|
|
74
78
|
try {
|
|
75
|
-
const auth = await
|
|
79
|
+
const auth = await getClientFn(account);
|
|
76
80
|
const wm = webmastersClient({ version: 'v3', auth });
|
|
77
81
|
await wm.sites.delete({ siteUrl });
|
|
78
82
|
return {
|
|
@@ -92,7 +96,7 @@ export function registerSearchConsoleTools(server) {
|
|
|
92
96
|
},
|
|
93
97
|
}, async ({ account, siteUrl }) => {
|
|
94
98
|
try {
|
|
95
|
-
const auth = await
|
|
99
|
+
const auth = await getClientFn(account);
|
|
96
100
|
const wm = webmastersClient({ version: 'v3', auth });
|
|
97
101
|
const res = await wm.sitemaps.list({ siteUrl });
|
|
98
102
|
return {
|
|
@@ -112,7 +116,7 @@ export function registerSearchConsoleTools(server) {
|
|
|
112
116
|
},
|
|
113
117
|
}, async ({ account, siteUrl, feedpath }) => {
|
|
114
118
|
try {
|
|
115
|
-
const auth = await
|
|
119
|
+
const auth = await getClientFn(account);
|
|
116
120
|
const wm = webmastersClient({ version: 'v3', auth });
|
|
117
121
|
const res = await wm.sitemaps.get({ siteUrl, feedpath });
|
|
118
122
|
return {
|
|
@@ -132,7 +136,7 @@ export function registerSearchConsoleTools(server) {
|
|
|
132
136
|
},
|
|
133
137
|
}, async ({ account, siteUrl, feedpath }) => {
|
|
134
138
|
try {
|
|
135
|
-
const auth = await
|
|
139
|
+
const auth = await getClientFn(account);
|
|
136
140
|
const wm = webmastersClient({ version: 'v3', auth });
|
|
137
141
|
await wm.sitemaps.submit({ siteUrl, feedpath });
|
|
138
142
|
return {
|
|
@@ -152,7 +156,7 @@ export function registerSearchConsoleTools(server) {
|
|
|
152
156
|
},
|
|
153
157
|
}, async ({ account, siteUrl, feedpath }) => {
|
|
154
158
|
try {
|
|
155
|
-
const auth = await
|
|
159
|
+
const auth = await getClientFn(account);
|
|
156
160
|
const wm = webmastersClient({ version: 'v3', auth });
|
|
157
161
|
await wm.sitemaps.delete({ siteUrl, feedpath });
|
|
158
162
|
return {
|
|
@@ -195,7 +199,7 @@ export function registerSearchConsoleTools(server) {
|
|
|
195
199
|
},
|
|
196
200
|
}, async ({ account, siteUrl, startDate, endDate, dimensions, type, dimensionFilterGroups, rowLimit, startRow, aggregationType, dataState }) => {
|
|
197
201
|
try {
|
|
198
|
-
const auth = await
|
|
202
|
+
const auth = await getClientFn(account);
|
|
199
203
|
const wm = webmastersClient({ version: 'v3', auth });
|
|
200
204
|
const requestBody = { startDate, endDate };
|
|
201
205
|
if (dimensions)
|
|
@@ -237,7 +241,7 @@ export function registerSearchConsoleTools(server) {
|
|
|
237
241
|
},
|
|
238
242
|
}, async ({ account, siteUrl, inspectionUrl, languageCode }) => {
|
|
239
243
|
try {
|
|
240
|
-
const auth = await
|
|
244
|
+
const auth = await getClientFn(account);
|
|
241
245
|
const searchconsole = searchconsoleClient({ version: 'v1', auth });
|
|
242
246
|
const res = await searchconsole.urlInspection.index.inspect({
|
|
243
247
|
requestBody: {
|
package/dist/tools/sheets.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ToolRegistry } from '../registry.js';
|
|
2
|
-
|
|
2
|
+
import { type CuratedToolDeps } from '../client.js';
|
|
3
|
+
export declare function registerSheetsTools(server: ToolRegistry, deps?: CuratedToolDeps): void;
|
|
3
4
|
export declare function buildCellFormat(input: {
|
|
4
5
|
backgroundColor?: {
|
|
5
6
|
red?: number;
|
package/dist/tools/sheets.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { coerceArray, coerceBoolean, coerceJson } from './_coerce.js';
|
|
3
3
|
import { sheets as sheetsClient } from '@googleapis/sheets';
|
|
4
|
-
import {
|
|
4
|
+
import { accountArgLive } from '../accounts.js';
|
|
5
5
|
import { getClient } from '../client.js';
|
|
6
6
|
import { handleGoogleApiError, invalidParams } from './_errors.js';
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
export function registerSheetsTools(server, deps = {}) {
|
|
8
|
+
// Per-registry, LIVE account enum + injectable client (S1.10): the
|
|
9
|
+
// schema follows the registry's account view at parse time, and the
|
|
10
|
+
// custody path is the context's, not the process global.
|
|
11
|
+
const accountEnum = accountArgLive(() => server.accountAliases()).optional();
|
|
12
|
+
const getClientFn = deps.getClientFn ?? getClient;
|
|
9
13
|
server.registerTool('sheets_create', {
|
|
10
14
|
description: 'Create a new Google Sheets spreadsheet',
|
|
11
15
|
inputSchema: {
|
|
@@ -16,7 +20,7 @@ export function registerSheetsTools(server) {
|
|
|
16
20
|
},
|
|
17
21
|
}, async ({ account, title, sheetTitles }) => {
|
|
18
22
|
try {
|
|
19
|
-
const auth = await
|
|
23
|
+
const auth = await getClientFn(account);
|
|
20
24
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
21
25
|
const requestBody = {
|
|
22
26
|
properties: { title },
|
|
@@ -48,7 +52,7 @@ export function registerSheetsTools(server) {
|
|
|
48
52
|
},
|
|
49
53
|
}, async ({ account, spreadsheetId }) => {
|
|
50
54
|
try {
|
|
51
|
-
const auth = await
|
|
55
|
+
const auth = await getClientFn(account);
|
|
52
56
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
53
57
|
const res = await sheets.spreadsheets.get({
|
|
54
58
|
spreadsheetId,
|
|
@@ -85,7 +89,7 @@ export function registerSheetsTools(server) {
|
|
|
85
89
|
},
|
|
86
90
|
}, async ({ account, spreadsheetId, range, valueRenderOption }) => {
|
|
87
91
|
try {
|
|
88
|
-
const auth = await
|
|
92
|
+
const auth = await getClientFn(account);
|
|
89
93
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
90
94
|
const res = await sheets.spreadsheets.values.get({
|
|
91
95
|
spreadsheetId,
|
|
@@ -115,7 +119,7 @@ export function registerSheetsTools(server) {
|
|
|
115
119
|
},
|
|
116
120
|
}, async ({ account, spreadsheetId, range, values, valueInputOption }) => {
|
|
117
121
|
try {
|
|
118
|
-
const auth = await
|
|
122
|
+
const auth = await getClientFn(account);
|
|
119
123
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
120
124
|
const res = await sheets.spreadsheets.values.update({
|
|
121
125
|
spreadsheetId,
|
|
@@ -148,7 +152,7 @@ export function registerSheetsTools(server) {
|
|
|
148
152
|
},
|
|
149
153
|
}, async ({ account, spreadsheetId, range, values, valueInputOption }) => {
|
|
150
154
|
try {
|
|
151
|
-
const auth = await
|
|
155
|
+
const auth = await getClientFn(account);
|
|
152
156
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
153
157
|
const res = await sheets.spreadsheets.values.append({
|
|
154
158
|
spreadsheetId,
|
|
@@ -179,7 +183,7 @@ export function registerSheetsTools(server) {
|
|
|
179
183
|
},
|
|
180
184
|
}, async ({ account, spreadsheetId, range }) => {
|
|
181
185
|
try {
|
|
182
|
-
const auth = await
|
|
186
|
+
const auth = await getClientFn(account);
|
|
183
187
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
184
188
|
const res = await sheets.spreadsheets.values.clear({
|
|
185
189
|
spreadsheetId,
|
|
@@ -208,7 +212,7 @@ export function registerSheetsTools(server) {
|
|
|
208
212
|
},
|
|
209
213
|
}, async ({ account, spreadsheetId, ranges, valueRenderOption }) => {
|
|
210
214
|
try {
|
|
211
|
-
const auth = await
|
|
215
|
+
const auth = await getClientFn(account);
|
|
212
216
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
213
217
|
const res = await sheets.spreadsheets.values.batchGet({
|
|
214
218
|
spreadsheetId,
|
|
@@ -241,7 +245,7 @@ export function registerSheetsTools(server) {
|
|
|
241
245
|
},
|
|
242
246
|
}, async ({ account, spreadsheetId, data, valueInputOption }) => {
|
|
243
247
|
try {
|
|
244
|
-
const auth = await
|
|
248
|
+
const auth = await getClientFn(account);
|
|
245
249
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
246
250
|
const res = await sheets.spreadsheets.values.batchUpdate({
|
|
247
251
|
spreadsheetId,
|
|
@@ -277,7 +281,7 @@ export function registerSheetsTools(server) {
|
|
|
277
281
|
},
|
|
278
282
|
}, async ({ account, spreadsheetId, title, rowCount, columnCount }) => {
|
|
279
283
|
try {
|
|
280
|
-
const auth = await
|
|
284
|
+
const auth = await getClientFn(account);
|
|
281
285
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
282
286
|
const res = await sheets.spreadsheets.batchUpdate({
|
|
283
287
|
spreadsheetId,
|
|
@@ -318,7 +322,7 @@ export function registerSheetsTools(server) {
|
|
|
318
322
|
},
|
|
319
323
|
}, async ({ account, spreadsheetId, sheetId }) => {
|
|
320
324
|
try {
|
|
321
|
-
const auth = await
|
|
325
|
+
const auth = await getClientFn(account);
|
|
322
326
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
323
327
|
await sheets.spreadsheets.batchUpdate({
|
|
324
328
|
spreadsheetId,
|
|
@@ -343,7 +347,7 @@ export function registerSheetsTools(server) {
|
|
|
343
347
|
},
|
|
344
348
|
}, async ({ account, spreadsheetId, sourceSheetId, newSheetName, insertSheetIndex }) => {
|
|
345
349
|
try {
|
|
346
|
-
const auth = await
|
|
350
|
+
const auth = await getClientFn(account);
|
|
347
351
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
348
352
|
const res = await sheets.spreadsheets.batchUpdate({
|
|
349
353
|
spreadsheetId,
|
|
@@ -383,7 +387,7 @@ export function registerSheetsTools(server) {
|
|
|
383
387
|
},
|
|
384
388
|
}, async ({ account, spreadsheetId, sheetId, title, index, hidden, tabColor, frozenRowCount, frozenColumnCount, rowCount, columnCount }) => {
|
|
385
389
|
try {
|
|
386
|
-
const auth = await
|
|
390
|
+
const auth = await getClientFn(account);
|
|
387
391
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
388
392
|
const properties = { sheetId };
|
|
389
393
|
const fields = [];
|
|
@@ -475,7 +479,7 @@ export function registerSheetsTools(server) {
|
|
|
475
479
|
},
|
|
476
480
|
}, async ({ account, spreadsheetId, range, ...format }) => {
|
|
477
481
|
try {
|
|
478
|
-
const auth = await
|
|
482
|
+
const auth = await getClientFn(account);
|
|
479
483
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
480
484
|
const built = buildCellFormat(format);
|
|
481
485
|
if (built.fields.length === 0) {
|
|
@@ -516,7 +520,7 @@ export function registerSheetsTools(server) {
|
|
|
516
520
|
},
|
|
517
521
|
}, async ({ account, spreadsheetId, range, top, bottom, left, right, innerHorizontal, innerVertical }) => {
|
|
518
522
|
try {
|
|
519
|
-
const auth = await
|
|
523
|
+
const auth = await getClientFn(account);
|
|
520
524
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
521
525
|
const borders = { range };
|
|
522
526
|
if (top)
|
|
@@ -556,7 +560,7 @@ export function registerSheetsTools(server) {
|
|
|
556
560
|
},
|
|
557
561
|
}, async ({ account, spreadsheetId, range, mergeType }) => {
|
|
558
562
|
try {
|
|
559
|
-
const auth = await
|
|
563
|
+
const auth = await getClientFn(account);
|
|
560
564
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
561
565
|
await sheets.spreadsheets.batchUpdate({
|
|
562
566
|
spreadsheetId,
|
|
@@ -581,7 +585,7 @@ export function registerSheetsTools(server) {
|
|
|
581
585
|
},
|
|
582
586
|
}, async ({ account, spreadsheetId, range }) => {
|
|
583
587
|
try {
|
|
584
|
-
const auth = await
|
|
588
|
+
const auth = await getClientFn(account);
|
|
585
589
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
586
590
|
await sheets.spreadsheets.batchUpdate({
|
|
587
591
|
spreadsheetId,
|
|
@@ -628,7 +632,7 @@ export function registerSheetsTools(server) {
|
|
|
628
632
|
if (!booleanRule && !gradientRule) {
|
|
629
633
|
return invalidParams(account, 'A conditional format rule needs a rule body: neither booleanRule nor gradientRule was supplied.', 'Pass booleanRule for a condition-based rule, or gradientRule for a color scale.');
|
|
630
634
|
}
|
|
631
|
-
const auth = await
|
|
635
|
+
const auth = await getClientFn(account);
|
|
632
636
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
633
637
|
const rule = { ranges };
|
|
634
638
|
if (booleanRule) {
|
|
@@ -692,7 +696,7 @@ export function registerSheetsTools(server) {
|
|
|
692
696
|
},
|
|
693
697
|
}, async ({ account, spreadsheetId, range, sortSpecs }) => {
|
|
694
698
|
try {
|
|
695
|
-
const auth = await
|
|
699
|
+
const auth = await getClientFn(account);
|
|
696
700
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
697
701
|
await sheets.spreadsheets.batchUpdate({
|
|
698
702
|
spreadsheetId,
|
|
@@ -724,7 +728,7 @@ export function registerSheetsTools(server) {
|
|
|
724
728
|
},
|
|
725
729
|
}, async ({ account, spreadsheetId, range, sortSpecs, filterSpecs }) => {
|
|
726
730
|
try {
|
|
727
|
-
const auth = await
|
|
731
|
+
const auth = await getClientFn(account);
|
|
728
732
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
729
733
|
const filter = { range };
|
|
730
734
|
if (sortSpecs)
|
|
@@ -766,7 +770,7 @@ export function registerSheetsTools(server) {
|
|
|
766
770
|
},
|
|
767
771
|
}, async ({ account, spreadsheetId, sheetId }) => {
|
|
768
772
|
try {
|
|
769
|
-
const auth = await
|
|
773
|
+
const auth = await getClientFn(account);
|
|
770
774
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
771
775
|
await sheets.spreadsheets.batchUpdate({
|
|
772
776
|
spreadsheetId,
|
|
@@ -799,7 +803,7 @@ export function registerSheetsTools(server) {
|
|
|
799
803
|
},
|
|
800
804
|
}, async ({ account, spreadsheetId, find, replacement, scope, sheetId, range, matchCase, matchEntireCell, searchByRegex, includeFormulas }) => {
|
|
801
805
|
try {
|
|
802
|
-
const auth = await
|
|
806
|
+
const auth = await getClientFn(account);
|
|
803
807
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
804
808
|
const findReplace = {
|
|
805
809
|
find,
|
|
@@ -855,7 +859,7 @@ export function registerSheetsTools(server) {
|
|
|
855
859
|
},
|
|
856
860
|
}, async ({ account, spreadsheetId, sheetId, dimension, startIndex, endIndex }) => {
|
|
857
861
|
try {
|
|
858
|
-
const auth = await
|
|
862
|
+
const auth = await getClientFn(account);
|
|
859
863
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
860
864
|
const dimensions = { sheetId, dimension };
|
|
861
865
|
if (startIndex !== undefined)
|
|
@@ -887,7 +891,7 @@ export function registerSheetsTools(server) {
|
|
|
887
891
|
},
|
|
888
892
|
}, async ({ account, spreadsheetId, sheetId, dimension, startIndex, endIndex, inheritFromBefore }) => {
|
|
889
893
|
try {
|
|
890
|
-
const auth = await
|
|
894
|
+
const auth = await getClientFn(account);
|
|
891
895
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
892
896
|
await sheets.spreadsheets.batchUpdate({
|
|
893
897
|
spreadsheetId,
|
|
@@ -920,7 +924,7 @@ export function registerSheetsTools(server) {
|
|
|
920
924
|
},
|
|
921
925
|
}, async ({ account, spreadsheetId, sheetId, dimension, startIndex, endIndex }) => {
|
|
922
926
|
try {
|
|
923
|
-
const auth = await
|
|
927
|
+
const auth = await getClientFn(account);
|
|
924
928
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
925
929
|
await sheets.spreadsheets.batchUpdate({
|
|
926
930
|
spreadsheetId,
|
|
@@ -955,7 +959,7 @@ export function registerSheetsTools(server) {
|
|
|
955
959
|
},
|
|
956
960
|
}, async ({ account, spreadsheetId, range, conditionType, conditionValues, inputMessage, strict, showCustomUi }) => {
|
|
957
961
|
try {
|
|
958
|
-
const auth = await
|
|
962
|
+
const auth = await getClientFn(account);
|
|
959
963
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
960
964
|
const rule = {
|
|
961
965
|
condition: {
|
|
@@ -993,7 +997,7 @@ export function registerSheetsTools(server) {
|
|
|
993
997
|
},
|
|
994
998
|
}, async ({ account, spreadsheetId, name, range }) => {
|
|
995
999
|
try {
|
|
996
|
-
const auth = await
|
|
1000
|
+
const auth = await getClientFn(account);
|
|
997
1001
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
998
1002
|
const res = await sheets.spreadsheets.batchUpdate({
|
|
999
1003
|
spreadsheetId,
|
|
@@ -1019,7 +1023,7 @@ export function registerSheetsTools(server) {
|
|
|
1019
1023
|
},
|
|
1020
1024
|
}, async ({ account, spreadsheetId, namedRangeId }) => {
|
|
1021
1025
|
try {
|
|
1022
|
-
const auth = await
|
|
1026
|
+
const auth = await getClientFn(account);
|
|
1023
1027
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
1024
1028
|
await sheets.spreadsheets.batchUpdate({
|
|
1025
1029
|
spreadsheetId,
|
|
@@ -1043,7 +1047,7 @@ export function registerSheetsTools(server) {
|
|
|
1043
1047
|
},
|
|
1044
1048
|
}, async ({ account, spreadsheetId, ranges }) => {
|
|
1045
1049
|
try {
|
|
1046
|
-
const auth = await
|
|
1050
|
+
const auth = await getClientFn(account);
|
|
1047
1051
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
1048
1052
|
const res = await sheets.spreadsheets.values.batchClear({
|
|
1049
1053
|
spreadsheetId,
|
|
@@ -1073,7 +1077,7 @@ export function registerSheetsTools(server) {
|
|
|
1073
1077
|
},
|
|
1074
1078
|
}, async ({ account, spreadsheetId, requests, includeSpreadsheetInResponse, responseRanges, responseIncludeGridData }) => {
|
|
1075
1079
|
try {
|
|
1076
|
-
const auth = await
|
|
1080
|
+
const auth = await getClientFn(account);
|
|
1077
1081
|
const sheets = sheetsClient({ version: 'v4', auth });
|
|
1078
1082
|
const res = await sheets.spreadsheets.batchUpdate({
|
|
1079
1083
|
spreadsheetId,
|
package/dist/tools/slides.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { ToolRegistry } from '../registry.js';
|
|
2
|
-
|
|
2
|
+
import type { Account } from '../accounts.js';
|
|
3
|
+
import { type CuratedToolDeps } from '../client.js';
|
|
4
|
+
export declare function registerSlidesTools(server: ToolRegistry, deps?: CuratedToolDeps): void;
|
|
3
5
|
export declare function extractPageText(elements: Array<Record<string, any>> | undefined): string;
|
|
4
6
|
export declare function summarizePresentation(p: Record<string, any>): Record<string, unknown>;
|
|
7
|
+
export declare function handleSlidesError(error: any, account: Account): {
|
|
8
|
+
content: {
|
|
9
|
+
type: "text";
|
|
10
|
+
text: string;
|
|
11
|
+
}[];
|
|
12
|
+
isError: true;
|
|
13
|
+
};
|