# Google Workspace MCP Server (npm · gws-mcp-server)

Google Workspace as 39 curated MCP tools: Gmail, Calendar, Drive, Sheets, Docs, and Tasks.

- Trust score: 78/100 (medium)
- Change this week: +32
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `gws-mcp-server`: 78/100 (this document), [markdown](https://verifymcp.io/servers/conorbronsdon-gws-mcp-server/gws-mcp-server.md), [page](https://verifymcp.io/servers/conorbronsdon-gws-mcp-server/gws-mcp-server)

## Channel facts

- Registry: `npm`
- Package: `gws-mcp-server`
- Version: `0.4.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (95 of 99), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (95 of 99), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to conorbronsdon/gws-mcp-server).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 25 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 71/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 3143 tokens (~80/item across 39 items; 39 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 22/100
  - Stability check failed: the tool surface changed between 0.2.0 and 0.4.0: 2 tool removals, 0 breaking changes, 0 additions.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add conorbronsdon-gws-mcp-server -- npx -y gws-mcp-server
```

### Codex

```bash
codex mcp add conorbronsdon-gws-mcp-server -- npx -y gws-mcp-server
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "conorbronsdon-gws-mcp-server": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "gws-mcp-server"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add conorbronsdon-gws-mcp-server --command npx --arg -y --arg gws-mcp-server
```

### Hermes

```yaml
mcp_servers:
  conorbronsdon-gws-mcp-server:
    command: "npx"
    args: ["-y", "gws-mcp-server"]
```

### Other

```json
{
  "mcpServers": {
    "conorbronsdon-gws-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "gws-mcp-server"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 18 to 22.

### 2026-08-02 (score 77, +56)

- [security regression] Stability: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [security improvement] Provenance: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: conorbronsdon/gws-mcp-server
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Schema quality: unverified → good
- [functional improvement] MCP protocol: unverified → pass
- [functional] Licence: MIT
- [functional] Package version: 0.2.0 → 0.4.0

### 2026-08-01 (score 21, +16)

- [functional improvement] Tool coverage: unverified → 100

### 2026-07-31 (score 5, −23)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 28, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-27 (score 46)

First indexed and scored.

## MCP tools (39)

### `drive_files_list` (~122 tokens)

List files in Google Drive. Supports search queries via the 'q' parameter. Shared drive files are included automatically.

Input parameters:

- `fields` (string): Fields to include (e.g. "files(id,name,mimeType)")
- `orderBy` (string): Sort order (e.g. "modifiedTime desc")
- `pageSize` (number): Max results per page (1-1000, default 100)
- `q` (string): Search query (e.g. "name contains 'report'" or "mimeType='application/vnd.google-apps.folder'")

### `drive_files_get` (~45 tokens)

Get a file's metadata by ID. Shared drive files are supported automatically.

Input parameters:

- `fields` (string): Fields to include
- `fileId` (string, required): The file ID

### `drive_files_create` (~117 tokens)

Create a new file in Google Drive. Use with bodyParams for metadata and optionally upload a local file.

Input parameters:

- `fields` (string): Fields to return (e.g. "id,webViewLink")
- `mimeType` (string): MIME type (e.g. "application/vnd.google-apps.document")
- `name` (string, required): File name
- `parents` (string): Parent folder IDs (JSON array as string, e.g. '["folderId"]')
- `uploadPath` (string): Local file path to upload

### `drive_files_copy` (~88 tokens)

Copy a file. Useful for converting formats (e.g. markdown to Google Doc).

Input parameters:

- `fields` (string): Fields to return
- `fileId` (string, required): Source file ID to copy
- `mimeType` (string): Target MIME type for conversion
- `name` (string, required): Name for the copy
- `parents` (string): Parent folder IDs (JSON array as string)

### `drive_files_update` (~74 tokens)

Update a file's metadata or content.

Input parameters:

- `fields` (string): Fields to return
- `fileId` (string, required): The file ID to update
- `mimeType` (string): New MIME type
- `name` (string): New file name
- `uploadPath` (string): Local file path to upload

### `drive_files_delete` (~28 tokens)

Permanently delete a file.

Input parameters:

- `fileId` (string, required): The file ID to delete

### `drive_files_export` (~111 tokens)

Export a Google Workspace file (Doc, Sheet, Slide) to a specific format. Returns JSON with export metadata. Use drive_files_download for automatic export with content returned inline.

Input parameters:

- `fileId` (string, required): The Google Workspace file ID to export
- `mimeType` (string, required): Export format: text/plain, text/csv, application/pdf, application/vnd.openxmlformats-officedocument.wordprocessingml.document (docx), application/vnd.openxmlformats-officedocument.spreadsheetml.sheet…

### `drive_permissions_create` (~88 tokens)

Share a file by creating a permission.

Input parameters:

- `emailAddress` (string): Email of user/group (required for user/group type)
- `fileId` (string, required): The file ID to share
- `role` (string, required): Permission role: owner, organizer, fileOrganizer, writer, commenter, reader
- `type` (string, required): Grantee type: user, group, domain, anyone

### `sheets_get` (~35 tokens)

Get spreadsheet metadata.

Input parameters:

- `includeGridData` (boolean): Include grid data
- `spreadsheetId` (string, required): The spreadsheet ID

### `sheets_values_get` (~86 tokens)

Read values from a spreadsheet range.

Input parameters:

- `majorDimension` (string): ROWS or COLUMNS
- `range` (string, required): A1 notation range (e.g. "Sheet1!A1:D10")
- `spreadsheetId` (string, required): The spreadsheet ID
- `valueRenderOption` (string): FORMATTED_VALUE, UNFORMATTED_VALUE, or FORMULA

### `sheets_values_update` (~85 tokens)

Write values to a spreadsheet range.

Input parameters:

- `range` (string, required): A1 notation range to write
- `spreadsheetId` (string, required): The spreadsheet ID
- `valueInputOption` (string, required): RAW or USER_ENTERED
- `values` (string, required): 2D array of values as JSON string (e.g. '[["A","B"],["C","D"]]')

### `sheets_values_append` (~75 tokens)

Append values after the last row of a spreadsheet range.

Input parameters:

- `range` (string, required): A1 notation range to append to
- `spreadsheetId` (string, required): The spreadsheet ID
- `valueInputOption` (string, required): RAW or USER_ENTERED
- `values` (string, required): 2D array of values as JSON string

### `calendar_events_list` (~130 tokens)

List events from a calendar.

Input parameters:

- `calendarId` (string, required): Calendar ID (use 'primary' for main calendar)
- `maxResults` (number): Max events to return
- `orderBy` (string): Sort order: startTime or updated
- `q` (string): Free-text search
- `singleEvents` (boolean): Expand recurring events (usually true)
- `timeMax` (string): Upper bound (RFC3339)
- `timeMin` (string): Lower bound (RFC3339, e.g. "2026-03-07T00:00:00Z")

### `calendar_events_get` (~37 tokens)

Get a single calendar event by ID.

Input parameters:

- `calendarId` (string, required): Calendar ID
- `eventId` (string, required): Event ID

### `calendar_events_insert` (~97 tokens)

Create a new calendar event.

Input parameters:

- `calendarId` (string, required): Calendar ID
- `description` (string): Event description
- `end` (string, required): End time JSON
- `location` (string): Event location
- `start` (string, required): Start time JSON (e.g. '{"dateTime":"2026-03-10T10:00:00-07:00"}')
- `summary` (string, required): Event title

### `calendar_events_update` (~83 tokens)

Update an existing calendar event with patch semantics (only supplied fields change).

Input parameters:

- `calendarId` (string, required): Calendar ID
- `description` (string): Event description
- `end` (string): End time JSON
- `eventId` (string, required): Event ID to update
- `start` (string): Start time JSON
- `summary` (string): Event title

### `calendar_events_delete` (~36 tokens)

Delete a calendar event.

Input parameters:

- `calendarId` (string, required): Calendar ID
- `eventId` (string, required): Event ID to delete

### `docs_get` (~28 tokens)

Get a Google Doc's content and metadata.

Input parameters:

- `documentId` (string, required): The document ID

### `docs_create` (~24 tokens)

Create a new empty Google Doc.

Input parameters:

- `title` (string, required): Document title

### `docs_batchUpdate` (~48 tokens)

Apply updates to a Google Doc (insert text, formatting, etc).

Input parameters:

- `documentId` (string, required): The document ID
- `requests` (string, required): Array of update requests as JSON string

### `gmail_messages_list` (~77 tokens)

List Gmail messages matching a query.

Input parameters:

- `labelIds` (string): Label IDs to filter by
- `maxResults` (number): Max messages to return
- `q` (string): Gmail search query (e.g. "from:user@example.com subject:hello")
- `userId` (string, required): User ID (use 'me')

### `gmail_messages_get` (~57 tokens)

Get a single Gmail message by ID.

Input parameters:

- `format` (string): Response format: full, metadata, minimal, raw
- `id` (string, required): Message ID
- `userId` (string, required): User ID (use 'me')

### `gmail_threads_list` (~52 tokens)

List Gmail threads matching a query.

Input parameters:

- `maxResults` (number): Max threads to return
- `q` (string): Gmail search query
- `userId` (string, required): User ID (use 'me')

### `gmail_threads_get` (~61 tokens)

Get a full Gmail thread by ID (all messages in the conversation).

Input parameters:

- `format` (string): Response format: full, metadata, minimal
- `id` (string, required): Thread ID
- `userId` (string, required): User ID (use 'me')

### `gmail_threads_modify` (~112 tokens)

Modify a Gmail thread: add/remove labels. To archive, remove INBOX. To mark read, remove UNREAD. To star, add STARRED.

Input parameters:

- `addLabelIds` (string): JSON array of label IDs to add, e.g. ["STARRED"]
- `id` (string, required): Thread ID
- `removeLabelIds` (string): JSON array of label IDs to remove, e.g. ["INBOX","UNREAD"]
- `userId` (string, required): User ID (use 'me')

### `tasks_tasklists_list` (~53 tokens)

List the authenticated user's task lists.

Input parameters:

- `maxResults` (number): Max task lists per page (1-100, default 20)
- `pageToken` (string): Token for the next page of results

### `tasks_tasklists_get` (~38 tokens)

Get a task list by ID.

Input parameters:

- `tasklist` (string, required): Task list ID (use "@default" for the user's default list)

### `tasks_tasklists_insert` (~26 tokens)

Create a new task list.

Input parameters:

- `title` (string, required): Task list title

### `tasks_tasklists_update` (~44 tokens)

Update a task list (only supplied fields change).

Input parameters:

- `tasklist` (string, required): Task list ID to update
- `title` (string): New task list title

### `tasks_tasklists_delete` (~47 tokens)

Delete a task list. If it contains assigned tasks, the originals (in Docs/Chat Spaces) are also removed.

Input parameters:

- `tasklist` (string, required): Task list ID to delete

### `tasks_tasks_list` (~245 tokens)

List tasks in a task list. Excludes hidden and assigned tasks by default; set showHidden/showAssigned to include them.

Input parameters:

- `completedMax` (string): Upper bound on completion date (RFC 3339)
- `completedMin` (string): Lower bound on completion date (RFC 3339)
- `dueMax` (string): Upper bound on due date (RFC 3339)
- `dueMin` (string): Lower bound on due date (RFC 3339)
- `maxResults` (number): Max tasks per page (1-100, default 20)
- `pageToken` (string): Token for the next page of results
- `showAssigned` (boolean): Include tasks assigned from Docs/Chat Spaces
- `showCompleted` (boolean): Include completed tasks (default true; ignored unless showHidden is also true)
- `showDeleted` (boolean): Include deleted tasks
- `showHidden` (boolean): Include hidden (cleared) tasks
- `tasklist` (string, required): Task list ID (use "@default" for the default list)
- `updatedMin` (string): Lower bound on last-modified time (RFC 3339)

### `tasks_tasks_get` (~35 tokens)

Get a task by ID.

Input parameters:

- `task` (string, required): Task ID
- `tasklist` (string, required): Task list ID

### `tasks_tasks_insert` (~149 tokens)

Create a new task. Use parent to nest as a subtask, previous to position after a sibling.

Input parameters:

- `due` (string): Due date (RFC 3339, e.g. "2026-06-01T00:00:00.000Z")
- `notes` (string): Free-text notes / body
- `parent` (string): Parent task ID (insert as a subtask under this task)
- `previous` (string): Sibling task ID (insert immediately after this task)
- `status` (string): Task status: needsAction or completed
- `tasklist` (string, required): Task list ID to insert into
- `title` (string, required): Task title

### `tasks_tasks_update` (~102 tokens)

Update a task (only supplied fields change). Common use: complete a task by setting status to "completed".

Input parameters:

- `due` (string): Due date (RFC 3339)
- `notes` (string): Free-text notes / body
- `status` (string): Task status: needsAction or completed
- `task` (string, required): Task ID to update
- `tasklist` (string, required): Task list ID
- `title` (string): Task title

### `tasks_tasks_move` (~115 tokens)

Move a task within its list or to another list. Use parent/previous to set position; destinationTasklist to change list.

Input parameters:

- `destinationTasklist` (string): Destination task list ID (omit to move within the source list)
- `parent` (string): New parent task ID (move as subtask under this task)
- `previous` (string): New sibling task ID (move immediately after this task)
- `task` (string, required): Task ID to move
- `tasklist` (string, required): Source task list ID

### `tasks_tasks_delete` (~49 tokens)

Delete a task. If assigned from Docs/Chat Spaces, the original is also removed.

Input parameters:

- `task` (string, required): Task ID to delete
- `tasklist` (string, required): Task list ID

### `tasks_tasks_clear` (~44 tokens)

Hide all completed tasks in a list. Cleared tasks are not deleted but stop appearing in default list responses.

Input parameters:

- `tasklist` (string, required): Task list ID to clear

### `drive_files_download` (~151 tokens)

Download a file's content from Google Drive. Returns the text content for text files, or a base64-encoded string for binary files. For Google Docs/Sheets/Slides, exports to a readable format (plain text by default).

Input parameters:

- `exportMimeType` (string): For Google-native files (Docs/Sheets/Slides): export format. Defaults to text/plain for Docs, text/csv for Sheets. Examples: text/plain, text/csv, application/pdf
- `fileId` (string, required): The file ID to download
- `savePath` (string): For binary files (images, PDFs): save to this local path instead of returning content inline. The file path is returned in the response.

### `gmail_drafts_create` (~249 tokens)

Create a Gmail draft. Pass threadId to attach the draft to an existing conversation (it will appear as a reply within that thread). The draft is NOT sent — open Gmail to review and send.

Input parameters:

- `bcc` (string): BCC recipient(s), comma-separated
- `body` (string): Plain-text body
- `cc` (string): CC recipient(s), comma-separated
- `htmlBody` (string): HTML body. If both body and htmlBody are provided, the draft is multipart/alternative.
- `inReplyTo` (string): Message-ID header value of the message being replied to. Improves threading robustness alongside threadId.
- `references` (string): References header value (space-separated Message-IDs of ancestor messages).
- `subject` (string): Subject line. When attaching to a thread via threadId, Gmail expects the subject to match the thread (typically "Re: <original>").
- `threadId` (string): Thread ID to attach this draft to. Get it from gmail_threads_list / gmail_messages_get.
- `to` (string, required): Recipient(s). Comma-separated for multiple, e.g. "a@x.com, b@y.com"

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/conorbronsdon-gws-mcp-server/gws-mcp-server#diagnostics

## Score history

- 2026-08-03: 78
- 2026-08-02: 77
- 2026-08-01: 21
- 2026-07-31: 5
- 2026-07-30: 28
- 2026-07-28: 46
- 2026-07-27: 46

## Links

- npm package: https://www.npmjs.com/package/gws-mcp-server
- Socket report: https://socket.dev/npm/package/gws-mcp-server
- Repository: https://github.com/conorbronsdon/gws-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/conorbronsdon-gws-mcp-server/gws-mcp-server/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/conorbronsdon-gws-mcp-server/gws-mcp-server/changelog.json
- HTML version of this page: https://verifymcp.io/servers/conorbronsdon-gws-mcp-server/gws-mcp-server
