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.

io.github.mmedum/google-chat-mcp

MCPB · GOOGLE-CHAT-MCP_6.1.0.MCPB

Google Chat as MCP tools: read, search and write to your spaces, direct messages and sidebar.

+2 this week 63 Trust /100

Last scanned (2 hours ago)

Scores higher than 98% of MCPB servers

Category Communication

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 Security0
  • No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
  • Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
  • Install-script risk not yet assessed.Unverified
  • Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to mmedum/google-chat-mcp). View diagnostics → Pass
  • Clear OSI-approved license (Apache-2.0).Pass
  • Actively maintained (last published 0 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability73
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 8071 tokens (~164/item across 49 items; 49 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 Management84
  • Stability check failed: the tool surface changed between 2.3.1 and 6.1.0: 5 tool removals, 0 breaking changes, 1 additions. See how to fix → Fail
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
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 50 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

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.

  • 24 Oct 26 +1
    • Package version: 6.0.0 → 6.1.0 functional
  • 23 Oct 26 −1
    • Stability: 0.87 → fail ▼ security
    • Schema quality: 9031 → 8071 ▲ functional
    • Package version: 5.1.1 → 6.0.0 functional
  • 21 Oct 26 +1

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

  • 19 Oct 26 +1

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

  • 16 Oct 26 +1

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

  • 14 Oct 26 +41
    • Injection markers: unverified → pass ▲ security
    • Stability: unverified → 0.60 ▲ functional
    • MCP protocol: unverified → pass ▲ functional
    • Tool coverage: unverified → 100 ▲ functional
    • Maintenance: unverified → pass ▲ functional
    • Package version: 4.0.0 → 5.1.1 functional
  • 13 Oct 26 +1
    • Security disclosure: unverified → pass ▲ functional
    • Package version: 4.0.0 → 5.1.1 functional
  • 12 Oct 26 +10
    • Provenance: unverified → pass ▲ security
    • The attested source repository moved: mmedum/google-chat-mcp security
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 24 Oct 2026 · Analysed mcpb/https://github.com/mmedum/google-chat-mcp/releases/download/v6.1.0/google-chat-mcp_6.1.0.mcpb@6.1.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem mcpb
Reason Verified
Discovered via GitHub artifact attestations
Source repo mmedum/google-chat-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/mmedum/google-chat-mcp/.github/workflows/release.yml@refs/tags/v6.1.0
Rekor log index 3429928998
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha256:210f2c43afe76892409291a082e7036ce39d1165164c1bd3e02c48982046df2e

Background: How many MCP packages publish verified provenance →

MCP tools · 49 exposed · ~7,863 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
add_member ~254

Invite someone in your organization into a space by email address, or add a Google Group. In a space that admits people from outside the organization, an address the organization's directory does not know is refused [blocked], and so is every Google Group, since a group brings in its outside members and anyone added to it later: add_external_member adds those. Someone already in the space is reported as an error rather than as a success, because the membership that exists belongs to whoever invited them first. Everyone joins as an ordinary member: Google ignores a role given here, silently. Set dry_run to see the request body without inviting anyone.

NameTypeReqDescription
dry_runboolean–return the request body without inviting anyone
group_namestring–a Google Group to add, groups/{id}; find_group turns the group's email address into one. Google allows a group only in a named space, never a group chat or a direct message. Refused in a space that a…
space_idstringyesthe space to invite them into, spaces/{id}
user_emailstring–their email address; search_people turns a name into one. Pass this or group_name, not both
NameTypeReqDescription
dry_runbooleanyestrue when nobody was invited
group_namestring–the group that was added, when it was a group
membership_namenull|stringyesthe new membership's resource name; remove_member takes it. Null after a dry run
rendered_payloadnull|objectyeson a dry run, the exact body that would have been sent; null on a real invite
rolestring–the role Google recorded, in its own spelling; empty when Google said nothing, which means an ordinary member
space_idstringyesthe space they were invited into
user_emailstringyeswho was invited; empty when a group was added

No examples provided.

add_reaction ~83

React to a message with a single unicode emoji. Reacting the same way twice is not an error: the reaction that is already there is returned instead.

NameTypeReqDescription
emojistringyesa single unicode emoji, such as 👍; custom emoji are not supported here
message_namestringyesthe message to react to, spaces/{space}/messages/{message}
NameTypeReqDescription
emojistringyesthe emoji character
reaction_namestringyesthe reaction's resource name; remove_reaction takes it
user_idstringyeswho reacted, users/{id}; the signed-in account

No examples provided.

create_custom_emoji ~179

Add a custom emoji to your organization from an image on this machine. Everyone in the organization can then use it, so the name is worth agreeing first. The image must be a square PNG, JPEG or GIF, 64 to 500 pixels, under 256 KB.

NameTypeReqDescription
dry_runboolean–check the name and the image without creating anything
emoji_namestringyesthe :shortcode: to type it by, colons included: lowercase letters, digits, hyphens and underscores, as in :party-parrot:
image_pathstringyesa .png, .jpg or .gif on this machine. Google wants it square, between 64 and 500 pixels, and under 256 KB — the file is read and sent inside the request, so the size limit is checked here first
NameTypeReqDescription
bytesintegeryesthe image's size, reported so a dry run tells you whether it fits
dry_runbooleanyestrue when nothing was created
emoji_namestringyesthe :shortcode: form, which is what you type in a message
namestringyesthe resource name, customEmojis/{emoji}; get_custom_emoji and delete_custom_emoji take this
temporary_uristring–a link to the image that Google says is good for at least ten minutes. Not stored anywhere and not worth keeping

No examples provided.

create_group_chat ~110

Start an unnamed group conversation with 2 to 20 people. Leave yourself out of member_emails: Google adds the signed-in account. A group chat cannot have a name; use create_space when you need one. Set dry_run to see the request body without creating anything.

NameTypeReqDescription
dry_runboolean–return the request body without creating anything
member_emailsnull|arrayyes2 to 20 email addresses, not counting you; Google adds the signed-in account itself
NameTypeReqDescription
dry_runbooleanyestrue when nothing was created
member_countintegeryeshow many people were asked for, not counting you
rendered_payloadnull|objectyeson a dry run, the exact body that would have been sent; null on a real create
space_idnull|stringyesthe new group chat's resource name; null after a dry run, because Google assigns it

No examples provided.

create_section ~108

Add a custom section to your own Chat sidebar. Google does not merge sections by name, so two calls leave two sections with the same label: list_sections first if you mean to reuse one. Sections are per-user and change nobody else's view. Set dry_run to see the request body first. Needs the chat.users.sections scope.

NameTypeReqDescription
display_namestringyeswhat to call it, 1 to 80 characters
dry_runboolean–return the request body without creating anything
NameTypeReqDescription
display_namestringyeswhat it is called
dry_runbooleanyestrue when nothing was changed
rendered_payloadnull|objectyeson a dry run, the exact body that would have been sent; null otherwise
section_namenull|stringyesthe section's resource name; null after a dry-run create, because Google assigns the id

No examples provided.

create_space ~206

Create a named space, with up to 20 initial members or none at all. Leave yourself out of member_emails: Google adds the signed-in account. A space of your own is fine — invite people later with add_member. A space is created private; set_space_audience opens one to an audience. Set dry_run to see the request body without creating anything.

NameTypeReqDescription
audiencestring–private, or omit it: a space is created private. Opening one to a target audience is set_space_audience's, and anything else here is refused
display_namestringyeswhat to call the space, 1 to 128 characters
dry_runboolean–return the request body without creating anything
member_emailsnull|array–up to 20 email addresses, not counting you; Google adds the signed-in account itself. Omit it for a space of your own, which you can invite people to later with add_member
NameTypeReqDescription
audiencenull|stringyesalways null: a space is created private, and set_space_audience opens one
display_namestringyeswhat it is called
dry_runbooleanyestrue when nothing was created
member_countintegeryeshow many people were asked for, not counting you
rendered_payloadnull|objectyeson a dry run, the exact body that would have been sent; null on a real create
space_idnull|stringyesthe new space's resource name; null after a dry run, because Google assigns it

No examples provided.

download_attachment ~129

Save a message's attachment to the server's local directory. Name the message; if it carries more than one file, pass attachment_name from get_message. The result says where the file landed. A Google Drive attachment is refused with its file id: those bytes belong to Drive, not Chat. This needs the server to have been started with GCM_LOCAL_DIR.

NameTypeReqDescription
attachment_namestring–which attachment, when the message carries more than one. get_message lists them as attachment_name
message_namestringyesthe message the file is on, spaces/{space}/messages/{message}
NameTypeReqDescription
bytesintegeryeshow many bytes were written
content_typestringyesthe MIME type Google served it as
file_namestringyesthe attachment's original name in Chat, which may differ from the name on disk
pathstringyeswhere the file was written, inside the server's local directory
sha256stringyesthe SHA-256 of the bytes written, hex encoded. Chat publishes no checksum of its own, so there is nothing here to verify against: this is for comparing the file with a copy elsewhere

No examples provided.

find_direct_message ~78

Find the direct message with one person, and start one when there is none yet. Returns the space to pass to send_message. A newly started direct message is empty, so the other person sees nothing until a message is posted in it.

NameTypeReqDescription
user_emailstringyesthe other person's email address; search_people turns a name into one
NameTypeReqDescription
space_idstringyesthe direct message's resource name; pass it to send_message

No examples provided.

find_group ~100

Turn a Google Group's email address into its groups/{id} name, which add_member takes as group_name. Chat names a group only by that id. Looked up through Cloud Identity, which shows only the groups this account can see. Google answers an address no group has the same way as a group kept to its own members, so a refusal cannot say which.

NameTypeReqDescription
emailstringyesthe group's email address, such as team@example.com
NameTypeReqDescription
display_namenull|stringyesthe group's name, or null when Cloud Identity gave none
emailstringyesthe address that was looked up
group_namestringyesthe group's resource name, groups/{id}; pass it to add_member as group_name

No examples provided.

find_group_chats ~134

Find the group chats whose members are exactly you and the people you name. Use it before create_group_chat to reuse an existing chat rather than starting a second one with the same people. A chat with one extra member does not match. For a one-to-one conversation use find_direct_message.

NameTypeReqDescription
limitinteger–how many to return, 1 to 30; default 10
member_emailsnull|arrayyesthe other people's email addresses, 1 to 49. You are always included, so pass only the others
page_tokenstring–continue a previous call
NameTypeReqDescription
next_page_tokenstring–pass back as page_token for the next page
resultnull|arrayyesthe group chats holding exactly you and the people named

No examples provided.

get_availability ~52

Read your own Chat presence: active, idle, away or do not disturb, with any custom status. Yours only — Google's endpoint answers for the signed-in account and there is no way to ask about anyone else.

Input schema present but exposes no named parameters.

NameTypeReqDescription
do_not_disturb_untilnull|stringyeswhen do-not-disturb ends, RFC 3339 in UTC; null when you are not in it
statestringyesACTIVE, IDLE, AWAY, DO_NOT_DISTURB, or STATE_UNSPECIFIED for a state this server does not recognize. IDLE is Google's to report, not yours to set
status_emojistring–the emoji beside that status
status_expiresnull|stringyeswhen the custom status lapses, RFC 3339 in UTC; null when it does not
status_textstring–the custom status beside your name, if you have one

No examples provided.

get_custom_emoji ~50

Read one custom emoji by its resource name, which list_custom_emojis reports.

NameTypeReqDescription
namestringyesthe emoji's resource name, customEmojis/{emoji}, from list_custom_emojis
NameTypeReqDescription
emoji_namestringyesthe :shortcode: form, which is what you type in a message
namestringyesthe resource name, customEmojis/{emoji}; get_custom_emoji and delete_custom_emoji take this
temporary_uristring–a link to the image that Google says is good for at least ten minutes. Not stored anywhere and not worth keeping

No examples provided.

get_member ~101

Read one membership: who or what it is, their role, and whether they have joined. list_members answers who is in a space; this answers what a membership is, which is what to check before changing a role or removing someone — a membership can name a Google Group, and removing that one removes everyone in the group from the space.

NameTypeReqDescription
membership_namestringyesthe membership to read, spaces/{space}/members/{member}, from list_members
NameTypeReqDescription
affiliationstring–INTERNAL for someone in your organization, EXTERNAL for a guest, MANAGED_EXTERNAL for a guest their own organization manages. Empty when Google said nothing. A space with external members is one to t…
display_namenull|stringyeswhat to call them, or null when Google gave no name
emailnull|stringyesthe person's or the group's email address; null when neither Chat, the People API nor Cloud Identity named one
group_membersnull|arrayyesfor a GROUP row of list_members with expand_groups: who is in the group, directly, up to 200. Null otherwise, and when they could not be read
group_members_missingnull|stringyeswhy group_members could not be read, such as a group that does not show its members to you; null when they were read or not asked for
group_members_morebooleanyestrue when the group has more direct members than group_members holds
kindstringyesHUMAN for a person, GROUP for a Google Group whose members are in the space through it
member_idstringyeswho the membership is for: users/{id} for a person, groups/{id} for a group
membership_namestringyesthe membership's own resource name, spaces/{space}/members/{member}. get_member, update_member_role and remove_member take THIS, not member_id
rolestringyesROLE_MEMBER, ROLE_MANAGER, ROLE_ASSISTANT_MANAGER, or ROLE_UNSPECIFIED for a role this server does not recognize
statestringyesJOINED for someone who is in the space, INVITED for someone who has been asked and has not accepted, NOT_A_MEMBER, or MEMBERSHIP_STATE_UNSPECIFIED

No examples provided.

get_message ~154

Fetch a single message by its resource name (spaces/{space}/messages/{message}). Reaction summaries are inline; reactions_paged true means there were too many to inline and list_reactions has the detail. Attachments are listed with the name download_attachment takes. links is what the text links to — a message whose body is a link names the target there and nowhere else — and formatted_text is the same body with Chat's markup left in. quote is the message this one replies to or forwards, as it read when it was quoted; a forward carries the whole snapshot, because the space it came from is often one you cannot read.

NameTypeReqDescription
message_namestringyesthe message, spaces/{space}/messages/{message}
NameTypeReqDescription
attachmentsnull|arrayyesthe files on the message, with the name download_attachment takes; empty when it carries none. A message that is only a file has empty text and its file here
formatted_textnull|stringyesthe same body with Chat's markup left in — bold, italics, mentions and the URL behind a link — or null when the markup says nothing the plain text does not
last_update_timenull|stringyeswhen it was last edited, or null when it never was
linksnull|arrayyeswhat the text links to; empty when it links to nothing
message_idstringyesthe message's resource name
quotenull|objectyesthe message this one quotes or forwards; null when it quotes nothing
reactionsnull|arrayyesone entry per distinct emoji on the message
reactions_pagedbooleanyestrue when the summaries were left out because there were too many; call list_reactions for the detail
sender_display_namenull|stringyesthe sender's name, or null when Google gave none
sender_emailnull|stringyesthe sender's email address, or null when it could not be resolved
sender_user_idstringyeswho sent it, users/{id}
space_idstringyesthe space it was posted in
textstringyesthe message body as plain text
thread_idstringyesthe thread it belongs to
thread_replybooleanyestrue when it was posted as a reply in its thread, false when it started the thread
timestampstringyeswhen the message was created, RFC 3339 in UTC

No examples provided.

get_messages ~315

Read recent messages from a space. Returns up to limit messages (default 20, max 100), newest first; page with page_token and next_page_token. Keep paging while next_page_token is non-null: an EMPTY result with a token still on it does not mean the space is empty, because Google applies the page size before it filters. Sender email is the one Chat sends, or a People API lookup when Chat sends none, and is null when both come back empty. Each message carries links: what its text links to, which Chat keeps out of the body, so a message reading as a bare word may be a link to something. quote is what a message replies to or forwards, which Chat also keeps out of the body. Each message also carries its files, reaction counts, when it was edited and whether it replies in its thread; a message that is only a file has empty text.

NameTypeReqDescription
beforestring–only messages created before this time; RFC 3339. With since, a window, such as what was said on one day
limitinteger–how many to return, 1 to 100; default 20
page_tokenstring–next_page_token from a previous call
sincestring–only messages created after this time; RFC 3339, such as 2026-01-01T00:00:00Z
space_idstringyesthe space to read, spaces/{id}, from list_spaces
NameTypeReqDescription
next_page_tokennull|string–pass this back as page_token to read the next page; null when this is the last one
resultnull|arrayyesthe messages that were read
unparsedintegeryesmessages that were read but could not be understood, and so are missing from result. Non-zero means this listing is INCOMPLETE, which is not the same as the space being quiet

No examples provided.

get_space ~60

Fetch one Google Chat space by its resource name. Use it to identify an unnamed direct message or group chat, or to confirm a space's metadata before writing to it.

NameTypeReqDescription
space_idstringyesthe space, spaces/{id}, from list_spaces
NameTypeReqDescription
access_statenull|stringyesPRIVATE when only people added or invited can find the space, DISCOVERABLE when a target audience can; null when Google did not say, as for a direct message
audiencenull|stringyesthe target audience that can find the space, join it and read it, audiences/{id}; null for a private space, and for one an audience can find but not join
create_timenull|stringyeswhen the space was created, RFC 3339 in UTC; null when Google did not say
descriptionnull|stringyeswhat the space is for, as its managers wrote it; null when it has none
display_namestringyeswhat to call the space; a direct message or group chat has no name of its own, so a label is supplied
external_user_allowednull|booleanyestrue when people outside the organization may join; null when Google did not say
group_member_countnull|integeryesGoogle Groups that have joined; null when Google did not say
guidelinesnull|stringyesthe rules its managers set for it; null when it has none
history_statenull|stringyesHISTORY_OFF when messages are kept for 24 hours, HISTORY_ON when the organization's retention rules decide; null when Google did not say
human_member_countnull|integeryespeople who have joined, not counting those who are in only through a group; null when Google did not say
last_active_timenull|stringyeswhen the last message was posted, RFC 3339 in UTC; null when Google did not say
members_can_postnull|booleanyesfalse when only managers may post, as in an announcement space; null when Google did not say
single_user_bot_dmnull|booleanyestrue when the space is a direct message with a Chat app rather than a person; null when Google did not say
space_idstringyesthe space's resource name, spaces/{id}
space_urinull|stringyesthe link that opens the space in Chat; null when Google did not say
typestringyesSPACE, DIRECT_MESSAGE, GROUP_CHAT, or SPACE_TYPE_UNSPECIFIED for a kind this server does not recognize

No examples provided.

get_space_event ~86

One event from a space by its resource name, which list_space_events reports. The payload is the resource as it is now, not as it was: an event about a message that has since been edited names the message, and get_message returns the current text.

NameTypeReqDescription
event_namestringyesthe event, spaces/{space}/spaceEvents/{event}, from list_space_events
NameTypeReqDescription
batchbooleanyestrue when Google collapsed several changes of one type into this event. It does that on its own, so a batch arrives even though only the plain type was asked for
event_namestringyesthe event's resource name; pass it to get_space_event
event_timestringyeswhen it happened, RFC 3339 in UTC
event_typestringyesGoogle's own event type, such as google.workspace.chat.message.v1.created
kindstringyeswhat changed: message, membership, reaction or space
resourcesnull|arrayyesthe resource names the event covers, one per change. Read a message with get_message; a deleted one is a tombstone and only its name survives

No examples provided.

get_space_notification_setting ~54

Read what Chat tells you about a space: which messages notify you, and whether the space is muted. Your own setting, not the space's.

NameTypeReqDescription
space_idstringyesthe space, spaces/{id}
NameTypeReqDescription
mute_settingstringyesMUTED silences the space whatever notification_setting says; UNMUTED respects it
namestringyesthe setting's own resource name
notification_settingstringyesALL for every new thread and mention, MAIN_CONVERSATIONS for the main conversation only, FOR_YOU for mentions and followed threads, OFF for none, or NOTIFICATION_SETTING_UNSPECIFIED for a value this…

No examples provided.

get_space_read_state ~65

Read how far you have read in a space. This is your own state, not the space's: two people reading the same space get different answers. Only top-level messages count, not thread replies.

NameTypeReqDescription
space_idstringyesthe space, spaces/{id}
NameTypeReqDescription
last_read_timenull|stringyeswhen you last read here, RFC 3339 in UTC; null when Google has recorded none, which is what a space you have never opened looks like
namestringyesthe read state's own resource name

No examples provided.

get_thread ~188

Read one thread's messages, oldest first. Give the parent space_id and the thread_name (spaces/{space}/threads/{thread}), which every message carries as thread_id. Default limit 50, max 100; page with page_token and next_page_token. A non-null next_page_token means the thread is longer than what came back, so do not read the result as the whole thread. Each message carries its links, what it quotes, its files and reaction counts, and when it was edited.

NameTypeReqDescription
limitinteger–how many to return, 1 to 100; default 50
page_tokenstring–next_page_token from a previous call
space_idstringyesthe thread's parent space, spaces/{id}
thread_namestringyesthe thread, spaces/{space}/threads/{thread}, from a message's thread_id
NameTypeReqDescription
next_page_tokennull|string–pass this back as page_token to read the next page; null when this is the last one
resultnull|arrayyesthe messages that were read
unparsedintegeryesmessages that were read but could not be understood, and so are missing from result. Non-zero means this listing is INCOMPLETE, which is not the same as the space being quiet

No examples provided.

get_thread_read_state ~70

Read how far you have read in one thread. Your own state, as with a space.

NameTypeReqDescription
space_idstringyesthe thread's space, spaces/{id}
thread_namestringyesthe thread, spaces/{space}/threads/{thread}, from a message's thread_id
NameTypeReqDescription
last_read_timenull|stringyeswhen you last read here, RFC 3339 in UTC; null when Google has recorded none, which is what a space you have never opened looks like
namestringyesthe read state's own resource name

No examples provided.

list_custom_emojis ~90

List your organization's own emoji, the ones people type as :shortcodes:. Custom emoji exist only on Google Workspace accounts and only when an administrator has turned them on.

NameTypeReqDescription
limitinteger–how many to return, 1 to 200; default 50
mine_onlyboolean–only the emoji this account created
page_tokenstring–continue a previous call
NameTypeReqDescription
next_page_tokenstring–pass back as page_token for the next page
resultnull|arrayyesthe organization's custom emoji

No examples provided.

list_members ~266

List the members of a Google Chat space: people, Google Groups, and anyone invited who has not joined yet. Every row carries kind (HUMAN or GROUP) and state (JOINED, INVITED, NOT_A_MEMBER), so check state before reporting someone as present. People come back with the email Chat sends, or one looked up through the People API when Chat sends none; a Google Group comes back with the address and name Cloud Identity gives it, or with only groups/{id} when that lookup is not granted. Default 50 entries; pass limit (1-200) to widen, and page with page_token and next_page_token. A non-null next_page_token means the space has more members than came back, so do not report the result as the whole membership.

NameTypeReqDescription
expand_groupsboolean–also list who is in each Google Group member, one level down: up to 200 people for each of the first 10 groups. Google shows a group's members only to someone the group lets see them
limitinteger–how many to return, 1 to 200; default 50
page_tokenstring–next_page_token from a previous call
space_idstringyesthe space, spaces/{id}
NameTypeReqDescription
next_page_tokennull|string–pass this back as page_token to read the next page; null when this is the last one
resultnull|arrayyeswho is in the space
unparsedintegeryesmemberships that were read but could not be understood, and so are missing from result. Non-zero means this listing is INCOMPLETE: a short list otherwise reads as a small space

No examples provided.

list_pinned_messages ~92

List the messages pinned in a space. A pin is how a space marks something worth keeping to hand, so this is a good first read for what a space is about.

NameTypeReqDescription
limitinteger–how many to return, 1 to 100; default 50
page_tokenstring–continue a previous call
space_idstringyesthe space, spaces/{id}
NameTypeReqDescription
next_page_tokenstring–pass back as page_token for the next page
resultnull|arrayyesthe pinned messages, which are the ones the space treats as important

No examples provided.

list_reactions ~107

List the reactions on a single message: who reacted and with what. Default limit 50, max 200; page with page_token and next_page_token. Custom emoji are left out, having no character to show.

NameTypeReqDescription
limitinteger–how many to return, 1 to 200; default 50
message_namestringyesthe message, spaces/{space}/messages/{message}
page_tokenstring–next_page_token from a previous call
NameTypeReqDescription
next_page_tokennull|stringyespass this back as page_token to read the next page; null when this is the last one
reactionsnull|arrayyesone entry per person per emoji

No examples provided.

list_section_items ~159

List the spaces filed under a section. Pass section_name to read one section, space_id to find which section a single space sits in, or both to check one against the other; at least one is required. A non-null next_page_token means limit cut the listing short, so page rather than treat it as the whole section. Needs the chat.users.sections.readonly scope.

NameTypeReqDescription
limitinteger–how many to return, 1 to 100; default 50
page_tokenstring–next_page_token from a previous call
section_namestring–read one section, users/{user}/sections/{section}
space_idstring–find which section this space sits in, spaces/{id}
NameTypeReqDescription
itemsnull|arrayyesthe spaces filed under the section
next_page_tokennull|stringyesnon-null means limit cut the listing short. A bulk re-sort built on a truncated listing skips the spaces it never saw, so page rather than assume
unparsedintegeryesrows this listing could not read and skipped. Non-zero means the result is INCOMPLETE, not that the section is that small

No examples provided.

list_sections ~109

List the sections in the caller's own Chat sidebar: the system ones ('(direct messages)', '(spaces)', '(apps)') plus any custom ones they made. Sections are per-user and change nobody else's view. A non-null next_page_token means more sections exist beyond limit. Needs the chat.users.sections.readonly scope.

NameTypeReqDescription
limitinteger–how many to return, 1 to 100; default 50
page_tokenstring–next_page_token from a previous call
NameTypeReqDescription
next_page_tokennull|stringyesnon-null means limit cut the listing short and more sections exist; pass it back as page_token
sectionsnull|arrayyesthe caller's own sidebar sections
unparsedintegeryesrows this listing could not read and skipped. Non-zero means the result is INCOMPLETE and this server's models are stale, not that the sidebar is that small

No examples provided.

list_space_events ~270

What changed in a space over the last 28 days: messages posted, edited or deleted, people joining or leaving, reactions, and edits to the space itself. Name at least one event type. Events come oldest first and each names the resources it covers, which you read with get_message, get_member or get_space. Google keeps 28 days and no more, and it answers a busy space with batch events covering several changes at once.

NameTypeReqDescription
event_typesnull|arrayyeswhat to list, at least one: message_created, message_updated, message_deleted, membership_created, membership_updated, membership_deleted, reaction_created, reaction_deleted, space_updated. Google re…
limitinteger–how many events to return, 1 to 100; default 50
page_tokenstring–continue from a previous next_page_token
sincestring–only events after this time, exclusive; RFC 3339. Google keeps 28 days and nothing older can be asked for
space_idstringyesthe space to read, spaces/{id}
untilstring–only events up to this time, inclusive; RFC 3339. Defaults to now
NameTypeReqDescription
eventsnull|arrayyeswhat changed, oldest first
next_page_tokenstring–pass back as page_token for the next page
unparsedintegeryesevents Google sent that carried nothing this server could name. Non-zero means this page is INCOMPLETE, which is not the same as nothing having happened

No examples provided.

list_spaces ~161

List Google Chat spaces (direct messages, group chats, named spaces) the authenticated user belongs to. Defaults to 50 entries; pass limit (1-200) to widen and space_type ('SPACE' | 'DIRECT_MESSAGE' | 'GROUP_CHAT') to narrow, and page with page_token and next_page_token. A non-null next_page_token means the account is in more spaces than came back. Use this to find a space's resource name before reading its messages.

NameTypeReqDescription
limitinteger–how many to return, 1 to 200; default 50
page_tokenstring–next_page_token from a previous call
space_typestring–narrow to SPACE, DIRECT_MESSAGE or GROUP_CHAT; omit for every kind
NameTypeReqDescription
next_page_tokennull|string–pass this back as page_token to read the next page; null when this is the last one
resultnull|arrayyesthe spaces the account belongs to

No examples provided.

mark_space_read ~77

Mark a space as read up to now, clearing its unread badge for you and nobody else. Google pulls the mark back to the newest message's own time, so the answer reports what it recorded.

NameTypeReqDescription
dry_runboolean–check the arguments without changing anything
space_idstringyesthe space, spaces/{id}
NameTypeReqDescription
dry_runbooleanyestrue when nothing was changed
last_read_timestringyesthe mark Google recorded, which is not always what was asked for: marking read is pulled back to the newest message's own time
namestringyesthe read state's resource name; empty after a dry run
unreadbooleanyestrue when this call rewound the mark rather than clearing it

No examples provided.

mark_space_unread ~135

Rewind your read mark in a space, so every top-level message after from_time is unread again. Pass the timestamp of the message you want to come back to; get_messages reports it. Affects you and nobody else.

NameTypeReqDescription
dry_runboolean–check the arguments without changing anything
from_timestringyesrewind your read mark to this time, RFC 3339: every top-level message after it becomes unread. get_messages reports each message's timestamp, so pass the timestamp of the message you want to come bac…
space_idstringyesthe space, spaces/{id}
NameTypeReqDescription
dry_runbooleanyestrue when nothing was changed
last_read_timestringyesthe mark Google recorded, which is not always what was asked for: marking read is pulled back to the newest message's own time
namestringyesthe read state's resource name; empty after a dry run
unreadbooleanyestrue when this call rewound the mark rather than clearing it

No examples provided.

move_space_to_section ~227

File a space under a section in your own sidebar. Every space already sits in some section, a default one until you move it, so this both files and re-files, and reports moved false when the space is already where you want it. For a bulk sort, read each section once with list_section_items and pass the item_name it gives you: that skips the per-space lookup. Set dry_run to see which section the space would leave without writing. Needs the chat.users.sections scope.

NameTypeReqDescription
dry_runboolean–look up where the space sits without moving it
item_namestring–the space's current sidebar entry, from list_section_items. Passing it skips a lookup, which is what makes a bulk sort cost one listing per section instead of a request per space. Nothing re-checks t…
section_namestringyeswhere to file it, users/{user}/sections/{section}
space_idstringyesthe space to file, spaces/{id}
NameTypeReqDescription
dry_runbooleanyestrue when nothing was moved
from_sectionstringyeswhere the space sat before, a default section when it had never been filed. Resolved before anything is written, so a dry run reports it too
item_namestringyesthe sidebar entry after the move; feed it back in for a bulk sort. A move renames it, so the one you passed in no longer exists
movedbooleanyesfalse without an error in two cases: a dry run, and a space already in the target section
rendered_payloadnull|objectyeson a dry run that would move something, the exact body; null on a real move and on a space already in place
section_namestringyesthe section it was asked to go to
space_idstringyesthe space that was filed

No examples provided.

pin_message ~82

Pin a message in its space, so everyone in the space sees it in the pinned list. The space is taken from the message name. Pinning is visible to everyone.

NameTypeReqDescription
dry_runboolean–check the arguments without changing anything
message_namestringyesthe message, spaces/{space}/messages/{message}. The space is taken from it
NameTypeReqDescription
dry_runbooleanyestrue when nothing was changed
message_idstringyesthe message that was named
pin_namestringyesthe pin's resource name; empty after a dry run
pinnedbooleanyestrue only when this call pinned the message
unpinnedbooleanyestrue only when this call removed a pin. False can mean the message was not pinned

No examples provided.

position_section ~183

Move a section within your sidebar. Pass exactly one of sort_order (absolute, 1 and up) or relative_position (START or END). Prefer relative_position when arranging several: Google documents sort_order as inserting at that rank and shifting the rest down, but a run of absolute inserts does not settle where that implies, so build an order by moving each to START in reverse. Set dry_run to see the request body first. Needs the chat.users.sections scope.

NameTypeReqDescription
dry_runboolean–return the request body without moving anything
relative_positionstring–START or END; pass this or sort_order, not both
section_namestringyesthe section to move, users/{user}/sections/{section}
sort_ordernull|integer–an absolute rank, 1 and up; pass this or relative_position, not both
NameTypeReqDescription
dry_runbooleanyestrue when nothing was moved
rendered_payloadnull|objectyeson a dry run, the exact body that would have been sent; null on a real move
section_namestringyesthe section that was moved
sort_ordernull|integeryesthe rank Google reports after the move, when it reports one; null after a dry run

No examples provided.

remove_reaction ~171

Delete a reaction. Pass reaction_name on its own, or message_name with emoji and user_email to look it up first. The lookup matches on the reactor's email address, so it fails rather than reporting nothing to delete when someone who reacted cannot be resolved: a silent no was the one answer it must not give. Removed false means there was no such reaction.

NameTypeReqDescription
emojistring–the emoji to remove; pass it with message_name and user_email
message_namestring–the message the reaction is on; pass it with emoji and user_email
reaction_namestring–the reaction to delete, from list_reactions or add_reaction. Pass this on its own
user_emailstring–whose reaction to remove; pass it with message_name and emoji
NameTypeReqDescription
reaction_namenull|stringyesthe reaction that was deleted; null when the lookup found none
removedbooleanyesfalse when there was no such reaction to delete, which is not an error

No examples provided.

rename_section ~105

Change a custom section's label. Only custom sections can be renamed; Google refuses a patch against a system one. Set dry_run to see the patch body first. Needs the chat.users.sections scope.

NameTypeReqDescription
display_namestringyesthe new label, 1 to 80 characters
dry_runboolean–return the patch body without applying it
section_namestringyesthe section to rename, users/{user}/sections/{section}, from list_sections
NameTypeReqDescription
display_namestringyeswhat it is called
dry_runbooleanyestrue when nothing was changed
rendered_payloadnull|objectyeson a dry run, the exact body that would have been sent; null otherwise
section_namenull|stringyesthe section's resource name; null after a dry-run create, because Google assigns the id

No examples provided.

search_messages ~641

Search Google Chat message history. Two searches in one tool. Pass query and Google searches every space you can see, matching whole words; narrow it with space_id, sender_email, mentions_me, has_attachment, has_link, unread_only and a time window. Pass regex instead and this server scans one space itself, which is the only way to match a pattern or part of a word — it needs space_id, reads pages of history, and takes none of the filters. Prefer query. If cap_reached is true the answer is partial; if unparsed is non-zero it is incomplete, and saying the space is empty would be wrong. Each hit carries its links, what it quotes, its files and reaction counts, and when it was edited.

NameTypeReqDescription
by_relevanceboolean–order by relevance instead of newest first. Google has this in Developer Preview and refuses it outside that program
created_afterstring–only messages created at or after this time; RFC 3339, such as 2026-01-01T00:00:00Z. Strongly recommended for a regex scan: an unbounded scan of a busy space stops at the page cap and returns a parti…
created_beforestring–only messages created before this time; RFC 3339
has_attachmentboolean–only messages carrying an attachment. Google's search only
has_linkboolean–only messages containing a hyperlink. Google's search only
limitinteger–how many matches to return, 1 to 100; default 50
max_pagesinteger–how many pages of history a regex scan may read, 1 to 50; default 10
mentions_meboolean–only messages that @-mention you. Google's search only
page_tokenstring–continue Google's search from a previous next_page_token
querystring–keywords for Google's own search, matched as a phrase across whole words. Quotes, backslashes and brackets are not allowed; use regex for a literal or partial-word match
regexstring–a regular expression in RE2 syntax, scanned by this server over one space rather than by Google. The only way to match a pattern or part of a word, and the slowest: it reads pages of history. Cannot…
sender_emailstring–only messages from this person. Google's search only
space_idstring–the space to search, spaces/{id}. Google's search takes every space you can see when this is omitted; a regex scan needs it
space_namestring–only messages in spaces whose display name holds every one of these words, such as Project Alpha. Google searches its top five matching spaces. Google's search only
space_typestring–only messages in spaces of this kind: SPACE, GROUP_CHAT or DIRECT_MESSAGE. Google's search only
unread_onlyboolean–only messages you have not read. Google's search only, and it needs the read-state scope as well as the message one
NameTypeReqDescription
cap_reachedbooleanyestrue when there is more than was returned: a scan that hit max_pages or filled the limit, or a Google search with a further page. The answer is partial, so say so
matchesnull|arrayyesthe messages that matched, newest first
next_page_tokenstring–pass back as page_token to continue Google's search; a regex scan has none
scannedintegeryeshow many messages were read before filtering. Google filters upstream, so its search reports what it returned
server_sidebooleanyestrue when Google ran the search, false when this server scanned one space for a pattern
unparsedintegeryesmessages that were read but could not be searched. Non-zero means this result is INCOMPLETE, which is not the same as no matches; say so rather than reporting the space as empty

No examples provided.

search_people ~160

Look someone up across the caller's Workspace directory and their own contacts, and get their email address. Each hit says which source produced it. Directory hits are remembered, so a later get_messages or list_members resolves the same person without another lookup. Use it to turn a name or a fragment of one into the email address the other tools take.

NameTypeReqDescription
limitinteger–how many to return, 1 to 100; default 10
querystringyesa name or email fragment, 1 to 200 characters
sourcesnull|array–which upstreams to ask: DIRECTORY for the Workspace directory, CONTACTS for the caller's own contacts. Default asks both, which covers a Workspace account and a personal one
NameTypeReqDescription
peoplenull|arrayyesthe matches, deduplicated across sources
sources_attemptednull|arrayyeswhich upstreams were asked
sources_succeedednull|arrayyeswhich upstreams answered. A source that was attempted but did not succeed refused, and the matches come from the rest
total_returnedintegeryeshow many matches are in people

No examples provided.

search_spaces ~240

Search the named Google Chat spaces you are a member of by display name, or every space in the Workspace with use_admin_access. Use find_group_chats for a group chat, which this cannot return. Matching is by word prefix. Without admin access Google returns a single page of up to 100 and no total.

NameTypeReqDescription
display_namestring–match spaces whose name begins with these words; matching is by word prefix, not substring, so 'eng' finds 'Engineering' but 'ing' does not. Omit to list every named space the other filters allow
external_user_allowednull|boolean–true for spaces that admit people outside the organization, false for those that do not; omit for both
limitinteger–how many to return, 1 to 100; default 50
page_tokenstring–continue a previous search; Google returns a token only with admin access
use_admin_accessboolean–search every space in the Workspace rather than the ones you can see. Needs Workspace admin rights and the admin toolset, which is off unless GCM_TOOLSETS names it
NameTypeReqDescription
next_page_tokenstring–pass back as page_token for the next page; only ever set under admin access
resultnull|arrayyesthe named spaces that matched
total_sizeinteger–how many spaces matched in total, an estimate above 10000; only ever set under admin access

No examples provided.

send_message ~591

Post a text message to a Chat space, a group chat or a direct message. The body is posted exactly as given: nothing is added to it, and nothing in it is rewritten. To @mention someone, put <users/their@address> in the text yourself; a mention of everyone in the space, <users/all>, is refused [blocked], since it notifies every member. Pass thread_name to reply in an existing thread, which every message carries as thread_id. Set dry_run to see the request body without posting. The post carries a client-assigned id, so this server's own retries cannot leave two copies — but calling the tool again after an error can, because that is a new post. Read the space first if you are unsure. To send a file, upload it with upload_attachment first and pass the token it returns.

NameTypeReqDescription
attachment_upload_tokenstring–attach a file uploaded beforehand: the upload_token from upload_attachment, for the same space. One file per message, and the token is spent once it is posted
client_message_idstring–an id you choose, so that repeating this exact call lands on the same message instead of posting a second one. Must start with 'client-', be at most 63 characters, and hold only lowercase letters, di…
dry_runboolean–return the request body without posting; call again without it to post
markdownboolean–read the text as standard Markdown rather than Chat's own syntax: **bold**, [label](https://example.com), lists and code blocks. A mention is then written <chat-user data-email="their@address">; a me…
quote_messagestring–quote this message above the text, as a reply to it: spaces/{space}/messages/{message}, in the same space. Google refuses to forward a message under a person's sign-in, so one from another space cann…
reply_fallbackboolean–if the thread named is gone, start a new thread instead of failing. Only meaningful with thread_name; the default fails, so a reply never lands somewhere unexpected
space_idstringyesthe space to post in, spaces/{id}, from list_spaces or find_direct_message
textstringyesthe message body, 1 to 4096 characters; posted exactly as given. To @mention someone, write <users/their@address> in the text: Google resolves the address itself when the server is signed in as a per…
thread_namestring–reply in this thread, spaces/{space}/threads/{thread}; omit to start a new one
NameTypeReqDescription
dry_runbooleanyestrue when nothing was posted
message_idnull|stringyesthe new message's resource name; null after a dry run, because nothing was posted
rendered_payloadnull|objectyeson a dry run, the exact body that would have been posted; null on a real post
space_idstringyesthe space it went to
thread_idnull|stringyesthe thread it landed in; null after a dry run

No examples provided.

set_availability ~171

Set your own Chat presence to ACTIVE, AWAY or DO_NOT_DISTURB. Do not disturb needs an expiry — minutes or until — which Google requires and caps at a year. Other people see this, so it is worth asking before silencing someone's notifications on their behalf.

NameTypeReqDescription
dry_runboolean–check the arguments without changing anything
minutesinteger–how long do-not-disturb should last. Pass this or until, and only with DO_NOT_DISTURB, which Google requires an expiry for and caps at a year
statestringyesACTIVE, AWAY or DO_NOT_DISTURB. IDLE cannot be set: Google decides it
untilstring–when do-not-disturb should end, RFC 3339. Pass this or minutes
NameTypeReqDescription
do_not_disturb_untilnull|stringyeswhen do-not-disturb ends, RFC 3339 in UTC; null when you are not in it
dry_runbooleanyestrue when nothing was changed
statestringyesACTIVE, IDLE, AWAY, DO_NOT_DISTURB, or STATE_UNSPECIFIED for a state this server does not recognize. IDLE is Google's to report, not yours to set
status_emojistring–the emoji beside that status
status_expiresnull|stringyeswhen the custom status lapses, RFC 3339 in UTC; null when it does not
status_textstring–the custom status beside your name, if you have one

No examples provided.

set_custom_status ~214

Set the text and emoji beside your name in Chat, or clear it. Google wants both together and refuses one without the other; a custom emoji is not accepted here, only a Unicode one. An expiry is optional, unlike do-not-disturb's. Everyone who sees you in Chat sees this.

NameTypeReqDescription
clearboolean–remove the status you have instead of setting one. Takes no other argument
dry_runboolean–return the request body without changing anything
emojistring–one Unicode emoji beside the text. Google requires it alongside the text and refuses one of your organization's custom emoji here. Required unless clear is set
minutesinteger–how long the status should last. Pass this or until; leave both out and it stays until you change it
textstring–what the status says, up to 64 characters. Required unless clear is set
untilstring–when the status should lapse, RFC 3339. Pass this or minutes
NameTypeReqDescription
clearedbooleanyestrue when the status was removed rather than set
do_not_disturb_untilnull|stringyeswhen do-not-disturb ends, RFC 3339 in UTC; null when you are not in it
dry_runbooleanyestrue when nothing was changed
rendered_payloadnull|objectyeson a dry run, the exact body that would have been sent; null otherwise
statestringyesACTIVE, IDLE, AWAY, DO_NOT_DISTURB, or STATE_UNSPECIFIED for a state this server does not recognize. IDLE is Google's to report, not yours to set
status_emojistring–the emoji beside that status
status_expiresnull|stringyeswhen the custom status lapses, RFC 3339 in UTC; null when it does not
status_textstring–the custom status beside your name, if you have one

No examples provided.

unpin_message ~87

Remove a message's pin. Takes the message, not the pin: Google gives a pin the message's own id. A message that was not pinned reports unpinned false rather than failing.

NameTypeReqDescription
dry_runboolean–check the arguments without changing anything
message_namestringyesthe message, spaces/{space}/messages/{message}. The space is taken from it
NameTypeReqDescription
dry_runbooleanyestrue when nothing was changed
message_idstringyesthe message that was named
pin_namestringyesthe pin's resource name; empty after a dry run
pinnedbooleanyestrue only when this call pinned the message
unpinnedbooleanyestrue only when this call removed a pin. False can mean the message was not pinned

No examples provided.

update_member_role ~153

Make a manager or an assistant manager an ordinary member of a space again: role MEMBER. Demoting the last manager may leave nobody able to administer the space. Making someone a manager is refused [blocked] here; promote_member does it. Role is the only thing this changes. Set dry_run to see the request body without sending it.

NameTypeReqDescription
dry_runboolean–return the request body without changing anything
membership_namestringyesthe membership to change, spaces/{space}/members/{member}, from list_members
rolestringyesMEMBER, to make a manager an ordinary member again. MANAGER and ASSISTANT_MANAGER are refused here: making someone a manager is promote_member's
NameTypeReqDescription
dry_runbooleanyestrue when nothing was changed
membership_namestringyesthe membership that was named
rendered_payloadnull|objectyeson a dry run, the exact body that would have been sent; null on a real change
rolestringyesthe role Google recorded, in its own spelling; after a dry run, the role that was asked for

No examples provided.

Install

How do I install the io.github.mmedum/google-chat-mcp server?

io.github.mmedum/google-chat-mcp ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 210f2c43afe76892409291a082e7036ce39d1165164c1bd3e02c48982046df2e; the commands to do that are on this page. If it does not match, do not open it.

mcpb · google-chat-mcp_6.1.0.mcpb

Download bundle

Check the download matches the SHA-256 the MCP registry declares before you open it. If it does not match, do not open the file.

SHA-256

210f2c43afe76892409291a082e7036ce39d1165164c1bd3e02c48982046df2e

macOS / Linux

echo "210f2c43afe76892409291a082e7036ce39d1165164c1bd3e02c48982046df2e  google-chat-mcp_6.1.0.mcpb" | shasum -a 256 -c

Windows (PowerShell)

(Get-FileHash -Algorithm SHA256 .\google-chat-mcp_6.1.0.mcpb).Hash -eq "210f2c43afe76892409291a082e7036ce39d1165164c1bd3e02c48982046df2e"

Run it in the folder you saved the bundle to, then open the file with an MCPB-capable host such as Claude Desktop.

Common questions

What is the io.github.mmedum/google-chat-mcp server?

io.github.mmedum/google-chat-mcp is listed in the public MCP registry as io.github.mmedum/google-chat-mcp. Google Chat as MCP tools: read, search and write to your spaces, direct messages and sidebar. This page covers its MCPB bundle (https://github.com/mmedum/google-chat-mcp/releases/download/v6.1.0/google-chat-mcp_6.1.0.mcpb).

Is the io.github.mmedum/google-chat-mcp server safe to use?

io.github.mmedum/google-chat-mcp scores 63 out of 100 on VerifyMCP. Its build provenance is signed and verified. 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 io.github.mmedum/google-chat-mcp server expose?

io.github.mmedum/google-chat-mcp exposes 49 tools: add_member, add_reaction, create_custom_emoji, create_group_chat, create_section, and 44 more. Their descriptions and schemas cost roughly 7,863 tokens of context every time the server is loaded.

What licence is the io.github.mmedum/google-chat-mcp server under?

io.github.mmedum/google-chat-mcp declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.