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.
Files changed (165) hide show
  1. package/dist/accounts.d.ts +17 -1
  2. package/dist/accounts.js +52 -15
  3. package/dist/api-probe.d.ts +5 -0
  4. package/dist/api-probe.js +20 -15
  5. package/dist/arg-normalize.js +6 -5
  6. package/dist/arg-strict.d.ts +7 -0
  7. package/dist/arg-strict.js +34 -4
  8. package/dist/auth.d.ts +4 -3
  9. package/dist/auth.js +11 -13
  10. package/dist/boot-gates.d.ts +26 -0
  11. package/dist/boot-gates.js +38 -0
  12. package/dist/cimd-cache.d.ts +38 -0
  13. package/dist/cimd-cache.js +117 -0
  14. package/dist/client.d.ts +32 -2
  15. package/dist/client.js +0 -0
  16. package/dist/compose.d.ts +11 -0
  17. package/dist/compose.js +109 -0
  18. package/dist/config-file.d.ts +13 -0
  19. package/dist/config-file.js +37 -1
  20. package/dist/discover.js +3 -1
  21. package/dist/discovery-client.d.ts +3 -0
  22. package/dist/discovery-client.js +25 -2
  23. package/dist/doctor.d.ts +6 -2
  24. package/dist/doctor.js +119 -23
  25. package/dist/executor.d.ts +3 -0
  26. package/dist/executor.js +4 -2
  27. package/dist/fanout.d.ts +9 -1
  28. package/dist/fanout.js +44 -10
  29. package/dist/fs-atomic.d.ts +11 -0
  30. package/dist/fs-atomic.js +219 -28
  31. package/dist/hint-provider.d.ts +129 -0
  32. package/dist/hint-provider.js +64 -0
  33. package/dist/http-transport.d.ts +62 -4
  34. package/dist/http-transport.js +343 -24
  35. package/dist/identity.d.ts +4 -1
  36. package/dist/identity.js +25 -6
  37. package/dist/index.js +66 -138
  38. package/dist/master-key.js +13 -5
  39. package/dist/mcp-token.d.ts +136 -19
  40. package/dist/mcp-token.js +569 -72
  41. package/dist/migrate-config.js +2 -2
  42. package/dist/oauth-as.d.ts +103 -3
  43. package/dist/oauth-as.js +374 -79
  44. package/dist/oauth-consent.d.ts +10 -0
  45. package/dist/oauth-consent.js +16 -0
  46. package/dist/outbound-allowlist.js +5 -2
  47. package/dist/reauth-hint.d.ts +1 -1
  48. package/dist/reauth-hint.js +12 -8
  49. package/dist/registry-transfer.d.ts +5 -0
  50. package/dist/registry-transfer.js +65 -5
  51. package/dist/registry.d.ts +18 -1
  52. package/dist/registry.js +71 -15
  53. package/dist/scope-catalog.d.ts +11 -0
  54. package/dist/scope-catalog.js +23 -6
  55. package/dist/scope-observability.d.ts +8 -6
  56. package/dist/scope-observability.js +29 -13
  57. package/dist/services.d.ts +15 -10
  58. package/dist/services.js +59 -15
  59. package/dist/ssrf-guard.d.ts +23 -9
  60. package/dist/ssrf-guard.js +101 -62
  61. package/dist/tenant-purge.d.ts +26 -0
  62. package/dist/tenant-purge.js +67 -0
  63. package/dist/token-store.d.ts +20 -2
  64. package/dist/token-store.js +0 -0
  65. package/dist/tools/_errors.d.ts +3 -0
  66. package/dist/tools/_errors.js +53 -24
  67. package/dist/tools/_local-files.d.ts +9 -0
  68. package/dist/tools/_local-files.js +18 -0
  69. package/dist/tools/account-wizard.d.ts +10 -1
  70. package/dist/tools/account-wizard.js +74 -17
  71. package/dist/tools/accounts-tool.d.ts +7 -0
  72. package/dist/tools/accounts-tool.js +34 -18
  73. package/dist/tools/admin.d.ts +10 -1
  74. package/dist/tools/admin.js +15 -11
  75. package/dist/tools/analytics.d.ts +10 -1
  76. package/dist/tools/analytics.js +13 -8
  77. package/dist/tools/calendar.d.ts +2 -1
  78. package/dist/tools/calendar.js +18 -14
  79. package/dist/tools/chat.d.ts +10 -1
  80. package/dist/tools/chat.js +13 -8
  81. package/dist/tools/contacts.d.ts +2 -1
  82. package/dist/tools/contacts.js +17 -13
  83. package/dist/tools/docs.d.ts +2 -1
  84. package/dist/tools/docs.js +34 -30
  85. package/dist/tools/drive.d.ts +2 -1
  86. package/dist/tools/drive.js +65 -50
  87. package/dist/tools/forms.d.ts +10 -1
  88. package/dist/tools/forms.js +19 -12
  89. package/dist/tools/generated/_shared.d.ts +2 -1
  90. package/dist/tools/generated/_shared.js +7 -3
  91. package/dist/tools/generated/admin.d.ts +2 -1
  92. package/dist/tools/generated/admin.js +265 -265
  93. package/dist/tools/generated/analytics.d.ts +2 -1
  94. package/dist/tools/generated/analytics.js +125 -125
  95. package/dist/tools/generated/appsmarket.d.ts +2 -1
  96. package/dist/tools/generated/appsmarket.js +5 -5
  97. package/dist/tools/generated/calendar.d.ts +2 -1
  98. package/dist/tools/generated/calendar.js +55 -55
  99. package/dist/tools/generated/chat.d.ts +2 -1
  100. package/dist/tools/generated/chat.js +95 -95
  101. package/dist/tools/generated/classroom.d.ts +2 -1
  102. package/dist/tools/generated/classroom.js +209 -209
  103. package/dist/tools/generated/cloudidentity.d.ts +2 -1
  104. package/dist/tools/generated/cloudidentity.js +133 -133
  105. package/dist/tools/generated/cloudsearch.d.ts +2 -1
  106. package/dist/tools/generated/cloudsearch.js +99 -99
  107. package/dist/tools/generated/contacts.d.ts +2 -1
  108. package/dist/tools/generated/contacts.js +29 -29
  109. package/dist/tools/generated/drive.d.ts +2 -1
  110. package/dist/tools/generated/drive.js +71 -71
  111. package/dist/tools/generated/driveactivity.d.ts +2 -1
  112. package/dist/tools/generated/driveactivity.js +3 -3
  113. package/dist/tools/generated/drivelabels.d.ts +2 -1
  114. package/dist/tools/generated/drivelabels.js +53 -53
  115. package/dist/tools/generated/forms.d.ts +2 -1
  116. package/dist/tools/generated/forms.js +7 -7
  117. package/dist/tools/generated/gmail.d.ts +2 -1
  118. package/dist/tools/generated/gmail.js +117 -117
  119. package/dist/tools/generated/groupsmigration.d.ts +2 -1
  120. package/dist/tools/generated/groupsmigration.js +3 -3
  121. package/dist/tools/generated/groupssettings.d.ts +2 -1
  122. package/dist/tools/generated/groupssettings.js +7 -7
  123. package/dist/tools/generated/index.d.ts +2 -1
  124. package/dist/tools/generated/keep.d.ts +2 -1
  125. package/dist/tools/generated/keep.js +15 -15
  126. package/dist/tools/generated/licensing.d.ts +2 -1
  127. package/dist/tools/generated/licensing.js +15 -15
  128. package/dist/tools/generated/meet.d.ts +2 -1
  129. package/dist/tools/generated/meet.js +27 -27
  130. package/dist/tools/generated/postmaster.d.ts +2 -1
  131. package/dist/tools/generated/postmaster.js +9 -9
  132. package/dist/tools/generated/reseller.d.ts +2 -1
  133. package/dist/tools/generated/reseller.js +35 -35
  134. package/dist/tools/generated/script.d.ts +2 -1
  135. package/dist/tools/generated/script.js +33 -33
  136. package/dist/tools/generated/searchconsole.d.ts +2 -1
  137. package/dist/tools/generated/searchconsole.js +3 -3
  138. package/dist/tools/generated/sheets.d.ts +2 -1
  139. package/dist/tools/generated/sheets.js +15 -15
  140. package/dist/tools/generated/tasks.d.ts +2 -1
  141. package/dist/tools/generated/tasks.js +5 -5
  142. package/dist/tools/generated/vault.d.ts +2 -1
  143. package/dist/tools/generated/vault.js +67 -67
  144. package/dist/tools/generated/workspaceevents.d.ts +2 -1
  145. package/dist/tools/generated/workspaceevents.js +31 -31
  146. package/dist/tools/gmail.d.ts +2 -1
  147. package/dist/tools/gmail.js +45 -33
  148. package/dist/tools/google-api.d.ts +2 -3
  149. package/dist/tools/google-api.js +30 -16
  150. package/dist/tools/meet.d.ts +10 -1
  151. package/dist/tools/meet.js +13 -9
  152. package/dist/tools/searchconsole.d.ts +2 -1
  153. package/dist/tools/searchconsole.js +17 -13
  154. package/dist/tools/sheets.d.ts +2 -1
  155. package/dist/tools/sheets.js +36 -32
  156. package/dist/tools/slides.d.ts +10 -1
  157. package/dist/tools/slides.js +17 -10
  158. package/dist/tools/tasks.d.ts +2 -1
  159. package/dist/tools/tasks.js +19 -15
  160. package/dist/trim.d.ts +5 -0
  161. package/dist/trim.js +20 -0
  162. package/dist/usage-metrics.d.ts +23 -0
  163. package/dist/usage-metrics.js +65 -47
  164. package/dist/write-control.js +10 -2
  165. package/package.json +27 -1
@@ -1,13 +1,13 @@
1
1
  import { z } from 'zod';
2
2
  import { isAllowed, writeDisabledResult } from '../write-control.js';
3
- import { accountAliasSchema } from '../accounts.js';
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
- const accountEnum = accountAliasSchema.optional();
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
- .map((m) => ({ id: m.id, d: editDistance(methodId.toLowerCase(), m.id.toLowerCase()) }))
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) => jsonResult({
67
- error: 'toolset_disabled',
68
- message: `API "${alias}" maps to service "${serviceForAlias(alias)}", which is excluded by GOOGLE_TOOLSETS.`,
69
- hint: 'Add the service to GOOGLE_TOOLSETS (or unset it) to use this API.',
70
- retriable: false,
71
- }, true);
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
  }
@@ -1,2 +1,11 @@
1
1
  import type { ToolRegistry } from '../registry.js';
2
- export declare function registerMeetTools(server: ToolRegistry): void;
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
+ };
@@ -1,10 +1,14 @@
1
1
  import { z } from 'zod';
2
2
  import { meet as meetClient } from '@googleapis/meet';
3
- import { accountAliasSchema } from '../accounts.js';
3
+ import { accountArgLive } from '../accounts.js';
4
4
  import { getClient } from '../client.js';
5
5
  import { handleGoogleApiError } from './_errors.js';
6
- const accountEnum = accountAliasSchema.optional();
7
- export function registerMeetTools(server) {
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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
- export declare function registerSearchConsoleTools(server: ToolRegistry): void;
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 { accountAliasSchema } from '../accounts.js';
5
+ import { accountArgLive } from '../accounts.js';
6
6
  import { getClient } from '../client.js';
7
7
  import { handleGoogleApiError } from './_errors.js';
8
- const accountEnum = accountAliasSchema.optional();
9
- export function registerSearchConsoleTools(server) {
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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: {
@@ -1,5 +1,6 @@
1
1
  import type { ToolRegistry } from '../registry.js';
2
- export declare function registerSheetsTools(server: ToolRegistry): void;
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;
@@ -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 { accountAliasSchema } from '../accounts.js';
4
+ import { accountArgLive } from '../accounts.js';
5
5
  import { getClient } from '../client.js';
6
6
  import { handleGoogleApiError, invalidParams } from './_errors.js';
7
- const accountEnum = accountAliasSchema.optional();
8
- export function registerSheetsTools(server) {
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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 getClient(account);
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,
@@ -1,4 +1,13 @@
1
1
  import type { ToolRegistry } from '../registry.js';
2
- export declare function registerSlidesTools(server: ToolRegistry): void;
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
+ };