A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/taylorwilsdon/google_workspace_mcp below:

GitHub - taylorwilsdon/google_workspace_mcp: Control Gmail, Google Calendar, Docs, Sheets, Slides, Chat, Forms, Tasks, Search & Drive with AI - Comprehensive Google Workspace

Google Workspace MCP Server

Full natural language control over Google Calendar, Drive, Gmail, Docs, Sheets, Slides, Forms, Tasks, and Chat through all MCP clients, AI assistants and developer tools.

The most feature-complete Google Workspace MCP server, now with Remote OAuth2.1 multi-user support and 1-click Claude installation.

Support for all free Google accounts (Gmail, Docs, Drive etc) & Google Workspace plans (Starter, Standard, Plus, Enterprise, Non Profit) with expanded app options like Chat & Spaces.
Interested in a private cloud instance? That can be arranged.

See it in action:

google_workspace_mcp.mp4

A quick plug for AI-Enhanced Docs But why?

This README was written with AI assistance, and here's why that matters

As a solo dev building open source tools, comprehensive documentation often wouldn't happen without AI help. Using agentic dev tools like Roo & Claude Code that understand the entire codebase, AI doesn't just regurgitate generic content - it extracts real implementation details and creates accurate, specific documentation.

In this case, Sonnet 4 took a pass & a human (me) verified them 8/9/25.

A production-ready MCP server that integrates all major Google Workspace services with AI assistants. It supports both single-user operation and multi-user authentication via OAuth 2.1, making it a powerful backend for custom applications. Built with FastMCP for optimal performance, featuring advanced authentication handling, service caching, and streamlined development patterns.

Simplified Setup: Now uses Google Desktop OAuth clients - no redirect URIs or port configuration needed!

1. One-Click Claude Desktop Install (Recommended)
  1. Download: Grab the latest google_workspace_mcp.dxt from the β€œReleases” page
  2. Install: Double-click the file – Claude Desktop opens and prompts you to Install
  3. Configure: In Claude Desktop β†’ Settings β†’ Extensions β†’ Google Workspace MCP, paste your Google OAuth credentials
  4. Use it: Start a new Claude chat and call any Google Workspace tool

Why DXT?

Desktop Extensions (.dxt) bundle the server, dependencies, and manifest so users go from download β†’ working MCP in one click – no terminal, no JSON editing, no version conflicts.

Environment - you will configure these in Claude itself, see screenshot: Variable Purpose GOOGLE_OAUTH_CLIENT_ID OAuth client ID from Google Cloud (used by both legacy auth and OAuth 2.1) GOOGLE_OAUTH_CLIENT_SECRET OAuth client secret (used by both legacy auth and OAuth 2.1) USER_GOOGLE_EMAIL (optional) Default email for single-user auth GOOGLE_PSE_API_KEY (optional) API key for Google Custom Search - see Custom Search Setup GOOGLE_PSE_ENGINE_ID (optional) Programmable Search Engine ID for Custom Search MCP_ENABLE_OAUTH21 (optional) Set to true to enable OAuth 2.1 support (requires streamable-http transport & will remove user_google_email from tool docstrings) OAUTHLIB_INSECURE_TRANSPORT=1 Development only (allows http:// redirect)

Claude Desktop stores these securely in the OS keychain; set them once in the extension pane.

install_dxt_workspace.mp4

---
  1. Google Cloud Setup:
API Enablement Links You can enable each one by clicking the links below (make sure you're logged into the Google Cloud Console and have the correct project selected):

1.1. Credentials:

Credential Loading Priority: The server loads credentials in the following order of precedence:

  1. Manually set environment variables (e.g., export VAR=value).
  2. Variables defined in a .env file in the project root.
  3. client_secret.json file specified by GOOGLE_CLIENT_SECRET_PATH.
  4. Default client_secret.json file in the project root.

Why Environment Variables?

  1. Environment:

    export OAUTHLIB_INSECURE_TRANSPORT=1  # Development only
    export USER_GOOGLE_EMAIL=your.email@gmail.com  # Optional: Default email for auth - use this for single user setups and you won't need to set your email in system prompt for magic auth
    export GOOGLE_PSE_API_KEY=your-custom-search-api-key  # Optional: Only needed for Google Custom Search tools
    export GOOGLE_PSE_ENGINE_ID=your-search-engine-id  # Optional: Only needed for Google Custom Search tools
  2. Server Configuration: The server's base URL and port can be customized using environment variables:

Google Custom Search Setup

To use the Google Custom Search tools, you need to:

  1. Create a Programmable Search Engine:

  2. Get an API Key:

  3. Configure Environment Variables:

For detailed setup instructions, see the Custom Search JSON API documentation.

# 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 tasks
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, tasks, chat, search

OAuth 2.1 Support (Multi-User Bearer Token Authentication)

The server includes OAuth 2.1 support for bearer token authentication, enabling multi-user session management. OAuth 2.1 automatically reuses your existing GOOGLE_OAUTH_CLIENT_ID and GOOGLE_OAUTH_CLIENT_SECRET credentials - no additional configuration needed!

When to use OAuth 2.1:

Enabling OAuth 2.1: To enable OAuth 2.1, set the MCP_ENABLE_OAUTH21 environment variable to true.

# OAuth 2.1 requires HTTP transport mode
export MCP_ENABLE_OAUTH21=true
uv run main.py --transport streamable-http

If MCP_ENABLE_OAUTH21 is not set to true, the server will use legacy authentication, which is suitable for clients that do not support OAuth 2.1.

Innovative CORS Proxy Architecture

This implementation solves two critical challenges when using Google OAuth in browser environments:

  1. Dynamic Client Registration: Google doesn't support OAuth 2.1 dynamic client registration. Our server provides a clever proxy that accepts any client registration request and returns the pre-configured Google OAuth credentials, allowing standards-compliant clients to work seamlessly.

  2. CORS Issues: Google's OAuth endpoints don't include CORS headers, blocking browser-based clients. We implement intelligent proxy endpoints that:

This architecture enables any OAuth 2.1 compliant client to authenticate users through Google, even from browser environments, without requiring changes to the client implementation.

MCP Inspector: No additional configuration needed with desktop OAuth client.

Claude Code Inspector: No additional configuration needed with desktop OAuth client.

VS Code MCP Client Support

VS Code mcp.json Configuration Example:

{
    "servers": {
        "google-workspace": {
            "url": "http://localhost:8000/mcp/",
            "type": "http"
        }
    }
}
Connect to Claude Desktop

The server supports two transport modes:

Stdio Mode (Default - Recommended for Claude Desktop)

In general, you should use the one-click DXT installer package for Claude Desktop. If you are unable to for some reason, you can configure it manually via claude_desktop_config.json

Manual Claude Configuration (Alternative)

  1. Open Claude Desktop Settings β†’ Developer β†’ Edit Config
    1. macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
    2. Windows: %APPDATA%\Claude\claude_desktop_config.json
  2. Add the server configuration:
    {
      "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",
            "OAUTHLIB_INSECURE_TRANSPORT": "1"
          }
        }
      }
    }
2. Advanced / Cross-Platform Installation

If you’re developing, deploying to servers, or using another MCP-capable client, keep reading.

# Requires Python 3.10+ and uvx
export GOOGLE_OAUTH_CLIENT_ID="xxx"
export GOOGLE_OAUTH_CLIENT_SECRET="yyy"
uvx workspace-mcp --tools gmail drive calendar

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.

If you're running the MCP server behind a reverse proxy (nginx, Apache, Cloudflare, etc.), you'll need to configure GOOGLE_OAUTH_REDIRECT_URI to match your external URL:

Problem: When behind a reverse proxy, the server constructs redirect URIs using internal ports (e.g., http://localhost:8000/oauth2callback) but Google expects the external URL (e.g., https://your-domain.com/oauth2callback).

You also have options for: | OAUTH_CUSTOM_REDIRECT_URIS (optional) | Comma-separated list of additional redirect URIs | | OAUTH_ALLOWED_ORIGINS (optional) | Comma-separated list of additional CORS origins |

Solution: Set GOOGLE_OAUTH_REDIRECT_URI to your external URL:

# External URL without port (nginx/Apache handling HTTPS)
export GOOGLE_OAUTH_REDIRECT_URI="https://your-domain.com/oauth2callback"

# Or with custom port if needed
export GOOGLE_OAUTH_REDIRECT_URI="https://your-domain.com:8443/oauth2callback"

Important:

# 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 with specific tools only
uvx workspace-mcp --tools gmail drive calendar tasks

# Start in HTTP mode for debugging
uvx workspace-mcp --transport streamable-http

Requires Python 3.10+ and uvx. The package is available on PyPI.

For development or customization:

git clone https://github.com/taylorwilsdon/google_workspace_mcp.git
cd google_workspace_mcp
uv run main.py

Development Installation (For Contributors):

{
  "mcpServers": {
    "google_workspace": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/path/to/repo/google_workspace_mcp",
        "main.py"
      ],
      "env": {
        "GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
        "GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret",
        "OAUTHLIB_INSECURE_TRANSPORT": "1"
      }
    }
  }
}
HTTP Mode (For debugging or web interfaces)

If you need to use HTTP mode with Claude Desktop:

{
  "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 uses Google Desktop OAuth for simplified authentication:

When calling a tool:

  1. Server returns authorization URL
  2. Open URL in browser and authorize
  3. Google provides an authorization code
  4. Paste the code when prompted (or it's handled automatically)
  5. Server completes authentication and retries your request

Note: All tools support automatic authentication via @require_google_service() decorators with 30-minute service caching.

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 and custom reminders modify_event Update existing events with intelligent reminder handling delete_event Remove events 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 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 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 update_doc_text Insert or replace text at specific positions find_and_replace_doc Find and replace text throughout document format_doc_text Apply text formatting (bold, italic, underline, fonts) insert_doc_elements Add tables, lists, or page breaks insert_doc_image Insert images from Drive or URLs update_doc_headers_footers Modify document headers and footers batch_update_doc Execute multiple document operations atomically read_doc_comments Read all comments and replies create_doc_comment Create new comments reply_to_comment Reply to existing comments resolve_comment Resolve comments 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 read_sheet_comments Read all comments and replies create_sheet_comment Create new comments reply_to_sheet_comment Reply to existing comments resolve_sheet_comment Resolve comments Tool Description create_presentation Create new presentations get_presentation Retrieve presentation details batch_update_presentation Apply multiple updates at once get_page Get specific slide information get_page_thumbnail Generate slide thumbnails read_presentation_comments Read all comments and replies create_presentation_comment Create new comments reply_to_presentation_comment Reply to existing comments resolve_presentation_comment Resolve comments 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 Tool Description list_task_lists List all task lists with pagination support get_task_list Retrieve details of a specific task list create_task_list Create new task lists with custom titles update_task_list Modify existing task list titles delete_task_list Remove task lists and all contained tasks list_tasks List tasks in a specific list with filtering options get_task Retrieve detailed information about a specific task create_task Create new tasks with title, notes, due dates, and hierarchy update_task Modify task properties including title, notes, status, and due dates delete_task Remove tasks from task lists move_task Reposition tasks within lists or move between lists clear_completed_tasks Hide all completed tasks from a list 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 Tool Description search_custom Perform web searches using Programmable Search Engine get_search_engine_info Retrieve search engine metadata and configuration search_custom_siterestrict Search within specific sites/domains
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
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
🌐 Integration with Open WebUI

To use this server as a tool provider within Open WebUI:

Instant Start (No Config Needed)

Just copy and paste the below, set your values and you're off!

GOOGLE_OAUTH_CLIENT_ID="your_client_id" GOOGLE_OAUTH_CLIENT_SECRET="your_client_secret" uvx mcpo --port 8000 --api-key "top-secret" -- uvx workspace-mcp

Otherwise:

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:

{
  "mcpServers": {
    "google_workspace": {
      "type": "streamablehttp",
      "url": "http://localhost:8000/mcp"
    }
  }
}
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.

  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 configuration

The Google Workspace tools should now be available when interacting with models in Open WebUI.

MIT License - see LICENSE file for details.

Validations:


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4