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.
Files changed (242) hide show
  1. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/workflows/docs-check.yml +8 -1
  2. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/workflows/publish.yml +28 -2
  3. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/workflows/test.yml +6 -2
  4. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.gitignore +3 -1
  5. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/CHANGELOG.md +68 -0
  6. vlrdevapi-3.0.0/README.md → vlrdevapi-3.1.1/PKG-INFO +160 -7
  7. vlrdevapi-3.0.0/PKG-INFO → vlrdevapi-3.1.1/README.md +88 -56
  8. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/pyproject.toml +36 -3
  9. vlrdevapi-3.1.1/scripts/check_docs_schema.py +478 -0
  10. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/scripts/download_fixtures.py +22 -7
  11. vlrdevapi-3.1.1/server.json +32 -0
  12. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/__init__.py +1 -1
  13. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/info/models.py +23 -1
  14. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/list/models.py +32 -2
  15. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/matches/models.py +32 -1
  16. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/stages/models.py +17 -1
  17. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/standings/models.py +27 -1
  18. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/teams/models.py +43 -1
  19. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/completed/models.py +45 -1
  20. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/live/models.py +38 -1
  21. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/upcoming/models.py +42 -1
  22. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/article/models.py +24 -2
  23. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/list/models.py +25 -1
  24. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/namespace.py +10 -0
  25. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/_common_parsing.py +2 -2
  26. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/agents/models.py +47 -1
  27. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/info/models.py +25 -2
  28. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/matches/models.py +32 -1
  29. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/placements/models.py +23 -1
  30. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/profile/models.py +27 -2
  31. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/teams/models.py +31 -1
  32. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/economy/models.py +70 -3
  33. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/info/models.py +61 -2
  34. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/performance/models.py +64 -1
  35. vlrdevapi-3.1.1/src/vlrdevapi/_series/players/models.py +280 -0
  36. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/players/namespace.py +2 -0
  37. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/players/parser.py +63 -35
  38. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/replay/models.py +68 -1
  39. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/rounds/models.py +43 -1
  40. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/vods/models.py +37 -1
  41. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/completed_matches/models.py +35 -1
  42. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/info/models.py +24 -1
  43. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/info/namespace.py +0 -1
  44. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/placements/models.py +36 -1
  45. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/roster/models.py +25 -1
  46. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/stats/models.py +27 -2
  47. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/transactions/models.py +23 -1
  48. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/upcoming_matches/models.py +32 -1
  49. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/__init__.py +2 -0
  50. vlrdevapi-3.1.1/src/vlrdevapi/commons/export.py +306 -0
  51. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/exceptions.py +5 -0
  52. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/fetcher.py +9 -1
  53. vlrdevapi-3.1.1/src/vlrdevapi/mcp/__init__.py +5 -0
  54. vlrdevapi-3.1.1/src/vlrdevapi/mcp/_common.py +69 -0
  55. vlrdevapi-3.1.1/src/vlrdevapi/mcp/server.py +33 -0
  56. vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/__init__.py +35 -0
  57. vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/composite.py +179 -0
  58. vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/events.py +88 -0
  59. vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/matches.py +40 -0
  60. vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/news.py +30 -0
  61. vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/players.py +74 -0
  62. vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/series.py +105 -0
  63. vlrdevapi-3.1.1/src/vlrdevapi/mcp/tools/teams.py +91 -0
  64. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/validators.py +2 -1
  65. vlrdevapi-3.1.1/uv.lock +2166 -0
  66. vlrdevapi-3.0.0/src/vlrdevapi/_series/players/models.py +0 -84
  67. vlrdevapi-3.0.0/uv.lock +0 -1165
  68. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.gitattributes +0 -0
  69. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  70. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  71. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.github/workflows/cleanup-caches.yml +0 -0
  72. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.nvmrc +0 -0
  73. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.python-version +0 -0
  74. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/.readthedocs.yaml +0 -0
  75. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/CODE_OF_CONDUCT.md +0 -0
  76. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/CONTRIBUTING.md +0 -0
  77. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/LICENCE +0 -0
  78. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/SECURITY.md +0 -0
  79. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/SUPPORT.md +0 -0
  80. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/scripts/check_mdx_examples.py +0 -0
  81. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/__init__.pyi +0 -0
  82. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_base.py +0 -0
  83. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_cache.py +0 -0
  84. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_client.py +0 -0
  85. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/__init__.py +0 -0
  86. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/_common.py +0 -0
  87. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/info/__init__.py +0 -0
  88. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/info/namespace.py +0 -0
  89. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/info/namespace.pyi +0 -0
  90. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/info/parser.py +0 -0
  91. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/list/__init__.py +0 -0
  92. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/list/namespace.py +0 -0
  93. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/list/namespace.pyi +0 -0
  94. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/list/parser.py +0 -0
  95. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/matches/__init__.py +0 -0
  96. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/matches/namespace.py +0 -0
  97. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/matches/namespace.pyi +0 -0
  98. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/matches/parser.py +0 -0
  99. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/namespace.py +0 -0
  100. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/namespace.pyi +0 -0
  101. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/stages/__init__.py +0 -0
  102. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/stages/namespace.py +0 -0
  103. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/stages/namespace.pyi +0 -0
  104. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/stages/parser.py +0 -0
  105. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/standings/__init__.py +0 -0
  106. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/standings/namespace.py +0 -0
  107. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/standings/namespace.pyi +0 -0
  108. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/standings/parser.py +0 -0
  109. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/teams/__init__.py +0 -0
  110. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/teams/namespace.py +0 -0
  111. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/teams/namespace.pyi +0 -0
  112. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_event/teams/parser.py +0 -0
  113. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/__init__.py +0 -0
  114. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/common.py +0 -0
  115. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/completed/__init__.py +0 -0
  116. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/completed/namespace.py +0 -0
  117. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/completed/namespace.pyi +0 -0
  118. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/completed/parser.py +0 -0
  119. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/live/__init__.py +0 -0
  120. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/live/namespace.py +0 -0
  121. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/live/namespace.pyi +0 -0
  122. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/live/parser.py +0 -0
  123. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/namespace.py +0 -0
  124. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/namespace.pyi +0 -0
  125. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/upcoming/__init__.py +0 -0
  126. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/upcoming/namespace.py +0 -0
  127. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/upcoming/namespace.pyi +0 -0
  128. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_matches/upcoming/parser.py +0 -0
  129. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/__init__.py +0 -0
  130. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/article/__init__.py +0 -0
  131. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/article/namespace.py +0 -0
  132. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/article/namespace.pyi +0 -0
  133. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/article/parser.py +0 -0
  134. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/common.py +0 -0
  135. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/list/__init__.py +0 -0
  136. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/list/namespace.py +0 -0
  137. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/list/namespace.pyi +0 -0
  138. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/list/parser.py +0 -0
  139. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_news/namespace.pyi +0 -0
  140. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/__init__.py +0 -0
  141. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/agents/__init__.py +0 -0
  142. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/agents/namespace.py +0 -0
  143. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/agents/namespace.pyi +0 -0
  144. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/agents/parser.py +0 -0
  145. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/info/__init__.py +0 -0
  146. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/info/namespace.py +0 -0
  147. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/info/namespace.pyi +0 -0
  148. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/info/parser.py +0 -0
  149. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/matches/__init__.py +0 -0
  150. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/matches/namespace.py +0 -0
  151. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/matches/namespace.pyi +0 -0
  152. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/matches/parser.py +0 -0
  153. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/namespace.py +0 -0
  154. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/namespace.pyi +0 -0
  155. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/placements/__init__.py +0 -0
  156. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/placements/namespace.py +0 -0
  157. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/placements/namespace.pyi +0 -0
  158. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/placements/parser.py +0 -0
  159. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/profile/__init__.py +0 -0
  160. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/profile/namespace.py +0 -0
  161. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/profile/namespace.pyi +0 -0
  162. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/profile/parser.py +0 -0
  163. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/teams/__init__.py +0 -0
  164. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/teams/namespace.py +0 -0
  165. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/teams/namespace.pyi +0 -0
  166. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_player/teams/parser.py +0 -0
  167. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/__init__.py +0 -0
  168. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/_utils.py +0 -0
  169. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/economy/__init__.py +0 -0
  170. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/economy/namespace.py +0 -0
  171. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/economy/namespace.pyi +0 -0
  172. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/economy/parser.py +0 -0
  173. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/info/__init__.py +0 -0
  174. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/info/namespace.py +0 -0
  175. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/info/namespace.pyi +0 -0
  176. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/info/parser.py +0 -0
  177. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/match_namespace.py +0 -0
  178. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/match_namespace.pyi +0 -0
  179. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/namespace.py +0 -0
  180. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/namespace.pyi +0 -0
  181. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/performance/__init__.py +0 -0
  182. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/performance/namespace.py +0 -0
  183. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/performance/namespace.pyi +0 -0
  184. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/performance/parser.py +0 -0
  185. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/players/__init__.py +0 -0
  186. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/players/namespace.pyi +0 -0
  187. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/replay/__init__.py +0 -0
  188. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/replay/namespace.py +0 -0
  189. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/replay/namespace.pyi +0 -0
  190. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/replay/parser.py +0 -0
  191. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/rounds/__init__.py +0 -0
  192. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/rounds/namespace.py +0 -0
  193. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/rounds/namespace.pyi +0 -0
  194. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/rounds/parser.py +0 -0
  195. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/vods/__init__.py +0 -0
  196. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/vods/namespace.py +0 -0
  197. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/vods/namespace.pyi +0 -0
  198. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_series/vods/parser.py +0 -0
  199. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/__init__.py +0 -0
  200. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/completed_matches/__init__.py +0 -0
  201. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/completed_matches/namespace.py +0 -0
  202. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/completed_matches/namespace.pyi +0 -0
  203. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/completed_matches/parser.py +0 -0
  204. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/info/__init__.py +0 -0
  205. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/info/namespace.pyi +0 -0
  206. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/info/parser.py +0 -0
  207. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/namespace.py +0 -0
  208. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/namespace.pyi +0 -0
  209. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/placements/__init__.py +0 -0
  210. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/placements/namespace.py +0 -0
  211. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/placements/namespace.pyi +0 -0
  212. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/placements/parser.py +0 -0
  213. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/roster/__init__.py +0 -0
  214. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/roster/namespace.py +0 -0
  215. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/roster/namespace.pyi +0 -0
  216. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/roster/parser.py +0 -0
  217. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/stats/__init__.py +0 -0
  218. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/stats/namespace.py +0 -0
  219. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/stats/namespace.pyi +0 -0
  220. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/stats/parser.py +0 -0
  221. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/transactions/__init__.py +0 -0
  222. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/transactions/namespace.py +0 -0
  223. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/transactions/namespace.pyi +0 -0
  224. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/transactions/parser.py +0 -0
  225. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/upcoming_matches/__init__.py +0 -0
  226. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/upcoming_matches/namespace.py +0 -0
  227. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/upcoming_matches/namespace.pyi +0 -0
  228. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_team/upcoming_matches/parser.py +0 -0
  229. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/__init__.py +0 -0
  230. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/pagination.py +0 -0
  231. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/paths.py +0 -0
  232. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/team_enrichment.py +0 -0
  233. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/team_parsing.py +0 -0
  234. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/_utils/text.py +0 -0
  235. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/countries.py +0 -0
  236. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/datetime.py +0 -0
  237. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/mappings.py +0 -0
  238. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/prizes.py +0 -0
  239. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/regions.py +0 -0
  240. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/commons/timezone.py +0 -0
  241. {vlrdevapi-3.0.0 → vlrdevapi-3.1.1}/src/vlrdevapi/py.typed +0 -0
  242. {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
@@ -30,4 +30,6 @@ main.py
30
30
  official-docs/node_modules/
31
31
 
32
32
  # Zensical cache
33
- docs-py/.cache/
33
+ docs-py/.cache/
34
+
35
+ temp/
@@ -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
- [![PyPI version](https://img.shields.io/pypi/v/vlrdevapi.svg?color=fd4556)](https://pypi.org/project/vlrdevapi/)
10
- [![Python Version](https://img.shields.io/pypi/pyversions/vlrdevapi.svg)](https://pypi.org/project/vlrdevapi/)
81
+ [![PyPI version](https://img.shields.io/pypi/v/vlrdevapi.svg)](https://pypi.org/project/vlrdevapi/)
82
+ [![Python Version](https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13%20%7C%203.14%20%7C%203.15-blue.svg)](https://pypi.org/project/vlrdevapi/)
83
+ [![Status: Stable](https://img.shields.io/badge/status-stable-brightgreen.svg)](https://pypi.org/project/vlrdevapi/)
84
+ [![MCP Server](https://img.shields.io/badge/MCP-40%20tools-red.svg)](https://vlrdevapi.pages.dev/docs/mcp/)
11
85
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
12
86
  [![Documentation](https://img.shields.io/badge/docs-vlrdevapi.pages.dev-blue.svg)](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
- # Using uv (recommended)
122
+ # Basic installation
123
+ pip install vlrdevapi
124
+ # or with uv
45
125
  uv add vlrdevapi
46
126
 
47
- # Using pip
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 higher.
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 (`4.0` requests per second) to respect VLR.gg servers. When using `VLRClient`, you can customize client settings:
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
- [![PyPI version](https://img.shields.io/pypi/v/vlrdevapi.svg?color=fd4556)](https://pypi.org/project/vlrdevapi/)
59
- [![Python Version](https://img.shields.io/pypi/pyversions/vlrdevapi.svg)](https://pypi.org/project/vlrdevapi/)
9
+ [![PyPI version](https://img.shields.io/pypi/v/vlrdevapi.svg)](https://pypi.org/project/vlrdevapi/)
10
+ [![Python Version](https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13%20%7C%203.14%20%7C%203.15-blue.svg)](https://pypi.org/project/vlrdevapi/)
11
+ [![Status: Stable](https://img.shields.io/badge/status-stable-brightgreen.svg)](https://pypi.org/project/vlrdevapi/)
12
+ [![MCP Server](https://img.shields.io/badge/MCP-40%20tools-red.svg)](https://vlrdevapi.pages.dev/docs/mcp/)
60
13
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
61
14
  [![Documentation](https://img.shields.io/badge/docs-vlrdevapi.pages.dev-blue.svg)](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
- # Using uv (recommended)
50
+ # Basic installation
51
+ pip install vlrdevapi
52
+ # or with uv
94
53
  uv add vlrdevapi
95
54
 
96
- # Using pip
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 higher.
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 (`4.0` requests per second) to respect VLR.gg servers. When using `VLRClient`, you can customize client settings:
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