@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,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
+ }
@@ -0,0 +1,88 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_create_spreadsheet",
4
+ description: "Create a new Google Spreadsheet",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ title: {
9
+ type: "string",
10
+ description: "The title of the new spreadsheet",
11
+ },
12
+ sheets: {
13
+ type: "array",
14
+ items: {
15
+ type: "object",
16
+ properties: {
17
+ title: {
18
+ type: "string",
19
+ description: "Sheet title",
20
+ },
21
+ rowCount: {
22
+ type: "number",
23
+ description: "Number of rows (default: 1000)",
24
+ },
25
+ columnCount: {
26
+ type: "number",
27
+ description: "Number of columns (default: 26)",
28
+ },
29
+ },
30
+ required: ["title"],
31
+ },
32
+ description: "Initial sheets to create (optional)",
33
+ },
34
+ },
35
+ required: ["title"],
36
+ },
37
+ };
38
+ export async function createSpreadsheet(args) {
39
+ try {
40
+ const sheets = google.sheets("v4");
41
+ const requestBody = {
42
+ properties: {
43
+ title: args.title,
44
+ },
45
+ };
46
+ if (args.sheets && args.sheets.length > 0) {
47
+ requestBody.sheets = args.sheets.map((sheet) => ({
48
+ properties: {
49
+ title: sheet.title,
50
+ gridProperties: {
51
+ rowCount: sheet.rowCount || 1000,
52
+ columnCount: sheet.columnCount || 26,
53
+ },
54
+ },
55
+ }));
56
+ }
57
+ const response = await sheets.spreadsheets.create({
58
+ requestBody,
59
+ });
60
+ const spreadsheetId = response.data.spreadsheetId;
61
+ const spreadsheetUrl = response.data.spreadsheetUrl;
62
+ return {
63
+ content: [
64
+ {
65
+ type: "text",
66
+ text: JSON.stringify({
67
+ spreadsheetId,
68
+ spreadsheetUrl,
69
+ title: args.title,
70
+ sheetsCount: response.data.sheets?.length || 0,
71
+ }, null, 2),
72
+ },
73
+ ],
74
+ isError: false,
75
+ };
76
+ }
77
+ catch (error) {
78
+ return {
79
+ content: [
80
+ {
81
+ type: "text",
82
+ text: `Error creating spreadsheet: ${error.message}`,
83
+ },
84
+ ],
85
+ isError: true,
86
+ };
87
+ }
88
+ }
@@ -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,69 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_delete_columns",
4
+ description: "Delete columns from 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
+ startIndex: {
17
+ type: "number",
18
+ description: "The starting column index (0-based) to delete",
19
+ },
20
+ count: {
21
+ type: "number",
22
+ description: "The number of columns to delete",
23
+ },
24
+ },
25
+ required: ["spreadsheetId", "sheetId", "startIndex", "count"],
26
+ },
27
+ };
28
+ export async function deleteColumns(args) {
29
+ try {
30
+ const sheets = google.sheets("v4");
31
+ await sheets.spreadsheets.batchUpdate({
32
+ spreadsheetId: args.spreadsheetId,
33
+ requestBody: {
34
+ requests: [
35
+ {
36
+ deleteDimension: {
37
+ range: {
38
+ sheetId: args.sheetId,
39
+ dimension: "COLUMNS",
40
+ startIndex: args.startIndex,
41
+ endIndex: args.startIndex + args.count,
42
+ },
43
+ },
44
+ },
45
+ ],
46
+ },
47
+ });
48
+ return {
49
+ content: [
50
+ {
51
+ type: "text",
52
+ text: `Successfully deleted ${args.count} column(s) starting at index ${args.startIndex}`,
53
+ },
54
+ ],
55
+ isError: false,
56
+ };
57
+ }
58
+ catch (error) {
59
+ return {
60
+ content: [
61
+ {
62
+ type: "text",
63
+ text: `Error deleting columns: ${error.message}`,
64
+ },
65
+ ],
66
+ isError: true,
67
+ };
68
+ }
69
+ }
@@ -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,69 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_delete_rows",
4
+ description: "Delete rows from 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
+ startIndex: {
17
+ type: "number",
18
+ description: "The starting row index (0-based) to delete",
19
+ },
20
+ count: {
21
+ type: "number",
22
+ description: "The number of rows to delete",
23
+ },
24
+ },
25
+ required: ["spreadsheetId", "sheetId", "startIndex", "count"],
26
+ },
27
+ };
28
+ export async function deleteRows(args) {
29
+ const sheets = google.sheets("v4");
30
+ try {
31
+ await sheets.spreadsheets.batchUpdate({
32
+ spreadsheetId: args.spreadsheetId,
33
+ requestBody: {
34
+ requests: [
35
+ {
36
+ deleteDimension: {
37
+ range: {
38
+ sheetId: args.sheetId,
39
+ dimension: "ROWS",
40
+ startIndex: args.startIndex,
41
+ endIndex: args.startIndex + args.count,
42
+ },
43
+ },
44
+ },
45
+ ],
46
+ },
47
+ });
48
+ return {
49
+ content: [
50
+ {
51
+ type: "text",
52
+ text: `Successfully deleted ${args.count} row(s) starting at index ${args.startIndex}`,
53
+ },
54
+ ],
55
+ isError: false,
56
+ };
57
+ }
58
+ catch (error) {
59
+ return {
60
+ content: [
61
+ {
62
+ type: "text",
63
+ text: `Error deleting rows: ${error.message}`,
64
+ },
65
+ ],
66
+ isError: true,
67
+ };
68
+ }
69
+ }
@@ -0,0 +1,56 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_delete_sheet",
4
+ description: "Delete a sheet (tab) from 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 to delete",
15
+ },
16
+ },
17
+ required: ["spreadsheetId", "sheetId"],
18
+ },
19
+ };
20
+ export async function deleteSheet(args) {
21
+ const sheets = google.sheets("v4");
22
+ try {
23
+ await sheets.spreadsheets.batchUpdate({
24
+ spreadsheetId: args.spreadsheetId,
25
+ requestBody: {
26
+ requests: [
27
+ {
28
+ deleteSheet: {
29
+ sheetId: args.sheetId,
30
+ },
31
+ },
32
+ ],
33
+ },
34
+ });
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: `Successfully deleted sheet with ID ${args.sheetId}`,
40
+ },
41
+ ],
42
+ isError: false,
43
+ };
44
+ }
45
+ catch (error) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: `Error deleting sheet: ${error.message}`,
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ }
@@ -0,0 +1,72 @@
1
+ import { google } from "googleapis";
2
+ export const schema = {
3
+ name: "gsheets_duplicate_sheet",
4
+ description: "Duplicate a sheet within the same 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 ID of the sheet to duplicate",
15
+ },
16
+ newSheetName: {
17
+ type: "string",
18
+ description: "The name for the duplicated sheet (optional)",
19
+ },
20
+ insertSheetIndex: {
21
+ type: "number",
22
+ description: "The index where the new sheet should be inserted (optional)",
23
+ },
24
+ },
25
+ required: ["spreadsheetId", "sourceSheetId"],
26
+ },
27
+ };
28
+ export async function duplicateSheet(args) {
29
+ try {
30
+ const sheets = google.sheets("v4");
31
+ const duplicateRequest = {
32
+ sourceSheetId: args.sourceSheetId,
33
+ };
34
+ if (args.insertSheetIndex !== undefined) {
35
+ duplicateRequest.insertSheetIndex = args.insertSheetIndex;
36
+ }
37
+ if (args.newSheetName !== undefined) {
38
+ duplicateRequest.newSheetName = args.newSheetName;
39
+ }
40
+ const response = await sheets.spreadsheets.batchUpdate({
41
+ spreadsheetId: args.spreadsheetId,
42
+ requestBody: {
43
+ requests: [
44
+ {
45
+ duplicateSheet: duplicateRequest,
46
+ },
47
+ ],
48
+ },
49
+ });
50
+ const duplicatedSheet = response.data.replies?.[0]?.duplicateSheet?.properties;
51
+ return {
52
+ content: [
53
+ {
54
+ type: "text",
55
+ text: `Successfully duplicated sheet. New sheet ID: ${duplicatedSheet?.sheetId}, Title: ${duplicatedSheet?.title}`,
56
+ },
57
+ ],
58
+ isError: false,
59
+ };
60
+ }
61
+ catch (error) {
62
+ return {
63
+ content: [
64
+ {
65
+ type: "text",
66
+ text: `Error duplicating sheet: ${error.message}`,
67
+ },
68
+ ],
69
+ isError: true,
70
+ };
71
+ }
72
+ }