
start.gg MCP Server
io.github.tomo789Published by GitHub account tomo789v0.1.0Updated Oct 24, 2026
MCP server for the start.gg GraphQL API: tournaments, events, entrants, sets, standings, streams
Overview
Read-only MCP server for the start.gg GraphQL API, letting an assistant look up tournaments, events, entrants, sets, standings, and streams.
- What you can do
- Wraps the start.gg GraphQL API in 16 read-only tools covering videogame and tournament search, tournament and event details, entrants with seeds, standings, normalized sets, per-game character and stage data, players, stream queues, and start.gg URL resolution. Output is normalized (for example sets with round, decoded state, entrants, scores, and winner) and validated with Zod before requests are built. It adds a sliding-window rate limiter, retries with backoff, and a short-TTL in-memory cache.
- When to use it
- Use it when an assistant needs to answer questions about competitive gaming tournaments on start.gg: finding upcoming events, checking entrants and seeds, reviewing completed sets and Top 8 standings, or seeing which streams are assigned to sets. It is game-agnostic and read-only, so it suits lookup and reporting rather than managing brackets.
- Requirements
- Runs locally over stdio as an npm package (npx startgg-mcp-server or a global install); Node.js 22 or newer. Requires a start.gg API token supplied through the STARTGG_TOKEN environment variable. Optional variables: STARTGG_RATE_LIMIT, STARTGG_TIMEOUT_MS, STARTGG_CACHE, and STARTGG_ENABLE_WRITES. Network access to api.start.gg is needed.
Installation
In SourceWeft
- Open start.gg MCP Server in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
startgg-mcp-server
A Model Context Protocol server for the start.gg GraphQL API. It lets MCP clients (Claude Code, Claude Desktop, and others) discover tournaments, inspect events, entrants, sets, standings, and streams for any game on start.gg using natural language.
What is this?
start.gg exposes a powerful but complex GraphQL API: entrants vs participants vs players, integer set states, complexity-limited pagination, epoch timestamps. This server wraps that API in a small set of MCP tools with:
- Normalized output — sets come back as
{ round, state: "COMPLETED", entrant1: { gamerTag, seed }, score, winnerEntrantId, ... }instead of raw GraphQL nesting - URL resolution — paste a start.gg URL, get tournament/event ids back
- Built-in rate limiting, retries, and caching tuned to start.gg's documented limits
The server is game-agnostic. Game-specific logic (e.g. Smash upset detection)
belongs in applications built on top — see
examples/smash-ultimate-watcher.
Features
- 16 read-only tools covering discovery, tournaments, events, players, streams, and URL resolution
- Input validation (Zod) on every tool — bad ids, oversized page sizes, and malformed URLs never reach the API
- Sliding-window rate limiter (default 75 req/60s vs start.gg's 80), retries with exponential backoff, and
Retry-Aftersupport - Short-TTL in-memory cache for metadata queries
- Typed error codes:
AUTH_ERROR,RATE_LIMITED,NOT_FOUND,INVALID_INPUT,STARTGG_GRAPHQL_ERROR,NETWORK_ERROR,INTERNAL_ERROR - GraphQL documents kept in
graphql/files, separate from code - The API token never appears in output, logs, or error messages
- Compact JSON output (no pretty-printing) to keep tool results small
Requirements
- Node.js >= 22
- A start.gg API token
Getting a start.gg API token
- Log in to start.gg
- Open developer settings (Profile → Developer Settings)
- Create a personal access token and copy it
Treat the token like a password. This server reads it only from the
STARTGG_TOKEN environment variable.
Installation
From npm (recommended)
Requires STARTGG_TOKEN in the environment; MCP clients normally launch it for you (see the next section).
From source
MCP client setup
Claude Code (CLI)
Running from a source checkout instead:
Claude Desktop
Add to claude_desktop_config.json:
From a source checkout, use "command": "node" and "args": ["/path/to/startgg-mcp-server/dist/cli.js"] instead.
Any MCP client that supports stdio servers works the same way: run
node dist/cli.js (or the startgg-mcp-server bin once installed via npm)
with STARTGG_TOKEN set.
Available tools
Discovery
Tournament
Event
Player
Utility
Tournament/event tools accept either a numeric id, a slug, or a full
start.gg URL. Scheme-less URLs (start.gg/tournament/...) and <t>/event/<e>
slugs are accepted too — you rarely need resolve_startgg_url explicitly, but
it is there when you want the ids.
Normalized set shape
Notes grounded in the live API:
roundNumber < 0means losers bracket;roundis the human-readable name- a score of
-1is start.gg's disqualification marker - unstarted "preview" sets have string ids like
"preview_3430499_2_0" statenames are decoded from the integerstateRaw; both are always returnedentrant1/entrant2use aplayersarray, so doubles/teams work unchanged
Games and characters
get_set_games (and get_event_sets with includeGames: true) add per-game
details when start.gg has them:
derivedCharacters summarizes unique character names per entrant in
first-appearance order across games. This is derived, not an API field.
Character and stage data only exists when the set was reported with it. In a
2026-09 sample, late rounds (Top 8 / streamed) had it on about 90% of completed
sets; early pools about 5%. An empty games array means not reported, not that
no games were played. Typical flow: get_event_sets (e.g. phaseIds for Top 8)
→ pick set ids → get_set_games. For many sets at once, get_event_sets with
includeGames: true.
Examples
Things to ask an MCP client once connected:
A standalone example application (videogame lookup → upcoming tournaments →
sets → upset candidates by seed difference) lives in
examples/smash-ultimate-watcher.
Environment variables
The API endpoint is deliberately not configurable through the environment: the
token is only ever sent to api.start.gg. When using the client as a library
(tests, tooling), inject apiUrl/fetchFn via the StartggClient constructor.
Out-of-range or non-numeric values for STARTGG_RATE_LIMIT / STARTGG_TIMEOUT_MS
fall back to the default and log a warning on stderr.
Without STARTGG_TOKEN the server still starts and lists tools, but every
call returns a clear AUTH_ERROR explaining how to fix it.
Security
- The token is read from the environment only, sent only to
api.start.gg, and never included in tool output, logs, or error messages - All tools are read-only; no mutations are implemented
.envfiles are git-ignored; use.env.exampleas a template- User-supplied input is schema-validated before any request is built
Rate limits
start.gg allows 80 requests per 60 seconds and at most 1000 objects per request. This server:
- keeps a sliding-window budget below the request limit (default 75/60s)
- retries
429(honoringRetry-After) and transient 5xx errors with exponential backoff, at most 3 retries — GraphQL errors are never retried - caps
perPageper tool so responses stay under the 1000-object complexity limit (sets are expensive: ~26+ objects each, henceperPage <= 30) - caps
fetchAllat 5 pages per tool (output is meant for an LLM context, so it stays around 100 KB of compact JSON) and reportstruncated: truewhen it stops early
Development
GraphQL documents live in graphql/*.graphql (one file per domain, multiple
named operations per file; requests select an operation via operationName).
Schema facts verified against the live API are recorded in
docs/startgg-api-notes.md — read it before
adding fields.
Testing
Unit tests cover the URL resolver, normalizers, input validation, pagination, GraphQL/HTTP error handling, the rate limiter, and the cache.
License
Source: README.md at commit f991d32
Tools
0Version history
1- v0.1.0LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts