Skip to main content
Glama
ice3x2

Google Chat Webhook MCP Server

by ice3x2

Google Chat Webhook MCP Server

CI npm version License: MIT

An MCP (Model Context Protocol) server that sends messages to Google Chat via webhooks. Automatically converts Markdown to Google Chat Cards V2 format with image validation, structured logging, and fallback handling.

Features

  • ๐Ÿš€ MCP Protocol Support: Integrates with Claude Code, GitHub Copilot, and other MCP clients

  • ๏ฟฝ MCP Protocol Support: Integrates with Claude Code, GitHub Copilot, and other MCP clients

  • ๏ฟฝ๐Ÿ“ Markdown โ†’ Cards V2 Auto-conversion: Supports headers, lists, code blocks, tables, images, and more

  • ๐Ÿ–ผ๏ธ Image URL Validation: Validates with HEAD requests (HTTP status, Content-Type, size)

  • ๐Ÿ”„ Auto Fallback: Automatically falls back to text when Cards V2 fails

  • ๐Ÿ“Š Structured Logging: JSON format with 30-day retention

  • โœ… Test Automation: Snapshot tests, integration tests, CI/CD pipeline

Installation

npm install -g google-chat-webhook-mcp

From Source (Development)

git clone https://github.com/ice3x2/google-chat-webhook-mcp.git cd google-chat-webhook-mcp npm install npm run build

Google Chat Webhook Setup

Before configuring the MCP server, create a Google Chat Webhook URL:

  1. Open your Google Chat space

  2. Menu โ†’ "Apps & integrations" โ†’ "Manage webhooks"

  3. Click "Add webhook"

  4. Enter a name and copy the URL

  5. Use it in the configuration below

MCP Client Configuration

1. Claude Code

Config File Location

  • Windows: %USERPROFILE%\.claude.json

  • macOS/Linux: ~/.claude.json

Note: Claude Desktop uses different paths:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

npm Installation

