@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,175 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_add_conditional_format",
4
+ description: "Add conditional formatting rules to cells",
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
+ rule: {
33
+ type: "object",
34
+ properties: {
35
+ type: {
36
+ type: "string",
37
+ enum: ["NUMBER_GREATER", "NUMBER_LESS", "NUMBER_BETWEEN", "TEXT_CONTAINS", "TEXT_NOT_CONTAINS", "CUSTOM_FORMULA"],
38
+ description: "The condition type",
39
+ },
40
+ value: {
41
+ type: "string",
42
+ description: "Value for comparison (for single value conditions)",
43
+ },
44
+ minValue: {
45
+ type: "string",
46
+ description: "Minimum value (for BETWEEN conditions)",
47
+ },
48
+ maxValue: {
49
+ type: "string",
50
+ description: "Maximum value (for BETWEEN conditions)",
51
+ },
52
+ formula: {
53
+ type: "string",
54
+ description: "Custom formula (for CUSTOM_FORMULA)",
55
+ },
56
+ backgroundColor: {
57
+ type: "object",
58
+ properties: {
59
+ red: { type: "number", minimum: 0, maximum: 1 },
60
+ green: { type: "number", minimum: 0, maximum: 1 },
61
+ blue: { type: "number", minimum: 0, maximum: 1 },
62
+ },
63
+ description: "Background color to apply when condition is true",
64
+ },
65
+ textColor: {
66
+ type: "object",
67
+ properties: {
68
+ red: { type: "number", minimum: 0, maximum: 1 },
69
+ green: { type: "number", minimum: 0, maximum: 1 },
70
+ blue: { type: "number", minimum: 0, maximum: 1 },
71
+ },
72
+ description: "Text color to apply when condition is true",
73
+ },
74
+ bold: {
75
+ type: "boolean",
76
+ description: "Make text bold when condition is true",
77
+ },
78
+ italic: {
79
+ type: "boolean",
80
+ description: "Make text italic when condition is true",
81
+ },
82
+ },
83
+ required: ["type"],
84
+ description: "Conditional formatting rule",
85
+ },
86
+ },
87
+ required: ["spreadsheetId", "sheetId", "startRow", "endRow", "startColumn", "endColumn", "rule"],
88
+ },
89
+ };
90
+ export async function addConditionalFormat(args) {
91
+ try {
92
+ const sheets = google.sheets("v4");
93
+ const booleanCondition = {
94
+ type: args.rule.type,
95
+ };
96
+ // Set condition values based on type
97
+ if (args.rule.type === "NUMBER_BETWEEN") {
98
+ booleanCondition.values = [
99
+ { userEnteredValue: args.rule.minValue },
100
+ { userEnteredValue: args.rule.maxValue },
101
+ ];
102
+ }
103
+ else if (args.rule.type === "CUSTOM_FORMULA") {
104
+ booleanCondition.values = [{ userEnteredValue: args.rule.formula }];
105
+ }
106
+ else if (args.rule.value) {
107
+ booleanCondition.values = [{ userEnteredValue: args.rule.value }];
108
+ }
109
+ // Build format to apply
110
+ const format = {};
111
+ if (args.rule.backgroundColor) {
112
+ format.backgroundColor = args.rule.backgroundColor;
113
+ }
114
+ if (args.rule.textColor || args.rule.bold || args.rule.italic) {
115
+ format.textFormat = {};
116
+ if (args.rule.textColor) {
117
+ format.textFormat.foregroundColor = args.rule.textColor;
118
+ }
119
+ if (args.rule.bold !== undefined) {
120
+ format.textFormat.bold = args.rule.bold;
121
+ }
122
+ if (args.rule.italic !== undefined) {
123
+ format.textFormat.italic = args.rule.italic;
124
+ }
125
+ }
126
+ await sheets.spreadsheets.batchUpdate({
127
+ spreadsheetId: args.spreadsheetId,
128
+ requestBody: {
129
+ requests: [
130
+ {
131
+ addConditionalFormatRule: {
132
+ rule: {
133
+ ranges: [
134
+ {
135
+ sheetId: args.sheetId,
136
+ startRowIndex: args.startRow,
137
+ endRowIndex: args.endRow,
138
+ startColumnIndex: args.startColumn,
139
+ endColumnIndex: args.endColumn,
140
+ },
141
+ ],
142
+ booleanRule: {
143
+ condition: booleanCondition,
144
+ format,
145
+ },
146
+ },
147
+ index: 0,
148
+ },
149
+ },
150
+ ],
151
+ },
152
+ });
153
+ const rangeStr = `R${args.startRow}C${args.startColumn}:R${args.endRow - 1}C${args.endColumn - 1}`;
154
+ return {
155
+ content: [
156
+ {
157
+ type: "text",
158
+ text: `Successfully added conditional formatting rule (${args.rule.type}) for range ${rangeStr}`,
159
+ },
160
+ ],
161
+ isError: false,
162
+ };
163
+ }
164
+ catch (error) {
165
+ return {
166
+ content: [
167
+ {
168
+ type: "text",
169
+ text: `Error adding conditional format: ${error.message}`,
170
+ },
171
+ ],
172
+ isError: true,
173
+ };
174
+ }
175
+ }
@@ -0,0 +1,87 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_add_named_range",
4
+ description: "Create a named range in a spreadsheet",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ spreadsheetId: {
9
+ type: "string",
10
+ description: "The ID of the spreadsheet",
11
+ },
12
+ name: {
13
+ type: "string",
14
+ description: "The name for the range",
15
+ },
16
+ sheetId: {
17
+ type: "number",
18
+ description: "The ID of the sheet",
19
+ },
20
+ startRow: {
21
+ type: "number",
22
+ description: "Starting row index (0-based)",
23
+ },
24
+ endRow: {
25
+ type: "number",
26
+ description: "Ending row index (exclusive, 0-based)",
27
+ },
28
+ startColumn: {
29
+ type: "number",
30
+ description: "Starting column index (0-based)",
31
+ },
32
+ endColumn: {
33
+ type: "number",
34
+ description: "Ending column index (exclusive, 0-based)",
35
+ },
36
+ },
37
+ required: ["spreadsheetId", "name", "sheetId", "startRow", "endRow", "startColumn", "endColumn"],
38
+ },
39
+ };
40
+ export async function addNamedRange(args) {
41
+ try {
42
+ const sheets = google.sheets("v4");
43
+ const response = await sheets.spreadsheets.batchUpdate({
44
+ spreadsheetId: args.spreadsheetId,
45
+ requestBody: {
46
+ requests: [
47
+ {
48
+ addNamedRange: {
49
+ namedRange: {
50
+ name: args.name,
51
+ range: {
52
+ sheetId: args.sheetId,
53
+ startRowIndex: args.startRow,
54
+ endRowIndex: args.endRow,
55
+ startColumnIndex: args.startColumn,
56
+ endColumnIndex: args.endColumn,
57
+ },
58
+ },
59
+ },
60
+ },
61
+ ],
62
+ },
63
+ });
64
+ const namedRangeId = response.data.replies?.[0]?.addNamedRange?.namedRange?.namedRangeId;
65
+ const rangeStr = `R${args.startRow}C${args.startColumn}:R${args.endRow - 1}C${args.endColumn - 1}`;
66
+ return {
67
+ content: [
68
+ {
69
+ type: "text",
70
+ text: `Successfully created named range "${args.name}" for ${rangeStr}. Named Range ID: ${namedRangeId}`,
71
+ },
72
+ ],
73
+ isError: false,
74
+ };
75
+ }
76
+ catch (error) {
77
+ return {
78
+ content: [
79
+ {
80
+ type: "text",
81
+ text: `Error creating named range: ${error.message}`,
82
+ },
83
+ ],
84
+ isError: true,
85
+ };
86
+ }
87
+ }
@@ -0,0 +1,127 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_add_protected_range",
4
+ description: "Add protection to a range to restrict editing",
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
+ description: {
33
+ type: "string",
34
+ description: "Description of the protected range (optional)",
35
+ },
36
+ warningOnly: {
37
+ type: "boolean",
38
+ description: "If true, show a warning instead of preventing edits (default: false)",
39
+ },
40
+ editors: {
41
+ type: "object",
42
+ properties: {
43
+ users: {
44
+ type: "array",
45
+ items: { type: "string" },
46
+ description: "Email addresses of users who can edit",
47
+ },
48
+ groups: {
49
+ type: "array",
50
+ items: { type: "string" },
51
+ description: "Email addresses of groups who can edit",
52
+ },
53
+ domainUsersCanEdit: {
54
+ type: "boolean",
55
+ description: "Whether all users in the domain can edit",
56
+ },
57
+ },
58
+ description: "Who can edit the protected range",
59
+ },
60
+ },
61
+ required: ["spreadsheetId", "sheetId", "startRow", "endRow", "startColumn", "endColumn"],
62
+ },
63
+ };
64
+ export async function addProtectedRange(args) {
65
+ try {
66
+ const sheets = google.sheets("v4");
67
+ const protectedRange = {
68
+ range: {
69
+ sheetId: args.sheetId,
70
+ startRowIndex: args.startRow,
71
+ endRowIndex: args.endRow,
72
+ startColumnIndex: args.startColumn,
73
+ endColumnIndex: args.endColumn,
74
+ },
75
+ warningOnly: args.warningOnly || false,
76
+ };
77
+ if (args.description) {
78
+ protectedRange.description = args.description;
79
+ }
80
+ if (args.editors) {
81
+ protectedRange.editors = {};
82
+ if (args.editors.users && args.editors.users.length > 0) {
83
+ protectedRange.editors.users = args.editors.users;
84
+ }
85
+ if (args.editors.groups && args.editors.groups.length > 0) {
86
+ protectedRange.editors.groups = args.editors.groups;
87
+ }
88
+ if (args.editors.domainUsersCanEdit !== undefined) {
89
+ protectedRange.editors.domainUsersCanEdit = args.editors.domainUsersCanEdit;
90
+ }
91
+ }
92
+ const response = await sheets.spreadsheets.batchUpdate({
93
+ spreadsheetId: args.spreadsheetId,
94
+ requestBody: {
95
+ requests: [
96
+ {
97
+ addProtectedRange: {
98
+ protectedRange,
99
+ },
100
+ },
101
+ ],
102
+ },
103
+ });
104
+ const addedProtection = response.data.replies?.[0]?.addProtectedRange?.protectedRange;
105
+ const rangeStr = `R${args.startRow}C${args.startColumn}:R${args.endRow - 1}C${args.endColumn - 1}`;
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: `Successfully added protection to range ${rangeStr}. Protection ID: ${addedProtection?.protectedRangeId}`,
111
+ },
112
+ ],
113
+ isError: false,
114
+ };
115
+ }
116
+ catch (error) {
117
+ return {
118
+ content: [
119
+ {
120
+ type: "text",
121
+ text: `Error adding protected range: ${error.message}`,
122
+ },
123
+ ],
124
+ isError: true,
125
+ };
126
+ }
127
+ }
@@ -0,0 +1,56 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_delete_named_range",
4
+ description: "Delete a named range from a spreadsheet",
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 delete",
15
+ },
16
+ },
17
+ required: ["spreadsheetId", "namedRangeId"],
18
+ },
19
+ };
20
+ export async function deleteNamedRange(args) {
21
+ try {
22
+ const sheets = google.sheets("v4");
23
+ await sheets.spreadsheets.batchUpdate({
24
+ spreadsheetId: args.spreadsheetId,
25
+ requestBody: {
26
+ requests: [
27
+ {
28
+ deleteNamedRange: {
29
+ namedRangeId: args.namedRangeId,
30
+ },
31
+ },
32
+ ],
33
+ },
34
+ });
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: `Successfully deleted named range ${args.namedRangeId}`,
40
+ },
41
+ ],
42
+ isError: false,
43
+ };
44
+ }
45
+ catch (error) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: `Error deleting named range: ${error.message}`,
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ }
@@ -0,0 +1,56 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_delete_protected_range",
4
+ description: "Remove protection from 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 delete",
15
+ },
16
+ },
17
+ required: ["spreadsheetId", "protectedRangeId"],
18
+ },
19
+ };
20
+ export async function deleteProtectedRange(args) {
21
+ try {
22
+ const sheets = google.sheets("v4");
23
+ await sheets.spreadsheets.batchUpdate({
24
+ spreadsheetId: args.spreadsheetId,
25
+ requestBody: {
26
+ requests: [
27
+ {
28
+ deleteProtectedRange: {
29
+ protectedRangeId: args.protectedRangeId,
30
+ },
31
+ },
32
+ ],
33
+ },
34
+ });
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: `Successfully deleted protected range ${args.protectedRangeId}`,
40
+ },
41
+ ],
42
+ isError: false,
43
+ };
44
+ }
45
+ catch (error) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: `Error deleting protected range: ${error.message}`,
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ }
@@ -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
+ }