Agent skill

Google Chat Messages

by jezweb in jezweb/claude-skills

Send Google Chat messages via incoming webhooks — text, rich cards (cardsV2), threaded replies.

MITAuto-check passedBackend & APIs

Install Google Chat Messages

skills CLI
$ npx skills add jezweb/claude-skills --skill google-chat-messages -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install jezweb/claude-skills google-chat-messages --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/jezweb/claude-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/integrations/skills/google-chat-messages .claude/skills/google-chat-messages && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
google-chat-messages
GitHub stars
1.1k
Token cost
~2.5k tokens
SKILL.md length
508 words
Files
4 (incl. assets)
Skills in repo
52
Repo updated
First seen
Licence
MIT

At a glance

Send Google Chat messages via incoming webhooks — text, rich cards (cardsV2), threaded replies.

  • Works in 3 steps: Get Webhook URL → Choose Message Type → Send the Message
  • The user wants to post to Google Chat from a script
  • SKILL.md covers What You Produce, Workflow, Text Formatting and cardsV2 Structure, plus 6 more sections
  • Runs TypeScript scripts from its folder; reaches github.githubassets.com and github.com

What it does

Google Chat Messages is an agent skill from jezweb/claude-skills. Send Google Chat messages via incoming webhooks — text, rich cards (cardsV2), threaded replies. TypeScript types, card builder utility, widget reference inline. Use whenever the user wants to post to Google Chat from a script, build a chatbot reply, send a notification card, build a Google Chat webhook integration, or troubleshoot card / threading issues.

Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including assets (for example `assets/card-builder.ts`, `assets/types.ts` and `assets/webhook-sender.ts`). Compatibility notes: claude-code-only

It sits in Backend & APIs, covering Webhooks and Type safety. The repository describes itself as: Skills for Claude Code CLI such as full stack dev Cloudflare, React, Tailwind v4, and AI integrations. The licence is MIT.

When your agent uses it

  • The user wants to post to Google Chat from a script
  • Build a chatbot reply
  • Send a notification card
  • Build a Google Chat webhook integration

Example prompts

  • “/google-chat-messages”

Requirements

  • Node.js
  • Compatibility (from SKILL.md): claude-code-only

Workflow steps

3 steps, taken from the step headings in SKILL.md.

  1. Get Webhook URL
  2. Choose Message Type
  3. Send the Message

What it can do on your machine

Read from SKILL.md and the folder at commit 1260fa7. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships script files (TypeScript), which the agent can run.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • github.githubassets.com
    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    claude-code-only

    From compatibility in the SKILL.md frontmatter.

Context cost

Google Chat Messages loads about 2.5k tokens when it runs. Until then it costs about 95 tokens; SKILL.md has 508 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~95
When it runs · the whole SKILL.md, loaded when a task matches
~2.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from jezweb/claude-skills at commit 1260fa7, republished under its MIT licence (© jezweb). 508 words, ~2,452 tokens.

Download SKILL.mdSave it as .claude/skills/google-chat-messages/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
google-chat-messages
description
Send Google Chat messages via incoming webhooks — text, rich cards (cardsV2), threaded replies. TypeScript types, card builder utility, widget reference inline. Use whenever the user wants to post to Google Chat from a script, build a chatbot reply, send a notification card, build a Google Chat webhook integration, or troubleshoot card / threading issues.
compatibility
claude-code-only

Google Chat Messages

Send messages to Google Chat spaces via incoming webhooks. Produces text messages, rich cards (cardsV2), and threaded replies.

What You Produce

  • Text messages with Google Chat formatting
  • Rich card messages (cardsV2) with headers, sections, widgets
  • Threaded conversations
  • Reusable webhook sender utility

Workflow

Step 1: Get Webhook URL

In Google Chat:

  1. Open a Space > click space name > Manage webhooks
  2. Create webhook (name it, optionally add avatar URL)
  3. Copy the webhook URL

