Skip to main content
Glama
onnobos

Volleymetrics MCP Server

by onnobos

๐Ÿ Volleymetrics MCP Server (volleymetrics-mcp)

Python 3.11+ Model Context Protocol Build System Hatchling License: MIT Strict Read-Only DataVolley Compatible

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.


IMPORTANT

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 .mcpb Installation: Distribute a single double-clickable .mcpb bundle that non-technical coaches can install into Claude Desktop without touching a terminal.

  • โšก Zero-Setup uvx: Run instantly via uvx --from git+https://github.com/onnobos/volleymetrics_mcp.git volleymetrics-mcp without 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 .dvw skill codes (S, R, E, A, B, D, F) and evaluation codes (#, +, !, -, =).

  • ๐Ÿ“ Direct DataVolley DVW Downloads: Generate and save official .dvw scouting 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.json

  • Windows: %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"

  1. A visible browser window opens to https://portal.volleymetrics.hudl.com.

  2. Log in using your password manager (1Password, Bitwarden, iCloud Keychain), Hudl SSO, or 2FA.

  3. Once you reach the portal dashboard, session tokens are securely saved to ~/.volleymetrics_mcp/auth_state.json and the OS Keychain.

  4. The browser window closes automatically and you are authenticated!


๐Ÿ› ๏ธ Available MCP Tools

Tool

Description

get_user_teams

Discover and list all Volleymetrics teams and active accounts to find your Team ID.

list_volleyball_matches

Fetch recent matches and upcoming schedule fixtures for a team.

get_match_player_stats

Retrieve athlete box scores with accurate hitting %, total blocks, points, and pass ratings.

get_rotation_breakdown

Analyze tactical sideout % (SO%), point scoring % (PS%), FBSO%, and setter distribution across P1โ€“P6.

get_game_actions

Query chronological volleyball touches with DataVolley (.dvw) skill and evaluation codes.

download_match_dvw

Generate and download the authentic .dvw DataVolley scouting file for an analyzed match.

login_to_volleymetrics

Launch interactive browser login window without password storage.

refresh_volleymetrics_cookie

Refresh session token or view authentication status.


๐ŸŽฏ FastMCP Prompts (@mcp.prompt)

  1. scout_opponent: 5-step tactical opponent scouting workflow analyzing offense, weak sideout rotations, and vulnerable passers.

  2. analyze_rotation_weaknesses: Rotation diagnostic analyzing sideout efficiency under 50% and setter distribution predictability.

  3. match_mvp_breakdown: Quantitative MVP evaluation using True Points, Hitting Efficiency, and Defensive Impact.

  4. datavolley_export: Translates match touch data into standardized OpenVolley .dvw scouting syntax.

  5. 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 tools
