gogcli-mcp-docs 4.6.3 → 4.7.1
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 +158 -95
- package/manifest.json +23 -2
- package/package.json +2 -2
- package/server.json +20 -2
- package/src/tools/docs-extra.ts +70 -68
- package/tests/tool-annotations.test.ts +10 -0
package/dist/index.js
CHANGED
|
@@ -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) {
|
|
@@ -34731,6 +34746,7 @@ function escapeKey(key) {
|
|
|
34731
34746
|
var DEFAULT_REQUEST_KEY = "confirmation";
|
|
34732
34747
|
var DEFAULT_CONFIRMATION_LABEL = "Confirm this action should proceed.";
|
|
34733
34748
|
var UNSUPPORTED_NOTE = "Nothing was done because this client cannot show a confirmation prompt (it declares no MCP elicitation capability), and this action is never taken without one";
|
|
34749
|
+
var DISABLED_NOTE = "Nothing was done because confirmation prompts are turned off for this server, and this action is never taken without one";
|
|
34734
34750
|
var STATE_PREFIX = "mcpu.confirm.v1.";
|
|
34735
34751
|
function bindingKey(binding) {
|
|
34736
34752
|
if (binding.ttlSeconds !== void 0 && !(Number.isFinite(binding.ttlSeconds) && binding.ttlSeconds > 0)) {
|
|
@@ -34803,6 +34819,15 @@ ${JSON.stringify(preview, null, 2)}`,
|
|
|
34803
34819
|
};
|
|
34804
34820
|
const response = inputResponse(ctx.mcpReq.inputResponses, requestKey);
|
|
34805
34821
|
const accepted = acceptedContent(ctx.mcpReq.inputResponses, requestKey, confirmationSchema);
|
|
34822
|
+
if (options.elicitation === false) {
|
|
34823
|
+
return textResult({
|
|
34824
|
+
confirmed: false,
|
|
34825
|
+
dispatched: false,
|
|
34826
|
+
action: options.action,
|
|
34827
|
+
reason: "confirmation-unsupported",
|
|
34828
|
+
note: options.unsupportedNote ? `${DISABLED_NOTE}. ${options.unsupportedNote}` : `${DISABLED_NOTE}.`
|
|
34829
|
+
});
|
|
34830
|
+
}
|
|
34806
34831
|
if (response.kind === "missing") {
|
|
34807
34832
|
if (callerAcceptsFormElicitation(ctx) === false) {
|
|
34808
34833
|
return textResult({
|
|
@@ -34997,7 +35022,7 @@ async function tokenConfirmation(action, fb) {
|
|
|
34997
35022
|
}
|
|
34998
35023
|
async function requireConfirmationWithFallback(ctx, options) {
|
|
34999
35024
|
const { tokenFallback, ...confirmation } = options;
|
|
35000
|
-
if (tokenFallback && callerAcceptsFormElicitation(ctx) === false) {
|
|
35025
|
+
if (tokenFallback && (options.elicitation === false || callerAcceptsFormElicitation(ctx) === false)) {
|
|
35001
35026
|
return tokenConfirmation(options.action, tokenFallback);
|
|
35002
35027
|
}
|
|
35003
35028
|
return requireConfirmation(ctx, confirmation);
|
|
@@ -35017,7 +35042,7 @@ function readEnvVar(key, opts = {}) {
|
|
|
35017
35042
|
if (typeof raw === "string") {
|
|
35018
35043
|
const trimmed = raw.trim();
|
|
35019
35044
|
if (trimmed.length > 0 && trimmed !== "undefined" && trimmed !== "null" && !PLACEHOLDER_RE.test(trimmed)) {
|
|
35020
|
-
return trimmed;
|
|
35045
|
+
return opts.trim === false ? raw : trimmed;
|
|
35021
35046
|
}
|
|
35022
35047
|
}
|
|
35023
35048
|
return opts.default;
|
|
@@ -35143,6 +35168,20 @@ function readConfirmMode(env = process.env) {
|
|
|
35143
35168
|
}
|
|
35144
35169
|
return "refuse";
|
|
35145
35170
|
}
|
|
35171
|
+
function readConfirmElicitation(env = process.env) {
|
|
35172
|
+
const raw = readEnvVar("MCP_CONFIRM_ELICITATION", { env })?.trim().toLowerCase();
|
|
35173
|
+
if (!raw || raw === "on")
|
|
35174
|
+
return "on";
|
|
35175
|
+
if (raw === "off")
|
|
35176
|
+
return "off";
|
|
35177
|
+
const key = `elicitation:${raw}`;
|
|
35178
|
+
if (!warned.has(key)) {
|
|
35179
|
+
warned.add(key);
|
|
35180
|
+
process.stderr.write(`MCP_CONFIRM_ELICITATION="${raw}" is not one of on, off; treating it as on.
|
|
35181
|
+
`);
|
|
35182
|
+
}
|
|
35183
|
+
return "on";
|
|
35184
|
+
}
|
|
35146
35185
|
function readConfirmTtl(env) {
|
|
35147
35186
|
const raw = readEnvVar("MCP_CONFIRM_TTL_SECONDS", { env })?.trim();
|
|
35148
35187
|
if (!raw)
|
|
@@ -35187,6 +35226,7 @@ function spentTokenStoreFromEnv(env = process.env) {
|
|
|
35187
35226
|
}
|
|
35188
35227
|
var CONFIRM_TOKEN_AUTO_INSTRUCTION = "Nothing has been done yet. Review this preview; if it is what was intended, call again with the same arguments plus confirmToken. (This server runs with MCP_CONFIRM_MODE=auto, so the user's approval in chat is not required.)";
|
|
35189
35228
|
var REFUSE_HINT = "Set MCP_CONFIRM_MODE=ask-user on the server to allow two-step confirmation instead.";
|
|
35229
|
+
var ELICITATION_OFF_HINT = "MCP_CONFIRM_ELICITATION=off on the server turns confirmation prompts off.";
|
|
35190
35230
|
var BAD_TTL_HINT = "MCP_CONFIRM_TTL_SECONDS on the server is not a positive whole number of seconds; fix it to allow two-step confirmation.";
|
|
35191
35231
|
function boundArgs(args) {
|
|
35192
35232
|
if (args === null || typeof args !== "object" || Array.isArray(args) || !("confirmToken" in args))
|
|
@@ -35197,19 +35237,29 @@ function boundArgs(args) {
|
|
|
35197
35237
|
}
|
|
35198
35238
|
function confirmationFromEnv(options) {
|
|
35199
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
|
+
}
|
|
35200
35243
|
const spent2 = callerSpent ?? spentTokenStoreFromEnv(env);
|
|
35201
35244
|
const mode = readConfirmMode(env);
|
|
35202
35245
|
const ttlSeconds = readConfirmTtl(env);
|
|
35203
|
-
const
|
|
35204
|
-
const
|
|
35246
|
+
const elicitationOff = readConfirmElicitation(env) === "off";
|
|
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
|
+
};
|
|
35253
|
+
const confirmation = elicitationOff ? { ...bindingAdded, elicitation: false } : bindingAdded;
|
|
35205
35254
|
if (mode === "refuse" || ttlSeconds === void 0) {
|
|
35206
|
-
const
|
|
35255
|
+
const reason = mode === "refuse" ? REFUSE_HINT : BAD_TTL_HINT;
|
|
35256
|
+
const hint = elicitationOff ? `${ELICITATION_OFF_HINT} ${reason}` : reason;
|
|
35207
35257
|
return {
|
|
35208
35258
|
...confirmation,
|
|
35209
35259
|
unsupportedNote: confirmation.unsupportedNote ? `${confirmation.unsupportedNote} ${hint}` : hint
|
|
35210
35260
|
};
|
|
35211
35261
|
}
|
|
35212
|
-
const boundSubject =
|
|
35262
|
+
const boundSubject = async () => {
|
|
35213
35263
|
const read = await subject();
|
|
35214
35264
|
if ("content" in read)
|
|
35215
35265
|
return read;
|
|
@@ -35236,12 +35286,14 @@ var SERVER_PROTOCOL_VERSIONS = Object.freeze([
|
|
|
35236
35286
|
...SUPPORTED_PROTOCOL_VERSIONS
|
|
35237
35287
|
]);
|
|
35238
35288
|
function hintResultOrRethrow(err) {
|
|
35289
|
+
if (err instanceof ProtocolError && err.code === ProtocolErrorCode.UrlElicitationRequired)
|
|
35290
|
+
throw err;
|
|
35239
35291
|
if (err instanceof McpToolError && err.hint) {
|
|
35240
35292
|
return errorResult(`${err.message}
|
|
35241
35293
|
|
|
35242
35294
|
Hint: ${err.hint}`);
|
|
35243
35295
|
}
|
|
35244
|
-
|
|
35296
|
+
return errorResult(messageOf(err));
|
|
35245
35297
|
}
|
|
35246
35298
|
function mcpRequestFrom(args) {
|
|
35247
35299
|
const ctx = args.at(-1);
|
|
@@ -35475,7 +35527,7 @@ var PositiveInt = external_exports.number().int().positive();
|
|
|
35475
35527
|
var NonNegInt = external_exports.number().int().nonnegative();
|
|
35476
35528
|
var NonEmptyString = external_exports.string().min(1);
|
|
35477
35529
|
var IsoDate = external_exports.iso.date();
|
|
35478
|
-
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"));
|
|
35479
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.");
|
|
35480
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.');
|
|
35481
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.");
|
|
@@ -36175,7 +36227,7 @@ function registerRunTool(server, options) {
|
|
|
36175
36227
|
}
|
|
36176
36228
|
server.registerTool(`gog_${service}_run`, {
|
|
36177
36229
|
description,
|
|
36178
|
-
annotations: { destructiveHint: true },
|
|
36230
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36179
36231
|
inputSchema: external_exports.object(inputSchema)
|
|
36180
36232
|
}, async (rawArgs) => {
|
|
36181
36233
|
const { subcommand, args, account } = rawArgs;
|
|
@@ -36371,11 +36423,20 @@ async function requireDispatchConfirmation(ctx, options) {
|
|
|
36371
36423
|
confirmationLabel: options.confirmationLabel,
|
|
36372
36424
|
...options.unsupportedNote ? { unsupportedNote: options.unsupportedNote } : {}
|
|
36373
36425
|
};
|
|
36374
|
-
if (!fallback)
|
|
36426
|
+
if (!fallback) {
|
|
36427
|
+
if (readConfirmElicitation() !== "off") return requireConfirmationWithFallback(ctx, confirmation);
|
|
36428
|
+
const offNote = "MCP_CONFIRM_ELICITATION=off on the server turns confirmation prompts off.";
|
|
36429
|
+
return requireConfirmationWithFallback(ctx, {
|
|
36430
|
+
...confirmation,
|
|
36431
|
+
elicitation: false,
|
|
36432
|
+
unsupportedNote: confirmation.unsupportedNote ? `${offNote} ${confirmation.unsupportedNote}` : offNote
|
|
36433
|
+
});
|
|
36434
|
+
}
|
|
36375
36435
|
return requireConfirmationWithFallback(ctx, confirmationFromEnv({
|
|
36376
36436
|
...confirmation,
|
|
36377
36437
|
tool: fallback.tool,
|
|
36378
36438
|
account: fallback.account ?? readEnvVar("GOG_ACCOUNT") ?? "",
|
|
36439
|
+
args: fallback.args,
|
|
36379
36440
|
confirmToken: fallback.confirmToken,
|
|
36380
36441
|
subject: fallback.subject,
|
|
36381
36442
|
instruction: fallback.instruction ?? CONFIRM_ACTION_INSTRUCTION,
|
|
@@ -36388,13 +36449,13 @@ function resultText(result) {
|
|
|
36388
36449
|
}
|
|
36389
36450
|
|
|
36390
36451
|
// ../gogcli-mcp/src/tools/auth.ts
|
|
36391
|
-
var AUTH_RUN_SUBCOMMANDS = ["list", "status", "services", "
|
|
36452
|
+
var AUTH_RUN_SUBCOMMANDS = ["list", "status", "services", "alias"];
|
|
36392
36453
|
function registerAuthToolsWith(server, defaultServices) {
|
|
36393
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.`;
|
|
36394
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.";
|
|
36395
36456
|
server.registerTool("gog_auth_list", {
|
|
36396
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.",
|
|
36397
|
-
annotations: { readOnlyHint: true },
|
|
36458
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
36398
36459
|
inputSchema: external_exports.object({})
|
|
36399
36460
|
}, async () => {
|
|
36400
36461
|
try {
|
|
@@ -36405,7 +36466,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36405
36466
|
});
|
|
36406
36467
|
server.registerTool("gog_auth_status", {
|
|
36407
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.",
|
|
36408
|
-
annotations: { readOnlyHint: true },
|
|
36469
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
36409
36470
|
inputSchema: external_exports.object({})
|
|
36410
36471
|
}, async () => {
|
|
36411
36472
|
try {
|
|
@@ -36416,7 +36477,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36416
36477
|
});
|
|
36417
36478
|
server.registerTool("gog_auth_health", {
|
|
36418
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.`,
|
|
36419
|
-
annotations: { readOnlyHint: true },
|
|
36480
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
36420
36481
|
inputSchema: external_exports.object({})
|
|
36421
36482
|
}, async () => {
|
|
36422
36483
|
try {
|
|
@@ -36427,7 +36488,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36427
36488
|
});
|
|
36428
36489
|
server.registerTool("gog_auth_services", {
|
|
36429
36490
|
description: "List all Google services supported by gogcli and the OAuth scopes each requires.",
|
|
36430
|
-
annotations: { readOnlyHint: true },
|
|
36491
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
36431
36492
|
inputSchema: external_exports.object({})
|
|
36432
36493
|
}, async () => {
|
|
36433
36494
|
try {
|
|
@@ -36438,7 +36499,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36438
36499
|
});
|
|
36439
36500
|
server.registerTool("gog_auth_add", {
|
|
36440
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.",
|
|
36441
|
-
annotations: { destructiveHint: true },
|
|
36502
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36442
36503
|
inputSchema: external_exports.object({
|
|
36443
36504
|
email: external_exports.string().describe("Google account email to authorize"),
|
|
36444
36505
|
services: external_exports.string().optional().default(defaultServices).describe(servicesDescribe),
|
|
@@ -36458,7 +36519,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36458
36519
|
});
|
|
36459
36520
|
server.registerTool("gog_auth_add_url", {
|
|
36460
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.",
|
|
36461
|
-
annotations: { readOnlyHint: true },
|
|
36522
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
36462
36523
|
inputSchema: external_exports.object({
|
|
36463
36524
|
email: external_exports.string().describe("Google account email to authorize"),
|
|
36464
36525
|
services: external_exports.string().optional().default(defaultServices).describe(servicesDescribe),
|
|
@@ -36475,7 +36536,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36475
36536
|
});
|
|
36476
36537
|
server.registerTool("gog_auth_add_complete", {
|
|
36477
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.",
|
|
36478
|
-
annotations: { destructiveHint: true },
|
|
36539
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36479
36540
|
inputSchema: external_exports.object({
|
|
36480
36541
|
email: external_exports.string().describe("Google account email being authorized (same as step 1)"),
|
|
36481
36542
|
redirectUrl: external_exports.string().describe(
|
|
@@ -36511,7 +36572,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
36511
36572
|
});
|
|
36512
36573
|
registerRunTool(server, {
|
|
36513
36574
|
service: "auth",
|
|
36514
|
-
examples: '"
|
|
36575
|
+
examples: '"alias", "list", "status"',
|
|
36515
36576
|
omitAccount: true,
|
|
36516
36577
|
allowedSubcommands: AUTH_RUN_SUBCOMMANDS,
|
|
36517
36578
|
note: "For browser-based authorization, use gog_auth_add instead."
|
|
@@ -36579,7 +36640,7 @@ function vetDocsRun(subcommand, args) {
|
|
|
36579
36640
|
function registerDocsTools(server) {
|
|
36580
36641
|
server.registerTool("gog_docs_info", {
|
|
36581
36642
|
description: "Get Google Doc metadata: title, ID, and other properties.",
|
|
36582
|
-
annotations: { readOnlyHint: true },
|
|
36643
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
36583
36644
|
inputSchema: external_exports.object({
|
|
36584
36645
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36585
36646
|
account: accountParam
|
|
@@ -36589,7 +36650,7 @@ function registerDocsTools(server) {
|
|
|
36589
36650
|
});
|
|
36590
36651
|
server.registerTool("gog_docs_cat", {
|
|
36591
36652
|
description: "Read a Google Doc as plain text.",
|
|
36592
|
-
annotations: { readOnlyHint: true },
|
|
36653
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
36593
36654
|
inputSchema: external_exports.object({
|
|
36594
36655
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36595
36656
|
chips: external_exports.boolean().optional().describe("Render Google Docs smart chips (people, dates, rich links) inline in the text output"),
|
|
@@ -36602,7 +36663,7 @@ function registerDocsTools(server) {
|
|
|
36602
36663
|
});
|
|
36603
36664
|
server.registerTool("gog_docs_create", {
|
|
36604
36665
|
description: "Create a new Google Doc. Returns JSON with the new docId and URL.",
|
|
36605
|
-
annotations: { destructiveHint: true },
|
|
36666
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36606
36667
|
inputSchema: external_exports.object({
|
|
36607
36668
|
title: external_exports.string().describe("Title for the new document"),
|
|
36608
36669
|
account: accountParam
|
|
@@ -36612,7 +36673,7 @@ function registerDocsTools(server) {
|
|
|
36612
36673
|
});
|
|
36613
36674
|
server.registerTool("gog_docs_write", {
|
|
36614
36675
|
description: "Write text content to a Google Doc, replacing existing body content by default. Set append=true to add after existing content.",
|
|
36615
|
-
annotations: { destructiveHint: true },
|
|
36676
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36616
36677
|
inputSchema: external_exports.object({
|
|
36617
36678
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36618
36679
|
text: external_exports.string().describe("Text content to write"),
|
|
@@ -36652,7 +36713,7 @@ function registerDocsTools(server) {
|
|
|
36652
36713
|
});
|
|
36653
36714
|
server.registerTool("gog_docs_find_replace", {
|
|
36654
36715
|
description: "Find and replace text in a Google Doc.",
|
|
36655
|
-
annotations: { destructiveHint: true },
|
|
36716
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36656
36717
|
inputSchema: external_exports.object({
|
|
36657
36718
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36658
36719
|
find: external_exports.string().describe("Text to find"),
|
|
@@ -36664,7 +36725,7 @@ function registerDocsTools(server) {
|
|
|
36664
36725
|
});
|
|
36665
36726
|
server.registerTool("gog_docs_structure", {
|
|
36666
36727
|
description: "Show a Google Doc's structure with numbered paragraphs. Useful for understanding the document layout before making index-based edits.",
|
|
36667
|
-
annotations: { readOnlyHint: true },
|
|
36728
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
36668
36729
|
inputSchema: external_exports.object({
|
|
36669
36730
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36670
36731
|
account: accountParam
|
|
@@ -36730,7 +36791,7 @@ var failIfNotEmptyParam = external_exports.boolean().optional().describe(
|
|
|
36730
36791
|
);
|
|
36731
36792
|
|
|
36732
36793
|
// ../gogcli-mcp/src/server.ts
|
|
36733
|
-
var VERSION = true ? "4.
|
|
36794
|
+
var VERSION = true ? "4.7.1" : "0.0.0";
|
|
36734
36795
|
|
|
36735
36796
|
// ../gogcli-mcp/src/bootstrap-auth.ts
|
|
36736
36797
|
import { join as join7 } from "node:path";
|
|
@@ -36817,7 +36878,7 @@ function docTitle(raw) {
|
|
|
36817
36878
|
function registerExtraDocsTools(server) {
|
|
36818
36879
|
server.registerTool("gog_docs_copy", {
|
|
36819
36880
|
description: "Copy a Google Doc to a new document with the given title.",
|
|
36820
|
-
annotations: { destructiveHint: true },
|
|
36881
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36821
36882
|
inputSchema: external_exports.object({
|
|
36822
36883
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36823
36884
|
title: external_exports.string().describe("Title for the new copy"),
|
|
@@ -36831,7 +36892,7 @@ function registerExtraDocsTools(server) {
|
|
|
36831
36892
|
});
|
|
36832
36893
|
server.registerTool("gog_docs_delete", {
|
|
36833
36894
|
description: "Delete content within a Google Doc by character index range. To remove the entire document (move to Drive trash), use gog_docs_trash.",
|
|
36834
|
-
annotations: { destructiveHint: true },
|
|
36895
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36835
36896
|
inputSchema: external_exports.object({
|
|
36836
36897
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36837
36898
|
start: external_exports.number().optional().describe("Start index (character position, 1-based). Required unless `at` is set."),
|
|
@@ -36859,7 +36920,7 @@ function registerExtraDocsTools(server) {
|
|
|
36859
36920
|
});
|
|
36860
36921
|
server.registerTool("gog_docs_trash", {
|
|
36861
36922
|
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.",
|
|
36862
|
-
annotations: { destructiveHint: true },
|
|
36923
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36863
36924
|
inputSchema: external_exports.object({
|
|
36864
36925
|
docId: external_exports.string().describe("Doc ID to move to trash"),
|
|
36865
36926
|
account: accountParam
|
|
@@ -36869,7 +36930,7 @@ function registerExtraDocsTools(server) {
|
|
|
36869
36930
|
});
|
|
36870
36931
|
server.registerTool("gog_docs_edit", {
|
|
36871
36932
|
description: "Edit a Google Doc by finding and replacing text (stream-edit style).",
|
|
36872
|
-
annotations: { destructiveHint: true },
|
|
36933
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36873
36934
|
inputSchema: external_exports.object({
|
|
36874
36935
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36875
36936
|
find: external_exports.string().describe("Text to find"),
|
|
@@ -36884,7 +36945,7 @@ function registerExtraDocsTools(server) {
|
|
|
36884
36945
|
});
|
|
36885
36946
|
server.registerTool("gog_docs_read", {
|
|
36886
36947
|
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.',
|
|
36887
|
-
annotations: { readOnlyHint: true },
|
|
36948
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
36888
36949
|
inputSchema: external_exports.object({
|
|
36889
36950
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36890
36951
|
format: external_exports.enum(["text", "json"]).optional().describe("Output format (default: text)"),
|
|
@@ -36910,7 +36971,7 @@ function registerExtraDocsTools(server) {
|
|
|
36910
36971
|
});
|
|
36911
36972
|
server.registerTool("gog_docs_format", {
|
|
36912
36973
|
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.",
|
|
36913
|
-
annotations: { destructiveHint: true },
|
|
36974
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
36914
36975
|
inputSchema: external_exports.object({
|
|
36915
36976
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
36916
36977
|
match: external_exports.string().optional().describe("Format only the first text match"),
|
|
@@ -36996,7 +37057,7 @@ function registerExtraDocsTools(server) {
|
|
|
36996
37057
|
});
|
|
36997
37058
|
server.registerTool("gog_docs_suggestions_list", {
|
|
36998
37059
|
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.",
|
|
36999
|
-
annotations: { readOnlyHint: true },
|
|
37060
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37000
37061
|
inputSchema: external_exports.object({
|
|
37001
37062
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37002
37063
|
tab: external_exports.string().optional().describe("Tab title or ID (omit for the first tab)"),
|
|
@@ -37010,7 +37071,7 @@ function registerExtraDocsTools(server) {
|
|
|
37010
37071
|
server.registerTool("gog_docs_export", {
|
|
37011
37072
|
description: "Export a Google Doc as PDF, plain text, HTML, DOCX, or other format.",
|
|
37012
37073
|
// Writes a file on the gog host and can overwrite one: not read-only (audit SEC-4).
|
|
37013
|
-
annotations: { readOnlyHint: false, destructiveHint: true },
|
|
37074
|
+
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
|
|
37014
37075
|
inputSchema: external_exports.object({
|
|
37015
37076
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37016
37077
|
format: external_exports.string().optional().describe("Export format: pdf, txt, html, docx, rtf, odt, epub (default: pdf)"),
|
|
@@ -37028,7 +37089,7 @@ function registerExtraDocsTools(server) {
|
|
|
37028
37089
|
});
|
|
37029
37090
|
server.registerTool("gog_docs_insert", {
|
|
37030
37091
|
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.",
|
|
37031
|
-
annotations: { destructiveHint: true },
|
|
37092
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37032
37093
|
inputSchema: external_exports.object({
|
|
37033
37094
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37034
37095
|
content: external_exports.string().optional().describe("Text content to insert"),
|
|
@@ -37058,7 +37119,7 @@ function registerExtraDocsTools(server) {
|
|
|
37058
37119
|
});
|
|
37059
37120
|
server.registerTool("gog_docs_append", {
|
|
37060
37121
|
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).",
|
|
37061
|
-
annotations: { destructiveHint: true },
|
|
37122
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37062
37123
|
inputSchema: external_exports.object({
|
|
37063
37124
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37064
37125
|
text: external_exports.string().optional().describe("Text content to append"),
|
|
@@ -37078,7 +37139,7 @@ function registerExtraDocsTools(server) {
|
|
|
37078
37139
|
});
|
|
37079
37140
|
server.registerTool("gog_docs_list_tabs", {
|
|
37080
37141
|
description: "List all tabs in a Google Doc.",
|
|
37081
|
-
annotations: { readOnlyHint: true },
|
|
37142
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37082
37143
|
inputSchema: external_exports.object({
|
|
37083
37144
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37084
37145
|
account: accountParam
|
|
@@ -37088,7 +37149,7 @@ function registerExtraDocsTools(server) {
|
|
|
37088
37149
|
});
|
|
37089
37150
|
server.registerTool("gog_docs_sed", {
|
|
37090
37151
|
description: "Stream-edit a Google Doc with sed-like regex expressions (s/find/replace/ syntax).",
|
|
37091
|
-
annotations: { destructiveHint: true },
|
|
37152
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37092
37153
|
inputSchema: external_exports.object({
|
|
37093
37154
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37094
37155
|
expression: external_exports.string().optional().describe('Single sed expression (e.g. "s/old/new/g")'),
|
|
@@ -37112,7 +37173,7 @@ function registerExtraDocsTools(server) {
|
|
|
37112
37173
|
});
|
|
37113
37174
|
server.registerTool("gog_docs_update", {
|
|
37114
37175
|
description: "Update a Google Doc \u2014 insert or replace text at a specific position.",
|
|
37115
|
-
annotations: { destructiveHint: true },
|
|
37176
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37116
37177
|
inputSchema: external_exports.object({
|
|
37117
37178
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37118
37179
|
text: external_exports.string().optional().describe("Text content to write"),
|
|
@@ -37148,7 +37209,7 @@ function registerExtraDocsTools(server) {
|
|
|
37148
37209
|
});
|
|
37149
37210
|
server.registerTool("gog_docs_comments_list", {
|
|
37150
37211
|
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.",
|
|
37151
|
-
annotations: { readOnlyHint: true },
|
|
37212
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37152
37213
|
inputSchema: external_exports.object({
|
|
37153
37214
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37154
37215
|
includeResolved: external_exports.boolean().optional().describe("Include resolved comments (default: false, open only)"),
|
|
@@ -37169,7 +37230,7 @@ function registerExtraDocsTools(server) {
|
|
|
37169
37230
|
});
|
|
37170
37231
|
server.registerTool("gog_docs_comments_get", {
|
|
37171
37232
|
description: "Get a single comment by ID, including its replies.",
|
|
37172
|
-
annotations: { readOnlyHint: true },
|
|
37233
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37173
37234
|
inputSchema: external_exports.object({
|
|
37174
37235
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37175
37236
|
commentId: external_exports.string().describe("Comment ID"),
|
|
@@ -37180,7 +37241,7 @@ function registerExtraDocsTools(server) {
|
|
|
37180
37241
|
});
|
|
37181
37242
|
server.registerTool("gog_docs_comments_add", {
|
|
37182
37243
|
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,
|
|
37183
|
-
annotations: { destructiveHint: false },
|
|
37244
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
37184
37245
|
inputSchema: external_exports.object({
|
|
37185
37246
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37186
37247
|
content: external_exports.string().describe("Comment text"),
|
|
@@ -37203,6 +37264,7 @@ function registerExtraDocsTools(server) {
|
|
|
37203
37264
|
details: { doc, textPreview: bodyPreview(content), quoted, mentions },
|
|
37204
37265
|
unsupportedNote: "Ask the user to comment from Google Docs.",
|
|
37205
37266
|
fallback: {
|
|
37267
|
+
args: { docId, content, quoted, account },
|
|
37206
37268
|
tool: "gog_docs_comments_add",
|
|
37207
37269
|
account,
|
|
37208
37270
|
confirmToken,
|
|
@@ -37217,7 +37279,7 @@ function registerExtraDocsTools(server) {
|
|
|
37217
37279
|
});
|
|
37218
37280
|
server.registerTool("gog_docs_comments_reply", {
|
|
37219
37281
|
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,
|
|
37220
|
-
annotations: { destructiveHint: false },
|
|
37282
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
37221
37283
|
inputSchema: external_exports.object({
|
|
37222
37284
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37223
37285
|
commentId: external_exports.string().describe("Comment ID to reply to"),
|
|
@@ -37241,6 +37303,7 @@ function registerExtraDocsTools(server) {
|
|
|
37241
37303
|
details: { doc, replyingTo, textPreview: bodyPreview(content), mentions },
|
|
37242
37304
|
unsupportedNote: "Ask the user to reply from Google Docs.",
|
|
37243
37305
|
fallback: {
|
|
37306
|
+
args: { docId, commentId, content, account },
|
|
37244
37307
|
tool: "gog_docs_comments_reply",
|
|
37245
37308
|
account,
|
|
37246
37309
|
confirmToken,
|
|
@@ -37255,7 +37318,7 @@ function registerExtraDocsTools(server) {
|
|
|
37255
37318
|
});
|
|
37256
37319
|
server.registerTool("gog_docs_comments_resolve", {
|
|
37257
37320
|
description: "Resolve a comment (mark as done). Optionally include a closing message.",
|
|
37258
|
-
annotations: { destructiveHint: true },
|
|
37321
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37259
37322
|
inputSchema: external_exports.object({
|
|
37260
37323
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37261
37324
|
commentId: external_exports.string().describe("Comment ID to resolve"),
|
|
@@ -37269,7 +37332,7 @@ function registerExtraDocsTools(server) {
|
|
|
37269
37332
|
});
|
|
37270
37333
|
server.registerTool("gog_docs_comments_delete", {
|
|
37271
37334
|
description: "Delete a comment from a Google Doc. This action is permanent.",
|
|
37272
|
-
annotations: { destructiveHint: true },
|
|
37335
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37273
37336
|
inputSchema: external_exports.object({
|
|
37274
37337
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37275
37338
|
commentId: external_exports.string().describe("Comment ID to delete"),
|
|
@@ -37280,7 +37343,7 @@ function registerExtraDocsTools(server) {
|
|
|
37280
37343
|
});
|
|
37281
37344
|
server.registerTool("gog_docs_comments_reopen", {
|
|
37282
37345
|
description: "Reopen a previously resolved comment (flip resolved \u2192 open).",
|
|
37283
|
-
annotations: { destructiveHint: true },
|
|
37346
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37284
37347
|
inputSchema: external_exports.object({
|
|
37285
37348
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37286
37349
|
commentId: external_exports.string().describe("Comment ID to reopen"),
|
|
@@ -37291,7 +37354,7 @@ function registerExtraDocsTools(server) {
|
|
|
37291
37354
|
});
|
|
37292
37355
|
server.registerTool("gog_docs_comments_locate", {
|
|
37293
37356
|
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.",
|
|
37294
|
-
annotations: { readOnlyHint: true },
|
|
37357
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37295
37358
|
inputSchema: external_exports.object({
|
|
37296
37359
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37297
37360
|
commentId: external_exports.string().describe("Comment ID to locate"),
|
|
@@ -37309,7 +37372,7 @@ function registerExtraDocsTools(server) {
|
|
|
37309
37372
|
});
|
|
37310
37373
|
server.registerTool("gog_docs_find_range", {
|
|
37311
37374
|
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.",
|
|
37312
|
-
annotations: { readOnlyHint: true },
|
|
37375
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37313
37376
|
inputSchema: external_exports.object({
|
|
37314
37377
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37315
37378
|
text: external_exports.string().describe("Literal text to locate"),
|
|
@@ -37335,7 +37398,7 @@ function registerExtraDocsTools(server) {
|
|
|
37335
37398
|
});
|
|
37336
37399
|
server.registerTool("gog_batch_begin", {
|
|
37337
37400
|
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.",
|
|
37338
|
-
annotations: { destructiveHint: false },
|
|
37401
|
+
annotations: { destructiveHint: false, openWorldHint: false },
|
|
37339
37402
|
inputSchema: external_exports.object({
|
|
37340
37403
|
docId: external_exports.string().describe("Google Doc ID the batch is locked to"),
|
|
37341
37404
|
name: external_exports.string().optional().describe("Optional batch label"),
|
|
@@ -37348,7 +37411,7 @@ function registerExtraDocsTools(server) {
|
|
|
37348
37411
|
});
|
|
37349
37412
|
server.registerTool("gog_batch_end", {
|
|
37350
37413
|
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.",
|
|
37351
|
-
annotations: { destructiveHint: true },
|
|
37414
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37352
37415
|
inputSchema: external_exports.object({
|
|
37353
37416
|
batchId: external_exports.string().describe("Batch ID (from gog_batch_begin)"),
|
|
37354
37417
|
autoSplit: external_exports.boolean().optional().describe("Submit batches over 500 requests as ordered chunks (non-atomic)"),
|
|
@@ -37363,7 +37426,7 @@ function registerExtraDocsTools(server) {
|
|
|
37363
37426
|
});
|
|
37364
37427
|
server.registerTool("gog_batch_abort", {
|
|
37365
37428
|
description: "Discard a persisted batch and its composed requests without applying anything to the doc.",
|
|
37366
|
-
annotations: { destructiveHint: true },
|
|
37429
|
+
annotations: { destructiveHint: true, openWorldHint: false },
|
|
37367
37430
|
inputSchema: external_exports.object({
|
|
37368
37431
|
batchId: external_exports.string().describe("Batch ID to discard"),
|
|
37369
37432
|
account: accountParam
|
|
@@ -37373,7 +37436,7 @@ function registerExtraDocsTools(server) {
|
|
|
37373
37436
|
});
|
|
37374
37437
|
server.registerTool("gog_batch_list", {
|
|
37375
37438
|
description: "List persisted Docs request batches (id, doc, label, request count, status).",
|
|
37376
|
-
annotations: { readOnlyHint: true },
|
|
37439
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
37377
37440
|
inputSchema: external_exports.object({
|
|
37378
37441
|
account: accountParam
|
|
37379
37442
|
})
|
|
@@ -37382,7 +37445,7 @@ function registerExtraDocsTools(server) {
|
|
|
37382
37445
|
});
|
|
37383
37446
|
server.registerTool("gog_batch_show", {
|
|
37384
37447
|
description: "Show one persisted batch: its doc, locked revision, and the composed requests awaiting submission.",
|
|
37385
|
-
annotations: { readOnlyHint: true },
|
|
37448
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
37386
37449
|
inputSchema: external_exports.object({
|
|
37387
37450
|
batchId: external_exports.string().describe("Batch ID"),
|
|
37388
37451
|
account: accountParam
|
|
@@ -37392,7 +37455,7 @@ function registerExtraDocsTools(server) {
|
|
|
37392
37455
|
});
|
|
37393
37456
|
server.registerTool("gog_batch_prune", {
|
|
37394
37457
|
description: "Delete stale persisted batches (not updated within olderThan).",
|
|
37395
|
-
annotations: { destructiveHint: true },
|
|
37458
|
+
annotations: { destructiveHint: true, openWorldHint: false },
|
|
37396
37459
|
inputSchema: external_exports.object({
|
|
37397
37460
|
olderThan: external_exports.string().optional().describe("Delete batches not updated within this duration (e.g. 72h, 7d)"),
|
|
37398
37461
|
account: accountParam
|
|
@@ -37404,7 +37467,7 @@ function registerExtraDocsTools(server) {
|
|
|
37404
37467
|
});
|
|
37405
37468
|
server.registerTool("gog_docs_table_column_width", {
|
|
37406
37469
|
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.",
|
|
37407
|
-
annotations: { destructiveHint: true },
|
|
37470
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37408
37471
|
inputSchema: external_exports.object({
|
|
37409
37472
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37410
37473
|
col: external_exports.number().int().optional().describe("1-based column number. Omit with evenlyDistributed to reset all columns."),
|
|
@@ -37428,7 +37491,7 @@ function registerExtraDocsTools(server) {
|
|
|
37428
37491
|
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)");
|
|
37429
37492
|
server.registerTool("gog_docs_table_row_insert", {
|
|
37430
37493
|
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).',
|
|
37431
|
-
annotations: { destructiveHint: true },
|
|
37494
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37432
37495
|
inputSchema: external_exports.object({
|
|
37433
37496
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37434
37497
|
table: tableSelectorParam,
|
|
@@ -37447,7 +37510,7 @@ function registerExtraDocsTools(server) {
|
|
|
37447
37510
|
});
|
|
37448
37511
|
server.registerTool("gog_docs_table_row_delete", {
|
|
37449
37512
|
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.",
|
|
37450
|
-
annotations: { destructiveHint: true },
|
|
37513
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37451
37514
|
inputSchema: external_exports.object({
|
|
37452
37515
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37453
37516
|
row: external_exports.number().int().describe("1-based row number; negative indexes count from the end"),
|
|
@@ -37463,7 +37526,7 @@ function registerExtraDocsTools(server) {
|
|
|
37463
37526
|
});
|
|
37464
37527
|
server.registerTool("gog_docs_table_column_insert", {
|
|
37465
37528
|
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).',
|
|
37466
|
-
annotations: { destructiveHint: true },
|
|
37529
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37467
37530
|
inputSchema: external_exports.object({
|
|
37468
37531
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37469
37532
|
table: tableSelectorParam,
|
|
@@ -37480,7 +37543,7 @@ function registerExtraDocsTools(server) {
|
|
|
37480
37543
|
});
|
|
37481
37544
|
server.registerTool("gog_docs_table_column_delete", {
|
|
37482
37545
|
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.",
|
|
37483
|
-
annotations: { destructiveHint: true },
|
|
37546
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37484
37547
|
inputSchema: external_exports.object({
|
|
37485
37548
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37486
37549
|
col: external_exports.number().int().describe("1-based column number; negative indexes count from the end"),
|
|
@@ -37496,7 +37559,7 @@ function registerExtraDocsTools(server) {
|
|
|
37496
37559
|
});
|
|
37497
37560
|
server.registerTool("gog_docs_table_merge", {
|
|
37498
37561
|
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.",
|
|
37499
|
-
annotations: { destructiveHint: true },
|
|
37562
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37500
37563
|
inputSchema: external_exports.object({
|
|
37501
37564
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37502
37565
|
range: external_exports.string().describe('1-based cell range r1,c1:r2,c2 (e.g. "1,1:2,3")'),
|
|
@@ -37512,7 +37575,7 @@ function registerExtraDocsTools(server) {
|
|
|
37512
37575
|
});
|
|
37513
37576
|
server.registerTool("gog_docs_table_unmerge", {
|
|
37514
37577
|
description: "Unmerge (split) the merged region containing a given cell in a native Google Docs table.",
|
|
37515
|
-
annotations: { destructiveHint: true },
|
|
37578
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37516
37579
|
inputSchema: external_exports.object({
|
|
37517
37580
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37518
37581
|
cell: external_exports.string().describe('1-based cell r,c inside the merged region (e.g. "1,1")'),
|
|
@@ -37528,7 +37591,7 @@ function registerExtraDocsTools(server) {
|
|
|
37528
37591
|
});
|
|
37529
37592
|
server.registerTool("gog_docs_named_range_create", {
|
|
37530
37593
|
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.",
|
|
37531
|
-
annotations: { destructiveHint: true },
|
|
37594
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37532
37595
|
inputSchema: external_exports.object({
|
|
37533
37596
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37534
37597
|
name: external_exports.string().describe("Unique named range name"),
|
|
@@ -37552,7 +37615,7 @@ function registerExtraDocsTools(server) {
|
|
|
37552
37615
|
});
|
|
37553
37616
|
server.registerTool("gog_docs_named_range_list", {
|
|
37554
37617
|
description: "List named ranges in a Google Doc, optionally filtered by name.",
|
|
37555
|
-
annotations: { readOnlyHint: true },
|
|
37618
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37556
37619
|
inputSchema: external_exports.object({
|
|
37557
37620
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37558
37621
|
name: external_exports.string().optional().describe("Only return ranges with this name"),
|
|
@@ -37567,7 +37630,7 @@ function registerExtraDocsTools(server) {
|
|
|
37567
37630
|
});
|
|
37568
37631
|
server.registerTool("gog_docs_named_range_delete", {
|
|
37569
37632
|
description: "Delete a named range (the anchor only \u2014 the underlying document text is untouched).",
|
|
37570
|
-
annotations: { destructiveHint: true },
|
|
37633
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37571
37634
|
inputSchema: external_exports.object({
|
|
37572
37635
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37573
37636
|
nameOrId: external_exports.string().describe("Named range name or ID"),
|
|
@@ -37581,7 +37644,7 @@ function registerExtraDocsTools(server) {
|
|
|
37581
37644
|
});
|
|
37582
37645
|
server.registerTool("gog_docs_named_range_replace", {
|
|
37583
37646
|
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.",
|
|
37584
|
-
annotations: { destructiveHint: true },
|
|
37647
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37585
37648
|
inputSchema: external_exports.object({
|
|
37586
37649
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37587
37650
|
nameOrId: external_exports.string().describe("Named range name or ID"),
|
|
@@ -37600,7 +37663,7 @@ function registerExtraDocsTools(server) {
|
|
|
37600
37663
|
});
|
|
37601
37664
|
server.registerTool("gog_docs_tables_list", {
|
|
37602
37665
|
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.",
|
|
37603
|
-
annotations: { readOnlyHint: true },
|
|
37666
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37604
37667
|
inputSchema: external_exports.object({
|
|
37605
37668
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37606
37669
|
tab: external_exports.string().optional().describe("Tab title or ID (omit for default)"),
|
|
@@ -37613,7 +37676,7 @@ function registerExtraDocsTools(server) {
|
|
|
37613
37676
|
});
|
|
37614
37677
|
server.registerTool("gog_docs_images_list", {
|
|
37615
37678
|
description: "Enumerate inline/positioned images in a Google Doc.",
|
|
37616
|
-
annotations: { readOnlyHint: true },
|
|
37679
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37617
37680
|
inputSchema: external_exports.object({
|
|
37618
37681
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37619
37682
|
tab: external_exports.string().optional().describe("Tab title or ID (omit for default)"),
|
|
@@ -37626,7 +37689,7 @@ function registerExtraDocsTools(server) {
|
|
|
37626
37689
|
});
|
|
37627
37690
|
server.registerTool("gog_docs_headings_list", {
|
|
37628
37691
|
description: "Enumerate headings in a Google Doc (a lightweight outline view), optionally filtered to one heading level.",
|
|
37629
|
-
annotations: { readOnlyHint: true },
|
|
37692
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37630
37693
|
inputSchema: external_exports.object({
|
|
37631
37694
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37632
37695
|
level: external_exports.number().int().optional().describe("Only return this heading level (1-6)"),
|
|
@@ -37641,7 +37704,7 @@ function registerExtraDocsTools(server) {
|
|
|
37641
37704
|
});
|
|
37642
37705
|
server.registerTool("gog_docs_paragraphs_list", {
|
|
37643
37706
|
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.",
|
|
37644
|
-
annotations: { readOnlyHint: true },
|
|
37707
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
37645
37708
|
inputSchema: external_exports.object({
|
|
37646
37709
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37647
37710
|
style: external_exports.string().optional().describe("Only return this named style (e.g. NORMAL_TEXT or HEADING_2)"),
|
|
@@ -37656,7 +37719,7 @@ function registerExtraDocsTools(server) {
|
|
|
37656
37719
|
});
|
|
37657
37720
|
server.registerTool("gog_docs_insert_page_break", {
|
|
37658
37721
|
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.",
|
|
37659
|
-
annotations: { destructiveHint: true },
|
|
37722
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37660
37723
|
inputSchema: external_exports.object({
|
|
37661
37724
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37662
37725
|
index: external_exports.number().int().optional().describe("Character index to insert at (1 = beginning). Omit or use atEnd for end-of-doc."),
|
|
@@ -37681,7 +37744,7 @@ function registerExtraDocsTools(server) {
|
|
|
37681
37744
|
});
|
|
37682
37745
|
server.registerTool("gog_docs_page_layout", {
|
|
37683
37746
|
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.",
|
|
37684
|
-
annotations: { destructiveHint: true },
|
|
37747
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37685
37748
|
inputSchema: external_exports.object({
|
|
37686
37749
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37687
37750
|
layout: external_exports.enum(["pageless", "pages"]).optional().describe("Page layout (default: pageless)"),
|
|
@@ -37708,7 +37771,7 @@ function registerExtraDocsTools(server) {
|
|
|
37708
37771
|
});
|
|
37709
37772
|
server.registerTool("gog_docs_insert_table", {
|
|
37710
37773
|
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.",
|
|
37711
|
-
annotations: { destructiveHint: true },
|
|
37774
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37712
37775
|
inputSchema: external_exports.object({
|
|
37713
37776
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37714
37777
|
rows: external_exports.number().int().min(1).describe("Number of rows (>=1)"),
|
|
@@ -37729,7 +37792,7 @@ function registerExtraDocsTools(server) {
|
|
|
37729
37792
|
});
|
|
37730
37793
|
server.registerTool("gog_docs_cell_update", {
|
|
37731
37794
|
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.",
|
|
37732
|
-
annotations: { destructiveHint: true },
|
|
37795
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37733
37796
|
inputSchema: external_exports.object({
|
|
37734
37797
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37735
37798
|
row: external_exports.number().int().describe("1-based row number"),
|
|
@@ -37760,7 +37823,7 @@ function registerExtraDocsTools(server) {
|
|
|
37760
37823
|
});
|
|
37761
37824
|
server.registerTool("gog_docs_cell_style", {
|
|
37762
37825
|
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.",
|
|
37763
|
-
annotations: { destructiveHint: true },
|
|
37826
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37764
37827
|
inputSchema: external_exports.object({
|
|
37765
37828
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37766
37829
|
row: external_exports.number().int().describe("0-based row number"),
|
|
@@ -37815,7 +37878,7 @@ function registerExtraDocsTools(server) {
|
|
|
37815
37878
|
});
|
|
37816
37879
|
server.registerTool("gog_docs_insert_image", {
|
|
37817
37880
|
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.",
|
|
37818
|
-
annotations: { destructiveHint: true },
|
|
37881
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37819
37882
|
inputSchema: external_exports.object({
|
|
37820
37883
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37821
37884
|
file: external_exports.string().optional().describe("Local PNG, JPEG, or GIF image to upload and insert (exactly one of file or url)"),
|
|
@@ -37850,7 +37913,7 @@ function registerExtraDocsTools(server) {
|
|
|
37850
37913
|
});
|
|
37851
37914
|
server.registerTool("gog_docs_insert_person", {
|
|
37852
37915
|
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.",
|
|
37853
|
-
annotations: { destructiveHint: true },
|
|
37916
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37854
37917
|
inputSchema: external_exports.object({
|
|
37855
37918
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37856
37919
|
email: external_exports.string().describe("Email address for the person chip"),
|
|
@@ -37876,7 +37939,7 @@ function registerExtraDocsTools(server) {
|
|
|
37876
37939
|
});
|
|
37877
37940
|
server.registerTool("gog_docs_insert_date_chip", {
|
|
37878
37941
|
description: "Insert a native Google Docs date smart chip, at a character index or end-of-doc.",
|
|
37879
|
-
annotations: { destructiveHint: true },
|
|
37942
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37880
37943
|
inputSchema: external_exports.object({
|
|
37881
37944
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37882
37945
|
date: external_exports.string().optional().describe("Date to insert as YYYY-MM-DD (default: today)"),
|
|
@@ -37899,7 +37962,7 @@ function registerExtraDocsTools(server) {
|
|
|
37899
37962
|
});
|
|
37900
37963
|
server.registerTool("gog_docs_add_tab", {
|
|
37901
37964
|
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.",
|
|
37902
|
-
annotations: { destructiveHint: false },
|
|
37965
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
37903
37966
|
inputSchema: external_exports.object({
|
|
37904
37967
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37905
37968
|
title: external_exports.string().optional().describe("User-visible tab title"),
|
|
@@ -37918,7 +37981,7 @@ function registerExtraDocsTools(server) {
|
|
|
37918
37981
|
});
|
|
37919
37982
|
server.registerTool("gog_docs_rename_tab", {
|
|
37920
37983
|
description: "Rename a tab in a Google Doc. Identify the existing tab by title or ID and give it a new title.",
|
|
37921
|
-
annotations: { destructiveHint: false },
|
|
37984
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
37922
37985
|
inputSchema: external_exports.object({
|
|
37923
37986
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37924
37987
|
tab: external_exports.string().describe("Existing tab title or ID to rename"),
|
|
@@ -37931,7 +37994,7 @@ function registerExtraDocsTools(server) {
|
|
|
37931
37994
|
});
|
|
37932
37995
|
server.registerTool("gog_docs_delete_tab", {
|
|
37933
37996
|
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.",
|
|
37934
|
-
annotations: { destructiveHint: true },
|
|
37997
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37935
37998
|
inputSchema: external_exports.object({
|
|
37936
37999
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37937
38000
|
tab: external_exports.string().describe("Existing tab title or ID to delete"),
|
|
@@ -37943,7 +38006,7 @@ function registerExtraDocsTools(server) {
|
|
|
37943
38006
|
});
|
|
37944
38007
|
server.registerTool("gog_docs_clear", {
|
|
37945
38008
|
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.",
|
|
37946
|
-
annotations: { destructiveHint: true },
|
|
38009
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37947
38010
|
inputSchema: external_exports.object({
|
|
37948
38011
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37949
38012
|
account: accountParam
|
|
@@ -37953,7 +38016,7 @@ function registerExtraDocsTools(server) {
|
|
|
37953
38016
|
});
|
|
37954
38017
|
server.registerTool("gog_docs_insert_footnote", {
|
|
37955
38018
|
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.",
|
|
37956
|
-
annotations: { destructiveHint: true },
|
|
38019
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37957
38020
|
inputSchema: external_exports.object({
|
|
37958
38021
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37959
38022
|
text: external_exports.string().optional().describe("Footnote text"),
|
|
@@ -37981,7 +38044,7 @@ function registerExtraDocsTools(server) {
|
|
|
37981
38044
|
});
|
|
37982
38045
|
server.registerTool("gog_docs_insert_section_break", {
|
|
37983
38046
|
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).",
|
|
37984
|
-
annotations: { destructiveHint: true },
|
|
38047
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
37985
38048
|
inputSchema: external_exports.object({
|
|
37986
38049
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
37987
38050
|
type: external_exports.enum(["next-page", "continuous"]).optional().describe("Section break type (default: next-page)"),
|
|
@@ -38008,7 +38071,7 @@ function registerExtraDocsTools(server) {
|
|
|
38008
38071
|
});
|
|
38009
38072
|
server.registerTool("gog_docs_insert_horizontal_rule", {
|
|
38010
38073
|
description: "Insert a horizontal rule (paragraph border) at a character index (or end-of-doc).",
|
|
38011
|
-
annotations: { destructiveHint: true },
|
|
38074
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38012
38075
|
inputSchema: external_exports.object({
|
|
38013
38076
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38014
38077
|
index: external_exports.number().int().optional().describe("Character index to insert at (1 = beginning). Omit or use atEnd for end-of-doc."),
|
|
@@ -38033,7 +38096,7 @@ function registerExtraDocsTools(server) {
|
|
|
38033
38096
|
});
|
|
38034
38097
|
server.registerTool("gog_docs_section_columns", {
|
|
38035
38098
|
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.",
|
|
38036
|
-
annotations: { destructiveHint: true },
|
|
38099
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38037
38100
|
inputSchema: external_exports.object({
|
|
38038
38101
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38039
38102
|
count: external_exports.number().int().min(1).max(3).describe("Number of columns (1-3; 1 resets to one column)"),
|
|
@@ -38061,7 +38124,7 @@ function registerExtraDocsTools(server) {
|
|
|
38061
38124
|
});
|
|
38062
38125
|
server.registerTool("gog_docs_header_list", {
|
|
38063
38126
|
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.",
|
|
38064
|
-
annotations: { readOnlyHint: true },
|
|
38127
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
38065
38128
|
inputSchema: external_exports.object({
|
|
38066
38129
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38067
38130
|
tab: external_exports.string().optional().describe("Limit results to a tab title or ID"),
|
|
@@ -38074,7 +38137,7 @@ function registerExtraDocsTools(server) {
|
|
|
38074
38137
|
});
|
|
38075
38138
|
server.registerTool("gog_docs_header_create", {
|
|
38076
38139
|
description: "Create a header in a Google Doc and optionally populate its initial text. Returns the new header segment ID.",
|
|
38077
|
-
annotations: { destructiveHint: false },
|
|
38140
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
38078
38141
|
inputSchema: external_exports.object({
|
|
38079
38142
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38080
38143
|
text: external_exports.string().optional().describe("Initial header text"),
|
|
@@ -38102,7 +38165,7 @@ function registerExtraDocsTools(server) {
|
|
|
38102
38165
|
});
|
|
38103
38166
|
server.registerTool("gog_docs_header_delete", {
|
|
38104
38167
|
description: "Delete a header from a Google Doc by its segment ID (from gog_docs_header_list).",
|
|
38105
|
-
annotations: { destructiveHint: true },
|
|
38168
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38106
38169
|
inputSchema: external_exports.object({
|
|
38107
38170
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38108
38171
|
headerId: external_exports.string().describe("Header segment ID (from gog_docs_header_list)"),
|
|
@@ -38117,7 +38180,7 @@ function registerExtraDocsTools(server) {
|
|
|
38117
38180
|
});
|
|
38118
38181
|
server.registerTool("gog_docs_footer_list", {
|
|
38119
38182
|
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.",
|
|
38120
|
-
annotations: { readOnlyHint: true },
|
|
38183
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
38121
38184
|
inputSchema: external_exports.object({
|
|
38122
38185
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38123
38186
|
tab: external_exports.string().optional().describe("Limit results to a tab title or ID"),
|
|
@@ -38130,7 +38193,7 @@ function registerExtraDocsTools(server) {
|
|
|
38130
38193
|
});
|
|
38131
38194
|
server.registerTool("gog_docs_footer_create", {
|
|
38132
38195
|
description: "Create a footer in a Google Doc and optionally populate its initial text. Returns the new footer segment ID.",
|
|
38133
|
-
annotations: { destructiveHint: false },
|
|
38196
|
+
annotations: { destructiveHint: false, openWorldHint: true },
|
|
38134
38197
|
inputSchema: external_exports.object({
|
|
38135
38198
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38136
38199
|
text: external_exports.string().optional().describe("Initial footer text"),
|
|
@@ -38158,7 +38221,7 @@ function registerExtraDocsTools(server) {
|
|
|
38158
38221
|
});
|
|
38159
38222
|
server.registerTool("gog_docs_footer_delete", {
|
|
38160
38223
|
description: "Delete a footer from a Google Doc by its segment ID (from gog_docs_footer_list).",
|
|
38161
|
-
annotations: { destructiveHint: true },
|
|
38224
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38162
38225
|
inputSchema: external_exports.object({
|
|
38163
38226
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38164
38227
|
footerId: external_exports.string().describe("Footer segment ID (from gog_docs_footer_list)"),
|
|
@@ -38173,7 +38236,7 @@ function registerExtraDocsTools(server) {
|
|
|
38173
38236
|
});
|
|
38174
38237
|
server.registerTool("gog_docs_replace_image", {
|
|
38175
38238
|
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.",
|
|
38176
|
-
annotations: { destructiveHint: true },
|
|
38239
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38177
38240
|
inputSchema: external_exports.object({
|
|
38178
38241
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38179
38242
|
file: external_exports.string().optional().describe("Local PNG, JPEG, or GIF image to upload and use (exactly one of file or url)"),
|
|
@@ -38200,7 +38263,7 @@ function registerExtraDocsTools(server) {
|
|
|
38200
38263
|
});
|
|
38201
38264
|
server.registerTool("gog_docs_table_row_pin_header", {
|
|
38202
38265
|
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.",
|
|
38203
|
-
annotations: { destructiveHint: true },
|
|
38266
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38204
38267
|
inputSchema: external_exports.object({
|
|
38205
38268
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38206
38269
|
rows: external_exports.number().int().min(0).describe("Number of leading rows to pin as headers; 0 unpins all header rows"),
|
|
@@ -38216,7 +38279,7 @@ function registerExtraDocsTools(server) {
|
|
|
38216
38279
|
});
|
|
38217
38280
|
server.registerTool("gog_docs_table_row_style", {
|
|
38218
38281
|
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.",
|
|
38219
|
-
annotations: { destructiveHint: true },
|
|
38282
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
38220
38283
|
inputSchema: external_exports.object({
|
|
38221
38284
|
docId: external_exports.string().describe("Doc ID (from the URL)"),
|
|
38222
38285
|
row: external_exports.number().int().optional().describe("1-based row number; negative indexes count from the end; omit to style all rows"),
|