Skip to main content
Glama

gworkspace-mcp

Model Context Protocol server for Google Workspace automation: Google Sheets, Apps Script, Drive, Docs, Gmail, and triggers. Built with FastMCP.

Designed to be used from Claude Code (or any MCP-compatible client) so you can edit Apps Script projects, manipulate spreadsheets, send emails and manage Drive files directly from a conversation.

Features

  • Apps Script (9 tools) — list, read, update, create, deploy and run Apps Script projects. Granular file edits so you don't have to rewrite entire scripts.

  • Sheets (10 tools) — read/write ranges, batch updates, formatting, protection, formulas, dashboards.

  • Drive (4 tools) — list, search, move and manage files.

  • Docs (1 tool) — read/edit Google Docs.

  • Gmail (3 tools) — compose and send email.

  • Triggers (3 tools) — manage Apps Script time-based and event triggers.

  • Connect (1 tool) — bind a local Apps Script project to a spreadsheet.

Related MCP server: Google Workspace MCP Server

Requirements

  • Python 3.10+

  • A Google Cloud project with the following APIs enabled:

    • Google Sheets API

    • Google Drive API

    • Apps Script API

    • Google Docs API

    • Gmail API

    • Google Calendar API

  • OAuth 2.0 Desktop credentials (client_secret.json)

Installation

git clone https://github.com/LeooNic/gworkspace-mcp.git
cd gworkspace-mcp
pip install -e .

Or with uv:

uv pip install -e .

Google Cloud setup

  1. Go to console.cloud.google.com and create a project.

  2. Enable the APIs listed above under APIs & Services → Library.

  3. Go to APIs & Services → OAuth consent screen, configure it as External, and add your Google account as a test user.

  4. Go to APIs & Services → Credentials → Create Credentials → OAuth client ID, choose Desktop app, and download the JSON.

  5. Make the credentials available to the server in one of these ways:

    • Place the JSON at ~/.secrets/gworkspace-mcp/client_secret.json, or

    • Set GOOGLE_CLIENT_SECRET_PATH=/full/path/to/client_secret.json, or

    • Set GOOGLE_OAUTH_CLIENT_ID and GOOGLE_OAUTH_CLIENT_SECRET as env vars.

The first time a tool runs, a browser window will open for OAuth consent. The resulting token is stored at ~/.secrets/gworkspace-mcp/token.json and refreshed automatically.

Register with Claude Code

Add this to your Claude Code settings.json (or ~/.claude.json):

{
  "mcpServers": {
    "gworkspace": {
      "command": "gworkspace-mcp"
    }
  }
}

If gworkspace-mcp is not on your PATH, use the absolute path to the executable created by pip install -e . (on Windows, typically C:\Users\<you>\AppData\Local\Programs\Python\Python3XX\Scripts\gworkspace-mcp.exe).

Alternative invocation without installing the entry point:

{
  "mcpServers": {
    "gworkspace": {
      "command": "python",
      "args": ["-m", "gworkspace_mcp.server"]
    }
  }
}

OAuth scopes

The server requests the following scopes:

  • spreadsheets, drive, documents, calendar

  • script.projects, script.deployments, script.processes, script.metrics

  • gmail.send, gmail.compose

  • userinfo.email, userinfo.profile

Security notes

  • Your client_secret.json and token.json are personal — never commit them. The repo .gitignore already excludes them.

  • Tokens live under ~/.secrets/gworkspace-mcp/.

  • The server runs locally; it does not expose any network endpoint.

License

MIT — see LICENSE.

Available Tools

31 tools
drive_copyB

Copy a Drive file (spreadsheet, doc, etc). Returns the new file ID and URL.

Inputs: source (required), new_name (required), folder_id. Returns: Generic wrapper for non-object return types.

drive_create_spreadsheetB

Create a new Google Spreadsheet. Returns ID and URL.

Inputs: name (required), folder_id. Returns: Generic wrapper for non-object return types.

drive_moveC

Move a file to a different folder.

Inputs: file_url (required), dest_folder_id (required). Returns: Generic wrapper for non-object return types.

generate_docsB

Generate functional documentation for a spreadsheet project. Analyzes the spreadsheet structure, script functions, triggers, and manifest to produce a complete technical document.

Args: spreadsheet_url: Spreadsheet URL or ID script_url: Optional Apps Script URL or ID output: "sheet" writes a Documentacion tab in the spreadsheet, "text" returns the doc as text

Inputs: spreadsheet_url (required), script_url, output. Returns: Generic wrapper for non-object return types.

script_add_functionC

Add a new function to an existing file. Appends at the end.

Inputs: script_id (required), file_name (required), source (required). Returns: Generic wrapper for non-object return types.

script_create_fileC

Create a new .gs file in the script project.

Inputs: script_id (required), file_name (required), source. Returns: Generic wrapper for non-object return types.

script_delete_functionB

Delete a function from the script project.

Inputs: script_id (required), function_name (required). Returns: Generic wrapper for non-object return types.

script_edit_functionB

Replace a specific function's source code. Only that function is modified.

Inputs: script_id (required), function_name (required), new_source (required). Returns: Generic wrapper for non-object return types.

script_get_fileC

Get the full source code of a file in the script project.

Inputs: script_id (required), file_name (required). Returns: Generic wrapper for non-object return types.

script_get_functionB

Get the source code of a specific function by name.

Inputs: script_id (required), function_name (required). Returns: Generic wrapper for non-object return types.

script_list_functionsB

List all functions in a script project with their file, signature, and line numbers.

Inputs: script_id (required). Returns: Generic wrapper for non-object return types.

script_runB

Execute a function in a deployed script. Requires API Executable deployment.