Store the URL as an environment variable or in your secrets manager — never hardcode.

Step 2: Choose Message Type
NeedTypeComplexity
Simple notificationText messageLow
Structured info (status, digest)Card message (cardsV2)Medium
Ongoing updatesThreaded repliesMedium
Action buttons (open URL)Card with buttonListMedium
Step 3: Send the Message

Use assets/webhook-sender.ts for the sender utility. Use assets/card-builder.ts for structured card construction.

Text Formatting

Google Chat does NOT use standard Markdown.

FormatSyntaxExample
Bold*text**important*
Italic_text__emphasis_
Strikethrough~text~~removed~
Monospace`text``code`
Code block```text```Multi-line code
Link<url|text><https://example.com|Click here>
Mention user<users/USER_ID><users/123456>
Mention all<users/all><users/all>

Not supported: **double asterisks**, headings (###), blockquotes, tables, images inline.

Text Message Example
typescript
await sendText(webhookUrl, '*Build Complete*\n\nBranch: `main`\nStatus: Passed\n<https://ci.example.com/123|View Build>');

cardsV2 Structure

Cards use the cardsV2 format (recommended over legacy cards).

typescript
const message = {
  cardsV2: [{
    cardId: 'unique-id',
    card: {
      header: {
        title: 'Card Title',
        subtitle: 'Optional subtitle',
        imageUrl: 'https://example.com/icon.png',
        imageType: 'CIRCLE'  // or 'SQUARE'
      },
      sections: [{
        header: 'Section Title',  // optional
        widgets: [
          // widgets go here
        ]
      }]
    }
  }]
};

Widget Reference

All widget types available in cardsV2 sections.

textParagraph

Formatted text block. Supports Google Chat formatting (*bold*, _italic_, <url|text>).

typescript
{
  textParagraph: {
    text: '*Status*: All systems operational\n_Last checked_: 5 minutes ago'
  }
}
decoratedText

Labelled value with optional icons. Most versatile widget for key-value data.

Basic:

typescript
{
  decoratedText: {
    topLabel: 'Environment',
    text: 'Production',
    bottomLabel: 'Last deployed 2h ago'
  }
}

With start icon:

typescript
{
  decoratedText: {
    topLabel: 'Status',
    text: 'Healthy',
    startIcon: { knownIcon: 'STAR' }
  }
}

With custom icon URL:

typescript
{
  decoratedText: {
    topLabel: 'GitHub',
    text: 'PR #142 merged',
    startIcon: {
      iconUrl: 'https://github.githubassets.com/favicons/favicon.svg',
      altText: 'GitHub'
    }
  }
}

With button:

typescript
{
  decoratedText: {
    topLabel: 'Alert',
    text: 'CPU at 95%',
    button: {
      text: 'View',
      onClick: { openLink: { url: 'https://monitoring.example.com' } }
    }
  }
}

Clickable (whole widget):

typescript
{
  decoratedText: {
    text: 'View full report',
    wrapText: true,
    onClick: { openLink: { url: 'https://reports.example.com' } }
  }
}

With wrap text:

typescript
{
  decoratedText: {
    topLabel: 'Description',
    text: 'This is a longer description that should wrap to multiple lines instead of being truncated',
    wrapText: true
  }
}
buttonList

One or more action buttons. Buttons open URLs or trigger actions.

Single button:

typescript
{
  buttonList: {
    buttons: [{
      text: 'Open Dashboard',
      onClick: { openLink: { url: 'https://dashboard.example.com' } }
    }]
  }
}

Multiple buttons:

typescript
{
  buttonList: {
    buttons: [
      {
        text: 'Approve',
        onClick: { openLink: { url: 'https://app.example.com/approve/123' } },
        color: { red: 0, green: 0.5, blue: 0, alpha: 1 }
      },
      {
        text: 'Reject',
        onClick: { openLink: { url: 'https://app.example.com/reject/123' } }
      }
    ]
  }
}

Button with icon:

typescript
{
  buttonList: {
    buttons: [{
      text: 'View on GitHub',
      icon: { knownIcon: 'BOOKMARK' },
      onClick: { openLink: { url: 'https://github.com/org/repo/pull/42' } }
    }]
  }
}
image

Standalone image widget.

typescript
{
  image: {
    imageUrl: 'https://example.com/chart.png',
    altText: 'Monthly usage chart'
  }
}
divider

Horizontal line separator between widgets.

typescript
{ divider: {} }
Collapsible Sections

Sections can be collapsed with only the first N widgets visible:

typescript
{
  header: 'Details',
  collapsible: true,
  uncollapsibleWidgetsCount: 2,  // Show first 2, collapse rest
  widgets: [
    { decoratedText: { topLabel: 'Status', text: 'Active' } },
    { decoratedText: { topLabel: 'Region', text: 'AU' } },
    // These start collapsed
    { decoratedText: { topLabel: 'Instance', text: 'prod-01' } },
    { decoratedText: { topLabel: 'Memory', text: '2.1 GB' } },
    { decoratedText: { topLabel: 'CPU', text: '45%' } }
  ]
}
Show full SKILL.md (213 more words)Show less

Known Icons

Icons available via knownIcon in decoratedText and button widgets.

typescript
{ startIcon: { knownIcon: 'STAR' } }
// or
{ icon: { knownIcon: 'EMAIL' } }
Icon NameUse For
AIRPLANETravel, flights
BOOKMARKSave, reference, links
BUSTransport, transit
CARDriving, transport
CLOCKTime, duration, schedule
CONFIRMATION_NUMBER_ICONTickets, bookings
DESCRIPTIONDocuments, files
DOLLARMoney, pricing, cost
EMAILEmail, messages
INVITEInvitations
MAP_PINLocation, address
MEMBERSHIPMembers, users
MULTIPLE_PEOPLETeams, groups
OFFERDeals, promotions
PERSONIndividual user
PHONEPhone number, calls
SHOPPING_CARTCommerce, purchases
STARRating, favourite, important
STOREShop, retail
TICKETTickets, events
VIDEO_CAMERAVideo, meetings

For icons not in the list, use iconUrl with any publicly accessible image (square, ideally 24x24 or 48x48 pixels).

Threading

Thread messages together using threadKey:

typescript
// First message — creates thread
const response = await sendCard(webhookUrl, card, {
  threadKey: 'deploy-2026-02-16'
});

// Reply to thread — append &messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD
const threadUrl = `${webhookUrl}&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD`;
await sendCard(threadUrl, replyCard, {
  threadKey: 'deploy-2026-02-16'
});

The threadKey is a client-assigned string. Use consistent keys for related messages (e.g., deploy-{date}, alert-{id}).

Common Patterns

Notification Card
typescript
import { buildCard, sendCard } from './assets/card-builder';
import { sendWebhook } from './assets/webhook-sender';

const card = buildCard({
  cardId: 'deploy-notification',
  title: 'Deployment Complete',
  subtitle: 'production - v2.1.0',
  imageUrl: 'https://example.com/your-icon.png',
  sections: [{
    widgets: [
      { decoratedText: { topLabel: 'Environment', text: 'Production' } },
      { decoratedText: { topLabel: 'Version', text: 'v2.1.0' } },
      { decoratedText: { topLabel: 'Status', text: '*Healthy*', startIcon: { knownIcon: 'STAR' } } },
      { buttonList: { buttons: [{ text: 'View Deployment', onClick: { openLink: { url: 'https://dash.example.com' } } }] } }
    ]
  }]
});
Digest Card (Weekly Summary)
typescript
const digest = buildCard({
  cardId: 'weekly-digest',
  title: 'Weekly Summary',
  subtitle: `${count} updates this week`,
  sections: [
    {
      header: 'Highlights',
      widgets: items.map(item => ({
        decoratedText: { text: item.title, bottomLabel: item.date }
      }))
    },
    {
      widgets: [{
        buttonList: {
          buttons: [{ text: 'View All', onClick: { openLink: { url: dashboardUrl } } }]
        }
      }]
    }
  ]
});

Error Prevention

MistakeFix
**bold** in textUse *bold* (single asterisks)
[text](url) linksUse <url|text> format
Missing cardsV2 wrapperWrap card in { cardsV2: [{ cardId, card }] }
Thread replies not threadingAppend &messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD to webhook URL
Webhook returns 400Check JSON structure — common issue is missing text or cardsV2 at top level
Card not showingEnsure sections has at least one widget

Asset Files

FilePurpose
assets/types.tsTypeScript type definitions for cardsV2
assets/card-builder.tsUtility to build card messages
assets/webhook-sender.tsPOST to webhook with error handling

© jezweb, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files (assets) in plugins/integrations/skills/google-chat-messages of jezweb/claude-skills.

  • SKILL.md
  • assets/card-builder.ts
  • assets/types.ts
  • assets/webhook-sender.ts

Open the folder on GitHubat commit 1260fa7

Compare with similar skills

Google Chat Messages next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Google Chat Messages compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Google Chat Messages this skilljezweb/claude-skills1.1k—~2.5kAutomated safety check: PassMIT
Kopiur Designhome-operations/kopiur115—~2.4kAutomated safety check: PassAGPL-3.0
Novu Design Workflownovuhq/novu40k—~2.6kAutomated safety check: PassCustom licence
GraphQL Operations with CodegenChrisWiles/claude-code-showcase6.1k3 repos~1.5kAutomated safety check: PassNone
Golivemikehasa/golive-skill1.3k—~13kAutomated safety check: NotesMIT
Stripe Appsfossasia/eventyay1.7k1 repos~3.6kAutomated safety check: PassApache-2.0

Similar skills

  • Kopiur Design

    home-operations/kopiur

    Design norms and locked decisions for the Kopiur Kopia-native Kubernetes backup operator (Rust/kube-rs).

    115 GitHub stars~2.4k tokensUpdated today
    DevOps & CloudAuto-check passed
  • Design notification workflows the Novu way — choose channels, set severity, decide when a workflow is critical, configure digests, and route based on subscriber state.

    40k GitHub stars~2.6k tokensUpdated today
    Backend & APIsAuto-check passed
  • GraphQL Operations with Codegen

    ChrisWiles/claude-code-showcase

    Sets the rules for writing GraphQL queries and mutations in .gql files, running codegen, and using generated Apollo hooks with proper error and loading handling.

    6.1k GitHub starsUsed in 3 repos~1.5k tokens
    Backend & APIsAuto-check passed
  • Golive

    mikehasa/golive-skill

    Take an agent-written app from repo to live production on the user's OWN accounts, with providers they choose (hosting, database, auth, payments, email, domain/DNS).

    1.3k GitHub stars~13k tokensUpdated 6 days ago
    Backend & APIsAuto-check: notes
  • Stripe Apps

    fossasia/eventyay

    A skill your agent uses when building, modifying, or reviewing a Stripe App — or when the user describes something that implies one (e.g.

    1.7k GitHub starsUsed in 1 repo~3.6k tokens
    Backend & APIsAuto-check passed
  • Dingtalk Message

    agentscope-ai/ReMe

    钉钉消息发送技能。支持企业内部机器人(批量单聊/群聊)和 Webhook 自定义机器人两种接入方式,支持多机器人管理,支持文本、Markdown、链接、ActionCard、FeedCard等多种消息类型。

    3.6k GitHub stars~1.6k tokensUpdated yesterday
    Backend & APIsAuto-check passed

More from jezweb/claude-skills

All 52 skills in this repo
  • Favicon Gen

    jezweb/claude-skills

    Generate custom favicons from logos, text, or brand colours.

    1.1k GitHub starsUsed in 1 repo~1k tokens
    Auto-check passed
  • Tailwind Theme Builder

    jezweb/claude-skills

    Set up Tailwind v4 + shadcn/ui themed UI with dark mode. An agent skill from jezweb/claude-skills.

    1.1k GitHub starsUsed in 1 repo~3.2k tokens
    Auto-check passed
  • Elevenlabs Agents

    jezweb/claude-skills

    Build conversational AI voice agents on the ElevenLabs platform.

    1.1k GitHub stars~3.3k tokensUpdated yesterday
    Auto-check passed
  • Responsiveness Check

    jezweb/claude-skills

    Test website responsiveness across viewport widths using browser automation.

    1.1k GitHub starsUsed in 1 repo~1.7k tokens
    Auto-check passed
  • MCP Builder

    jezweb/claude-skills

    Build MCP servers in Python with FastMCP. An agent skill from jezweb/claude-skills.

    1.1k GitHub stars~3.1k tokensUpdated yesterday
    Auto-check: notes
  • GitHub Release

    jezweb/claude-skills

    Prepare and publish GitHub releases. An agent skill from jezweb/claude-skills.

    1.1k GitHub stars~944 tokensUpdated yesterday
    Auto-check: notes

Categories

Questions about Google Chat Messages

What does Google Chat Messages do?

Send Google Chat messages via incoming webhooks — text, rich cards (cardsV2), threaded replies. Google Chat Messages is an agent skill from jezweb/claude-skills. Send Google Chat messages via incoming webhooks — text, rich cards (cardsV2), threaded replies.

When should I use Google Chat Messages?

Google Chat Messages fits situations like: the user wants to post to Google Chat from a script; build a chatbot reply; send a notification card; build a Google Chat webhook integration.

How do I install Google Chat Messages in Claude Code?

Run `npx skills add jezweb/claude-skills --skill google-chat-messages -a claude-code`. Or copy the skill folder (plugins/integrations/skills/google-chat-messages in jezweb/claude-skills) into .claude/skills/google-chat-messages in your project. Claude Code loads it when a task matches its description.

How do I install Google Chat Messages in Codex?

Run `npx skills add jezweb/claude-skills --skill google-chat-messages -a codex`. Or copy the skill folder (plugins/integrations/skills/google-chat-messages in jezweb/claude-skills) into .agents/skills/google-chat-messages in your project. Codex loads it when a task matches its description.

Can I use Google Chat Messages in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jezweb/claude-skills --skill google-chat-messages -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/google-chat-messages, .gemini/skills/google-chat-messages, .github/skills/google-chat-messages and .opencode/skills/google-chat-messages in your project.

What does Google Chat Messages need to run?

Going by SKILL.md and its folder, Google Chat Messages needs TypeScript for the scripts in its folder. Our summary lists: Node.js. Compatibility (from SKILL.md): claude-code-only.

Does Google Chat Messages access the network?

SKILL.md names 2 domains. In commands or code: github.githubassets.com and github.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.

Is Google Chat Messages safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Google Chat Messages use?

Google Chat Messages is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Google Chat Messages use?

About 2.5k tokens (SKILL.md is roughly 9.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Google Chat Messages?

Skills that share tags, products or a category with Google Chat Messages: Kopiur Design (home-operations/kopiur, 115 stars), Novu Design Workflow (novuhq/novu, 40k stars), GraphQL Operations with Codegen (ChrisWiles/claude-code-showcase, 6.1k stars) and Golive (mikehasa/golive-skill, 1.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Google Chat Messages?

jezweb (a GitHub user) maintains it in jezweb/claude-skills, which has 1,055 GitHub stars. The repository holds 52 skills in this directory. The repository was last updated on October 9, 2026.

Source: jezweb/claude-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.