Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Google Chat MCP

NPM · MCP-GOOGLE-CHAT · SCANNED SEP 20

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

Available components

+3 this week 79 Trust /100
Trust breakdown (7 categories)

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. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 96 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
Schema Quality & AI Usability70
  • AI-judged instruction clarity (excellent).Pass
  • 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. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management70
  • Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
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.

npm · mcp-google-chat

# add to Claude Code
claude mcp add a1-x-tech-mcp-google-chat -- npx -y mcp-google-chat
// .cursor/mcp.json
{
  "mcpServers": {
    "a1-x-tech-mcp-google-chat": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-chat"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "a1-x-tech-mcp-google-chat": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-chat"
      ]
    }
  }
}
# add to Codex CLI
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
    }
  }
}
# add to OpenClaw
openclaw mcp add a1-x-tech-mcp-google-chat --command npx --arg -y --arg mcp-google-chat
# ~/.hermes/config.yaml
mcp_servers:
  a1-x-tech-mcp-google-chat:
    command: "npx"
    args: ["-y", "mcp-google-chat"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "a1-x-tech-mcp-google-chat": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "mcp-google-chat"
      ]
    }
  }
}
# add to Vellum
assistant mcp add a1-x-tech-mcp-google-chat -t stdio -c npx -a -y mcp-google-chat
// mcp.json
{
  "mcpServers": {
    "a1-x-tech-mcp-google-chat": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-chat"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +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.

  • 18 Sept 26 +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.

  • 16 Sept 26 +1
    • Security disclosure: unverified → fail functional
  • 15 Sept 26 0
    • Security disclosure: fail → unverified functional
  • 13 Sept 26 +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.

  • 11 Sept 26 +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.

  • 9 Sept 26 +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.

  • 7 Sept 26 +4
    • Stability: unverified → 0.27 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed npm/mcp-google-chat@0.1.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 96 packages
Packages resolved 96
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 14 exposed · ~2,994 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
delete_message ~164

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.

NameTypeReqDescription
forcebooleanAlso delete threaded replies (app authentication only; ignored for user auth).
messagestringyesThe full message name from list_messages/send_message, e.g. "spaces/AAA/messages/BBB.CCC".

No output schema declared.

No examples provided.

find_direct_message ~114

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.

NameTypeReqDescription
userstringyesThe user — "users/<id>", "users/<email>", or a bare Google user id / email address.

No output schema declared.

No examples provided.

get_attachment ~181

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.

NameTypeReqDescription
attachmentstringyesThe attachment resource name from a message's attachment[].name.

No output schema declared.

No examples provided.

get_message ~127

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.

NameTypeReqDescription
messagestringyesThe full message name from list_messages/send_message, e.g. "spaces/AAA/messages/BBB.CCC".

No output schema declared.

No examples provided.

get_space ~117

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.

NameTypeReqDescription
spacestringyesThe space — "spaces/<id>" or the bare id from list_spaces / a Chat URL (chat.google.com/room/<id>).

No output schema declared.

No examples provided.

list_members ~223

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.

NameTypeReqDescription
page_sizeintegerMax memberships per page (1..1000; default 100).
page_tokenstringnextPageToken from the previous page.
rolestringOnly memberships with this role.
show_groupsbooleanInclude Google Group memberships.
show_invitedbooleanInclude invited memberships not yet joined.
spacestringyesThe space — "spaces/<id>" or the bare id from list_spaces / a Chat URL (chat.google.com/room/<id>).

No output schema declared.

No examples provided.

list_messages ~283

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.

NameTypeReqDescription
created_afterstringOnly messages created after this RFC3339 UTC timestamp, e.g. 2026-08-01T00:00:00Z.
orderstringSort by createTime (default asc).
page_sizeintegerMax messages per page (1..1000; default 25).
page_tokenstringnextPageToken from the previous page.
show_deletedbooleanInclude deleted messages (deletion metadata only).
spacestringyesThe space — "spaces/<id>" or the bare id from list_spaces / a Chat URL (chat.google.com/room/<id>).
thread_namestringOnly messages in this thread (thread.name from a message).

No output schema declared.

No examples provided.

list_spaces ~177

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.

NameTypeReqDescription
page_sizeintegerMax spaces per page (1..1000; default 100).
page_tokenstringnextPageToken from the previous page.
space_typestringOnly spaces of this type: space (named room), group_chat, or direct_message.

No output schema declared.

No examples provided.

manage_members ~268

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.

NameTypeReqDescription
actionstringyesWhat to do with the space's membership.
member_namestringget/update_role/remove: the membership from list_members.
rolestringadd (optional, default member) / update_role (required): the target role.
spacestringadd: the space to add the user to.
userstringadd: the user to add (users/<id>, users/<email>, or bare id/email).

No output schema declared.

No examples provided.

manage_reactions ~289

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).

NameTypeReqDescription
actionstringyesWhat to do with the message's reactions.
emojistringadd: the unicode emoji to add (e.g. "👍"). list: only this emoji's reactions.
messagestringadd/list: the message to react to / read reactions from.
page_sizeintegerlist: max reactions per page (1..200).
page_tokenstringlist: nextPageToken from the previous page.
reaction_namestringremove: the reaction to delete, from action=list.

No output schema declared.

No examples provided.

raw_request ~241

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.

NameTypeReqDescription
bodyobjectJSON request body (POST/PATCH only).
methodstringHTTP method (the Chat API uses these four). Defaults to GET.
pathstringyesAPI path relative to https://chat.googleapis.com, e.g. "v1/spaces/AAA/messages".

No output schema declared.

No examples provided.

search_spaces ~261

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.

NameTypeReqDescription
order_bystringSort, e.g. "create_time DESC" or "last_active_time DESC" (default create_time ASC).
page_sizeintegerMax spaces per page (1..1000).
page_tokenstringnextPageToken from the previous page.
querystringyesSearch query, e.g. customer = "customers/my_customer" AND spaceType = "SPACE" AND displayName:"onboarding".

No output schema declared.

No examples provided.

send_message ~409

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.

NameTypeReqDescription
message_idstringCustom id for the message, e.g. "client-deploy-42"; must be unique per space.
reply_optionstringWhen targeting a thread: fallback_to_new_thread (default) starts a new thread if it doesn't exist; or_fail errors instead.
spacestringyesThe space — "spaces/<id>" or the bare id from list_spaces / a Chat URL (chat.google.com/room/<id>).
textstringyesThe message text (up to 4096 characters; Chat markup supported).
thread_keystringOpaque key of your choosing: first use starts a thread, reuse replies into it.
thread_namestringReply into this existing thread (thread.name from get_message/list_messages).

No output schema declared.

No examples provided.

update_message ~140

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.

NameTypeReqDescription
messagestringyesThe full message name from list_messages/send_message, e.g. "spaces/AAA/messages/BBB.CCC".
textstringyesThe new message text (replaces the old text entirely).

No output schema declared.

No examples provided.

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.