# Google Chat MCP (npm · mcp-google-chat)

MCP server for the Google Chat API: spaces, messages, threads, reactions and memberships.

- Trust score: 79/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- npm · `mcp-google-chat`: 79/100 (this document), [markdown](https://verifymcp.io/servers/a1-x-tech-mcp-google-chat/mcp-google-chat.md), [page](https://verifymcp.io/servers/a1-x-tech-mcp-google-chat/mcp-google-chat)

## Channel facts

- Registry: `npm`
- Package: `mcp-google-chat`
- Version: `0.1.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-09-20.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 31 of 96 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 20 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 70/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3396 tokens (~242/item across 14 items; 14 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 70/100
  - Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **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.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Google Chat MCP server?

Google Chat MCP runs locally as an npm package, launched with npx -y mcp-google-chat. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add a1-x-tech-mcp-google-chat -- npx -y mcp-google-chat
```

### Cursor

```json
{
  "mcpServers": {
    "a1-x-tech-mcp-google-chat": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-chat"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "a1-x-tech-mcp-google-chat": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-chat"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add a1-x-tech-mcp-google-chat -- npx -y mcp-google-chat
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "a1-x-tech-mcp-google-chat": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "mcp-google-chat"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add a1-x-tech-mcp-google-chat --command npx --arg -y --arg mcp-google-chat
```

### Hermes

```yaml
mcp_servers:
  a1-x-tech-mcp-google-chat:
    command: "npx"
    args: ["-y", "mcp-google-chat"]
```

### Netclaw

```json
{
  "McpServers": {
    "a1-x-tech-mcp-google-chat": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "mcp-google-chat"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add a1-x-tech-mcp-google-chat -t stdio -c npx -a -y mcp-google-chat
```

### Other

```json
{
  "mcpServers": {
    "a1-x-tech-mcp-google-chat": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-chat"
      ]
    }
  }
}
```

## 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-09-20 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-18 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-16 (score 77, +1)

- [functional regression] Security disclosure: unverified → fail

### 2026-09-15 (score 76, 0)

- [functional regression] Security disclosure: fail → unverified

### 2026-09-13 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-11 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-09 (score 74, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-07 (score 73, +4)

- [functional improvement] Stability: unverified → 0.27

## MCP tools (14)

### `list_spaces` (~177 tokens)

List spaces

Lists the spaces the authenticated user is a member of: name (spaces/<id>), displayName (empty for direct messages), spaceType (SPACE = named room, GROUP_CHAT, DIRECT_MESSAGE), spaceThreadingState and timestamps. This is the discovery entry point — space names from here feed every other tool. space_type narrows the listing server-side; there is no text search here — match displayName client-side, or use search_spaces (Workspace admin only). Paginate with page_token from nextPageToken; results are unordered.

Input parameters:

- `page_size` (integer): Max spaces per page (1..1000; default 100).
- `page_token` (string): nextPageToken from the previous page.
- `space_type` (string): Only spaces of this type: space (named room), group_chat, or direct_message.

### `get_space` (~117 tokens)

Get a space

Returns one space's details: displayName, spaceType, spaceDetails (description/guidelines), spaceThreadingState (THREADED_MESSAGES = replies go into threads, otherwise the space is flat), membershipCount, createTime and settings. Use it to check the threading model before send_message with a thread, or to confirm a space id before writing into it.

Input parameters:

- `space` (string, required): The space — "spaces/<id>" or the bare id from list_spaces / a Chat URL (chat.google.com/room/<id>).

### `search_spaces` (~261 tokens)

Search spaces (admin)

Server-side search over ALL named spaces in the Workspace organization — including ones the caller is not a member of. ADMIN-ONLY: the call runs with useAdminAccess=true and requires a Google Workspace administrator authorized with the chat.admin.spaces or chat.admin.spaces.readonly scope; anyone else gets PERMISSION_DENIED — fall back to list_spaces and match displayName client-side. query uses the API's search syntax and MUST contain customer = "customers/my_customer" AND spaceType = "SPACE"; add displayName:"text" for name search, e.g. customer = "customers/my_customer" AND spaceType = "SPACE" AND displayName:"onboarding". order_by accepts membership_count.joined_direct_human_user_count, last_active_time or create_time with ASC/DESC.

Input parameters:

- `order_by` (string): Sort, e.g. "create_time DESC" or "last_active_time DESC" (default create_time ASC).
- `page_size` (integer): Max spaces per page (1..1000).
- `page_token` (string): nextPageToken from the previous page.
- `query` (string, required): Search query, e.g. customer = "customers/my_customer" AND spaceType = "SPACE" AND displayName:"onboarding".

### `find_direct_message` (~114 tokens)

Find a direct-message space

Finds the EXISTING direct-message space between the authenticated user and another user, returning the space (name spaces/<id>) to send_message into. Returns HTTP 404 when no DM with that user exists yet — this tool cannot create one (creating DMs needs spaces.setup via raw_request). The user can be a Google user id (users/123...) or an email address.

Input parameters:

- `user` (string, required): The user — "users/<id>", "users/<email>", or a bare Google user id / email address.

### `list_messages` (~283 tokens)

List messages

Lists messages in a space (including messages from blocked members and spaces): name, text, sender, createTime, thread.name, attachment metadata and emoji reaction summaries. Filters are the API's only two: created_after (createTime) and thread_name (one thread's messages) — there is no text search, match client-side. order defaults to ascending by createTime; show_deleted includes tombstones of deleted messages. Poll incrementally with created_after + page_token instead of re-listing history. Requires the chat.messages.readonly (or chat.messages) scope and works only with user authentication.

Input parameters:

- `created_after` (string): Only messages created after this RFC3339 UTC timestamp, e.g. 2026-08-01T00:00:00Z.
- `order` (string): Sort by createTime (default asc).
- `page_size` (integer): Max messages per page (1..1000; default 25).
- `page_token` (string): nextPageToken from the previous page.
- `show_deleted` (boolean): Include deleted messages (deletion metadata only).
- `space` (string, required): The space — "spaces/<id>" or the bare id from list_spaces / a Chat URL (chat.google.com/room/<id>).
- `thread_name` (string): Only messages in this thread (thread.name from a message).

### `get_message` (~127 tokens)

Get a message

Fetches one message by its full resource name: text, formattedText, sender, createTime/lastUpdateTime, thread.name (reply target for send_message), attachment[] metadata (name, contentName, contentType, downloadUri, attachmentDataRef) and emojiReactionSummaries. Also resolves custom-id names (spaces/<space>/messages/client-<id>) for messages sent with message_id. Deleted messages return deletionMetadata instead of content.

Input parameters:

- `message` (string, required): The full message name from list_messages/send_message, e.g. "spaces/AAA/messages/BBB.CCC".

### `send_message` (~409 tokens)

Send a message

Sends a text message to a space AS THE AUTHENTICATED USER (their name and avatar; needs the chat.messages.create or chat.messages scope, and the user must be a member of the space). Text supports Chat markup: *bold*, _italic_, ~strike~, `code`, <https://url|link>, <users/123> mentions. Threads: pass thread_name (from a message's thread.name) or a stable thread_key of your choosing to reply in a thread; by default a missing thread falls back to starting a new one — set reply_option="or_fail" to error instead. In non-threaded spaces the thread params are ignored by the API. message_id (must start with "client-") makes the send addressable later without storing the returned name — reuse of an id fails with ALREADY_EXISTS, which also makes accidental duplicate sends detectable. Returns the created message with name, thread.name and createTime. A send is NEVER retried after a 5xx/timeout: check with list_messages before re-sending. Cards (cardsV2) are app-auth-only — out of scope; use raw_request with a Chat-app token.

Input parameters:

- `message_id` (string): Custom id for the message, e.g. "client-deploy-42"; must be unique per space.
- `reply_option` (string): When targeting a thread: fallback_to_new_thread (default) starts a new thread if it doesn't exist; or_fail errors instead.
- `space` (string, required): The space — "spaces/<id>" or the bare id from list_spaces / a Chat URL (chat.google.com/room/<id>).
- `text` (string, required): The message text (up to 4096 characters; Chat markup supported).
- `thread_key` (string): Opaque key of your choosing: first use starts a thread, reuse replies into it.
- `thread_name` (string): Reply into this existing thread (thread.name from get_message/list_messages).

### `update_message` (~140 tokens)

Update a message

Replaces the text of an existing message (updateMask=text; the previous text is overwritten, not appended). With user authentication only the authenticated user's OWN messages can be edited — editing someone else's returns PERMISSION_DENIED, a Chat rule, not a missing scope. The message keeps its name and thread; lastUpdateTime is set and clients show an Edited marker. Updating cards or accessory widgets needs app auth via raw_request.

Input parameters:

- `message` (string, required): The full message name from list_messages/send_message, e.g. "spaces/AAA/messages/BBB.CCC".
- `text` (string, required): The new message text (replaces the old text entirely).

### `delete_message` (~164 tokens)

Delete a message

Permanently deletes a message. With user authentication the user can delete their OWN messages; space managers can also delete others' messages in spaces they manage — otherwise PERMISSION_DENIED (a Chat permission rule, not a missing scope). If the message started a thread that has replies, the delete fails with FAILED_PRECONDITION; force=true deletes the replies too but works only with app (service-account) authentication. Deletion cannot be undone — read the message with get_message first if its content matters. Returns an empty object on success.

Input parameters:

- `force` (boolean): Also delete threaded replies (app authentication only; ignored for user auth).
- `message` (string, required): The full message name from list_messages/send_message, e.g. "spaces/AAA/messages/BBB.CCC".

### `manage_reactions` (~289 tokens)

Manage message reactions

Emoji reactions on a message, as the authenticated user. action=add puts a unicode emoji (the emoji character itself, e.g. "👍" or "🎉" — not :shortcode:) on the message; adding the same emoji twice fails with ALREADY_EXISTS. action=list returns who reacted with what — each reaction's name (spaces/.../reactions/<id>), emoji and user; filter with emoji to one emoji's reactions. action=remove deletes ONE reaction by its full reaction_name from list — only the authenticated user's own reactions can be removed (someone else's returns PERMISSION_DENIED). Custom (workspace) emoji need raw_request with emoji.customEmoji. Scopes: chat.messages.reactions (add/remove; .create suffices for add-only) or chat.messages.reactions.readonly (list).

Input parameters:

- `action` (string, required): What to do with the message's reactions.
- `emoji` (string): add: the unicode emoji to add (e.g. "👍"). list: only this emoji's reactions.
- `message` (string): add/list: the message to react to / read reactions from.
- `page_size` (integer): list: max reactions per page (1..200).
- `page_token` (string): list: nextPageToken from the previous page.
- `reaction_name` (string): remove: the reaction to delete, from action=list.

### `get_attachment` (~181 tokens)

Get attachment metadata

Fetches metadata of one message attachment by its resource name (from a message's attachment[].name): contentName (filename), contentType (MIME), source (DRIVE_FILE or UPLOADED_CONTENT), downloadUri/thumbnailUri (short-lived, for a signed-in browser user — not for server-side download) and attachmentDataRef. NOTE the auth split: this dedicated endpoint accepts only APP (service-account) authentication — with user credentials it returns an error, but the SAME metadata is already embedded in get_message's attachment[] field, so user-auth flows should read it there. Downloading raw bytes goes through the media endpoint (v1/media/<resourceName>?alt=media) and uploading new attachments through the upload endpoint — both outside this server's tools.

Input parameters:

- `attachment` (string, required): The attachment resource name from a message's attachment[].name.

### `list_members` (~223 tokens)

List space members

Lists memberships in a space: each membership's name (spaces/<space>/members/<member> — the handle manage_members needs), member (users/<id>, displayName, type HUMAN|BOT), role (ROLE_MEMBER or ROLE_MANAGER) and state (JOINED, INVITED, NOT_A_MEMBER). role filters to managers or members; show_invited includes invited-but-not-joined users, show_groups includes Google Groups. Requires the chat.memberships.readonly (or chat.memberships) scope and membership in the space.

Input parameters:

- `page_size` (integer): Max memberships per page (1..1000; default 100).
- `page_token` (string): nextPageToken from the previous page.
- `role` (string): Only memberships with this role.
- `show_groups` (boolean): Include Google Group memberships.
- `show_invited` (boolean): Include invited memberships not yet joined.
- `space` (string, required): The space — "spaces/<id>" or the bare id from list_spaces / a Chat URL (chat.google.com/room/<id>).

### `manage_members` (~268 tokens)

Manage space membership

Membership management in a space — WORKS ONLY WITH SUFFICIENT ACCESS: the authenticated user needs the chat.memberships scope, and add/update_role/remove additionally require them to be a space MANAGER (otherwise PERMISSION_DENIED — a Chat role rule, not a network problem; check their role via list_members). action=get reads one membership by member_name. action=add invites/adds a human user (space + user, optional role=manager); in DMs and group chats members cannot be added. action=update_role switches a membership between member and manager (member_name + role). action=remove deletes the membership — the user is kicked from the space immediately and this is not undoable from here (re-add creates a fresh invitation). Google Groups and Chat-app memberships are managed via raw_request.

Input parameters:

- `action` (string, required): What to do with the space's membership.
- `member_name` (string): get/update_role/remove: the membership from list_members.
- `role` (string): add (optional, default member) / update_role (required): the target role.
- `space` (string): add: the space to add the user to.
- `user` (string): add: the user to add (users/<id>, users/<email>, or bare id/email).

### `raw_request` (~241 tokens)

Raw Google Chat API call

Escape hatch to call any Google Chat API v1 path directly, for requests the typed tools don't cover — e.g. creating a space (path "v1/spaces", method POST, body {"spaceType":"SPACE","displayName":"..."}), setting up a DM ("v1/spaces:setup"), custom-emoji reactions, Google Group memberships, space events ("v1/spaces/<id>/spaceEvents"), or updating a space ("v1/spaces/<id>" PATCH with a query updateMask). The path may carry a query string (e.g. "v1/spaces/AAA/members?showInvited=true"). The Bearer token is added automatically; the method defaults to GET. Not for media: attachment upload/download use different endpoints (upload/v1, media/v1) that this server does not proxy.

Input parameters:

- `body` (object): JSON request body (POST/PATCH only).
- `method` (string): HTTP method (the Chat API uses these four). Defaults to GET.
- `path` (string, required): API path relative to https://chat.googleapis.com, e.g. "v1/spaces/AAA/messages".

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/a1-x-tech-mcp-google-chat/mcp-google-chat#diagnostics

## Score history

- 2026-09-20: 79
- 2026-09-19: 78
- 2026-09-18: 78
- 2026-09-17: 77
- 2026-09-16: 77
- 2026-09-15: 76
- 2026-09-14: 76
- 2026-09-13: 76
- 2026-09-12: 75
- 2026-09-11: 75
- 2026-09-10: 74
- 2026-09-09: 74
- 2026-09-08: 73
- 2026-09-07: 73
- 2026-09-06: 69
- 2026-09-05: 69
- 2026-09-04: 69
- 2026-09-03: 69
- 2026-09-02: 69
- 2026-09-01: 69
- 2026-08-31: 69
- 2026-08-30: 54

## Common questions

### What is the Google Chat MCP server?

Google Chat MCP is listed in the public MCP registry as io.github.A1-x-Tech/mcp-google-chat. MCP server for the Google Chat API: spaces, messages, threads, reactions and memberships. This page covers its npm package (mcp-google-chat).

### Is the Google Chat MCP server safe to use?

Google Chat MCP scores 79 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Google Chat MCP server expose?

Google Chat MCP exposes 14 tools: list_spaces, get_space, search_spaces, find_direct_message, list_messages, and 9 more. Their descriptions and schemas cost roughly 2,994 tokens of context every time the server is loaded.

### Is the Google Chat MCP server still maintained?

Google Chat MCP is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Google Chat MCP server under?

Google Chat MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/mcp-google-chat
- Socket report: https://socket.dev/npm/package/mcp-google-chat
- Repository: https://github.com/A1-x-Tech/mcp-google-chat
- Changelog RSS feed: https://verifymcp.io/servers/a1-x-tech-mcp-google-chat/mcp-google-chat.xml
- Changelog JSON feed: https://verifymcp.io/servers/a1-x-tech-mcp-google-chat/mcp-google-chat.json
- HTML version of this page: https://verifymcp.io/servers/a1-x-tech-mcp-google-chat/mcp-google-chat
