vlrdevapi 3.0.0__tar.gz → 3.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/workflows/docs-check.yml +8 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/workflows/publish.yml +28 -2
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/workflows/test.yml +6 -2
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.gitignore +3 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/CHANGELOG.md +68 -0
- vlrdevapi-3.0.0/README.md → vlrdevapi-3.1.1/PKG-INFO +160 -7
- vlrdevapi-3.0.0/PKG-INFO → vlrdevapi-3.1.1/README.md +88 -56
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/pyproject.toml +36 -3
- vlrdevapi-3.1.1/scripts/check_docs_schema.py +478 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/scripts/download_fixtures.py +22 -7
- vlrdevapi-3.1.1/server.json +32 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/__init__.py +1 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/info/models.py +23 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/list/models.py +32 -2
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/matches/models.py +32 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/stages/models.py +17 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/standings/models.py +27 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/teams/models.py +43 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/completed/models.py +45 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/live/models.py +38 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/upcoming/models.py +42 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/article/models.py +24 -2
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/list/models.py +25 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/namespace.py +10 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/_common_parsing.py +2 -2
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/agents/models.py +47 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/info/models.py +25 -2
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/matches/models.py +32 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/placements/models.py +23 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/profile/models.py +27 -2
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/teams/models.py +31 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/economy/models.py +70 -3
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/info/models.py +61 -2
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/performance/models.py +64 -1
- vlrdevapi-3.1.1/src/vlrdevapi/_series/players/models.py +280 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/players/namespace.py +2 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/players/parser.py +63 -35
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/replay/models.py +68 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/rounds/models.py +43 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/vods/models.py +37 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/completed_matches/models.py +35 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/info/models.py +24 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/info/namespace.py +0 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/placements/models.py +36 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/roster/models.py +25 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/stats/models.py +27 -2
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/transactions/models.py +23 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/upcoming_matches/models.py +32 -1
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/__init__.py +2 -0
- vlrdevapi-3.1.1/src/vlrdevapi/commons/export.py +306 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/exceptions.py +5 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/fetcher.py +9 -1
- vlrdevapi-3.1.1/src/vlrdevapi/mcp/__init__.py +5 -0
- vlrdevapi-3.1.1/src/vlrdevapi/mcp/_common.py +69 -0
- vlrdevapi-3.1.1/src/vlrdevapi/mcp/server.py +33 -0
- vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/__init__.py +35 -0
- vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/composite.py +179 -0
- vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/events.py +88 -0
- vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/matches.py +40 -0
- vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/news.py +30 -0
- vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/players.py +74 -0
- vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/series.py +105 -0
- vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/teams.py +91 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/validators.py +2 -1
- vlrdevapi-3.1.1/uv.lock +2166 -0
- vlrdevapi-3.0.0/src/vlrdevapi/_series/players/models.py +0 -84
- vlrdevapi-3.0.0/uv.lock +0 -1165
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.gitattributes +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/workflows/cleanup-caches.yml +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.nvmrc +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.python-version +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.readthedocs.yaml +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/CODE_OF_CONDUCT.md +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/CONTRIBUTING.md +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/LICENCE +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/SECURITY.md +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/SUPPORT.md +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/scripts/check_mdx_examples.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/__init__.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_base.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_cache.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_client.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/_common.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/info/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/info/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/info/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/info/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/list/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/list/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/list/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/list/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/matches/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/matches/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/matches/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/matches/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/stages/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/stages/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/stages/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/stages/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/standings/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/standings/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/standings/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/standings/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/teams/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/teams/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/teams/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/teams/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/common.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/completed/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/completed/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/completed/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/completed/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/live/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/live/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/live/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/live/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/upcoming/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/upcoming/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/upcoming/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/upcoming/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/article/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/article/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/article/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/article/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/common.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/list/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/list/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/list/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/list/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/agents/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/agents/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/agents/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/agents/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/info/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/info/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/info/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/info/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/matches/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/matches/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/matches/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/matches/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/placements/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/placements/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/placements/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/placements/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/profile/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/profile/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/profile/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/profile/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/teams/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/teams/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/teams/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/teams/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/_utils.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/economy/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/economy/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/economy/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/economy/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/info/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/info/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/info/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/info/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/match_namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/match_namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/performance/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/performance/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/performance/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/performance/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/players/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/players/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/replay/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/replay/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/replay/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/replay/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/rounds/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/rounds/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/rounds/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/rounds/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/vods/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/vods/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/vods/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/vods/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/completed_matches/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/completed_matches/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/completed_matches/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/completed_matches/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/info/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/info/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/info/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/placements/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/placements/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/placements/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/placements/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/roster/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/roster/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/roster/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/roster/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/stats/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/stats/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/stats/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/stats/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/transactions/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/transactions/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/transactions/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/transactions/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/upcoming_matches/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/upcoming_matches/namespace.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/upcoming_matches/namespace.pyi +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/upcoming_matches/parser.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/__init__.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/pagination.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/paths.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/team_enrichment.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/team_parsing.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/text.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/countries.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/datetime.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/mappings.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/prizes.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/regions.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/timezone.py +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/py.typed +0 -0
- {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/wrangler.jsonc +0 -0
|
@@ -5,11 +5,15 @@ on:
|
|
|
5
5
|
paths:
|
|
6
6
|
- 'official-docs/**'
|
|
7
7
|
- 'docs-py/**'
|
|
8
|
+
- 'src/**'
|
|
9
|
+
- 'scripts/**'
|
|
8
10
|
push:
|
|
9
11
|
branches: [main]
|
|
10
12
|
paths:
|
|
11
13
|
- 'official-docs/**'
|
|
12
14
|
- 'docs-py/**'
|
|
15
|
+
- 'src/**'
|
|
16
|
+
- 'scripts/**'
|
|
13
17
|
|
|
14
18
|
jobs:
|
|
15
19
|
check:
|
|
@@ -22,7 +26,10 @@ jobs:
|
|
|
22
26
|
python-version: '3.12'
|
|
23
27
|
|
|
24
28
|
- name: Install package
|
|
25
|
-
run: uv sync --group dev
|
|
29
|
+
run: uv sync --group dev --all-extras
|
|
30
|
+
|
|
31
|
+
- name: Validate documentation schemas against Python library
|
|
32
|
+
run: uv run scripts/check_docs_schema.py
|
|
26
33
|
|
|
27
34
|
# Restore fixture cache scoped to the current ref (branch or main) and version prefix (v3).
|
|
28
35
|
# This ensures caches are never shared across unrelated branches or older versions.
|
|
@@ -13,7 +13,7 @@ jobs:
|
|
|
13
13
|
runs-on: ubuntu-latest
|
|
14
14
|
strategy:
|
|
15
15
|
matrix:
|
|
16
|
-
python-version: ['3.11', '3.12', '3.13', '3.14']
|
|
16
|
+
python-version: ['3.11', '3.12', '3.13', '3.14', '3.15']
|
|
17
17
|
|
|
18
18
|
steps:
|
|
19
19
|
- uses: actions/checkout@v7
|
|
@@ -23,7 +23,7 @@ jobs:
|
|
|
23
23
|
python-version: ${{ matrix.python-version }}
|
|
24
24
|
|
|
25
25
|
- name: Install dependencies
|
|
26
|
-
run: uv sync --group dev
|
|
26
|
+
run: uv sync --group dev --all-extras
|
|
27
27
|
|
|
28
28
|
- name: Download fixtures
|
|
29
29
|
run: uv run python scripts/download_fixtures.py
|
|
@@ -75,3 +75,29 @@ jobs:
|
|
|
75
75
|
|
|
76
76
|
- name: Publish to PyPI
|
|
77
77
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
78
|
+
|
|
79
|
+
mcp-publish:
|
|
80
|
+
name: Publish to MCP Registry
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
needs:
|
|
83
|
+
- pypi-publish
|
|
84
|
+
|
|
85
|
+
permissions:
|
|
86
|
+
id-token: write
|
|
87
|
+
contents: read
|
|
88
|
+
|
|
89
|
+
steps:
|
|
90
|
+
- uses: actions/checkout@v7
|
|
91
|
+
|
|
92
|
+
- name: Install mcp-publisher
|
|
93
|
+
run: |
|
|
94
|
+
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
|
|
95
|
+
|
|
96
|
+
- name: Wait for PyPI propagation
|
|
97
|
+
run: sleep 15
|
|
98
|
+
|
|
99
|
+
- name: Authenticate to MCP Registry
|
|
100
|
+
run: ./mcp-publisher login github-oidc
|
|
101
|
+
|
|
102
|
+
- name: Publish to MCP Registry
|
|
103
|
+
run: ./mcp-publisher publish
|
|
@@ -5,6 +5,8 @@ on:
|
|
|
5
5
|
paths:
|
|
6
6
|
- 'src/**'
|
|
7
7
|
- 'tests/**'
|
|
8
|
+
- 'pyproject.toml'
|
|
9
|
+
- 'uv.lock'
|
|
8
10
|
- 'scripts/download_fixtures.py'
|
|
9
11
|
- '.github/workflows/test.yml'
|
|
10
12
|
push:
|
|
@@ -12,6 +14,8 @@ on:
|
|
|
12
14
|
paths:
|
|
13
15
|
- 'src/**'
|
|
14
16
|
- 'tests/**'
|
|
17
|
+
- 'pyproject.toml'
|
|
18
|
+
- 'uv.lock'
|
|
15
19
|
- 'scripts/download_fixtures.py'
|
|
16
20
|
- '.github/workflows/test.yml'
|
|
17
21
|
|
|
@@ -20,7 +24,7 @@ jobs:
|
|
|
20
24
|
runs-on: ubuntu-latest
|
|
21
25
|
strategy:
|
|
22
26
|
matrix:
|
|
23
|
-
python-version: ['3.11', '3.12', '3.13', '3.14']
|
|
27
|
+
python-version: ['3.11', '3.12', '3.13', '3.14', '3.15']
|
|
24
28
|
|
|
25
29
|
steps:
|
|
26
30
|
- uses: actions/checkout@v7
|
|
@@ -30,7 +34,7 @@ jobs:
|
|
|
30
34
|
python-version: ${{ matrix.python-version }}
|
|
31
35
|
|
|
32
36
|
- name: Install dependencies
|
|
33
|
-
run: uv sync --group dev
|
|
37
|
+
run: uv sync --group dev --all-extras
|
|
34
38
|
|
|
35
39
|
- name: Download fixtures
|
|
36
40
|
run: uv run python scripts/download_fixtures.py
|
|
@@ -5,6 +5,72 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
7
|
|
|
8
|
+
## [3.1.1] - 2026-11-13
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Official MCP Registry Manifest** — Added `server.json` compliant with the Model Context Protocol registry schema (`registry.modelcontextprotocol.io`), registering `io.github.vanshbordia/vlrdevapi` with stdio transport and `uvx` runtime arguments.
|
|
13
|
+
- **Automated MCP Registry Publishing Workflow** — Extended GitHub Actions release pipeline (`publish.yml`) with automated OIDC authentication (`id-token: write`) via `mcp-publisher`.
|
|
14
|
+
- **PyPI MCP Ownership Verification** — Added package ownership verification marker to `README.md`.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- **MCP Registry CLI Entrypoint** — Expose `vlrdevapi` console script alias to `vlrdevapi.mcp.server:main` alongside `vlrdevapi-mcp` so MCP registry clients launch the server using the package identifier.
|
|
19
|
+
- **Windows Timezone Support** — Added `tzdata>=2025.1; sys_platform == 'win32'` as a core dependency to resolve `ZoneInfoNotFoundError` when running `vlrdevapi` or `uvx` on Windows.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- **Dependency Upgrades** — Bumped core Python dependencies (Pydantic, Pandas, Polars, PyArrow, Pytest, Ruff) and documentation website dependencies (Next.js 16.4.6, Fumadocs 16.19, Tailwind CSS 4.3.5).
|
|
24
|
+
|
|
25
|
+
## [3.1.0] - 2026-10-25
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
- **Multi-Format Tabular Export Layer** — All Pydantic models now inherit from `ExportableModel`, enabling seamless tabular serialization into popular data science formats:
|
|
30
|
+
- `.to_records()` — extracts clean, unnested lists of Python dictionaries with semantic flattening across every namespace.
|
|
31
|
+
- `.to_df()` — converts records directly into a `pandas.DataFrame`.
|
|
32
|
+
- `.to_polars()` — converts records directly into a native `polars.DataFrame` with typed nested arrays (`pl.List(pl.String)`).
|
|
33
|
+
- `.to_csv(path=None)` — exports to standard CSV format with semicolon-delimited lists (`"Player;IGL"`) and in-memory string output when `path` is omitted.
|
|
34
|
+
- `.to_parquet(path, index=False)` — writes Apache Parquet files via pandas and pyarrow.
|
|
35
|
+
- `.to_excel(path, sheet_name="Sheet1", index=False)` — exports Excel `.xlsx` spreadsheets via pandas and openpyxl.
|
|
36
|
+
- `.to_json(path=None, indent=2)` — exports clean serialized JSON to string or disk with comprehensive recursive datetime and list handling.
|
|
37
|
+
- `.to_markdown(columns=None)` — generates GitHub-flavored markdown tables with proper column alignments, pipe escaping, and zero dependencies.
|
|
38
|
+
- **Granular Optional Dependency Extras** — Data export dependencies are strictly optional and modular:
|
|
39
|
+
- `vlrdevapi[pandas]`: installs `pandas>=2.0.0`
|
|
40
|
+
- `vlrdevapi[polars]`: installs `polars>=1.0.0`
|
|
41
|
+
- `vlrdevapi[excel]`: installs `openpyxl>=3.1.0` and `pandas>=2.0.0`
|
|
42
|
+
- `vlrdevapi[parquet]`: installs `pyarrow>=14.0.0` and `pandas>=2.0.0`
|
|
43
|
+
- `vlrdevapi[mcp]`: installs `mcp>=1.2.0`
|
|
44
|
+
- `vlrdevapi[all]`: installs all optional tabular, file, and MCP dependencies.
|
|
45
|
+
- Missing dependencies provide actionable, friendly install prompts with exact pip commands instead of generic import errors.
|
|
46
|
+
- **First-Class Model Context Protocol (MCP) Server** — Built-in MCP server for AI agents and LLMs (Claude Desktop, Cursor, Zed, Antigravity):
|
|
47
|
+
- CLI executable `vlrdevapi-mcp` (or `python -m vlrdevapi.mcp.server`, `uvx vlrdevapi-mcp`).
|
|
48
|
+
- Standard `stdio` transport with structured, formatted tool definitions.
|
|
49
|
+
- 40 tools covering all endpoints across Matches, Series, Teams, Players, Events, and News.
|
|
50
|
+
- High-level composite tools for complex agent tasks:
|
|
51
|
+
- `get_match_full_context(series_id)` — aggregates overview, player statistics, and streams/VODs into a single response.
|
|
52
|
+
- `get_team_overview(team_id)` — combines team info, roster, upcoming schedule, and tournament placements.
|
|
53
|
+
- `compare_teams(team_id_1, team_id_2, last_days=60)` — side-by-side comparison of two teams with rosters and recent map statistics/forms.
|
|
54
|
+
- `get_player_career_summary(player_id)` — consolidated dossier with profile, current teams, agent pool ratings, and tournament placements.
|
|
55
|
+
- `get_h2h_matchup(team_id_1, team_id_2)` — head-to-head match history between two organizations.
|
|
56
|
+
- `get_tournament_dossier(event_id)` — tournament overview with participating teams, stages, and standings.
|
|
57
|
+
- `get_live_and_upcoming_schedule(limit)` — live ticker combined with upcoming match schedule.
|
|
58
|
+
- `get_news_digest(limit, include_top_article_body)` — latest esports headlines with optional top article body.
|
|
59
|
+
- `series_map_summary(series_id, game_id)` — targeted map-level overview combining economy, replay timeline, and player stats.
|
|
60
|
+
- **Python 3.15 Ready** — Added Python 3.15 to the CI/CD test and publish workflows, verified across uv python matrix.
|
|
61
|
+
- **Production/Stable Status** — Package status promoted to `Development Status :: 5 - Production/Stable` in package metadata.
|
|
62
|
+
|
|
63
|
+
### Improved
|
|
64
|
+
|
|
65
|
+
- **Semantic Model Flattening** — Tabular export extractors (`.to_records()`) now generate clean, non-redundant rows:
|
|
66
|
+
- Upcoming/completed matches omit static status columns and resolve unannounced teams as `"TBD"`.
|
|
67
|
+
- Player agent statistics provide unnested, clean numeric columns (`acs`, `kd`, `adr`, `kast`, `kpr`, `apr`).
|
|
68
|
+
- Series player stats properly segregate map rows, labeling the aggregate map view as `"All Maps"`.
|
|
69
|
+
- Team rosters separate `primary_role` and multi-role lists.
|
|
70
|
+
- **Unified Serialization in MCP Tools** — MCP server tools now leverage `ExportableModel.to_dict()` and `ExportableModel.to_json()`, eliminating redundant ad-hoc JSON conversion and drastically speeding up tool invocations.
|
|
71
|
+
- **CSV Multi-Value List Formatting** — Agent lists and team roles are formatted with standard semicolon delimiters (`"neon;raze;jett"`) instead of Python `repr()` strings, ensuring full compatibility with spreadsheet applications and analytical parsers.
|
|
72
|
+
- **Parser Corrections** — Fixed swapped KAST and ADR columns in `player.agents()` table extraction to match VLR.gg's actual table headers.
|
|
73
|
+
|
|
8
74
|
## [3.0.0] - 2026-10-23
|
|
9
75
|
|
|
10
76
|
### Breaking
|
|
@@ -436,6 +502,8 @@ The API surface, module structure, and type system are all new.
|
|
|
436
502
|
- `aiohttp` and `asyncio` dependencies.
|
|
437
503
|
- v1.x match/event/team parsing modules.
|
|
438
504
|
|
|
505
|
+
[3.1.1]: https://github.com/Vanshbordia/vlrdevapi/compare/v3.1.0...v3.1.1
|
|
506
|
+
[3.1.0]: https://github.com/Vanshbordia/vlrdevapi/compare/v3.0.0...v3.1.0
|
|
439
507
|
[3.0.0]: https://github.com/Vanshbordia/vlrdevapi/compare/v2.4.1...v3.0.0
|
|
440
508
|
[2.4.1]: https://github.com/Vanshbordia/vlrdevapi/compare/v2.4.0...v2.4.1
|
|
441
509
|
[2.4.0]: https://github.com/Vanshbordia/vlrdevapi/compare/v2.3.0...v2.4.0
|
|
@@ -1,3 +1,75 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: vlrdevapi
|
|
3
|
+
Version: 3.1.1
|
|
4
|
+
Summary: A Python library to scrape data from vlr.gg
|
|
5
|
+
Project-URL: Homepage, https://vlrdevapi.pages.dev/
|
|
6
|
+
Project-URL: Repository, https://github.com/Vanshbordia/vlrdevapi
|
|
7
|
+
Project-URL: Documentation, https://vlrdevapi.pages.dev/docs/
|
|
8
|
+
License: MIT License
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2026 Vansh Bordia
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
29
|
+
License-File: LICENCE
|
|
30
|
+
Keywords: api,esports,python,scraper,sdk,valorant,valorant esports,vct,vlr.gg,vlrgg
|
|
31
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
32
|
+
Classifier: Intended Audience :: Developers
|
|
33
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
34
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
35
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
36
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
37
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
39
|
+
Classifier: Topic :: Games/Entertainment
|
|
40
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
41
|
+
Requires-Python: >=3.11
|
|
42
|
+
Requires-Dist: httpx>=0.28.1
|
|
43
|
+
Requires-Dist: pydantic>=2.14.1
|
|
44
|
+
Requires-Dist: selectolax>=1.0.0
|
|
45
|
+
Requires-Dist: tzdata>=2025.1; sys_platform == 'win32'
|
|
46
|
+
Provides-Extra: all
|
|
47
|
+
Requires-Dist: mcp>=1.2.0; extra == 'all'
|
|
48
|
+
Requires-Dist: openpyxl>=3.1.0; extra == 'all'
|
|
49
|
+
Requires-Dist: pandas>=2.0.0; extra == 'all'
|
|
50
|
+
Requires-Dist: polars>=1.0.0; extra == 'all'
|
|
51
|
+
Requires-Dist: pyarrow>=14.0.0; extra == 'all'
|
|
52
|
+
Provides-Extra: arrow
|
|
53
|
+
Requires-Dist: pandas>=2.0.0; extra == 'arrow'
|
|
54
|
+
Requires-Dist: pyarrow>=14.0.0; extra == 'arrow'
|
|
55
|
+
Provides-Extra: excel
|
|
56
|
+
Requires-Dist: openpyxl>=3.1.0; extra == 'excel'
|
|
57
|
+
Requires-Dist: pandas>=2.0.0; extra == 'excel'
|
|
58
|
+
Provides-Extra: mcp
|
|
59
|
+
Requires-Dist: mcp>=1.2.0; extra == 'mcp'
|
|
60
|
+
Provides-Extra: pandas
|
|
61
|
+
Requires-Dist: pandas>=2.0.0; extra == 'pandas'
|
|
62
|
+
Provides-Extra: parquet
|
|
63
|
+
Requires-Dist: pandas>=2.0.0; extra == 'parquet'
|
|
64
|
+
Requires-Dist: pyarrow>=14.0.0; extra == 'parquet'
|
|
65
|
+
Provides-Extra: polars
|
|
66
|
+
Requires-Dist: polars>=1.0.0; extra == 'polars'
|
|
67
|
+
Provides-Extra: test
|
|
68
|
+
Requires-Dist: pytest-cov>=7.1.0; extra == 'test'
|
|
69
|
+
Requires-Dist: pytest>=9.1.1; extra == 'test'
|
|
70
|
+
Requires-Dist: respx>=0.23.1; extra == 'test'
|
|
71
|
+
Description-Content-Type: text/markdown
|
|
72
|
+
|
|
1
73
|
<div align="center">
|
|
2
74
|
|
|
3
75
|
<img src="official-docs/public/logo.png" width="120" alt="vlrdevapi logo">
|
|
@@ -6,8 +78,10 @@
|
|
|
6
78
|
|
|
7
79
|
**The modern, type-safe Python library for VLR.gg Valorant esports data**
|
|
8
80
|
|
|
9
|
-
[](https://pypi.org/project/vlrdevapi/)
|
|
82
|
+
[](https://pypi.org/project/vlrdevapi/)
|
|
83
|
+
[](https://pypi.org/project/vlrdevapi/)
|
|
84
|
+
[](https://vlrdevapi.pages.dev/docs/mcp/)
|
|
11
85
|
[](https://opensource.org/licenses/MIT)
|
|
12
86
|
[](https://vlrdevapi.pages.dev/docs/)
|
|
13
87
|
|
|
@@ -15,6 +89,8 @@
|
|
|
15
89
|
|
|
16
90
|
</div>
|
|
17
91
|
|
|
92
|
+
<!-- mcp-name: io.github.vanshbordia/vlrdevapi -->
|
|
93
|
+
|
|
18
94
|
---
|
|
19
95
|
|
|
20
96
|
**vlrdevapi** is a high-performance, type-safe Python client for extracting and analyzing Valorant esports data from [VLR.gg](https://www.vlr.gg/). Built for competitive analysts, data scientists, Discord bot creators, and esports engineers, it delivers structured [Pydantic](https://docs.pydantic.dev/) models with full type hinting, built-in rate limiting, automatic retries, and comprehensive coverage across all VLR.gg entities.
|
|
@@ -25,6 +101,8 @@ Whether you need live match tickers, tournament brackets, historical player rati
|
|
|
25
101
|
|
|
26
102
|
## Highlights
|
|
27
103
|
|
|
104
|
+
- **Universal Tabular Data Exports** — Seamlessly export any response into `pandas.DataFrame` (`.to_df()`), native `polars.DataFrame` (`.to_polars()`), `CSV` (`.to_csv()`), `Apache Parquet` (`.to_parquet()`), `Excel` (`.to_excel()`), formatted `JSON` (`.to_json()`), and `Markdown` (`.to_markdown()`).
|
|
105
|
+
- **Model Context Protocol (MCP) Server** — Connect Claude Desktop, Cursor, Zed, and AI agents directly to live Valorant data via the built-in `vlrdevapi-mcp` stdio server with 40 tools.
|
|
28
106
|
- **Complete Valorant Esports Coverage** — Tournaments, match schedules, live scoreboards, player careers, team rosters, roster transactions, and esports news.
|
|
29
107
|
- **2D Kill-Feed Replay Timelines** — Spatial `(x, y)` kill coordinates, viewing angles, kill distances, plant/defuse events, spike detonations (`boom`), resurrections, alive player snapshots, and buy-phase **player loadouts** (weapons, shields, spent credits, remaining bank).
|
|
30
108
|
- **Round-by-Round Economy** — Full team buy matrices (`loadout_value`, `spent`, `bank`, buy classifications like `Eco`, `Anti-eco`, `Semi-buy`, `Semi-rifle`, and `Full buy`).
|
|
@@ -41,14 +119,23 @@ Whether you need live match tickers, tournament brackets, historical player rati
|
|
|
41
119
|
Install `vlrdevapi` using [uv](https://docs.astral.sh/uv/) (recommended) or `pip`:
|
|
42
120
|
|
|
43
121
|
```bash
|
|
44
|
-
#
|
|
122
|
+
# Basic installation
|
|
123
|
+
pip install vlrdevapi
|
|
124
|
+
# or with uv
|
|
45
125
|
uv add vlrdevapi
|
|
46
126
|
|
|
47
|
-
#
|
|
48
|
-
pip install vlrdevapi
|
|
127
|
+
# With optional extras
|
|
128
|
+
pip install "vlrdevapi[pandas]" # pandas.DataFrame (.to_df())
|
|
129
|
+
pip install "vlrdevapi[polars]" # polars.DataFrame (.to_polars())
|
|
130
|
+
pip install "vlrdevapi[excel]" # Excel .xlsx (.to_excel())
|
|
131
|
+
pip install "vlrdevapi[parquet]" # Apache Parquet (.to_parquet())
|
|
132
|
+
pip install "vlrdevapi[mcp]" # MCP server (vlrdevapi-mcp)
|
|
133
|
+
|
|
134
|
+
# Install with all optional extras
|
|
135
|
+
pip install "vlrdevapi[all]"
|
|
49
136
|
```
|
|
50
137
|
|
|
51
|
-
> **Requirements:** Python 3.11 or
|
|
138
|
+
> **Requirements:** Python 3.11, 3.12, 3.13, 3.14, or 3.15.
|
|
52
139
|
|
|
53
140
|
---
|
|
54
141
|
|
|
@@ -252,11 +339,77 @@ Learn more in the [News Reference Documentation](https://vlrdevapi.pages.dev/doc
|
|
|
252
339
|
|
|
253
340
|
---
|
|
254
341
|
|
|
342
|
+
## Tabular Data Exports (Data Science & Analytics)
|
|
343
|
+
|
|
344
|
+
Every response model inherits from `ExportableModel`, enabling instant conversion to dataframes, spreadsheets, and serialized files:
|
|
345
|
+
|
|
346
|
+
```python
|
|
347
|
+
import vlrdevapi
|
|
348
|
+
|
|
349
|
+
# 1. Fetch player statistics for a grand final
|
|
350
|
+
players = vlrdevapi.series(754737).players()
|
|
351
|
+
|
|
352
|
+
# 2. Convert to pandas DataFrame
|
|
353
|
+
df = players.to_df()
|
|
354
|
+
print(df[["name", "team_name", "rating", "acs", "kills", "deaths"]].head())
|
|
355
|
+
|
|
356
|
+
# 3. Convert to Polars DataFrame (preserving typed list columns)
|
|
357
|
+
polars_df = players.to_polars()
|
|
358
|
+
|
|
359
|
+
# 4. Export to CSV (semicolon-delimited lists, e.g. "neon;raze;jett")
|
|
360
|
+
players.to_csv("grand_final_players.csv")
|
|
361
|
+
|
|
362
|
+
# 5. Export to Apache Parquet
|
|
363
|
+
players.to_parquet("grand_final_players.parquet")
|
|
364
|
+
|
|
365
|
+
# 6. Export to Excel (.xlsx)
|
|
366
|
+
players.to_excel("grand_final_players.xlsx", sheet_name="PlayerStats")
|
|
367
|
+
|
|
368
|
+
# 7. Export to JSON (in-memory string or written to disk)
|
|
369
|
+
json_payload = players.to_json(indent=2)
|
|
370
|
+
|
|
371
|
+
# 8. Print GitHub-flavored Markdown table
|
|
372
|
+
print(players.to_markdown())
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## Model Context Protocol (MCP) Server
|
|
378
|
+
|
|
379
|
+
VLRdevAPI includes a native MCP server for AI assistants and autonomous coding agents (`io.github.vanshbordia/vlrdevapi` on the official MCP Registry):
|
|
380
|
+
|
|
381
|
+
```bash
|
|
382
|
+
# Run server over stdio
|
|
383
|
+
vlrdevapi-mcp
|
|
384
|
+
|
|
385
|
+
# Or zero-install with uvx
|
|
386
|
+
uvx --from "vlrdevapi[mcp]" vlrdevapi-mcp
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Claude Desktop & Cursor Integration
|
|
390
|
+
|
|
391
|
+
Add to your `claude_desktop_config.json` or `.cursor/mcp.json`:
|
|
392
|
+
|
|
393
|
+
```json
|
|
394
|
+
{
|
|
395
|
+
"mcpServers": {
|
|
396
|
+
"vlrdevapi": {
|
|
397
|
+
"command": "uvx",
|
|
398
|
+
"args": ["--from", "vlrdevapi[mcp]", "vlrdevapi-mcp"]
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
The MCP server provides **40 tools** covering matches, series, teams, players, tournaments, and editorial news, plus high-level composite tools (`get_match_full_context`, `get_team_overview`, `compare_teams`, `get_player_career_summary`, `get_h2h_matchup`, `get_tournament_dossier`, `get_live_and_upcoming_schedule`, `get_news_digest`, `series_map_summary`).
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
255
408
|
## Configuration & Error Handling
|
|
256
409
|
|
|
257
410
|
### Rate Limiting & Concurrency
|
|
258
411
|
|
|
259
|
-
`vlrdevapi` includes sensible defaults (`
|
|
412
|
+
`vlrdevapi` includes sensible defaults (`3.0` requests per second) to respect VLR.gg servers. When using `VLRClient`, you can customize client settings:
|
|
260
413
|
|
|
261
414
|
```python
|
|
262
415
|
from zoneinfo import ZoneInfo
|
|
@@ -1,52 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.5
|
|
2
|
-
Name: vlrdevapi
|
|
3
|
-
Version: 3.0.0
|
|
4
|
-
Summary: A Python library to scrape data from vlr.gg
|
|
5
|
-
Project-URL: Homepage, https://vlrdevapi.pages.dev/
|
|
6
|
-
Project-URL: Repository, https://github.com/Vanshbordia/vlrdevapi
|
|
7
|
-
Project-URL: Documentation, https://vlrdevapi.pages.dev/docs/
|
|
8
|
-
License: MIT License
|
|
9
|
-
|
|
10
|
-
Copyright (c) 2026 Vansh Bordia
|
|
11
|
-
|
|
12
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
-
in the Software without restriction, including without limitation the rights
|
|
15
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
-
furnished to do so, subject to the following conditions:
|
|
18
|
-
|
|
19
|
-
The above copyright notice and this permission notice shall be included in all
|
|
20
|
-
copies or substantial portions of the Software.
|
|
21
|
-
|
|
22
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
-
SOFTWARE.
|
|
29
|
-
License-File: LICENCE
|
|
30
|
-
Keywords: api,esports,python,scraper,sdk,valorant,valorant esports,vct,vlr.gg,vlrgg
|
|
31
|
-
Classifier: Development Status :: 3 - Alpha
|
|
32
|
-
Classifier: Intended Audience :: Developers
|
|
33
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
34
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
35
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
36
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
37
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
38
|
-
Classifier: Topic :: Games/Entertainment
|
|
39
|
-
Classifier: Topic :: Internet :: WWW/HTTP
|
|
40
|
-
Requires-Python: >=3.11
|
|
41
|
-
Requires-Dist: httpx>=0.28.1
|
|
42
|
-
Requires-Dist: pydantic>=2.14.1
|
|
43
|
-
Requires-Dist: selectolax>=1.0.0
|
|
44
|
-
Provides-Extra: test
|
|
45
|
-
Requires-Dist: pytest-cov>=7.1.0; extra == 'test'
|
|
46
|
-
Requires-Dist: pytest>=9.1.1; extra == 'test'
|
|
47
|
-
Requires-Dist: respx>=0.23.1; extra == 'test'
|
|
48
|
-
Description-Content-Type: text/markdown
|
|
49
|
-
|
|
50
1
|
<div align="center">
|
|
51
2
|
|
|
52
3
|
<img src="official-docs/public/logo.png" width="120" alt="vlrdevapi logo">
|
|
@@ -55,8 +6,10 @@ Description-Content-Type: text/markdown
|
|
|
55
6
|
|
|
56
7
|
**The modern, type-safe Python library for VLR.gg Valorant esports data**
|
|
57
8
|
|
|
58
|
-
[](https://pypi.org/project/vlrdevapi/)
|
|
10
|
+
[](https://pypi.org/project/vlrdevapi/)
|
|
11
|
+
[](https://pypi.org/project/vlrdevapi/)
|
|
12
|
+
[](https://vlrdevapi.pages.dev/docs/mcp/)
|
|
60
13
|
[](https://opensource.org/licenses/MIT)
|
|
61
14
|
[](https://vlrdevapi.pages.dev/docs/)
|
|
62
15
|
|
|
@@ -64,6 +17,8 @@ Description-Content-Type: text/markdown
|
|
|
64
17
|
|
|
65
18
|
</div>
|
|
66
19
|
|
|
20
|
+
<!-- mcp-name: io.github.vanshbordia/vlrdevapi -->
|
|
21
|
+
|
|
67
22
|
---
|
|
68
23
|
|
|
69
24
|
**vlrdevapi** is a high-performance, type-safe Python client for extracting and analyzing Valorant esports data from [VLR.gg](https://www.vlr.gg/). Built for competitive analysts, data scientists, Discord bot creators, and esports engineers, it delivers structured [Pydantic](https://docs.pydantic.dev/) models with full type hinting, built-in rate limiting, automatic retries, and comprehensive coverage across all VLR.gg entities.
|
|
@@ -74,6 +29,8 @@ Whether you need live match tickers, tournament brackets, historical player rati
|
|
|
74
29
|
|
|
75
30
|
## Highlights
|
|
76
31
|
|
|
32
|
+
- **Universal Tabular Data Exports** — Seamlessly export any response into `pandas.DataFrame` (`.to_df()`), native `polars.DataFrame` (`.to_polars()`), `CSV` (`.to_csv()`), `Apache Parquet` (`.to_parquet()`), `Excel` (`.to_excel()`), formatted `JSON` (`.to_json()`), and `Markdown` (`.to_markdown()`).
|
|
33
|
+
- **Model Context Protocol (MCP) Server** — Connect Claude Desktop, Cursor, Zed, and AI agents directly to live Valorant data via the built-in `vlrdevapi-mcp` stdio server with 40 tools.
|
|
77
34
|
- **Complete Valorant Esports Coverage** — Tournaments, match schedules, live scoreboards, player careers, team rosters, roster transactions, and esports news.
|
|
78
35
|
- **2D Kill-Feed Replay Timelines** — Spatial `(x, y)` kill coordinates, viewing angles, kill distances, plant/defuse events, spike detonations (`boom`), resurrections, alive player snapshots, and buy-phase **player loadouts** (weapons, shields, spent credits, remaining bank).
|
|
79
36
|
- **Round-by-Round Economy** — Full team buy matrices (`loadout_value`, `spent`, `bank`, buy classifications like `Eco`, `Anti-eco`, `Semi-buy`, `Semi-rifle`, and `Full buy`).
|
|
@@ -90,14 +47,23 @@ Whether you need live match tickers, tournament brackets, historical player rati
|
|
|
90
47
|
Install `vlrdevapi` using [uv](https://docs.astral.sh/uv/) (recommended) or `pip`:
|
|
91
48
|
|
|
92
49
|
```bash
|
|
93
|
-
#
|
|
50
|
+
# Basic installation
|
|
51
|
+
pip install vlrdevapi
|
|
52
|
+
# or with uv
|
|
94
53
|
uv add vlrdevapi
|
|
95
54
|
|
|
96
|
-
#
|
|
97
|
-
pip install vlrdevapi
|
|
55
|
+
# With optional extras
|
|
56
|
+
pip install "vlrdevapi[pandas]" # pandas.DataFrame (.to_df())
|
|
57
|
+
pip install "vlrdevapi[polars]" # polars.DataFrame (.to_polars())
|
|
58
|
+
pip install "vlrdevapi[excel]" # Excel .xlsx (.to_excel())
|
|
59
|
+
pip install "vlrdevapi[parquet]" # Apache Parquet (.to_parquet())
|
|
60
|
+
pip install "vlrdevapi[mcp]" # MCP server (vlrdevapi-mcp)
|
|
61
|
+
|
|
62
|
+
# Install with all optional extras
|
|
63
|
+
pip install "vlrdevapi[all]"
|
|
98
64
|
```
|
|
99
65
|
|
|
100
|
-
> **Requirements:** Python 3.11 or
|
|
66
|
+
> **Requirements:** Python 3.11, 3.12, 3.13, 3.14, or 3.15.
|
|
101
67
|
|
|
102
68
|
---
|
|
103
69
|
|
|
@@ -301,11 +267,77 @@ Learn more in the [News Reference Documentation](https://vlrdevapi.pages.dev/doc
|
|
|
301
267
|
|
|
302
268
|
---
|
|
303
269
|
|
|
270
|
+
## Tabular Data Exports (Data Science & Analytics)
|
|
271
|
+
|
|
272
|
+
Every response model inherits from `ExportableModel`, enabling instant conversion to dataframes, spreadsheets, and serialized files:
|
|
273
|
+
|
|
274
|
+
```python
|
|
275
|
+
import vlrdevapi
|
|
276
|
+
|
|
277
|
+
# 1. Fetch player statistics for a grand final
|
|
278
|
+
players = vlrdevapi.series(754737).players()
|
|
279
|
+
|
|
280
|
+
# 2. Convert to pandas DataFrame
|
|
281
|
+
df = players.to_df()
|
|
282
|
+
print(df[["name", "team_name", "rating", "acs", "kills", "deaths"]].head())
|
|
283
|
+
|
|
284
|
+
# 3. Convert to Polars DataFrame (preserving typed list columns)
|
|
285
|
+
polars_df = players.to_polars()
|
|
286
|
+
|
|
287
|
+
# 4. Export to CSV (semicolon-delimited lists, e.g. "neon;raze;jett")
|
|
288
|
+
players.to_csv("grand_final_players.csv")
|
|
289
|
+
|
|
290
|
+
# 5. Export to Apache Parquet
|
|
291
|
+
players.to_parquet("grand_final_players.parquet")
|
|
292
|
+
|
|
293
|
+
# 6. Export to Excel (.xlsx)
|
|
294
|
+
players.to_excel("grand_final_players.xlsx", sheet_name="PlayerStats")
|
|
295
|
+
|
|
296
|
+
# 7. Export to JSON (in-memory string or written to disk)
|
|
297
|
+
json_payload = players.to_json(indent=2)
|
|
298
|
+
|
|
299
|
+
# 8. Print GitHub-flavored Markdown table
|
|
300
|
+
print(players.to_markdown())
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## Model Context Protocol (MCP) Server
|
|
306
|
+
|
|
307
|
+
VLRdevAPI includes a native MCP server for AI assistants and autonomous coding agents (`io.github.vanshbordia/vlrdevapi` on the official MCP Registry):
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
# Run server over stdio
|
|
311
|
+
vlrdevapi-mcp
|
|
312
|
+
|
|
313
|
+
# Or zero-install with uvx
|
|
314
|
+
uvx --from "vlrdevapi[mcp]" vlrdevapi-mcp
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Claude Desktop & Cursor Integration
|
|
318
|
+
|
|
319
|
+
Add to your `claude_desktop_config.json` or `.cursor/mcp.json`:
|
|
320
|
+
|
|
321
|
+
```json
|
|
322
|
+
{
|
|
323
|
+
"mcpServers": {
|
|
324
|
+
"vlrdevapi": {
|
|
325
|
+
"command": "uvx",
|
|
326
|
+
"args": ["--from", "vlrdevapi[mcp]", "vlrdevapi-mcp"]
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
The MCP server provides **40 tools** covering matches, series, teams, players, tournaments, and editorial news, plus high-level composite tools (`get_match_full_context`, `get_team_overview`, `compare_teams`, `get_player_career_summary`, `get_h2h_matchup`, `get_tournament_dossier`, `get_live_and_upcoming_schedule`, `get_news_digest`, `series_map_summary`).
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
304
336
|
## Configuration & Error Handling
|
|
305
337
|
|
|
306
338
|
### Rate Limiting & Concurrency
|
|
307
339
|
|
|
308
|
-
`vlrdevapi` includes sensible defaults (`
|
|
340
|
+
`vlrdevapi` includes sensible defaults (`3.0` requests per second) to respect VLR.gg servers. When using `VLRClient`, you can customize client settings:
|
|
309
341
|
|
|
310
342
|
```python
|
|
311
343
|
from zoneinfo import ZoneInfo
|