Skip to main content
Glama
mohn93
by mohn93
README.md
# google-chat-mcp

MCP server for Google Chat — manage spaces, messages, members, reactions, attachments, and GIFs through the Model Context Protocol.

## Features

- **19 MCP tools** covering the full Google Chat API
- **Spaces** — list, get, create, update, delete
- **Messages** — list (newest first), get, send, reply to threads, update, delete
- **Members** — list, add, remove, get user info
- **Reactions** — add, remove
- **Attachments** — get metadata, upload files with messages
- **Two transports** — stdio and HTTP/SSE
- **Automatic OAuth** — browser-based flow, token caching + auto-refresh
- **Smart formatting** — concise human-readable responses, automatic user name resolution

## Setup

### 1. Google Cloud Project & Chat API Setup

#### Create Project & Enable API

1. Go to [Google Cloud Console](https://console.cloud.google.com/)
2. Create a new project (or select existing)
3. Go to **APIs & Services > Library**
4. Search for **"Google Chat API"** and click **Enable**

#### Configure the Chat App

This step is required — without it, the Chat API won't work.

1. After enabling the Google Chat API, click on it to open its settings
2. Go to the **Configuration** tab
3. Fill in the following:
   - **App name** — give it a name (e.g. "Chat MCP Assistant")
   - **Avatar URL** — optional, any image URL for the app icon
   - **Description** — a short description (e.g. "MCP server for Google Chat")
   - **Enable Interactive features** — toggle **ON**
   - **Functionality** — check "Receive 1:1 messages" and "Join spaces and group conversations"
   - **Connection settings** — select "Apps Script project" (this won't actually be used, but a selection is required)
   - **Visibility** — choose who can use the app:
     - For personal use: select your own account
     - For team use: select your Google Workspace domain
4. Click **Save**

#### Create OAuth Credentials

1. Go to **APIs & Services > Credentials**
2. Click **Create Credentials > OAuth client ID**
3. If prompted, configure the **OAuth consent screen** first:
   - Choose **Internal** (for Workspace) or **External** (for personal Gmail)
   - Fill in app name and your email
   - Add these scopes: `chat.spaces`, `chat.messages`, `chat.memberships`, `chat.messages.reactions`, `userinfo.profile`, `directory.readonly`
   - Save and continue through the remaining steps
4. Back on Credentials, click **Create Credentials > OAuth client ID**
5. Choose **Desktop app** or **Web application**
   - If **Web application**: add `http://localhost:18273/auth/callback` as an authorized redirect URI (or any `http://localhost:{port}/{path}` — the server reads it from your credentials file)
   - If **Desktop app**: no redirect URI needed
6. Download the JSON and save it as `credentials.json`

### 2. Install & Run

```bash
# Run directly with npx (no install needed)
npx google-chat-mcp --credentials-path ./credentials.json

# Or install globally
npm install -g google-chat-mcp
google-chat-mcp --credentials-path ./credentials.json

# HTTP/SSE transport
npx google-chat-mcp --transport http --port 3000 --credentials-path ./credentials.json
```

On first run, your browser will open for Google authentication. Approve access and the token is cached automatically.

### 3. Connect to AI Agents

#### Claude Code (CLI)

```bash
claude mcp add google-chat -- npx google-chat-mcp --credentials-path /absolute/path/to/credentials.json
```

Add `-s user` to make it available across all projects:

```bash
claude mcp add google-chat -s user -- npx google-chat-mcp --credentials-path /absolute/path/to/credentials.json
```

#### Claude Desktop

Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):

```json
{
  "mcpServers": {
    "google-chat": {
      "command": "npx",
      "args": [
        "google-chat-mcp",
        "--credentials-path",
        "/absolute/path/to/credentials.json"
      ]
    }
  }
}
```

#### Cursor

Add to Cursor's MCP settings (Settings > MCP Servers):

```json
{
  "google-chat": {
    "command": "npx",
    "args": [
      "google-chat-mcp",
      "--credentials-path",
      "/absolute/path/to/credentials.json"
    ]
  }
}
```

#### Windsurf / Continue / Other MCP Clients

Any MCP client that supports stdio transport can connect. Use:
- **Command:** `npx`
- **Args:** `google-chat-mcp --credentials-path /absolute/path/to/credentials.json`

For HTTP/SSE clients, run with `--transport http --port 3000` and connect to `http://localhost:3000/sse`.

## CLI Options

| Flag | Default | Description |
|------|---------|-------------|
| `--transport` | `stdio` | Transport mode: `stdio` or `http` |
| `--port` | `3000` | Port for HTTP transport |
| `--credentials-path` | `./credentials.json` | Path to OAuth credentials file |
| `--token-path` | `./token.json` | Path to stored token |
| `--disable-token-saving` | `false` | Don't persist tokens to disk |

## Tools

### Spaces
| Tool | Description |
|------|-------------|
| `list_spaces` | List all accessible spaces (concise format, configurable pageSize) |
| `get_space` | Get full details of a specific space |
| `create_space` | Create a new space |
| `update_space` | Update space display name or description |
| `delete_space` | Delete a space |

### Messages
| Tool | Description |
|------|-------------|
| `list_messages` | List messages newest-first with sender names resolved. Supports date filtering (local timezone) and pageSize |
| `get_message` | Get a specific message with sender name resolved |
| `send_message` | Send a text message to a space |
| `reply_to_thread` | Reply to an existing thread |
| `update_message` | Update a message's text |
| `delete_message` | Delete a message |

### Members
| Tool | Description |
|------|-------------|
| `list_members` | List members with display names resolved |
| `add_member` | Add a user to a space |
| `remove_member` | Remove a member from a space |
| `get_user_info` | Look up a user's display name, email, and photo |

### Reactions
| Tool | Description |
|------|-------------|
| `add_reaction` | Add an emoji reaction to a message |
| `remove_reaction` | Remove a reaction |

### Attachments
| Tool | Description |
|------|-------------|
| `get_attachment` | Get attachment metadata and download URL |
| `upload_attachment` | Upload a file and send it as a message |

## OAuth Scopes

The server requests these Google OAuth scopes:

- `chat.spaces` — read/write spaces
- `chat.messages` — read/write messages
- `chat.memberships` — read/write memberships
- `chat.messages.reactions` — read/write reactions
- `userinfo.profile` — authenticated user profile
- `directory.readonly` — workspace user directory (for name resolution)

## Troubleshooting

### `redirect_uri_mismatch` error
Your OAuth credentials have a registered redirect URI that doesn't match. The server reads the redirect URI from your `credentials.json` automatically. Make sure the URI registered in Google Cloud Console matches what's in the file.

### User names showing as `users/123456...`
The People API may not resolve names depending on your Google Workspace privacy settings. The server caches display names from Chat API responses (members, message senders) as a fallback.

### Token expired
Delete your `token.json` file and restart — the browser auth flow will re-trigger.

## Development

```bash
npm install
npm run build
npm test
```

## License

MIT