https://github.com/taylorwilsdon/google_workspace_mcp
Comprehensive, highly performant Google Workspace MCP Server with complete coverage for Calendar, Gmail, Docs, Sheets, Slides, Chat, Forms & Drive!
https://github.com/taylorwilsdon/google_workspace_mcp
ai gmail google-calendar google-chat google-drive google-sheets google-workspace llm llm-tools mcp mcp-server model-context-protocol model-context-protocol-server model-context-protocol-servers
Last synced: 3 months ago
JSON representation
Comprehensive, highly performant Google Workspace MCP Server with complete coverage for Calendar, Gmail, Docs, Sheets, Slides, Chat, Forms & Drive!
- Host: GitHub
- URL: https://github.com/taylorwilsdon/google_workspace_mcp
- Owner: taylorwilsdon
- License: mit
- Created: 2025-04-27T18:31:13.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2025-06-24T23:54:48.000Z (3 months ago)
- Last Synced: 2025-06-25T00:29:16.358Z (3 months ago)
- Topics: ai, gmail, google-calendar, google-chat, google-drive, google-sheets, google-workspace, llm, llm-tools, mcp, mcp-server, model-context-protocol, model-context-protocol-server, model-context-protocol-servers
- Language: Python
- Homepage: https://workspacemcp.com
- Size: 557 KB
- Stars: 184
- Watchers: 4
- Forks: 40
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- best-of-mcp-servers - GitHub - 17% open Β· β±οΈ 28.09.2025) (Workplace & Productivity)
- awesome - taylorwilsdon/google\_workspace\_mcp - Control Gmail, Google Calendar, Docs, Sheets, Slides, Chat, Forms, Tasks, Search & Drive with AI - Comprehensive Google Workspace / G Suite MCP Server (Python)
README
# Google Workspace MCP Server
[](https://opensource.org/licenses/MIT)
[](https://www.python.org/downloads/)
[](https://pypi.org/project/workspace-mcp/)
[](https://github.com/astral-sh/uv)
[](https://workspacemcp.com)
[](https://mseep.ai/app/eebbc4a6-0f8c-41b2-ace8-038e5516dba0)**This is the single most feature-complete Google Workspace MCP server**
*Full natural language control over Google Calendar, Drive, Gmail, Docs, Sheets, Slides, Forms, and Chat through all MCP clients, AI assistants and developer tools*
---
**See it in action:**
---
## AI-Enhanced Documentation
> **This README was crafted with AI assistance, and here's why that matters**
>
> When people dismiss documentation as "AI-generated," they're missing the bigger pictureAs a solo developer building open source tools that may only ever serve my own needs, comprehensive documentation often wouldn't happen without AI help. When done rightβusing agents like **Roo** or **Claude Code** that understand the entire codebase, AI doesn't just regurgitate generic content - it extracts real implementation details and creates accurate, specific documentation.
**The alternative? No docs at all.**
I hope the community can appreciate these tools for what they enable: solo developers maintaining professional documentation standards while focusing on building great software.
---
*This documentation was enhanced by AI with full codebase context. The result? You're reading docs that otherwise might not exist.*## π Overview
A production-ready MCP server that integrates all major Google Workspace services with AI assistants. Built with FastMCP for optimal performance, featuring advanced authentication handling, service caching, and streamlined development patterns.
## β¨ Features
- **π Advanced OAuth 2.0**: Secure authentication with automatic token refresh, transport-aware callback handling, session management, and centralized scope management
- **π Google Calendar**: Full calendar management with event CRUD operations
- **π Google Drive**: File operations with native Microsoft Office format support (.docx, .xlsx)
- **π§ Gmail**: Complete email management with search, send, and draft capabilities
- **π Google Docs**: Document operations including content extraction and creation
- **π Google Sheets**: Comprehensive spreadsheet management with flexible cell operations
- **πΌοΈ Google Slides**: Presentation management with slide creation, updates, and content manipulation
- **π Google Forms**: Form creation, retrieval, publish settings, and response management
- **π¬ Google Chat**: Space management and messaging capabilities
- **π Multiple Transports**: HTTP with SSE fallback, OpenAPI compatibility via `mcpo`
- **β‘ High Performance**: Service caching, thread-safe sessions, FastMCP integration
- **π§© Developer Friendly**: Minimal boilerplate, automatic service injection, centralized configuration---
## π Quick Start
### Simplest Start (uvx - Recommended)
> Run instantly without manual installation - you must configure OAuth credentials when using uvx. You can use either environment variables (recommended for production) or set the `GOOGLE_CLIENT_SECRET_PATH` (or legacy `GOOGLE_CLIENT_SECRETS`) environment variable to point to your `client_secret.json` file.
```bash
# Set OAuth credentials via environment variables (recommended)
export GOOGLE_OAUTH_CLIENT_ID="your-client-id.apps.googleusercontent.com"
export GOOGLE_OAUTH_CLIENT_SECRET="your-client-secret"# Start the server with all Google Workspace tools
uvx workspace-mcp# Start with specific tools only
uvx workspace-mcp --tools gmail drive calendar# Start in HTTP mode for debugging
uvx workspace-mcp --transport streamable-http
```*Requires Python 3.11+ and [uvx](https://github.com/astral-sh/uv). The package is available on [PyPI](https://pypi.org/project/workspace-mcp).*
### Development Installation
For development or customization:
```bash
git clone https://github.com/taylorwilsdon/google_workspace_mcp.git
cd google_workspace_mcp
uv run main.py
```### Prerequisites
- **Python 3.11+**
- **[uvx](https://github.com/astral-sh/uv)** (for instant installation) or [uv](https://github.com/astral-sh/uv) (for development)
- **Google Cloud Project** with OAuth 2.0 credentials### Configuration
1. **Google Cloud Setup**:
- Create OAuth 2.0 credentials (web application) in [Google Cloud Console](https://console.cloud.google.com/)
- Enable APIs: Calendar, Drive, Gmail, Docs, Sheets, Slides, Forms, Chat
- Add redirect URI: `http://localhost:8000/oauth2callback`
- Configure credentials using one of these methods:**Option A: Environment Variables (Recommended for Production)**
```bash
export GOOGLE_OAUTH_CLIENT_ID="your-client-id.apps.googleusercontent.com"
export GOOGLE_OAUTH_CLIENT_SECRET="your-client-secret"
export GOOGLE_OAUTH_REDIRECT_URI="http://localhost:8000/oauth2callback" # Optional
```**Option B: File-based (Traditional)**
- Download credentials as `client_secret.json` in project root
- To use a different location, set `GOOGLE_CLIENT_SECRET_PATH` (or legacy `GOOGLE_CLIENT_SECRETS`) environment variable with the file path**Credential Loading Priority**:
1. Environment variables (`GOOGLE_OAUTH_CLIENT_ID`, `GOOGLE_OAUTH_CLIENT_SECRET`)
2. File specified by `GOOGLE_CLIENT_SECRET_PATH` or `GOOGLE_CLIENT_SECRETS` environment variable
3. Default file (`client_secret.json` in project root)**Why Environment Variables?**
- β Containerized deployments (Docker, Kubernetes)
- β Cloud platforms (Heroku, Railway, etc.)
- β CI/CD pipelines
- β No secrets in version control
- β Easy credential rotation2. **Environment**:
```bash
export OAUTHLIB_INSECURE_TRANSPORT=1 # Development only
```3. **Server Configuration**:
The server's base URL and port can be customized using environment variables:
- `WORKSPACE_MCP_BASE_URI`: Sets the base URI for the server (default: http://localhost). This affects the server_url used for Gemini native function calling and the OAUTH_REDIRECT_URI.
- `WORKSPACE_MCP_PORT`: Sets the port the server listens on (default: 8000). This affects the server_url, port, and OAUTH_REDIRECT_URI.### Start the Server
```bash
# Default (stdio mode for MCP clients)
uv run main.py# HTTP mode (for web interfaces and debugging)
uv run main.py --transport streamable-http# Single-user mode (simplified authentication)
uv run main.py --single-user# Selective tool registration (only register specific tools)
uv run main.py --tools gmail drive calendar
uv run main.py --tools sheets docs
uv run main.py --single-user --tools gmail # Can combine with other flags# Docker
docker build -t workspace-mcp .
docker run -p 8000:8000 -v $(pwd):/app workspace-mcp --transport streamable-http
```**Available Tools for `--tools` flag**: `gmail`, `drive`, `calendar`, `docs`, `sheets`, `forms`, `chat`
### Connect to Claude Desktop
The server supports two transport modes:
#### Stdio Mode (Default - Recommended for Claude Desktop)
**Option 1: Auto-install (Recommended)**
```bash
python install_claude.py
```**Option 2: Manual Configuration**
1. Open Claude Desktop Settings β Developer β Edit Config
2. This creates/opens the config file at:
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
3. Add the server configuration:```json
{
"mcpServers": {
"google_workspace": {
"command": "uvx",
"args": ["workspace-mcp"],
"env": {
"GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret"
}
}
}
}
```**Alternative (Development Installation)**:
```json
{
"mcpServers": {
"google_workspace": {
"command": "uv",
"args": ["run", "main.py"],
"cwd": "/path/to/google_workspace_mcp",
"env": {
"GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret"
}
}
}
}
```#### HTTP Mode (For debugging or web interfaces)
If you need to use HTTP mode with Claude Desktop:```json
{
"mcpServers": {
"google_workspace": {
"command": "npx",
"args": ["mcp-remote", "http://localhost:8000/mcp"]
}
}
}
```*Note: Make sure to start the server with `--transport streamable-http` when using HTTP mode.*
### First-Time Authentication
The server features **transport-aware OAuth callback handling**:
- **Stdio Mode**: Automatically starts a minimal HTTP server on port 8000 for OAuth callbacks
- **HTTP Mode**: Uses the existing FastAPI server for OAuth callbacks
- **Same OAuth Flow**: Both modes use `http://localhost:8000/oauth2callback` for consistencyWhen calling a tool:
1. Server returns authorization URL
2. Open URL in browser and authorize
3. Server handles OAuth callback automatically (on port 8000 in both modes)
4. Retry the original request---
## π§° Available Tools
> **Note**: All tools support automatic authentication via `@require_google_service()` decorators with 30-minute service caching.
### π Google Calendar ([`calendar_tools.py`](gcalendar/calendar_tools.py))
| Tool | Description |
|------|-------------|
| `list_calendars` | List accessible calendars |
| `get_events` | Retrieve events with time range filtering |
| `get_event` | Fetch detailed information of a single event by ID |
| `create_event` | Create events (all-day or timed) with optional Drive file attachments |
| `modify_event` | Update existing events |
| `delete_event` | Remove events |### π Google Drive ([`drive_tools.py`](gdrive/drive_tools.py))
| Tool | Description |
|------|-------------|
| `search_drive_files` | Search files with query syntax |
| `get_drive_file_content` | Read file content (supports Office formats) |
| `list_drive_items` | List folder contents |
| `create_drive_file` | Create new files or fetch content from public URLs |### π§ Gmail ([`gmail_tools.py`](gmail/gmail_tools.py))
| Tool | Description |
|------|-------------|
| `search_gmail_messages` | Search with Gmail operators |
| `get_gmail_message_content` | Retrieve message content |
| `send_gmail_message` | Send emails |
| `draft_gmail_message` | Create drafts |### π Google Docs ([`docs_tools.py`](gdocs/docs_tools.py))
| Tool | Description |
|------|-------------|
| `search_docs` | Find documents by name |
| `get_doc_content` | Extract document text |
| `list_docs_in_folder` | List docs in folder |
| `create_doc` | Create new documents |### π Google Sheets ([`sheets_tools.py`](gsheets/sheets_tools.py))
| Tool | Description |
|------|-------------|
| `list_spreadsheets` | List accessible spreadsheets |
| `get_spreadsheet_info` | Get spreadsheet metadata |
| `read_sheet_values` | Read cell ranges |
| `modify_sheet_values` | Write/update/clear cells |
| `create_spreadsheet` | Create new spreadsheets |
| `create_sheet` | Add sheets to existing files |### π Google Forms ([`forms_tools.py`](gforms/forms_tools.py))
| Tool | Description |
|------|-------------|
| `create_form` | Create new forms with title and description |
| `get_form` | Retrieve form details, questions, and URLs |
| `set_publish_settings` | Configure form template and authentication settings |
| `get_form_response` | Get individual form response details |
| `list_form_responses` | List all responses to a form with pagination |### π¬ Google Chat ([`chat_tools.py`](gchat/chat_tools.py))
| Tool | Description |
|------|-------------|
| `list_spaces` | List chat spaces/rooms |
| `get_messages` | Retrieve space messages |
| `send_message` | Send messages to spaces |
| `search_messages` | Search across chat history |---
## π οΈ Development
### Project Structure
```
google_workspace_mcp/
βββ auth/ # Authentication system with decorators
βββ core/ # MCP server and utilities
βββ g{service}/ # Service-specific tools
βββ main.py # Server entry point
βββ client_secret.json # OAuth credentials (not committed)
βββ pyproject.toml # Dependencies
```### Adding New Tools
```python
from auth.service_decorator import require_google_service@require_google_service("drive", "drive_read") # Service + scope group
async def your_new_tool(service, param1: str, param2: int = 10):
"""Tool description"""
# service is automatically injected and cached
result = service.files().list().execute()
return result # Return native Python objects
```### Architecture Highlights
- **Service Caching**: 30-minute TTL reduces authentication overhead
- **Scope Management**: Centralized in `SCOPE_GROUPS` for easy maintenance
- **Error Handling**: Native exceptions instead of manual error construction
- **Multi-Service Support**: `@require_multiple_services()` for complex tools---
## π Security
- **Credentials**: Never commit `client_secret.json` or `.credentials/` directory
- **OAuth Callback**: Uses `http://localhost:8000/oauth2callback` for development (requires `OAUTHLIB_INSECURE_TRANSPORT=1`)
- **Transport-Aware Callbacks**: Stdio mode starts a minimal HTTP server only for OAuth, ensuring callbacks work in all modes
- **Production**: Use HTTPS for callback URIs and configure accordingly
- **Network Exposure**: Consider authentication when using `mcpo` over networks
- **Scope Minimization**: Tools request only necessary permissions---
## π Integration with Open WebUI
To use this server as a tool provider within Open WebUI:
### 1. Create MCPO Configuration
Create a file named `config.json` with the following structure to have `mcpo` make the streamable HTTP endpoint available as an OpenAPI spec tool:
```json
{
"mcpServers": {
"google_workspace": {
"type": "streamablehttp",
"url": "http://localhost:8000/mcp"
}
}
}
```### 2. Start the MCPO Server
```bash
mcpo --port 8001 --config config.json --api-key "your-optional-secret-key"
```This command starts the `mcpo` proxy, serving your active (assuming port 8000) Google Workspace MCP on port 8001.
### 3. Configure Open WebUI
1. Navigate to your Open WebUI settings
2. Go to **"Connections"** β **"Tools"**
3. Click **"Add Tool"**
4. Enter the **Server URL**: `http://localhost:8001/google_workspace` (matching the mcpo base URL and server name from config.json)
5. If you used an `--api-key` with mcpo, enter it as the **API Key**
6. Save the configurationThe Google Workspace tools should now be available when interacting with models in Open WebUI.
---
## π License
MIT License - see `LICENSE` file for details.
---
![]()
![]()
![]()