download_match_dvwDownload Match DataVolley (.dvw) FileA
Idempotent

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 .dvw file ([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, or get_game_actions instead to avoid unnecessary filesystem writes.

  • Do NOT call if has_dvw is False in list_volleyball_matches.

Behavioral Guarantees & Filesystem Policy

  • Side Effects: Remote Volleymetrics interaction is strictly read-only (GET), but this tool writes a local file named match_<match_id>.dvw inside output_dir (hence readOnlyHint=False, destructiveHint=False, idempotentHint=True).

  • Path Sanitization: Strips unsafe characters from match_id and resolves output_dir via Path.expanduser().resolve() to prevent path traversal.

  • Fallback Generation: If the native .dvw endpoint returns plain JSON events, automatically synthesizes a standards-compliant .dvw file containing match metadata and [3SCOUT] codes.

  • Rate Limiting: Client token bucket (2 req/s, burst 4) with automatic retry.

Parameter & Workflow Semantics

  • Acquire match_id from list_volleyball_matches first; pass an explicit output_dir when organizing exports for a specific opponent or tournament folder.

Returns & Error States

  • Returns a Markdown confirmation containing Match ID, resolved absolute Local File path, and File Size in bytes.

  • Returns validation error if match_id is empty, or โš ๏ธ Authentication Error on HTTP 401/403.

NameRequiredDescriptionDefault
match_idYesUnique Volleymetrics match identifier obtained from list_volleyball_matches.
output_dirNoOptional 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

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ActionsA
Read-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_stats in a single request instead.

  • Do NOT use for P1โ€“P6 sideout summary tables; call get_rotation_breakdown instead.

  • Do NOT use when the user wants a .dvw file saved to disk for external software; call download_match_dvw instead.

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, burst 4) with automatic retry.

Parameter & Workflow Semantics

  • All provided filter parameters (set_number, action_type, player, team, quality) combine via logical AND before offset and limit pagination are applied.

  • The response header always reports total_matching alongside returned_count so you know whether to advance offset (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, and Tactical 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_id is empty, or โš ๏ธ Authentication Error on HTTP 401/403.

NameRequiredDescriptionDefault
teamNoOptional team filter: 'a' (home/primary team), 'b' (away/opponent team), or team name substring.
limitNoMaximum number of chronological touch events to return per page (1 to 200).
offsetNoZero-based pagination offset for stepping through chronological match touches.
playerNoOptional athlete filter matching jersey number (e.g. '17' or '#7') or case-insensitive player name substring.
qualityNoOptional 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_idYesUnique Volleymetrics match identifier obtained from list_volleyball_matches.
set_numberNoOptional set number (1 to 5) to restrict play-by-play touches to a single set. When None, searches across all sets.
action_typeNoOptional 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_refreshNoWhen True, bypasses the 7-day local disk cache and fetches raw match events directly from Volleymetrics.
output_formatNoResponse 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

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ScoreA
Read-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.00 scale), 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_breakdown instead.

  • Do NOT use to inspect individual rally touches, court zones, or set-by-set play sequences; call get_game_actions instead.

  • Do NOT call with an unknown match_id; call list_volleyball_matches first.

Behavioral Guarantees & Caching

  • Execution Contract: Strictly read-only, idempotent query.

  • Derived Metric Integrity: Automatically computes zero-division-safe Hitting Percentage (0.000 when TA == 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, burst 4) with exponential backoff.

Parameter & Workflow Semantics

  • Combine match_id (from list_volleyball_matches) with team_id (from get_user_teams) when you want to isolate a single team's roster; leave team_id=None when 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, and Pts.

  • '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_id is empty, or โš ๏ธ Authentication Error on HTTP 401/403.

NameRequiredDescriptionDefault
team_idNoOptional 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_idYesUnique Volleymetrics match identifier obtained from list_volleyball_matches.
force_refreshNoWhen True, bypasses the 7-day local disk cache for historical match box scores and forces a live API fetch.
output_formatNoResponse representation format: 'markdown' renders a standard volleyball box score table; 'compact' returns a token-efficient JSON array of athlete stat objects.markdown

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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)A
Read-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 (P1 through P6) 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_stats instead.

  • Do NOT use to inspect which specific player committed reception or attack errors inside a weak rotation; call get_game_actions after identifying the rotation here.

Behavioral Guarantees & Caching

  • Execution Contract: Strictly read-only, idempotent query.

  • Domain Conventions: P1โ€“P6 denote 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, burst 4) with automatic retry.

Parameter & Workflow Semantics

  • Typical coaching workflow: call get_rotation_breakdown first to find any rotation with Sideout% < 50%, then call get_game_actions(match_id=..., action_type='receive', quality='error') to pinpoint the exact breakdown cause.

Returns & Error States

  • 'markdown': Table with columns Rotation, SO Opp, SO Pts, Sideout%, FBSO%, Srv Opp, Srv Pts, Point Score%, and Setter 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_id is empty, or โš ๏ธ Authentication Error on HTTP 401/403.

NameRequiredDescriptionDefault
team_idNoOptional 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_idYesUnique Volleymetrics match identifier obtained from list_volleyball_matches.
force_refreshNoWhen True, bypasses the 7-day local disk cache and recalculates rotation metrics from live Volleymetrics data.
output_formatNoResponse representation format: 'markdown' renders a P1-P6 tactical efficiency table; 'compact' returns a token-efficient JSON object.markdown

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 TeamsA
Read-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_id values, 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_matches to inspect opponents on your match schedule.

  • Do NOT call before every match query once team_id is known, as list_volleyball_matches automatically resolves the active team when team_id is omitted.

Behavioral Guarantees & Caching

  • Execution Contract: Strictly read-only, idempotent HTTPS GET against https://api.volleymetrics.hudl.com.

  • Caching Policy: Cached on local disk (~/.volleymetrics_mcp/cache) with a 15-minute TTL (900s). Set force_refresh=True only after account membership changes.

  • Rate Limiting: Governed by a client-side token bucket (2 req/s, burst capacity 4) with exponential backoff on HTTP 429/5xx.

  • Authentication: Reads Bearer JWT credentials from ~/.volleymetrics_mcp/auth_state.json, OS Keychain, or .env.