{ "mcpServers": { "google-chat": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx" } } } }

Source Installation

{ "mcpServers": { "google-chat": { "command": "node", "args": ["C:\\path\\to\\google-chat-webhook-mcp\\dist\\index.js"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx" } } } }

โš ๏ธ Note: Use \\ or / for Windows paths (e.g., C:/path/to/...)

Configuration Scopes

Claude Code supports three configuration scopes:

  1. User Scope (Global): ~/.claude.json - Available across all projects

  2. Project Scope (Shared): .mcp.json in project root - Version-controlled, team-shared

  3. Local Scope (Private): Project-specific, personal settings

Priority: Local > Project > User

Project-Scoped Configuration (.mcp.json)

For team-shared MCP servers, create .mcp.json in your project root:

{ "mcpServers": { "google-chat": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "${GOOGLE_CHAT_WEBHOOK_URL}" } } } }

Benefits:

  • โœ… Version-controlled with Git

  • โœ… Team-shared configuration

  • โœ… Environment variable support: ${VAR} or ${VAR:-default}

  • โœ… Project-specific MCP servers

Environment Variables: Each team member can set their own webhook URL:

# Linux/macOS export GOOGLE_CHAT_WEBHOOK_URL="https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx" # Windows (PowerShell) $env:GOOGLE_CHAT_WEBHOOK_URL="https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx"

How to Apply

User-scoped configuration (~/.claude.json):

  1. Edit ~/.claude.json (or %USERPROFILE%\.claude.json on Windows)

  2. Save the file

  3. Restart Claude Code if already running

Project-scoped configuration (.mcp.json):

  1. Create .mcp.json in project root

  2. Set environment variables for sensitive data

  3. Commit .mcp.json to version control

  4. Use commands like "Send a message to Google Chat"

2. GitHub Copilot (VS Code)

VS Code GitHub Copilot supports MCP through agent mode. Configure MCP servers in workspace or user settings.

Configuration File Locations

Choose one of the following:

  • User Settings: ~/.vscode/settings.json or %APPDATA%\Code\User\settings.json (Windows)

  • Workspace Settings: .vscode/settings.json in your project root

  • Claude Code Config (Auto-import): Copy from ~/.claude.json

Configuration (mcp.json format)

Add to settings.json:

{ "github.copilot.chat.mcp.servers": { "google-chat": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx" } } } }

Features

  • Agent Mode Integration: MCP tools available in agent workflow

  • Per-Session Tool Selection: Choose which tools to enable per session

  • STDIO & SSE Support: Both transport types supported

  • Debugging: Restart commands and output logging built-in

Using with Agent Mode

  1. Open GitHub Copilot Chat in VS Code

  2. Enable agent mode (if not already enabled)

  3. Start a conversation - Copilot will automatically access MCP tools

  4. Tools require approval before execution

Example:

@workspace Send a deployment summary to Google Chat

๐Ÿ“ Note: GitHub Copilot's MCP support includes agent mode, allowing sophisticated workflows. Make sure you're using the latest VS Code and GitHub Copilot extension.

3. Other MCP Clients

Works with any MCP-compatible client:

{ "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "your-webhook-url" } }

Usage

MCP Tools (3 Tools)

Available tools in Claude Code or other MCP clients:

1. send_google_chat_text

Send simple text messages

Example (Claude Code):

Send "Hello from Claude!" to Google Chat

Parameters:

{ "text": "Hello, Google Chat!" }

2. send_google_chat_cards_v2

Send Cards V2 format directly (advanced users)

Parameters:

{ "text": "Card Message", "cardsV2": [ { "cardId": "unique-card", "card": { "header": { "title": "Card Title" }, "sections": [ { "widgets": [ { "textParagraph": { "text": "Card content" } } ] } ] } } ] }

3. send_google_chat_markdown โญ Recommended

Convert Markdown to Cards V2 and send

Example (Claude Code):

Send this markdown to Google Chat: # Project Update - Task 1: โœ… Completed - Task 2: ๐Ÿšง In Progress **Deadline**: Tomorrow

Parameters:

{ "markdown": "# Title\n\n**Bold** and *italic*\n\n- List item 1\n- List item 2\n\n```python\nprint('Hello')\n```", "cardTitle": "Markdown Message", "fallbackToText": true }

Options:

  • cardTitle: Title shown at the top of the card (optional)

  • fallbackToText: Auto-send as text on conversion failure (default: false)

Claude Code Usage Example

After setup, Claude will automatically use MCP tools when you chat naturally:

๐Ÿ‘ค User:

"Send a project status update to Google Chat. Show 3 completed tasks and 2 in-progress tasks as a markdown list."

๐Ÿค– Claude:

(Automatically calls send_google_chat_markdown tool)

I've sent the message to Google Chat. The project status has been updated.

Supported Markdown Syntax

Markdown written in Claude or MCP clients is automatically converted to Google Chat Cards V2.

Syntax

Markdown Example

Google Chat Rendering

Headers

# H1, ## H2, ### H3

Bold with size differences

Bold

**bold** or __bold__

bold

Italic

*italic* or _italic_

italic

Inline Code

`code`

code (monospace)

Code Block

```python\ncode\n```

Syntax-highlighted box

Ordered List

1. First\n2. Second

1. First

2. Second

Unordered List

- Item or * Item

โ€ข Item

Nested List

- nested (2-space indent)

ใ€€โ€ข nested (Em space)

Table

| A | B |\n|--|--|

Monospace table

Image

![alt](https://...)

Image widget (after validation)

Link

[text](https://...)

Clickable link

Horizontal Rule

--- or ***

Divider

Blockquote

> quote

Indented + gray text

Example Markdown:

# Project Deployment Complete ๐Ÿš€ ## Key Changes - **Performance**: API response 30% faster - **Bug Fix**: Login error resolved - New feature added ## Deployment Status | Environment | Status | Version | |-------------|--------|---------| | Production | โœ… | v2.1.0 | | Staging | โœ… | v2.1.0 | ## Next Steps 1. Monitor for 24 hours 2. Collect user feedback 3. Plan next sprint Code example: ```python def deploy(): print("Deploying v2.1.0...") return True

See documentation for details.

**Result:** Headers, lists, tables, and code blocks are all visually distinguished in Google Chat. ## Environment Variables ### Required | Variable | Description | Example | |----------|-------------|---------| | `GOOGLE_CHAT_WEBHOOK_URL` | Google Chat Webhook URL | `https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx` | ### Optional (Logging) | Variable | Description | Default | Values | |----------|-------------|---------|--------| | `LOG_LEVEL` | Log level | `INFO` | `DEBUG`, `INFO`, `WARN`, `ERROR` | | `LOG_DIR` | Log directory path | `./logs` | Absolute/relative path | | `LOG_RETENTION_DAYS` | Days to keep logs | `30` | Number (days) | | `LOG_ENABLE_CONSOLE` | Enable console output | `true` | `true`, `false` | ### Configuration Methods #### Claude Code (~/.claude.json) ```json { "mcpServers": { "google-chat": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx", "LOG_LEVEL": "INFO", "LOG_RETENTION_DAYS": "30" } } } }

.env File (Development)

Create .env in project root:

GOOGLE_CHAT_WEBHOOK_URL=https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx LOG_LEVEL=INFO LOG_DIR=./logs LOG_RETENTION_DAYS=30 LOG_ENABLE_CONSOLE=true

Limitations

Google Chat API Constraints

Item

Limit

Workaround

Image Protocol

HTTPS only

HTTP URLs replaced with text links

Image Size

Max 5MB

Show as link on validation failure

Image Auth

Public URLs only

No access if auth required

Content-Type

image/* only

HTML pages rejected

Markdown Support

Limited

Unsupported syntax approximated

Markdown Conversion Limitations

โœ… Fully Supported:

  • Headers (H1~H6)

  • Bold, italic, inline code

  • Ordered/unordered lists (up to 3 levels)

  • Code blocks (syntax highlighting)

  • Tables (monospace)

  • Links, images

โš ๏ธ Partial Support:

  • Complex nesting โ†’ Simplified

  • HTML tags โ†’ Converted to text

  • Blockquotes โ†’ Shown as indents

โŒ Not Supported:

  • Footnotes

  • Definition lists

  • Math formulas (LaTeX)

  • Task checkboxes (- [ ], - [x])

  • Emoji shortcodes (:smile:, Unicode emojis work)

FAQ

Q: Images not displaying

A: Image validation failure causes:

  1. HTTPS only (HTTP not supported)

  2. File size: Must be under 5MB

  3. Public access: Must be accessible without auth

  4. Content-Type: Response header must be image/*

Debug:

cat logs/app-YYYY-MM-DD.log | grep "image_validation_failed"

Q: Cards V2 conversion fails

A: Use fallbackToText option:

{ "markdown": "...", "fallbackToText": true }

Check logs for details:

cat logs/errors-YYYY-MM-DD.log

Q: Too many log files

A: Adjust with environment variables:

{ "env": { "LOG_LEVEL": "WARN", "LOG_RETENTION_DAYS": "7" } }

Q: Multiple Google Chat spaces

A: Register separate MCP server instances:

{ "mcpServers": { "google-chat-team-a": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/.../team-a/..." } }, "google-chat-team-b": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/.../team-b/..." } } } }

License

MIT License - LICENSE


Korean:

CI npm version License: MIT

MCP (Model Context Protocol) ์„œ๋ฒ„๋กœ Google Chat ์›นํ›…์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. Markdown์„ Google Chat Cards V2 ํ˜•์‹์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜๋ฉฐ, ์ด๋ฏธ์ง€ ๊ฒ€์ฆ, ์ž๋™ ๋กœ๊น…, ํด๋ฐฑ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • ๐Ÿš€ MCP ํ”„๋กœํ† ์ฝœ ์ง€์›: Claude Code, GitHub Copilot ๋“ฑ๊ณผ ํ†ตํ•ฉ

  • ๐Ÿ“ Markdown โ†’ Cards V2 ์ž๋™ ๋ณ€ํ™˜: ํ—ค๋”, ๋ฆฌ์ŠคํŠธ, ์ฝ”๋“œ๋ธ”๋ก, ํ‘œ, ์ด๋ฏธ์ง€ ๋“ฑ ์ง€์›

  • ๐Ÿ–ผ๏ธ ์ด๋ฏธ์ง€ URL ๊ฒ€์ฆ: HEAD ์š”์ฒญ์œผ๋กœ ์œ ํšจ์„ฑ ํ™•์ธ (HTTP ์ƒํƒœ, Content-Type, ํฌ๊ธฐ)

  • ๐Ÿ”„ ์ž๋™ ํด๋ฐฑ: Cards V2 ์‹คํŒจ ์‹œ ํ…์ŠคํŠธ๋กœ ์ž๋™ ์ „ํ™˜

  • ๐Ÿ“Š ๊ตฌ์กฐํ™”๋œ ๋กœ๊น…: JSON ํ˜•์‹, 30์ผ ์ž๋™ ๋ณด๊ด€

  • โœ… ํ…Œ์ŠคํŠธ ์ž๋™ํ™”: ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ, CI/CD ํŒŒ์ดํ”„๋ผ์ธ

์„ค์น˜

npm ์„ค์น˜ (๊ถŒ์žฅ)

npm install -g google-chat-webhook-mcp

์†Œ์Šค ์„ค์น˜ (๊ฐœ๋ฐœ์šฉ)

git clone https://github.com/ice3x2/google-chat-webhook-mcp.git cd google-chat-webhook-mcp npm install npm run build

Google Chat Webhook URL ์ƒ์„ฑ

MCP ์„œ๋ฒ„ ์„ค์ • ์ „์— ๋จผ์ € Google Chat Webhook URL์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. Google Chat ์ŠคํŽ˜์ด์Šค ์—ด๊ธฐ

  2. ์ƒ๋‹จ ๋ฉ”๋‰ด โ†’ "์•ฑ ๋ฐ ํ†ตํ•ฉ" โ†’ "Webhook ๊ด€๋ฆฌ"

  3. "Webhook ์ถ”๊ฐ€" ํด๋ฆญ

  4. ์ด๋ฆ„ ์ž…๋ ฅ ํ›„ URL ๋ณต์‚ฌ

  5. ์•„๋ž˜ ์„ค์ •์—์„œ ์‚ฌ์šฉ

MCP ํด๋ผ์ด์–ธํŠธ ์„ค์ •

1. Claude Code

์„ค์ • ํŒŒ์ผ ์œ„์น˜

  • Windows: %USERPROFILE%\.claude.json

  • macOS/Linux: ~/.claude.json

์ฐธ๊ณ : Claude Desktop์€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

npm ์„ค์น˜ ์‹œ

{ "mcpServers": { "google-chat": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx" } } } }

์†Œ์Šค ์„ค์น˜ ์‹œ

{ "mcpServers": { "google-chat": { "command": "node", "args": ["C:\\path\\to\\google-chat-webhook-mcp\\dist\\index.js"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx" } } } }

โš ๏ธ ์ฃผ์˜: Windows ๊ฒฝ๋กœ๋Š” \\ ๋˜๋Š” / ์‚ฌ์šฉ (์˜ˆ: C:/path/to/...)

์„ค์ • ์Šค์ฝ”ํ”„

Claude Code๋Š” 3๊ฐ€์ง€ ์„ค์ • ์Šค์ฝ”ํ”„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

  1. User Scope (์ „์—ญ): ~/.claude.json - ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  2. Project Scope (๊ณต์œ ): ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ .mcp.json - ๋ฒ„์ „ ๊ด€๋ฆฌ, ํŒ€ ๊ณต์œ  ๊ฐ€๋Šฅ

  3. Local Scope (๊ฐœ์ธ): ํ”„๋กœ์ ํŠธ๋ณ„ ๊ฐœ์ธ ์„ค์ •

์šฐ์„ ์ˆœ์œ„: Local > Project > User

ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ์„ค์ • (.mcp.json)

ํŒ€๊ณผ ๊ณต์œ ํ•  MCP ์„œ๋ฒ„ ์„ค์ •์€ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .mcp.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์„ธ์š”:

{ "mcpServers": { "google-chat": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "${GOOGLE_CHAT_WEBHOOK_URL}" } } } }

์žฅ์ :

  • โœ… Git์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

  • โœ… ํŒ€๊ณผ ์„ค์ • ๊ณต์œ 

  • โœ… ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ง€์›: ${VAR} ๋˜๋Š” ${VAR:-๊ธฐ๋ณธ๊ฐ’}

  • โœ… ํ”„๋กœ์ ํŠธ๋ณ„ MCP ์„œ๋ฒ„ ์„ค์ •

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •: ๊ฐ ํŒ€์›์ด ์ž์‹ ์˜ Webhook URL์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# Linux/macOS export GOOGLE_CHAT_WEBHOOK_URL="https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx" # Windows (PowerShell) $env:GOOGLE_CHAT_WEBHOOK_URL="https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx"

์ ์šฉ ๋ฐฉ๋ฒ•

User ์ˆ˜์ค€ ์„ค์ • (~/.claude.json):

  1. ~/.claude.json ํŽธ์ง‘ (Windows๋Š” %USERPROFILE%\.claude.json)

  2. ํŒŒ์ผ ์ €์žฅ

  3. Claude Code๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ฉด ์žฌ์‹œ์ž‘

Project ์ˆ˜์ค€ ์„ค์ • (.mcp.json):

  1. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .mcp.json ์ƒ์„ฑ

  2. ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •

  3. .mcp.json์„ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ์ปค๋ฐ‹

  4. "Send a message to Google Chat" ๊ฐ™์€ ๋ช…๋ น ์‚ฌ์šฉ

2. GitHub Copilot (VS Code)

VS Code GitHub Copilot์€ ์—์ด์ „ํŠธ ๋ชจ๋“œ๋ฅผ ํ†ตํ•ด MCP๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋˜๋Š” ์‚ฌ์šฉ์ž ์„ค์ •์—์„œ MCP ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์œ„์น˜

๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒ:

  • ์‚ฌ์šฉ์ž ์„ค์ •: ~/.vscode/settings.json ๋˜๋Š” %APPDATA%\Code\User\settings.json (Windows)

  • ์›Œํฌ์ŠคํŽ˜์ด์Šค ์„ค์ •: ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ .vscode/settings.json

  • Claude Code ์„ค์ • (์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ): ~/.claude.json์—์„œ ๋ณต์‚ฌ

์„ค์ • ๋ฐฉ๋ฒ• (mcp.json ํ˜•์‹)

settings.json์— ์ถ”๊ฐ€:

{ "github.copilot.chat.mcp.servers": { "google-chat": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx" } } } }

๊ธฐ๋Šฅ

  • ์—์ด์ „ํŠธ ๋ชจ๋“œ ํ†ตํ•ฉ: ์—์ด์ „ํŠธ ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ MCP ๋„๊ตฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ์„ธ์…˜๋ณ„ ๋„๊ตฌ ์„ ํƒ: ์„ธ์…˜๋งˆ๋‹ค ํ™œ์„ฑํ™”ํ•  ๋„๊ตฌ ์„ ํƒ ๊ฐ€๋Šฅ

  • STDIO & SSE ์ง€์›: ๋‘ ์ „์†ก ๋ฐฉ์‹ ๋ชจ๋‘ ์ง€์›

  • ๋””๋ฒ„๊น…: ์žฌ์‹œ์ž‘ ๋ช…๋ น ๋ฐ ์ถœ๋ ฅ ๋กœ๊น… ๋‚ด์žฅ

์—์ด์ „ํŠธ ๋ชจ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

  1. VS Code์—์„œ GitHub Copilot ์ฑ„ํŒ… ์—ด๊ธฐ

  2. ์—์ด์ „ํŠธ ๋ชจ๋“œ ํ™œ์„ฑํ™” (๊ธฐ๋ณธ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ๋„ ์žˆ์Œ)

  3. ๋Œ€ํ™” ์‹œ์ž‘ - Copilot์ด ์ž๋™์œผ๋กœ MCP ๋„๊ตฌ์— ์ ‘๊ทผ

  4. ๋„๊ตฌ ์‹คํ–‰ ์ „ ์Šน์ธ ํ•„์š”

์˜ˆ์‹œ:

@workspace ๋ฐฐํฌ ์š”์•ฝ์„ Google Chat์— ์ „์†กํ•ด์ค˜

๐Ÿ“ ์ฐธ๊ณ : GitHub Copilot์˜ MCP ์ง€์›์€ ์—์ด์ „ํŠธ ๋ชจ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ •๊ตํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์˜ VS Code์™€ GitHub Copilot ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

3. ๊ธฐํƒ€ MCP ํด๋ผ์ด์–ธํŠธ

MCP ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:

{ "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "your-webhook-url" } } 1. Google Chat ์ŠคํŽ˜์ด์Šค ์—ด๊ธฐ 2. ์ƒ๋‹จ ๋ฉ”๋‰ด โ†’ "์•ฑ ๋ฐ ํ†ตํ•ฉ" โ†’ "Webhook ๊ด€๋ฆฌ" 3. "Webhook ์ถ”๊ฐ€" ํด๋ฆญ 4. ์ด๋ฆ„ ์ž…๋ ฅ ํ›„ URL ๋ณต์‚ฌ 5. ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์„ค์ • ## ์‚ฌ์šฉ๋ฒ• ### MCP ๋„๊ตฌ (3๊ฐ€์ง€) Claude Code์ด๋‚˜ ๋‹ค๋ฅธ MCP ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค์Œ ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: #### 1. `send_google_chat_text` ๊ฐ„๋‹จํ•œ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€ ์ „์†ก **์˜ˆ์‹œ (Claude Code):**

Send "Hello from Claude!" to Google Chat

**ํŒŒ๋ผ๋ฏธํ„ฐ:** ```json { "text": "์•ˆ๋…•ํ•˜์„ธ์š”, Google Chat!" }

2. send_google_chat_cards_v2

Cards V2 ํ˜•์‹์œผ๋กœ ์ง์ ‘ ์ „์†ก (๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž์šฉ)

ํŒŒ๋ผ๋ฏธํ„ฐ:

{ "text": "Card Message", "cardsV2": [ { "cardId": "unique-card", "card": { "header": { "title": "Card Title" }, "sections": [ { "widgets": [ { "textParagraph": { "text": "Card content" } } ] } ] } } ] }

3. send_google_chat_markdown โญ ์ถ”์ฒœ

Markdown์„ Cards V2๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜์—ฌ ์ „์†ก

์˜ˆ์‹œ (Claude Code):

Send this markdown to Google Chat: # Project Update - Task 1: โœ… Completed - Task 2: ๐Ÿšง In Progress **Deadline**: Tomorrow

ํŒŒ๋ผ๋ฏธํ„ฐ:

{ "markdown": "# ์ œ๋ชฉ\n\n**๊ตต์€ ๊ธ€์”จ**์™€ *๊ธฐ์šธ์ž„*\n\n- ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ 1\n- ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ 2\n\n```python\nprint('Hello')\n```", "cardTitle": "๋งˆํฌ๋‹ค์šด ๋ฉ”์‹œ์ง€", "fallbackToText": true }

์˜ต์…˜:

  • cardTitle: ์นด๋“œ ์ƒ๋‹จ์— ํ‘œ์‹œ๋  ์ œ๋ชฉ (์„ ํƒ)

  • fallbackToText: ๋ณ€ํ™˜ ์‹คํŒจ ์‹œ ํ…์ŠคํŠธ๋กœ ์ž๋™ ์ „์†ก (๊ธฐ๋ณธ๊ฐ’: false)

Claude Code ์‚ฌ์šฉ ์˜ˆ์‹œ

์„ค์ • ์™„๋ฃŒ ํ›„ Claude์™€ ์ž์—ฐ์–ด๋กœ ๋Œ€ํ™”ํ•˜๋ฉด ์ž๋™์œผ๋กœ MCP ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

๐Ÿ‘ค ์‚ฌ์šฉ์ž:

"Google Chat์— ํ”„๋กœ์ ํŠธ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด๋‚ด์ค˜. ์™„๋ฃŒ๋œ ์ž‘์—… 3๊ฐœ, ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—… 2๊ฐœ๋ฅผ ๋งˆํฌ๋‹ค์šด ๋ฆฌ์ŠคํŠธ๋กœ ์ž‘์„ฑํ•ด์„œ."

๐Ÿค– Claude:

(์ž๋™์œผ๋กœ send_google_chat_markdown ๋„๊ตฌ ํ˜ธ์ถœ)

Google Chat์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ค ์‚ฌ์šฉ์ž:

"๋ฐฉ๊ธˆ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€์— ์ฝ”๋“œ ์˜ˆ์ œ๋„ ์ถ”๊ฐ€ํ•ด์ค˜."

๐Ÿค– Claude:

(๋‹ค์‹œ Markdown์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ ๋ฐ ์ „์†ก)

์ง€์›ํ•˜๋Š” Markdown ๋ฌธ๋ฒ•

Claude๋‚˜ MCP ํด๋ผ์ด์–ธํŠธ์—์„œ Markdown์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ Google Chat Cards V2๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•

Markdown ์˜ˆ์‹œ

Google Chat ๋ Œ๋”๋ง

ํ—ค๋”

# H1, ## H2, ### H3

๊ตต์€ ๊ธ€์”จ + ํฌ๊ธฐ ์ฐจ๋“ฑ

๊ตต๊ฒŒ

**bold** ๋˜๋Š” __bold__

bold

๊ธฐ์šธ์ž„

*italic* ๋˜๋Š” _italic_

italic

์ธ๋ผ์ธ ์ฝ”๋“œ

`code`

code (๊ณ ์ •ํญ ํฐํŠธ)

์ฝ”๋“œ๋ธ”๋ก

```python\ncode\n```

๊ตฌ๋ฌธ ๊ฐ•์กฐ ๋ฐ•์Šค

์ˆœ์„œ ๋ฆฌ์ŠคํŠธ

1. First\n2. Second

1. First

2. Second

๋น„์ˆœ์„œ ๋ฆฌ์ŠคํŠธ

- Item ๋˜๋Š” * Item

โ€ข Item

์ค‘์ฒฉ ๋ฆฌ์ŠคํŠธ

- nested (2์นธ ๋“ค์—ฌ์“ฐ๊ธฐ)

ใ€€โ€ข nested (Em space)

ํ‘œ

| A | B |\n|--|--|

๊ณ ์ •ํญ ํฐํŠธ ํ‘œ

์ด๋ฏธ์ง€

![alt](https://...)

์ด๋ฏธ์ง€ ์œ„์ ฏ (URL ๊ฒ€์ฆ ํ›„)

๋งํฌ

[ํ…์ŠคํŠธ](https://...)

ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ๋งํฌ

์ˆ˜ํ‰์„ 

--- ๋˜๋Š” ***

๊ตฌ๋ถ„์„ 

์ธ์šฉ๋ฌธ

> quote

๋“ค์—ฌ์“ฐ๊ธฐ + ํšŒ์ƒ‰ ํ…์ŠคํŠธ

์˜ˆ์‹œ Markdown:

# ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ์™„๋ฃŒ ๐Ÿš€ ## ์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ - **์„ฑ๋Šฅ ๊ฐœ์„ **: API ์‘๋‹ต ์†๋„ 30% ํ–ฅ์ƒ - **๋ฒ„๊ทธ ์ˆ˜์ •**: ๋กœ๊ทธ์ธ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ - ์ƒˆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ## ๋ฐฐํฌ ์ƒํƒœ | ํ™˜๊ฒฝ | ์ƒํƒœ | ๋ฒ„์ „ | |------|------|------| | Production | โœ… | v2.1.0 | | Staging | โœ… | v2.1.0 | ## ๋‹ค์Œ ๋‹จ๊ณ„ 1. ๋ชจ๋‹ˆํ„ฐ๋ง 24์‹œ๊ฐ„ 2. ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘ 3. ๋‹ค์Œ ์Šคํ”„๋ฆฐํŠธ ๊ณ„ํš ์ฝ”๋“œ ์˜ˆ์ œ: ```python def deploy(): print("Deploying v2.1.0...") return True

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

**๋ณ€ํ™˜ ๊ฒฐ๊ณผ:** Google Chat์—์„œ ํ—ค๋”, ๋ฆฌ์ŠคํŠธ, ํ‘œ, ์ฝ”๋“œ๋ธ”๋ก์ด ๋ชจ๋‘ ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ## ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ### ํ•„์ˆ˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ | ๋ณ€์ˆ˜๋ช… | ์„ค๋ช… | ์˜ˆ์‹œ | |--------|------|------| | `GOOGLE_CHAT_WEBHOOK_URL` | Google Chat Webhook URL | `https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx` | ### ์„ ํƒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (๋กœ๊น…) | ๋ณ€์ˆ˜๋ช… | ์„ค๋ช… | ๊ธฐ๋ณธ๊ฐ’ | ํ—ˆ์šฉ๊ฐ’ | |--------|------|--------|--------| | `LOG_LEVEL` | ๋กœ๊ทธ ๋ ˆ๋ฒจ | `INFO` | `DEBUG`, `INFO`, `WARN`, `ERROR` | | `LOG_DIR` | ๋กœ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ | `./logs` | ์ ˆ๋Œ€/์ƒ๋Œ€ ๊ฒฝ๋กœ | | `LOG_RETENTION_DAYS` | ๋กœ๊ทธ ๋ณด๊ด€ ์ผ์ˆ˜ | `30` | ์ˆซ์ž (์ผ) | | `LOG_ENABLE_CONSOLE` | ์ฝ˜์†” ์ถœ๋ ฅ ์—ฌ๋ถ€ | `true` | `true`, `false` | ### ์„ค์ • ๋ฐฉ๋ฒ• #### Claude Code (~/.claude.json) ```json { "mcpServers": { "google-chat": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx", "LOG_LEVEL": "INFO", "LOG_RETENTION_DAYS": "30" } } } }

.env ํŒŒ์ผ (๊ฐœ๋ฐœ์šฉ)

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .env ํŒŒ์ผ ์ƒ์„ฑ:

GOOGLE_CHAT_WEBHOOK_URL=https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx LOG_LEVEL=INFO LOG_DIR=./logs LOG_RETENTION_DAYS=30 LOG_ENABLE_CONSOLE=true

์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜

Windows (PowerShell):

$env:GOOGLE_CHAT_WEBHOOK_URL="https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx"

Linux/macOS (Bash/Zsh):

export GOOGLE_CHAT_WEBHOOK_URL="https://chat.googleapis.com/v1/spaces/xxx/messages?key=xxx&token=xxx"

๊ฐœ๋ฐœ

# ์˜์กด์„ฑ ์„ค์น˜ npm install # ๋นŒ๋“œ npm run build # ๊ฐœ๋ฐœ ๋ชจ๋“œ (TypeScript ์ง์ ‘ ์‹คํ–‰) npm run dev # Lint ๊ฒ€์‚ฌ npm run lint # Lint ์ž๋™ ์ˆ˜์ • npm run lint:fix # ํ…Œ์ŠคํŠธ npm run test:snapshot # ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ (12๊ฐœ) npm run test:logging # ๋กœ๊น… ์‹œ์Šคํ…œ ํ…Œ์ŠคํŠธ npm run test:integration # ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (์›นํ›… ํ•„์š”) npm test # ์ „์ฒด ํ…Œ์ŠคํŠธ

์•„ํ‚คํ…์ฒ˜

src/ โ”œโ”€โ”€ index.ts # ์ง„์ž…์  โ”œโ”€โ”€ server.ts # MCP ์„œ๋ฒ„ ์„ค์ • โ”œโ”€โ”€ tools/ # MCP ๋„๊ตฌ โ”‚ โ”œโ”€โ”€ sendTextMessage.ts # ํ…์ŠคํŠธ ์ „์†ก โ”‚ โ”œโ”€โ”€ sendCardsV2Message.ts # Cards V2 ์ „์†ก โ”‚ โ”œโ”€โ”€ sendMarkdownMessage.ts # Markdown ์ „์†ก (๋ฉ”์ธ) โ”‚ โ””โ”€โ”€ markdownToCards.ts # Markdown โ†’ Cards V2 ๋ณ€ํ™˜ โ”œโ”€โ”€ utils/ # ์œ ํ‹ธ๋ฆฌํ‹ฐ โ”‚ โ”œโ”€โ”€ imageValidator.ts # ์ด๋ฏธ์ง€ URL ๊ฒ€์ฆ โ”‚ โ”œโ”€โ”€ cardsV2Validator.ts # Cards V2 ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ โ”‚ โ”œโ”€โ”€ logger.ts # ๋กœ๊น… ์‹œ์Šคํ…œ โ”‚ โ””โ”€โ”€ logCleaner.ts # ๋กœ๊ทธ ์ •๋ฆฌ โ””โ”€โ”€ types/ # ํƒ€์ž… ์ •์˜ โ”œโ”€โ”€ markdown.ts โ”œโ”€โ”€ googleChat.ts โ””โ”€โ”€ log.ts

๋กœ๊น…

๋กœ๊ทธ ํŒŒ์ผ ๊ตฌ์กฐ

logs/ โ”œโ”€โ”€ app-2025-10-29.log # ์ผ๋ณ„ ๋กœ๊ทธ (๋ชจ๋“  ๋ ˆ๋ฒจ) โ”œโ”€โ”€ errors-2025-10-29.log # ์—๋Ÿฌ ์ „์šฉ ๋กœ๊ทธ โ””โ”€โ”€ ... # 30์ผ ์ž๋™ ์‚ญ์ œ

๋กœ๊ทธ ํฌ๋งท (JSON)

{ "timestamp": "2025-10-29T12:34:56.789Z", "level": "INFO", "module": "sendMarkdownMessage", "event": "message_sent", "messageId": "spaces/xxx/messages/yyy", "elapsed": 123, "usedFallback": false, "cardTitle": "Test Card" }

๋กœ๊ทธ ์ด๋ฒคํŠธ

  • message_sent: ๋ฉ”์‹œ์ง€ ์ „์†ก ์„ฑ๊ณต

  • fallback_used: ํด๋ฐฑ ์‚ฌ์šฉ (Cards V2 โ†’ Text)

  • image_validation_failed: ์ด๋ฏธ์ง€ ๊ฒ€์ฆ ์‹คํŒจ

  • send_failed: ์ „์†ก ์‹คํŒจ

  • validation_failed: ๊ฒ€์ฆ ์‹คํŒจ

๋กœ๊ทธ ์ •๋ฆฌ

  • ์„œ๋ฒ„ ์‹œ์ž‘ ์‹œ ์ž๋™ ์ •๋ฆฌ (30์ผ ์ด์ƒ ๋กœ๊ทธ ์‚ญ์ œ)

  • 24์‹œ๊ฐ„๋งˆ๋‹ค ์ž๋™ ์‹คํ–‰

  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ LOG_RETENTION_DAYS๋กœ ์„ค์ • ๊ฐ€๋Šฅ

์ œํ•œ์‚ฌํ•ญ

Google Chat API ์ œ์•ฝ์‚ฌํ•ญ

ํ•ญ๋ชฉ

์ œํ•œ

๋Œ€์‘ ๋ฐฉ๋ฒ•

์ด๋ฏธ์ง€ ํ”„๋กœํ† ์ฝœ

HTTPS๋งŒ ์ง€์›

HTTP URL์€ ํ…์ŠคํŠธ ๋งํฌ๋กœ ๋Œ€์ฒด

์ด๋ฏธ์ง€ ํฌ๊ธฐ

์ตœ๋Œ€ 5MB

๊ฒ€์ฆ ์‹คํŒจ ์‹œ ๋งํฌ๋กœ ํ‘œ์‹œ

์ด๋ฏธ์ง€ ์ธ์ฆ

๊ณต๊ฐœ URL๋งŒ ๊ฐ€๋Šฅ

์ธ์ฆ ํ•„์š” ์‹œ ์ ‘๊ทผ ๋ถˆ๊ฐ€

Content-Type

image/*๋งŒ ํ—ˆ์šฉ

HTML ํŽ˜์ด์ง€ ๋“ฑ์€ ๊ฑฐ๋ถ€

Markdown ์ง€์›

์ œํ•œ์ 

๋ฏธ์ง€์› ๋ฌธ๋ฒ•์€ ๊ทผ์‚ฌ์น˜๋กœ ๋ณ€ํ™˜

Markdown ๋ณ€ํ™˜ ์ œ์•ฝ์‚ฌํ•ญ

โœ… ์™„์ „ ์ง€์›:

  • ํ—ค๋” (H1~H6)

  • ๊ตต๊ฒŒ, ๊ธฐ์šธ์ž„, ์ธ๋ผ์ธ ์ฝ”๋“œ

  • ์ˆœ์„œ/๋น„์ˆœ์„œ ๋ฆฌ์ŠคํŠธ (์ตœ๋Œ€ 3๋‹จ๊ณ„ ์ค‘์ฒฉ)

  • ์ฝ”๋“œ๋ธ”๋ก (๊ตฌ๋ฌธ ๊ฐ•์กฐ)

  • ํ‘œ (๊ณ ์ •ํญ ํฐํŠธ)

  • ๋งํฌ, ์ด๋ฏธ์ง€

โš ๏ธ ๋ถ€๋ถ„ ์ง€์›:

  • ๋ณต์žกํ•œ ์ค‘์ฒฉ ๊ตฌ์กฐ โ†’ ๋‹จ์ˆœํ™”๋จ

  • HTML ํƒœ๊ทธ โ†’ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜

  • ์ธ์šฉ๋ฌธ โ†’ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ํ‘œํ˜„

โŒ ๋ฏธ์ง€์›:

  • ๊ฐ์ฃผ (footnotes)

  • ์ •์˜ ๋ฆฌ์ŠคํŠธ (definition lists)

  • ์ˆ˜ํ•™ ์ˆ˜์‹ (LaTeX)

  • ์ž‘์—… ์ฒดํฌ๋ฐ•์Šค (- [ ], - [x])

  • Emoji ๋‹จ์ถ•์ฝ”๋“œ (:smile: ๋“ฑ, ์œ ๋‹ˆ์ฝ”๋“œ ์ด๋ชจ์ง€๋Š” ๊ฐ€๋Šฅ)

์„ฑ๋Šฅ ๋ฐ ์ œํ•œ

  • ์ด๋ฏธ์ง€ ๊ฒ€์ฆ ํƒ€์ž„์•„์›ƒ: 5์ดˆ

  • Webhook ์š”์ฒญ ํƒ€์ž„์•„์›ƒ: 5์ดˆ

  • ๋กœ๊ทธ ํŒŒ์ผ ํฌ๊ธฐ: ๋ฌด์ œํ•œ (30์ผ ์ž๋™ ์‚ญ์ œ)

  • ๋™์‹œ ์š”์ฒญ: ์ œํ•œ ์—†์Œ (Google Chat API ์ œํ•œ ์ค€์ˆ˜)

๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

โš ๏ธ Webhook URL์€ ๋ฏผ๊ฐ ์ •๋ณด์ž…๋‹ˆ๋‹ค:

  • Git์— ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ์„ธ์š”

  • ๊ณต๊ฐœ ์ €์žฅ์†Œ์— ๋…ธ์ถœ ๊ธˆ์ง€

  • ์ •๊ธฐ์ ์œผ๋กœ ์žฌ์ƒ์„ฑ ๊ถŒ์žฅ

  • .env ํŒŒ์ผ์€ .gitignore์— ํฌํ•จ ํ•„์ˆ˜

FAQ

Q: ์ด๋ฏธ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

A: ์ด๋ฏธ์ง€ URL ๊ฒ€์ฆ ์‹คํŒจ ์›์ธ:

  1. HTTPS๋งŒ ์ง€์› (HTTP๋Š” ๋ถˆ๊ฐ€)

  2. ํŒŒ์ผ ํฌ๊ธฐ: 5MB ์ดํ•˜์—ฌ์•ผ ํ•จ

  3. ๊ณต๊ฐœ ์ ‘๊ทผ: ์ธ์ฆ ์—†์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ URL์ด์–ด์•ผ ํ•จ

  4. Content-Type: ์‘๋‹ต ํ—ค๋”๊ฐ€ image/*์—ฌ์•ผ ํ•จ

๋””๋ฒ„๊น…:

# ๋กœ๊ทธ ํ™•์ธ cat logs/app-YYYY-MM-DD.log | grep "image_validation_failed"

๊ฒ€์ฆ ์‹คํŒจ ์‹œ ๋™์ž‘:

  • ์ด๋ฏธ์ง€๋Š” ํ…์ŠคํŠธ ๋งํฌ๋กœ ๋Œ€์ฒด๋จ

  • ์˜ˆ: โš ๏ธ ์ด๋ฏธ์ง€ ๋กœ๋“œ ์‹คํŒจ: https://... (HTTP 404: Not Found)

Q: Cards V2 ๋ณ€ํ™˜์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค

A: ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”:

  1. fallbackToText ์˜ต์…˜ ์‚ฌ์šฉ:

    { "markdown": "...", "fallbackToText": true }

    ๋ณ€ํ™˜ ์‹คํŒจ ์‹œ ์ž๋™์œผ๋กœ ํ…์ŠคํŠธ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

  2. ๋กœ๊ทธ์—์„œ ์›์ธ ํ™•์ธ:

    cat logs/errors-YYYY-MM-DD.log
  3. ์ง€์›ํ•˜์ง€ ์•Š๋Š” Markdown ๋ฌธ๋ฒ•:

    • ๊ฐ์ฃผ (footnotes)

    • ์ •์˜ ๋ฆฌ์ŠคํŠธ (definition lists)

    • ๋ณต์žกํ•œ HTML ํƒœ๊ทธ

Q: ๋กœ๊ทธ ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์ด ์Œ“์ž…๋‹ˆ๋‹ค

A: ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์กฐ์ •:

{ "env": { "LOG_LEVEL": "WARN", "LOG_RETENTION_DAYS": "7" } }
  • LOG_LEVEL=ERROR: ์—๋Ÿฌ๋งŒ ๊ธฐ๋ก

  • LOG_RETENTION_DAYS=7: 7์ผ๋งŒ ๋ณด๊ด€

  • LOG_ENABLE_CONSOLE=false: ์ฝ˜์†” ์ถœ๋ ฅ ๋น„ํ™œ์„ฑํ™”

Q: npx ์‹คํ–‰ ์‹œ "command not found" ์˜ค๋ฅ˜

A: Node.js์™€ npm์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ:

node --version # v18.0.0 ์ด์ƒ ๊ถŒ์žฅ npm --version

์„ค์น˜๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด:

  • Windows: https://nodejs.org/ ์—์„œ ๋‹ค์šด๋กœ๋“œ

  • macOS: brew install node

  • Linux: sudo apt install nodejs npm (Ubuntu/Debian)

Q: Webhook URL์„ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋‚˜์š”?

A:

  1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ (์„ค์ • ํŒŒ์ผ์— ์ง์ ‘ ์“ฐ์ง€ ๋งˆ์„ธ์š”)

  2. Git์— ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ์„ธ์š” (.gitignore ํ™•์ธ)

  3. ์ •๊ธฐ์ ์œผ๋กœ ์žฌ์ƒ์„ฑ (์œ ์ถœ ์˜์‹ฌ ์‹œ)

  4. Google Chat์—์„œ Webhook ์‚ญ์ œ๋กœ ๋ฌดํšจํ™” ๊ฐ€๋Šฅ

Q: ์—ฌ๋Ÿฌ Google Chat ์ŠคํŽ˜์ด์Šค์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค

A: ๊ฐ ์ŠคํŽ˜์ด์Šค๋งˆ๋‹ค ๋‹ค๋ฅธ MCP ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค ๋“ฑ๋ก:

{ "mcpServers": { "google-chat-team-a": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/.../team-a/..." } }, "google-chat-team-b": { "command": "npx", "args": ["-y", "google-chat-webhook-mcp"], "env": { "GOOGLE_CHAT_WEBHOOK_URL": "https://chat.googleapis.com/.../team-b/..." } } } }

Claude์—์„œ "Send to team-a" ๋˜๋Š” "Send to team-b"๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CI/CD

GitHub Actions๋กœ ์ž๋™ํ™”:

  • โœ… Node.js 18.x, 20.x ๋งคํŠธ๋ฆญ์Šค ๋นŒ๋“œ

  • โœ… ESLint, ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ

  • โœ… ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ (12๊ฐœ)

  • โœ… ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (master ๋ธŒ๋žœ์น˜)

์›Œํฌํ”Œ๋กœ์šฐ: .github/workflows/ci.yml

๊ธฐ์—ฌ

์ด์Šˆ์™€ PR์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

๋ผ์ด์„ ์Šค

MIT License - LICENSE

๋ฌธ์„œ

๊ด€๋ จ ํ”„๋กœ์ ํŠธ

Install Server
A
security โ€“ no known vulnerabilities
A
license - permissive license
A
quality - confirmed to work

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ice3x2/google-chat-webhook-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server