supercell-mcp
# supercell-mcp
[](https://github.com/brettadams0/supercell-mcp/actions/workflows/ci.yml)
[](LICENSE)
[](package.json)
One MCP server covering three Supercell game APIs — Clash of Clans, Clash Royale,
and Brawl Stars. They share an auth model and response style, so a single server
with prefixed tool names beats three near-identical ones.
Read-only. These APIs expose no write or messaging endpoints at all, so there is
nothing here that can change game state.
Runs over stdio, registered in `~/.claude.json` as `supercell`.
## Tools
Prefixes: `coc_` Clash of Clans, `cr_` Clash Royale, `bs_` Brawl Stars.
| Clash of Clans | Clash Royale | Brawl Stars |
|---|---|---|
| `coc_get_player` | `cr_get_player` | `bs_get_player` |
| `coc_get_clan` | `cr_get_clan` | `bs_get_club` |
| `coc_get_clan_members` | `cr_get_clan_members` | `bs_get_club_members` |
| `coc_search_clans` | `cr_search_clans` | `bs_get_rankings` |
| `coc_get_current_war` | `cr_get_player_battlelog` | `bs_get_player_battlelog` |
## Layout
```
src/client.js shared auth + fetch, one base URL per game
src/clashofclans.js coc_* tools
src/clashroyale.js cr_* tools
src/brawlstars.js bs_* tools
src/index.js McpServer construction + stdio transport
```
## The IP allowlist gotcha
Supercell API keys are **bound to the IP address** they were created for. When
the home IP changes, every call starts returning `403 accessDenied` even though
the key is perfectly valid and unexpired.
That failure mode looks like an auth bug and isn't one. To fix it, mint a new key
for the current IP at the relevant developer portal:
- https://developer.clashofclans.com
- https://developer.clashroyale.com
- https://developer.brawlstars.com
Check the current public IP with `curl -s https://api.ipify.org` (already an
allowed command in `~/.claude/settings.json`).
## Setup
Requires Node 20+. Mint a key per game at the portal listed above, for your
current public IP, then save each one as `credentials/<game>.json`:
```
credentials/clashofclans.json
credentials/clashroyale.json
credentials/brawlstars.json
```
Each holds `{"token": "..."}` — see the matching `*.example.json`.
`credentials/` is git-ignored. A game whose key file is absent simply fails on
first call with a message naming the file and its portal; the other games keep
working.
```bash
npm ci
npm start
claude mcp add supercell -- node <path>/supercell-mcp/src/index.js
```
## Tests
```bash
npm test
```
Registration across all three games, tag encoding, and the missing-key error
message. No network and no credentials.
## Notes
- Player and clan tags start with `#` (e.g. `#2PP0JCVL`). The `#` is URL-encoded
before the request — pass tags with the `#` included.
- Tags are unambiguous across games but not portable between them; a Clash Royale
tag won't resolve against the Clash of Clans API.
TDQS
Scored across 15 tools
Each tool is clearly distinguished by the game prefix (coc_, cr_, bs_) and a distinct verb_noun pattern (get_player, get_clan, etc.). No two tools have overlapping purposes, even across games.
All tools follow the consistent pattern of game prefix + verb_noun in snake_case (e.g., coc_get_player, cr_get_clan_members). No mixing cases or irregular verbs.
15 tools is slightly high but appropriate for covering three separate games with 4-5 tools each. The scope is well-defined and each tool serves a distinct endpoint.
Core read operations for players, clans, and clan members are present across games. Missing search by player tag and some game-specific endpoints (e.g., war details for Clash Royale), but the set covers the most common queries without dead ends.