An MCP connector for Google Sheets that allows AI agents to interact directly.
Google Sheets MCP
A Model Context Protocol (MCP) connector for Google Sheets that allows AI agents to interact with spreadsheets directly.
Demo
https://github.com/user-attachments/assets/cc4729d9-4e6e-437b-848b-6da9a09418c3
Setup
- Clone this repository:
git clone https://github.com/Jsgordon420365/google-sheets-mcp
cd google-sheets-mcp
Install dependencies:
npm installBuild:
npm run buildCreate OAuth credentials in Google Cloud Platform:
- Create a new project in Google Cloud Console
- Enable the Google Sheets API
- Configure the OAuth consent screen
- Create OAuth client ID credentials (Desktop application) with an appropriate redirect URI (ex: http://localhost:3000/oauth2callback)
- Download the credentials and save as
gcp-oauth.keys.jsonin thedistsubdirectory
Start the MCP server (you'll automatically be prompted to authenticate/re-authenticate your Google account when necessary):
npm run start
Usage
Sample config:
{
"mcpServers": {
"google-sheets-mcp": {
"command": "node",
"args": ["/users/gordo/google-sheets-mcp/dist/index.js"]
}
}
}
Then you should be able to simply specify your spreadsheetId or ask your agent to create a new one for you.
Available Actions
| Action | Description |
|---|---|
refresh_auth |
Re-authenticate your Google Account when credentials expire |
list_sheets |
List all sheets/tabs in a Google Spreadsheet |
create_sheet |
Create a new sheet/tab in a Google Spreadsheet |
create_spreadsheet |
Create a new Google Spreadsheet |
read_all_from_sheet |
Read all data from a specified sheet |
read_headings |
Read the column headings from a sheet |
read_rows |
Read specific rows from a sheet |
read_columns |
Read specific columns from a sheet |
edit_cell |
Edit a single cell in a sheet |
edit_row |
Edit an entire row in a sheet |
edit_column |
Edit an entire column in a sheet |
insert_row |
Insert a new row at specified position |
insert_column |
Insert a new column at specified position |
rename_sheet |
Rename a sheet/tab in a spreadsheet |
rename_doc |
Rename a Google Spreadsheet |
record_shift_entry |
Record a shift in the Handoff Ledger (Shift_Log) |
get_baton_status |
Check who currently has the 'Baton' |
call_apps_script |
Trigger custom logic (like Temporal Handshake) via URL |
Multi-LLM Handoff Protocol (Baton Sync)
This server is optimized for the Adam, Ben, and Cindy Protocol, allowing multiple LLMs (Gemini, Claude, ChatGPT) to maintain a synchronized state via a Shift_Log tab.
**The Protocol Rules:**
- Check Status: Before starting any task, run
get_baton_statusto see the latest shift entry and handoff notes. - Identify Yourself: When recording an entry, use your agent name (e.g., "Gemini", "Claude", "ChatGPT").
- Temporal Handshake: Use
call_apps_scriptwith the actiontemporal_handshaketo sync timestamps if required by the Apps Script logic. - Passing the Baton: When your shift ends, run
record_shift_entrywith a summary ofactionTakenand clearhandoffNotesfor the next agent.
**Apps Script Integration**
- URL:
https://script.google.com/macros/s/AKfycbwTx6nUZqmXlH5g_mVCwxPctXe2lR0Y1Hy256TQVOLifAiPu0yJZYvkQywccyxJ38Gs/exec - Action:
temporal_handshake - Spreadsheet ID:
1LVcmsIKdgd5uf1K79EtGMgd7epD53x6OBO4cgi7GC9Q
License
MIT
Tools (18)
refresh_authRe-authenticate your Google Account when credentials expirelist_sheetsList all sheets/tabs in a Google Spreadsheetcreate_sheetCreate a new sheet/tab in a Google Spreadsheetcreate_spreadsheetCreate a new Google Spreadsheetread_all_from_sheetRead all data from a specified sheetread_headingsRead the column headings from a sheetread_rowsRead specific rows from a sheetread_columnsRead specific columns from a sheetedit_cellEdit a single cell in a sheetedit_rowEdit an entire row in a sheetedit_columnEdit an entire column in a sheetinsert_rowInsert a new row at specified positioninsert_columnInsert a new column at specified positionrename_sheetRename a sheet/tab in a spreadsheetrename_docRename a Google Spreadsheetrecord_shift_entryRecord a shift in the Handoff Ledger (Shift_Log)get_baton_statusCheck who currently has the 'Baton'call_apps_scriptTrigger custom logic (like Temporal Handshake) via URLConfiguration
{"mcpServers": {"google-sheets-mcp": {"command": "node", "args": ["/users/gordo/google-sheets-mcp/dist/index.js"]}}}