QuakeWorld MVD Analytics API
mvdanalyzer-api parses QuakeWorld .mvd demos
into structured analytics — frags, damage, weapon accuracy, positions,
region control and more — over a JSON REST API.
REST access requires an API key. Sign in with Discord to get one; it takes a few seconds and no email or server membership is requested — only your Discord username and id.
By signing in you accept the terms of use; the privacy policy describes what is stored (your Discord id and username, a hash of your key) and why.
Using the API
Send your key as a bearer token:
Authorization: Bearer qwmvd_…
The full API reference — every endpoint, parameter, response schema and error — is served by the API itself: browse it at /docs (machine-readable spec at /openapi.yaml). Deep field-level semantics of the analysis output are at /docs/result-schema.
API stability
The API is not frozen yet. Most change is additive — new
endpoints and new response fields appear at any time — but a schema
upgrade can still remove a documented field or change what one
means, inside /v1. That has happened: schema v70 dropped
topKills, topStreaks, topPowerups and
hasRegionControl from /overview when they turned
out to be copies of other endpoints. Build against it, but pin nothing you
cannot re-check.
What we do promise today is that no change is silent.
Every observable change bumps schemaVersion and is written up
in the release notes against that version, the spec served at
/docs is generated from the running code and tested
against real responses, and the MCP tools deploy in lockstep with the API.
So schemaVersion is both your cache key and, for now,
the thing to watch: when it moves, read the notes before assuming nothing
broke.
This is heading somewhere more stable in the near future: an additive-only
/v1, with genuine breaks shipping as /v2/… served
alongside it and old routes retiring on a minimum of 8 weeks'
notice. The machinery for that is already in place — versioned notes, a
drift-tested spec, per-key usage measurement — what is missing is the
commitment to stop moving, and we would rather earn that than announce it
early. A correctness fix, where a value changes because it was computed
wrongly, keeps the field's name and type and at most narrows its documented
meaning to what it was always meant to measure.
In return your client must ignore unknown fields and unknown enum values, and treat /openapi.yaml as the contract — undocumented behaviour you happen to observe may change. Full policy: /docs.
MCP (AI agents)
The same analytics are exposed as an MCP server for AI agents (Claude Code / Claude Desktop, Cursor, …) — streamable HTTP, no API key needed:
https://mvdanalyzer.com/mcp
For example: claude mcp add --transport http mvdanalyzer https://mvdanalyzer.com/mcp
— then ask about any demo on hub.quakeworld.nu
("analyze the opening of gameId 145060").
Source, issues and the full project:
github.com/galfthan/mvd_analyzer.
Questions, problems, rate-limit or upload-quota requests: message
nexusga on Discord.