@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,155 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_add_waterfall",
4
+ description: "Add a waterfall chart to a 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 where the chart will be placed",
15
+ },
16
+ title: {
17
+ type: "string",
18
+ description: "Chart title (optional)",
19
+ },
20
+ dataSheetId: {
21
+ type: "number",
22
+ description: "The sheet ID containing the data",
23
+ },
24
+ dataStartRow: {
25
+ type: "number",
26
+ description: "Starting row of data range (0-based)",
27
+ },
28
+ dataEndRow: {
29
+ type: "number",
30
+ description: "Ending row of data range (exclusive, 0-based)",
31
+ },
32
+ dataStartColumn: {
33
+ type: "number",
34
+ description: "Starting column of data range (0-based)",
35
+ },
36
+ dataEndColumn: {
37
+ type: "number",
38
+ description: "Ending column of data range (exclusive, 0-based)",
39
+ },
40
+ firstValueIsTotal: {
41
+ type: "boolean",
42
+ description: "Whether the first value should be treated as a total (optional)",
43
+ },
44
+ hideConnectorLines: {
45
+ type: "boolean",
46
+ description: "Whether to hide connector lines (optional)",
47
+ },
48
+ position: {
49
+ type: "object",
50
+ properties: {
51
+ overlayRow: {
52
+ type: "number",
53
+ description: "Row position for chart overlay (0-based)",
54
+ },
55
+ overlayColumn: {
56
+ type: "number",
57
+ description: "Column position for chart overlay (0-based)",
58
+ },
59
+ },
60
+ description: "Chart position (optional)",
61
+ },
62
+ },
63
+ required: ["spreadsheetId", "sheetId", "dataSheetId", "dataStartRow", "dataEndRow", "dataStartColumn", "dataEndColumn"],
64
+ },
65
+ };
66
+ export async function addWaterfall(args) {
67
+ try {
68
+ const sheets = google.sheets("v4");
69
+ const waterfallChart = {
70
+ series: [
71
+ {
72
+ sourceRange: {
73
+ sources: [
74
+ {
75
+ sheetId: args.dataSheetId,
76
+ startRowIndex: args.dataStartRow,
77
+ endRowIndex: args.dataEndRow,
78
+ startColumnIndex: args.dataStartColumn + 1,
79
+ endColumnIndex: args.dataEndColumn,
80
+ },
81
+ ],
82
+ },
83
+ },
84
+ ],
85
+ domain: {
86
+ sourceRange: {
87
+ sources: [
88
+ {
89
+ sheetId: args.dataSheetId,
90
+ startRowIndex: args.dataStartRow,
91
+ endRowIndex: args.dataEndRow,
92
+ startColumnIndex: args.dataStartColumn,
93
+ endColumnIndex: args.dataStartColumn + 1,
94
+ },
95
+ ],
96
+ },
97
+ },
98
+ };
99
+ if (args.firstValueIsTotal !== undefined) {
100
+ waterfallChart.firstValueIsTotal = args.firstValueIsTotal;
101
+ }
102
+ if (args.hideConnectorLines !== undefined) {
103
+ waterfallChart.hideConnectorLines = args.hideConnectorLines;
104
+ }
105
+ const chartSpec = {
106
+ title: args.title || "Waterfall Chart",
107
+ waterfallChart,
108
+ };
109
+ const position = {
110
+ overlayPosition: {
111
+ anchorCell: {
112
+ sheetId: args.sheetId,
113
+ rowIndex: args.position?.overlayRow || 0,
114
+ columnIndex: args.position?.overlayColumn || 0,
115
+ },
116
+ },
117
+ };
118
+ const response = await sheets.spreadsheets.batchUpdate({
119
+ spreadsheetId: args.spreadsheetId,
120
+ requestBody: {
121
+ requests: [
122
+ {
123
+ addChart: {
124
+ chart: {
125
+ spec: chartSpec,
126
+ position,
127
+ },
128
+ },
129
+ },
130
+ ],
131
+ },
132
+ });
133
+ const chartId = response.data.replies?.[0]?.addChart?.chart?.chartId;
134
+ return {
135
+ content: [
136
+ {
137
+ type: "text",
138
+ text: `Successfully created waterfall chart. Chart ID: ${chartId}`,
139
+ },
140
+ ],
141
+ isError: false,
142
+ };
143
+ }
144
+ catch (error) {
145
+ return {
146
+ content: [
147
+ {
148
+ type: "text",
149
+ text: `Error creating waterfall chart: ${error.message}`,
150
+ },
151
+ ],
152
+ isError: true,
153
+ };
154
+ }
155
+ }
@@ -0,0 +1,56 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_delete_chart",
4
+ description: "Delete a chart from a spreadsheet",
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 delete",
15
+ },
16
+ },
17
+ required: ["spreadsheetId", "chartId"],
18
+ },
19
+ };
20
+ export async function deleteChart(args) {
21
+ try {
22
+ const sheets = google.sheets("v4");
23
+ await sheets.spreadsheets.batchUpdate({
24
+ spreadsheetId: args.spreadsheetId,
25
+ requestBody: {
26
+ requests: [
27
+ {
28
+ deleteEmbeddedObject: {
29
+ objectId: args.chartId,
30
+ },
31
+ },
32
+ ],
33
+ },
34
+ });
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: `Successfully deleted chart ${args.chartId}`,
40
+ },
41
+ ],
42
+ isError: false,
43
+ };
44
+ }
45
+ catch (error) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: `Error deleting chart: ${error.message}`,
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ }
@@ -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,68 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_append_data",
4
+ description: "Append data to the end of a sheet 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
+ range: {
13
+ type: "string",
14
+ description: "The A1 notation range to append to (e.g., 'Sheet1!A:B')",
15
+ },
16
+ values: {
17
+ type: "array",
18
+ items: {
19
+ type: "array",
20
+ items: {
21
+ type: "string",
22
+ },
23
+ },
24
+ description: "2D array of values to append",
25
+ },
26
+ valueInputOption: {
27
+ type: "string",
28
+ enum: ["RAW", "USER_ENTERED"],
29
+ description: "How input data should be interpreted (RAW or USER_ENTERED). Default: RAW",
30
+ },
31
+ },
32
+ required: ["spreadsheetId", "range", "values"],
33
+ },
34
+ };
35
+ export async function appendData(args) {
36
+ try {
37
+ const sheets = google.sheets("v4");
38
+ const response = await sheets.spreadsheets.values.append({
39
+ spreadsheetId: args.spreadsheetId,
40
+ range: args.range,
41
+ valueInputOption: args.valueInputOption || "RAW",
42
+ requestBody: {
43
+ values: args.values,
44
+ },
45
+ });
46
+ const updates = response.data.updates;
47
+ return {
48
+ content: [
49
+ {
50
+ type: "text",
51
+ text: `Successfully appended ${updates?.updatedRows || 0} row(s) and ${updates?.updatedColumns || 0} column(s) to range ${updates?.updatedRange}`,
52
+ },
53
+ ],
54
+ isError: false,
55
+ };
56
+ }
57
+ catch (error) {
58
+ return {
59
+ content: [
60
+ {
61
+ type: "text",
62
+ text: `Error appending data: ${error.message}`,
63
+ },
64
+ ],
65
+ isError: true,
66
+ };
67
+ }
68
+ }
@@ -0,0 +1,53 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_batch_clear",
4
+ description: "Clear data from multiple ranges 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
+ ranges: {
13
+ type: "array",
14
+ items: {
15
+ type: "string",
16
+ },
17
+ description: "Array of A1 notation ranges to clear (e.g., ['Sheet1!A1:B10', 'Sheet2!C5:D20'])",
18
+ },
19
+ },
20
+ required: ["spreadsheetId", "ranges"],
21
+ },
22
+ };
23
+ export async function batchClear(args) {
24
+ try {
25
+ const sheets = google.sheets("v4");
26
+ const response = await sheets.spreadsheets.values.batchClear({
27
+ spreadsheetId: args.spreadsheetId,
28
+ requestBody: {
29
+ ranges: args.ranges,
30
+ },
31
+ });
32
+ return {
33
+ content: [
34
+ {
35
+ type: "text",
36
+ text: `Successfully cleared ${args.ranges.length} range(s): ${args.ranges.join(", ")}`,
37
+ },
38
+ ],
39
+ isError: false,
40
+ };
41
+ }
42
+ catch (error) {
43
+ return {
44
+ content: [
45
+ {
46
+ type: "text",
47
+ text: `Error clearing ranges: ${error.message}`,
48
+ },
49
+ ],
50
+ isError: true,
51
+ };
52
+ }
53
+ }
@@ -0,0 +1,81 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_batch_update",
4
+ description: "Update multiple cell ranges in a Google Spreadsheet in a single batch operation",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ spreadsheetId: {
9
+ type: "string",
10
+ description: "The ID of the spreadsheet",
11
+ },
12
+ updates: {
13
+ type: "array",
14
+ items: {
15
+ type: "object",
16
+ properties: {
17
+ range: {
18
+ type: "string",
19
+ description: "The A1 notation range (e.g., 'Sheet1!A1:B2')",
20
+ },
21
+ values: {
22
+ type: "array",
23
+ items: {
24
+ type: "array",
25
+ items: {
26
+ type: "string",
27
+ },
28
+ },
29
+ description: "2D array of values",
30
+ },
31
+ },
32
+ required: ["range", "values"],
33
+ },
34
+ description: "Array of range-value pairs to update",
35
+ },
36
+ valueInputOption: {
37
+ type: "string",
38
+ enum: ["RAW", "USER_ENTERED"],
39
+ description: "How input data should be interpreted (RAW or USER_ENTERED). Default: RAW",
40
+ },
41
+ },
42
+ required: ["spreadsheetId", "updates"],
43
+ },
44
+ };
45
+ export async function batchUpdate(args) {
46
+ const sheets = google.sheets("v4");
47
+ try {
48
+ const response = await sheets.spreadsheets.values.batchUpdate({
49
+ spreadsheetId: args.spreadsheetId,
50
+ requestBody: {
51
+ valueInputOption: args.valueInputOption || "RAW",
52
+ data: args.updates.map((update) => ({
53
+ range: update.range,
54
+ values: update.values,
55
+ })),
56
+ },
57
+ });
58
+ const totalRows = response.data.totalUpdatedRows || 0;
59
+ const totalCells = response.data.totalUpdatedCells || 0;
60
+ return {
61
+ content: [
62
+ {
63
+ type: "text",
64
+ text: `Successfully updated ${args.updates.length} range(s): ${totalRows} row(s), ${totalCells} cell(s) modified`,
65
+ },
66
+ ],
67
+ isError: false,
68
+ };
69
+ }
70
+ catch (error) {
71
+ return {
72
+ content: [
73
+ {
74
+ type: "text",
75
+ text: `Error batch updating: ${error.message}`,
76
+ },
77
+ ],
78
+ isError: true,
79
+ };
80
+ }
81
+ }
@@ -0,0 +1,53 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_clear_data",
4
+ description: "Clear data from specified ranges 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
+ ranges: {
13
+ type: "array",
14
+ items: {
15
+ type: "string",
16
+ },
17
+ description: "Array of A1 notation ranges to clear (e.g., ['Sheet1!A1:B10', 'Sheet2!C1:D5'])",
18
+ },
19
+ },
20
+ required: ["spreadsheetId", "ranges"],
21
+ },
22
+ };
23
+ export async function clearData(args) {
24
+ const sheets = google.sheets("v4");
25
+ try {
26
+ const response = await sheets.spreadsheets.values.batchClear({
27
+ spreadsheetId: args.spreadsheetId,
28
+ requestBody: {
29
+ ranges: args.ranges,
30
+ },
31
+ });
32
+ return {
33
+ content: [
34
+ {
35
+ type: "text",
36
+ text: `Successfully cleared ${args.ranges.length} range(s): ${args.ranges.join(", ")}`,
37
+ },
38
+ ],
39
+ isError: false,
40
+ };
41
+ }
42
+ catch (error) {
43
+ return {
44
+ content: [
45
+ {
46
+ type: "text",
47
+ text: `Error clearing data: ${error.message}`,
48
+ },
49
+ ],
50
+ isError: true,
51
+ };
52
+ }
53
+ }
@@ -0,0 +1,81 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_create_filter",
4
+ description: "Create a basic filter for a range 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 createFilter(args) {
37
+ try {
38
+ const sheets = google.sheets("v4");
39
+ await sheets.spreadsheets.batchUpdate({
40
+ spreadsheetId: args.spreadsheetId,
41
+ requestBody: {
42
+ requests: [
43
+ {
44
+ setBasicFilter: {
45
+ filter: {
46
+ range: {
47
+ sheetId: args.sheetId,
48
+ startRowIndex: args.startRow,
49
+ endRowIndex: args.endRow,
50
+ startColumnIndex: args.startColumn,
51
+ endColumnIndex: args.endColumn,
52
+ },
53
+ },
54
+ },
55
+ },
56
+ ],
57
+ },
58
+ });
59
+ const rangeStr = `R${args.startRow}C${args.startColumn}:R${args.endRow - 1}C${args.endColumn - 1}`;
60
+ return {
61
+ content: [
62
+ {
63
+ type: "text",
64
+ text: `Successfully created filter for range ${rangeStr}`,
65
+ },
66
+ ],
67
+ isError: false,
68
+ };
69
+ }
70
+ catch (error) {
71
+ return {
72
+ content: [
73
+ {
74
+ type: "text",
75
+ text: `Error creating filter: ${error.message}`,
76
+ },
77
+ ],
78
+ isError: true,
79
+ };
80
+ }
81
+ }