Gmail Multi-Inbox MCP Server
A local MCP server plus JSON CLI that gives AI agents access to multiple Google accounts across Gmail, Drive, Sheets, Docs, and Calendar (60 tools), with built-in OAuth onboarding.
Accounts: list configured inboxes and their auth/health status; onboard new accounts with
begin_account_auth/finish_account_auth.Gmail (read): read emails (aggregated across all accounts or one), search with Gmail query syntax, fetch threads, list labels, list/search drafts, fetch and extract text from attachments (PDF, Word, Excel, PPTX, images via OCR).
Gmail (write): send email, create/send/delete drafts, mark read, add/remove labels, archive, trash, create/delete labels, block/unblock senders, unsubscribe from mailing lists, mute threads.
Drive: search/list files, get metadata, download and extract file content, upload files, create folders, rename/move/star/describe, trash, and share files.
Sheets: read/write/append ranges, create spreadsheets, add/rename/delete tabs, format cells, add charts, insert/delete rows and columns.
Docs: read text and title, create docs, append text, find-and-replace, insert tables, apply heading/paragraph styles.
Calendar: list calendars and events, get event details, create/update/delete events (timed, all-day, recurring, attendees).
Agent ergonomics: MCP over stdio or SSE, plus a CLI with
tools,schema, andcallcommands; JSON output,--dry-runvalidation, and fixed exit codes.
Provides tools for managing multiple Gmail accounts, including reading, searching, sending emails, managing labels, drafts, and performing account authentication via OAuth.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Gmail Multi-Inbox MCP Server show me unread emails from all my accounts"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ghub
Gmail, Drive, Sheets, Docs, and Calendar for AI agents, across several Google accounts, as an MCP server and a JSON CLI.
$ ghub call search_emails --json '{"account":"work","query":"is:unread","max_results":10}' \
--fields emails.id,emails.subject --limit 10
{"ok":true,"data":{"emails":[{"id":"...","subject":"..."}]},"meta":{"version":1}}ghub is a local server that gives an AI assistant access to your Google accounts. It speaks the Model Context Protocol (MCP) over stdio or SSE, and the same 60 tools are also available as short CLI calls that print one JSON object. You sign in once per account with a built-in OAuth flow. After that, an agent can read and search across all your inboxes at once, or act on one account you name.
It is for people who run agents (Claude Code, Codex, Claude Desktop, or their own) and use more than one Google account. It exists because most Gmail MCP servers handle one account and need manual token setup.
Features
Multi-account: Configure as many Google accounts as you want. Read and search tools merge results from all enabled accounts when you leave
accountout. Write tools require an explicitaccount.Five Google services: 60 tools across Gmail, Drive, Sheets, Docs, and Calendar.
Built-in OAuth: Onboard an account with
begin_account_authandfinish_account_auth. Refreshed tokens are saved automatically.Attachments:
get_all_attachmentsextracts text from PDF, Word, and Excel files. Images are read with a small macOS Vision OCR helper whenswiftcis available at install time.Agent CLI:
ghub tools,ghub schema TOOL, andghub call TOOLgive structured JSON, bounded output, validation-only--dry-run, and fixed exit codes. See docs/agent-cli.md.Two MCP transports: stdio by default, or HTTP with SSE for hosted setups.
Related MCP server: Gmail MCP Server
Install
You need Node.js 20 or newer.
From a clone (the compiled dist/ is committed, so this works without a build step):
git clone https://github.com/tszaks/ghub.git
cd ghub
npm install
npm run build
node dist/index.js toolsOr from a release tarball (see docs/releases.md):
npm install -g ./ghub-1.7.0.tgz
ghub toolsnpm install runs scripts/build-ocr.sh, which compiles the OCR helper only if swiftc is found (macOS). Without it, image attachments are saved to disk but no text is extracted.
ghub is not published to the npm registry.
Quick start
Create Google OAuth credentials (see Google Cloud setup) and download the JSON file.
Add ghub to your MCP client (see Client configuration).
Ask your agent to call
begin_account_auth, open the URL it returns, then pass the code tofinish_account_auth. Details are in OAuth onboarding.Call
list_accountsto check that each account has a valid token.
Client configuration
ghub runs as node /absolute/path/to/ghub/dist/index.js (or ghub mcp if installed from the tarball). With no arguments it starts the MCP server on stdio.
Claude Code
claude mcp add ghub -- node /absolute/path/to/ghub/dist/index.jsCodex (~/.codex/config.toml)
[mcp_servers.ghub]
command = "node"
args = ["/absolute/path/to/ghub/dist/index.js"]Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"ghub": {
"command": "node",
"args": ["/absolute/path/to/ghub/dist/index.js"]
}
}
}The server starts and lists its tools over stdio with no extra setup. Google calls begin only after you onboard an account.
Configuration
Variable | Default | Purpose |
|
| Where account files and tokens are stored. |
| none | Older name for the same setting. |
|
| Set to |
| none | If set, the server switches to SSE mode and listens on it. Falls back to |
|
| Bind address in SSE mode. |
To pass a variable to the server, add it to the client config, for example claude mcp add ghub -e GMAILMCPCONFIG_DIR=/custom/path -- node /absolute/path/to/ghub/dist/index.js.
Where data is stored
Default configuration location: ~/.gmail-multi-mcp/
~/.gmail-multi-mcp/
├── accounts.json # Master account list
└── accounts/
├── personal/
│ ├── credentials.json # OAuth client credentials
│ ├── token.json # Access/refresh tokens
│ └── meta.json # Account metadata
└── work/
├── credentials.json
├── token.json
└── meta.jsonaccounts.json format
{
"defaultAccount": "personal",
"accounts": [
{
"id": "personal",
"email": "user@gmail.com",
"displayName": "Personal Gmail",
"enabled": true,
"credentialPath": "~/.gmail-multi-mcp/accounts/personal/credentials.json",
"tokenPath": "~/.gmail-multi-mcp/accounts/personal/token.json"
},
{
"id": "work",
"email": "user@company.com",
"displayName": "Work Email",
"enabled": true,
"credentialPath": "~/.gmail-multi-mcp/accounts/work/credentials.json",
"tokenPath": "~/.gmail-multi-mcp/accounts/work/token.json"
}
]
}Google Cloud setup
Before using ghub, you need to set up a Google Cloud project:
1. Create a Google Cloud Project
Go to Google Cloud Console
Create a new project or select an existing one
Note your project ID
2. Enable Gmail API
In your project, go to APIs & Services > Library
Search for "Gmail API"
Click Enable
Enable Google Drive, Google Sheets, Google Docs, and Google Calendar APIs for the corresponding tools you plan to use.
3. Create OAuth 2.0 Credentials
Go to APIs & Services > Credentials
Click + CREATE CREDENTIALS > OAuth client ID
If prompted, configure the OAuth consent screen:
Choose "External" user type
Fill in required fields (app name, support email)
Add your email to test users
For application type, select Desktop app
Give it a name (e.g., "Gmail MCP Client")
Click Create
Download the JSON file - you'll need this for authentication
4. OAuth Consent Screen Setup
Go to APIs & Services > OAuth consent screen
Review the existing broad scopes requested by GHub:
https://mail.google.com/https://www.googleapis.com/auth/gmail.settings.basichttps://www.googleapis.com/auth/drivehttps://www.googleapis.com/auth/spreadsheetshttps://www.googleapis.com/auth/documentshttps://www.googleapis.com/auth/calendar
Add your Gmail address(es) as test users
These scopes permit writes and are unchanged by the CLI. Human consent is required during the separate OAuth onboarding flow.
SSE deployment
Set
MCP_TRANSPORT=sseto force HTTP/SSE mode. IfPORTis present, SSE mode starts automatically.The SSE endpoint is
/sseand message posts go to/messages.GET /returns a plain text health line.For Railway, point the start command at
npm startornode dist/index.jsand let Railway providePORT.
The SSE server has no authentication of its own. Anyone who can reach the port can use every configured account. Run it only on a private network or behind your own access control.
OAuth onboarding
Authenticate accounts directly through MCP tools:
Step 1: Start Authentication
Call the begin_account_auth tool with your OAuth credentials:
{
"account_id": "personal",
"email": "user@gmail.com",
"credentials_json": {
"installed": {
"client_id": "YOUR_CLIENT_ID.apps.googleusercontent.com",
"client_secret": "YOUR_CLIENT_SECRET",
"redirect_uris": ["http://localhost"]
}
}
}Or use a file path:
{
"account_id": "personal",
"email": "user@gmail.com",
"credentials_path": "/path/to/credentials.json"
}The tool returns a Google OAuth URL. Open this URL in your browser.
Step 2: Complete Authentication
In your browser, sign in with the Gmail account
Grant the requested permissions
Google redirects you to a localhost URL with a
codeparameterCopy the authorization code from the URL
Call finish_account_auth:
{
"account_id": "personal",
"authorization_code": "4/0AfJoh..."
}Your account is now authenticated and ready to use.
Usage
Example 1: Read Recent Emails from All Accounts
// Aggregates across all enabled accounts
{
"max_results": 20,
"include_body": true
}
// Returns emails with source account indicatedExample 2: Search Across Multiple Accounts
{
"query": "from:boss@company.com is:unread",
"max_results": 10
}
// Searches all enabled accounts, merges and sorts resultsExample 3: Send Email from Specific Account
{
"account": "work",
"to": "colleague@company.com",
"subject": "Project Update",
"body": "Here's the latest on the project...",
"html": false
}Example 4: Read Only from One Account
{
"account": "personal",
"max_results": 10,
"query": "label:important"
}Example 5: Manage Labels
// Create a new label
{
"account": "personal",
"name": "Urgent-2026"
}
// Add label to messages
{
"account": "personal",
"message_ids": ["msg123", "msg456"],
"label_ids": ["Label_789"]
}Example 6: Delete Drafts
// Delete one or more drafts by their draft IDs (returned by create_draft)
{
"account": "personal",
"draft_ids": ["r5457071851533655344", "r774137312565667821"]
}Tools
All 60 tools, taken from the live registry (ghub tools). Kind is read, write, or auth. Parameters for the first Gmail tools are in docs/api-reference.md. For the exact input schema of any tool, run ghub schema TOOL.
Accounts and auth
Tool | Kind | What it does |
| read | List all configured Gmail inbox accounts and their authentication/health status. |
| auth | Start OAuth onboarding for an account. |
| auth | Complete OAuth onboarding by exchanging authorization code and storing token.json. |
Gmail
Tool | Kind | What it does |
| read | Read emails from one account or aggregate across all enabled accounts when account is omitted. |
| read | Search Gmail using query syntax. |
| read | Get a full email thread for one account. |
| read | List labels for one account. |
| write | Mark messages as read in one account. |
| write | Add labels to messages in one account. |
| write | Remove labels from messages in one account. |
| write | Archive messages in one account by removing INBOX label. |
| write | Move messages to trash in one account. |
| write | Create a new Gmail label in one account. |
| write | Delete a Gmail label in one account. |
| write | Block a sender by creating a Gmail filter (same mechanism as Gmail's native "Block" button). |
| read | List all Gmail filters for an account. |
| write | Remove a Gmail filter. |
| write | Unsubscribe from a mailing list by invoking the List-Unsubscribe header (RFC 2369/8058). |
| write | Mute a conversation: archives the thread now and (with scope="subject") installs a subject-based filter so future replies auto-archive. |
| write | Create a draft email in one account. |
| write | Permanently delete one or more drafts in one account. |
| write | Send an existing Gmail draft by draft ID. |
| read | List drafts in an account sorted oldest-first by internalDate. |
| read | Search drafts by Gmail query string. |
| write | Send an email from one account. |
| read | Fetch a single attachment by id. |
| read | Fetch and extract text from every attachment on an email in one call (PDF, Word, Excel, images via OCR). |
Drive
Tool | Kind | What it does |
| read | Search Google Drive file metadata. |
| read | List Google Drive files. |
| read | Get full metadata for a specific Google Drive file including size, parents, export links. |
| read | Download a Drive file and extract its text content. |
| write | Upload a local file to Google Drive. |
| write | Create a new folder in Google Drive. |
| write | Update a Drive file: rename it, move it between folders, star/unstar, or update its description. |
| write | Move a Google Drive file to trash. |
| write | Share a Google Drive file by adding a permission. |
Sheets
Tool | Kind | What it does |
| read | Get Google Sheets spreadsheet metadata: title, sheet tabs, row/column counts. |
| read | Read cell values from a Google Sheet range (e.g., "Sheet1!A1:D10" or "A1:D10" for the first sheet). |
| write | Write values to a Google Sheet range. |
| write | Append rows to a Google Sheet after the last row with data. |
| write | Create a new Google Sheets spreadsheet. |
| write | Add a new sheet tab to an existing spreadsheet. |
| write | Rename a sheet tab in a spreadsheet. |
| write | Delete a sheet tab from a spreadsheet. |
| write | Apply formatting to a range of cells: bold, italic, font size, background/text color, alignment, number format, wrap strategy. |
| write | Create a chart in a Google Sheet from a data range. |
| write | Insert rows or columns into a sheet at a specified position. |
| write | Delete rows or columns from a sheet. |
Docs
Tool | Kind | What it does |
| read | Get the full text content and title of a Google Doc. |
| write | Create a new Google Doc. |
| write | Append text to the end of a Google Doc. |
| write | Find and replace all occurrences of text throughout a Google Doc. |
| write | Insert an empty table at the end of a Google Doc. |
| write | Apply a heading or paragraph style to a text range in a Google Doc by character indices. |
Calendar
Tool | Kind | What it does |
| read | List all Google Calendars for one or all enabled accounts. |
| read | List calendar events. |
| read | Get full details of a single calendar event. |
| write | Create a new calendar event. |
| write | Update an existing calendar event. |
| write | Delete a calendar event. |
Permissions and privacy
Scopes requested: full Gmail access (
https://mail.google.com/), Gmail settings (filters), full Drive, Sheets, Docs, and Calendar. These allow reading and writing. ghub does not narrow them per tool.What it can read: mail, attachments, Drive files, spreadsheets, documents, and calendar events in every account you onboard.
What it can change: send mail, delete drafts, trash mail, create and delete filters, upload, move, share, and trash Drive files, edit Sheets and Docs, and create, update, and delete events. There is no confirmation prompt in the server. Your MCP client's tool approval is the safety check.
Where data goes: ghub talks to Google's APIs and nothing else. It sends no telemetry. Content you read is returned to your MCP client or CLI caller, and from there to whichever model that client uses.
Where credentials live: OAuth client files and tokens are stored in plain JSON under the config directory (
~/.gmail-multi-mcpby default). Protect that folder.credentials.jsonandtoken.jsonare git-ignored.Local files:
send_emailandcreate_draftread attachment paths you give them,upload_drive_filereads a local file, and attachment tools save files to disk.
Using with agents
An agent can discover everything it needs at run time:
ghub tools # names, descriptions, read/write/auth kind
ghub schema search_emails # input schema, output envelope, example
ghub call send_email --dry-run --input - <<'JSON'
{"account":"work","to":"recipient@example.test","subject":"Example","body":"Hello"}
JSONUse --dry-run to validate a write before running it. Mutations never pick a default account. See docs/agent-cli.md for the JSON contract and exit codes, and docs/agent-cli-spec.md for the specification.
FAQ and troubleshooting
"Invalid grant" Error
This usually means your authorization code has expired. Authorization codes are single-use and expire after a few minutes.
Solution: Run begin_account_auth again to get a fresh OAuth URL and authorization code.
"Token has been expired or revoked"
Your refresh token is no longer valid.
Solution:
Delete the
token.jsonfile for the affected accountRun the OAuth flow again (
begin_account_auththenfinish_account_auth)
"Insufficient permissions"
The OAuth token doesn't have the required scopes.
Solution:
Check your Google Cloud OAuth consent screen has all required scopes
Review the current requested scopes, API enablement, and access to the specific resource.
If the grant is missing required scopes, have a human review consent and complete the separate OAuth flow again. CLI calls do not start this automatically.
Account Not Found
The specified account ID doesn't exist in accounts.json.
Solution:
Run
list_accountsto see available accountsEnsure you completed OAuth onboarding for the account
Check that the account is
enabled: trueinaccounts.json
Rate Limiting
Gmail API has rate limits (daily quota and per-user quotas).
Solution:
Check your quota at Google Cloud Console
Implement exponential backoff in your application
Consider applying for increased quota if needed
Contributing
Read CONTRIBUTING.md. Report security problems as described in SECURITY.md. Everyone taking part follows the Code of Conduct. Agents working on the code should read AGENTS.md.
Docs: Agent CLI, CLI spec, API reference, Releases, Changelog.
License
Acknowledgments
Built with the Model Context Protocol SDK
Uses the Google APIs Node.js Client
Built by Tyler Szakacs.
Available Tools
60 toolsadd_labelsB
Add labels to messages in one account (account required).
Inputs: account (required), label_ids (required), message_ids (required).
archive_emailsA
Archive messages in one account by removing INBOX label (account required).
Inputs: account (required), message_ids (required).
begin_account_authB
Start OAuth onboarding for an account. Accepts credentials JSON or a path to credentials.json.
Inputs: email (required), account_id (required), display_name, credentials_json, +1 more.
block_senderA
Block a sender by creating a Gmail filter (same mechanism as Gmail's native "Block" button). Optionally also trashes existing mail from that sender.
Inputs: sender (required), account (required), action, also_trash_existing.
create_draftB
Create a draft email in one account (account required).
Inputs: to (required), body (required), account (required), subject (required), +7 more.
create_drive_folderC
Create a new folder in Google Drive.
Inputs: name (required), account (required), parent_id.
create_eventA
Create a new calendar event. Use start_date_time/end_date_time for timed events or start_date/end_date for all-day events.
Inputs: account (required), summary (required), end_date, location, +9 more.
create_labelB
Create a new Gmail label in one account (account required).
Inputs: name (required), account (required), label_list_visibility, message_list_visibility.
delete_draftsA
Permanently delete one or more drafts in one account (account required). Draft IDs are returned by create_draft or list_drafts.
Inputs: account (required), draft_ids (required).
delete_eventB
Delete a calendar event.
Inputs: account (required), event_id (required), calendar_id (required), send_notifications.
delete_labelB
Delete a Gmail label in one account (account required).
Inputs: account (required), label_id (required).
docs_appendA
Append text to the end of a Google Doc. Optionally apply a heading style and bold/italic.
Inputs: text (required), account (required), document_id (required), bold, +2 more.
docs_apply_styleB
Apply a heading or paragraph style to a text range in a Google Doc by character indices.
Inputs: style (required), account (required), end_index (required), document_id (required), +1 more.
docs_createB
Create a new Google Doc.
Inputs: title (required), account (required).
docs_getA
Get the full text content and title of a Google Doc.
Inputs: account (required), document_id (required).
docs_insert_tableA
Insert an empty table at the end of a Google Doc.
Inputs: rows (required), account (required), columns (required), document_id (required).
docs_replace_textB
Find and replace all occurrences of text throughout a Google Doc.
Inputs: find (required), account (required), document_id (required), replace_with (required), +1 more.
finish_account_authA
Complete OAuth onboarding by exchanging authorization code and storing token.json.
Inputs: account_id (required), authorization_code (required).
get_all_attachmentsA
Call this whenever a thread or email shows attachments. Fetches and extracts content from all attachments in one shot: PDF (text extraction), DOCX, XLSX, PPTX, images (OCR). Use the Gmail message ID ("Gmail ID" from get_email_thread output) — NOT the thread ID. Saves each file to ~/Downloads/mcp-attachments/ and returns extracted text.
Inputs: account (required), email_id (required).
get_attachmentA
Fetch a single attachment by id. Use when you only need one specific file. For all attachments at once, use get_all_attachments instead. Requires the Gmail message ID ("Gmail ID" from get_email_thread) and the attachment_id. Saves to ~/Downloads/mcp-attachments/ and returns extracted text for PDF, DOCX, XLSX, PPTX, text, and images via OCR.
Inputs: account (required), email_id (required), attachment_id (required).
get_drive_fileA
Get full metadata for a specific Google Drive file including size, parents, export links.
Inputs: account (required), file_id (required).
get_drive_file_contentA
Download a Drive file and extract its text content. Google Docs/Sheets/Slides are exported to Office formats then parsed. PDFs, images, and text files are also supported.
Inputs: account (required), file_id (required).
get_email_threadA
Get a full email thread for one account (account required). Each message lists attachment metadata (filename, attachment_id, size). To read attachment content — PDF text, DOCX, XLSX, images via OCR — call get_all_attachments with the Gmail message ID shown as "Gmail ID" in each message.
Inputs: account (required), thread_id (required).
get_eventB
Get full details of a single calendar event.
Inputs: account (required), event_id (required), calendar_id (required).
get_labelsA
List labels for one account (account required).
Inputs: account (required).
list_accountsA
List all configured Gmail inbox accounts and their authentication/health status.
Inputs: no named parameters.
list_blocked_sendersA
List all Gmail filters for an account. Use to find filter_id for unblock_sender, or to audit what is being auto-trashed/archived/spammed.
Inputs: account (required).
list_calendarsA
List all Google Calendars for one or all enabled accounts.
Inputs: account.
list_draftsA
List drafts in an account sorted oldest-first by internalDate. Returns draft_id (for send_draft/delete_drafts), message_id, thread_id, subject, to, and internalDate.
Inputs: account (required), max_results.
list_drive_filesA
List Google Drive files. Omitting account aggregates across all enabled accounts. Optionally filter by folder or text query.
Inputs: query, account, folder_id, page_token, +1 more.
list_eventsA
List calendar events. Omitting account aggregates across all enabled accounts. Supports time range and text search.
Inputs: query, account, time_max, time_min, +3 more.
mark_as_readB
Mark messages as read in one account (account required).
Inputs: account (required), message_ids (required).
mute_threadA
Mute a conversation: archives the thread now and (with scope="subject") installs a subject-based filter so future replies auto-archive. Approximates Gmail's client-side mute.
Inputs: account (required), thread_id (required), scope.
read_emailsB
Read emails from one account or aggregate across all enabled accounts when account is omitted.
Inputs: query, account, max_results, include_body.
remove_labelsA
Remove labels from messages in one account (account required).
Inputs: account (required), label_ids (required), message_ids (required).
search_draftsA
Search drafts by Gmail query string. Returns draft_id (for send_draft/delete_drafts), message_id, thread_id, subject, to, and snippet. Use instead of search_emails when you need to delete or send a found draft.
Inputs: query (required), account (required), max_results.
search_drive_filesA
Search Google Drive file metadata. Omitting account searches all enabled accounts and merges results.
Inputs: query (required), account, max_results.
search_emailsA
Search Gmail using query syntax. Omitting account searches all enabled inboxes and merges results.
Inputs: query (required), account, max_results.
send_draftA
Send an existing Gmail draft by draft ID. Returns message_id and thread_id. Use list_drafts to find draft IDs sorted oldest-first.
Inputs: account (required), draft_id (required).
send_emailC
Send an email from one account (account required).
Inputs: to (required), body (required), account (required), subject (required), +4 more.
sheets_add_chartB
Create a chart in a Google Sheet from a data range.
Inputs: account (required), chart_type (required), data_range (required), sheet_title (required), +6 more.
sheets_add_tabB
Add a new sheet tab to an existing spreadsheet.
Inputs: title (required), account (required), spreadsheet_id (required), index.
sheets_appendA
Append rows to a Google Sheet after the last row with data.
Inputs: range (required), values (required), account (required), spreadsheet_id (required).
sheets_createA
Create a new Google Sheets spreadsheet.
Inputs: title (required), account (required).
sheets_delete_dimensionB
Delete rows or columns from a sheet.
Inputs: count (required), account (required), dimension (required), sheet_title (required), +2 more.
sheets_delete_tabB
Delete a sheet tab from a spreadsheet.
Inputs: account (required), sheet_title (required), spreadsheet_id (required).
sheets_formatB
Apply formatting to a range of cells: bold, italic, font size, background/text color, alignment, number format, wrap strategy.
Inputs: range (required), account (required), sheet_title (required), spreadsheet_id (required), +8 more.
sheets_getA
Get Google Sheets spreadsheet metadata: title, sheet tabs, row/column counts.
Inputs: account (required), spreadsheet_id (required).
sheets_insert_dimensionB
Insert rows or columns into a sheet at a specified position.
Inputs: count (required), account (required), dimension (required), sheet_title (required), +2 more.
sheets_readA
Read cell values from a Google Sheet range (e.g., "Sheet1!A1:D10" or "A1:D10" for the first sheet).
Inputs: range (required), account (required), spreadsheet_id (required), value_render_option.
sheets_rename_tabB
Rename a sheet tab in a spreadsheet.
Inputs: account (required), new_title (required), current_title (required), spreadsheet_id (required).
sheets_writeA
Write values to a Google Sheet range. Overwrites existing values in the specified range.
Inputs: range (required), values (required), account (required), spreadsheet_id (required), +1 more.
trash_drive_fileB
Move a Google Drive file to trash.
Inputs: account (required), file_id (required).
trash_emailsB
Move messages to trash in one account (account required).
Inputs: account (required), message_ids (required).
unblock_senderA
Remove a Gmail filter. Specify either filter_id (exact match) or sender (matches filters whose "from" criteria equals this value).
Inputs: account (required), sender, filter_id.
unsubscribe_from_emailA
Unsubscribe from a mailing list by invoking the List-Unsubscribe header (RFC 2369/8058). Same mechanism as Gmail's native "Unsubscribe" button. Falls back to mailto:. Returns method used.
Inputs: account (required), message_id (required), dry_run.
update_drive_fileB
Update a Drive file — rename it, move it between folders, star/unstar, or update its description.
Inputs: account (required), file_id (required), name, starred, +3 more.
update_eventA
Update an existing calendar event. Only provided fields are changed.
Inputs: account (required), event_id (required), calendar_id (required), status, +10 more.
upload_drive_fileB
Upload a local file to Google Drive.
Inputs: account (required), local_path (required), name, folder_id, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 60 tools
Most tools target distinct resources and actions, with clear descriptions differentiating similar ones (e.g., read_emails vs search_emails, get_attachment vs get_all_attachments). Some minor ambiguity exists, such as list_blocked_senders actually listing all filters, but overall boundaries are clear.
Tool names generally follow a verb_noun pattern, but conventions vary: some use service prefixes (sheets_create, docs_get), while others are unprefixed (list_accounts, send_email). Singular/plural inconsistency (list_drive_files vs get_drive_file) and mixed styles like 'get_drive_file_content' vs 'sheets_read' reduce predictability.
60 tools is excessive for a server named 'Gmail Multi-Inbox', as it includes Drive, Sheets, Docs, and Calendar. Even as a broader Google Workspace toolkit, the count is heavy and may overwhelm agents, though it does support a wide range of operations.
The Gmail surface is thoroughly covered (read, search, threads, labels, drafts, send, attachments, block/unblock, unsubscribe, mute). Other services are also well-covered, with minor gaps like no permanent Drive delete and no Docs delete. Core workflows have no dead ends.
Maintenance
Related MCP Connectors
Manage Gmail end-to-end: search, read, send, draft, label, and organize threads. Automate workflow…
Gmail, Outlook, Drive, OneDrive and calendars for AI agents. Many accounts, one endpoint, audit log.
Give AI agents their own email inboxes: list, read and send mail via scoped, revocable OAuth grants.
Email for AI agents: read, search and send from your Gmail, Outlook, Yahoo, iCloud or IMAP inbox.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceEnables AI assistants to interact with Gmail through natural language, supporting email sending/reading, searching, draft management, label organization, and batch operations with secure OAuth authentication.-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to read, search, organize, and draft emails in Gmail inboxes with support for multiple accounts, OAuth authentication, and 26 comprehensive tools for email management.302 npm3MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Gmail accounts through natural language for tasks like sending, reading, searching, and organizing emails. It supports advanced features including draft management, label operations, and batch actions via secure OAuth 2.0 authentication.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to manage Gmail emails, including sending, searching, and organizing with labels and attachments via OAuth2.41 npm2MIT