Volleymetrics MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Volleymetrics MCP ServerAnalyze our serve-receive by rotation from last night's match."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
๐ Volleymetrics MCP Server (volleymetrics-mcp)
A production-grade Model Context Protocol (MCP) server connecting AI clients (Claude Desktop, Cursor, Antigravity, or custom LLM agents) to Volleymetrics and Hudl volleyball analytics.
Transform your AI into a Staff Volleyball Performance Analyst capable of scouting opponents, diagnosing rotation breakdowns (P1โP6), analyzing serve-receive stability, generating box scores, and exporting event-by-event touches directly to DataVolley (.dvw) and Pandas.
โ๏ธ Legal Disclaimer
This is an independent, open-source community project and is not affiliated with, maintained by, authorized by, or endorsed by Hudl, Agile Sports Technologies, Volleymetrics, or Balltime.
All product and company names are trademarksโข or registeredยฎ trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them. This integration operates under a strict, client-side, read-only policy to access data belonging to your authenticated team account.
๐ Why Coaches & Analysts Love This Server
๐ก๏ธ Zero Password Storage: Interactive browser login (
login_to_volleymetrics) lets you log in via 1Password, Bitwarden, Apple/Google SSO, or 2FA. Your password is never stored or seen by the AI or environment files.๐ฆ 1-Click
.mcpbInstallation: Distribute a single double-clickable.mcpbbundle that non-technical coaches can install into Claude Desktop without touching a terminal.โก Zero-Setup
uvx: Run instantly viauvx --from git+https://github.com/onnobos/volleymetrics_mcp.git volleymetrics-mcpwithout manually managing virtual environments or dependencies.๐ช Context-Window Optimized: Strips bloated API metadata. Tools return either clean Markdown tables or token-efficient compact dictionaries (
output_format="markdown"or"compact").๐ก๏ธ Defensive Networking & Account Protection:
Strict Read-Only: Enforces zero mutation policy; any mutating request is immediately blocked before transmission.
Rate Limiting: Built-in 2 requests/second token bucket rate limiter with jittered exponential backoff on HTTP 429/5xx.
Multi-Tier Disk Caching: 7-day persistent cache for match box scores, touches, and DVW files; 15-minute cache for schedules and team rosters.
๐ Volleyball Domain Semantics: Native support for Rotations P1 through P6, setter distribution, First-Ball Sideout (FBSO), and DataVolley
.dvwskill codes (S,R,E,A,B,D,F) and evaluation codes (#,+,!,-,=).๐ Direct DataVolley DVW Downloads: Generate and save official
.dvwscouting files directly from the Volleymetrics export pipeline.๐ค 5 Built-In FastMCP Prompts (
@mcp.prompt): Pre-packaged, professional coaching workflows for opponent scouting, rotation diagnostics, MVP evaluation, DataVolley export, and serve-receive audits.
Related MCP server: ValorLens
๐ Quick Start & Installation
Option 1: Zero-Setup uvx (Recommended for Cursor, Claude Desktop & Terminal Users)
Requires Astral's ultra-fast uv. No virtual environment activation needed.
Claude Desktop Configuration
Add this to your claude_desktop_config.json:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"volleymetrics": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/onnobos/volleymetrics_mcp.git",
"volleymetrics-mcp"
]
}
}
}Cursor IDE Configuration
In Cursor, open Settings > Features > MCP Servers > Add New MCP Server (or edit .cursor/mcp.json):
{
"mcpServers": {
"volleymetrics": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/onnobos/volleymetrics_mcp.git",
"volleymetrics-mcp"
]
}
}
}Antigravity Configuration
In Antigravity, add to your MCP settings or use mcp_config.antigravity.json:
{
"mcpServers": {
"volleymetrics": {
"command": "python",
"args": ["-m", "volleymetrics_mcp.server"]
}
}
}๐ Authentication: Interactive Pop-Up Browser
The easiest and most secure way to authenticate is saying in your AI chat:
"Log me into Volleymetrics"
A visible browser window opens to
https://portal.volleymetrics.hudl.com.Log in using your password manager (1Password, Bitwarden, iCloud Keychain), Hudl SSO, or 2FA.
Once you reach the portal dashboard, session tokens are securely saved to
~/.volleymetrics_mcp/auth_state.jsonand the OS Keychain.The browser window closes automatically and you are authenticated!
๐ ๏ธ Available MCP Tools
Tool | Description |
| Discover and list all Volleymetrics teams and active accounts to find your Team ID. |
| Fetch recent matches and upcoming schedule fixtures for a team. |
| Retrieve athlete box scores with accurate hitting %, total blocks, points, and pass ratings. |
| Analyze tactical sideout % (SO%), point scoring % (PS%), FBSO%, and setter distribution across P1โP6. |
| Query chronological volleyball touches with DataVolley (.dvw) skill and evaluation codes. |
| Generate and download the authentic |
| Launch interactive browser login window without password storage. |
| Refresh session token or view authentication status. |
๐ฏ FastMCP Prompts (@mcp.prompt)
scout_opponent: 5-step tactical opponent scouting workflow analyzing offense, weak sideout rotations, and vulnerable passers.analyze_rotation_weaknesses: Rotation diagnostic analyzing sideout efficiency under 50% and setter distribution predictability.match_mvp_breakdown: Quantitative MVP evaluation using True Points, Hitting Efficiency, and Defensive Impact.datavolley_export: Translates match touch data into standardized OpenVolley.dvwscouting syntax.serve_receive_audit: Evaluates 3-pass percentage, reception errors, and opponent service pressure points.
๐งช Development & Testing
# 1. Clone repository
git clone https://github.com/onnobos/volleymetrics_mcp.git
cd volleymetrics_mcp
# 2. Create virtual environment and install dev dependencies
uv venv
source .venv/bin/activate
uv pip install -e ".[dev]"
# 3. Run automated tests
pytest -v tests/๐ License
MIT License. See LICENSE for details.
Available Tools
8 toolsdownload_match_dvwDownload Match DataVolley (.dvw) FileAIdempotent
Export and save the official raw DataVolley (.dvw) scouting file for a match to the local filesystem for external analysis software, unlike get_game_actions (which returns parsed touch events directly in the conversation).
When to Use
Save an authentic
.dvwfile ([3DATAVOLLEYSCOUT]format) to disk for import into DataVolley 4, VolleyStation, Click&Scout, or OpenVolley / R / Python (datavolley) pipelines.Archive raw match scouting files locally.
When NOT to Use
Do NOT use when you only need to analyze player stats, rotations, or touches inside the chat; call
get_match_player_stats,get_rotation_breakdown, orget_game_actionsinstead to avoid unnecessary filesystem writes.Do NOT call if
has_dvwisFalseinlist_volleyball_matches.
Behavioral Guarantees & Filesystem Policy
Side Effects: Remote Volleymetrics interaction is strictly read-only (
GET), but this tool writes a local file namedmatch_<match_id>.dvwinsideoutput_dir(hencereadOnlyHint=False,destructiveHint=False,idempotentHint=True).Path Sanitization: Strips unsafe characters from
match_idand resolvesoutput_dirviaPath.expanduser().resolve()to prevent path traversal.Fallback Generation: If the native
.dvwendpoint returns plain JSON events, automatically synthesizes a standards-compliant.dvwfile containing match metadata and[3SCOUT]codes.Rate Limiting: Client token bucket (
2 req/s, burst4) with automatic retry.
Parameter & Workflow Semantics
Acquire
match_idfromlist_volleyball_matchesfirst; pass an explicitoutput_dirwhen organizing exports for a specific opponent or tournament folder.
Returns & Error States
Returns a Markdown confirmation containing
Match ID, resolved absoluteLocal Filepath, andFile Sizein bytes.Returns validation error if
match_idis empty, orโ ๏ธ Authentication Erroron HTTP401/403.
| Name | Required | Description | Default |
|---|---|---|---|
| match_id | Yes | Unique Volleymetrics match identifier obtained from list_volleyball_matches. | |
| output_dir | No | Optional local directory path where the exported match_<match_id>.dvw file will be saved. When omitted or None, writes to the current working directory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the local write side effect and resulting filename pattern, path sanitization via expanduser/resolve, a fallback that synthesizes a compliant .dvw from JSON events, token-bucket rate limits (2 req/s, burst 4) with retry, and 401/403 error behavior. The annotations only declare the safety flags; the description explains what actually happens on disk and over the network.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then cleanly sectioned under headers, so an agent can scan to the relevant block. Slightly over-long, and the parenthetical restating `readOnlyHint=False, destructiveHint=False, idempotentHint=True` duplicates structured annotation data rather than adding to it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the full lifecycle an agent needs for a file-writing export tool: precondition, parameters, side effects, failure modes, and the exact shape of the Markdown confirmation (Match ID, absolute path, file size). Nothing material is missing even though there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns extra credit by adding workflow provenance for `match_id` (acquire from `list_volleyball_matches` first) and intent guidance for `output_dir` (organize by opponent or tournament folder). It does not add format constraints or edge cases for the path beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Export and save the official raw DataVolley (.dvw) scouting file') and immediately contrasts it with the sibling `get_game_actions`, which returns parsed events instead of a file. The agent can distinguish this tool from every sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'When to Use' and 'When NOT to Use' sections, naming concrete downstream consumers (DataVolley 4, VolleyStation, OpenVolley/R/Python) and three named alternatives (`get_match_player_stats`, `get_rotation_breakdown`, `get_game_actions`) with the condition that selects them. It also adds a hard precondition: do not call if `has_dvw` is False.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_game_actionsGet Match Tagged Game ActionsARead-onlyIdempotent
Query chronologically ordered, event-by-event volleyball touches and DataVolley (.dvw) scout tags from a match with optional set, skill, player, team, and quality filters, unlike get_match_player_stats (aggregate player totals) or download_match_dvw (raw .dvw file export to disk).
When to Use
Inspect granular play-by-play contacts, video timestamps, start/end court zones (
1โ9), attack combinations, and DataVolley codes (e.g.*17AT#,a07SM=).Filter specific tactical subsets, such as all reception errors (
action_type='receive', quality='error'), clutch kills in Set 5 (set_number=5, action_type='attack', quality='kill'), or an individual hitter's shot tendencies (player='17', action_type='attack').
When NOT to Use
Do NOT page through all match touches just to compute a player's kill or dig totals; call
get_match_player_statsin a single request instead.Do NOT use for P1โP6 sideout summary tables; call
get_rotation_breakdowninstead.Do NOT use when the user wants a
.dvwfile saved to disk for external software; calldownload_match_dvwinstead.
Behavioral Guarantees & Caching
Execution Contract: Strictly read-only, idempotent query.
Caching Policy: Raw match touch timelines are cached on local disk for 7 days (
604800s); all filtering and pagination execute locally in memory after the initial fetch.Rate Limiting: Client token bucket (
2 req/s, burst4) with automatic retry.
Parameter & Workflow Semantics
All provided filter parameters (
set_number,action_type,player,team,quality) combine via logicalANDbeforeoffsetandlimitpagination are applied.The response header always reports
total_matchingalongsidereturned_countso you know whether to advanceoffset(offset + limit) for additional pages.
Returns & Error States
'markdown': Summary counts by action type followed by a table with columns#,Set,Score,Time,Team,Player,Action,Quality,DVW Code, andTactical Details.'compact': JSON object{"match": str, "total_matching": int, "returned_count": int, "by_type": dict, "events": [{"idx": int, "set": int, "score": str, "time": float, "team": str, "no": str, "player": str, "type": str, "quality": str, "dvw": str, "zone": str, "fbso": bool}]}.Returns validation error if
match_idis empty, orโ ๏ธ Authentication Erroron HTTP401/403.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Optional team filter: 'a' (home/primary team), 'b' (away/opponent team), or team name substring. | |
| limit | No | Maximum number of chronological touch events to return per page (1 to 200). | |
| offset | No | Zero-based pagination offset for stepping through chronological match touches. | |
| player | No | Optional athlete filter matching jersey number (e.g. '17' or '#7') or case-insensitive player name substring. | |
| quality | No | Optional outcome/evaluation filter mapping to DataVolley evaluation codes: 'kill' (# on attack/block), 'error' (=), 'ace' (# on serve), 'perfect_pass' (# on receive), 'assist', or 'in_play'. | |
| match_id | Yes | Unique Volleymetrics match identifier obtained from list_volleyball_matches. | |
| set_number | No | Optional set number (1 to 5) to restrict play-by-play touches to a single set. When None, searches across all sets. | |
| action_type | No | Optional volleyball skill filter mapping to DataVolley skill codes: 'serve' (S), 'receive' (R), 'set' (E), 'attack' (A), 'block' (B), 'dig' (D), or 'free_ball' (F). | |
| force_refresh | No | When True, bypasses the 7-day local disk cache and fetches raw match events directly from Volleymetrics. | |
| output_format | No | Response representation format: 'markdown' renders a chronological play-by-play table; 'compact' returns a token-efficient JSON object with total count and filtered breakdown. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses a 7-day/604800s local disk cache, in-memory post-fetch filtering, a 2 req/s token bucket with burst 4 and auto-retry, and the `force_refresh` bypass. It also documents error states (empty `match_id` validation error, โ ๏ธ Authentication Error on 401/403), which annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded and sectioned with headers, and the deliberate routing sentence comes first. It is long, and the return-format section repeats DataVolley code examples already used earlier, but nearly every line carries operational value for a 10-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing return values, and it does so for both `markdown` and `compact` modes with the exact JSON key set. Combined with caching, rate-limit, pagination and error behavior, nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema cannot express: all filters combine via logical AND before pagination, and the response header reports `total_matching` so the caller advances `offset` by `offset + limit`. It stops short of adding per-parameter detail beyond the schema, so a 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Query chronologically ordered, event-by-event volleyball touches and DataVolley scout tags') and scopes it to a match. It explicitly contrasts itself with `get_match_player_stats` and `download_match_dvw`, so an agent can disambiguate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has explicit 'When to Use' and 'When NOT to Use' sections with concrete filter examples (reception errors, Set 5 kills, hitter tendencies) and names three alternative tools with the exact condition that selects each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_match_player_statsGet Match Player Box ScoreARead-onlyIdempotent
Fetch aggregated athlete box scores and individual volleyball statistics (attacking, serving, passing, blocking, and digging totals) for a single match, unlike get_rotation_breakdown (team P1โP6 rotation efficiencies) or get_game_actions (chronological touch-by-touch events).
When to Use
Evaluate individual player performance in a match: Kills (
K), Attack Errors (E), Total Attacks (TA), Hitting Percentage ((K - E) / TA), Assists (Ast), Service Aces (SA), Service Errors (SE), Receptions (Rec), Reception Errors (RE), Passing Average (0.00โ3.00scale), Digs (Dig), Block Solos (BS), Block Assists (BA), Total Blocks (TB), and Total Points (Pts).Identify top scorers, pin/middle offensive efficiency, and primary serve-receive passers.
When NOT to Use
Do NOT use to analyze team sideout or point-scoring rates by setter rotation (P1โP6); call
get_rotation_breakdowninstead.Do NOT use to inspect individual rally touches, court zones, or set-by-set play sequences; call
get_game_actionsinstead.Do NOT call with an unknown
match_id; calllist_volleyball_matchesfirst.
Behavioral Guarantees & Caching
Execution Contract: Strictly read-only, idempotent query.
Derived Metric Integrity: Automatically computes zero-division-safe Hitting Percentage (
0.000whenTA == 0), Total Blocks (BS + 0.5 * BA), and Total Points (K + SA + BS + 0.5 * BA).Caching Policy: Historical match stats are cached on local disk for 7 days (
604800s).Rate Limiting: Client token bucket (
2 req/s, burst4) with exponential backoff.
Parameter & Workflow Semantics
Combine
match_id(fromlist_volleyball_matches) withteam_id(fromget_user_teams) when you want to isolate a single team's roster; leaveteam_id=Nonewhen comparing both teams head-to-head.
Returns & Error States
'markdown': Box score table with columns#,Player,Pos,SP,K,E,TA,Hit%,Ast,SA,SE,Rec,RE,Pass Avg,Dig,BS,BA,TB, andPts.'compact': JSON object{"match_id": str, "player_count": int, "players": [{"name": str, "no": str, "pos": str, "sp": int, "k": int, "e": int, "ta": int, "hit_pct": float, "ast": int, "sa": int, "se": int, "rec": int, "re": int, "pass_avg": float, "dig": int, "bs": int, "ba": int, "tb": float, "pts": float}]}.Returns validation error if
match_idis empty, orโ ๏ธ Authentication Erroron HTTP401/403.
| Name | Required | Description | Default |
|---|---|---|---|
| team_id | No | Optional Volleymetrics team ID (from get_user_teams) to restrict athlete box scores to one squad. When omitted, returns athlete statistics for all participating players in the match. | |
| match_id | Yes | Unique Volleymetrics match identifier obtained from list_volleyball_matches. | |
| force_refresh | No | When True, bypasses the 7-day local disk cache for historical match box scores and forces a live API fetch. | |
| output_format | No | Response representation format: 'markdown' renders a standard volleyball box score table; 'compact' returns a token-efficient JSON array of athlete stat objects. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), yet the description adds substantial context beyond them: a 7-day local disk cache with the exact TTL (604800s), a client token bucket of 2 req/s with burst 4 and exponential backoff, zero-division-safe derived-metric formulas, and concrete error states (validation error on empty match_id, Authentication Error on 401/403). The only redundancy is restating 'strictly read-only, idempotent', which annotations already declare.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and well-sectioned with headers that let an agent skim to the relevant part, but it is long and partially redundant: the full stat-abbreviation glossary in 'When to Use' overlaps heavily with the column list in 'Returns', and 'Strictly read-only, idempotent query' repeats the annotations. Trimming those duplications would make it noticeably tighter without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description fully specifies both return shapes โ the markdown column set and the exact compact JSON object shape including field names and types. Combined with caching, rate limits, derived-metric formulas, error states, and parameter workflow guidance, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the description earns a bump by adding workflow meaning the schema does not: combining `match_id` from `list_volleyball_matches` with `team_id` from `get_user_teams` to isolate one roster, and explicitly leaving `team_id=None` for head-to-head comparison. It does not add format or syntax detail for `force_refresh` or `output_format` beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource ('Fetch aggregated athlete box scores and individual volleyball statistics... for a single match') and immediately names the two sibling tools it is not (`get_rotation_breakdown` for team P1โP6 rotation efficiencies, `get_game_actions` for touch-by-touch events). An agent can distinguish this from every sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to Use' and 'When NOT to Use' sections give the positive case (evaluate individual player performance, identify top scorers, primary pass-receive passers), name the alternative tool for each excluded case, and add a prerequisite ordering constraint ('Do NOT call with an unknown match_id; call list_volleyball_matches first'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rotation_breakdownGet Match Rotation Breakdown (P1-P6)ARead-onlyIdempotent
Fetch team tactical sideout, point-scoring, and first-ball sideout (FBSO) efficiencies broken down across setter rotations P1 through P6 for a match, unlike get_match_player_stats (individual player box scores) or get_game_actions (event-level rally touches).
When to Use
Diagnose which setter rotation (
P1throughP6) is leaking sideout points or generating service scoring runs.Compare Sideout Percentage (
Sideout%), First-Ball Sideout Percentage (FBSO%), Point Scoring Percentage (Point Score%), and Setter Distribution tendencies (Left/OH,Middle,Right/Opp,Pipe/Backrow) by rotation.
When NOT to Use
Do NOT use for individual athlete kill/dig/pass totals; call
get_match_player_statsinstead.Do NOT use to inspect which specific player committed reception or attack errors inside a weak rotation; call
get_game_actionsafter identifying the rotation here.
Behavioral Guarantees & Caching
Execution Contract: Strictly read-only, idempotent query.
Domain Conventions:
P1โP6denote the setter's starting court zone (P1= Zone 1 right-back,P6= Zone 6 middle-back,P5= Zone 5 left-back,P4= Zone 4 front-left,P3= Zone 3 front-center,P2= Zone 2 front-right).Caching Policy: Cached on local disk for 7 days (
604800s).Rate Limiting: Client token bucket (
2 req/s, burst4) with automatic retry.
Parameter & Workflow Semantics
Typical coaching workflow: call
get_rotation_breakdownfirst to find any rotation withSideout% < 50%, then callget_game_actions(match_id=..., action_type='receive', quality='error')to pinpoint the exact breakdown cause.
Returns & Error States
'markdown': Table with columnsRotation,SO Opp,SO Pts,Sideout%,FBSO%,Srv Opp,Srv Pts,Point Score%, andSetter Distribution.'compact': JSON object{"match_id": str, "rotations": [{"rot": str, "so_opp": int, "so_pts": int, "so_pct": float, "fbso_pct": float, "ps_opp": int, "ps_pts": int, "ps_pct": float, "dist": dict}]}.Returns validation error if
match_idis empty, orโ ๏ธ Authentication Erroron HTTP401/403.
| Name | Required | Description | Default |
|---|---|---|---|
| team_id | No | Optional Volleymetrics team ID (from get_user_teams) to filter P1-P6 rotation analytics to a specific squad. When omitted, analyzes the default primary team in the match. | |
| match_id | Yes | Unique Volleymetrics match identifier obtained from list_volleyball_matches. | |
| force_refresh | No | When True, bypasses the 7-day local disk cache and recalculates rotation metrics from live Volleymetrics data. | |
| output_format | No | Response representation format: 'markdown' renders a P1-P6 tactical efficiency table; 'compact' returns a token-efficient JSON object. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly/idempotent/non-destructive), the description discloses caching behavior (7-day local disk, 604800s), rate limiting (2 req/s, burst 4, automatic retry), the domain convention mapping P1โP6 to court zones, and error states (validation error on empty `match_id`, authentication error on HTTP 401/403). These are operationally relevant traits an agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded in the first sentence and organized under clear headings, with no filler prose. It is on the long side, and the full P1โP6 court-zone enumeration plus repeated field-name lists add bulk that a shorter table reference could cover, but each section carries usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analytics query with no output schema, the description covers the dimensions needed to call it correctly: purpose, exclusions, return formats with concrete fields, caching/refresh semantics, and error states. Nothing an agent needs in order to invoke it successfully is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds value by spelling out concrete return shapes per `output_format` value (markdown table columns vs. the compact JSON object), which helps an agent choose the format. It also frames `team_id`/`match_id` around the rotation-analysis workflow, though the individual parameter definitions themselves live in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch team tactical sideout, point-scoring, and first-ball sideout (FBSO) efficiencies broken down across setter rotations P1 through P6 for a match') and explicitly names the two siblings it is not: `get_match_player_stats` for individual box scores and `get_game_actions` for event-level touches. An agent can distinguish it from every sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides dedicated 'When to Use' and 'When NOT to Use' sections with explicit routing: player kill/dig/pass totals go to `get_match_player_stats`, and identifying the specific player who erred in a weak rotation goes to `get_game_actions`. It also gives a concrete diagnostic threshold workflow (find `Sideout% < 50%`, then drill down with `get_game_actions(action_type='receive', quality='error')`).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_teamsGet User Volleymetrics TeamsARead-onlyIdempotent
Retrieve all Volleymetrics volleyball team profiles and organization memberships linked to the authenticated account, unlike list_volleyball_matches (which lists match schedules for a single team).
When to Use
Discover the user's accessible
team_idvalues, team names, school/club organizations, conferences, and coaching roles at the start of an analysis workflow.Verify which team is currently marked active before calling
list_volleyball_matches.
When NOT to Use
Do NOT use to search for external opponent teams or public league rosters not tied to the user's account; call
list_volleyball_matchesto inspect opponents on your match schedule.Do NOT call before every match query once
team_idis known, aslist_volleyball_matchesautomatically resolves the active team whenteam_idis omitted.
Behavioral Guarantees & Caching
Execution Contract: Strictly read-only, idempotent HTTPS
GETagainsthttps://api.volleymetrics.hudl.com.Caching Policy: Cached on local disk (
~/.volleymetrics_mcp/cache) with a 15-minute TTL (900s). Setforce_refresh=Trueonly after account membership changes.Rate Limiting: Governed by a client-side token bucket (
2 req/s, burst capacity4) with exponential backoff on HTTP429/5xx.Authentication: Reads Bearer JWT credentials from
~/.volleymetrics_mcp/auth_state.json, OS Keychain, or.env.
Parameter & Workflow Semantics
Pass the
team_idreturned by this tool intolist_volleyball_matches,get_match_player_stats, orget_rotation_breakdownwhen the user coaches multiple squads and wants to switch away from their default active team.Prefer
output_format='compact'when chaining team discovery into automated multi-step tool calls to save context tokens.
Returns & Error States
'markdown': Markdown table with columnsTeam ID,Team Name,School / Club,Conference,Role, andActive.'compact': JSON object{"active_team_id": str, "count": int, "teams": [{"team_id": str, "name": str, "school_name": str, "conference": str, "role": str, "is_current": bool}]}.On missing or expired credentials (HTTP
401/403), returns an actionableโ ๏ธ Authentication Errorinstructing the agent to invokelogin_to_volleymetrics.
| Name | Required | Description | Default |
|---|---|---|---|
| force_refresh | No | When True, bypasses the 15-minute local disk cache (~/.volleymetrics_mcp/cache) and forces a live HTTPS GET request to the Volleymetrics user profile endpoint. | |
| output_format | No | Response representation format: 'markdown' returns a formatted Markdown table for human display; 'compact' returns a token-minimized JSON object for downstream agent chaining. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial context beyond them: an idempotent HTTPS GET contract, a 15-minute disk cache with TTL and when to bypass it, a token bucket with 2 req/s and burst 4 plus backoff on 429/5xx, and credential sources (auth_state.json, Keychain, .env). It also discloses the 401/403 error behavior and the remediation step (invoke `login_to_volleymetrics`).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose and a sibling contrast, then cleanly sectioned by usage, behavior, parameters and returns. It is long, and the 'Returns' section partly duplicates the `output_format` enum descriptions already in the schema, but the bulk of the text carries non-redundant operational detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter, zero-required discovery tool with no output schema, the description covers everything an agent needs: what comes back in both formats (with the compact JSON shape), when to call it, when not to, and how auth failures surface. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 is the floor, and the description improves on it by giving decision rules rather than restating types: set `force_refresh=True` only after account membership changes, and prefer `output_format='compact'` when chaining team discovery into automated multi-step calls. That adds genuine selection guidance the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve all Volleymetrics volleyball team profiles and organization memberships linked to the authenticated account') and immediately contrasts it with `list_volleyball_matches`, which lists match schedules for a single team. An agent can pick between the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to Use' and 'When NOT to Use' sections name the alternatives (`list_volleyball_matches`) and the exact conditions selecting them, including the nuance that the sibling auto-resolves the active team when `team_id` is omitted. This is about as complete as routing guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_volleyball_matchesList Team Volleyball MatchesARead-onlyIdempotent
List recent volleyball match schedules, opponent names, set scores, and DataVolley (.dvw) availability for a team, serving as the primary match discovery step before calling get_match_player_stats, get_rotation_breakdown, get_game_actions, or download_match_dvw.
When to Use
Discover valid
match_ididentifiers (e.g.'771842') required by all match-level analytics and export tools.Review season win/loss records, set scores, match dates, opponent names, and whether video breakdown (
.dvw) tagging is complete.
When NOT to Use
Do NOT use to retrieve athlete box scores or hitting percentages; pass a discovered
match_idtoget_match_player_stats.Do NOT use to evaluate P1โP6 sideout or point-scoring percentages; pass
match_idtoget_rotation_breakdown.Do NOT use to inspect individual rally touches; pass
match_idtoget_game_actions.
Behavioral Guarantees & Caching
Execution Contract: Strictly read-only, idempotent HTTPS
GETquery.Auto-Resolution: When
team_idisNone, resolves the active team from~/.volleymetrics_mcp/auth_state.json,.env, or the user profile endpoint.Caching Policy: Cached on local disk for 15 minutes (
900s). Setforce_refresh=Truewhen checking if a newly uploaded match has finished processing.Rate Limiting: Client token bucket (
2 req/s, burst4) with automatic retry on HTTP429/5xx.
Parameter & Workflow Semantics
Only matches where
has_dvw(DVW Ready) isTruecontain full play-by-play event tags forget_game_actions,get_rotation_breakdown, anddownload_match_dvw.Increase
limit(up to50) when aggregating full-season trends across all matches.
Returns & Error States
'markdown': Markdown table with columnsMatch ID,Date,Opponent,Result,Set Scores,Season, andDVW Ready.'compact': JSON object{"team_id": str, "count": int, "matches": [{"match_id": str, "date": str, "opponent": str, "result": str, "sets": [str], "season": str, "has_dvw": bool}]}.Returns
โ ๏ธ Authentication Erroron HTTP401/403(recover vialogin_to_volleymetrics).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of recent matches to return, ordered most-recent first (1 to 50). | |
| team_id | No | Volleymetrics team identifier (obtainable via get_user_teams). When omitted or None, automatically resolves to the authenticated user's active team ID. | |
| force_refresh | No | When True, bypasses the 15-minute local disk cache and fetches live match schedules from Volleymetrics. | |
| output_format | No | Response representation format: 'markdown' returns a match schedule table; 'compact' returns a token-efficient JSON object for programmatic match_id extraction. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the 'strictly read-only, idempotent GET' line largely restates structured data. The description does add genuine context beyond annotations: the 15-minute disk cache and when to bypass it, team auto-resolution order, a 2 req/s token bucket with retry on 429/5xx, and the exact 401/403 recovery path via login_to_volleymetrics. The overlap with annotations keeps this from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but strongly front-loaded and uses section headers, so an agent can scan to the needed block. It is slightly padded by restating the read-only/idempotent contract that annotations already carry, which is wasted space rather than harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description fully enumerates both return representations including column names and the exact compact JSON keys. Combined with caching, rate limits, auth failure handling, and the downstream dependency on has_dvw, an agent has everything needed to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema already documents limit, team_id, force_refresh, and output_format. The description still adds cross-parameter meaning the schema lacks: that has_dvw must be True for downstream action-level tools to work, that limit can be raised to 50 for full-season aggregation, and the concrete shape of each output_format value. That is useful semantics layered on top of complete schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('List recent volleyball match schedules, opponent names, set scores, and DataVolley availability for a team') and explicitly positions itself as 'the primary match discovery step' before the analytics siblings. An agent can distinguish it from get_match_player_stats, get_rotation_breakdown, get_game_actions, and download_match_dvw without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Dedicated 'When to Use' and 'When NOT to Use' sections name each alternative sibling and the exact condition that routes to it (box scores, rotation sideout percentages, rally touches). It also states the dependency contract: all those tools require a match_id discovered here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
login_to_volleymetricsInteractive Browser Login to VolleymetricsA
Launch an interactive desktop Chromium browser window to authenticate with the Volleymetrics / Hudl portal (supporting password managers, SSO, and 2FA) and persist the OAuth Bearer session locally, unlike refresh_volleymetrics_session (which performs a headless OAuth token refresh using environment variables).
When to Use
Recover from
โ ๏ธ Authentication Error (401)returned by any Volleymetrics query tool.Perform initial setup without storing plaintext passwords in
.env(supports 1Password, Bitwarden, Apple Passwords / iCloud Keychain, Hudl SSO, and two-factor authentication).
When NOT to Use
Do NOT call proactively before every query; persisted sessions in
~/.volleymetrics_mcp/auth_state.jsonremain valid across conversations until token expiry.Do NOT call in headless CI/server environments without a local display; use
refresh_volleymetrics_sessionwith.envcredentials instead.
Behavioral Guarantees & Security
Side Effects: Launches a visible Playwright Chromium window to
https://portal.volleymetrics.hudl.com, writes captured Bearer tokens and active team metadata to~/.volleymetrics_mcp/auth_state.json(permissions0600) and OS Keychain, and clears the local disk query cache (clear_all_cache()).Zero Password Exposure: Credentials and 2FA codes are entered directly in the browser by the user and are never read or logged by the MCP server.
Auto-Close & Timeout: Automatically closes the browser the instant a valid JWT session is detected on the dashboard, or aborts after
timeout_seconds.
Parameter & Workflow Semantics
Keep the default
timeout_seconds=300(5 minutes) when the user needs time to approve mobile 2FA prompts; reduce to60โ120for quick password-manager autofill.
Returns & Error States
On success: Markdown summary reporting
Storage State Savedpath andMasked Session Token(eyJhbGci...).On failure/timeout: Actionable error describing whether Playwright Chromium is missing (
playwright install chromium) or the login window timed out.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_seconds | No | Maximum time in seconds (30 to 900) to keep the interactive Chromium browser window open waiting for the user to complete Volleymetrics / Hudl login before aborting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is non-readonly, open-world, non-idempotent and non-destructive; the description goes far beyond by naming the side effects (visible Playwright window, Bearer tokens written to ~/.volleymetrics_mcp/auth_state.json with 0600 permissions plus OS Keychain, and a full query-cache clear), the zero-password-exposure guarantee, and the auto-close/timeout behaviour. Success and failure return states including the missing-Chromium remedy are also disclosed, so no annotation contradiction arises.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Headings, bolding and the front-loaded contrast sentence make it scannable despite its length, and every section maps to something an agent needs. It is slightly over-written โ the Returns section restates failure modes already implied and the opening sentence is dense โ but nothing is truly wasteful for a tool with this many side effects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A one-parameter, no-output-schema tool whose annotations are sparse is fully covered here: triggers, exclusions, side effects on disk and keychain, credential handling, timeout behaviour, and both success and failure outputs are all stated. Nothing an agent needs to decide whether and how to call it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is self-explanatory, yet the description adds real decision guidance beyond the schema: keep the default 300s when the user must approve mobile 2FA, drop to 60-120s for quick password-manager autofill. That is workflow meaning the schema's min/max/default numbers cannot convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence pairs a specific verb (launch) with the resource (interactive desktop Chromium window for Volleymetrics/Hudl auth) and explicitly contrasts itself with the sibling `refresh_volleymetrics_session` as headless env-var-based. An agent can distinguish this from every sibling list tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Dedicated 'When to Use' and 'When NOT to Use' sections give concrete triggers (recover from a 401, initial setup without plaintext passwords) and explicit exclusions (don't call proactively; don't use in headless CI without a display, use refresh_volleymetrics_session instead). The alternative is named with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_volleymetrics_sessionRefresh Volleymetrics OAuth SessionA
Perform a headless OAuth 2.0 token refresh for the Volleymetrics session using .env credentials (VOLLEYMETRICS_EMAIL and VOLLEYMETRICS_PASSWORD), unlike login_to_volleymetrics (which opens an interactive desktop browser window for manual/SSO/2FA login).
When to Use
Refresh an expired Volleymetrics Bearer token in headless or automated environments where
VOLLEYMETRICS_EMAILandVOLLEYMETRICS_PASSWORDare configured in.env.Test whether stored
.envcredentials can mint a fresh token without user interaction.
When NOT to Use
Do NOT use when the user authenticates via password manager, Hudl SSO, or 2FA without storing plaintext credentials in
.env; calllogin_to_volleymetricsinstead.Do NOT call in a loop if this tool returns
Interactive Login Recommended, as that indicates.envcredentials are not configured.
Behavioral Guarantees & Security
Side Effects: Executes an OAuth password-grant token request (or headless Playwright fallback), persists the new JWT to OS Keychain and
.env(chmod 0600), and optionally clears the local response cache whenclear_cache=True.Fallback Guidance: If
.envcredentials are absent, performs zero network calls and immediately directs the agent to calllogin_to_volleymetrics.
Parameter & Workflow Semantics
Leave
clear_cache=Truewhen recovering from an authentication error or switching accounts; setclear_cache=Falseto retain cached 7-day historical match data across token renewals.
Returns & Error States
On success: Confirmation message with masked JWT (
eyJhbGci...).When
.envcredentials are missing or rejected: Actionable instructions to invokelogin_to_volleymetrics.
| Name | Required | Description | Default |
|---|---|---|---|
| clear_cache | No | When True (default), clears the local disk query cache (~/.volleymetrics_mcp/cache) after minting a new OAuth Bearer token so subsequent queries fetch fresh data. | |
| timeout_seconds | No | Maximum timeout in seconds (5 to 120) for the headless OAuth token refresh request against https://auth.volleymetrics.hudl.com. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, open-world, non-idempotent operation but say nothing about side effects; the description fills that gap by disclosing the password-grant request, headless Playwright fallback, persistence of the JWT to OS Keychain and `.env` with `chmod 0600`, and conditional cache clearing. It also states the zero-network-call behavior when credentials are absent, which is exactly the kind of pre-call safety context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded and organized under scannable headings, with the key differentiator in the first sentence. It is somewhat long for a two-parameter tool, and the 'credentials missing' condition is restated three times (When NOT to Use, Fallback Guidance, Returns & Error States), which is mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation-style auth tool with no output schema, the description covers what the agent needs: trigger conditions, side effects, parameter choice, success confirmation format (masked JWT), and the actionable error path. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds decision-level meaning for `clear_cache` (set True when recovering from an auth error or switching accounts, False to retain 7-day cached match data) that goes beyond the schema's mechanical 'clears the cache after minting' wording. The `timeout_seconds` parameter is never mentioned in the description, which keeps this from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (headless OAuth 2.0 token refresh for the Volleymetrics session) and immediately contrasts it with the sibling `login_to_volleymetrics`, which is described as the interactive desktop-browser alternative. An agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'When to Use' and 'When NOT to Use' sections, naming the exact conditions (headless/automated environments with `.env` credentials vs. password-manager/SSO/2FA users) and pointing to the concrete alternative tool. It also warns against looping on the 'Interactive Login Recommended' result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
download_match_dvw - First observed
get_game_actions - First observed
get_match_player_stats - First observed
get_rotation_breakdown - First observed
get_user_teams - First observed
list_volleyball_matches - First observed
login_to_volleymetrics - First observed
refresh_volleymetrics_session
TDQS
Scored across 8 tools
Each tool targets a clearly distinct resource or workflow: match discovery, team discovery, event-level actions, player aggregates, rotation aggregates, raw file export, and two distinct auth flows. The descriptions explicitly cross-reference neighboring tools and specify when not to use them, leaving little room for misselection.
All tool names use snake_case with a predictable verb-first pattern such as get_, list_, download_, login_, and refresh_. The domain qualifiers are used consistently and do not introduce mixed naming conventions.
Eight tools is well scoped for a volleyball analytics server covering discovery, match analytics, export, and authentication. Each tool has a clear role and there are no redundant or filler tools.
The surface covers the core match-analysis lifecycle: authentication, team and match discovery, player stats, rotation breakdowns, event-level actions, and raw DVW export. Minor gaps exist, such as no dedicated season-wide aggregate or player-profile lookup, but agents can work around these via match listing and per-match tools.
Maintenance
Related MCP Connectors
Live sports stats and pre-computed analysis for AI assistants across NBA, MLB, NFL, and NHL.
Access approved FITsociety clients, schedules, bookings and coaching data with AI assistants.
Your strength-training data for any AI assistant: workouts, progress, muscle volume, routines.
Your own cycling data for your AI assistant: rides, power, climbs and routes. Read-only.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables querying volleyball match, team, and tournament data from VolleyballWorld API through SQL queries on a SQLite database.1-
- AlicenseNot gradedqualityCmaintenanceProvides structured Valorant esports analytics data and metrics through MCP, including match analysis, player profiling, scouting reports, and ad-hoc SQL queries. Enables AI models to generate accurate coaching insights from pre-computed analytics tables.Apache 2.0
- AlicenseAqualityCmaintenanceEnables AI clients to perform opponent scouting, retrieve athlete box scores, diagnose P1โP6 rotation sideout issues, audit serve-receive, and export event-level touches to DataVolley (.dvw) or pandas.7MIT

Memory.fit MCPofficial
AlicenseNot gradedqualityCmaintenanceEnables AI assistants to read training, sleep, recovery, nutrition, body composition, race and goal data, and with permission write workouts, daily targets, meal plans, logged meals and notes. Also supports checking for updates since the last look.MIT