Parameter & Workflow Semantics

  • Pass the team_id returned by this tool into list_volleyball_matches, get_match_player_stats, or get_rotation_breakdown when 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 columns Team ID, Team Name, School / Club, Conference, Role, and Active.

  • '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 Error instructing the agent to invoke login_to_volleymetrics.

NameRequiredDescriptionDefault
force_refreshNoWhen 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_formatNoResponse representation format: 'markdown' returns a formatted Markdown table for human display; 'compact' returns a token-minimized JSON object for downstream agent chaining.markdown

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 MatchesA
Read-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_id identifiers (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_id to get_match_player_stats.

  • Do NOT use to evaluate P1โ€“P6 sideout or point-scoring percentages; pass match_id to get_rotation_breakdown.

  • Do NOT use to inspect individual rally touches; pass match_id to get_game_actions.

Behavioral Guarantees & Caching

  • Execution Contract: Strictly read-only, idempotent HTTPS GET query.

  • Auto-Resolution: When team_id is None, 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). Set force_refresh=True when checking if a newly uploaded match has finished processing.

  • Rate Limiting: Client token bucket (2 req/s, burst 4) with automatic retry on HTTP 429/5xx.

Parameter & Workflow Semantics

  • Only matches where has_dvw (DVW Ready) is True contain full play-by-play event tags for get_game_actions, get_rotation_breakdown, and download_match_dvw.

  • Increase limit (up to 50) when aggregating full-season trends across all matches.

Returns & Error States

  • 'markdown': Markdown table with columns Match ID, Date, Opponent, Result, Set Scores, Season, and DVW 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 Error on HTTP 401/403 (recover via login_to_volleymetrics).

NameRequiredDescriptionDefault
limitNoMaximum number of recent matches to return, ordered most-recent first (1 to 50).
team_idNoVolleymetrics team identifier (obtainable via get_user_teams). When omitted or None, automatically resolves to the authenticated user's active team ID.
force_refreshNoWhen True, bypasses the 15-minute local disk cache and fetches live match schedules from Volleymetrics.
output_formatNoResponse representation format: 'markdown' returns a match schedule table; 'compact' returns a token-efficient JSON object for programmatic match_id extraction.markdown

TDQS

A4.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.json remain valid across conversations until token expiry.

  • Do NOT call in headless CI/server environments without a local display; use refresh_volleymetrics_session with .env credentials 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 (permissions 0600) 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 to 60โ€“120 for quick password-manager autofill.

Returns & Error States

  • On success: Markdown summary reporting Storage State Saved path and Masked Session Token (eyJhbGci...).

  • On failure/timeout: Actionable error describing whether Playwright Chromium is missing (playwright install chromium) or the login window timed out.

NameRequiredDescriptionDefault
timeout_secondsNoMaximum 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

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_EMAIL and VOLLEYMETRICS_PASSWORD are configured in .env.

  • Test whether stored .env credentials 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; call login_to_volleymetrics instead.

  • Do NOT call in a loop if this tool returns Interactive Login Recommended, as that indicates .env credentials 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 when clear_cache=True.

  • Fallback Guidance: If .env credentials are absent, performs zero network calls and immediately directs the agent to call login_to_volleymetrics.

Parameter & Workflow Semantics

  • Leave clear_cache=True when recovering from an authentication error or switching accounts; set clear_cache=False to retain cached 7-day historical match data across token renewals.

Returns & Error States

  • On success: Confirmation message with masked JWT (eyJhbGci...).

  • When .env credentials are missing or rejected: Actionable instructions to invoke login_to_volleymetrics.

NameRequiredDescriptionDefault
clear_cacheNoWhen 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_secondsNoMaximum timeout in seconds (5 to 120) for the headless OAuth token refresh request against https://auth.volleymetrics.hudl.com.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 8 tool updatesv0.1.0
    • First observeddownload_match_dvw
    • First observedget_game_actions
    • First observedget_match_player_stats
    • First observedget_rotation_breakdown
    • First observedget_user_teams
    • First observedlist_volleyball_matches
    • First observedlogin_to_volleymetrics
    • First observedrefresh_volleymetrics_session

TDQS

A4.7/5.0

Scored across 8 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    Enables querying volleyball match, team, and tournament data from VolleyballWorld API through SQL queries on a SQLite database.
    1
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides 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
  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    7
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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