# Google Sheets MCP Server
An MCP (Model Context Protocol) server that exposes Google Sheets as queryable database tables. Designed to run as a Google Cloud Function.
## Features
- **list_sheets** - List all sheet names in a spreadsheet
- **get_schema** - Get column headers for a sheet
- **query_rows** - Fetch rows with optional pagination (limit/offset)
## Prerequisites
1. A Google Cloud project with the Sheets API enabled
2. A service account with access to the spreadsheets you want to query
3. Google Cloud CLI (`gcloud`) installed and configured
## Setup
### 1. Create a Service Account
```bash
# Create the service account
gcloud iam service-accounts create sheets-mcp \
--display-name="Google Sheets MCP Server"
# Create and download the key
gcloud iam service-accounts keys create service-account-key.json \
--iam-account=sheets-mcp@YOUR_PROJECT_ID.iam.gserviceaccount.com
```
### 2. Share Spreadsheets
Share your Google Spreadsheets with the service account email:
```
sheets-mcp@YOUR_PROJECT_ID.iam.gserviceaccount.com
```
Grant "Viewer" permission for read-only access.
### 3. Install Dependencies
```bash
npm install
```
### 4. Build
```bash
npm run build
```
## Local Development
Set the environment variable and run:
```bash
export GOOGLE_SERVICE_ACCOUNT_KEY=$(cat service-account-key.json)
npm start
```
## Deploy to Google Cloud Functions
### Deploy Command
```bash
gcloud functions deploy google-sheets-mcp \
--gen2 \
--runtime=nodejs20 \
--region=us-central1 \
--source=. \
--entry-point=googleSheetsMcp \
--trigger-http \
--allow-unauthenticated \
--set-env-vars="GOOGLE_SERVICE_ACCOUNT_KEY=$(cat service-account-key.json | jq -c .)"
```
For authenticated access (recommended for production):
```bash
gcloud functions deploy google-sheets-mcp \
--gen2 \
--runtime=nodejs20 \
--region=us-central1 \
--source=. \
--entry-point=googleSheetsMcp \
--trigger-http \
--set-env-vars="GOOGLE_SERVICE_ACCOUNT_KEY=$(cat service-account-key.json | jq -c .)"
```
### Using Secret Manager (Recommended)
For better security, store credentials in Secret Manager:
```bash
# Create the secret
gcloud secrets create sheets-mcp-credentials \
--data-file=service-account-key.json
# Deploy with secret reference
gcloud functions deploy google-sheets-mcp \
--gen2 \
--runtime=nodejs20 \
--region=us-central1 \
--source=. \
--entry-point=googleSheetsMcp \
--trigger-http \
--set-secrets="GOOGLE_SERVICE_ACCOUNT_KEY=sheets-mcp-credentials:latest"
```
## MCP Client Configuration
Add the deployed function URL to your MCP client configuration:
```json
{
"mcpServers": {
"google-sheets": {
"url": "https://REGION-PROJECT_ID.cloudfunctions.net/google-sheets-mcp"
}
}
}
```
## Tool Usage
### list_sheets
List all sheets in a spreadsheet:
```json
{
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"
}
```
### get_schema
Get column headers for a sheet:
```json
{
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"sheetName": "Sheet1"
}
```
### query_rows
Fetch rows from a sheet:
```json
{
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"sheetName": "Sheet1",
"limit": 10,
"offset": 0
}
```
## Finding the Spreadsheet ID
The spreadsheet ID is in the URL of your Google Sheet:
```
https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit
```
## License
MIT