A clean, practical MCP (Model Context Protocol) server for analyzing Google Sheets data with multi-tab support. Built for Claude Desktop and other MCP-compatible AI assistants by TNTM.
- Smart Sync - Sync Google Sheets with configurable row limits to prevent timeouts
- Multi-tab Support - Query across multiple sheets with SQL JOINs
- SQL Queries - Direct SQL access to synced data
- Sheet Analysis - Get suggestions for cross-sheet queries
- Quick Preview - Preview sheets without full sync
- Performance Optimized - Row limits and result pagination for large datasets
- Python 3.8+
- Claude Desktop or another MCP-compatible client
- Google Cloud Project with Sheets API enabled
- OAuth2 credentials from Google Cloud Console
git clone https://github.com/yourusername/google-sheet-analytics-mcp.git
cd google-sheet-analytics-mcp
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
- Go to Google Cloud Console
- Create a new project or select existing one
- Enable the Google Sheets API
- Create OAuth2 credentials (Desktop Application)
- Download the credentials and save as
credentials.json
in the project root
python3 setup.py
This will:
- Set up OAuth authentication
- Configure Claude Desktop automatically
- Test the connection
Or configure MCP client manually:
{
"mcpServers": {
"google-sheets-analytics": {
"command": "/path/to/your/venv/bin/python",
"args": ["/path/to/google-sheet-analytics-mcp/src/mcp_server.py"]
}
}
}
Restart your MCP client (e.g., Claude Desktop) and the OAuth flow will start automatically on first tool use.
Sync Google Sheet data with performance controls.
Use smart_sync with url "https://docs.google.com/spreadsheets/d/your_sheet_id" and max_rows 500
url
(required): Google Sheets URLmax_rows
(optional): Max rows per sheet (default: 1000)sheets
(optional): Array of specific sheet names to sync
Run SQL queries on synced data, including JOINs across tabs.
Use query_sheets with query "SELECT * FROM sheet1 JOIN sheet2 ON sheet1.id = sheet2.id LIMIT 10"
query
(required): SQL query to execute
View all synced sheets and their table names.
Use list_synced_sheets
Get suggestions for queries across multiple sheets.
Use analyze_sheets with question "How can I combine sales data with customer data?"
question
(required): What you want to analyze
Quick preview without syncing.
Use get_sheet_preview with url "https://docs.google.com/spreadsheets/d/your_sheet_id" and rows 20
url
(required): Google Sheets URLsheet_name
(optional): Specific sheet to previewrows
(optional): Number of rows to preview (default: 10)
- Authentication - Uses OAuth2 to securely access Google Sheets API
- Sync - Downloads sheet data to local SQLite database with configurable limits
- Query - Enables SQL queries across all synced sheets
- Multi-tab - Each sheet becomes a separate table, joinable via SQL
google-sheet-analytics-mcp/
βββ src/
β βββ mcp_server.py # Main MCP server implementation
β βββ auth/
β βββ oauth_setup.py # Unified OAuth authentication module
βββ setup.py # Unified setup script (handles everything)
βββ requirements.txt # Python dependencies
βββ credentials.json.example # Example OAuth credentials format
βββ README.md # This file
βββ LICENSE # MIT License
βββ CLAUDE.md # Claude-specific instructions
βββ data/ # Runtime data (created automatically)
β βββ token.json # OAuth token (created during setup)
β βββ sheets_data.sqlite # Local database (created on first sync)
βββ venv/ # Virtual environment (created during setup)
- Row Limits: Default 1000 rows per sheet (configurable)
- Result Limits: Query results limited to 100 rows
- Local Storage: SQLite database for fast repeated queries
- Metadata Tracking: Efficient re-syncing of changed data
- Memory Efficient: Streaming data processing
-- Combine sales data with customer information
SELECT
s.product_name,
s.sales_amount,
c.customer_name,
c.customer_segment
FROM sales_data s
JOIN customer_data c ON s.customer_id = c.id
WHERE s.sales_amount > 1000
-- Total revenue by region from multiple sheets
SELECT
region,
SUM(amount) as total_revenue
FROM (
SELECT region, amount FROM q1_sales
UNION ALL
SELECT region, amount FROM q2_sales
)
GROUP BY region
ORDER BY total_revenue DESC
- OAuth2 authentication with Google
- Credentials stored locally (never committed to repo)
- Read-only access to Google Sheets
- Local SQLite database (no external data transmission)
Issue | Solution |
---|---|
"No credentials found" | Ensure credentials.json exists in project root or config/ directory |
"Authentication failed" | Check token status with venv/bin/python src/auth/oauth_setup.py --status |
"Token expired" | Run venv/bin/python src/auth/oauth_setup.py --test (auto-refreshes) |
"Sync timeout" | Reduce max_rows parameter in smart_sync |
"Tools not appearing" | Restart Claude Desktop after configuration |
"Rate limit errors" | Wait a few minutes and try again with smaller batches |
- Check status:
venv/bin/python src/auth/oauth_setup.py --status
- Test auth:
venv/bin/python src/auth/oauth_setup.py --test
- Reset OAuth:
venv/bin/python src/auth/oauth_setup.py --reset
- Manual setup:
venv/bin/python src/auth/oauth_setup.py --manual
- Ensure Claude Desktop is fully closed
- Verify config:
cat ~/Library/Application\ Support/Claude/claude_desktop_config.json
- Check the config includes the google-sheets-analytics server
- Restart Claude Desktop
- Check developer console for errors
- Database location:
data/sheets_data.sqlite
- Reset database: Delete the file and re-sync
- Check synced sheets: Use the
list_synced_sheets
tool
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Built for the Model Context Protocol
- Designed for Claude Desktop
- Uses Google Sheets API
Need help? Open an issue on GitHub or check the troubleshooting section above.