gogcli-mcp 4.2.2 → 4.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "metadata": {
9
9
  "description": "Google Sheets (and more) for Claude via gogcli — read, write, and manage spreadsheets",
10
- "version": "4.2.2"
10
+ "version": "4.2.4"
11
11
  },
12
12
  "plugins": [
13
13
  {
@@ -15,7 +15,7 @@
15
15
  "displayName": "gogcli",
16
16
  "source": "./",
17
17
  "description": "Google Sheets (and more) for Claude via gogcli — read, write, and manage spreadsheets",
18
- "version": "4.2.2",
18
+ "version": "4.2.4",
19
19
  "author": {
20
20
  "name": "Chris Hall"
21
21
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gogcli-mcp",
3
3
  "displayName": "gogcli",
4
- "version": "4.2.2",
4
+ "version": "4.2.4",
5
5
  "description": "Google Sheets (and more) for Claude via gogcli — read, write, and manage spreadsheets",
6
6
  "author": {
7
7
  "name": "Chris Hall",
package/dist/index.js CHANGED
@@ -35517,6 +35517,7 @@ function registerAppScriptTools(server) {
35517
35517
  });
35518
35518
  server.registerTool("gog_appscript_pull", {
35519
35519
  description: "Write a project's files into a local directory, for editing a script as ordinary files. THE DIRECTORY IS RESOLVED WHERE GOG RUNS, which is the caller's own machine only on a local (stdio) deployment: on a hosted deployment (e.g. mcp-host) the files land on that server where the caller cannot reach them. Use gog_appscript_content there instead \u2014 it returns the same source in the response. Existing files are left alone unless overwrite is set. Read-only as far as Google is concerned: nothing is pushed back." + apiEnableNote,
35520
+ annotations: { destructiveHint: true },
35520
35521
  inputSchema: external_exports.object({
35521
35522
  scriptId: scriptIdParam,
35522
35523
  dir: external_exports.string().describe("Destination directory, resolved on the machine where gog runs"),
@@ -35530,6 +35531,7 @@ function registerAppScriptTools(server) {
35530
35531
  });
35531
35532
  server.registerTool("gog_appscript_create", {
35532
35533
  description: "Create a new, empty Apps Script project. Pass parentId to bind it to a Drive file (a Sheet, Doc or Form), which is what makes the script a container-bound script with access to that document; omit it for a standalone project. gog cannot upload code, so the project starts empty either way." + apiEnableNote,
35534
+ annotations: { destructiveHint: true },
35533
35535
  inputSchema: external_exports.object({
35534
35536
  title: external_exports.string().describe("Project title"),
35535
35537
  parentId: external_exports.string().optional().describe("Drive file ID to bind the project to (Sheet, Doc or Form). Omit for a standalone project."),
@@ -36031,6 +36033,7 @@ function registerChatTools(server) {
36031
36033
  });
36032
36034
  server.registerTool("gog_chat_spaces_create", {
36033
36035
  description: "Create a named Chat space, optionally seeding its membership. Members are added immediately and are notified \u2014 this is visible to other people the moment it runs, so confirm the member list before calling it." + workspaceOnlyNote,
36036
+ annotations: { destructiveHint: true },
36034
36037
  inputSchema: external_exports.object({
36035
36038
  displayName: external_exports.string().describe("Display name for the new space"),
36036
36039
  members: external_exports.array(external_exports.string()).optional().describe('Initial members, as email addresses or "users/..." resource names'),
@@ -36099,6 +36102,7 @@ function registerChatTools(server) {
36099
36102
  });
36100
36103
  server.registerTool("gog_chat_messages_send", {
36101
36104
  description: "Post a message to a Chat space. THIS IS IMMEDIATELY VISIBLE TO EVERYONE IN THE SPACE and cannot be unsent through this tool, so treat it like sending mail, not like saving a draft. Pass `thread` to reply inside an existing conversation (from gog_chat_threads_list or a message's thread field); omit it to start a new one. Text supports Chat's markdown-ish formatting (*bold*, _italic_, `code`)." + workspaceOnlyNote,
36105
+ annotations: { destructiveHint: true },
36102
36106
  inputSchema: external_exports.object({
36103
36107
  space: spaceParam,
36104
36108
  text: external_exports.string().optional().describe("Message text. Optional only when an attachment is supplied."),
@@ -36122,6 +36126,7 @@ function registerChatTools(server) {
36122
36126
  });
36123
36127
  server.registerTool("gog_chat_dm_send", {
36124
36128
  description: "Send a direct message to one person by email address, creating the DM space if this is the first message. Delivered immediately and cannot be unsent through this tool. For a room rather than a person, use gog_chat_messages_send." + workspaceOnlyNote,
36129
+ annotations: { destructiveHint: true },
36125
36130
  inputSchema: external_exports.object({
36126
36131
  email: external_exports.string().describe("Recipient email address"),
36127
36132
  text: external_exports.string().describe("Message text"),
@@ -36135,6 +36140,7 @@ function registerChatTools(server) {
36135
36140
  });
36136
36141
  server.registerTool("gog_chat_dm_space", {
36137
36142
  description: 'Resolve the DM space for an email address \u2014 the bridge from a person to the "spaces/..." name the message tools want. Creates the space if none exists yet, which is silent: it does not message the person.' + workspaceOnlyNote,
36143
+ annotations: { destructiveHint: true },
36138
36144
  inputSchema: external_exports.object({
36139
36145
  email: external_exports.string().describe("The other person's email address"),
36140
36146
  account: accountParam
@@ -36159,6 +36165,7 @@ function registerChatTools(server) {
36159
36165
  });
36160
36166
  server.registerTool("gog_chat_reactions_create", {
36161
36167
  description: 'React to a message with an emoji. Visible to the space immediately. Pass the emoji itself ("\u{1F44D}"), not a :shortcode:.' + workspaceOnlyNote,
36168
+ annotations: { destructiveHint: false },
36162
36169
  inputSchema: external_exports.object({
36163
36170
  message: external_exports.string().describe('Message resource name ("spaces/AAAA/messages/BBBB"), or a bare message ID together with `space`'),
36164
36171
  emoji: external_exports.string().describe('The emoji character to react with, e.g. "\u{1F44D}"'),
@@ -36471,6 +36478,7 @@ function registerClassroomTools(server) {
36471
36478
  });
36472
36479
  server.registerTool("gog_classroom_announcements_create", {
36473
36480
  description: "Create an announcement in a Google Classroom course.",
36481
+ annotations: { destructiveHint: true },
36474
36482
  inputSchema: external_exports.object({
36475
36483
  courseId: external_exports.string().describe("Course ID"),
36476
36484
  text: external_exports.string().describe("Announcement text"),
@@ -36548,6 +36556,7 @@ function registerClassroomTools(server) {
36548
36556
  });
36549
36557
  server.registerTool("gog_classroom_invitations_accept", {
36550
36558
  description: "Accept a Google Classroom invitation.",
36559
+ annotations: { destructiveHint: true },
36551
36560
  inputSchema: external_exports.object({
36552
36561
  invitationId: external_exports.string().describe("Invitation ID"),
36553
36562
  account: accountParam
@@ -36607,7 +36616,7 @@ function registerContactsTools(server) {
36607
36616
  });
36608
36617
  server.registerTool("gog_contacts_create", {
36609
36618
  description: "Create a new Google Contact.",
36610
- annotations: { destructiveHint: false },
36619
+ annotations: { destructiveHint: true },
36611
36620
  inputSchema: external_exports.object({
36612
36621
  givenName: external_exports.string().describe("Given (first) name"),
36613
36622
  familyName: external_exports.string().optional().describe("Family (last) name"),
@@ -36656,6 +36665,7 @@ function registerDocsTools(server) {
36656
36665
  });
36657
36666
  server.registerTool("gog_docs_create", {
36658
36667
  description: "Create a new Google Doc. Returns JSON with the new docId and URL.",
36668
+ annotations: { destructiveHint: true },
36659
36669
  inputSchema: external_exports.object({
36660
36670
  title: external_exports.string().describe("Title for the new document"),
36661
36671
  account: accountParam
@@ -36815,7 +36825,7 @@ function registerDriveTools(server) {
36815
36825
  });
36816
36826
  server.registerTool("gog_drive_rename", {
36817
36827
  description: "Rename a file or folder in Google Drive.",
36818
- annotations: { destructiveHint: true },
36828
+ annotations: { destructiveHint: false },
36819
36829
  inputSchema: external_exports.object({
36820
36830
  fileId: external_exports.string().describe("File or folder ID"),
36821
36831
  newName: external_exports.string().describe("New name"),
@@ -36826,7 +36836,7 @@ function registerDriveTools(server) {
36826
36836
  });
36827
36837
  server.registerTool("gog_drive_move", {
36828
36838
  description: "Move a file to a different folder in Google Drive.",
36829
- annotations: { destructiveHint: true },
36839
+ annotations: { destructiveHint: false },
36830
36840
  inputSchema: external_exports.object({
36831
36841
  fileId: external_exports.string().describe("File ID to move"),
36832
36842
  parentId: external_exports.string().describe("Destination folder ID"),
@@ -37492,7 +37502,7 @@ function registerSheetsTools(server) {
37492
37502
  });
37493
37503
  server.registerTool("gog_sheets_create", {
37494
37504
  description: "Create a new Google Spreadsheet. Returns JSON with the new spreadsheetId and URL.",
37495
- annotations: { destructiveHint: false },
37505
+ annotations: { destructiveHint: true },
37496
37506
  inputSchema: external_exports.object({
37497
37507
  title: external_exports.string().describe("Title for the new spreadsheet"),
37498
37508
  account: accountParam
@@ -37546,6 +37556,7 @@ function registerSlidesTools(server) {
37546
37556
  });
37547
37557
  server.registerTool("gog_slides_create", {
37548
37558
  description: "Create a new Google Slides presentation, optionally in a folder or copying from a template.",
37559
+ annotations: { destructiveHint: true },
37549
37560
  inputSchema: external_exports.object({
37550
37561
  title: external_exports.string().describe("Presentation title"),
37551
37562
  parent: external_exports.string().optional().describe("Destination folder ID"),
@@ -37560,6 +37571,7 @@ function registerSlidesTools(server) {
37560
37571
  });
37561
37572
  server.registerTool("gog_slides_copy", {
37562
37573
  description: "Copy a Google Slides presentation to a new presentation with the given title.",
37574
+ annotations: { destructiveHint: true },
37563
37575
  inputSchema: external_exports.object({
37564
37576
  presentationId: external_exports.string().describe("Presentation ID to copy"),
37565
37577
  title: external_exports.string().describe("Title for the new copy"),
@@ -37648,7 +37660,7 @@ function registerTasksTools(server) {
37648
37660
  });
37649
37661
  server.registerTool("gog_tasks_done", {
37650
37662
  description: "Mark a task as completed.",
37651
- annotations: { destructiveHint: true },
37663
+ annotations: { destructiveHint: false },
37652
37664
  inputSchema: external_exports.object({
37653
37665
  tasklistId: external_exports.string().describe("Task list ID"),
37654
37666
  taskId: external_exports.string().describe("Task ID"),
@@ -37672,7 +37684,7 @@ function registerTasksTools(server) {
37672
37684
  }
37673
37685
 
37674
37686
  // src/server.ts
37675
- var VERSION = true ? "4.2.2" : "0.0.0";
37687
+ var VERSION = true ? "4.2.4" : "0.0.0";
37676
37688
  var BASE_TOOL_REGISTRARS = [
37677
37689
  registerApiTools,
37678
37690
  registerAppScriptTools,
package/dist/lib.js CHANGED
@@ -33848,6 +33848,7 @@ function registerAppScriptTools(server) {
33848
33848
  });
33849
33849
  server.registerTool("gog_appscript_pull", {
33850
33850
  description: "Write a project's files into a local directory, for editing a script as ordinary files. THE DIRECTORY IS RESOLVED WHERE GOG RUNS, which is the caller's own machine only on a local (stdio) deployment: on a hosted deployment (e.g. mcp-host) the files land on that server where the caller cannot reach them. Use gog_appscript_content there instead \u2014 it returns the same source in the response. Existing files are left alone unless overwrite is set. Read-only as far as Google is concerned: nothing is pushed back." + apiEnableNote,
33851
+ annotations: { destructiveHint: true },
33851
33852
  inputSchema: external_exports.object({
33852
33853
  scriptId: scriptIdParam,
33853
33854
  dir: external_exports.string().describe("Destination directory, resolved on the machine where gog runs"),
@@ -33861,6 +33862,7 @@ function registerAppScriptTools(server) {
33861
33862
  });
33862
33863
  server.registerTool("gog_appscript_create", {
33863
33864
  description: "Create a new, empty Apps Script project. Pass parentId to bind it to a Drive file (a Sheet, Doc or Form), which is what makes the script a container-bound script with access to that document; omit it for a standalone project. gog cannot upload code, so the project starts empty either way." + apiEnableNote,
33865
+ annotations: { destructiveHint: true },
33864
33866
  inputSchema: external_exports.object({
33865
33867
  title: external_exports.string().describe("Project title"),
33866
33868
  parentId: external_exports.string().optional().describe("Drive file ID to bind the project to (Sheet, Doc or Form). Omit for a standalone project."),
@@ -34365,6 +34367,7 @@ function registerChatTools(server) {
34365
34367
  });
34366
34368
  server.registerTool("gog_chat_spaces_create", {
34367
34369
  description: "Create a named Chat space, optionally seeding its membership. Members are added immediately and are notified \u2014 this is visible to other people the moment it runs, so confirm the member list before calling it." + workspaceOnlyNote,
34370
+ annotations: { destructiveHint: true },
34368
34371
  inputSchema: external_exports.object({
34369
34372
  displayName: external_exports.string().describe("Display name for the new space"),
34370
34373
  members: external_exports.array(external_exports.string()).optional().describe('Initial members, as email addresses or "users/..." resource names'),
@@ -34433,6 +34436,7 @@ function registerChatTools(server) {
34433
34436
  });
34434
34437
  server.registerTool("gog_chat_messages_send", {
34435
34438
  description: "Post a message to a Chat space. THIS IS IMMEDIATELY VISIBLE TO EVERYONE IN THE SPACE and cannot be unsent through this tool, so treat it like sending mail, not like saving a draft. Pass `thread` to reply inside an existing conversation (from gog_chat_threads_list or a message's thread field); omit it to start a new one. Text supports Chat's markdown-ish formatting (*bold*, _italic_, `code`)." + workspaceOnlyNote,
34439
+ annotations: { destructiveHint: true },
34436
34440
  inputSchema: external_exports.object({
34437
34441
  space: spaceParam,
34438
34442
  text: external_exports.string().optional().describe("Message text. Optional only when an attachment is supplied."),
@@ -34456,6 +34460,7 @@ function registerChatTools(server) {
34456
34460
  });
34457
34461
  server.registerTool("gog_chat_dm_send", {
34458
34462
  description: "Send a direct message to one person by email address, creating the DM space if this is the first message. Delivered immediately and cannot be unsent through this tool. For a room rather than a person, use gog_chat_messages_send." + workspaceOnlyNote,
34463
+ annotations: { destructiveHint: true },
34459
34464
  inputSchema: external_exports.object({
34460
34465
  email: external_exports.string().describe("Recipient email address"),
34461
34466
  text: external_exports.string().describe("Message text"),
@@ -34469,6 +34474,7 @@ function registerChatTools(server) {
34469
34474
  });
34470
34475
  server.registerTool("gog_chat_dm_space", {
34471
34476
  description: 'Resolve the DM space for an email address \u2014 the bridge from a person to the "spaces/..." name the message tools want. Creates the space if none exists yet, which is silent: it does not message the person.' + workspaceOnlyNote,
34477
+ annotations: { destructiveHint: true },
34472
34478
  inputSchema: external_exports.object({
34473
34479
  email: external_exports.string().describe("The other person's email address"),
34474
34480
  account: accountParam
@@ -34493,6 +34499,7 @@ function registerChatTools(server) {
34493
34499
  });
34494
34500
  server.registerTool("gog_chat_reactions_create", {
34495
34501
  description: 'React to a message with an emoji. Visible to the space immediately. Pass the emoji itself ("\u{1F44D}"), not a :shortcode:.' + workspaceOnlyNote,
34502
+ annotations: { destructiveHint: false },
34496
34503
  inputSchema: external_exports.object({
34497
34504
  message: external_exports.string().describe('Message resource name ("spaces/AAAA/messages/BBBB"), or a bare message ID together with `space`'),
34498
34505
  emoji: external_exports.string().describe('The emoji character to react with, e.g. "\u{1F44D}"'),
@@ -34805,6 +34812,7 @@ function registerClassroomTools(server) {
34805
34812
  });
34806
34813
  server.registerTool("gog_classroom_announcements_create", {
34807
34814
  description: "Create an announcement in a Google Classroom course.",
34815
+ annotations: { destructiveHint: true },
34808
34816
  inputSchema: external_exports.object({
34809
34817
  courseId: external_exports.string().describe("Course ID"),
34810
34818
  text: external_exports.string().describe("Announcement text"),
@@ -34882,6 +34890,7 @@ function registerClassroomTools(server) {
34882
34890
  });
34883
34891
  server.registerTool("gog_classroom_invitations_accept", {
34884
34892
  description: "Accept a Google Classroom invitation.",
34893
+ annotations: { destructiveHint: true },
34885
34894
  inputSchema: external_exports.object({
34886
34895
  invitationId: external_exports.string().describe("Invitation ID"),
34887
34896
  account: accountParam
@@ -34941,7 +34950,7 @@ function registerContactsTools(server) {
34941
34950
  });
34942
34951
  server.registerTool("gog_contacts_create", {
34943
34952
  description: "Create a new Google Contact.",
34944
- annotations: { destructiveHint: false },
34953
+ annotations: { destructiveHint: true },
34945
34954
  inputSchema: external_exports.object({
34946
34955
  givenName: external_exports.string().describe("Given (first) name"),
34947
34956
  familyName: external_exports.string().optional().describe("Family (last) name"),
@@ -34990,6 +34999,7 @@ function registerDocsTools(server) {
34990
34999
  });
34991
35000
  server.registerTool("gog_docs_create", {
34992
35001
  description: "Create a new Google Doc. Returns JSON with the new docId and URL.",
35002
+ annotations: { destructiveHint: true },
34993
35003
  inputSchema: external_exports.object({
34994
35004
  title: external_exports.string().describe("Title for the new document"),
34995
35005
  account: accountParam
@@ -35149,7 +35159,7 @@ function registerDriveTools(server) {
35149
35159
  });
35150
35160
  server.registerTool("gog_drive_rename", {
35151
35161
  description: "Rename a file or folder in Google Drive.",
35152
- annotations: { destructiveHint: true },
35162
+ annotations: { destructiveHint: false },
35153
35163
  inputSchema: external_exports.object({
35154
35164
  fileId: external_exports.string().describe("File or folder ID"),
35155
35165
  newName: external_exports.string().describe("New name"),
@@ -35160,7 +35170,7 @@ function registerDriveTools(server) {
35160
35170
  });
35161
35171
  server.registerTool("gog_drive_move", {
35162
35172
  description: "Move a file to a different folder in Google Drive.",
35163
- annotations: { destructiveHint: true },
35173
+ annotations: { destructiveHint: false },
35164
35174
  inputSchema: external_exports.object({
35165
35175
  fileId: external_exports.string().describe("File ID to move"),
35166
35176
  parentId: external_exports.string().describe("Destination folder ID"),
@@ -35826,7 +35836,7 @@ function registerSheetsTools(server) {
35826
35836
  });
35827
35837
  server.registerTool("gog_sheets_create", {
35828
35838
  description: "Create a new Google Spreadsheet. Returns JSON with the new spreadsheetId and URL.",
35829
- annotations: { destructiveHint: false },
35839
+ annotations: { destructiveHint: true },
35830
35840
  inputSchema: external_exports.object({
35831
35841
  title: external_exports.string().describe("Title for the new spreadsheet"),
35832
35842
  account: accountParam
@@ -35880,6 +35890,7 @@ function registerSlidesTools(server) {
35880
35890
  });
35881
35891
  server.registerTool("gog_slides_create", {
35882
35892
  description: "Create a new Google Slides presentation, optionally in a folder or copying from a template.",
35893
+ annotations: { destructiveHint: true },
35883
35894
  inputSchema: external_exports.object({
35884
35895
  title: external_exports.string().describe("Presentation title"),
35885
35896
  parent: external_exports.string().optional().describe("Destination folder ID"),
@@ -35894,6 +35905,7 @@ function registerSlidesTools(server) {
35894
35905
  });
35895
35906
  server.registerTool("gog_slides_copy", {
35896
35907
  description: "Copy a Google Slides presentation to a new presentation with the given title.",
35908
+ annotations: { destructiveHint: true },
35897
35909
  inputSchema: external_exports.object({
35898
35910
  presentationId: external_exports.string().describe("Presentation ID to copy"),
35899
35911
  title: external_exports.string().describe("Title for the new copy"),
@@ -35982,7 +35994,7 @@ function registerTasksTools(server) {
35982
35994
  });
35983
35995
  server.registerTool("gog_tasks_done", {
35984
35996
  description: "Mark a task as completed.",
35985
- annotations: { destructiveHint: true },
35997
+ annotations: { destructiveHint: false },
35986
35998
  inputSchema: external_exports.object({
35987
35999
  tasklistId: external_exports.string().describe("Task list ID"),
35988
36000
  taskId: external_exports.string().describe("Task ID"),
@@ -36006,7 +36018,7 @@ function registerTasksTools(server) {
36006
36018
  }
36007
36019
 
36008
36020
  // src/server.ts
36009
- var VERSION = true ? "4.2.2" : "0.0.0";
36021
+ var VERSION = true ? "4.2.4" : "0.0.0";
36010
36022
  var BASE_TOOL_REGISTRARS = [
36011
36023
  registerApiTools,
36012
36024
  registerAppScriptTools,
package/manifest.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "manifest_version": "0.3",
4
4
  "name": "gogcli-mcp",
5
5
  "display_name": "gogcli",
6
- "version": "4.2.2",
6
+ "version": "4.2.4",
7
7
  "description": "Google Sheets (and more) for Claude via gogcli — read, write, and manage spreadsheets",
8
8
  "author": {
9
9
  "name": "Chris Hall",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gogcli-mcp",
3
- "version": "4.2.2",
3
+ "version": "4.2.4",
4
4
  "mcpName": "io.github.chrischall/gogcli-mcp",
5
5
  "description": "MCP server wrapping gogcli for Google service access",
6
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "source": "github",
8
8
  "subfolder": "packages/gogcli-mcp"
9
9
  },
10
- "version": "4.2.2",
10
+ "version": "4.2.4",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "gogcli-mcp",
15
- "version": "4.2.2",
15
+ "version": "4.2.4",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },
@@ -65,6 +65,7 @@ export function registerAppScriptTools(server: McpServer): void {
65
65
  + 'reach them. Use gog_appscript_content there instead — it returns the same source in the response. Existing files '
66
66
  + 'are left alone unless overwrite is set. Read-only as far as Google is concerned: nothing is pushed back.'
67
67
  + apiEnableNote,
68
+ annotations: { destructiveHint: true },
68
69
  inputSchema: z.object({
69
70
  scriptId: scriptIdParam,
70
71
  dir: z.string().describe('Destination directory, resolved on the machine where gog runs'),
@@ -82,6 +83,7 @@ export function registerAppScriptTools(server: McpServer): void {
82
83
  'Create a new, empty Apps Script project. Pass parentId to bind it to a Drive file (a Sheet, Doc or Form), which is '
83
84
  + 'what makes the script a container-bound script with access to that document; omit it for a standalone project. '
84
85
  + 'gog cannot upload code, so the project starts empty either way.' + apiEnableNote,
86
+ annotations: { destructiveHint: true },
85
87
  inputSchema: z.object({
86
88
  title: z.string().describe('Project title'),
87
89
  parentId: z.string().optional().describe('Drive file ID to bind the project to (Sheet, Doc or Form). Omit for a standalone project.'),
package/src/tools/chat.ts CHANGED
@@ -82,6 +82,7 @@ export function registerChatTools(server: McpServer): void {
82
82
  description:
83
83
  'Create a named Chat space, optionally seeding its membership. Members are added immediately and are notified — this '
84
84
  + 'is visible to other people the moment it runs, so confirm the member list before calling it.' + workspaceOnlyNote,
85
+ annotations: { destructiveHint: true },
85
86
  inputSchema: z.object({
86
87
  displayName: z.string().describe('Display name for the new space'),
87
88
  members: z.array(z.string()).optional().describe('Initial members, as email addresses or "users/..." resource names'),
@@ -176,6 +177,7 @@ export function registerChatTools(server: McpServer): void {
176
177
  + 'this tool, so treat it like sending mail, not like saving a draft. Pass `thread` to reply inside an existing '
177
178
  + 'conversation (from gog_chat_threads_list or a message\'s thread field); omit it to start a new one. Text supports '
178
179
  + 'Chat\'s markdown-ish formatting (*bold*, _italic_, `code`).' + workspaceOnlyNote,
180
+ annotations: { destructiveHint: true },
179
181
  inputSchema: z.object({
180
182
  space: spaceParam,
181
183
  text: z.string().optional().describe('Message text. Optional only when an attachment is supplied.'),
@@ -207,6 +209,7 @@ export function registerChatTools(server: McpServer): void {
207
209
  'Send a direct message to one person by email address, creating the DM space if this is the first message. Delivered '
208
210
  + 'immediately and cannot be unsent through this tool. For a room rather than a person, use gog_chat_messages_send.'
209
211
  + workspaceOnlyNote,
212
+ annotations: { destructiveHint: true },
210
213
  inputSchema: z.object({
211
214
  email: z.string().describe('Recipient email address'),
212
215
  text: z.string().describe('Message text'),
@@ -223,6 +226,7 @@ export function registerChatTools(server: McpServer): void {
223
226
  description:
224
227
  'Resolve the DM space for an email address — the bridge from a person to the "spaces/..." name the message tools '
225
228
  + 'want. Creates the space if none exists yet, which is silent: it does not message the person.' + workspaceOnlyNote,
229
+ annotations: { destructiveHint: true },
226
230
  inputSchema: z.object({
227
231
  email: z.string().describe('The other person\'s email address'),
228
232
  account: accountParam,
@@ -254,6 +258,7 @@ export function registerChatTools(server: McpServer): void {
254
258
  description:
255
259
  'React to a message with an emoji. Visible to the space immediately. Pass the emoji itself ("👍"), not a :shortcode:.'
256
260
  + workspaceOnlyNote,
261
+ annotations: { destructiveHint: false },
257
262
  inputSchema: z.object({
258
263
  message: z.string().describe('Message resource name ("spaces/AAAA/messages/BBBB"), or a bare message ID together with `space`'),
259
264
  emoji: z.string().describe('The emoji character to react with, e.g. "👍"'),
@@ -302,6 +302,7 @@ export function registerClassroomTools(server: McpServer): void {
302
302
 
303
303
  server.registerTool('gog_classroom_announcements_create', {
304
304
  description: 'Create an announcement in a Google Classroom course.',
305
+ annotations: { destructiveHint: true },
305
306
  inputSchema: z.object({
306
307
  courseId: z.string().describe('Course ID'),
307
308
  text: z.string().describe('Announcement text'),
@@ -384,6 +385,7 @@ export function registerClassroomTools(server: McpServer): void {
384
385
 
385
386
  server.registerTool('gog_classroom_invitations_accept', {
386
387
  description: 'Accept a Google Classroom invitation.',
388
+ annotations: { destructiveHint: true },
387
389
  inputSchema: z.object({
388
390
  invitationId: z.string().describe('Invitation ID'),
389
391
  account: accountParam,
@@ -37,7 +37,7 @@ export function registerContactsTools(server: McpServer): void {
37
37
 
38
38
  server.registerTool('gog_contacts_create', {
39
39
  description: 'Create a new Google Contact.',
40
- annotations: { destructiveHint: false },
40
+ annotations: { destructiveHint: true },
41
41
  inputSchema: z.object({
42
42
  givenName: z.string().describe('Given (first) name'),
43
43
  familyName: z.string().optional().describe('Family (last) name'),
package/src/tools/docs.ts CHANGED
@@ -30,6 +30,7 @@ export function registerDocsTools(server: McpServer): void {
30
30
 
31
31
  server.registerTool('gog_docs_create', {
32
32
  description: 'Create a new Google Doc. Returns JSON with the new docId and URL.',
33
+ annotations: { destructiveHint: true },
33
34
  inputSchema: z.object({
34
35
  title: z.string().describe('Title for the new document'),
35
36
  account: accountParam,
@@ -118,7 +118,7 @@ export function registerDriveTools(server: McpServer): void {
118
118
 
119
119
  server.registerTool('gog_drive_rename', {
120
120
  description: 'Rename a file or folder in Google Drive.',
121
- annotations: { destructiveHint: true },
121
+ annotations: { destructiveHint: false },
122
122
  inputSchema: z.object({
123
123
  fileId: z.string().describe('File or folder ID'),
124
124
  newName: z.string().describe('New name'),
@@ -130,7 +130,7 @@ export function registerDriveTools(server: McpServer): void {
130
130
 
131
131
  server.registerTool('gog_drive_move', {
132
132
  description: 'Move a file to a different folder in Google Drive.',
133
- annotations: { destructiveHint: true },
133
+ annotations: { destructiveHint: false },
134
134
  inputSchema: z.object({
135
135
  fileId: z.string().describe('File ID to move'),
136
136
  parentId: z.string().describe('Destination folder ID'),
@@ -120,7 +120,7 @@ export function registerSheetsTools(server: McpServer): void {
120
120
 
121
121
  server.registerTool('gog_sheets_create', {
122
122
  description: 'Create a new Google Spreadsheet. Returns JSON with the new spreadsheetId and URL.',
123
- annotations: { destructiveHint: false },
123
+ annotations: { destructiveHint: true },
124
124
  inputSchema: z.object({
125
125
  title: z.string().describe('Title for the new spreadsheet'),
126
126
  account: accountParam,
@@ -34,6 +34,7 @@ export function registerSlidesTools(server: McpServer): void {
34
34
 
35
35
  server.registerTool('gog_slides_create', {
36
36
  description: 'Create a new Google Slides presentation, optionally in a folder or copying from a template.',
37
+ annotations: { destructiveHint: true },
37
38
  inputSchema: z.object({
38
39
  title: z.string().describe('Presentation title'),
39
40
  parent: z.string().optional().describe('Destination folder ID'),
@@ -49,6 +50,7 @@ export function registerSlidesTools(server: McpServer): void {
49
50
 
50
51
  server.registerTool('gog_slides_copy', {
51
52
  description: 'Copy a Google Slides presentation to a new presentation with the given title.',
53
+ annotations: { destructiveHint: true },
52
54
  inputSchema: z.object({
53
55
  presentationId: z.string().describe('Presentation ID to copy'),
54
56
  title: z.string().describe('Title for the new copy'),
@@ -55,7 +55,7 @@ export function registerTasksTools(server: McpServer): void {
55
55
 
56
56
  server.registerTool('gog_tasks_done', {
57
57
  description: 'Mark a task as completed.',
58
- annotations: { destructiveHint: true },
58
+ annotations: { destructiveHint: false },
59
59
  inputSchema: z.object({
60
60
  tasklistId: z.string().describe('Task list ID'),
61
61
  taskId: z.string().describe('Task ID'),