
Research
/Security News
737 Chrome VPN Extensions Linked to Brand Impersonation and Browser Traffic Redirection
The campaign amassed more than 75,000 installs by targeting Russian-speaking users seeking access to blocked services.
@mindstone/mcp-server-google-workspace
Advanced tools
Google Workspace MCP server for Gmail, Calendar, Drive, Docs, Sheets, Slides, Contacts, Tasks, and Forms
Google Workspace MCP server — Gmail, Calendar, Drive, Docs, Sheets, Slides, Contacts, Chat, Meet, Tasks, Forms, Comments, and account diagnostics.
Multi-account Google Workspace MCP. Host-orchestrated OAuth (the connector neither runs a callback server nor mints OAuth URLs), atomic per-account credential writes, and a structured auth_required handoff so the host drives the sign-in flow rather than the server.
GOOGLE_CLIENT_SECRET)STATUS.jsonThis connector is based on aaronsb/google-workspace-mcp and credited under package.json#attribution.
When we ported this in early 2026, Google had not published a first-party MCP server for the Workspace surface. The community options at the time each got parts of the job right — Aaron Brown's aaronsb/google-workspace-mcp, which we used as the starting point, covered the breadth of Workspace APIs but ran its own browser-callback server during OAuth, which our host application already does. We forked it so that the MCP host can own the entire OAuth flow (the connector returns a structured auth_required response instead of running a callback server or computing OAuth URLs), per-account token files are written atomically with restrictive permissions and symlink rejection, and the connector goes through our own security review before each release. Google's Workspace MCP has since shipped; we continue to maintain this one because it integrates with our host's credential-file layout, host-orchestrated OAuth handoff, and recovery-guidance contract. This is now a hard fork maintained independently in this repository — we do not sync changes from the upstream project.
"Find the email thread Alice sent yesterday about Q3 planning and reply with 'thanks, will read tonight'."
Tools the host calls:
search_workspace_emails — searches Gmail for from:alice@... subject:"Q3 planning" newer_than:1d.reply_to_workspace_email — replies on the returned thread ID with the supplied body.Response (trimmed):
{
"thread": {
"id": "1928a...",
"subject": "Q3 planning",
"from": "alice@example.com"
},
"reply": {
"id": "1928b...",
"labelIds": ["SENT"]
}
}
engines.node is >=18, but the build and tests are exercised on 20 and 22)accounts.json plus per-account token files for the connector to read.cd <path-to-repo>/connectors/google-workspace
npm install
npm run build
npx -y @mindstone/mcp-server-google-workspace
node dist/index.js
This server is designed to run alongside a host application that performs the Google OAuth flow on its own. The host writes credentials to disk; this server reads them.
| Variable | Description |
|---|---|
GOOGLE_CLIENT_ID | Google OAuth client ID. |
GOOGLE_CLIENT_SECRET | Google OAuth client secret. |
ACCOUNTS_PATH | Path to accounts.json (host-written index of authenticated accounts). |
CREDENTIALS_PATH | Directory containing per-account Google OAuth token files. |
| Variable | Default | Description |
|---|---|---|
GOOGLE_WORKSPACE_REQUEST_TIMEOUT_MS | 60000 | Outbound Google API request timeout in milliseconds (max 300000 = 5 min). |
GOOGLE_WORKSPACE_DISABLE_REFRESH=1 may be injected by a host to make the connector return auth_required instead of refreshing tokens. It is intentionally not a user-facing setup variable.
authenticate_workspace_account returns a structured auth_required response:
{
"status": "auth_required",
"user_action": { "id": "google.connect_account" },
"agent_action": {
"instruction": "Connect Google Workspace to continue. The user will be redirected to Google's sign-in."
},
"setupToolName": "authenticate_workspace_account"
}
The connector does not run a callback server and does not generate OAuth URLs. The MCP host computes the Google OAuth URL and handles the callback. Once the host has written the account's token file under CREDENTIALS_PATH/ and an entry into ACCOUNTS_PATH, the next tool call succeeds.
{
"mcpServers": {
"GoogleWorkspace": {
"command": "npx",
"args": ["-y", "@mindstone/mcp-server-google-workspace"],
"env": {
"GOOGLE_CLIENT_ID": "your-google-oauth-client-id",
"GOOGLE_CLIENT_SECRET": "your-google-oauth-client-secret",
"ACCOUNTS_PATH": "/absolute/path/to/accounts.json",
"CREDENTIALS_PATH": "/absolute/path/to/credentials"
}
}
}
}
Until the host has written ${ACCOUNTS_PATH} and the matching per-account token file under ${CREDENTIALS_PATH}/, every tool call returns the structured auth_required response (see the Authentication flow above).
{
"mcpServers": {
"GoogleWorkspace": {
"command": "node",
"args": ["<path-to-repo>/connectors/google-workspace/dist/index.js"],
"env": {
"GOOGLE_CLIENT_ID": "your-google-oauth-client-id",
"GOOGLE_CLIENT_SECRET": "your-google-oauth-client-secret",
"ACCOUNTS_PATH": "/absolute/path/to/accounts.json",
"CREDENTIALS_PATH": "/absolute/path/to/credentials"
}
}
}
}
The full list lives under src/tools/definitions/ and is also surfaced in tools-inventory.json. Grouped by domain:
| Domain | Tools | Notes |
|---|---|---|
| Gmail | 23 | Email search/thread/send/compose, drafts, labels, label filters, attachments, archive/trash/read-state helpers, settings, vacation responder, and send-as aliases/signatures. |
| Calendar | 9 | Current time, free-slot lookup, calendar/event listing, event creation, updates, responses, and deletion. |
| Drive | 15 | List/search/upload/download/copy/move/trash/untrash files, folders, permissions, revisions, shared-drive discovery, and activity queries (what changed, when, by whom). |
| Docs | 8 | Read, create, append, replace, find/replace, tab listing, and batch updates. |
| Sheets | 14 | Read/write ranges, create spreadsheets, sheet management, batch operations, find/replace, and formatting. |
| Slides | 7 | Read, create, list/get slides, batch update, thumbnails, and ID extraction. |
| Labels | 12 | Gmail label CRUD and filter rules. |
| Contacts | 4 | List, search, create, and update contacts. |
| Chat | 3 | List spaces, list messages in a space, and send text messages. |
| Meet | 3 | List conference records, list transcripts, and read transcript entries (speaker + text). |
| Comments | 5 | List/create/reply/resolve/delete Drive comments. |
| Account | 3 | List, authenticate, and remove workspace accounts. |
| Tasks | 6 | List task lists, and list/create/update/complete/delete tasks. |
| Forms | 4 | Read-only access to forms and their responses. |
All Drive file, permission, and comment tools work on shared-drive files (the files.* and permissions.* calls pass supportsAllDrives; the Comments API addresses files by ID and defines no such flag). Listing and search default to the user's own corpus plus files shared with them, so shared-drive content the user has access to but has never opened may not surface by default. To work with shared drives explicitly:
list_shared_drives returns the shared drives the account can access (id, name, creation time).options.driveId to list_drive_files / search_drive_files. The connector forces corpora: 'drive' whenever driveId is set (the Drive API rejects any other pairing), overriding a caller-supplied corpora.options.corpora: 'allDrives' (no driveId) to search across My Drive and all shared drives in one query. Google recommends this only for targeted searches; prefer a specific driveId for browsing.Known Drive API limitations for shared-drive files (not fixable in this connector):
owners[] — ownership belongs to the drive itself. Use lastModifyingUser and createdTime as proxies when attributing files.list_file_revisions / download_file_revision only work for My Drive files.update_workspace_vacation_responder merges with the existing settings (the Gmail API otherwise replaces the whole resource): omitted subject/body are kept, an existing HTML body stays HTML, and a pending scheduled end is preserved when end_time is omitted. To remove a scheduled end and make the auto-reply open-ended, pass clear_end_time: true (mutually exclusive with end_time). An already-past end is never carried into a re-enable.
GOOGLE_WORKSPACE_DISABLE_REFRESH=1).action_required and next_step fields.upload_workspace_attachment filename arguments.<untrusted-content> envelopes cover Contacts, Calendar, Comments, Forms, Tasks, and JSON-return paths.FSL-1.1-MIT — Functional Source License, Version 1.1, with MIT future licence. The software converts to MIT licence on 2030-04-08.
FAQs
Google Workspace MCP server for Gmail, Calendar, Drive, Docs, Sheets, Slides, Contacts, Tasks, and Forms
We found that @mindstone/mcp-server-google-workspace demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
The campaign amassed more than 75,000 installs by targeting Russian-speaking users seeking access to blocked services.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.