Skip to content

Commit 222b4e6

Browse files
authored
Merge pull request #72 from a-pedraza/feat/sheet-management
feat: add deleteSheet and renameSheet tools
2 parents 1284e83 + b6063dc commit 222b4e6

File tree

3 files changed

+120
-0
lines changed

3 files changed

+120
-0
lines changed

src/tools/sheets/deleteSheet.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import type { FastMCP } from 'fastmcp';
2+
import { UserError } from 'fastmcp';
3+
import { z } from 'zod';
4+
import { getSheetsClient } from '../../clients.js';
5+
6+
export function register(server: FastMCP) {
7+
server.addTool({
8+
name: 'deleteSheet',
9+
description:
10+
'Deletes a sheet (tab) from a spreadsheet. Use getSpreadsheetInfo to find the numeric sheet ID.',
11+
parameters: z.object({
12+
spreadsheetId: z
13+
.string()
14+
.describe(
15+
'The spreadsheet ID — the long string between /d/ and /edit in a Google Sheets URL.'
16+
),
17+
sheetId: z
18+
.number()
19+
.int()
20+
.describe(
21+
'The numeric sheet ID to delete. Use getSpreadsheetInfo to find sheet IDs.'
22+
),
23+
}),
24+
execute: async (args, { log }) => {
25+
const sheets = await getSheetsClient();
26+
log.info(
27+
`Deleting sheet ID ${args.sheetId} from spreadsheet ${args.spreadsheetId}`
28+
);
29+
30+
try {
31+
await sheets.spreadsheets.batchUpdate({
32+
spreadsheetId: args.spreadsheetId,
33+
requestBody: {
34+
requests: [
35+
{
36+
deleteSheet: {
37+
sheetId: args.sheetId,
38+
},
39+
},
40+
],
41+
},
42+
});
43+
44+
return `Successfully deleted sheet (ID: ${args.sheetId}) from spreadsheet.`;
45+
} catch (error: any) {
46+
log.error(
47+
`Error deleting sheet in spreadsheet ${args.spreadsheetId}: ${error.message || error}`
48+
);
49+
if (error instanceof UserError) throw error;
50+
throw new UserError(`Failed to delete sheet: ${error.message || 'Unknown error'}`);
51+
}
52+
},
53+
});
54+
}

src/tools/sheets/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { register as getSpreadsheetInfo } from './getSpreadsheetInfo.js';
88
import { register as addSpreadsheetSheet } from './addSpreadsheetSheet.js';
99
import { register as createSpreadsheet } from './createSpreadsheet.js';
1010
import { register as listGoogleSheets } from './listGoogleSheets.js';
11+
import { register as deleteSheet } from './deleteSheet.js';
12+
import { register as renameSheet } from './renameSheet.js';
1113
import { register as duplicateSheet } from './duplicateSheet.js';
1214

1315
// Formatting & validation
@@ -27,6 +29,8 @@ export function registerSheetsTools(server: FastMCP) {
2729
addSpreadsheetSheet(server);
2830
createSpreadsheet(server);
2931
listGoogleSheets(server);
32+
deleteSheet(server);
33+
renameSheet(server);
3034
duplicateSheet(server);
3135

3236
// Formatting & validation

src/tools/sheets/renameSheet.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import type { FastMCP } from 'fastmcp';
2+
import { UserError } from 'fastmcp';
3+
import { z } from 'zod';
4+
import { getSheetsClient } from '../../clients.js';
5+
6+
export function register(server: FastMCP) {
7+
server.addTool({
8+
name: 'renameSheet',
9+
description:
10+
'Renames a sheet (tab) in a spreadsheet. Use getSpreadsheetInfo to find the numeric sheet ID.',
11+
parameters: z.object({
12+
spreadsheetId: z
13+
.string()
14+
.describe(
15+
'The spreadsheet ID — the long string between /d/ and /edit in a Google Sheets URL.'
16+
),
17+
sheetId: z
18+
.number()
19+
.int()
20+
.describe(
21+
'The numeric sheet ID to rename. Use getSpreadsheetInfo to find sheet IDs.'
22+
),
23+
newName: z
24+
.string()
25+
.min(1)
26+
.describe('The new name for the sheet.'),
27+
}),
28+
execute: async (args, { log }) => {
29+
const sheets = await getSheetsClient();
30+
log.info(
31+
`Renaming sheet ID ${args.sheetId} to "${args.newName}" in spreadsheet ${args.spreadsheetId}`
32+
);
33+
34+
try {
35+
await sheets.spreadsheets.batchUpdate({
36+
spreadsheetId: args.spreadsheetId,
37+
requestBody: {
38+
requests: [
39+
{
40+
updateSheetProperties: {
41+
properties: {
42+
sheetId: args.sheetId,
43+
title: args.newName,
44+
},
45+
fields: 'title',
46+
},
47+
},
48+
],
49+
},
50+
});
51+
52+
return `Successfully renamed sheet (ID: ${args.sheetId}) to "${args.newName}".`;
53+
} catch (error: any) {
54+
log.error(
55+
`Error renaming sheet in spreadsheet ${args.spreadsheetId}: ${error.message || error}`
56+
);
57+
if (error instanceof UserError) throw error;
58+
throw new UserError(`Failed to rename sheet: ${error.message || 'Unknown error'}`);
59+
}
60+
},
61+
});
62+
}

0 commit comments

Comments
 (0)