Install the MCP server
The server runs on your machine and uses your own token. There is no shared account and no bundled key.
Step 1: get an API token
- Sign in to app.cig.chat.
- Open the bot you want to connect.
- Go to Settings → API and copy the token.
One token controls exactly one bot. It can read your subscriber list and send messages on your behalf — treat it like a password, never share it and never commit it. If it leaks, issue a new one from the same screen.
Step 2: add the server
Claude Code
claude mcp add cigchat \
--env CIGCHAT_API_TOKEN=your-token-here \
-- npx -y @cig-chat/mcpClaude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"cigchat": {
"command": "npx",
"args": ["-y", "@cig-chat/mcp"],
"env": { "CIGCHAT_API_TOKEN": "your-token-here" }
}
}
}Cursor
~/.cursor/mcp.json
Exactly the same shape as Claude Desktop.
Step 3: verify
Run in a terminal:
CIGCHAT_API_TOKEN=your-token-here npx -y @cig-chat/mcp --checkThen ask your assistant: "which cig.chat bot am I connected to?"
Configuration
| Variable | Default | What it does |
|---|---|---|
CIGCHAT_API_TOKEN | — | Required. Your bot token. |
CIGCHAT_TOOLSETS | all | all, dynamic, or a comma-separated list of toolsets. |
CIGCHAT_ALLOW | all | Which risk tiers to expose: read,write,send,broadcast,destructive. |
CIGCHAT_DRY_RUN | false | true makes every write a no-op that echoes the request. |
CIGCHAT_MAX_BROADCAST_RECIPIENTS | 0 | Refuse broadcasts above this audience size. 0 = no cap. |
CIGCHAT_RPS | 5 | Client-side request rate limit. |
Starting safely
For a first run, add CIGCHAT_DRY_RUN=true. Every write reports exactly what it would have sent without sending anything. Reads keep working normally.
Troubleshooting
| Symptom | Cause |
|---|---|
| 401 / token rejected | Token is wrong, revoked, or belongs to a different bot. Reissue under Settings → API. |
| A tool is missing | Its toolset or risk tier is disabled. Run the cigchat_list_toolsets tool. |
| 429 rate limited | Lower CIGCHAT_RPS. Sends are never retried automatically — check whether the message went out before re-running. |
| 422 field is required | An array parameter needs objects, not strings: [{"tag_ns":"f1t1"}]. |
| Broadcast returns requires_confirmation | Working as designed. Show the audience estimate to a human, then re-call with the returned token. |