{"name":"io.github.freema/mcp-gsheets","slug":"freema-mcp-gsheets","title":null,"description":"MCP server for Google Sheets API — read, write, format, batch operations.","url":"https://mcp.market/server/freema-mcp-gsheets","rating":null,"grade":"B","score":75,"certified":false,"status":"active","category":"productivity","tags":["productivity"],"presence":{"score":34,"stars":98,"forks":23,"downloads_week":null,"last_push_at":"2026-09-19T11:31:30.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/freema/mcp-gsheets","website":null,"version":"1.10.3","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"mcp-gsheets","version":"1.10.3","transport":{"type":"stdio"},"environmentVariables":[{"description":"Google Cloud project ID","isRequired":true,"name":"GOOGLE_PROJECT_ID"},{"description":"Path to service account key JSON file (auth method 1)","name":"GOOGLE_APPLICATION_CREDENTIALS"},{"description":"Service account key as JSON string (auth method 2)","isSecret":true,"name":"GOOGLE_SERVICE_ACCOUNT_KEY"},{"description":"Service account private key in PEM format (auth method 3)","isSecret":true,"name":"GOOGLE_PRIVATE_KEY"},{"description":"Service account email (auth method 3)","name":"GOOGLE_CLIENT_EMAIL"}]}],"tools":[{"name":"sheets_add_conditional_formatting","description":"Add conditional formatting rules to a Google Sheet","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_add_table","description":"Create a native Google Sheets table with typed columns and optional dropdown values","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_append_values","description":"Append values to the end of a table in a Google Sheets spreadsheet. IMPORTANT: By default, this will OVERWRITE existing empty cells. To INSERT new rows instead, set insertDataOption to \"INSERT_ROWS\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_batch_delete_sheets","description":"Delete multiple sheets from a Google Sheets spreadsheet in a single operation","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_batch_format_cells","description":"Format multiple cell ranges in a Google Sheet in a single operation","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_batch_get_values","description":"Get values from multiple ranges in a Google Sheets spreadsheet","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_batch_update_values","description":"Update values in multiple ranges of a Google Sheets spreadsheet","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_check_access","description":"Check access permissions for a spreadsheet. Returns information about what operations are allowed.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_clear_values","description":"Clear values in a specified range of a Google Sheets spreadsheet","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_compare_ranges","description":"Compare cell formatting between two ranges of identical dimensions. Useful for verifying repeated patterns, e.g. \"do all data rows 6\\u201385 have identical formatting?\" or \"is row 10 formatted identically to the template row 5?\". Returns a diff listing only the cells and properties that differ between the two ranges. Cells are compared position-by-position; rangeA and rangeB must have the same num","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_copy_to","description":"Copy a sheet to another Google Sheets spreadsheet","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_create_chart","description":"Create a chart in a Google Sheets spreadsheet. Sheet names with spaces should be quoted in ranges (e.g., \"My Sheet\"!A1:B5). Position uses overlayPosition with anchorCell containing sheetId, rowIndex, and columnIndex.","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_create_spreadsheet","description":"Create a new Google Sheets spreadsheet","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_delete_chart","description":"Delete a chart from a Google Sheets spreadsheet","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_delete_columns","description":"Delete one or more columns from a Google Sheet using a full-column A1 range","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_delete_rows","description":"Delete one or more rows from a Google Sheet using a full-row A1 range","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_delete_sheet","description":"Delete a sheet from a Google Sheets spreadsheet","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_delete_table","description":"Delete a native Google Sheets table by tableId","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_duplicate_sheet","description":"Duplicate a sheet within a Google Sheets spreadsheet","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_format_cells","description":"Format cells in a Google Sheet (colors, fonts, alignment, number formats)","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_basic_filter","description":"Read the Basic Filter (AutoFilter) configuration for a sheet, including the filtered range, sort specs, and per-column filter criteria (hidden values, conditions, color filters). Returns hasBasicFilter: false if no filter is applied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_border_map","description":"Returns a visual tabular map of borders for a range. Instead of per-cell JSON with 4 separate border objects, returns compact grids showing which cells have top/bottom/left/right borders and their styles. Solves the ambiguity between \"right border of cell N\" vs \"left border of cell N+1\". Output: a horizontal-lines grid and a vertical-lines grid, each as a 2D array of line styles. Set includeStyle:","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_conditional_formatting","description":"Read conditional formatting rules and banded ranges (alternating row/column colors) for a sheet. CF formulas are normalized to English locale (semicolons \\u2192 commas) by default. Each rule with a formula includes a \"_formulaLocaleRaw\" field with the original unmodified formula. Set normalizeFormulas:false to get raw formulas as returned by the API.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_data_validation","description":"Read data validation rules (checkboxes, dropdown lists, custom formulas, etc.) from a sheet or range. Returns a compact list of unique validation rules grouped by their cell ranges (run-length encoded). Useful for discovering checkboxes (BOOLEAN), dropdown lists (ONE_OF_LIST / ONE_OF_RANGE), number constraints, and custom formula validations.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_formatting_compact","description":"Returns cell formatting for a range as compact A1Range\\u2192format pairs. Adjacent cells with identical formatting are collapsed into rectangular ranges (run-length encoded). Reduces output by 90%+ compared to per-cell formatting for typical sheets. Use instead of sheets_get_full_sheet_snapshot when you only need formatting data. Supported fields: backgroundColor, backgroundColorStyle, textFormat,","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_full_sheet_snapshot","description":"One-shot tool: reads all structural and formatting metadata for a sheet in a single API call. Returns: sheet properties (frozen rows/cols, dimensions, tab color), merged cells, column widths, row heights, banded ranges, and optionally cell-level formatting for a specified range (includeFormattingRange). compactMode is OFF by default \\u2014 full per-cell detail is returned unless compactMode:true i","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_merged_cells","description":"Get all merged cell ranges for a specific sheet. Returns each merge as A1 notation and GridRange coordinates.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_metadata","description":"Get metadata about a Google Sheets spreadsheet including sheet names, IDs, and properties","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_sheet_dimensions","description":"Get column widths (pixelSize), row heights (pixelSize), hidden columns/rows, and frozen row/column counts for a sheet.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_sheet_formatting","description":"Read cell formatting (background color, text color, font family, font size, bold, italic, horizontal/vertical alignment, wrapStrategy, textRotation, numberFormat) for a range. Returns a 2D array matching the requested range rows/columns. Set useEffectiveFormat=true to get the resolved/inherited format instead of the user-entered one.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_sheet_structure","description":"Lightweight tool returning ONLY structural/dimensional metadata for a sheet \\u2014 no per-cell data. Returns: sheet dimensions, frozen rows/cols, tab color, sheet index, column widths array, row heights array, hidden columns/rows, and all merge ranges in A1 notation. Use this instead of sheets_get_full_sheet_snapshot when per-cell formatting is not needed. Much faster and cheaper \\u2014 single API","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_tables","description":"Read native Google Sheets tables for a spreadsheet or a specific sheet","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_get_values","description":"Get values from a specified range in a Google Sheets spreadsheet","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_insert_date","description":"Insert properly formatted dates in Google Sheets with locale support and automatic detection","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_insert_link","description":"Insert clickable links in Google Sheets cells with custom display text","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_insert_rows","description":"Insert new rows at a specific position with optional data","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_insert_sheet","description":"Add a new sheet to an existing Google Sheets spreadsheet","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_merge_cells","description":"Merge cells in a Google Sheet","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_unmerge_cells","description":"Unmerge cells in a Google Sheet","write_action":false,"price_micros":0,"input_schema":null},{"name":"sheets_update_borders","description":"Update borders of cells in a Google Sheet","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_update_chart","description":"Update an existing chart in a Google Sheets spreadsheet","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_update_sheet_properties","description":"Update properties of a sheet in a Google Sheets spreadsheet","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_update_table","description":"Update an existing native Google Sheets table by tableId","write_action":true,"price_micros":0,"input_schema":null},{"name":"sheets_update_values","description":"Update values in a specified range of a Google Sheets spreadsheet. Examples: - Fixed range \"A1:C3\" - must provide exactly 3 rows - Flexible range \"A1\" - will expand to fit all provided rows - To update rows 42-74 (33 rows), use \"A42\" not \"A42:E53\" IMPORTANT: Empty rows in your data array still count as rows!","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":75,"grade":"B","scanned_at":"2026-09-19T19:53:47.050Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T19:53:47.001Z","components":{"code":{"score":20,"max":25,"notes":["2 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"dist/index.js: …ode, sch); const makeValidate = new Function(`${names_1.default.self}`, `${names_1.de…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"mcp-gsheets","version":"1.10.3","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-09-19T11:34:14.982Z","repositoryUrl":"git+https://github.com/freema/mcp-gsheets.git"}],"repo":{"found":true,"owner":"freema","repo":"mcp-gsheets","archived":false,"pushedAt":"2026-09-19T11:31:30Z","stars":98,"forks":23,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/2912985?v=4","ownerCreatedAt":"2012-11-28T15:30:50Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/2912985?v=4&s=128","source":"registry"},"presence":{"stars":98,"forks":23,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-19T11:31:30.000Z","score":34}}}},"grade_history":[],"reviews":[]}