@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,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
+ }
@@ -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
+ }
@@ -0,0 +1,75 @@
1
+ import { google } from 'googleapis';
2
+ export const schema = {
3
+ name: "gsheets_add_dimension_group",
4
+ description: "Add a dimension group (row or column group) to a Google Sheet. Allows creating collapsible groups of rows or columns.",
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
+ dimension: {
17
+ type: "string",
18
+ enum: ["ROWS", "COLUMNS"],
19
+ description: "The dimension to group (ROWS or COLUMNS)"
20
+ },
21
+ startIndex: {
22
+ type: "number",
23
+ description: "The start index of the dimension group (inclusive)"
24
+ },
25
+ endIndex: {
26
+ type: "number",
27
+ description: "The end index of the dimension group (exclusive)"
28
+ }
29
+ },
30
+ required: ["spreadsheetId", "sheetId", "dimension", "startIndex", "endIndex"]
31
+ }
32
+ };
33
+ export async function addDimensionGroup(args) {
34
+ try {
35
+ const sheets = google.sheets("v4");
36
+ await sheets.spreadsheets.batchUpdate({
37
+ spreadsheetId: args.spreadsheetId,
38
+ requestBody: {
39
+ requests: [
40
+ {
41
+ addDimensionGroup: {
42
+ range: {
43
+ sheetId: args.sheetId,
44
+ dimension: args.dimension,
45
+ startIndex: args.startIndex,
46
+ endIndex: args.endIndex,
47
+ },
48
+ },
49
+ },
50
+ ],
51
+ },
52
+ });
53
+ return {
54
+ content: [
55
+ {
56
+ type: "text",
57
+ text: `Successfully added ${args.dimension.toLowerCase()} group from index ${args.startIndex} to ${args.endIndex} on sheet ${args.sheetId}.`,
58
+ },
59
+ ],
60
+ isError: false,
61
+ };
62
+ }
63
+ catch (error) {
64
+ const errorMessage = error instanceof Error ? error.message : String(error);
65
+ return {
66
+ content: [
67
+ {
68
+ type: "text",
69
+ text: `Error adding dimension group: ${errorMessage}`,
70
+ },
71
+ ],
72
+ isError: true,
73
+ };
74
+ }
75
+ }
@@ -0,0 +1,86 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_add_filter_view",
4
+ description: "Create a filter view in 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",
15
+ },
16
+ title: {
17
+ type: "string",
18
+ description: "Title of the filter view",
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", "sheetId", "title", "startRow", "endRow", "startColumn", "endColumn"],
38
+ },
39
+ };
40
+ export async function addFilterView(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
+ addFilterView: {
49
+ filter: {
50
+ title: args.title,
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 filterViewId = response.data.replies?.[0]?.addFilterView?.filter?.filterViewId;
65
+ return {
66
+ content: [
67
+ {
68
+ type: "text",
69
+ text: `Successfully created filter view "${args.title}". Filter View ID: ${filterViewId}`,
70
+ },
71
+ ],
72
+ isError: false,
73
+ };
74
+ }
75
+ catch (error) {
76
+ return {
77
+ content: [
78
+ {
79
+ type: "text",
80
+ text: `Error creating filter view: ${error.message}`,
81
+ },
82
+ ],
83
+ isError: true,
84
+ };
85
+ }
86
+ }
@@ -0,0 +1,188 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_add_pivot_table",
4
+ description: "Create a pivot table in a spreadsheet",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ spreadsheetId: {
9
+ type: "string",
10
+ description: "The ID of the spreadsheet",
11
+ },
12
+ sourceSheetId: {
13
+ type: "number",
14
+ description: "The sheet ID containing source data",
15
+ },
16
+ sourceStartRow: {
17
+ type: "number",
18
+ description: "Starting row of source data (0-based)",
19
+ },
20
+ sourceEndRow: {
21
+ type: "number",
22
+ description: "Ending row of source data (exclusive, 0-based)",
23
+ },
24
+ sourceStartColumn: {
25
+ type: "number",
26
+ description: "Starting column of source data (0-based)",
27
+ },
28
+ sourceEndColumn: {
29
+ type: "number",
30
+ description: "Ending column of source data (exclusive, 0-based)",
31
+ },
32
+ targetSheetId: {
33
+ type: "number",
34
+ description: "The sheet ID where pivot table will be placed",
35
+ },
36
+ targetRow: {
37
+ type: "number",
38
+ description: "Row position for pivot table (0-based)",
39
+ },
40
+ targetColumn: {
41
+ type: "number",
42
+ description: "Column position for pivot table (0-based)",
43
+ },
44
+ rows: {
45
+ type: "array",
46
+ items: {
47
+ type: "object",
48
+ properties: {
49
+ sourceColumnOffset: {
50
+ type: "number",
51
+ description: "Column offset in source data (0-based)",
52
+ },
53
+ sortOrder: {
54
+ type: "string",
55
+ enum: ["ASCENDING", "DESCENDING"],
56
+ description: "Sort order for this row group",
57
+ },
58
+ showTotals: {
59
+ type: "boolean",
60
+ description: "Show totals for this row group",
61
+ },
62
+ },
63
+ required: ["sourceColumnOffset"],
64
+ },
65
+ description: "Row groups for pivot table",
66
+ },
67
+ columns: {
68
+ type: "array",
69
+ items: {
70
+ type: "object",
71
+ properties: {
72
+ sourceColumnOffset: {
73
+ type: "number",
74
+ description: "Column offset in source data (0-based)",
75
+ },
76
+ sortOrder: {
77
+ type: "string",
78
+ enum: ["ASCENDING", "DESCENDING"],
79
+ description: "Sort order for this column group",
80
+ },
81
+ showTotals: {
82
+ type: "boolean",
83
+ description: "Show totals for this column group",
84
+ },
85
+ },
86
+ required: ["sourceColumnOffset"],
87
+ },
88
+ description: "Column groups for pivot table (optional)",
89
+ },
90
+ values: {
91
+ type: "array",
92
+ items: {
93
+ type: "object",
94
+ properties: {
95
+ sourceColumnOffset: {
96
+ type: "number",
97
+ description: "Column offset in source data (0-based)",
98
+ },
99
+ summarizeFunction: {
100
+ type: "string",
101
+ enum: ["SUM", "COUNT", "AVERAGE", "MAX", "MIN", "MEDIAN", "PRODUCT", "STDEV", "STDEVP", "VAR", "VARP"],
102
+ description: "Function to aggregate values",
103
+ },
104
+ },
105
+ required: ["sourceColumnOffset", "summarizeFunction"],
106
+ },
107
+ description: "Values to aggregate in pivot table",
108
+ },
109
+ },
110
+ required: ["spreadsheetId", "sourceSheetId", "sourceStartRow", "sourceEndRow", "sourceStartColumn", "sourceEndColumn", "targetSheetId", "targetRow", "targetColumn", "rows", "values"],
111
+ },
112
+ };
113
+ export async function addPivotTable(args) {
114
+ try {
115
+ const sheets = google.sheets("v4");
116
+ const pivotTable = {
117
+ source: {
118
+ sheetId: args.sourceSheetId,
119
+ startRowIndex: args.sourceStartRow,
120
+ endRowIndex: args.sourceEndRow,
121
+ startColumnIndex: args.sourceStartColumn,
122
+ endColumnIndex: args.sourceEndColumn,
123
+ },
124
+ rows: args.rows.map((row) => ({
125
+ sourceColumnOffset: row.sourceColumnOffset,
126
+ showTotals: row.showTotals !== false,
127
+ sortOrder: row.sortOrder || "ASCENDING",
128
+ })),
129
+ values: args.values.map((value) => ({
130
+ sourceColumnOffset: value.sourceColumnOffset,
131
+ summarizeFunction: value.summarizeFunction,
132
+ })),
133
+ };
134
+ if (args.columns && args.columns.length > 0) {
135
+ pivotTable.columns = args.columns.map((column) => ({
136
+ sourceColumnOffset: column.sourceColumnOffset,
137
+ showTotals: column.showTotals !== false,
138
+ sortOrder: column.sortOrder || "ASCENDING",
139
+ }));
140
+ }
141
+ await sheets.spreadsheets.batchUpdate({
142
+ spreadsheetId: args.spreadsheetId,
143
+ requestBody: {
144
+ requests: [
145
+ {
146
+ updateCells: {
147
+ rows: [
148
+ {
149
+ values: [
150
+ {
151
+ pivotTable,
152
+ },
153
+ ],
154
+ },
155
+ ],
156
+ fields: "pivotTable",
157
+ start: {
158
+ sheetId: args.targetSheetId,
159
+ rowIndex: args.targetRow,
160
+ columnIndex: args.targetColumn,
161
+ },
162
+ },
163
+ },
164
+ ],
165
+ },
166
+ });
167
+ return {
168
+ content: [
169
+ {
170
+ type: "text",
171
+ text: `Successfully created pivot table at sheet ${args.targetSheetId}, position R${args.targetRow}C${args.targetColumn}`,
172
+ },
173
+ ],
174
+ isError: false,
175
+ };
176
+ }
177
+ catch (error) {
178
+ return {
179
+ content: [
180
+ {
181
+ type: "text",
182
+ text: `Error creating pivot table: ${error.message}`,
183
+ },
184
+ ],
185
+ isError: true,
186
+ };
187
+ }
188
+ }