Google Sheets MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| 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