MCP Server (Model Context Protocol)
Built-in Model Context Protocol server exposing 40 tools for AI assistants, Claude Desktop, Cursor, Zed, and autonomous agents.
VLRdevAPI includes a native Model Context Protocol (MCP) server that connects LLM applications, coding agents, and chat interfaces directly to live Valorant esports data from vlr.gg.
With 40 tools covering matches, series, teams, players, tournaments, editorial news, and high-level composite dossiers, AI models can inspect live schedules, calculate head-to-head records, analyze player agent ratings, and evaluate round-by-round economies without custom scraping code.
Installation
The MCP server is included as an optional dependency extra:
# Install with MCP dependencies
pip install "vlrdevapi[mcp]"
# Or install with all extras (pandas, polars, openpyxl, pyarrow, mcp)
pip install "vlrdevapi[all]"Running the Server
The server communicates over standard input/output (stdio) using the MCP protocol.
Option 1: CLI Entry Point
vlrdevapi-mcpOption 2: Python Module
python -m vlrdevapi.mcp.serverOption 3: Zero-Install via uvx
uvx --from "vlrdevapi[mcp]" vlrdevapi-mcpClient Configuration
Claude Desktop
Add vlrdevapi to your Claude Desktop configuration file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"vlrdevapi": {
"command": "uvx",
"args": ["--from", "vlrdevapi[mcp]", "vlrdevapi-mcp"]
}
}
}Or if installed in a local Python virtual environment:
{
"mcpServers": {
"vlrdevapi": {
"command": "/path/to/venv/bin/vlrdevapi-mcp"
}
}
}Cursor IDE
In Cursor Settings → Features → MCP Servers, add a new server or configure .cursor/mcp.json:
{
"mcpServers": {
"vlrdevapi": {
"command": "vlrdevapi-mcp"
}
}
}Zed Editor
In Zed's settings.json:
{
"context_servers": {
"vlrdevapi": {
"command": "vlrdevapi-mcp"
}
}
}High-Level Composite Tools
In addition to granular endpoints, VLRdevAPI provides 8 high-level composite tools designed specifically for multi-step agent reasoning, returning unified context in a single call:
| Tool Name | Parameters | Description |
|---|---|---|
get_match_full_context | series_id: int | Aggregates match overview, player statistics, and streams/VODs into a single context payload. |
get_team_overview | team_id: int | Comprehensive dossier with team info, active roster, upcoming schedule, and tournament placements. |
compare_teams | team_id_1: int, team_id_2: int, last_days: int = 60 | Side-by-side comparison of two teams (rosters, recent map performance statistics, and forms). |
get_player_career_summary | player_id: int | Consolidated player dossier with biography, current teams, agent pool ratings, and placements. |
get_h2h_matchup | team_id_1: int, team_id_2: int, limit: int = 50 | Full head-to-head match history between two organizations. |
get_tournament_dossier | event_id: int | Tournament overview combining participating teams, stages, and standings. |
get_live_and_upcoming_schedule | limit: int = 15 | Combined live match ticker and upcoming schedule. |
get_news_digest | limit: int = 5, include_top_article_body: bool = true | Latest esports news digest with optional full Markdown body for the top story. |
Complete Tool Catalog
Matches
matches_upcoming(page: int = 1, max_page: int = 0, return_all: bool = false): Fetch upcoming scheduled matches with team names, event details, and match times.matches_live(): Fetch currently live matches with real-time scores, team names, and event info.matches_completed(page: int = 1, max_page: int = 0, return_all: bool = false): Fetch past completed match results with final scores, winners, and dates.
Series & Games
series_info(series_id: int): Detailed match overview including teams, date, format, score, event, and map vetoes.series_players(series_id: int, game_id: str = "all"): Player statistics for a series or specific map (ACS, K/D, ADR, KAST).series_rounds(series_id: int, game_id: int): Round-by-round results including round winner, win type, and economy for a map.series_performance(series_id: int, game_id: str = "all"): Kill matrix and head-to-head duels between players.series_economy(series_id: int, game_id: str = "all"): Team economy data, bank reserves, loadout values, and buy types per round.series_replay(series_id: int, game_id: int): 2D spatial replay events, minimap coordinates, kill locations, and loadouts.series_vods(series_id: int): VOD links, broadcast streams, and timestamped match recordings.series_map_summary(series_id: int, game_id: str): Map-level summary combining economy, replay timeline, and player stats.
Teams
team_info(team_id: int): Team profile details including name, tag, country, ranking, and social links.team_roster(team_id: int): Active team roster with player names, real names, and staff roles.team_stats(team_id: int, last_days: int | None = None, agent_composition: str = "none"): Map win rates, side win percentages (Attack/Defense), and agent compositions.team_completed_matches(team_id: int, limit: int = 50, return_all: bool = false): Historical match results for a team.team_upcoming_matches(team_id: int): Upcoming scheduled fixtures for a team.team_transactions(team_id: int): Roster transactions, player additions, departures, and role transfers.team_placements(team_id: int): Tournament results, placement finishes, and prize earnings.
Players
player_info(player_id: int): Player profile including IGN, real name, country, and total tournament winnings.player_teams(player_id: int): Career team history, past organizations, and join/leave dates.player_agents(player_id: int, timespan: str = "all"): Agent statistics (ACS, K/D, ADR, KAST, pick rates) over a timespan (30d,60d,90d,all).player_matches(player_id: int, limit: int = 50): Match history for a player with individual ratings and scores.player_profile(player_id: int): Consolidated profile combining bio, current team, and top agents.player_placements(player_id: int): Tournament placements and prize earnings won by a player.
Events & Tournaments
events_list(page: int = 1, tier: str = "all", region: str = "all", status: str | None = None): Browse tournaments by tier (vct,vcl,gc,t3), region (americas,emea,pacific,china), and status (ongoing,upcoming,completed).event_info(event_id: int): Tournament overview including prize pool, dates, location, and format.event_stages(event_id: int): Tournament stages and brackets (Group Stage, Playoffs, Lower Final).event_teams(event_id: int): Participating teams and qualified rosters in an event.event_matches(event_id: int, stage: str | None = None, state: str = "all"): Scheduled and completed fixtures within a tournament.event_standings(event_id: int, stage: str | None = None): Final tournament placements, rank orders, and prize payouts.
Editorial News
news_list(page: int = 1): Latest news articles and headlines from the vlr.gg editorial desk.news_article(article_id: int): Full article content with title, author, publish date, and GitHub-flavored Markdown text.
Response Serialization & Architecture
All tool responses are serialized using VLRdevAPI's optimized ExportableModel.to_dict() and ExportableModel.to_json() methods. This delivers:
- Lightweight JSON Payloads: Direct serialization avoids bloated intermediate representations, minimizing token usage in LLM context windows.
- Graceful Error Trapping: Domain exceptions (such as
NotFoundErrororValidationError) are caught and returned as structured JSON error responses rather than crashing the MCP connection:{ "error": "NotFound", "message": "Player with ID 99999999 not found" } - Strict Validation: All input arguments conform to standard JSON Schemas generated from Pydantic types, ensuring reliable tool calling across Claude, GPT-4, and Gemini.
Last updated on