Inputs: script_id (required), function_name (required), parameters. Returns: Generic wrapper for non-object return types.

script_update_fileB

Replace the entire content of a file in the script project.

Inputs: script_id (required), file_name (required), source (required). Returns: Generic wrapper for non-object return types.

send_emailB

Send an email via Gmail. Set html=True for HTML body. cc/bcc are comma-separated email addresses.

Inputs: to (required), subject (required), body (required), html, +2 more. Returns: Generic wrapper for non-object return types.

send_email_previewA

Preview an email without sending it. Returns the formatted message.

Inputs: to (required), subject (required), body (required), html. Returns: Generic wrapper for non-object return types.

send_html_emailC

Send an HTML email with optional plain-text fallback.

Inputs: to (required), subject (required), html_body (required), plain_fallback, +1 more. Returns: Generic wrapper for non-object return types.

sheets_add_tableB

Create a Google Sheets Table (the structured table feature, Ctrl+Alt+T). Converts a data range into a formal table with headers, banding, and filtering.

Inputs: spreadsheet (required), sheet_name (required), range_a1 (required), name. Returns: Generic wrapper for non-object return types.

sheets_add_validationC

Add data validation. validation_type: DROPDOWN, CHECKBOX, NUMBER, DATE. For DROPDOWN, pass values as list of options.

Inputs: spreadsheet (required), sheet_name (required), range_a1 (required), validation_type (required), +1 more. Returns: Generic wrapper for non-object return types.

sheets_appendC

Append rows to the end of a sheet.

Inputs: spreadsheet (required), range (required), values (required). Returns: Generic wrapper for non-object return types.

sheets_conditional_formatC

Add conditional formatting. rule_type: NUMBER_GREATER, NUMBER_LESS, NUMBER_EQ, TEXT_CONTAINS, TEXT_NOT_CONTAINS, CUSTOM_FORMULA. For CUSTOM_FORMULA, condition_value is the formula (e.g., '=A1>8').

Inputs: spreadsheet (required), sheet_name (required), range_a1 (required), rule_type (required), +2 more. Returns: Generic wrapper for non-object return types.

sheets_copy_sheetC

Copy a sheet from one spreadsheet to another.

Inputs: source_spreadsheet (required), sheet_name (required), dest_spreadsheet (required). Returns: Generic wrapper for non-object return types.

sheets_describeB

Get full structure of a spreadsheet: sheets, named ranges, protected ranges.

Inputs: spreadsheet (required). Returns: Generic wrapper for non-object return types.

sheets_formatC

Format a range. Colors as hex (#RRGGBB). h_align: LEFT/CENTER/RIGHT.

Inputs: spreadsheet (required), sheet_name (required), range_a1 (required), bold, +6 more. Returns: Generic wrapper for non-object return types.

sheets_protectC

Protect a sheet or range. If range_a1 is None, protects the entire sheet.

Inputs: spreadsheet (required), sheet_name (required), range_a1, description, +1 more. Returns: Generic wrapper for non-object return types.

sheets_readC

Read values from a sheet. Pass spreadsheet URL or ID.

Inputs: spreadsheet (required), range (required), render. Returns: Generic wrapper for non-object return types.

sheets_writeC

Write values to a sheet range. values is a 2D array.

Inputs: spreadsheet (required), range (required), values (required). Returns: Generic wrapper for non-object return types.

trigger_create_time_drivenB

Create a time-driven trigger via Apps Script execution. Generates and runs trigger setup code in the script.

Options:

  • every_minutes: 1, 5, 10, 15, 30

  • every_hours: 1, 2, 4, 6, 8, 12

  • day_of_week + hour: weekly trigger (MONDAY-SUNDAY, hour 0-23)

  • hour only: daily trigger at that hour

Inputs: script_id (required), function_name (required), every_minutes, every_hours, +2 more. Returns: Generic wrapper for non-object return types.

trigger_deleteA

Delete a trigger by ID. Use trigger_list to find IDs.

Inputs: script_id (required), trigger_id (required). Returns: Generic wrapper for non-object return types.

trigger_listB

List all triggers for a script project.

Inputs: script_id (required). Returns: Generic wrapper for non-object return types.

workspace_connectA

Connect to a Google Spreadsheet and discover everything about it.

Args: spreadsheet_url: Spreadsheet URL or ID script_url: Optional. The Apps Script URL or ID (from Extensions > Apps Script). Container-bound scripts don't appear in Drive API (Google limitation), so pass the script URL for full discovery. If omitted, only sheet structure is returned.

Returns: sheet structure, and if script_url is provided: all files with functions, triggers, and deployments.

Inputs: spreadsheet_url (required), script_url. Returns: Generic wrapper for non-object return types.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 31 tools

    Disambiguation4/5

    Most tools have distinct purposes, but some overlap exists. For example, send_email and send_html_email could be confused, and drive_copy/drive_move have similar file manipulation functions. However, clear descriptions help differentiate them.

    Naming Consistency5/5

    Tool names follow a consistent snake_case pattern with clear verb_noun conventions. Drive tools use drive_ prefix, script tools use script_ prefix, sheets tools use sheets_ prefix, and email/trigger/workspace tools follow similar patterns. No mixing of conventions.

    Tool Count2/5

    31 tools is excessive for a single MCP server. While the domain (Google Workspace automation) is broad, this feels like multiple servers combined. A more focused scope with 15-20 tools would be more manageable for agents.

    Completeness5/5

    The tool surface provides comprehensive coverage for Google Workspace automation. It includes full CRUD operations for Drive files, Sheets manipulation, Apps Script development, email sending, and trigger management. The workspace_connect tool provides excellent discovery capabilities.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers