@alanse/mcp-server-google-workspace 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -0
  3. package/dist/auth.js +135 -0
  4. package/dist/index.js +116 -0
  5. package/dist/tools/basic/gsheets_add_sheet.js +65 -0
  6. package/dist/tools/basic/gsheets_copy_sheet.js +56 -0
  7. package/dist/tools/basic/gsheets_copy_to.js +113 -0
  8. package/dist/tools/basic/gsheets_create_spreadsheet.js +88 -0
  9. package/dist/tools/basic/gsheets_delete_columns.js +69 -0
  10. package/dist/tools/basic/gsheets_delete_rows.js +69 -0
  11. package/dist/tools/basic/gsheets_delete_sheet.js +56 -0
  12. package/dist/tools/basic/gsheets_duplicate_sheet.js +72 -0
  13. package/dist/tools/basic/gsheets_insert_columns.js +69 -0
  14. package/dist/tools/basic/gsheets_insert_rows.js +69 -0
  15. package/dist/tools/basic/gsheets_list_sheets.js +53 -0
  16. package/dist/tools/basic/gsheets_read.js +120 -0
  17. package/dist/tools/basic/gsheets_rename_sheet.js +64 -0
  18. package/dist/tools/charts/gsheets_add_bubble.js +176 -0
  19. package/dist/tools/charts/gsheets_add_candlestick.js +192 -0
  20. package/dist/tools/charts/gsheets_add_chart.js +162 -0
  21. package/dist/tools/charts/gsheets_add_combo.js +169 -0
  22. package/dist/tools/charts/gsheets_add_histogram.js +143 -0
  23. package/dist/tools/charts/gsheets_add_org_chart.js +160 -0
  24. package/dist/tools/charts/gsheets_add_treemap.js +177 -0
  25. package/dist/tools/charts/gsheets_add_waterfall.js +155 -0
  26. package/dist/tools/charts/gsheets_delete_chart.js +56 -0
  27. package/dist/tools/charts/gsheets_update_chart.js +118 -0
  28. package/dist/tools/data/gsheets_append_data.js +68 -0
  29. package/dist/tools/data/gsheets_batch_clear.js +53 -0
  30. package/dist/tools/data/gsheets_batch_update.js +81 -0
  31. package/dist/tools/data/gsheets_clear_data.js +53 -0
  32. package/dist/tools/data/gsheets_create_filter.js +81 -0
  33. package/dist/tools/data/gsheets_find_replace.js +124 -0
  34. package/dist/tools/data/gsheets_set_data_validation.js +153 -0
  35. package/dist/tools/data/gsheets_sort_range.js +102 -0
  36. package/dist/tools/data/gsheets_update_cell.js +44 -0
  37. package/dist/tools/formatting/gsheets_auto_resize.js +75 -0
  38. package/dist/tools/formatting/gsheets_format_cells.js +161 -0
  39. package/dist/tools/formatting/gsheets_freeze_columns.js +67 -0
  40. package/dist/tools/formatting/gsheets_freeze_rows.js +67 -0
  41. package/dist/tools/formatting/gsheets_merge_cells.js +85 -0
  42. package/dist/tools/formatting/gsheets_set_number_format.js +116 -0
  43. package/dist/tools/formatting/gsheets_unmerge_cells.js +79 -0
  44. package/dist/tools/formatting/gsheets_update_borders.js +212 -0
  45. package/dist/tools/gdrive/gdrive_read_file.js +77 -0
  46. package/dist/tools/gdrive/gdrive_search.js +71 -0
  47. package/dist/tools/gdrive_read_file.js +77 -0
  48. package/dist/tools/gdrive_search.js +71 -0
  49. package/dist/tools/gsheets_add_bubble.js +176 -0
  50. package/dist/tools/gsheets_add_candlestick.js +192 -0
  51. package/dist/tools/gsheets_add_chart.js +162 -0
  52. package/dist/tools/gsheets_add_combo.js +169 -0
  53. package/dist/tools/gsheets_add_conditional_format.js +175 -0
  54. package/dist/tools/gsheets_add_histogram.js +143 -0
  55. package/dist/tools/gsheets_add_named_range.js +87 -0
  56. package/dist/tools/gsheets_add_org_chart.js +160 -0
  57. package/dist/tools/gsheets_add_protected_range.js +127 -0
  58. package/dist/tools/gsheets_add_sheet.js +65 -0
  59. package/dist/tools/gsheets_add_treemap.js +177 -0
  60. package/dist/tools/gsheets_add_waterfall.js +155 -0
  61. package/dist/tools/gsheets_append_data.js +68 -0
  62. package/dist/tools/gsheets_auto_resize.js +75 -0
  63. package/dist/tools/gsheets_batch_clear.js +53 -0
  64. package/dist/tools/gsheets_batch_update.js +81 -0
  65. package/dist/tools/gsheets_clear_data.js +53 -0
  66. package/dist/tools/gsheets_copy_sheet.js +56 -0
  67. package/dist/tools/gsheets_copy_to.js +113 -0
  68. package/dist/tools/gsheets_create_filter.js +81 -0
  69. package/dist/tools/gsheets_create_spreadsheet.js +88 -0
  70. package/dist/tools/gsheets_delete_chart.js +56 -0
  71. package/dist/tools/gsheets_delete_columns.js +69 -0
  72. package/dist/tools/gsheets_delete_named_range.js +56 -0
  73. package/dist/tools/gsheets_delete_protected_range.js +56 -0
  74. package/dist/tools/gsheets_delete_rows.js +69 -0
  75. package/dist/tools/gsheets_delete_sheet.js +56 -0
  76. package/dist/tools/gsheets_duplicate_sheet.js +72 -0
  77. package/dist/tools/gsheets_find_replace.js +124 -0
  78. package/dist/tools/gsheets_format_cells.js +161 -0
  79. package/dist/tools/gsheets_freeze_columns.js +67 -0
  80. package/dist/tools/gsheets_freeze_rows.js +67 -0
  81. package/dist/tools/gsheets_insert_columns.js +69 -0
  82. package/dist/tools/gsheets_insert_rows.js +69 -0
  83. package/dist/tools/gsheets_list_sheets.js +53 -0
  84. package/dist/tools/gsheets_merge_cells.js +85 -0
  85. package/dist/tools/gsheets_read.js +120 -0
  86. package/dist/tools/gsheets_rename_sheet.js +64 -0
  87. package/dist/tools/gsheets_set_data_validation.js +153 -0
  88. package/dist/tools/gsheets_set_number_format.js +116 -0
  89. package/dist/tools/gsheets_sort_range.js +102 -0
  90. package/dist/tools/gsheets_unmerge_cells.js +79 -0
  91. package/dist/tools/gsheets_update_borders.js +212 -0
  92. package/dist/tools/gsheets_update_cell.js +44 -0
  93. package/dist/tools/gsheets_update_chart.js +118 -0
  94. package/dist/tools/gsheets_update_named_range.js +112 -0
  95. package/dist/tools/gsheets_update_protected_range.js +110 -0
  96. package/dist/tools/index.js +294 -0
  97. package/dist/tools/protection/gsheets_add_conditional_format.js +175 -0
  98. package/dist/tools/protection/gsheets_add_named_range.js +87 -0
  99. package/dist/tools/protection/gsheets_add_protected_range.js +127 -0
  100. package/dist/tools/protection/gsheets_delete_named_range.js +56 -0
  101. package/dist/tools/protection/gsheets_delete_protected_range.js +56 -0
  102. package/dist/tools/protection/gsheets_update_named_range.js +112 -0
  103. package/dist/tools/protection/gsheets_update_protected_range.js +110 -0
  104. package/dist/tools/sheets/advanced/gsheets_add_dimension_group.js +75 -0
  105. package/dist/tools/sheets/advanced/gsheets_add_filter_view.js +86 -0
  106. package/dist/tools/sheets/advanced/gsheets_add_pivot_table.js +188 -0
  107. package/dist/tools/sheets/advanced/gsheets_create_developer_metadata.js +121 -0
  108. package/dist/tools/sheets/advanced/gsheets_delete_developer_metadata.js +61 -0
  109. package/dist/tools/sheets/advanced/gsheets_delete_dimension_group.js +75 -0
  110. package/dist/tools/sheets/advanced/gsheets_update_developer_metadata.js +94 -0
  111. package/dist/tools/sheets/advanced/gsheets_update_dimension_group.js +83 -0
  112. package/dist/tools/sheets/basic/gsheets_add_sheet.js +65 -0
  113. package/dist/tools/sheets/basic/gsheets_copy_sheet.js +56 -0
  114. package/dist/tools/sheets/basic/gsheets_copy_to.js +113 -0
  115. package/dist/tools/sheets/basic/gsheets_create_spreadsheet.js +88 -0
  116. package/dist/tools/sheets/basic/gsheets_delete_columns.js +69 -0
  117. package/dist/tools/sheets/basic/gsheets_delete_rows.js +69 -0
  118. package/dist/tools/sheets/basic/gsheets_delete_sheet.js +56 -0
  119. package/dist/tools/sheets/basic/gsheets_duplicate_sheet.js +72 -0
  120. package/dist/tools/sheets/basic/gsheets_insert_columns.js +69 -0
  121. package/dist/tools/sheets/basic/gsheets_insert_rows.js +69 -0
  122. package/dist/tools/sheets/basic/gsheets_list_sheets.js +53 -0
  123. package/dist/tools/sheets/basic/gsheets_read.js +120 -0
  124. package/dist/tools/sheets/basic/gsheets_rename_sheet.js +64 -0
  125. package/dist/tools/sheets/charts/gsheets_add_bubble.js +176 -0
  126. package/dist/tools/sheets/charts/gsheets_add_candlestick.js +192 -0
  127. package/dist/tools/sheets/charts/gsheets_add_chart.js +162 -0
  128. package/dist/tools/sheets/charts/gsheets_add_combo.js +169 -0
  129. package/dist/tools/sheets/charts/gsheets_add_histogram.js +143 -0
  130. package/dist/tools/sheets/charts/gsheets_add_org_chart.js +160 -0
  131. package/dist/tools/sheets/charts/gsheets_add_treemap.js +177 -0
  132. package/dist/tools/sheets/charts/gsheets_add_waterfall.js +155 -0
  133. package/dist/tools/sheets/charts/gsheets_delete_chart.js +56 -0
  134. package/dist/tools/sheets/charts/gsheets_update_chart.js +118 -0
  135. package/dist/tools/sheets/data/gsheets_append_data.js +68 -0
  136. package/dist/tools/sheets/data/gsheets_batch_clear.js +53 -0
  137. package/dist/tools/sheets/data/gsheets_batch_update.js +81 -0
  138. package/dist/tools/sheets/data/gsheets_clear_data.js +53 -0
  139. package/dist/tools/sheets/data/gsheets_create_filter.js +81 -0
  140. package/dist/tools/sheets/data/gsheets_find_replace.js +124 -0
  141. package/dist/tools/sheets/data/gsheets_set_data_validation.js +153 -0
  142. package/dist/tools/sheets/data/gsheets_sort_range.js +102 -0
  143. package/dist/tools/sheets/data/gsheets_update_cell.js +44 -0
  144. package/dist/tools/sheets/formatting/gsheets_auto_resize.js +75 -0
  145. package/dist/tools/sheets/formatting/gsheets_format_cells.js +161 -0
  146. package/dist/tools/sheets/formatting/gsheets_freeze_columns.js +67 -0
  147. package/dist/tools/sheets/formatting/gsheets_freeze_rows.js +67 -0
  148. package/dist/tools/sheets/formatting/gsheets_merge_cells.js +85 -0
  149. package/dist/tools/sheets/formatting/gsheets_set_number_format.js +116 -0
  150. package/dist/tools/sheets/formatting/gsheets_unmerge_cells.js +79 -0
  151. package/dist/tools/sheets/formatting/gsheets_update_borders.js +212 -0
  152. package/dist/tools/sheets/protection/gsheets_add_conditional_format.js +175 -0
  153. package/dist/tools/sheets/protection/gsheets_add_named_range.js +87 -0
  154. package/dist/tools/sheets/protection/gsheets_add_protected_range.js +127 -0
  155. package/dist/tools/sheets/protection/gsheets_delete_named_range.js +56 -0
  156. package/dist/tools/sheets/protection/gsheets_delete_protected_range.js +56 -0
  157. package/dist/tools/sheets/protection/gsheets_update_named_range.js +112 -0
  158. package/dist/tools/sheets/protection/gsheets_update_protected_range.js +110 -0
  159. package/dist/tools/types.js +1 -0
  160. package/dist/vitest.config.js +18 -0
  161. package/package.json +57 -0
@@ -0,0 +1,79 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_unmerge_cells",
4
+ description: "Unmerge previously merged cells in a Google Spreadsheet",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ spreadsheetId: {
9
+ type: "string",
10
+ description: "The ID of the spreadsheet",
11
+ },
12
+ sheetId: {
13
+ type: "number",
14
+ description: "The ID of the sheet",
15
+ },
16
+ startRow: {
17
+ type: "number",
18
+ description: "Starting row index (0-based)",
19
+ },
20
+ endRow: {
21
+ type: "number",
22
+ description: "Ending row index (exclusive, 0-based)",
23
+ },
24
+ startColumn: {
25
+ type: "number",
26
+ description: "Starting column index (0-based)",
27
+ },
28
+ endColumn: {
29
+ type: "number",
30
+ description: "Ending column index (exclusive, 0-based)",
31
+ },
32
+ },
33
+ required: ["spreadsheetId", "sheetId", "startRow", "endRow", "startColumn", "endColumn"],
34
+ },
35
+ };
36
+ export async function unmergeCells(args) {
37
+ try {
38
+ const sheets = google.sheets("v4");
39
+ await sheets.spreadsheets.batchUpdate({
40
+ spreadsheetId: args.spreadsheetId,
41
+ requestBody: {
42
+ requests: [
43
+ {
44
+ unmergeCells: {
45
+ range: {
46
+ sheetId: args.sheetId,
47
+ startRowIndex: args.startRow,
48
+ endRowIndex: args.endRow,
49
+ startColumnIndex: args.startColumn,
50
+ endColumnIndex: args.endColumn,
51
+ },
52
+ },
53
+ },
54
+ ],
55
+ },
56
+ });
57
+ const rangeStr = `R${args.startRow}C${args.startColumn}:R${args.endRow - 1}C${args.endColumn - 1}`;
58
+ return {
59
+ content: [
60
+ {
61
+ type: "text",
62
+ text: `Successfully unmerged cells in range ${rangeStr}`,
63
+ },
64
+ ],
65
+ isError: false,
66
+ };
67
+ }
68
+ catch (error) {
69
+ return {
70
+ content: [
71
+ {
72
+ type: "text",
73
+ text: `Error unmerging cells: ${error.message}`,
74
+ },
75
+ ],
76
+ isError: true,
77
+ };
78
+ }
79
+ }
@@ -0,0 +1,212 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_update_borders",
4
+ description: "Update cell borders in a Google Spreadsheet",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ spreadsheetId: {
9
+ type: "string",
10
+ description: "The ID of the spreadsheet",
11
+ },
12
+ sheetId: {
13
+ type: "number",
14
+ description: "The ID of the sheet",
15
+ },
16
+ startRow: {
17
+ type: "number",
18
+ description: "Starting row index (0-based)",
19
+ },
20
+ endRow: {
21
+ type: "number",
22
+ description: "Ending row index (exclusive, 0-based)",
23
+ },
24
+ startColumn: {
25
+ type: "number",
26
+ description: "Starting column index (0-based)",
27
+ },
28
+ endColumn: {
29
+ type: "number",
30
+ description: "Ending column index (exclusive, 0-based)",
31
+ },
32
+ top: {
33
+ type: "object",
34
+ properties: {
35
+ style: {
36
+ type: "string",
37
+ enum: ["SOLID", "DOTTED", "DASHED", "DOUBLE", "SOLID_MEDIUM", "SOLID_THICK"],
38
+ },
39
+ width: { type: "number" },
40
+ color: {
41
+ type: "object",
42
+ properties: {
43
+ red: { type: "number" },
44
+ green: { type: "number" },
45
+ blue: { type: "number" },
46
+ },
47
+ },
48
+ },
49
+ description: "Top border style",
50
+ },
51
+ bottom: {
52
+ type: "object",
53
+ properties: {
54
+ style: {
55
+ type: "string",
56
+ enum: ["SOLID", "DOTTED", "DASHED", "DOUBLE", "SOLID_MEDIUM", "SOLID_THICK"],
57
+ },
58
+ width: { type: "number" },
59
+ color: {
60
+ type: "object",
61
+ properties: {
62
+ red: { type: "number" },
63
+ green: { type: "number" },
64
+ blue: { type: "number" },
65
+ },
66
+ },
67
+ },
68
+ description: "Bottom border style",
69
+ },
70
+ left: {
71
+ type: "object",
72
+ properties: {
73
+ style: {
74
+ type: "string",
75
+ enum: ["SOLID", "DOTTED", "DASHED", "DOUBLE", "SOLID_MEDIUM", "SOLID_THICK"],
76
+ },
77
+ width: { type: "number" },
78
+ color: {
79
+ type: "object",
80
+ properties: {
81
+ red: { type: "number" },
82
+ green: { type: "number" },
83
+ blue: { type: "number" },
84
+ },
85
+ },
86
+ },
87
+ description: "Left border style",
88
+ },
89
+ right: {
90
+ type: "object",
91
+ properties: {
92
+ style: {
93
+ type: "string",
94
+ enum: ["SOLID", "DOTTED", "DASHED", "DOUBLE", "SOLID_MEDIUM", "SOLID_THICK"],
95
+ },
96
+ width: { type: "number" },
97
+ color: {
98
+ type: "object",
99
+ properties: {
100
+ red: { type: "number" },
101
+ green: { type: "number" },
102
+ blue: { type: "number" },
103
+ },
104
+ },
105
+ },
106
+ description: "Right border style",
107
+ },
108
+ innerHorizontal: {
109
+ type: "object",
110
+ properties: {
111
+ style: {
112
+ type: "string",
113
+ enum: ["SOLID", "DOTTED", "DASHED", "DOUBLE", "SOLID_MEDIUM", "SOLID_THICK"],
114
+ },
115
+ width: { type: "number" },
116
+ color: {
117
+ type: "object",
118
+ properties: {
119
+ red: { type: "number" },
120
+ green: { type: "number" },
121
+ blue: { type: "number" },
122
+ },
123
+ },
124
+ },
125
+ description: "Inner horizontal border style",
126
+ },
127
+ innerVertical: {
128
+ type: "object",
129
+ properties: {
130
+ style: {
131
+ type: "string",
132
+ enum: ["SOLID", "DOTTED", "DASHED", "DOUBLE", "SOLID_MEDIUM", "SOLID_THICK"],
133
+ },
134
+ width: { type: "number" },
135
+ color: {
136
+ type: "object",
137
+ properties: {
138
+ red: { type: "number" },
139
+ green: { type: "number" },
140
+ blue: { type: "number" },
141
+ },
142
+ },
143
+ },
144
+ description: "Inner vertical border style",
145
+ },
146
+ },
147
+ required: ["spreadsheetId", "sheetId", "startRow", "endRow", "startColumn", "endColumn"],
148
+ },
149
+ };
150
+ export async function updateBorders(args) {
151
+ try {
152
+ const sheets = google.sheets("v4");
153
+ await sheets.spreadsheets.batchUpdate({
154
+ spreadsheetId: args.spreadsheetId,
155
+ requestBody: {
156
+ requests: [
157
+ {
158
+ updateBorders: {
159
+ range: {
160
+ sheetId: args.sheetId,
161
+ startRowIndex: args.startRow,
162
+ endRowIndex: args.endRow,
163
+ startColumnIndex: args.startColumn,
164
+ endColumnIndex: args.endColumn,
165
+ },
166
+ top: args.top,
167
+ bottom: args.bottom,
168
+ left: args.left,
169
+ right: args.right,
170
+ innerHorizontal: args.innerHorizontal,
171
+ innerVertical: args.innerVertical,
172
+ },
173
+ },
174
+ ],
175
+ },
176
+ });
177
+ const rangeStr = `R${args.startRow}C${args.startColumn}:R${args.endRow - 1}C${args.endColumn - 1}`;
178
+ const bordersSet = [];
179
+ if (args.top)
180
+ bordersSet.push("top");
181
+ if (args.bottom)
182
+ bordersSet.push("bottom");
183
+ if (args.left)
184
+ bordersSet.push("left");
185
+ if (args.right)
186
+ bordersSet.push("right");
187
+ if (args.innerHorizontal)
188
+ bordersSet.push("innerHorizontal");
189
+ if (args.innerVertical)
190
+ bordersSet.push("innerVertical");
191
+ return {
192
+ content: [
193
+ {
194
+ type: "text",
195
+ text: `Successfully updated borders for range ${rangeStr}. Borders set: ${bordersSet.join(", ")}`,
196
+ },
197
+ ],
198
+ isError: false,
199
+ };
200
+ }
201
+ catch (error) {
202
+ return {
203
+ content: [
204
+ {
205
+ type: "text",
206
+ text: `Error updating borders: ${error.message}`,
207
+ },
208
+ ],
209
+ isError: true,
210
+ };
211
+ }
212
+ }
@@ -0,0 +1,44 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_update_cell",
4
+ description: "Update a cell value in a Google Spreadsheet",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ fileId: {
9
+ type: "string",
10
+ description: "ID of the spreadsheet",
11
+ },
12
+ range: {
13
+ type: "string",
14
+ description: "Cell range in A1 notation (e.g. 'Sheet1!A1')",
15
+ },
16
+ value: {
17
+ type: "string",
18
+ description: "New cell value",
19
+ },
20
+ },
21
+ required: ["fileId", "range", "value"],
22
+ },
23
+ };
24
+ export async function updateCell(args) {
25
+ const { fileId, range, value } = args;
26
+ const sheets = google.sheets({ version: "v4" });
27
+ await sheets.spreadsheets.values.update({
28
+ spreadsheetId: fileId,
29
+ range: range,
30
+ valueInputOption: "RAW",
31
+ requestBody: {
32
+ values: [[value]],
33
+ },
34
+ });
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: `Updated cell ${range} to value: ${value}`,
40
+ },
41
+ ],
42
+ isError: false,
43
+ };
44
+ }
@@ -0,0 +1,118 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_update_chart",
4
+ description: "Update an existing chart's properties",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ spreadsheetId: {
9
+ type: "string",
10
+ description: "The ID of the spreadsheet",
11
+ },
12
+ chartId: {
13
+ type: "number",
14
+ description: "The ID of the chart to update",
15
+ },
16
+ title: {
17
+ type: "string",
18
+ description: "New chart title (optional)",
19
+ },
20
+ position: {
21
+ type: "object",
22
+ properties: {
23
+ sheetId: {
24
+ type: "number",
25
+ description: "Sheet ID for chart position",
26
+ },
27
+ overlayRow: {
28
+ type: "number",
29
+ description: "Row position for chart overlay (0-based)",
30
+ },
31
+ overlayColumn: {
32
+ type: "number",
33
+ description: "Column position for chart overlay (0-based)",
34
+ },
35
+ },
36
+ description: "New chart position (optional)",
37
+ },
38
+ },
39
+ required: ["spreadsheetId", "chartId"],
40
+ },
41
+ };
42
+ export async function updateChart(args) {
43
+ try {
44
+ const sheets = google.sheets("v4");
45
+ // First, get the current chart to preserve properties we're not updating
46
+ const spreadsheet = await sheets.spreadsheets.get({
47
+ spreadsheetId: args.spreadsheetId,
48
+ });
49
+ let currentChart = null;
50
+ for (const sheet of spreadsheet.data.sheets || []) {
51
+ const chart = sheet.charts?.find((c) => c.chartId === args.chartId);
52
+ if (chart) {
53
+ currentChart = chart;
54
+ break;
55
+ }
56
+ }
57
+ if (!currentChart) {
58
+ throw new Error(`Chart ${args.chartId} not found`);
59
+ }
60
+ const updatedChart = {
61
+ chartId: args.chartId,
62
+ spec: currentChart.spec,
63
+ position: currentChart.position,
64
+ };
65
+ const fields = [];
66
+ // Update title if provided
67
+ if (args.title !== undefined) {
68
+ updatedChart.spec.title = args.title;
69
+ fields.push("spec.title");
70
+ }
71
+ // Update position if provided
72
+ if (args.position) {
73
+ updatedChart.position = {
74
+ overlayPosition: {
75
+ anchorCell: {
76
+ sheetId: args.position.sheetId,
77
+ rowIndex: args.position.overlayRow || 0,
78
+ columnIndex: args.position.overlayColumn || 0,
79
+ },
80
+ },
81
+ };
82
+ fields.push("position");
83
+ }
84
+ await sheets.spreadsheets.batchUpdate({
85
+ spreadsheetId: args.spreadsheetId,
86
+ requestBody: {
87
+ requests: [
88
+ {
89
+ updateChartSpec: {
90
+ chartId: args.chartId,
91
+ spec: updatedChart.spec,
92
+ },
93
+ },
94
+ ],
95
+ },
96
+ });
97
+ return {
98
+ content: [
99
+ {
100
+ type: "text",
101
+ text: `Successfully updated chart ${args.chartId}`,
102
+ },
103
+ ],
104
+ isError: false,
105
+ };
106
+ }
107
+ catch (error) {
108
+ return {
109
+ content: [
110
+ {
111
+ type: "text",
112
+ text: `Error updating chart: ${error.message}`,
113
+ },
114
+ ],
115
+ isError: true,
116
+ };
117
+ }
118
+ }
@@ -0,0 +1,112 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_update_named_range",
4
+ description: "Update a named range's properties",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ spreadsheetId: {
9
+ type: "string",
10
+ description: "The ID of the spreadsheet",
11
+ },
12
+ namedRangeId: {
13
+ type: "string",
14
+ description: "The ID of the named range to update",
15
+ },
16
+ name: {
17
+ type: "string",
18
+ description: "New name for the range (optional)",
19
+ },
20
+ sheetId: {
21
+ type: "number",
22
+ description: "The ID of the sheet (optional)",
23
+ },
24
+ startRow: {
25
+ type: "number",
26
+ description: "Starting row index (0-based, optional)",
27
+ },
28
+ endRow: {
29
+ type: "number",
30
+ description: "Ending row index (exclusive, 0-based, optional)",
31
+ },
32
+ startColumn: {
33
+ type: "number",
34
+ description: "Starting column index (0-based, optional)",
35
+ },
36
+ endColumn: {
37
+ type: "number",
38
+ description: "Ending column index (exclusive, 0-based, optional)",
39
+ },
40
+ },
41
+ required: ["spreadsheetId", "namedRangeId"],
42
+ },
43
+ };
44
+ export async function updateNamedRange(args) {
45
+ try {
46
+ const sheets = google.sheets("v4");
47
+ const namedRange = {
48
+ namedRangeId: args.namedRangeId,
49
+ };
50
+ const fields = [];
51
+ if (args.name !== undefined) {
52
+ namedRange.name = args.name;
53
+ fields.push("name");
54
+ }
55
+ if (args.sheetId !== undefined ||
56
+ args.startRow !== undefined ||
57
+ args.endRow !== undefined ||
58
+ args.startColumn !== undefined ||
59
+ args.endColumn !== undefined) {
60
+ namedRange.range = {};
61
+ if (args.sheetId !== undefined) {
62
+ namedRange.range.sheetId = args.sheetId;
63
+ }
64
+ if (args.startRow !== undefined) {
65
+ namedRange.range.startRowIndex = args.startRow;
66
+ }
67
+ if (args.endRow !== undefined) {
68
+ namedRange.range.endRowIndex = args.endRow;
69
+ }
70
+ if (args.startColumn !== undefined) {
71
+ namedRange.range.startColumnIndex = args.startColumn;
72
+ }
73
+ if (args.endColumn !== undefined) {
74
+ namedRange.range.endColumnIndex = args.endColumn;
75
+ }
76
+ fields.push("range");
77
+ }
78
+ await sheets.spreadsheets.batchUpdate({
79
+ spreadsheetId: args.spreadsheetId,
80
+ requestBody: {
81
+ requests: [
82
+ {
83
+ updateNamedRange: {
84
+ namedRange,
85
+ fields: fields.join(","),
86
+ },
87
+ },
88
+ ],
89
+ },
90
+ });
91
+ return {
92
+ content: [
93
+ {
94
+ type: "text",
95
+ text: `Successfully updated named range ${args.namedRangeId}`,
96
+ },
97
+ ],
98
+ isError: false,
99
+ };
100
+ }
101
+ catch (error) {
102
+ return {
103
+ content: [
104
+ {
105
+ type: "text",
106
+ text: `Error updating named range: ${error.message}`,
107
+ },
108
+ ],
109
+ isError: true,
110
+ };
111
+ }
112
+ }
@@ -0,0 +1,110 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_update_protected_range",
4
+ description: "Update protection settings for a protected range",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ spreadsheetId: {
9
+ type: "string",
10
+ description: "The ID of the spreadsheet",
11
+ },
12
+ protectedRangeId: {
13
+ type: "number",
14
+ description: "The ID of the protected range to update",
15
+ },
16
+ description: {
17
+ type: "string",
18
+ description: "New description for the protected range",
19
+ },
20
+ warningOnly: {
21
+ type: "boolean",
22
+ description: "If true, show a warning instead of preventing edits",
23
+ },
24
+ editors: {
25
+ type: "object",
26
+ properties: {
27
+ users: {
28
+ type: "array",
29
+ items: { type: "string" },
30
+ description: "Email addresses of users who can edit",
31
+ },
32
+ groups: {
33
+ type: "array",
34
+ items: { type: "string" },
35
+ description: "Email addresses of groups who can edit",
36
+ },
37
+ domainUsersCanEdit: {
38
+ type: "boolean",
39
+ description: "Whether all users in the domain can edit",
40
+ },
41
+ },
42
+ description: "Who can edit the protected range",
43
+ },
44
+ },
45
+ required: ["spreadsheetId", "protectedRangeId"],
46
+ },
47
+ };
48
+ export async function updateProtectedRange(args) {
49
+ try {
50
+ const sheets = google.sheets("v4");
51
+ const protectedRange = {
52
+ protectedRangeId: args.protectedRangeId,
53
+ };
54
+ const fields = [];
55
+ if (args.description !== undefined) {
56
+ protectedRange.description = args.description;
57
+ fields.push("description");
58
+ }
59
+ if (args.warningOnly !== undefined) {
60
+ protectedRange.warningOnly = args.warningOnly;
61
+ fields.push("warningOnly");
62
+ }
63
+ if (args.editors) {
64
+ protectedRange.editors = {};
65
+ if (args.editors.users !== undefined) {
66
+ protectedRange.editors.users = args.editors.users;
67
+ }
68
+ if (args.editors.groups !== undefined) {
69
+ protectedRange.editors.groups = args.editors.groups;
70
+ }
71
+ if (args.editors.domainUsersCanEdit !== undefined) {
72
+ protectedRange.editors.domainUsersCanEdit = args.editors.domainUsersCanEdit;
73
+ }
74
+ fields.push("editors");
75
+ }
76
+ await sheets.spreadsheets.batchUpdate({
77
+ spreadsheetId: args.spreadsheetId,
78
+ requestBody: {
79
+ requests: [
80
+ {
81
+ updateProtectedRange: {
82
+ protectedRange,
83
+ fields: fields.join(","),
84
+ },
85
+ },
86
+ ],
87
+ },
88
+ });
89
+ return {
90
+ content: [
91
+ {
92
+ type: "text",
93
+ text: `Successfully updated protected range ${args.protectedRangeId}`,
94
+ },
95
+ ],
96
+ isError: false,
97
+ };
98
+ }
99
+ catch (error) {
100
+ return {
101
+ content: [
102
+ {
103
+ type: "text",
104
+ text: `Error updating protected range: ${error.message}`,
105
+ },
106
+ ],
107
+ isError: true,
108
+ };
109
+ }
110
+ }