@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.
- package/LICENSE +21 -0
- package/README.md +173 -0
- package/dist/auth.js +135 -0
- package/dist/index.js +116 -0
- package/dist/tools/basic/gsheets_add_sheet.js +65 -0
- package/dist/tools/basic/gsheets_copy_sheet.js +56 -0
- package/dist/tools/basic/gsheets_copy_to.js +113 -0
- package/dist/tools/basic/gsheets_create_spreadsheet.js +88 -0
- package/dist/tools/basic/gsheets_delete_columns.js +69 -0
- package/dist/tools/basic/gsheets_delete_rows.js +69 -0
- package/dist/tools/basic/gsheets_delete_sheet.js +56 -0
- package/dist/tools/basic/gsheets_duplicate_sheet.js +72 -0
- package/dist/tools/basic/gsheets_insert_columns.js +69 -0
- package/dist/tools/basic/gsheets_insert_rows.js +69 -0
- package/dist/tools/basic/gsheets_list_sheets.js +53 -0
- package/dist/tools/basic/gsheets_read.js +120 -0
- package/dist/tools/basic/gsheets_rename_sheet.js +64 -0
- package/dist/tools/charts/gsheets_add_bubble.js +176 -0
- package/dist/tools/charts/gsheets_add_candlestick.js +192 -0
- package/dist/tools/charts/gsheets_add_chart.js +162 -0
- package/dist/tools/charts/gsheets_add_combo.js +169 -0
- package/dist/tools/charts/gsheets_add_histogram.js +143 -0
- package/dist/tools/charts/gsheets_add_org_chart.js +160 -0
- package/dist/tools/charts/gsheets_add_treemap.js +177 -0
- package/dist/tools/charts/gsheets_add_waterfall.js +155 -0
- package/dist/tools/charts/gsheets_delete_chart.js +56 -0
- package/dist/tools/charts/gsheets_update_chart.js +118 -0
- package/dist/tools/data/gsheets_append_data.js +68 -0
- package/dist/tools/data/gsheets_batch_clear.js +53 -0
- package/dist/tools/data/gsheets_batch_update.js +81 -0
- package/dist/tools/data/gsheets_clear_data.js +53 -0
- package/dist/tools/data/gsheets_create_filter.js +81 -0
- package/dist/tools/data/gsheets_find_replace.js +124 -0
- package/dist/tools/data/gsheets_set_data_validation.js +153 -0
- package/dist/tools/data/gsheets_sort_range.js +102 -0
- package/dist/tools/data/gsheets_update_cell.js +44 -0
- package/dist/tools/formatting/gsheets_auto_resize.js +75 -0
- package/dist/tools/formatting/gsheets_format_cells.js +161 -0
- package/dist/tools/formatting/gsheets_freeze_columns.js +67 -0
- package/dist/tools/formatting/gsheets_freeze_rows.js +67 -0
- package/dist/tools/formatting/gsheets_merge_cells.js +85 -0
- package/dist/tools/formatting/gsheets_set_number_format.js +116 -0
- package/dist/tools/formatting/gsheets_unmerge_cells.js +79 -0
- package/dist/tools/formatting/gsheets_update_borders.js +212 -0
- package/dist/tools/gdrive/gdrive_read_file.js +77 -0
- package/dist/tools/gdrive/gdrive_search.js +71 -0
- package/dist/tools/gdrive_read_file.js +77 -0
- package/dist/tools/gdrive_search.js +71 -0
- package/dist/tools/gsheets_add_bubble.js +176 -0
- package/dist/tools/gsheets_add_candlestick.js +192 -0
- package/dist/tools/gsheets_add_chart.js +162 -0
- package/dist/tools/gsheets_add_combo.js +169 -0
- package/dist/tools/gsheets_add_conditional_format.js +175 -0
- package/dist/tools/gsheets_add_histogram.js +143 -0
- package/dist/tools/gsheets_add_named_range.js +87 -0
- package/dist/tools/gsheets_add_org_chart.js +160 -0
- package/dist/tools/gsheets_add_protected_range.js +127 -0
- package/dist/tools/gsheets_add_sheet.js +65 -0
- package/dist/tools/gsheets_add_treemap.js +177 -0
- package/dist/tools/gsheets_add_waterfall.js +155 -0
- package/dist/tools/gsheets_append_data.js +68 -0
- package/dist/tools/gsheets_auto_resize.js +75 -0
- package/dist/tools/gsheets_batch_clear.js +53 -0
- package/dist/tools/gsheets_batch_update.js +81 -0
- package/dist/tools/gsheets_clear_data.js +53 -0
- package/dist/tools/gsheets_copy_sheet.js +56 -0
- package/dist/tools/gsheets_copy_to.js +113 -0
- package/dist/tools/gsheets_create_filter.js +81 -0
- package/dist/tools/gsheets_create_spreadsheet.js +88 -0
- package/dist/tools/gsheets_delete_chart.js +56 -0
- package/dist/tools/gsheets_delete_columns.js +69 -0
- package/dist/tools/gsheets_delete_named_range.js +56 -0
- package/dist/tools/gsheets_delete_protected_range.js +56 -0
- package/dist/tools/gsheets_delete_rows.js +69 -0
- package/dist/tools/gsheets_delete_sheet.js +56 -0
- package/dist/tools/gsheets_duplicate_sheet.js +72 -0
- package/dist/tools/gsheets_find_replace.js +124 -0
- package/dist/tools/gsheets_format_cells.js +161 -0
- package/dist/tools/gsheets_freeze_columns.js +67 -0
- package/dist/tools/gsheets_freeze_rows.js +67 -0
- package/dist/tools/gsheets_insert_columns.js +69 -0
- package/dist/tools/gsheets_insert_rows.js +69 -0
- package/dist/tools/gsheets_list_sheets.js +53 -0
- package/dist/tools/gsheets_merge_cells.js +85 -0
- package/dist/tools/gsheets_read.js +120 -0
- package/dist/tools/gsheets_rename_sheet.js +64 -0
- package/dist/tools/gsheets_set_data_validation.js +153 -0
- package/dist/tools/gsheets_set_number_format.js +116 -0
- package/dist/tools/gsheets_sort_range.js +102 -0
- package/dist/tools/gsheets_unmerge_cells.js +79 -0
- package/dist/tools/gsheets_update_borders.js +212 -0
- package/dist/tools/gsheets_update_cell.js +44 -0
- package/dist/tools/gsheets_update_chart.js +118 -0
- package/dist/tools/gsheets_update_named_range.js +112 -0
- package/dist/tools/gsheets_update_protected_range.js +110 -0
- package/dist/tools/index.js +294 -0
- package/dist/tools/protection/gsheets_add_conditional_format.js +175 -0
- package/dist/tools/protection/gsheets_add_named_range.js +87 -0
- package/dist/tools/protection/gsheets_add_protected_range.js +127 -0
- package/dist/tools/protection/gsheets_delete_named_range.js +56 -0
- package/dist/tools/protection/gsheets_delete_protected_range.js +56 -0
- package/dist/tools/protection/gsheets_update_named_range.js +112 -0
- package/dist/tools/protection/gsheets_update_protected_range.js +110 -0
- package/dist/tools/sheets/advanced/gsheets_add_dimension_group.js +75 -0
- package/dist/tools/sheets/advanced/gsheets_add_filter_view.js +86 -0
- package/dist/tools/sheets/advanced/gsheets_add_pivot_table.js +188 -0
- package/dist/tools/sheets/advanced/gsheets_create_developer_metadata.js +121 -0
- package/dist/tools/sheets/advanced/gsheets_delete_developer_metadata.js +61 -0
- package/dist/tools/sheets/advanced/gsheets_delete_dimension_group.js +75 -0
- package/dist/tools/sheets/advanced/gsheets_update_developer_metadata.js +94 -0
- package/dist/tools/sheets/advanced/gsheets_update_dimension_group.js +83 -0
- package/dist/tools/sheets/basic/gsheets_add_sheet.js +65 -0
- package/dist/tools/sheets/basic/gsheets_copy_sheet.js +56 -0
- package/dist/tools/sheets/basic/gsheets_copy_to.js +113 -0
- package/dist/tools/sheets/basic/gsheets_create_spreadsheet.js +88 -0
- package/dist/tools/sheets/basic/gsheets_delete_columns.js +69 -0
- package/dist/tools/sheets/basic/gsheets_delete_rows.js +69 -0
- package/dist/tools/sheets/basic/gsheets_delete_sheet.js +56 -0
- package/dist/tools/sheets/basic/gsheets_duplicate_sheet.js +72 -0
- package/dist/tools/sheets/basic/gsheets_insert_columns.js +69 -0
- package/dist/tools/sheets/basic/gsheets_insert_rows.js +69 -0
- package/dist/tools/sheets/basic/gsheets_list_sheets.js +53 -0
- package/dist/tools/sheets/basic/gsheets_read.js +120 -0
- package/dist/tools/sheets/basic/gsheets_rename_sheet.js +64 -0
- package/dist/tools/sheets/charts/gsheets_add_bubble.js +176 -0
- package/dist/tools/sheets/charts/gsheets_add_candlestick.js +192 -0
- package/dist/tools/sheets/charts/gsheets_add_chart.js +162 -0
- package/dist/tools/sheets/charts/gsheets_add_combo.js +169 -0
- package/dist/tools/sheets/charts/gsheets_add_histogram.js +143 -0
- package/dist/tools/sheets/charts/gsheets_add_org_chart.js +160 -0
- package/dist/tools/sheets/charts/gsheets_add_treemap.js +177 -0
- package/dist/tools/sheets/charts/gsheets_add_waterfall.js +155 -0
- package/dist/tools/sheets/charts/gsheets_delete_chart.js +56 -0
- package/dist/tools/sheets/charts/gsheets_update_chart.js +118 -0
- package/dist/tools/sheets/data/gsheets_append_data.js +68 -0
- package/dist/tools/sheets/data/gsheets_batch_clear.js +53 -0
- package/dist/tools/sheets/data/gsheets_batch_update.js +81 -0
- package/dist/tools/sheets/data/gsheets_clear_data.js +53 -0
- package/dist/tools/sheets/data/gsheets_create_filter.js +81 -0
- package/dist/tools/sheets/data/gsheets_find_replace.js +124 -0
- package/dist/tools/sheets/data/gsheets_set_data_validation.js +153 -0
- package/dist/tools/sheets/data/gsheets_sort_range.js +102 -0
- package/dist/tools/sheets/data/gsheets_update_cell.js +44 -0
- package/dist/tools/sheets/formatting/gsheets_auto_resize.js +75 -0
- package/dist/tools/sheets/formatting/gsheets_format_cells.js +161 -0
- package/dist/tools/sheets/formatting/gsheets_freeze_columns.js +67 -0
- package/dist/tools/sheets/formatting/gsheets_freeze_rows.js +67 -0
- package/dist/tools/sheets/formatting/gsheets_merge_cells.js +85 -0
- package/dist/tools/sheets/formatting/gsheets_set_number_format.js +116 -0
- package/dist/tools/sheets/formatting/gsheets_unmerge_cells.js +79 -0
- package/dist/tools/sheets/formatting/gsheets_update_borders.js +212 -0
- package/dist/tools/sheets/protection/gsheets_add_conditional_format.js +175 -0
- package/dist/tools/sheets/protection/gsheets_add_named_range.js +87 -0
- package/dist/tools/sheets/protection/gsheets_add_protected_range.js +127 -0
- package/dist/tools/sheets/protection/gsheets_delete_named_range.js +56 -0
- package/dist/tools/sheets/protection/gsheets_delete_protected_range.js +56 -0
- package/dist/tools/sheets/protection/gsheets_update_named_range.js +112 -0
- package/dist/tools/sheets/protection/gsheets_update_protected_range.js +110 -0
- package/dist/tools/types.js +1 -0
- package/dist/vitest.config.js +18 -0
- package/package.json +57 -0
|
@@ -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,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,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
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_insert_columns",
|
|
4
|
+
description: "Insert empty columns into 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) where columns will be inserted",
|
|
19
|
+
},
|
|
20
|
+
count: {
|
|
21
|
+
type: "number",
|
|
22
|
+
description: "The number of columns to insert",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: ["spreadsheetId", "sheetId", "startIndex", "count"],
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
export async function insertColumns(args) {
|
|
29
|
+
const sheets = google.sheets("v4");
|
|
30
|
+
try {
|
|
31
|
+
await sheets.spreadsheets.batchUpdate({
|
|
32
|
+
spreadsheetId: args.spreadsheetId,
|
|
33
|
+
requestBody: {
|
|
34
|
+
requests: [
|
|
35
|
+
{
|
|
36
|
+
insertDimension: {
|
|
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 inserted ${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 inserting columns: ${error.message}`,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
isError: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_insert_rows",
|
|
4
|
+
description: "Insert empty rows into 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) where rows will be inserted",
|
|
19
|
+
},
|
|
20
|
+
count: {
|
|
21
|
+
type: "number",
|
|
22
|
+
description: "The number of rows to insert",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: ["spreadsheetId", "sheetId", "startIndex", "count"],
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
export async function insertRows(args) {
|
|
29
|
+
const sheets = google.sheets("v4");
|
|
30
|
+
try {
|
|
31
|
+
await sheets.spreadsheets.batchUpdate({
|
|
32
|
+
spreadsheetId: args.spreadsheetId,
|
|
33
|
+
requestBody: {
|
|
34
|
+
requests: [
|
|
35
|
+
{
|
|
36
|
+
insertDimension: {
|
|
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 inserted ${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 inserting rows: ${error.message}`,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
isError: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_list_sheets",
|
|
4
|
+
description: "List all sheets (tabs) within a Google Spreadsheet",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
spreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the spreadsheet",
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
required: ["spreadsheetId"],
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export async function listSheets(args) {
|
|
17
|
+
try {
|
|
18
|
+
const sheets = google.sheets("v4");
|
|
19
|
+
const response = await sheets.spreadsheets.get({
|
|
20
|
+
spreadsheetId: args.spreadsheetId,
|
|
21
|
+
fields: "sheets.properties",
|
|
22
|
+
});
|
|
23
|
+
const sheetsList = response.data.sheets?.map((sheet) => ({
|
|
24
|
+
sheetId: sheet.properties?.sheetId,
|
|
25
|
+
title: sheet.properties?.title,
|
|
26
|
+
index: sheet.properties?.index,
|
|
27
|
+
gridProperties: {
|
|
28
|
+
rowCount: sheet.properties?.gridProperties?.rowCount,
|
|
29
|
+
columnCount: sheet.properties?.gridProperties?.columnCount,
|
|
30
|
+
},
|
|
31
|
+
})) || [];
|
|
32
|
+
return {
|
|
33
|
+
content: [
|
|
34
|
+
{
|
|
35
|
+
type: "text",
|
|
36
|
+
text: JSON.stringify({ sheets: sheetsList }, null, 2),
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
isError: false,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
return {
|
|
44
|
+
content: [
|
|
45
|
+
{
|
|
46
|
+
type: "text",
|
|
47
|
+
text: `Error listing sheets: ${error.message}`,
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
isError: true,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_read",
|
|
4
|
+
description: "Read data from a Google Spreadsheet with flexible options for ranges and formatting",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
spreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the spreadsheet to read",
|
|
11
|
+
},
|
|
12
|
+
ranges: {
|
|
13
|
+
type: "array",
|
|
14
|
+
items: {
|
|
15
|
+
type: "string",
|
|
16
|
+
},
|
|
17
|
+
description: "Optional array of A1 notation ranges like ['Sheet1!A1:B10']. If not provided, reads entire sheet.",
|
|
18
|
+
},
|
|
19
|
+
sheetId: {
|
|
20
|
+
type: "number",
|
|
21
|
+
description: "Optional specific sheet ID to read. If not provided with ranges, reads first sheet.",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
required: ["spreadsheetId"],
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
const sheets = google.sheets("v4");
|
|
28
|
+
function getA1Notation(row, col) {
|
|
29
|
+
let a1 = "";
|
|
30
|
+
while (col > 0) {
|
|
31
|
+
col--;
|
|
32
|
+
a1 = String.fromCharCode(65 + (col % 26)) + a1;
|
|
33
|
+
col = Math.floor(col / 26);
|
|
34
|
+
}
|
|
35
|
+
return `${a1}${row + 1}`;
|
|
36
|
+
}
|
|
37
|
+
async function processSheetData(response) {
|
|
38
|
+
const results = [];
|
|
39
|
+
// Handle both single and multiple ranges
|
|
40
|
+
const valueRanges = response.data.valueRanges || [response.data];
|
|
41
|
+
for (const range of valueRanges) {
|
|
42
|
+
const values = range.values || [];
|
|
43
|
+
if (values.length === 0)
|
|
44
|
+
continue;
|
|
45
|
+
// Extract sheet name from range
|
|
46
|
+
const rangeParts = range.range?.split("!") || [];
|
|
47
|
+
const sheetName = rangeParts[0]?.replace(/'/g, "") || "Sheet1";
|
|
48
|
+
// Process data with cell locations
|
|
49
|
+
const processedValues = values.map((row, rowIndex) => row.map((cell, colIndex) => ({
|
|
50
|
+
value: cell,
|
|
51
|
+
location: `${sheetName}!${getA1Notation(rowIndex, colIndex + 1)}`,
|
|
52
|
+
})));
|
|
53
|
+
// Process headers with locations
|
|
54
|
+
const columnHeaders = processedValues[0];
|
|
55
|
+
const data = processedValues.slice(1);
|
|
56
|
+
results.push({
|
|
57
|
+
sheetName,
|
|
58
|
+
data,
|
|
59
|
+
totalRows: values.length,
|
|
60
|
+
totalColumns: columnHeaders.length,
|
|
61
|
+
columnHeaders,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return results;
|
|
65
|
+
}
|
|
66
|
+
export async function readSheet(args) {
|
|
67
|
+
try {
|
|
68
|
+
let response;
|
|
69
|
+
if (args.ranges) {
|
|
70
|
+
// Read specific ranges
|
|
71
|
+
response = await sheets.spreadsheets.values.batchGet({
|
|
72
|
+
spreadsheetId: args.spreadsheetId,
|
|
73
|
+
ranges: args.ranges,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else if (args.sheetId !== undefined) {
|
|
77
|
+
// Get sheet name from sheet ID first
|
|
78
|
+
const metadata = await sheets.spreadsheets.get({
|
|
79
|
+
spreadsheetId: args.spreadsheetId,
|
|
80
|
+
fields: "sheets.properties",
|
|
81
|
+
});
|
|
82
|
+
const sheet = metadata.data.sheets?.find((s) => s.properties?.sheetId === args.sheetId);
|
|
83
|
+
if (!sheet?.properties?.title) {
|
|
84
|
+
throw new Error(`Sheet ID ${args.sheetId} not found`);
|
|
85
|
+
}
|
|
86
|
+
response = await sheets.spreadsheets.values.get({
|
|
87
|
+
spreadsheetId: args.spreadsheetId,
|
|
88
|
+
range: sheet.properties.title,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Read first sheet by default
|
|
93
|
+
response = await sheets.spreadsheets.values.get({
|
|
94
|
+
spreadsheetId: args.spreadsheetId,
|
|
95
|
+
range: "A:ZZ", // Read all possible columns
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const processedData = await processSheetData(response);
|
|
99
|
+
return {
|
|
100
|
+
content: [
|
|
101
|
+
{
|
|
102
|
+
type: "text",
|
|
103
|
+
text: JSON.stringify(processedData, null, 2),
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
isError: false,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
return {
|
|
111
|
+
content: [
|
|
112
|
+
{
|
|
113
|
+
type: "text",
|
|
114
|
+
text: `Error reading spreadsheet: ${error.message}`,
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
isError: true,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|