Skip to main content
Glama
MCP Google Multi-Account Server

MCP Google Multi-Account Server

by bkbaheti

MCP Google Multi-Account Server

Beta Notice: This package uses OAuth credentials that are pending Google's verification review. During this period, access is by-invite only — you must be added as a test user in the Google Cloud Console to complete OAuth. Alternatively, you can bring your own OAuth credentials. Once Google approval is granted, this notice will be removed.

An MCP (Model Context Protocol) server for accessing multiple Google accounts from Claude Code, Claude Desktop, or any MCP-compatible client. Supports Gmail, Google Drive, and Google Calendar.

Just talk to Claude naturally:

"Check my email"
"Find messages from my boss this week"
"Write a reply thanking them for the update"
"Send it"

No special commands to memorize - Claude understands what you want.

Quick Start

No Google Cloud setup needed -- just install and connect your Google account:

Claude Code CLI:

claude mcp add proGoogleMCP -- npx -y @procedure-tech/mcp-google

Claude Desktop -- add to your claude_desktop_config.json:

{
  "mcpServers": {
    "proGoogleMCP": {
      "command": "npx",
      "args": ["-y", "@procedure-tech/mcp-google"]
    }
  }
}

Then use the google_add_account tool to connect your Google account. That's it!

Related MCP server: Google Workspace MCP

Features

  • Zero config: Works out of the box -- no Google Cloud project setup required

  • Natural language: Just describe what you want - "find my unread emails", "draft a reply"

  • Multi-account support: Connect work, personal, and other accounts - search across all of them

  • Full Gmail access: Search, read, compose, send, and organize emails

  • Google Drive: Search, preview, download to disk, upload from disk, and share files

  • Google Calendar: View, create, update, and manage events

  • Attachments: Download and send file attachments

  • Inbox management: Labels, archive, trash, read/unread status

  • Filters & vacation: Create email filters and configure vacation responders

  • AI productivity: Thread summaries, smart reply suggestions, action item extraction

  • Safety first: All sends require confirmation - Claude shows you the draft before sending

  • Privacy focused: All credentials stored locally on your machine

Installation

From npm

npx -y @procedure-tech/mcp-google

Local Development

git clone https://github.com/bkbaheti/google-multi-account-mcp.git
cd google-multi-account-mcp
pnpm install
pnpm build

Prerequisites

  1. Node.js 20+ - Required runtime

  2. Claude Code or Claude Desktop - MCP client to connect to this server

That's it! OAuth credentials are built in. See Advanced: Bring Your Own OAuth Credentials if you want to use your own GCP project.

Configuration

Configure Claude Code (CLI)

# Add to current project only (default)
claude mcp add proGoogleMCP -- npx -y @procedure-tech/mcp-google

# Add globally (available in all projects)
claude mcp add -s user proGoogleMCP -- npx -y @procedure-tech/mcp-google

# With passphrase for token encryption
claude mcp add -s user proGoogleMCP -e MCP_GOOGLE_PASSPHRASE=optional-passphrase -- npx -y @procedure-tech/mcp-google

To verify or remove:

claude mcp list                # List configured servers
claude mcp remove proGoogleMCP # Remove this server

Configure Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "proGoogleMCP": {
      "command": "npx",
      "args": ["-y", "@procedure-tech/mcp-google"]
    }
  }
}

Advanced: Bring Your Own OAuth Credentials

If you prefer to use your own GCP project, you can override the built-in defaults:

  • Environment variables: Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET

  • Config file: Add oauth.clientId and oauth.clientSecret to ~/.config/mcp-google/config.json

Priority: environment variables > config file > built-in defaults.

Step 1: Create a Google Cloud Project

  1. Go to Google Cloud Console

  2. Create a new project (or select an existing one)

Step 2: Enable APIs

  1. Go to APIs & Services > Library

  2. Enable the APIs you need: Gmail API, Google Drive API, Google Calendar API

  1. Go to APIs & Services > OAuth consent screen

  2. Select External user type (unless you have Google Workspace)

  3. Fill in the required fields (app name, support email, developer contact)

  4. Add the scopes you need (e.g., Gmail, Drive, Calendar)

  5. Add your Google email as a test user

Step 4: Create OAuth 2.0 Client ID

  1. Go to APIs & Services > Credentials

  2. Click Create Credentials > OAuth client ID

  3. Select Desktop app as the application type

  4. Copy the Client ID and Client Secret

Step 5: Redirect URI — nothing to configure

Desktop app clients have no "Authorized redirect URIs" field, and none is needed. The server binds an OS-assigned port on 127.0.0.1 for each OAuth flow and Google accepts any loopback port for this client type.

If you created a Web application client instead, the loopback flow will not work — Web clients require every redirect URI to be registered exactly, and the port is not fixed. Create a Desktop app client.

Step 6: Configure

Set via environment variables:

export GOOGLE_CLIENT_ID="your-client-id.apps.googleusercontent.com"
export GOOGLE_CLIENT_SECRET="your-client-secret"

Or add to ~/.config/mcp-google/config.json:

{
  "version": 1,
  "oauth": {
    "clientId": "your-client-id.apps.googleusercontent.com",
    "clientSecret": "your-client-secret"
  }
}

Usage

Getting Started

  1. Start Claude Code (or restart if already running to pick up config changes)

  2. Verify the server is connected and check the version:

    "What version of the Google MCP server is running?"

    Claude will show the version, git commit, and build date.

  3. Add a Google account:

    "Add my Gmail account"

    Claude will:

    • Ask which capabilities you need — pick a preset (read-only, inbox-assistant, scheduler) or choose individual capabilities like mail:read or drive:appfiles

    • Show you an authorization URL to open in your browser

    • After you complete OAuth in the browser, Claude will confirm the account was added

  4. Start using your email:

    "Find my unread emails"
    "Search for emails from john@example.com"
    "Draft a reply to the last email"

Note: These examples are natural language - Claude understands your intent and uses the appropriate MCP tools automatically. You don't need to know the tool names.

Example Conversations

Here are some real-world examples of how to interact with Claude using this MCP server:

Reading and Searching Email

You: "Check my email for anything from Amazon in the last week"
Claude: [Searches and returns matching emails with subjects, dates, and snippets]

You: "Show me the full email about my order"
Claude: [Fetches the complete message with body content]

You: "What attachments are in that email?"
Claude: [Lists any attachments with filenames and sizes]

Composing and Sending

You: "Write an email to sarah@example.com thanking her for the meeting"
Claude: I'll draft that email for you.
       [Creates draft]
       Here's the draft:
       To: sarah@example.com
       Subject: Thank you for the meeting
       ...
       Would you like me to send it, or make any changes?

You: "Looks good, send it"
Claude: [Sends the email with confirmation]

Managing Your Inbox

You: "Archive all emails from newsletters@example.com"
Claude: [Archives matching messages]

You: "Create a label called 'Urgent' with a red color"
Claude: [Creates the label]

You: "Mark the last 5 unread emails as read"
Claude: [Updates the messages]

Multi-Account Workflows

You: "Add my work Gmail account"
Claude: Which capabilities would you like?
        - read-only: Read mail, Drive, and calendar (preset)
        - inbox-assistant: Read, send, and organize mail (preset)
        - Or pick individual capabilities: mail:read, mail:compose, mail:modify, ...

You: "inbox-assistant, please"
Claude: [Opens OAuth flow for work account]

You: "Label my work account as 'work' and my personal as 'personal'"
Claude: [Sets labels on both accounts]

You: "Search for 'project update' across all my accounts"
Claude: [Searches both accounts and shows combined results]

AI-Powered Productivity

You: "Summarize this email thread"
Claude: [Analyzes the thread and provides]:
        - Main topic: Q3 budget review
        - Participants: Finance team (5 people)
        - Key decisions: Budget approved with 10% increase
        - Action items: Submit receipts by Friday

You: "What action items do I have from my unread emails?"
Claude: [Scans unread messages and extracts tasks with deadlines]

You: "Suggest a reply to the last email"
Claude: Based on the context, here are 3 options:
        1. Brief: "Thanks, I'll review and get back to you."
        2. Detailed: [longer response addressing all points]
        ...
        Which would you like me to draft?

Setting Up Automation

You: "Create a filter to auto-archive emails from noreply@example.com"
Claude: I'll create that filter. This will automatically archive
        all future emails from that sender. Confirm?

You: "Yes"
Claude: [Creates the filter]

You: "Set up my vacation responder - I'm out Dec 20-27"
Claude: What message would you like to send?

You: "Just say I'm on holiday and will respond when I return"
Claude: [Configures vacation responder with dates]

Capabilities

When adding an account, Claude will ask which capabilities you need. Each capability is an independent, per-service grant — pick only what you actually need:

Capability

Can do

Cannot do

Reach

Scopes

mail:read (Read mail)

Read and search your email, and list your labels.

Cannot send, reply, label, archive or delete anything.

Every message and label in the mailbox.

gmail.readonly

mail:compose (Compose mail)

Write drafts and send email. Despite the name, this capability sends — it does not only compose.

Cannot read any message already in your mailbox, not even replies to what it sends.

Drafts and messages this capability creates.

gmail.compose

mail:modify (Full mail)

Read, send, and organise mail: labels, archive, trash. Includes everything mail:read and mail:compose do — you do not need to grant those as well.

Cannot manage filters or the vacation auto-reply.

Every message and label in the mailbox.

gmail.modify, gmail.labels

mail:settings (Mail settings)

Manage filters and the vacation auto-reply.

Cannot read or send mail.

Mailbox-wide filter and vacation-responder settings.

gmail.settings.basic

drive:read (Read Drive)

See and download every file in this Drive, read-only. Includes files other people shared with you, and every Shared Drive you belong to.

Cannot create, edit, move or share anything.

Every file and Shared Drive the account can see.

drive.readonly

drive:appfiles (App-created Drive files)

Create files and folders, and read, edit, share and delete the ones within its reach.

Cannot see anything else in your Drive — searches return an empty list rather than an error.

Files this server created, plus files you explicitly opened with it.

drive.file

calendar:read (Read calendar)

See your calendars, your events, and when you are free or busy. Required to list which calendars exist.

Cannot create or change events.

Every calendar the account can see.

calendar.readonly

calendar:write (Write calendar)

Create, edit, move, delete events, and RSVP.

Cannot list your calendars or check free/busy — grant calendar:read as well, or the agent can only reach the "primary" calendar.

Events on calendars the account can write to.

calendar.events

How it works:

  • Capabilities are independent per service — grant any combination you like.

  • The one exception: mail:modify already includes everything mail:read and mail:compose do, so you never need to grant those alongside it.

  • drive:read and drive:appfiles are deliberately independent, not tiers of each other — drive:read sees everything in the Drive read-only, drive:appfiles can create/edit/delete but only within files this app touched. Grant both if you want broad read plus app-created writes.

  • For the common cases, start from a preset instead of picking capabilities one by one:

    • read-only → mail:read, drive:read, calendar:read

    • inbox-assistant → mail:modify (read, send, and organize mail)

    • scheduler → calendar:read + calendar:write

  • Presets are just a shortcut — they expand to the same capabilities above before anything is stored, and you can still add more on top.

Examples:

You: "Add my Gmail account"
Claude: Which capabilities would you like? Pick a preset (read-only,
        inbox-assistant, scheduler) or choose individually.
        [Shows options]

You: "I just want to read emails"
Claude: [Adds with mail:read]

You: "Actually, I need to send emails too"
Claude: I'll reauth this account to add mail:compose — your account ID,
        alias, and labels all stay the same. Want me to do that?

Available Tools

You don't need to memorize tool names - just describe what you want. Here's what's available:

Account Management

Just Say...

What Happens

"Show my Google accounts"

Lists all connected accounts

"Add my Gmail account"

Starts OAuth flow to add account

"Reconnect my work account"

Re-runs OAuth, keeps alias/labels/ID

"Give my account Drive read access"

Reauths with drive:read added

"Remove my work account"

Disconnects account and revokes tokens

"Label this account as 'personal'"

Tags account for easy reference

Reading Email (mail:read)

Just Say...

What Happens

"Find emails from john@example.com"

Searches with Gmail query syntax

"Show me unread emails from this week"

Returns matching messages

"Get the full email about the project"

Fetches complete message content

"Show me that entire conversation"

Gets thread with all messages

"What attachments are in this email?"

Lists files with names and sizes

"Download the PDF attachment"

Retrieves the file data

Gmail search tips: Use Gmail's search syntax for powerful queries:

  • from:someone@example.com - From specific sender

  • subject:meeting - Subject contains word

  • is:unread - Unread messages only

  • has:attachment - Messages with attachments

  • newer_than:7d - Last 7 days

  • label:important - Has specific label

Composing Email (mail:compose)

Just Say...

What Happens

"Write an email to sarah@example.com"

Creates a draft for review

"Draft a reply to the last email"

Creates reply with proper threading

"Attach report.pdf to this draft"

Adds attachment to draft

"Update the draft - change the subject"

Modifies existing draft

"Show me my draft before sending"

Previews the draft

"Delete that draft"

Removes the draft

"Send the email"

Sends after confirmation

Safety feature: All emails go through a draft-first workflow. Claude will always show you the draft and ask for confirmation before sending.

Inbox Management (mail:modify)

Just Say...

What Happens

"Show my labels"

Lists all Gmail labels

"Create a 'Projects' label in blue"

Creates label with color

"Rename 'Old' label to 'Archive'"

Updates label properties

"Delete the 'Temp' label"

Removes label (keeps messages)

"Add the 'Important' label to this email"

Applies label to message

"Label these 50 emails as 'Done'"

Bulk label operation

"Mark this as read"

Changes read status

"Archive this email"

Removes from inbox

"Delete this email"

Moves to trash

"Restore from trash"

Recovers deleted message

Filters & Vacation (mail:settings)

Just Say...

What Happens

"Show my email filters"

Lists automatic rules

"Create a filter for newsletters"

Sets up auto-processing

"Delete the filter for old@example.com"

Removes automation rule

"Check my vacation settings"

Shows auto-reply config

"Turn on vacation responder"

Enables auto-reply

"I'm back - disable vacation reply"

Turns off auto-reply

AI Productivity Prompts

These prompts guide Claude through complex workflows:

Just Say...

What Happens

"Help me compose an email"

Guided drafting with preview and confirmation

"Help me reply to this thread"

Proper threading, tone matching

"Review my pending drafts"

Shows drafts, offers send/edit/delete

"Summarize this email thread"

Extracts key points, decisions, action items

"Suggest replies for this email"

Offers brief/standard/detailed options

"What action items do I have?"

Scans emails for tasks and deadlines

"Help me organize my inbox"

Suggests labels for uncategorized emails

Technical Reference

Account Management:

  • google_version, google_list_accounts, google_add_account, google_check_pending_auth, google_reauth_account, google_remove_account, google_set_account_labels, google_set_account_alias, google_set_account_description

Gmail Reading:

  • gmail_search_messages, gmail_get_message, gmail_get_messages_batch, gmail_get_thread, gmail_list_attachments, gmail_get_attachment

Gmail Composing:

  • gmail_create_draft, gmail_create_draft_with_attachment, gmail_update_draft, gmail_get_draft, gmail_delete_draft, gmail_send_draft, gmail_reply_in_thread

Inbox Management:

  • gmail_list_labels, gmail_create_label, gmail_update_label, gmail_delete_label, gmail_modify_labels, gmail_batch_modify_labels, gmail_mark_read_unread, gmail_archive, gmail_trash, gmail_untrash

Settings:

  • gmail_list_filters, gmail_create_filter, gmail_delete_filter, gmail_get_vacation, gmail_set_vacation

Google Drive:

  • drive_list_shared_drives, drive_search_files, drive_list_files, drive_get_file, drive_get_file_content, drive_get_full_file_content, drive_download_file, drive_upload_file, drive_create_folder, drive_move_file, drive_copy_file, drive_rename_file, drive_trash_file, drive_share_file, drive_update_permissions — all tools work with Shared Drives (Team Drives)

Google Calendar:

  • calendar_list_calendars, calendar_list_colors, calendar_list_events, calendar_get_event, calendar_search_events, calendar_freebusy, calendar_create_event, calendar_update_event, calendar_delete_event, calendar_rsvp, calendar_move_event

    • calendar_list_calendars reports accessRole and a derived canEdit per calendar, so a shared calendar you can only read is distinguishable from one you can write to.

    • calendar_create_event and calendar_update_event take addMeet: true to generate a Google Meet link. meetingCode attaches an existing conference instead (a code or a https://meet.google.com/... URL) and needs confirm: true, because a reused conference keeps its access bound to the original event's guest list. calendar_update_event also takes removeConferencing: true.

    • Event colours. Every read tool returns the event's colorId. calendar_create_event and calendar_update_event take colorId as either an id ("11") or a Calendar colour name ("Tomato", "Basil", …); calendar_update_event takes resetColor: true to put an event back on its calendar's colour. calendar_list_colors shows the palette. A colour-only update notifies no attendees and needs no confirm — a guest's copy is coloured by their own settings, so there is nothing for them to see — which is what makes recolouring a run of existing events practical.

MCP Prompts:

  • compose-email, reply-to-email, review-drafts, summarize-thread, smart-reply, extract-action-items, categorize-emails

MCP Resources:

  • accounts://list - List connected accounts

  • cache://stats - Cache statistics

Environment Variables

Variable

Description

MCP_GOOGLE_CONFIG_PATH

Override default config file location

MCP_GOOGLE_PASSPHRASE

Passphrase for encrypted token storage (fallback when keychain unavailable)

MCP_GOOGLE_LOG_LEVEL

Log level: debug, info, warn, error

Troubleshooting

"No refresh token received"

This can happen if you've previously authorized the app. To fix:

  1. Go to Google Account Permissions

  2. Find and remove your MCP app

  3. Say "Add my Gmail account" again

OAuth URL not showing up

When adding an account, the OAuth authorization URL should appear in:

  • Claude Code: Look for a warning-level log message with the URL

  • Claude Desktop: Check the MCP server logs

  • Terminal stderr: The URL is also written to stderr with a visible banner

If you don't see the URL:

  1. Check your MCP client's log output or notification area

  2. The URL is also logged to stderr - check terminal output if running manually

  3. The OAuth flow times out after 5 minutes if not completed

OAuth callback port

The callback server binds an OS-assigned port on 127.0.0.1 for each flow, so there is no fixed port to free up and concurrent flows do not collide. Earlier versions used a fixed port 8089; if you have a firewall rule pinned to that port, it is no longer used.

Keychain access issues (Linux/headless)

If the OS keychain is unavailable, set MCP_GOOGLE_PASSPHRASE:

{
  "env": {
    "MCP_GOOGLE_PASSPHRASE": "your-secure-passphrase"
  }
}

Tokens will be encrypted with AES-256-GCM using this passphrase.

"Capability insufficient" errors

You're trying to do something that requires a capability the account doesn't have.

You: "Archive this email"
Claude: This account only has mail:read. Archiving needs mail:modify.
        Want me to reauth this account to add it? Your account ID,
        alias, and labels all stay the same.

Fix: Say "Reauth this account and add mail:modify" — no need to remove and re-add; google_reauth_account preserves the account ID, alias, description, and labels while updating its capabilities.

MCP server not connecting

  1. Verify the path in your settings is correct and absolute

  2. Ensure you've run pnpm build to compile TypeScript

  3. Check that dist/cli.js exists

  4. Try running manually: node /path/to/dist/cli.js

Common Questions

Q: Can I use multiple Google accounts? Yes! Just say "Add another Gmail account" and repeat the OAuth flow. You can label them ("Label my work account as 'work'") and search across all of them.

Q: Will Claude send emails without asking? No. All sends require explicit confirmation. Claude will always show you the draft first and ask "Would you like me to send this?"

Q: What happens if I accidentally delete an email? Emails go to Trash first and stay there for 30 days. Say "Show my trash" or "Restore that email from trash" to recover it.

Q: Can Claude read my emails when I'm not using it? No. The MCP server only runs when Claude Code/Desktop is active, and only accesses emails when you ask it to.

Development

# Install dependencies
pnpm install

# Build TypeScript
pnpm build

# Watch mode for development
pnpm dev

# Run tests
pnpm test

# Lint and format
pnpm lint:fix
pnpm format

Security Notes

  • Zero-config OAuth: Ships with built-in OAuth credentials (Desktop app type, same pattern as gcloud CLI). You can override with your own credentials if preferred.

  • Local storage: All tokens are stored locally on your machine

  • Keychain preferred: Uses OS keychain when available, falls back to encrypted file

  • Draft-first: All sends require creating a draft first, then explicit confirmation

  • Account isolation: Each account's tokens, cache, and rate limits are isolated

License

MIT

Available Tools

63 tools
calendar_create_eventA

Create a new Google Calendar event. If attendees are included, requires confirm: true as a safety gate since it will send calendar invitations.

Inputs: end (required), start (required), summary (required), accountId (required), +7 more.

calendar_delete_eventA

Delete a Google Calendar event. Requires confirm: true if the event has attendees, since they will be notified of the cancellation.

Inputs: eventId (required), accountId (required), confirm, calendarId.

calendar_freebusyA

Check free/busy status for one or more Google Calendars within a time range.

Inputs: timeMax (required), timeMin (required), accountId (required), calendarIds.

calendar_get_eventA

Get full details for a specific Google Calendar event.

Inputs: eventId (required), accountId (required), calendarId.

calendar_list_calendarsA

List all calendars for a Google account (primary, shared, subscribed).

Inputs: accountId (required).

calendar_list_eventsA

List events from a Google Calendar within a time range. Defaults to primary calendar.

Inputs: accountId (required), timeMax, timeMin, pageToken, +2 more.

calendar_move_eventB

Move a Google Calendar event to a different calendar.

Inputs: eventId (required), accountId (required), destinationCalendarId (required), sourceCalendarId.

calendar_rsvpB

Respond to a Google Calendar invitation (accept, decline, or tentatively accept).

Inputs: eventId (required), response (required), accountId (required), calendarId.

calendar_search_eventsA

Search for Google Calendar events by text query. Searches summary, description, location, and attendees.

Inputs: query (required), accountId (required), timeMax, timeMin, +2 more.

calendar_update_eventA

Update an existing Google Calendar event. Requires confirm: true if the event has attendees or attendees are being added, since it will send update notifications.

Inputs: eventId (required), accountId (required), end, start, +7 more.

drive_copy_fileB

Create a copy of a file in Google Drive. Optionally specify a new name for the copy.

Inputs: fileId (required), accountId (required), name.

drive_create_folderB

Create a new folder in Google Drive.

Inputs: name (required), accountId (required), parentFolderId.

drive_download_fileA

Download a file from Google Drive and save it to a local directory. Google Workspace files (Docs, Sheets, Slides) are exported to standard formats (txt, csv, etc.).

Inputs: fileId (required), accountId (required), outputDir (required), fileName.

drive_get_fileA

Get metadata for a Google Drive file (name, size, type, owners, sharing status, etc.)

Inputs: fileId (required), accountId (required).

drive_get_file_contentA

Get a preview of file content from Google Drive (default: first 10,000 characters). Returns truncated text with metadata (fileName, totalSize, truncated flag). For full content use drive_get_full_file_content. For large/binary files prefer drive_download_file to save to disk instead.

Inputs: fileId (required), accountId (required), maxChars.

drive_get_full_file_contentA

WARNING: Returns the ENTIRE file content — can be very large and may overload your context window. Only use this when you genuinely need the complete file (e.g., for analysis or transformation). Prefer drive_get_file_content (preview) for browsing, or drive_download_file to save large files to disk.

Inputs: fileId (required), accountId (required).

drive_list_filesA

List files in a Google Drive folder. If no folderId is provided, lists files in the user's My Drive root. To list a Shared Drive's top level, pass the Shared Drive ID as folderId (discover IDs with drive_list_shared_drives).

Inputs: accountId (required), folderId, pageToken, maxResults.

drive_list_shared_drivesA

List the Shared Drives (Team Drives) the user is a member of. Use the returned drive IDs as the folderId argument to drive_list_files to browse a Shared Drive, or as driveId on drive_search_files to scope a search.

Inputs: accountId (required), pageSize, pageToken.

drive_move_fileA

Move a file to a different folder in Google Drive.

Inputs: fileId (required), accountId (required), newParentId (required).

drive_rename_fileB

Rename a file in Google Drive.

Inputs: name (required), fileId (required), accountId (required).

drive_search_filesA

Search for files in Google Drive. Searches across My Drive and all Shared Drives the user is a member of by default; pass driveId to scope the search to a single Shared Drive (discover IDs with drive_list_shared_drives). Supports shorthand syntax: type:document, type:spreadsheet, type:pdf, type:folder, type:image, type:video, type:audio (converted to mimeType queries), and content:keyword (searches inside file contents via fullText). Also accepts raw Drive API query syntax (e.g., "name contains 'report'").

Inputs: query (required), accountId (required), driveId, pageToken, +1 more.

drive_share_fileA

Share a Google Drive file by creating a permission. Requires confirm: true as a safety gate since sharing exposes the file to others.

Inputs: role (required), type (required), fileId (required), accountId (required), +4 more.

drive_trash_fileA

Move a file to trash in Google Drive.

Inputs: fileId (required), accountId (required).

drive_update_permissionsA

Update an existing permission on a Google Drive file. Requires confirm: true as a safety gate since permission changes affect access control.

Inputs: role (required), fileId (required), accountId (required), permissionId (required), +1 more.

drive_upload_fileA

Upload a file to Google Drive. Provide content as UTF-8 text, base64-encoded binary (set isBase64: true), or a local file path (the server reads the file from disk).

Inputs: name (required), mimeType (required), accountId (required), content, +3 more.

gmail_archiveA

Archive a Gmail message by removing it from INBOX. The message remains in All Mail and can still be found via search. Requires full scope.

Inputs: accountId (required), messageId (required).

gmail_batch_modify_labelsA

Apply label changes to multiple messages in one operation. More efficient than individual modifications. Limited to 1000 messages. Requires full scope.

Inputs: accountId (required), messageIds (required), confirm, addLabelIds, +1 more.

gmail_bulk_save_attachmentsA

Download all attachments from one or more Gmail messages to a local directory. Returns a manifest of saved files. Requires readonly scope.

Inputs: accountId (required), outputDir (required), messageIds (required), filenamePrefix.

gmail_create_draftA

Create a draft email. The draft can be reviewed, updated, and sent later. Requires compose or full scope.

Inputs: to (required), body (required), subject (required), accountId (required), +6 more.

gmail_create_draft_with_attachmentA

Create a draft email with file attachments. Each attachment can provide base64-encoded data directly OR a local file path (the server reads the file from disk). The draft can be reviewed and sent later. Requires compose or full scope. Max 25MB total attachment size.

Inputs: to (required), body (required), subject (required), accountId (required), +7 more.

gmail_create_filterA

Create a Gmail filter to automatically process incoming messages. Criteria define which messages match; actions define what happens to them. Requires settings scope and confirmation.

Inputs: action (required), confirm (required), criteria (required), accountId (required).

gmail_create_labelA

Create a new Gmail label with optional color and visibility settings. Requires full scope.

Inputs: name (required), accountId (required), textColor, backgroundColor, +2 more.

gmail_delete_draftB

Delete a draft email

Inputs: draftId (required), accountId (required).

gmail_delete_filterA

Delete a Gmail filter by ID. Use gmail_list_filters to see existing filters. Requires settings scope and confirmation.

Inputs: confirm (required), filterId (required), accountId (required).

gmail_delete_labelA

Delete a Gmail label. Messages with this label will not be deleted, they will just lose the label. System labels cannot be deleted. Requires full scope.

Inputs: labelId (required), accountId (required), confirm.

gmail_get_attachmentA

Download an attachment from a Gmail message and save it to local disk. Use gmail_list_attachments first to get filenames. Returns file path and metadata (no binary data in response). Requires readonly scope.

Inputs: filename (required), accountId (required), messageId (required), outputDir (required).

gmail_get_draftA

Get a draft email with full content for preview before sending

Inputs: draftId (required), accountId (required).

gmail_get_messageA

Get a single Gmail message by ID with headers and body content

Inputs: accountId (required), messageId (required), format.

gmail_get_messages_batchA

Fetch multiple Gmail messages in a single call. More efficient than fetching individually. Limited to 50 messages per call.

Inputs: accountId (required), messageIds (required), format.

gmail_get_threadA

Get a Gmail thread with all its messages

Inputs: threadId (required), accountId (required), format.

gmail_get_vacationA

Get the vacation auto-reply settings for an account. Shows whether vacation responder is enabled and its configuration. Requires settings scope.

Inputs: accountId (required).

gmail_list_attachmentsA

List all attachments in a Gmail message. Returns attachment IDs, filenames, MIME types, and sizes. Requires readonly scope.

Inputs: accountId (required), messageId (required).

gmail_list_filtersA

List all Gmail filters for an account. Filters automatically process incoming messages based on criteria. Requires settings scope.

Inputs: accountId (required).

gmail_list_labelsA

List all Gmail labels (system labels like INBOX, SENT, etc. and custom user labels). Requires full scope.

Inputs: accountId (required).

gmail_mark_read_unreadA

Mark a Gmail message as read or unread. This is a shortcut for modifying the UNREAD label. Requires full scope.

Inputs: accountId (required), messageId (required), markAsRead (required).

gmail_modify_labelsA

Add or remove labels from a Gmail message. Use label IDs (e.g., "INBOX", "STARRED", "IMPORTANT", or custom label IDs). Requires full scope.

Inputs: accountId (required), messageId (required), addLabelIds, removeLabelIds.

gmail_reply_in_threadA

Reply to an existing email thread. Creates a draft reply and optionally sends it. Requires compose or full scope.

Inputs: to (required), body (required), subject (required), threadId (required), +8 more.

gmail_search_messagesB

Search for messages in Gmail using Gmail search syntax (e.g., "from:user@example.com", "subject:hello", "is:unread")

Inputs: query (required), accountId (required), pageToken, maxResults.

gmail_send_draftA

Send a draft email. IMPORTANT: This will actually send the email. You MUST pass confirm: true to proceed. Requires compose or full scope.

Inputs: confirm (required), draftId (required), accountId (required).

gmail_set_vacationA

Configure the vacation auto-reply settings. Can enable or disable the vacation responder. Enabling requires confirmation. Requires settings scope.

Inputs: accountId (required), enableAutoReply (required), confirm, endTime, +6 more.

gmail_trashA

Move a Gmail message to Trash. The message will be permanently deleted after 30 days. Requires full scope.

Inputs: accountId (required), messageId (required).

gmail_untrashA

Restore a Gmail message from Trash back to the mailbox. Requires full scope.

Inputs: accountId (required), messageId (required).

gmail_update_draftA

Update an existing draft email. Replaces the entire draft content. Requires compose or full scope.

Inputs: to (required), body (required), draftId (required), subject (required), +7 more.

gmail_update_labelA

Update a Gmail label (rename, change color, visibility). System labels cannot be modified. Requires full scope.

Inputs: labelId (required), accountId (required), name, textColor, +3 more.

google_add_accountA

Add a new Google account via OAuth. Returns an authorization URL that you must show to the user. The user opens this URL in their browser to authorize. After authorization, use google_check_pending_auth to complete the process. Tiers: mail_readonly (default), mail_compose, mail_full, mail_settings, drive_readonly, drive_full, calendar_readonly, calendar_full, or all.

Inputs: scopeTier, scopeTiers.

google_check_pending_authA

Check the status of a pending Google account authorization. Call this after the user has completed the OAuth flow in their browser. Returns the connected account info if successful.

Inputs: sessionId (required).

google_list_accountsA

List all connected Google accounts

Inputs: no named parameters.

google_reauth_accountA

Re-authenticate an existing Google account. Use this when a refresh token is invalidated (e.g., password change, revoked access, expired grant) or when you need to add/change scope tiers without losing the account ID, alias, description, or labels. Returns an authorization URL. After the user authorizes, call google_check_pending_auth with the sessionId. If no scope tier is given, the account's current scopes are reused. The authorized Google account must match the existing email; otherwise the reauth fails.

Inputs: accountId (required), scopeTier, scopeTiers.

google_remove_accountB

Remove a Google account and revoke its tokens

Inputs: accountId (required).

google_set_account_aliasA

Set a friendly alias on a Google account (e.g., "work", "personal"). Once set, you can use the alias instead of the account ID in all tool calls. Set to empty string to remove.

Inputs: alias (required), accountId (required).

google_set_account_descriptionA

Set a human-readable description on a Google account (e.g., "Work - engineering team", "Personal Gmail"). This description appears in google_list_accounts output to help identify accounts. Set to empty string to remove.

Inputs: accountId (required), description (required).

google_set_account_labelsB

Set labels on a Google account (e.g., personal, work, school)

Inputs: labels (required), accountId (required).

google_versionA

Get the MCP Google server version, git commit, and build date. Use this to verify which version is running.

Inputs: no named parameters.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 63 tools

    Disambiguation5/5

    Tools are cleanly separated by service prefixes (google_, gmail_, drive_, calendar_) and action verbs (list, get, create, update, delete). Even similar tools like drive_get_file vs drive_get_file_content are clearly differentiated by descriptions.

    Naming Consistency5/5

    All tools follow a consistent snake_case verb_noun pattern with service-specific prefixes. Verbs like list, get, create, update, delete, search are used uniformly across services, making the API predictable.

    Tool Count2/5

    With 63 tools, this server far exceeds the typical 'too many' threshold of 25+. While the broad scope of Gmail, Drive, Calendar, and account management justifies a larger surface, the sheer number could overwhelm an agent and make tool selection harder.

    Completeness5/5

    The server covers the full lifecycle for accounts, Gmail (search, drafts, labels, filters, vacation, attachments), Drive (search, upload, download, share, permissions), and Calendar (CRUD, freebusy, RSVP). Only minor operations like permanent deletion are missing, but trash/archive handles those cases.

    Maintenance

    ActivityStale
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers