Atlas / MCP servers / bakissation / mcp-google-multi

mcp-google-multiCAUTION

mcp/bakissation/mcp-google-multi

Multi-account Google MCP server for Claude Code: Gmail, Drive, Calendar, Sheets, Docs, Contacts, Search Console, and more. ~871 tools with OAuth2 multi-account switching.

Verdict
CAUTION
Grade
D
Trust score
67 /100
Exposed tools
189 90r · 72w · 27d
Transport
stdio · streamable-http
License
MIT
Stars
15
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

The most complete local Google Workspace MCP server: Gmail, Drive, Calendar, Sheets, Docs, Slides, Forms, Contacts, Tasks, Chat, Meet, Analytics (GA4), Search Console, Classroom, Vault, Admin and more — every OAuth-reachable API method as a tool, across multiple Google accounts at once, from Claude Code or any MCP client.

[](https://www.npmjs.com/package/mcp-google-multi)

  • 🧰 Exhaustive — 940 tools across 29 services, now including Google Analytics (GA4), + an escape hatch for anything else → COVERAGE.md
  • 🔑 Multi-account — drive any number of Google accounts by alias, or fan one call out across all of them
  • 🔒 Private by design — your own OAuth app, tokens encrypted at rest (AES-256-GCM), writes deny-by-default, no telemetry, no metering — it talks only to Google
  • 🌐 Local or remote — runs locally over stdio, or self-hosted over HTTP with its own built-in OAuth 2.1 server (Claude Code's /mcp login and the claude.ai connector, zero custom UI). Pull-and-up Docker Compose with optional automatic HTTPS → remote setup
  • ✉️ Built for real work — send and read email in Markdown with attachments and one-call replies, an interactive setup wizard with a doctor self-check, and per-account scope profiles → features tour

Quick setup

New to all this? It's written for someone who just installed Claude Code and has never made an API key. Copy-paste each step; it says what you'll see. (Already technical? The Configuration reference is the terse version.)

  1. Install it. Get Node.js (the green "LTS" button, version 22 or newer), then run:
npm install -g mcp-google-multi

Claude Desktop user? You can skip npm entirely: download the mcp-google-multi.mcpb bundle from the [latest release](https://github.com/ba

Read from source at commit 38735a1be523OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add mcp-google-multi --env GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET} --env MASTER_KEY=${MASTER_KEY} --env GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET} --env MASTER_KEY=${MASTER_KEY} -- npx -y [email protected]
claude-code (oci)
claude mcp add mcp-google-multi:0.0.0 --env GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET} --env MASTER_KEY=${MASTER_KEY} --env GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET} --env MASTER_KEY=${MASTER_KEY} -- docker run -i --rm ghcr.io/bakissation/mcp-google-multi:0.0.0:None
03

Exposed tools (189)

90 read · 72 write · 27 destructive. Blast radius: 27 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
admin_group_members_listread
admin_groups_listread
admin_users_getread
admin_users_listread
admin_users_updatewrite
analytics_account_summariesread
analytics_get_metadataread
analytics_run_realtime_reportwrite
analytics_run_reportwrite
bigread
calendar_create_calendarwrite
calendar_create_eventwrite
calendar_delete_eventdestructive
calendar_get_eventread
calendar_get_freebusyread
calendar_list_calendarsread
calendar_list_eventsread
calendar_list_instancesread
calendar_move_eventwrite
calendar_quick_addwrite
calendar_update_eventwrite
chat_messages_createwrite
chat_messages_listread
chat_spaces_getread
chat_spaces_listread
contacts_createwrite
contacts_deletedestructive
contacts_getread
contacts_group_createwrite
contacts_group_membersread
contacts_groups_listread
contacts_listread
contacts_resolveread
contacts_searchread
contacts_updatewrite
docs_add_tabwrite
docs_batch_updatewrite
docs_createwrite
docs_create_footerwrite
docs_create_headerwrite
docs_create_named_rangewrite
docs_create_paragraph_bulletswrite
docs_delete_footerdestructive
docs_delete_headerdestructive
docs_delete_named_rangedestructive
docs_delete_paragraph_bulletsdestructive
docs_delete_rangedestructive
docs_delete_tabdestructive
docs_getread
docs_insert_inline_imagewrite
docs_insert_page_breakwrite
docs_insert_section_breakwrite
docs_insert_tablewrite
docs_insert_textwrite
docs_modify_tablewrite
docs_readread
docs_replace_named_range_contentread
docs_replace_textread
docs_update_document_stylewrite
docs_update_paragraph_stylewrite
docs_update_stylewrite
docs_update_tab_propertieswrite
drive_access_proposal_listread
drive_access_proposal_resolveread
drive_comment_createwrite
drive_comment_deletedestructive
drive_comment_getread
drive_comment_listread
drive_comment_updatewrite
drive_copyread
drive_create_folderwrite
drive_deletedestructive
drive_empty_trashread
drive_get_aboutread
drive_listread
drive_list_permissionsread
drive_movewrite
drive_permission_updatewrite
drive_readread
drive_remove_permissiondestructive
drive_reply_createwrite
drive_reply_deletedestructive
drive_reply_listread
drive_reply_updatewrite
drive_revision_deletedestructive
drive_revision_listread
drive_revision_updatewrite
drive_searchread
drive_shareread
drive_shared_drive_getread
drive_shared_drives_listread
drive_transferwrite
drive_trashread
drive_untrashread
drive_updatewrite
forms_batch_updatewrite
forms_createwrite
forms_getread
forms_response_getread
forms_responses_listread
forms_set_publish_settingswrite
forms_watches_listread
gmail_batch_deletedestructive
gmail_batch_modifywrite
gmail_create_draftwrite
gmail_create_labelwrite
gmail_deletedestructive
gmail_delete_labeldestructive
gmail_get_draftread
gmail_get_profileread
gmail_get_vacationread
gmail_list_draftsread
gmail_list_historyread
gmail_list_labelsread
gmail_modify_labelswrite
gmail_readread
gmail_read_batchread
gmail_read_threadread
gmail_searchread
gmail_sendwrite
gmail_send_draftwrite
gmail_set_vacationwrite
gmail_trashread
heldread
heldBigread
meet_conference_record_getread
meet_conference_records_listread
meet_recordings_listread
meet_transcript_entries_listread
meet_transcripts_listread
pingread
reports_activities_listread
searchconsole_searchanalytics_queryread
searchconsole_sitemaps_deletedestructive
searchconsole_sitemaps_getread
searchconsole_sitemaps_listread
searchconsole_sitemaps_submitwrite
searchconsole_sites_addwrite
searchconsole_sites_deletedestructive
searchconsole_sites_getread
searchconsole_sites_listread
searchconsole_url_inspectread
sheets_add_conditional_format_rulewrite
sheets_add_named_rangewrite
sheets_add_sheetwrite
sheets_append_rowsread
sheets_auto_resize_dimensionsread
sheets_batch_cleardestructive
sheets_batch_readread
sheets_batch_updatewrite
sheets_batch_writewrite
sheets_clear_basic_filterdestructive
sheets_clear_rangedestructive
sheets_createwrite
sheets_delete_dimensiondestructive
sheets_delete_named_rangedestructive
sheets_delete_sheetdestructive
sheets_duplicate_sheetread
sheets_find_replaceread
sheets_format_cellsread
sheets_getread
sheets_insert_dimensionwrite
sheets_merge_cellswrite
sheets_read_rangeread
sheets_set_basic_filterwrite
sheets_set_data_validationwrite
sheets_sort_rangeread
sheets_unmerge_cellsread
sheets_update_borderswrite
sheets_update_sheet_propertieswrite
sheets_write_rangewrite
slides_batch_updatewrite
slides_createwrite
slides_getread
slides_page_getread
slides_page_thumbnailread
tasks_cleardestructive
tasks_deletedestructive
tasks_getread
tasks_insertwrite
tasks_listread
tasks_list_deletedestructive
tasks_list_getread
tasks_list_insertwrite
tasks_list_updatewrite
tasks_lists_listread
tasks_movewrite
tasks_updatewrite
writewrite
04

Trust audit

CAUTIONgrade D · trust 67/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (11 observation(s))
Network
declared (4 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

MEDIUMInventory / provenance · inv.binary · CWE-1104
src/client.ts
client.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
src/token-store.ts
token-store.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/auth.ts:187
console.log(`Token saved (encrypted) for ${alias}.`);
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/doctor.ts:632
console.log(`Wiped ${wiped} token file(s).`);
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/migrate-tokens.ts:13
console.log(`• ${alias}: encrypted token already exists, skipping`);
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/mcp-token.test.ts:346
const TOKEN = 'r1.EBESExQVFhcYGRobHB0eHwECAwSgoaKjpKWmp6ipqqusra6vae0HPY7R1kpwyrnP9flryVjpAG54fFMHUKGK8Sgywi0';
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
calendar_delete_event, contacts_delete, docs_delete_footer, docs_delete_header, docs_delete_named_range, docs_delete_paragraph_bullets, docs_delete_range, docs_delete_tab, drive_comment_delete, drive_
Why it matters. 27 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.mcpbignore
.mcpbignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.releaserc.json
.releaserc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
tests/deploy-templates.test.ts:23
const render = yaml.load(read('render.yaml')) as { services: RenderService[] };
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
tests/deploy-templates.test.ts:103
const compose = yaml.load(read('deploy/compose.yaml')) as ComposeFile;
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/path-safety.test.ts:19
expect(path.basename('/home/user/.ssh/authorized_keys')).toBe('authorized_keys');
Why it matters. touches a credential store
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
scripts/gen-tools.ts:377
"import type { ToolRegistry } from '../../registry.js';",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
scripts/gen-tools.ts:407
"import type { ToolRegistry } from '../../registry.js';",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/tools/generated/_shared.ts:2
import { accountAliasSchema, accountAliasSchemaFor, accountArgLive } from '../../accounts.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/tools/generated/_shared.ts:3
import { executeApiMethod, type ApiMethodRef, type ExecuteDeps, type QueryParams } from '../../executor.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/tools/generated/_shared.ts:4
import type { Cud, ToolRegistry } from '../../registry.js';
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
tests/attachment-guards.test.ts:18
it('a file inside the config/token dir is refused (secret-exfil guard)', async () => {
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/ssrf-guard.test.ts:20
for (const ip of ['0.0.0.0', '10.1.2.3', '127.0.0.1', '169.254.169.254', '172.16.0.1', '172.31.255.255', '192.168.1.1', '100.64.0.1', '224.0.0.1', '240.0.0.1']) {
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/ssrf-guard.test.ts:30
for (const ip of ['::1', '::', 'fc00::1', 'fd12::1', 'fe80::1', '::ffff:127.0.0.1', '::ffff:169.254.169.254', '::ffff:7f00:1', '64:ff9b::7f00:1', '2002:a9fe::1', 'ff02::1']) {
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/ssrf-guard.test.ts:52
await expect(assertPublicHttpsUrl('https://evil.example', { resolveAll: async () => ['169.254.169.254'] })).rejects.toThrow(SsrfBlockedError);
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/ssrf-guard.test.ts:246
ssrf: { resolveAll: async () => ['169.254.169.254'] },
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/docker.yml:65
-e [email protected] -e MCP_PUBLIC_URL=http://127.0.0.1:4243 \
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/http-setup.md:76
service: http://127.0.0.1:4243
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/http-setup.md:106
| `MCP_PUBLIC_URL` | `https://mcp.example.com` | Metadata advertises `http://127.0.0.1:4243`; `resource`/`aud` mismatch; **every `/mcp` call 401-loops**. |

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 38735a1be523full audit observations/trust-audit/mcp-server/bakissation__mcp-google-multi.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1138735a1be523CAUTIOND67first audit
06

Questions

What is the mcp-google-multi MCP server?

Multi-account Google MCP server for Claude Code: Gmail, Drive, Calendar, Sheets, Docs, Contacts, Search Console, and more. ~871 tools with OAuth2 multi-account switching.

What tools does mcp-google-multi expose?

189 in total: 90 read-only, 72 that write, and 27 that can delete or overwrite (calendar_delete_event, contacts_delete, docs_delete_footer, docs_delete_header, docs_delete_named_range). Every one is listed on this page with its risk.

Is mcp-google-multi safe to connect to an agent?

With care. The audit graded it D (67/100) and found 25 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 27 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does mcp-google-multi need?

It reads GOOGLE_CLIENT_SECRET, MASTER_KEY, MCP_TRANSFER_PASSPHRASE and TOKEN_STORE_PATH from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does mcp-google-multi run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as mcp-google-multi at 0.0.0-semantically-released.

How current is this page?

The grade is for one exact copy of the source (38735a1be523), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement