gogcli-mcp-docs 4.7.0 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +3 -3
- package/dist/index.js +129 -99
- package/manifest.json +23 -2
- package/mint.yaml +1 -1
- package/package.json +3 -3
- package/server.json +20 -2
- package/src/tools/docs-extra.ts +73 -71
- package/tests/tool-annotations.test.ts +10 -0
- package/tests/tools/docs-extra.test.ts +7 -7
package/dist/index.js
CHANGED
|
@@ -19790,7 +19790,7 @@ function date4(params) {
|
|
|
19790
19790
|
return _coercedDate(ZodDate, params);
|
|
19791
19791
|
}
|
|
19792
19792
|
|
|
19793
|
-
// ../../node_modules/@modelcontextprotocol/core/dist/auth-BNDyLTqp.mjs
|
|
19793
|
+
// ../../node_modules/@modelcontextprotocol/server/node_modules/@modelcontextprotocol/core/dist/auth-BNDyLTqp.mjs
|
|
19794
19794
|
var LATEST_PROTOCOL_VERSION = "2025-11-25";
|
|
19795
19795
|
var SUPPORTED_PROTOCOL_VERSIONS = [
|
|
19796
19796
|
LATEST_PROTOCOL_VERSION,
|
|
@@ -34537,11 +34537,19 @@ var DEFAULT_MAX_REQUEST_BODY_SIZE = 4 * 1024 * 1024;
|
|
|
34537
34537
|
var McpToolError = class extends Error {
|
|
34538
34538
|
/** Actionable remediation text, when one applies. */
|
|
34539
34539
|
hint;
|
|
34540
|
+
/** The upstream HTTP status this failure came from, when known. */
|
|
34541
|
+
status;
|
|
34542
|
+
/** What kind of failure this is, when the thrower knows. */
|
|
34543
|
+
kind;
|
|
34540
34544
|
constructor(message, opts) {
|
|
34541
34545
|
super(message, opts?.cause !== void 0 ? { cause: opts.cause } : void 0);
|
|
34542
34546
|
this.name = "McpToolError";
|
|
34543
34547
|
if (opts?.hint !== void 0)
|
|
34544
34548
|
this.hint = opts.hint;
|
|
34549
|
+
if (opts?.status !== void 0)
|
|
34550
|
+
this.status = opts.status;
|
|
34551
|
+
if (opts?.kind !== void 0)
|
|
34552
|
+
this.kind = opts.kind;
|
|
34545
34553
|
Object.setPrototypeOf(this, new.target.prototype);
|
|
34546
34554
|
}
|
|
34547
34555
|
};
|
|
@@ -34566,7 +34574,7 @@ var API_KEY_RE = new RegExp([
|
|
|
34566
34574
|
// webhook signing secret (Stripe-style)
|
|
34567
34575
|
].map((p) => `\\b${p}`).join("|"), "g");
|
|
34568
34576
|
var GOOGLE_OAUTH_TOKEN_RE = /(?<![A-Za-z0-9+/])(?:ya29\.|1\/\/)[A-Za-z0-9._-]{8,}/g;
|
|
34569
|
-
var QUERY_SECRET_RE = new RegExp(`([?&](?:(?:access|refresh|id|auth|session|csrf|xsrf)[_-]?token|client[_-]?secret|api[_-]?secret|api[_-]?key|password|passwd|signature|token|key|sig|(?:php|j)?sess(?:ion)?[_-]?id|sid|x[-_]${HEADER_NAME_RUN}?(?:api[-_]?key|token|secret|auth)${HEADER_NAME_RUN})=)[^&#\\s"'<>\`]+`, "gi");
|
|
34577
|
+
var QUERY_SECRET_RE = new RegExp(`([?&](?:(?:access|refresh|id|auth|session|csrf|xsrf)[_-]?token|client[_-]?secret|api[_-]?secret|api[_-]?key|password|passwd|signature|token|key|sig|(?:code[_-]?)?verifier|(?:php|j)?sess(?:ion)?[_-]?id|sid|x[-_]${HEADER_NAME_RUN}?(?:api[-_]?key|token|secret|auth)${HEADER_NAME_RUN})=)[^&#\\s"'<>\`]+`, "gi");
|
|
34570
34578
|
var OAUTH_CODE_RE = /([?&]code=)(?=[^&#\s"'<>`]{16,})[^&#\s"'<>`]+/gi;
|
|
34571
34579
|
var FORM_PASSWORD_RE = /((?:^|[\s,;:"'(\[{])(?:password|passwd)=)[^&#\s"'<>`]+/gim;
|
|
34572
34580
|
var HEADER_SECRET_RE = new RegExp(`(\\b(?:x[-_]${HEADER_NAME_RUN}?(?:api[-_]?key|token|secret|auth)${HEADER_NAME_RUN}|api[-_]?key)\\s*:\\s*)[^\\s,;"'<>\`]+`, "gi");
|
|
@@ -34577,6 +34585,8 @@ var JSON_SECRET_KEYS = [
|
|
|
34577
34585
|
"api[_-]?secret",
|
|
34578
34586
|
"(?:x[_-])?api[_-]?key",
|
|
34579
34587
|
"private[_-]?key",
|
|
34588
|
+
"code[_-]?verifier",
|
|
34589
|
+
// PKCE; a bare `verifier` key is too generic for JSON
|
|
34580
34590
|
`x[_-]${HEADER_NAME_RUN}?(?:api[_-]?key|token|secret|auth)${HEADER_NAME_RUN}`,
|
|
34581
34591
|
// bounded like HEADER_SECRET_RE
|
|
34582
34592
|
"(?:proxy-)?authorization",
|
|
@@ -34607,6 +34617,11 @@ function redactSecrets(text) {
|
|
|
34607
34617
|
return text.replace(BEARER_RE, "$1[REDACTED]").replace(BASIC_AUTH_RE, "$1[REDACTED]").replace(SET_COOKIE_RE, "$1$2=[REDACTED]").replace(COOKIE_HEADER_RE, (_m, prefix, pairs) => `${prefix}${pairs.replace(/=[^;,\s]*/g, "=[REDACTED]")}`).replace(API_KEY_RE, "[REDACTED]").replace(GOOGLE_OAUTH_TOKEN_RE, "[REDACTED]").replace(HEADER_SECRET_RE, "$1[REDACTED]").replace(QUERY_SECRET_RE, "$1[REDACTED]").replace(OAUTH_CODE_RE, "$1[REDACTED]").replace(FORM_PASSWORD_RE, "$1[REDACTED]").replace(AWS_SIGV4_RE, "$1[REDACTED]").replace(JSON_COOKIE_DQ_RE, redactJsonCookie('"')).replace(JSON_COOKIE_SQ_RE, redactJsonCookie("'")).replace(JSON_SECRET_DQ_RE, "$1[REDACTED]$2").replace(JSON_SECRET_SQ_RE, "$1[REDACTED]$2").replace(JSON_SECRET_NUM_RE, "$1[REDACTED]").replace(JWT_RE, "[REDACTED]");
|
|
34608
34618
|
}
|
|
34609
34619
|
var ERROR_REDACTION_INPUT_MAX = 64 * 1024;
|
|
34620
|
+
function messageOf(err) {
|
|
34621
|
+
if (err instanceof Error)
|
|
34622
|
+
return err.message;
|
|
34623
|
+
return String(err);
|
|
34624
|
+
}
|
|
34610
34625
|
|
|
34611
34626
|
// ../../node_modules/@chrischall/mcp-utils/dist/response/view.js
|
|
34612
34627
|
function minifiedResult(data) {
|
|
@@ -35027,7 +35042,7 @@ function readEnvVar(key, opts = {}) {
|
|
|
35027
35042
|
if (typeof raw === "string") {
|
|
35028
35043
|
const trimmed = raw.trim();
|
|
35029
35044
|
if (trimmed.length > 0 && trimmed !== "undefined" && trimmed !== "null" && !PLACEHOLDER_RE.test(trimmed)) {
|
|
35030
|
-
return trimmed;
|
|
35045
|
+
return opts.trim === false ? raw : trimmed;
|
|
35031
35046
|
}
|
|
35032
35047
|
}
|
|
35033
35048
|
return opts.default;
|
|
@@ -35222,12 +35237,19 @@ function boundArgs(args) {
|
|
|
35222
35237
|
}
|
|
35223
35238
|
function confirmationFromEnv(options) {
|
|
35224
35239
|
const { tool, account, confirmToken, subject, instruction, args, env = process.env, spent: callerSpent, ...rest } = options;
|
|
35240
|
+
if (args === void 0 || args === null) {
|
|
35241
|
+
throw new TypeError(`confirmationFromEnv: ${tool} passed no args; pass the tool's validated arguments ({} for a tool with none).`);
|
|
35242
|
+
}
|
|
35225
35243
|
const spent2 = callerSpent ?? spentTokenStoreFromEnv(env);
|
|
35226
35244
|
const mode = readConfirmMode(env);
|
|
35227
35245
|
const ttlSeconds = readConfirmTtl(env);
|
|
35228
35246
|
const elicitationOff = readConfirmElicitation(env) === "off";
|
|
35229
|
-
const bound =
|
|
35230
|
-
const
|
|
35247
|
+
const bound = boundArgs(args);
|
|
35248
|
+
const elicitationBound = account === void 0 ? { args: bound } : { account, args: bound };
|
|
35249
|
+
const bindingAdded = rest.binding ? rest : {
|
|
35250
|
+
...rest,
|
|
35251
|
+
binding: { key: confirmKeyFromEnv(env), args: elicitationBound, ttlSeconds: ttlSeconds ?? DEFAULT_TTL_SECONDS2 }
|
|
35252
|
+
};
|
|
35231
35253
|
const confirmation = elicitationOff ? { ...bindingAdded, elicitation: false } : bindingAdded;
|
|
35232
35254
|
if (mode === "refuse" || ttlSeconds === void 0) {
|
|
35233
35255
|
const reason = mode === "refuse" ? REFUSE_HINT : BAD_TTL_HINT;
|
|
@@ -35237,7 +35259,7 @@ function confirmationFromEnv(options) {
|
|
|
35237
35259
|
unsupportedNote: confirmation.unsupportedNote ? `${confirmation.unsupportedNote} ${hint}` : hint
|
|
35238
35260
|
};
|
|
35239
35261
|
}
|
|
35240
|
-
const boundSubject =
|
|
35262
|
+
const boundSubject = async () => {
|
|
35241
35263
|
const read = await subject();
|
|
35242
35264
|
if ("content" in read)
|
|
35243
35265
|
return read;
|
|
@@ -35264,12 +35286,14 @@ var SERVER_PROTOCOL_VERSIONS = Object.freeze([
|
|
|
35264
35286
|
...SUPPORTED_PROTOCOL_VERSIONS
|
|
35265
35287
|
]);
|
|
35266
35288
|
function hintResultOrRethrow(err) {
|
|
35289
|
+
if (err instanceof ProtocolError && err.code === ProtocolErrorCode.UrlElicitationRequired)
|
|
35290
|
+
throw err;
|
|
35267
35291
|
if (err instanceof McpToolError && err.hint) {
|
|
35268
35292
|
return errorResult(`${err.message}
|
|
35269
35293
|
|
|
35270
35294
|
Hint: ${err.hint}`);
|
|
35271
35295
|
}
|
|
35272
|
-
|
|
35296
|
+
return errorResult(messageOf(err));
|
|
35273
35297
|
}
|
|
35274
35298
|
function mcpRequestFrom(args) {
|
|
35275
35299
|
const ctx = args.at(-1);
|
|
@@ -35503,7 +35527,7 @@ var PositiveInt = external_exports.number().int().positive();
|
|
|
35503
35527
|
var NonNegInt = external_exports.number().int().nonnegative();
|
|
35504
35528
|
var NonEmptyString = external_exports.string().min(1);
|
|
35505
35529
|
var IsoDate = external_exports.iso.date();
|
|
35506
|
-
var IsoTime = external_exports.string().regex(/^([01]?\d|2[0-3]):[0-5]\d$/, "must be HH:MM (24h), e.g. 19:30");
|
|
35530
|
+
var IsoTime = external_exports.string().regex(/^([01]?\d|2[0-3]):[0-5]\d$/, "must be HH:MM (24h), e.g. 19:30").overwrite((v) => v.padStart(5, "0"));
|
|
35507
35531
|
var NumericIdString = external_exports.string().regex(/^\d+$/, "must be a numeric id (digits only)").describe("A numeric id string (digits only), safe to interpolate into a URL path.");
|
|
35508
35532
|
var SafePathSegment = external_exports.string().min(1).regex(/^[^/?#\s]+$/, 'must not contain "/", "?", "#", or whitespace').refine((v) => !v.includes(".."), 'must not contain ".."').describe('A single URL path segment, safe to interpolate: no "/", "..", "?", "#", or whitespace.');
|
|
35509
35533
|
var schemaOrigin = external_exports.string().optional().describe("Portal origin (e.g. https://<vendor>.example.co) selecting which active session to use. Optional when only one session is active.");
|
|
@@ -36203,7 +36227,7 @@ function registerRunTool(server, options) {
|
|
|
36203
36227
|
}
|
|
36204
36228
|
server.registerTool(`gog_${service}_run`, {
|
|
36205
36229
|
description,
|
|
36206
|
-
annotations: { destructiveHint: true },
|
|
36230
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36207
36231
|
inputSchema: external_exports.object(inputSchema)
|
|
36208
36232
|
}, async (rawArgs) => {
|
|
36209
36233
|
const { subcommand, args, account } = rawArgs;
|
|
@@ -36412,6 +36436,7 @@ async function requireDispatchConfirmation(ctx, options) {
|
|
|
36412
36436
|
...confirmation,
|
|
36413
36437
|
tool: fallback.tool,
|
|
36414
36438
|
account: fallback.account ?? readEnvVar("GOG_ACCOUNT") ?? "",
|
|
36439
|
+
args: fallback.args,
|
|
36415
36440
|
confirmToken: fallback.confirmToken,
|
|
36416
36441
|
subject: fallback.subject,
|
|
36417
36442
|
instruction: fallback.instruction ?? CONFIRM_ACTION_INSTRUCTION,
|
|
@@ -36424,13 +36449,13 @@ function resultText(result) {
|
|
|
36424
36449
|
}
|
|
36425
36450
|
|
|
36426
36451
|
// ../gogcli-mcp/src/tools/auth.ts
|
|
36427
|
-
var AUTH_RUN_SUBCOMMANDS = ["list", "status", "services", "
|
|
36452
|
+
var AUTH_RUN_SUBCOMMANDS = ["list", "status", "services", "alias"];
|
|
36428
36453
|
function registerAuthToolsWith(server, defaultServices) {
|
|
36429
36454
|
const servicesDescribe = `Services to authorize: "all" or comma-separated list (e.g. "sheets,gmail,calendar"). Default: "${defaultServices}". Prefer the narrowest set you need \u2014 requesting a service whose Google API is not enabled on the OAuth client's project makes Google reject the WHOLE request with invalid_scope.`;
|
|
36430
36455
|
const extraScopesDescribe = "Additional raw OAuth scope URIs to request, comma-separated, on top of the ones `services` implies. Use for scopes no service covers \u2014 e.g. https://www.googleapis.com/auth/bigquery.readonly, required before gog_sheets_datasource_* can read BigQuery-backed Connected Sheets. Leave unset otherwise: an extra scope whose API is not enabled on the OAuth client project makes Google reject the WHOLE authorization with invalid_scope.";
|
|
36431
36456
|
server.registerTool("gog_auth_list", {
|
|
36432
36457
|
description: "List the Google accounts stored in gogcli, with their scopes. This reads local configuration only \u2014 it does not contact Google and does NOT tell you whether an account still works: a signed-out account whose refresh token expired or was revoked is listed here exactly like a healthy one, scopes and all. Use gog_auth_health to check whether an account can actually authenticate.",
|
|
36433
|
-
annotations: { readOnlyHint: true },
|
|
36458
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
36434
36459
|
inputSchema: external_exports.object({})
|
|
36435
36460
|
}, async () => {
|
|
36436
36461
|
try {
|
|
@@ -36441,7 +36466,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36441
36466
|
});
|
|
36442
36467
|
server.registerTool("gog_auth_status", {
|
|
36443
36468
|
description: "Show gogcli auth CONFIGURATION: keyring backend, credential files, and auth setup. Despite the name this is not a health check \u2014 it reads local setup and does not contact Google, so it says nothing about whether an account can still authenticate. Use gog_auth_health for that.",
|
|
36444
|
-
annotations: { readOnlyHint: true },
|
|
36469
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
36445
36470
|
inputSchema: external_exports.object({})
|
|
36446
36471
|
}, async () => {
|
|
36447
36472
|
try {
|
|
@@ -36452,7 +36477,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36452
36477
|
});
|
|
36453
36478
|
server.registerTool("gog_auth_health", {
|
|
36454
36479
|
description: `Check the LIVE health of each stored Google account. Unlike gog_auth_status (which only reports keyring/config setup), this performs a real token refresh against Google, so it detects expired or revoked (invalid_grant) refresh tokens \u2014 the account-wide sign-out that blocks every service. Reports per account: whether the token is currently valid, the mapped cause when it is not, how long ago it was authorized, and a warning as it approaches the 7-day refresh-token limit that applies to OAuth apps whose consent screen is still in "Testing" mode. Run it proactively to re-authorize on your own schedule instead of mid-task. On a hosted deployment this is the ONLY check that measures Google: a connector showing "connected" or "refreshed" has verified the client's connection to the MCP host, and nothing else \u2014 the Google credential lives in gog's keyring on that host and can be dead while the connection looks perfectly healthy.`,
|
|
36455
|
-
annotations: { readOnlyHint: true },
|
|
36480
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
36456
36481
|
inputSchema: external_exports.object({})
|
|
36457
36482
|
}, async () => {
|
|
36458
36483
|
try {
|
|
@@ -36463,7 +36488,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36463
36488
|
});
|
|
36464
36489
|
server.registerTool("gog_auth_services", {
|
|
36465
36490
|
description: "List all Google services supported by gogcli and the OAuth scopes each requires.",
|
|
36466
|
-
annotations: { readOnlyHint: true },
|
|
36491
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
36467
36492
|
inputSchema: external_exports.object({})
|
|
36468
36493
|
}, async () => {
|
|
36469
36494
|
try {
|
|
@@ -36474,7 +36499,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36474
36499
|
});
|
|
36475
36500
|
server.registerTool("gog_auth_add", {
|
|
36476
36501
|
description: "Authorize a Google account via browser-based OAuth. Opens a browser window where the user must sign in and grant access. Blocks for up to 5 minutes waiting for the user to complete authorization. If the browser does not open automatically, a fallback URL is included in the response. Use gog_auth_list to check which accounts are already configured.",
|
|
36477
|
-
annotations: { destructiveHint: true },
|
|
36502
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36478
36503
|
inputSchema: external_exports.object({
|
|
36479
36504
|
email: external_exports.string().describe("Google account email to authorize"),
|
|
36480
36505
|
services: external_exports.string().optional().default(defaultServices).describe(servicesDescribe),
|
|
@@ -36494,7 +36519,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36494
36519
|
});
|
|
36495
36520
|
server.registerTool("gog_auth_add_url", {
|
|
36496
36521
|
description: "Begin REMOTE/headless Google authorization (step 1 of 2). Returns a sign-in URL to open in any browser \u2014 no local server or terminal on the gogcli host is needed, so this works on a hosted deployment where the interactive gog_auth_add cannot. Hand the URL to the user; after they sign in, the browser is redirected to a localhost URL that fails to load \u2014 that is expected. They copy that full redirected URL (from the address bar) and you pass it to gog_auth_add_complete. The link is valid for 10 minutes. If you pass a custom `services` here, pass the SAME value to gog_auth_add_complete or the second step will not match this one.",
|
|
36497
|
-
annotations: { readOnlyHint: true },
|
|
36522
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
36498
36523
|
inputSchema: external_exports.object({
|
|
36499
36524
|
email: external_exports.string().describe("Google account email to authorize"),
|
|
36500
36525
|
services: external_exports.string().optional().default(defaultServices).describe(servicesDescribe),
|
|
@@ -36511,7 +36536,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36511
36536
|
});
|
|
36512
36537
|
server.registerTool("gog_auth_add_complete", {
|
|
36513
36538
|
description: "Complete REMOTE/headless Google authorization (step 2 of 2). Takes the full redirected localhost URL the user copied after finishing gog_auth_add_url, exchanges it for a refresh token, and stores it. Use the SAME `services` value you passed to gog_auth_add_url. Must run within 10 minutes of step 1 and against the same gogcli host.",
|
|
36514
|
-
annotations: { destructiveHint: true },
|
|
36539
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36515
36540
|
inputSchema: external_exports.object({
|
|
36516
36541
|
email: external_exports.string().describe("Google account email being authorized (same as step 1)"),
|
|
36517
36542
|
redirectUrl: external_exports.string().describe(
|
|
@@ -36547,7 +36572,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36547
36572
|
});
|
|
36548
36573
|
registerRunTool(server, {
|
|
36549
36574
|
service: "auth",
|
|
36550
|
-
examples: '"
|
|
36575
|
+
examples: '"alias", "list", "status"',
|
|
36551
36576
|
omitAccount: true,
|
|
36552
36577
|
allowedSubcommands: AUTH_RUN_SUBCOMMANDS,
|
|
36553
36578
|
note: "For browser-based authorization, use gog_auth_add instead."
|
|
@@ -36615,7 +36640,7 @@ function vetDocsRun(subcommand, args) {
|
|
|
36615
36640
|
function registerDocsTools(server) {
|
|
36616
36641
|
server.registerTool("gog_docs_info", {
|
|
36617
36642
|
description: "Get Google Doc metadata: title, ID, and other properties.",
|
|
36618
|
-
annotations: { readOnlyHint: true },
|
|
36643
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
36619
36644
|
inputSchema: external_exports.object({
|
|
36620
36645
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36621
36646
|
account: accountParam
|
|
@@ -36625,7 +36650,7 @@ function registerDocsTools(server) {
|
|
|
36625
36650
|
});
|
|
36626
36651
|
server.registerTool("gog_docs_cat", {
|
|
36627
36652
|
description: "Read a Google Doc as plain text.",
|
|
36628
|
-
annotations: { readOnlyHint: true },
|
|
36653
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
36629
36654
|
inputSchema: external_exports.object({
|
|
36630
36655
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36631
36656
|
chips: external_exports.boolean().optional().describe("Render Google Docs smart chips (people, dates, rich links) inline in the text output"),
|
|
@@ -36638,7 +36663,7 @@ function registerDocsTools(server) {
|
|
|
36638
36663
|
});
|
|
36639
36664
|
server.registerTool("gog_docs_create", {
|
|
36640
36665
|
description: "Create a new Google Doc. Returns JSON with the new docId and URL.",
|
|
36641
|
-
annotations: { destructiveHint: true },
|
|
36666
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36642
36667
|
inputSchema: external_exports.object({
|
|
36643
36668
|
title: external_exports.string().describe("Title for the new document"),
|
|
36644
36669
|
account: accountParam
|
|
@@ -36648,7 +36673,7 @@ function registerDocsTools(server) {
|
|
|
36648
36673
|
});
|
|
36649
36674
|
server.registerTool("gog_docs_write", {
|
|
36650
36675
|
description: "Write text content to a Google Doc, replacing existing body content by default. Set append=true to add after existing content.",
|
|
36651
|
-
annotations: { destructiveHint: true },
|
|
36676
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36652
36677
|
inputSchema: external_exports.object({
|
|
36653
36678
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36654
36679
|
text: external_exports.string().describe("Text content to write"),
|
|
@@ -36688,7 +36713,7 @@ function registerDocsTools(server) {
|
|
|
36688
36713
|
});
|
|
36689
36714
|
server.registerTool("gog_docs_find_replace", {
|
|
36690
36715
|
description: "Find and replace text in a Google Doc.",
|
|
36691
|
-
annotations: { destructiveHint: true },
|
|
36716
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36692
36717
|
inputSchema: external_exports.object({
|
|
36693
36718
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36694
36719
|
find: external_exports.string().describe("Text to find"),
|
|
@@ -36700,7 +36725,7 @@ function registerDocsTools(server) {
|
|
|
36700
36725
|
});
|
|
36701
36726
|
server.registerTool("gog_docs_structure", {
|
|
36702
36727
|
description: "Show a Google Doc's structure with numbered paragraphs. Useful for understanding the document layout before making index-based edits.",
|
|
36703
|
-
annotations: { readOnlyHint: true },
|
|
36728
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
36704
36729
|
inputSchema: external_exports.object({
|
|
36705
36730
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36706
36731
|
account: accountParam
|
|
@@ -36734,6 +36759,11 @@ function commentMentions(text) {
|
|
|
36734
36759
|
}
|
|
36735
36760
|
|
|
36736
36761
|
// ../gogcli-mcp/src/tools/gmail.ts
|
|
36762
|
+
var signatureSchema = {
|
|
36763
|
+
signature: external_exports.boolean().optional().describe("Append the Gmail signature from the active send-as address"),
|
|
36764
|
+
signatureFrom: external_exports.string().optional().describe("Append the Gmail signature from this send-as email address"),
|
|
36765
|
+
signatureFile: external_exports.string().optional().describe("Append a local signature file (plain text or HTML), read on the gog server. Must be inside GOG_FILE_ROOTS. Cannot be combined with signature/signatureFrom.")
|
|
36766
|
+
};
|
|
36737
36767
|
var replySchema = {
|
|
36738
36768
|
messageId: external_exports.string().describe("Gmail message ID to reply to \u2014 the short hex `id` from gog_gmail_get / _search (or gog_gmail_messages_search, gogcli-mcp-gmail only). NOT the threadId, NOT the RFC822 `<\u2026@host>` Message-Id header."),
|
|
36739
36769
|
body: external_exports.string().optional().describe("Reply body (plain text; required unless bodyHtml or bodyHtmlFile is set). Any size \u2014 a large body is written to a temp file on the gog server rather than inlined into the command line. Note gog strips trailing newlines from a file-delivered body."),
|
|
@@ -36749,9 +36779,7 @@ var replySchema = {
|
|
|
36749
36779
|
attachInline: attachInlineParam,
|
|
36750
36780
|
from: external_exports.string().optional().describe("Send from this email address (must be a verified send-as alias)"),
|
|
36751
36781
|
autoFromAddressedAlias: external_exports.boolean().optional().describe("When from is omitted, send from the verified send-as alias the original message was addressed TO, instead of the account's primary address \u2014 so a reply to mail sent to an alias goes back out from that alias. Ignored when from is set."),
|
|
36752
|
-
|
|
36753
|
-
signatureFrom: external_exports.string().optional().describe("Append the Gmail signature from this send-as email address"),
|
|
36754
|
-
signatureFile: external_exports.string().optional().describe("Append a local signature file (plain text or HTML), read on the gog server"),
|
|
36782
|
+
...signatureSchema,
|
|
36755
36783
|
account: accountParam
|
|
36756
36784
|
};
|
|
36757
36785
|
var sendReplySchema = external_exports.object({ ...replySchema, confirmToken: confirmTokenParam });
|
|
@@ -36766,7 +36794,7 @@ var failIfNotEmptyParam = external_exports.boolean().optional().describe(
|
|
|
36766
36794
|
);
|
|
36767
36795
|
|
|
36768
36796
|
// ../gogcli-mcp/src/server.ts
|
|
36769
|
-
var VERSION = true ? "4.
|
|
36797
|
+
var VERSION = true ? "4.8.0" : "0.0.0";
|
|
36770
36798
|
|
|
36771
36799
|
// ../gogcli-mcp/src/bootstrap-auth.ts
|
|
36772
36800
|
import { join as join7 } from "node:path";
|
|
@@ -36853,7 +36881,7 @@ function docTitle(raw) {
|
|
|
36853
36881
|
function registerExtraDocsTools(server) {
|
|
36854
36882
|
server.registerTool("gog_docs_copy", {
|
|
36855
36883
|
description: "Copy a Google Doc to a new document with the given title.",
|
|
36856
|
-
annotations: { destructiveHint: true },
|
|
36884
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36857
36885
|
inputSchema: external_exports.object({
|
|
36858
36886
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36859
36887
|
title: external_exports.string().describe("Title for the new copy"),
|
|
@@ -36867,7 +36895,7 @@ function registerExtraDocsTools(server) {
|
|
|
36867
36895
|
});
|
|
36868
36896
|
server.registerTool("gog_docs_delete", {
|
|
36869
36897
|
description: "Delete content within a Google Doc by character index range. To remove the entire document (move to Drive trash), use gog_docs_trash.",
|
|
36870
|
-
annotations: { destructiveHint: true },
|
|
36898
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36871
36899
|
inputSchema: external_exports.object({
|
|
36872
36900
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36873
36901
|
start: external_exports.number().optional().describe("Start index (character position, 1-based). Required unless `at` is set."),
|
|
@@ -36888,14 +36916,14 @@ function registerExtraDocsTools(server) {
|
|
|
36888
36916
|
if (at) args.push(`--at=${at}`);
|
|
36889
36917
|
if (occurrence !== void 0) args.push(`--occurrence=${occurrence}`);
|
|
36890
36918
|
if (matchCase) args.push("--match-case");
|
|
36891
|
-
if (tabId) args.push(`--tab
|
|
36919
|
+
if (tabId) args.push(`--tab=${tabId}`);
|
|
36892
36920
|
if (segment) args.push(`--segment=${segment}`);
|
|
36893
36921
|
if (batch) args.push(`--batch=${batch}`);
|
|
36894
36922
|
return runOrDiagnose(args, { account });
|
|
36895
36923
|
});
|
|
36896
36924
|
server.registerTool("gog_docs_trash", {
|
|
36897
36925
|
description: "Move an entire Google Doc to Drive trash. Convenience wrapper around `gog drive delete` so docs-only users can clean up without installing gogcli-mcp-drive. The doc remains recoverable from Drive trash for ~30 days.",
|
|
36898
|
-
annotations: { destructiveHint: true },
|
|
36926
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36899
36927
|
inputSchema: external_exports.object({
|
|
36900
36928
|
docId: external_exports.string().describe("Doc ID to move to trash"),
|
|
36901
36929
|
account: accountParam
|
|
@@ -36905,7 +36933,7 @@ function registerExtraDocsTools(server) {
|
|
|
36905
36933
|
});
|
|
36906
36934
|
server.registerTool("gog_docs_edit", {
|
|
36907
36935
|
description: "Edit a Google Doc by finding and replacing text (stream-edit style).",
|
|
36908
|
-
annotations: { destructiveHint: true },
|
|
36936
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36909
36937
|
inputSchema: external_exports.object({
|
|
36910
36938
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36911
36939
|
find: external_exports.string().describe("Text to find"),
|
|
@@ -36920,7 +36948,7 @@ function registerExtraDocsTools(server) {
|
|
|
36920
36948
|
});
|
|
36921
36949
|
server.registerTool("gog_docs_read", {
|
|
36922
36950
|
description: 'Read the content of a Google Doc. Default: plain text body. Use format="json" for the raw Google Docs API response (lossless, includes character indices needed for index-based gog_docs_insert / gog_docs_delete calls). For markdown output, use gog_docs_export with format="md" \u2014 it writes to a file. Use gog_docs_structure to see paragraph-by-paragraph layout with indices.',
|
|
36923
|
-
annotations: { readOnlyHint: true },
|
|
36951
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
36924
36952
|
inputSchema: external_exports.object({
|
|
36925
36953
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36926
36954
|
format: external_exports.enum(["text", "json"]).optional().describe("Output format (default: text)"),
|
|
@@ -36946,7 +36974,7 @@ function registerExtraDocsTools(server) {
|
|
|
36946
36974
|
});
|
|
36947
36975
|
server.registerTool("gog_docs_format", {
|
|
36948
36976
|
description: "Apply text or paragraph formatting to a Google Doc. Use `match` to format a specific text occurrence, `matchAll` to format every occurrence, or omit both to format the whole doc. Boolean flags (bold/italic/etc.) set the attribute; negated flags (noBold/noItalic/etc.) clear it.",
|
|
36949
|
-
annotations: { destructiveHint: true },
|
|
36977
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36950
36978
|
inputSchema: external_exports.object({
|
|
36951
36979
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36952
36980
|
match: external_exports.string().optional().describe("Format only the first text match"),
|
|
@@ -37032,7 +37060,7 @@ function registerExtraDocsTools(server) {
|
|
|
37032
37060
|
});
|
|
37033
37061
|
server.registerTool("gog_docs_suggestions_list", {
|
|
37034
37062
|
description: "List pending suggestions (suggested text insertions and deletions) in a Google Doc, with exact UTF-16 ranges and segment context. Read-only; does not accept or reject suggestions.",
|
|
37035
|
-
annotations: { readOnlyHint: true },
|
|
37063
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37036
37064
|
inputSchema: external_exports.object({
|
|
37037
37065
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37038
37066
|
tab: external_exports.string().optional().describe("Tab title or ID (omit for the first tab)"),
|
|
@@ -37046,7 +37074,7 @@ function registerExtraDocsTools(server) {
|
|
|
37046
37074
|
server.registerTool("gog_docs_export", {
|
|
37047
37075
|
description: "Export a Google Doc as PDF, plain text, HTML, DOCX, or other format.",
|
|
37048
37076
|
// Writes a file on the gog host and can overwrite one: not read-only (audit SEC-4).
|
|
37049
|
-
annotations: { readOnlyHint: false, destructiveHint: true },
|
|
37077
|
+
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
|
|
37050
37078
|
inputSchema: external_exports.object({
|
|
37051
37079
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37052
37080
|
format: external_exports.string().optional().describe("Export format: pdf, txt, html, docx, rtf, odt, epub (default: pdf)"),
|
|
@@ -37064,7 +37092,7 @@ function registerExtraDocsTools(server) {
|
|
|
37064
37092
|
});
|
|
37065
37093
|
server.registerTool("gog_docs_insert", {
|
|
37066
37094
|
description: "Insert text at a specific character index in a Google Doc. When `index` is omitted, gog defaults to 1 (the very beginning), NOT the end \u2014 sequential inserts without an explicit index produce reversed output. To append at the end of the doc, use gog_docs_append (which uses `gog docs write --append` and is the right tool for iterative document construction). To find a valid index for mid-document inserts, call gog_docs_structure or gog_docs_read first.",
|
|
37067
|
-
annotations: { destructiveHint: true },
|
|
37095
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37068
37096
|
inputSchema: external_exports.object({
|
|
37069
37097
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37070
37098
|
content: external_exports.string().optional().describe("Text content to insert"),
|
|
@@ -37087,14 +37115,14 @@ function registerExtraDocsTools(server) {
|
|
|
37087
37115
|
if (at) args.push(`--at=${at}`);
|
|
37088
37116
|
if (occurrence !== void 0) args.push(`--occurrence=${occurrence}`);
|
|
37089
37117
|
if (matchCase) args.push("--match-case");
|
|
37090
|
-
if (tabId) args.push(`--tab
|
|
37118
|
+
if (tabId) args.push(`--tab=${tabId}`);
|
|
37091
37119
|
if (segment) args.push(`--segment=${segment}`);
|
|
37092
37120
|
if (batch) args.push(`--batch=${batch}`);
|
|
37093
37121
|
return runOrDiagnose(args, { account });
|
|
37094
37122
|
});
|
|
37095
37123
|
server.registerTool("gog_docs_append", {
|
|
37096
37124
|
description: "Append text to the end of a Google Doc. This is the right tool for iterative document construction \u2014 multiple sequential calls produce content in the order they were called. Use gog_docs_insert only when you need to insert at a specific character position. Known markdown=true limitations (tracked upstream): (a) 3+ tables in one call reorders the trailing punctuation of the paragraph before the 3rd table \u2014 split into multiple calls with \u22642 tables each (openclaw/gogcli#607); (b) inline **bold** / *italic* / `code` inside table cells renders as literal characters \u2014 pre-format cell text separately or apply formatting after the append via gog_docs_format (openclaw/gogcli#608); (c) tables with an empty header row leak the last data row as literal pipe text \u2014 always supply a non-empty header (openclaw/gogcli#609).",
|
|
37097
|
-
annotations: { destructiveHint: true },
|
|
37125
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37098
37126
|
inputSchema: external_exports.object({
|
|
37099
37127
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37100
37128
|
text: external_exports.string().optional().describe("Text content to append"),
|
|
@@ -37114,7 +37142,7 @@ function registerExtraDocsTools(server) {
|
|
|
37114
37142
|
});
|
|
37115
37143
|
server.registerTool("gog_docs_list_tabs", {
|
|
37116
37144
|
description: "List all tabs in a Google Doc.",
|
|
37117
|
-
annotations: { readOnlyHint: true },
|
|
37145
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37118
37146
|
inputSchema: external_exports.object({
|
|
37119
37147
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37120
37148
|
account: accountParam
|
|
@@ -37124,7 +37152,7 @@ function registerExtraDocsTools(server) {
|
|
|
37124
37152
|
});
|
|
37125
37153
|
server.registerTool("gog_docs_sed", {
|
|
37126
37154
|
description: "Stream-edit a Google Doc with sed-like regex expressions (s/find/replace/ syntax).",
|
|
37127
|
-
annotations: { destructiveHint: true },
|
|
37155
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37128
37156
|
inputSchema: external_exports.object({
|
|
37129
37157
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37130
37158
|
expression: external_exports.string().optional().describe('Single sed expression (e.g. "s/old/new/g")'),
|
|
@@ -37148,7 +37176,7 @@ function registerExtraDocsTools(server) {
|
|
|
37148
37176
|
});
|
|
37149
37177
|
server.registerTool("gog_docs_update", {
|
|
37150
37178
|
description: "Update a Google Doc \u2014 insert or replace text at a specific position.",
|
|
37151
|
-
annotations: { destructiveHint: true },
|
|
37179
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37152
37180
|
inputSchema: external_exports.object({
|
|
37153
37181
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37154
37182
|
text: external_exports.string().optional().describe("Text content to write"),
|
|
@@ -37176,7 +37204,7 @@ function registerExtraDocsTools(server) {
|
|
|
37176
37204
|
if (at) args.push(`--at=${at}`);
|
|
37177
37205
|
if (occurrence !== void 0) args.push(`--occurrence=${occurrence}`);
|
|
37178
37206
|
if (matchCase) args.push("--match-case");
|
|
37179
|
-
if (tabId) args.push(`--tab
|
|
37207
|
+
if (tabId) args.push(`--tab=${tabId}`);
|
|
37180
37208
|
if (segment) args.push(`--segment=${segment}`);
|
|
37181
37209
|
if (pageless) args.push("--pageless");
|
|
37182
37210
|
if (batch) args.push(`--batch=${batch}`);
|
|
@@ -37184,7 +37212,7 @@ function registerExtraDocsTools(server) {
|
|
|
37184
37212
|
});
|
|
37185
37213
|
server.registerTool("gog_docs_comments_list", {
|
|
37186
37214
|
description: "List comments on a Google Doc. Returns open comments by default; set includeResolved=true to include resolved comments. Set locate=true (or pass tab) to attach each comment's tab and Docs index ranges as location.matches[] plus location.orphaned \u2014 that costs one extra document fetch, but only one for the whole listing, where gog_docs_comments_locate costs one per comment. Either flag additionally requires the Docs scope; the plain listing needs only Drive. matches[] always spans every tab, so a quote appearing in two tabs is visible as an ambiguity rather than silently resolved. tab keeps only comments with a match in that tab, which drops orphaned comments and comments that quote nothing.",
|
|
37187
|
-
annotations: { readOnlyHint: true },
|
|
37215
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37188
37216
|
inputSchema: external_exports.object({
|
|
37189
37217
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37190
37218
|
includeResolved: external_exports.boolean().optional().describe("Include resolved comments (default: false, open only)"),
|
|
@@ -37205,7 +37233,7 @@ function registerExtraDocsTools(server) {
|
|
|
37205
37233
|
});
|
|
37206
37234
|
server.registerTool("gog_docs_comments_get", {
|
|
37207
37235
|
description: "Get a single comment by ID, including its replies.",
|
|
37208
|
-
annotations: { readOnlyHint: true },
|
|
37236
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37209
37237
|
inputSchema: external_exports.object({
|
|
37210
37238
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37211
37239
|
commentId: external_exports.string().describe("Comment ID"),
|
|
@@ -37216,7 +37244,7 @@ function registerExtraDocsTools(server) {
|
|
|
37216
37244
|
});
|
|
37217
37245
|
server.registerTool("gog_docs_comments_add", {
|
|
37218
37246
|
description: "Add a comment to a Google Doc. Optionally attach quoted text that appears as the highlighted passage in the Google Docs UI. The Doc's owner and everyone the text +mentions are notified, so this reads the Doc and asks the MCP host to show the user a confirmation prompt with the Doc, the text and who is mentioned first; nothing is posted unless they accept." + CONFIRM_FALLBACK_DESCRIPTION,
|
|
37219
|
-
annotations: { destructiveHint: false },
|
|
37247
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
37220
37248
|
inputSchema: external_exports.object({
|
|
37221
37249
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37222
37250
|
content: external_exports.string().describe("Comment text"),
|
|
@@ -37239,6 +37267,7 @@ function registerExtraDocsTools(server) {
|
|
|
37239
37267
|
details: { doc, textPreview: bodyPreview(content), quoted, mentions },
|
|
37240
37268
|
unsupportedNote: "Ask the user to comment from Google Docs.",
|
|
37241
37269
|
fallback: {
|
|
37270
|
+
args: { docId, content, quoted, account },
|
|
37242
37271
|
tool: "gog_docs_comments_add",
|
|
37243
37272
|
account,
|
|
37244
37273
|
confirmToken,
|
|
@@ -37253,7 +37282,7 @@ function registerExtraDocsTools(server) {
|
|
|
37253
37282
|
});
|
|
37254
37283
|
server.registerTool("gog_docs_comments_reply", {
|
|
37255
37284
|
description: "Reply to an existing comment on a Google Doc. Everyone on the thread and anyone the reply +mentions is notified, so this reads the Doc and the comment and asks the MCP host to show the user a confirmation prompt with both and the reply first; nothing is posted unless they accept." + CONFIRM_FALLBACK_DESCRIPTION,
|
|
37256
|
-
annotations: { destructiveHint: false },
|
|
37285
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
37257
37286
|
inputSchema: external_exports.object({
|
|
37258
37287
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37259
37288
|
commentId: external_exports.string().describe("Comment ID to reply to"),
|
|
@@ -37277,6 +37306,7 @@ function registerExtraDocsTools(server) {
|
|
|
37277
37306
|
details: { doc, replyingTo, textPreview: bodyPreview(content), mentions },
|
|
37278
37307
|
unsupportedNote: "Ask the user to reply from Google Docs.",
|
|
37279
37308
|
fallback: {
|
|
37309
|
+
args: { docId, commentId, content, account },
|
|
37280
37310
|
tool: "gog_docs_comments_reply",
|
|
37281
37311
|
account,
|
|
37282
37312
|
confirmToken,
|
|
@@ -37291,7 +37321,7 @@ function registerExtraDocsTools(server) {
|
|
|
37291
37321
|
});
|
|
37292
37322
|
server.registerTool("gog_docs_comments_resolve", {
|
|
37293
37323
|
description: "Resolve a comment (mark as done). Optionally include a closing message.",
|
|
37294
|
-
annotations: { destructiveHint: true },
|
|
37324
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37295
37325
|
inputSchema: external_exports.object({
|
|
37296
37326
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37297
37327
|
commentId: external_exports.string().describe("Comment ID to resolve"),
|
|
@@ -37305,7 +37335,7 @@ function registerExtraDocsTools(server) {
|
|
|
37305
37335
|
});
|
|
37306
37336
|
server.registerTool("gog_docs_comments_delete", {
|
|
37307
37337
|
description: "Delete a comment from a Google Doc. This action is permanent.",
|
|
37308
|
-
annotations: { destructiveHint: true },
|
|
37338
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37309
37339
|
inputSchema: external_exports.object({
|
|
37310
37340
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37311
37341
|
commentId: external_exports.string().describe("Comment ID to delete"),
|
|
@@ -37316,7 +37346,7 @@ function registerExtraDocsTools(server) {
|
|
|
37316
37346
|
});
|
|
37317
37347
|
server.registerTool("gog_docs_comments_reopen", {
|
|
37318
37348
|
description: "Reopen a previously resolved comment (flip resolved \u2192 open).",
|
|
37319
|
-
annotations: { destructiveHint: true },
|
|
37349
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37320
37350
|
inputSchema: external_exports.object({
|
|
37321
37351
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37322
37352
|
commentId: external_exports.string().describe("Comment ID to reopen"),
|
|
@@ -37327,7 +37357,7 @@ function registerExtraDocsTools(server) {
|
|
|
37327
37357
|
});
|
|
37328
37358
|
server.registerTool("gog_docs_comments_locate", {
|
|
37329
37359
|
description: "Locate a comment's anchor in a Google Doc \u2014 resolves the comment's quoted text to its current Docs API index range, or reports the comment as orphaned if the quote can no longer be found (e.g. the anchored text was edited away). Read-only; useful before an index-based edit near a comment.",
|
|
37330
|
-
annotations: { readOnlyHint: true },
|
|
37360
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37331
37361
|
inputSchema: external_exports.object({
|
|
37332
37362
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37333
37363
|
commentId: external_exports.string().describe("Comment ID to locate"),
|
|
@@ -37345,7 +37375,7 @@ function registerExtraDocsTools(server) {
|
|
|
37345
37375
|
});
|
|
37346
37376
|
server.registerTool("gog_docs_find_range", {
|
|
37347
37377
|
description: "Map literal text in a Google Doc to its Docs API UTF-16 index range(s). Read-only helper for computing the start/end indices that index-based tools (gog_docs_delete, gog_docs_update --replace-range) need. Returns the first match by default; use occurrence to pick a specific one or all to return every match.",
|
|
37348
|
-
annotations: { readOnlyHint: true },
|
|
37378
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37349
37379
|
inputSchema: external_exports.object({
|
|
37350
37380
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37351
37381
|
text: external_exports.string().describe("Literal text to locate"),
|
|
@@ -37371,7 +37401,7 @@ function registerExtraDocsTools(server) {
|
|
|
37371
37401
|
});
|
|
37372
37402
|
server.registerTool("gog_batch_begin", {
|
|
37373
37403
|
description: "Open a persisted, revision-locked request batch for a Google Doc. Subsequent docs mutation tools called with batch=<batchId> append their requests locally instead of applying them; gog_batch_end submits everything atomically. Returns the batchId.",
|
|
37374
|
-
annotations: { destructiveHint: false },
|
|
37404
|
+
annotations: { destructiveHint: false, openWorldHint: false },
|
|
37375
37405
|
inputSchema: external_exports.object({
|
|
37376
37406
|
docId: external_exports.string().describe("Google Doc ID the batch is locked to"),
|
|
37377
37407
|
name: external_exports.string().optional().describe("Optional batch label"),
|
|
@@ -37384,7 +37414,7 @@ function registerExtraDocsTools(server) {
|
|
|
37384
37414
|
});
|
|
37385
37415
|
server.registerTool("gog_batch_end", {
|
|
37386
37416
|
description: "Submit a persisted batch: applies every composed request to the doc in one atomic batchUpdate against the locked revision. Atomic by default \u2014 set autoSplit to submit >500-request batches as ordered chunks (non-atomic), or continueOnError to retry individually after an atomic validation failure, retaining failures in the batch.",
|
|
37387
|
-
annotations: { destructiveHint: true },
|
|
37417
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37388
37418
|
inputSchema: external_exports.object({
|
|
37389
37419
|
batchId: external_exports.string().describe("Batch ID (from gog_batch_begin)"),
|
|
37390
37420
|
autoSplit: external_exports.boolean().optional().describe("Submit batches over 500 requests as ordered chunks (non-atomic)"),
|
|
@@ -37399,7 +37429,7 @@ function registerExtraDocsTools(server) {
|
|
|
37399
37429
|
});
|
|
37400
37430
|
server.registerTool("gog_batch_abort", {
|
|
37401
37431
|
description: "Discard a persisted batch and its composed requests without applying anything to the doc.",
|
|
37402
|
-
annotations: { destructiveHint: true },
|
|
37432
|
+
annotations: { destructiveHint: true, openWorldHint: false },
|
|
37403
37433
|
inputSchema: external_exports.object({
|
|
37404
37434
|
batchId: external_exports.string().describe("Batch ID to discard"),
|
|
37405
37435
|
account: accountParam
|
|
@@ -37409,7 +37439,7 @@ function registerExtraDocsTools(server) {
|
|
|
37409
37439
|
});
|
|
37410
37440
|
server.registerTool("gog_batch_list", {
|
|
37411
37441
|
description: "List persisted Docs request batches (id, doc, label, request count, status).",
|
|
37412
|
-
annotations: { readOnlyHint: true },
|
|
37442
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
37413
37443
|
inputSchema: external_exports.object({
|
|
37414
37444
|
account: accountParam
|
|
37415
37445
|
})
|
|
@@ -37418,7 +37448,7 @@ function registerExtraDocsTools(server) {
|
|
|
37418
37448
|
});
|
|
37419
37449
|
server.registerTool("gog_batch_show", {
|
|
37420
37450
|
description: "Show one persisted batch: its doc, locked revision, and the composed requests awaiting submission.",
|
|
37421
|
-
annotations: { readOnlyHint: true },
|
|
37451
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
37422
37452
|
inputSchema: external_exports.object({
|
|
37423
37453
|
batchId: external_exports.string().describe("Batch ID"),
|
|
37424
37454
|
account: accountParam
|
|
@@ -37428,7 +37458,7 @@ function registerExtraDocsTools(server) {
|
|
|
37428
37458
|
});
|
|
37429
37459
|
server.registerTool("gog_batch_prune", {
|
|
37430
37460
|
description: "Delete stale persisted batches (not updated within olderThan).",
|
|
37431
|
-
annotations: { destructiveHint: true },
|
|
37461
|
+
annotations: { destructiveHint: true, openWorldHint: false },
|
|
37432
37462
|
inputSchema: external_exports.object({
|
|
37433
37463
|
olderThan: external_exports.string().optional().describe("Delete batches not updated within this duration (e.g. 72h, 7d)"),
|
|
37434
37464
|
account: accountParam
|
|
@@ -37440,7 +37470,7 @@ function registerExtraDocsTools(server) {
|
|
|
37440
37470
|
});
|
|
37441
37471
|
server.registerTool("gog_docs_table_column_width", {
|
|
37442
37472
|
description: "Set a fixed width (in points) for a table column, or reset columns to Docs-managed even distribution. Target the table by 1-based index in document order (negative counts from the end) and the column by 1-based number. Pass evenlyDistributed without col to reset every column in the table.",
|
|
37443
|
-
annotations: { destructiveHint: true },
|
|
37473
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37444
37474
|
inputSchema: external_exports.object({
|
|
37445
37475
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37446
37476
|
col: external_exports.number().int().optional().describe("1-based column number. Omit with evenlyDistributed to reset all columns."),
|
|
@@ -37464,7 +37494,7 @@ function registerExtraDocsTools(server) {
|
|
|
37464
37494
|
const tableSelectorParam = external_exports.string().optional().describe("Table selector: 1-based index (negative from the end), exact first-cell text, * for the only table, or text:VALUE for numeric/syntax-looking first-cell text (default: 1)");
|
|
37465
37495
|
server.registerTool("gog_docs_table_row_insert", {
|
|
37466
37496
|
description: 'Insert a row into a native Google Docs table, optionally populated from a JSON string array. Inserts before the 1-based position given by `at` (negative counts from the end; "end" appends \u2014 the default).',
|
|
37467
|
-
annotations: { destructiveHint: true },
|
|
37497
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37468
37498
|
inputSchema: external_exports.object({
|
|
37469
37499
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37470
37500
|
table: tableSelectorParam,
|
|
@@ -37483,7 +37513,7 @@ function registerExtraDocsTools(server) {
|
|
|
37483
37513
|
});
|
|
37484
37514
|
server.registerTool("gog_docs_table_row_delete", {
|
|
37485
37515
|
description: "Delete a row from a native Google Docs table by 1-based row number (negative counts from the end). The row's cell content is lost.",
|
|
37486
|
-
annotations: { destructiveHint: true },
|
|
37516
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37487
37517
|
inputSchema: external_exports.object({
|
|
37488
37518
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37489
37519
|
row: external_exports.number().int().describe("1-based row number; negative indexes count from the end"),
|
|
@@ -37499,7 +37529,7 @@ function registerExtraDocsTools(server) {
|
|
|
37499
37529
|
});
|
|
37500
37530
|
server.registerTool("gog_docs_table_column_insert", {
|
|
37501
37531
|
description: 'Insert a column into a native Google Docs table. Inserts before the 1-based position given by `at` (negative counts from the end; "end" appends \u2014 the default).',
|
|
37502
|
-
annotations: { destructiveHint: true },
|
|
37532
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37503
37533
|
inputSchema: external_exports.object({
|
|
37504
37534
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37505
37535
|
table: tableSelectorParam,
|
|
@@ -37516,7 +37546,7 @@ function registerExtraDocsTools(server) {
|
|
|
37516
37546
|
});
|
|
37517
37547
|
server.registerTool("gog_docs_table_column_delete", {
|
|
37518
37548
|
description: "Delete a column from a native Google Docs table by 1-based column number (negative counts from the end). The column's cell content is lost.",
|
|
37519
|
-
annotations: { destructiveHint: true },
|
|
37549
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37520
37550
|
inputSchema: external_exports.object({
|
|
37521
37551
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37522
37552
|
col: external_exports.number().int().describe("1-based column number; negative indexes count from the end"),
|
|
@@ -37532,7 +37562,7 @@ function registerExtraDocsTools(server) {
|
|
|
37532
37562
|
});
|
|
37533
37563
|
server.registerTool("gog_docs_table_merge", {
|
|
37534
37564
|
description: "Merge a rectangular cell range in a native Google Docs table. Content of non-first cells in the range is absorbed/discarded by the merge \u2014 use gog_docs_table_unmerge to split back.",
|
|
37535
|
-
annotations: { destructiveHint: true },
|
|
37565
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37536
37566
|
inputSchema: external_exports.object({
|
|
37537
37567
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37538
37568
|
range: external_exports.string().describe('1-based cell range r1,c1:r2,c2 (e.g. "1,1:2,3")'),
|
|
@@ -37548,7 +37578,7 @@ function registerExtraDocsTools(server) {
|
|
|
37548
37578
|
});
|
|
37549
37579
|
server.registerTool("gog_docs_table_unmerge", {
|
|
37550
37580
|
description: "Unmerge (split) the merged region containing a given cell in a native Google Docs table.",
|
|
37551
|
-
annotations: { destructiveHint: true },
|
|
37581
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37552
37582
|
inputSchema: external_exports.object({
|
|
37553
37583
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37554
37584
|
cell: external_exports.string().describe('1-based cell r,c inside the merged region (e.g. "1,1")'),
|
|
@@ -37564,7 +37594,7 @@ function registerExtraDocsTools(server) {
|
|
|
37564
37594
|
});
|
|
37565
37595
|
server.registerTool("gog_docs_named_range_create", {
|
|
37566
37596
|
description: "Create a named range \u2014 a durable, tab-aware anchor over a span of document text that survives subsequent edits (unlike raw indices). Anchor by literal text (`at`) or explicit UTF-16 start/end indices. Pair with gog_docs_named_range_replace for repeatable templated updates.",
|
|
37567
|
-
annotations: { destructiveHint: true },
|
|
37597
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37568
37598
|
inputSchema: external_exports.object({
|
|
37569
37599
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37570
37600
|
name: external_exports.string().describe("Unique named range name"),
|
|
@@ -37588,7 +37618,7 @@ function registerExtraDocsTools(server) {
|
|
|
37588
37618
|
});
|
|
37589
37619
|
server.registerTool("gog_docs_named_range_list", {
|
|
37590
37620
|
description: "List named ranges in a Google Doc, optionally filtered by name.",
|
|
37591
|
-
annotations: { readOnlyHint: true },
|
|
37621
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37592
37622
|
inputSchema: external_exports.object({
|
|
37593
37623
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37594
37624
|
name: external_exports.string().optional().describe("Only return ranges with this name"),
|
|
@@ -37603,7 +37633,7 @@ function registerExtraDocsTools(server) {
|
|
|
37603
37633
|
});
|
|
37604
37634
|
server.registerTool("gog_docs_named_range_delete", {
|
|
37605
37635
|
description: "Delete a named range (the anchor only \u2014 the underlying document text is untouched).",
|
|
37606
|
-
annotations: { destructiveHint: true },
|
|
37636
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37607
37637
|
inputSchema: external_exports.object({
|
|
37608
37638
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37609
37639
|
nameOrId: external_exports.string().describe("Named range name or ID"),
|
|
@@ -37617,7 +37647,7 @@ function registerExtraDocsTools(server) {
|
|
|
37617
37647
|
});
|
|
37618
37648
|
server.registerTool("gog_docs_named_range_replace", {
|
|
37619
37649
|
description: "Replace the text inside a named range with new content (inline or from a file), keeping the anchor for future updates \u2014 the templated-update workhorse.",
|
|
37620
|
-
annotations: { destructiveHint: true },
|
|
37650
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37621
37651
|
inputSchema: external_exports.object({
|
|
37622
37652
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37623
37653
|
nameOrId: external_exports.string().describe("Named range name or ID"),
|
|
@@ -37636,7 +37666,7 @@ function registerExtraDocsTools(server) {
|
|
|
37636
37666
|
});
|
|
37637
37667
|
server.registerTool("gog_docs_tables_list", {
|
|
37638
37668
|
description: "Enumerate the native tables in a Google Doc (dimensions, position) \u2014 the index/first-cell-text it reports feeds the `table` selector on the table-row/column/merge tools.",
|
|
37639
|
-
annotations: { readOnlyHint: true },
|
|
37669
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37640
37670
|
inputSchema: external_exports.object({
|
|
37641
37671
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37642
37672
|
tab: external_exports.string().optional().describe("Tab title or ID (omit for default)"),
|
|
@@ -37649,7 +37679,7 @@ function registerExtraDocsTools(server) {
|
|
|
37649
37679
|
});
|
|
37650
37680
|
server.registerTool("gog_docs_images_list", {
|
|
37651
37681
|
description: "Enumerate inline/positioned images in a Google Doc.",
|
|
37652
|
-
annotations: { readOnlyHint: true },
|
|
37682
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37653
37683
|
inputSchema: external_exports.object({
|
|
37654
37684
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37655
37685
|
tab: external_exports.string().optional().describe("Tab title or ID (omit for default)"),
|
|
@@ -37662,7 +37692,7 @@ function registerExtraDocsTools(server) {
|
|
|
37662
37692
|
});
|
|
37663
37693
|
server.registerTool("gog_docs_headings_list", {
|
|
37664
37694
|
description: "Enumerate headings in a Google Doc (a lightweight outline view), optionally filtered to one heading level.",
|
|
37665
|
-
annotations: { readOnlyHint: true },
|
|
37695
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37666
37696
|
inputSchema: external_exports.object({
|
|
37667
37697
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37668
37698
|
level: external_exports.number().int().optional().describe("Only return this heading level (1-6)"),
|
|
@@ -37677,7 +37707,7 @@ function registerExtraDocsTools(server) {
|
|
|
37677
37707
|
});
|
|
37678
37708
|
server.registerTool("gog_docs_paragraphs_list", {
|
|
37679
37709
|
description: "Enumerate paragraphs in a Google Doc with emptiness, text-run ranges, styles, and links \u2014 richer than gog_docs_structure when you need per-run detail. Optionally filter to one named style.",
|
|
37680
|
-
annotations: { readOnlyHint: true },
|
|
37710
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37681
37711
|
inputSchema: external_exports.object({
|
|
37682
37712
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37683
37713
|
style: external_exports.string().optional().describe("Only return this named style (e.g. NORMAL_TEXT or HEADING_2)"),
|
|
@@ -37692,7 +37722,7 @@ function registerExtraDocsTools(server) {
|
|
|
37692
37722
|
});
|
|
37693
37723
|
server.registerTool("gog_docs_insert_page_break", {
|
|
37694
37724
|
description: "Insert a Google Docs page break via InsertPageBreakRequest \u2014 the only path for multi-page deliverables (markdown has no page-break construct). Specify `index` for a precise character position, or `atEnd` for end-of-doc.",
|
|
37695
|
-
annotations: { destructiveHint: true },
|
|
37725
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37696
37726
|
inputSchema: external_exports.object({
|
|
37697
37727
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37698
37728
|
index: external_exports.number().int().optional().describe("Character index to insert at (1 = beginning). Omit or use atEnd for end-of-doc."),
|
|
@@ -37717,7 +37747,7 @@ function registerExtraDocsTools(server) {
|
|
|
37717
37747
|
});
|
|
37718
37748
|
server.registerTool("gog_docs_page_layout", {
|
|
37719
37749
|
description: "Toggle the page layout (pageless | pages) of an existing Google Doc. Sibling to the --pageless flag on docs create/write/update for docs that were already created (e.g. by Drive markdown conversion) without the desired layout.",
|
|
37720
|
-
annotations: { destructiveHint: true },
|
|
37750
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37721
37751
|
inputSchema: external_exports.object({
|
|
37722
37752
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37723
37753
|
layout: external_exports.enum(["pageless", "pages"]).optional().describe("Page layout (default: pageless)"),
|
|
@@ -37744,7 +37774,7 @@ function registerExtraDocsTools(server) {
|
|
|
37744
37774
|
});
|
|
37745
37775
|
server.registerTool("gog_docs_insert_table", {
|
|
37746
37776
|
description: "Insert a native Google Docs table via InsertTableRequest, bypassing the markdown writer. Use this instead of writing a markdown table when you need precise dimensions or to avoid the markdown writer's table limitations. `valuesJson` is a JSON 2D string array whose dimensions must match rows x cols.",
|
|
37747
|
-
annotations: { destructiveHint: true },
|
|
37777
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37748
37778
|
inputSchema: external_exports.object({
|
|
37749
37779
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37750
37780
|
rows: external_exports.number().int().min(1).describe("Number of rows (>=1)"),
|
|
@@ -37765,7 +37795,7 @@ function registerExtraDocsTools(server) {
|
|
|
37765
37795
|
});
|
|
37766
37796
|
server.registerTool("gog_docs_cell_update", {
|
|
37767
37797
|
description: "Replace (or append to) the content of a single table cell, addressed by table / row / column \u2014 non-destructive to the rest of the table, unlike index-based edits that shift on every change. Provide content inline or read it from contentFile. Note: row/col/tableIndex are 1-based here; the sibling gog_docs_cell_style uses 0-based addressing.",
|
|
37768
|
-
annotations: { destructiveHint: true },
|
|
37798
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37769
37799
|
inputSchema: external_exports.object({
|
|
37770
37800
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37771
37801
|
row: external_exports.number().int().describe("1-based row number"),
|
|
@@ -37796,7 +37826,7 @@ function registerExtraDocsTools(server) {
|
|
|
37796
37826
|
});
|
|
37797
37827
|
server.registerTool("gog_docs_cell_style", {
|
|
37798
37828
|
description: "Apply background color and/or inline text styling (bold, italic, underline, colors) to one or more table cells, addressed by 0-based row/column with optional spans. Sibling to gog_docs_cell_update, which changes cell content rather than styling. Note: row/col/tableIndex are 0-based here; gog_docs_cell_update uses 1-based addressing.",
|
|
37799
|
-
annotations: { destructiveHint: true },
|
|
37829
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37800
37830
|
inputSchema: external_exports.object({
|
|
37801
37831
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37802
37832
|
row: external_exports.number().int().describe("0-based row number"),
|
|
@@ -37851,7 +37881,7 @@ function registerExtraDocsTools(server) {
|
|
|
37851
37881
|
});
|
|
37852
37882
|
server.registerTool("gog_docs_insert_image", {
|
|
37853
37883
|
description: "Insert an image into a Google Doc from a local file or a public HTTPS URL. file: uploaded to Drive, temporarily shared so Docs can fetch it, inserted, then the public permission is revoked. url: inserted directly with no Drive upload or temporary sharing. Replaces placeholder text (at) or appends at end-of-doc.",
|
|
37854
|
-
annotations: { destructiveHint: true },
|
|
37884
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37855
37885
|
inputSchema: external_exports.object({
|
|
37856
37886
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37857
37887
|
file: external_exports.string().optional().describe("Local PNG, JPEG, or GIF image to upload and insert (exactly one of file or url)"),
|
|
@@ -37886,7 +37916,7 @@ function registerExtraDocsTools(server) {
|
|
|
37886
37916
|
});
|
|
37887
37917
|
server.registerTool("gog_docs_insert_person", {
|
|
37888
37918
|
description: "Insert a native Google Docs person smart chip (the interactive @-mention chip) for an email address, at a character index or end-of-doc.",
|
|
37889
|
-
annotations: { destructiveHint: true },
|
|
37919
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37890
37920
|
inputSchema: external_exports.object({
|
|
37891
37921
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37892
37922
|
email: external_exports.string().describe("Email address for the person chip"),
|
|
@@ -37912,7 +37942,7 @@ function registerExtraDocsTools(server) {
|
|
|
37912
37942
|
});
|
|
37913
37943
|
server.registerTool("gog_docs_insert_date_chip", {
|
|
37914
37944
|
description: "Insert a native Google Docs date smart chip, at a character index or end-of-doc.",
|
|
37915
|
-
annotations: { destructiveHint: true },
|
|
37945
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37916
37946
|
inputSchema: external_exports.object({
|
|
37917
37947
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37918
37948
|
date: external_exports.string().optional().describe("Date to insert as YYYY-MM-DD (default: today)"),
|
|
@@ -37935,7 +37965,7 @@ function registerExtraDocsTools(server) {
|
|
|
37935
37965
|
});
|
|
37936
37966
|
server.registerTool("gog_docs_add_tab", {
|
|
37937
37967
|
description: "Add a tab to a Google Doc. Tabs partition a doc into independently-addressable sections (multi-tab docs). Optionally set the title, zero-based position, parent tab (for nesting), and an emoji icon.",
|
|
37938
|
-
annotations: { destructiveHint: false },
|
|
37968
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
37939
37969
|
inputSchema: external_exports.object({
|
|
37940
37970
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37941
37971
|
title: external_exports.string().optional().describe("User-visible tab title"),
|
|
@@ -37954,7 +37984,7 @@ function registerExtraDocsTools(server) {
|
|
|
37954
37984
|
});
|
|
37955
37985
|
server.registerTool("gog_docs_rename_tab", {
|
|
37956
37986
|
description: "Rename a tab in a Google Doc. Identify the existing tab by title or ID and give it a new title.",
|
|
37957
|
-
annotations: { destructiveHint: false },
|
|
37987
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
37958
37988
|
inputSchema: external_exports.object({
|
|
37959
37989
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37960
37990
|
tab: external_exports.string().describe("Existing tab title or ID to rename"),
|
|
@@ -37967,7 +37997,7 @@ function registerExtraDocsTools(server) {
|
|
|
37967
37997
|
});
|
|
37968
37998
|
server.registerTool("gog_docs_delete_tab", {
|
|
37969
37999
|
description: "Delete a tab (and its content) from a Google Doc. Identify the tab by title or ID. This permanently removes the tab and everything in it.",
|
|
37970
|
-
annotations: { destructiveHint: true },
|
|
38000
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37971
38001
|
inputSchema: external_exports.object({
|
|
37972
38002
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37973
38003
|
tab: external_exports.string().describe("Existing tab title or ID to delete"),
|
|
@@ -37979,7 +38009,7 @@ function registerExtraDocsTools(server) {
|
|
|
37979
38009
|
});
|
|
37980
38010
|
server.registerTool("gog_docs_clear", {
|
|
37981
38011
|
description: "Clear all content from a Google Doc, leaving an empty document. The doc itself is preserved (same ID/URL); only its body content is removed. To delete the whole doc instead, use gog_docs_trash.",
|
|
37982
|
-
annotations: { destructiveHint: true },
|
|
38012
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37983
38013
|
inputSchema: external_exports.object({
|
|
37984
38014
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37985
38015
|
account: accountParam
|
|
@@ -37989,7 +38019,7 @@ function registerExtraDocsTools(server) {
|
|
|
37989
38019
|
});
|
|
37990
38020
|
server.registerTool("gog_docs_insert_footnote", {
|
|
37991
38021
|
description: "Insert a footnote at a character index (or end-of-doc) and populate its text. The footnote reference mark is placed in the body; the footnote content goes in the new footnote segment.",
|
|
37992
|
-
annotations: { destructiveHint: true },
|
|
38022
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37993
38023
|
inputSchema: external_exports.object({
|
|
37994
38024
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37995
38025
|
text: external_exports.string().optional().describe("Footnote text"),
|
|
@@ -38017,7 +38047,7 @@ function registerExtraDocsTools(server) {
|
|
|
38017
38047
|
});
|
|
38018
38048
|
server.registerTool("gog_docs_insert_section_break", {
|
|
38019
38049
|
description: "Insert a continuous or next-page section break at a character index (or end-of-doc). Section breaks enable per-section layout such as column counts (see gog_docs_section_columns).",
|
|
38020
|
-
annotations: { destructiveHint: true },
|
|
38050
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38021
38051
|
inputSchema: external_exports.object({
|
|
38022
38052
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38023
38053
|
type: external_exports.enum(["next-page", "continuous"]).optional().describe("Section break type (default: next-page)"),
|
|
@@ -38044,7 +38074,7 @@ function registerExtraDocsTools(server) {
|
|
|
38044
38074
|
});
|
|
38045
38075
|
server.registerTool("gog_docs_insert_horizontal_rule", {
|
|
38046
38076
|
description: "Insert a horizontal rule (paragraph border) at a character index (or end-of-doc).",
|
|
38047
|
-
annotations: { destructiveHint: true },
|
|
38077
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38048
38078
|
inputSchema: external_exports.object({
|
|
38049
38079
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38050
38080
|
index: external_exports.number().int().optional().describe("Character index to insert at (1 = beginning). Omit or use atEnd for end-of-doc."),
|
|
@@ -38069,7 +38099,7 @@ function registerExtraDocsTools(server) {
|
|
|
38069
38099
|
});
|
|
38070
38100
|
server.registerTool("gog_docs_section_columns", {
|
|
38071
38101
|
description: "Set the column count (1-3) for the document section containing the target position. Use count=1 to reset to a single column. Anchor by index, end-of-doc, or literal text.",
|
|
38072
|
-
annotations: { destructiveHint: true },
|
|
38102
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38073
38103
|
inputSchema: external_exports.object({
|
|
38074
38104
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38075
38105
|
count: external_exports.number().int().min(1).max(3).describe("Number of columns (1-3; 1 resets to one column)"),
|
|
@@ -38097,7 +38127,7 @@ function registerExtraDocsTools(server) {
|
|
|
38097
38127
|
});
|
|
38098
38128
|
server.registerTool("gog_docs_header_list", {
|
|
38099
38129
|
description: "List a Google Doc's headers and their segment IDs. Use a segment ID with the segment param on gog_docs_insert / gog_docs_update / gog_docs_delete / gog_docs_format / gog_docs_find_range to edit inside a header.",
|
|
38100
|
-
annotations: { readOnlyHint: true },
|
|
38130
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
38101
38131
|
inputSchema: external_exports.object({
|
|
38102
38132
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38103
38133
|
tab: external_exports.string().optional().describe("Limit results to a tab title or ID"),
|
|
@@ -38110,7 +38140,7 @@ function registerExtraDocsTools(server) {
|
|
|
38110
38140
|
});
|
|
38111
38141
|
server.registerTool("gog_docs_header_create", {
|
|
38112
38142
|
description: "Create a header in a Google Doc and optionally populate its initial text. Returns the new header segment ID.",
|
|
38113
|
-
annotations: { destructiveHint: false },
|
|
38143
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
38114
38144
|
inputSchema: external_exports.object({
|
|
38115
38145
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38116
38146
|
text: external_exports.string().optional().describe("Initial header text"),
|
|
@@ -38138,7 +38168,7 @@ function registerExtraDocsTools(server) {
|
|
|
38138
38168
|
});
|
|
38139
38169
|
server.registerTool("gog_docs_header_delete", {
|
|
38140
38170
|
description: "Delete a header from a Google Doc by its segment ID (from gog_docs_header_list).",
|
|
38141
|
-
annotations: { destructiveHint: true },
|
|
38171
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38142
38172
|
inputSchema: external_exports.object({
|
|
38143
38173
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38144
38174
|
headerId: external_exports.string().describe("Header segment ID (from gog_docs_header_list)"),
|
|
@@ -38153,7 +38183,7 @@ function registerExtraDocsTools(server) {
|
|
|
38153
38183
|
});
|
|
38154
38184
|
server.registerTool("gog_docs_footer_list", {
|
|
38155
38185
|
description: "List a Google Doc's footers and their segment IDs. Use a segment ID with the segment param on gog_docs_insert / gog_docs_update / gog_docs_delete / gog_docs_format / gog_docs_find_range to edit inside a footer.",
|
|
38156
|
-
annotations: { readOnlyHint: true },
|
|
38186
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
38157
38187
|
inputSchema: external_exports.object({
|
|
38158
38188
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38159
38189
|
tab: external_exports.string().optional().describe("Limit results to a tab title or ID"),
|
|
@@ -38166,7 +38196,7 @@ function registerExtraDocsTools(server) {
|
|
|
38166
38196
|
});
|
|
38167
38197
|
server.registerTool("gog_docs_footer_create", {
|
|
38168
38198
|
description: "Create a footer in a Google Doc and optionally populate its initial text. Returns the new footer segment ID.",
|
|
38169
|
-
annotations: { destructiveHint: false },
|
|
38199
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
38170
38200
|
inputSchema: external_exports.object({
|
|
38171
38201
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38172
38202
|
text: external_exports.string().optional().describe("Initial footer text"),
|
|
@@ -38194,7 +38224,7 @@ function registerExtraDocsTools(server) {
|
|
|
38194
38224
|
});
|
|
38195
38225
|
server.registerTool("gog_docs_footer_delete", {
|
|
38196
38226
|
description: "Delete a footer from a Google Doc by its segment ID (from gog_docs_footer_list).",
|
|
38197
|
-
annotations: { destructiveHint: true },
|
|
38227
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38198
38228
|
inputSchema: external_exports.object({
|
|
38199
38229
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38200
38230
|
footerId: external_exports.string().describe("Footer segment ID (from gog_docs_footer_list)"),
|
|
@@ -38209,7 +38239,7 @@ function registerExtraDocsTools(server) {
|
|
|
38209
38239
|
});
|
|
38210
38240
|
server.registerTool("gog_docs_replace_image", {
|
|
38211
38241
|
description: "Replace an existing image in a Google Doc in place \u2014 keeping its position and bounds \u2014 with a new image from a local file or public HTTPS URL. Target the image by exact object ID (from gog_docs_images_list), by alt-text substring, or leave both off to replace the only image in the doc/tab.",
|
|
38212
|
-
annotations: { destructiveHint: true },
|
|
38242
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38213
38243
|
inputSchema: external_exports.object({
|
|
38214
38244
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38215
38245
|
file: external_exports.string().optional().describe("Local PNG, JPEG, or GIF image to upload and use (exactly one of file or url)"),
|
|
@@ -38236,7 +38266,7 @@ function registerExtraDocsTools(server) {
|
|
|
38236
38266
|
});
|
|
38237
38267
|
server.registerTool("gog_docs_table_row_pin_header", {
|
|
38238
38268
|
description: "Pin (or unpin) leading rows of a native Google Docs table as repeating header rows. rows=N pins the first N rows; rows=0 unpins all header rows.",
|
|
38239
|
-
annotations: { destructiveHint: true },
|
|
38269
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38240
38270
|
inputSchema: external_exports.object({
|
|
38241
38271
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38242
38272
|
rows: external_exports.number().int().min(0).describe("Number of leading rows to pin as headers; 0 unpins all header rows"),
|
|
@@ -38252,7 +38282,7 @@ function registerExtraDocsTools(server) {
|
|
|
38252
38282
|
});
|
|
38253
38283
|
server.registerTool("gog_docs_table_row_style", {
|
|
38254
38284
|
description: "Set native table row height and page-overflow behaviour. Target a 1-based row (negative counts from the end) or omit row to style every row in the table.",
|
|
38255
|
-
annotations: { destructiveHint: true },
|
|
38285
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38256
38286
|
inputSchema: external_exports.object({
|
|
38257
38287
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38258
38288
|
row: external_exports.number().int().optional().describe("1-based row number; negative indexes count from the end; omit to style all rows"),
|