@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,67 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_freeze_columns",
4
+ description: "Freeze columns at the left of a sheet",
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
+ count: {
17
+ type: "number",
18
+ description: "Number of columns to freeze (0 to unfreeze all)",
19
+ },
20
+ },
21
+ required: ["spreadsheetId", "sheetId", "count"],
22
+ },
23
+ };
24
+ export async function freezeColumns(args) {
25
+ try {
26
+ const sheets = google.sheets("v4");
27
+ await sheets.spreadsheets.batchUpdate({
28
+ spreadsheetId: args.spreadsheetId,
29
+ requestBody: {
30
+ requests: [
31
+ {
32
+ updateSheetProperties: {
33
+ properties: {
34
+ sheetId: args.sheetId,
35
+ gridProperties: {
36
+ frozenColumnCount: args.count,
37
+ },
38
+ },
39
+ fields: "gridProperties.frozenColumnCount",
40
+ },
41
+ },
42
+ ],
43
+ },
44
+ });
45
+ const action = args.count === 0 ? "Unfroze all columns" : `Froze ${args.count} column(s)`;
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: `${action} on sheet ${args.sheetId}`,
51
+ },
52
+ ],
53
+ isError: false,
54
+ };
55
+ }
56
+ catch (error) {
57
+ return {
58
+ content: [
59
+ {
60
+ type: "text",
61
+ text: `Error freezing columns: ${error.message}`,
62
+ },
63
+ ],
64
+ isError: true,
65
+ };
66
+ }
67
+ }
@@ -0,0 +1,67 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_freeze_rows",
4
+ description: "Freeze rows at the top of a sheet",
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
+ count: {
17
+ type: "number",
18
+ description: "Number of rows to freeze (0 to unfreeze all)",
19
+ },
20
+ },
21
+ required: ["spreadsheetId", "sheetId", "count"],
22
+ },
23
+ };
24
+ export async function freezeRows(args) {
25
+ try {
26
+ const sheets = google.sheets("v4");
27
+ await sheets.spreadsheets.batchUpdate({
28
+ spreadsheetId: args.spreadsheetId,
29
+ requestBody: {
30
+ requests: [
31
+ {
32
+ updateSheetProperties: {
33
+ properties: {
34
+ sheetId: args.sheetId,
35
+ gridProperties: {
36
+ frozenRowCount: args.count,
37
+ },
38
+ },
39
+ fields: "gridProperties.frozenRowCount",
40
+ },
41
+ },
42
+ ],
43
+ },
44
+ });
45
+ const action = args.count === 0 ? "Unfroze all rows" : `Froze ${args.count} row(s)`;
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: `${action} on sheet ${args.sheetId}`,
51
+ },
52
+ ],
53
+ isError: false,
54
+ };
55
+ }
56
+ catch (error) {
57
+ return {
58
+ content: [
59
+ {
60
+ type: "text",
61
+ text: `Error freezing rows: ${error.message}`,
62
+ },
63
+ ],
64
+ isError: true,
65
+ };
66
+ }
67
+ }
@@ -0,0 +1,85 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_merge_cells",
4
+ description: "Merge 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
+ mergeType: {
33
+ type: "string",
34
+ enum: ["MERGE_ALL", "MERGE_COLUMNS", "MERGE_ROWS"],
35
+ description: "How to merge cells: MERGE_ALL (all cells), MERGE_COLUMNS (merge columns), MERGE_ROWS (merge rows)",
36
+ },
37
+ },
38
+ required: ["spreadsheetId", "sheetId", "startRow", "endRow", "startColumn", "endColumn"],
39
+ },
40
+ };
41
+ export async function mergeCells(args) {
42
+ try {
43
+ const sheets = google.sheets("v4");
44
+ await sheets.spreadsheets.batchUpdate({
45
+ spreadsheetId: args.spreadsheetId,
46
+ requestBody: {
47
+ requests: [
48
+ {
49
+ mergeCells: {
50
+ range: {
51
+ sheetId: args.sheetId,
52
+ startRowIndex: args.startRow,
53
+ endRowIndex: args.endRow,
54
+ startColumnIndex: args.startColumn,
55
+ endColumnIndex: args.endColumn,
56
+ },
57
+ mergeType: args.mergeType || "MERGE_ALL",
58
+ },
59
+ },
60
+ ],
61
+ },
62
+ });
63
+ const rangeStr = `R${args.startRow}C${args.startColumn}:R${args.endRow - 1}C${args.endColumn - 1}`;
64
+ return {
65
+ content: [
66
+ {
67
+ type: "text",
68
+ text: `Successfully merged cells in range ${rangeStr} using ${args.mergeType || "MERGE_ALL"} mode`,
69
+ },
70
+ ],
71
+ isError: false,
72
+ };
73
+ }
74
+ catch (error) {
75
+ return {
76
+ content: [
77
+ {
78
+ type: "text",
79
+ text: `Error merging cells: ${error.message}`,
80
+ },
81
+ ],
82
+ isError: true,
83
+ };
84
+ }
85
+ }
@@ -0,0 +1,116 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_set_number_format",
4
+ description: "Set number format for cells (currency, percentage, date, etc.)",
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
+ numberFormat: {
33
+ type: "object",
34
+ properties: {
35
+ type: {
36
+ type: "string",
37
+ enum: ["NUMBER", "CURRENCY", "PERCENT", "DATE", "TIME", "DATE_TIME", "SCIENTIFIC", "TEXT"],
38
+ description: "The type of number format",
39
+ },
40
+ pattern: {
41
+ type: "string",
42
+ description: "Custom format pattern (optional, e.g., '$#,##0.00', '0.00%', 'yyyy-mm-dd')",
43
+ },
44
+ },
45
+ required: ["type"],
46
+ description: "Number format settings",
47
+ },
48
+ },
49
+ required: ["spreadsheetId", "sheetId", "startRow", "endRow", "startColumn", "endColumn", "numberFormat"],
50
+ },
51
+ };
52
+ export async function setNumberFormat(args) {
53
+ try {
54
+ const sheets = google.sheets("v4");
55
+ // Default patterns for common types
56
+ const defaultPatterns = {
57
+ NUMBER: "#,##0.00",
58
+ CURRENCY: "$#,##0.00",
59
+ PERCENT: "0.00%",
60
+ DATE: "yyyy-mm-dd",
61
+ TIME: "h:mm:ss",
62
+ DATE_TIME: "yyyy-mm-dd h:mm:ss",
63
+ SCIENTIFIC: "0.00E+00",
64
+ TEXT: "@",
65
+ };
66
+ const pattern = args.numberFormat.pattern || defaultPatterns[args.numberFormat.type];
67
+ await sheets.spreadsheets.batchUpdate({
68
+ spreadsheetId: args.spreadsheetId,
69
+ requestBody: {
70
+ requests: [
71
+ {
72
+ repeatCell: {
73
+ range: {
74
+ sheetId: args.sheetId,
75
+ startRowIndex: args.startRow,
76
+ endRowIndex: args.endRow,
77
+ startColumnIndex: args.startColumn,
78
+ endColumnIndex: args.endColumn,
79
+ },
80
+ cell: {
81
+ userEnteredFormat: {
82
+ numberFormat: {
83
+ type: args.numberFormat.type,
84
+ pattern: pattern,
85
+ },
86
+ },
87
+ },
88
+ fields: "userEnteredFormat.numberFormat",
89
+ },
90
+ },
91
+ ],
92
+ },
93
+ });
94
+ const rangeStr = `R${args.startRow}C${args.startColumn}:R${args.endRow - 1}C${args.endColumn - 1}`;
95
+ return {
96
+ content: [
97
+ {
98
+ type: "text",
99
+ text: `Successfully set number format to ${args.numberFormat.type} (pattern: ${pattern}) for range ${rangeStr}`,
100
+ },
101
+ ],
102
+ isError: false,
103
+ };
104
+ }
105
+ catch (error) {
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: `Error setting number format: ${error.message}`,
111
+ },
112
+ ],
113
+ isError: true,
114
+ };
115
+ }
116
+ }
@@ -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
+ }