Google Sheets MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_spreadsheetA | Create a new Google Spreadsheet. Args: title: The title for the new spreadsheet. sheet_names: Comma-separated list of sheet names (optional). Returns: JSON with spreadsheet_id, title, url, and sheets. |
| get_spreadsheet_infoA | Get information about a spreadsheet including all sheets. Args: spreadsheet_id: The ID of the spreadsheet (from URL). Returns: JSON with spreadsheet metadata, sheets list, and URL. |
| list_sheetsA | List all sheets/tabs in a spreadsheet. Args: spreadsheet_id: The ID of the spreadsheet. Returns: JSON list of sheets with their IDs, titles, and dimensions. |
| create_sheetA | Create a new sheet/tab in a spreadsheet. Args: spreadsheet_id: The ID of the spreadsheet. title: Name for the new sheet. index: Position for the new sheet (-1 for end). Returns: JSON with new sheet's ID, title, and index. |
| delete_sheetA | Delete a sheet from a spreadsheet. Args: spreadsheet_id: The ID of the spreadsheet. sheet_id: The numeric ID of the sheet (from list_sheets). Returns: Success message. |
| rename_sheetA | Rename a sheet. Args: spreadsheet_id: The ID of the spreadsheet. sheet_id: The numeric ID of the sheet. new_title: New name for the sheet. Returns: Success message. |
| duplicate_sheetA | Duplicate/copy a sheet within the same spreadsheet. Args: spreadsheet_id: The ID of the spreadsheet. sheet_id: The numeric ID of the sheet to duplicate. new_title: Name for the duplicated sheet. insert_index: Position for the copy (-1 for end). Returns: JSON with new sheet's ID, title, and index. |
| read_cellsA | Read cell values from a spreadsheet range. Examples: - read_cells("abc123", "Sheet1!A1:D10") → Read 10 rows, 4 columns - read_cells("abc123", "Sheet1!A:A") → Read entire column A - read_cells("abc123", "A1:B5") → Read from first visible sheet Args: spreadsheet_id: The ID from the spreadsheet URL. range_notation: A1 notation range. Use 'SheetName!A1:B5' format. Returns: JSON 2D array of cell values. Empty cells may be omitted. |
| write_cellsA | Write values to cells. Supports formulas (start with =). Examples: - write_cells("abc123", "Sheet1!A1", '[["Name", "Age"], ["Alice", 30]]') - write_cells("abc123", "Sheet1!E1", '[["=SUM(A1:D1)"], ["=SUM(A2:D2)"]]') - write_cells("abc123", "A1", '[["Header1", "Header2", "Header3"]]') Args: spreadsheet_id: The ID from the spreadsheet URL. range_notation: Starting cell in A1 notation (e.g., "Sheet1!A1"). values: JSON 2D array. Each inner array is a row. Formulas: use "=SUM(A1:A10)", "=AVERAGE(B:B)", etc. Returns: JSON with updated_cells count and updated_range. |
| batch_readA | Read values from multiple ranges at once. Args: spreadsheet_id: The ID of the spreadsheet. ranges: Comma-separated A1 notation ranges (e.g., "Sheet1!A1:B5,Sheet1!D1:E5"). Returns: JSON object mapping each range to its values. |
| batch_writeA | Write values to multiple ranges at once. Args: spreadsheet_id: The ID of the spreadsheet. data: JSON array of objects with 'range' and 'values' keys. Example: '[{"range": "A1:B2", "values": [[1,2],[3,4]]}, {"range": "D1", "values": [["Hello"]]}]' Returns: JSON with total cells, rows, columns updated. |
| clear_cellsA | Clear all values in a range (keeps formatting). Args: spreadsheet_id: The ID of the spreadsheet. range_notation: A1 notation range to clear. Returns: Success message. |
| append_rowsA | Append rows to the end of data in a sheet. Args: spreadsheet_id: The ID of the spreadsheet. range_notation: A1 notation indicating which columns (e.g., "Sheet1!A:D"). values: JSON 2D array of rows to append. Returns: JSON with updated range and cells appended. |
| insert_rowsA | Insert empty rows at a specific position. Args: spreadsheet_id: The ID of the spreadsheet. sheet_id: The numeric ID of the sheet. start_index: Row index to insert at (0-based, so row 1 = index 0). num_rows: Number of rows to insert. Returns: Success message. |
| insert_columnsA | Insert empty columns at a specific position. Args: spreadsheet_id: The ID of the spreadsheet. sheet_id: The numeric ID of the sheet. start_index: Column index to insert at (0-based, so column A = index 0). num_columns: Number of columns to insert. Returns: Success message. |
| delete_rowsA | Delete rows from a sheet. Args: spreadsheet_id: The ID of the spreadsheet. sheet_id: The numeric ID of the sheet. start_index: Starting row index (0-based). num_rows: Number of rows to delete. Returns: Success message. |
| delete_columnsA | Delete columns from a sheet. Args: spreadsheet_id: The ID of the spreadsheet. sheet_id: The numeric ID of the sheet. start_index: Starting column index (0-based). num_columns: Number of columns to delete. Returns: Success message. |
| format_cellsA | Apply formatting to a range of cells. Examples: - Format header row bold with blue background: format_cells("abc", 0, 0, 1, 0, 5, bold=True, background_color="#4285F4") - Center align cells A1:C10: format_cells("abc", 0, 0, 10, 0, 3, alignment="CENTER") Note: Indices are 0-based. Row 1 in sheets = index 0. Column A = index 0. end_row and end_col are EXCLUSIVE (like Python ranges). Args: spreadsheet_id: The ID from the spreadsheet URL. sheet_id: Numeric sheet ID (get from list_sheets or get_spreadsheet_info). start_row: Starting row index (0-based, so row 1 = 0). end_row: Ending row index (exclusive, so rows 1-5 = start=0, end=5). start_col: Starting column index (0-based, A=0, B=1, C=2...). end_col: Ending column index (exclusive). bold: Make text bold (True/False). italic: Make text italic (True/False). font_size: Font size in points (0 to skip, typical: 10-14). font_color: Hex color for text (e.g., "#FF0000"=red, "#FFFFFF"=white). background_color: Hex color for cell background (e.g., "#4285F4"=blue). alignment: "LEFT", "CENTER", or "RIGHT". Returns: Success message. |
| set_column_widthB | Set the width of columns. Args: spreadsheet_id: The ID of the spreadsheet. sheet_id: The numeric ID of the sheet. start_col: Starting column index (0-based, A=0). end_col: Ending column index (exclusive). width: Width in pixels. Returns: Success message. |
| merge_cellsA | Merge cells in a range. Args: spreadsheet_id: The ID of the spreadsheet. sheet_id: The numeric ID of the sheet. start_row: Starting row index (0-based). end_row: Ending row index (exclusive). start_col: Starting column index (0-based). end_col: Ending column index (exclusive). merge_type: "MERGE_ALL", "MERGE_COLUMNS", or "MERGE_ROWS". Returns: Success message. |
| create_chartA | Create an embedded chart with MULTIPLE SERIES support. Examples: - Multi-series line chart (auto-detect all columns B-F as series): create_chart("abc", 0, "LINE", "Sheet1!A1:F10", "Stock Prices") Chart Types: - BAR: Horizontal bars (multiple series = grouped bars) - COLUMN: Vertical bars (multiple series = grouped columns) - LINE: Line graph (multiple series = multiple lines, great for trends) - PIE: Circular chart (single series only) - AREA: Stacked area chart - SCATTER: X-Y scatter plot Multi-Series Example: Data: | Date | ONGC | BPCL | IOCL | NTPC | CIL | Range: "Sheet1!A1:F30" domain_column: 0 (Date column as X-axis) series_columns: "1,2,3,4,5" (or leave empty to auto-detect) Result: 5 lines on one chart, each representing a company Args: spreadsheet_id: The ID from the spreadsheet URL. sheet_id: Numeric sheet ID where chart will be placed. chart_type: BAR, LINE, PIE, AREA, COLUMN, or SCATTER. data_range: A1 notation of data range (e.g., "Sheet1!A1:F30"). title: Chart title displayed at top. position_row: Row offset for chart placement (0-based). position_col: Column offset for chart placement (0=A, 5=F, 7=H). domain_column: Column index for X-axis labels (0=first column of range). series_columns: Comma-separated indices for series data (e.g., "1,2,3,4,5"). Empty = auto-detect all columns after domain_column. Returns: JSON with chart_id for later reference. |
| list_chartsA | List all charts in a spreadsheet. Args: spreadsheet_id: The ID of the spreadsheet. Returns: JSON list of charts with IDs, titles, and positions. |
| delete_chartA | Delete a chart from the spreadsheet. Args: spreadsheet_id: The ID of the spreadsheet. chart_id: The ID of the chart (from list_charts). Returns: Success message. |
| sort_rangeA | Sort data in a range by a column. Args: spreadsheet_id: The ID of the spreadsheet. sheet_id: The numeric ID of the sheet. start_row: Starting row index (0-based). end_row: Ending row index (exclusive). start_col: Starting column index (0-based). end_col: Ending column index (exclusive). sort_column: Column index to sort by (0-based, relative to range). ascending: True for A-Z/0-9, False for Z-A/9-0. Returns: Success message. |
| find_replaceA | Find and replace text across the spreadsheet or a specific sheet. Args: spreadsheet_id: The ID of the spreadsheet. find: Text to search for. replace: Text to replace with. sheet_id: Limit to specific sheet (-1 for all sheets). match_case: Case-sensitive matching. match_entire_cell: Only match if cell equals find text exactly. Returns: JSON with number of occurrences changed. |
| get_last_rowA | Find the last row with data in a column. Args: spreadsheet_id: The ID of the spreadsheet. sheet_name: Name of the sheet. column: Column letter to check (default "A"). Returns: JSON with the last row number (1-based). |
| share_spreadsheetA | Share a spreadsheet with someone or make it publicly accessible. Args: spreadsheet_id: The ID of the spreadsheet. email: Email address to share with (optional if make_public=True). role: Permission level - "reader", "writer", or "commenter". make_public: If True, makes spreadsheet accessible to anyone with link. Returns: JSON with sharing result. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dudegladiator/spreadsheet-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server