Skip to main content
Glama
YuchengMaUTK

Unofficial WCA MCP Server

by YuchengMaUTK

get_competition_event_results

Retrieve competition results for specific speedcubing events from the World Cube Association database. Filter by round, limit results, and optionally include detailed solve times for performance analysis.

Instructions

Get results for a specific event within a WCA competition.

Returns focused results data for a single event in a competition. By default, returns only Final round results for better LLM processing.

Args: competition_id: WCA competition ID (e.g., "WC2025", "CubingUSANationals2024") event_id: WCA event ID (e.g., "333" for 3x3x3 Cube, "222" for 2x2x2, "333bf" for 3x3x3 Blindfolded, "444" for 4x4x4) round: Specific round to filter by (default: "Final"). Use "all" for all rounds, or specify: "Final", "Semi Final", "Second round", "First round" limit: Maximum number of results to return (optional) include_solves: Whether to include detailed solve times (default: False)

Returns: Filtered results data including: - Competitor performances for the specified round - Position, best single, and average times - Optionally detailed solve breakdowns

Example: get_competition_event_results("WC2025", "333") - Final round only (16 results) get_competition_event_results("WC2025", "333", round="all") - All rounds (2490 results) get_competition_event_results("WC2025", "333", limit=10) - Top 10 from Final

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
competition_idYes
event_idYes
roundNoFinal
limitNo
include_solvesNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • MCP tool handler for get_competition_event_results. Fetches raw results using WCAAPIClient, filters by round and limit, optionally includes solves, cleans data, and returns paginated response.
    @mcp.tool()
    async def get_competition_event_results(
        competition_id: str,
        event_id: str,
        round: str = "Final",
        limit: int = None,
        include_solves: bool = False
    ) -> Dict[str, Any]:
        """Get results for a specific event within a WCA competition.
        
        Returns focused results data for a single event in a competition.
        By default, returns only Final round results for better LLM processing.
        
        Args:
            competition_id: WCA competition ID (e.g., "WC2025", "CubingUSANationals2024")
            event_id: WCA event ID (e.g., "333" for 3x3x3 Cube, "222" for 2x2x2, 
                     "333bf" for 3x3x3 Blindfolded, "444" for 4x4x4)
            round: Specific round to filter by (default: "Final"). 
                   Use "all" for all rounds, or specify: "Final", "Semi Final", 
                   "Second round", "First round"
            limit: Maximum number of results to return (optional)
            include_solves: Whether to include detailed solve times (default: False)
            
        Returns:
            Filtered results data including:
            - Competitor performances for the specified round
            - Position, best single, and average times
            - Optionally detailed solve breakdowns
            
        Example:
            get_competition_event_results("WC2025", "333") - Final round only (16 results)
            get_competition_event_results("WC2025", "333", round="all") - All rounds (2490 results)
            get_competition_event_results("WC2025", "333", limit=10) - Top 10 from Final
        """
        try:
            async with WCAAPIClient() as client:
                # Get all results first
                all_results = await client.get_competition_event_results(competition_id, event_id)
                
                if not all_results or 'items' not in all_results:
                    return all_results
                
                items = all_results['items']
                
                # Filter by round if specified
                if round != "all":
                    items = [item for item in items if item.get('round') == round]
                
                # Apply limit if specified
                if limit:
                    items = items[:limit]
                
                # Clean up data for LLM consumption
                cleaned_items = []
                for item in items:
                    cleaned_item = {
                        'personId': item.get('personId'),
                        'round': item.get('round'),
                        'position': item.get('position'),
                        'best': item.get('best'),
                        'average': item.get('average')
                    }
                    
                    # Include solves only if requested
                    if include_solves:
                        cleaned_item['solves'] = item.get('solves', [])
                    
                    cleaned_items.append(cleaned_item)
                
                # Return filtered and cleaned results
                return {
                    'pagination': {
                        'page': 1,
                        'size': len(cleaned_items)
                    },
                    'total': len(cleaned_items),
                    'filter': {
                        'round': round,
                        'limit': limit,
                        'include_solves': include_solves
                    },
                    'items': cleaned_items
                }
                
        except APIError as e:
            raise Exception(f"Failed to get {event_id} results for competition {competition_id}: {e}")
        except Exception as e:
            raise Exception(f"Unexpected error getting {event_id} results for competition {competition_id}: {e}")
  • WCAAPIClient helper method that performs the HTTP GET request to the WCA static API endpoint for specific competition event results.
    async def get_competition_event_results(
        self,
        competition_id: str,
        event_id: str
    ) -> Dict[str, Any]:
        """Get results for a specific event in a competition.
        
        Args:
            competition_id: Competition ID
            event_id: Event ID (e.g., "333", "222")
            
        Returns:
            Result data for the specific event in the competition
        """
        return await self._make_request(f"results/{competition_id}/{event_id}.json")
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes the tool's behavior: it returns 'focused results data' with a default round filter and optional limits/solve details. However, it lacks information on error handling, rate limits, authentication needs, or data freshness, which are important for a tool fetching competition data.

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 well-structured and appropriately sized. It starts with a clear purpose statement, followed by behavioral notes, parameter explanations, return details, and examples. Each sentence adds value, but the parameter explanations could be slightly more concise (e.g., combining event_id examples).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (5 parameters, no annotations, but has an output schema), the description is mostly complete. It covers purpose, usage, parameters, returns, and examples. The output schema likely handles return structure details, so the description appropriately focuses on semantics. However, it could improve by mentioning sibling tool distinctions or error cases.

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?

The schema description coverage is 0%, so the description must compensate. It adds significant value by explaining all 5 parameters: competition_id (with examples like 'WC2025'), event_id (with event code examples), round (default and options), limit (optional max results), and include_solves (default and purpose). This goes well beyond the bare schema, though it could provide more detail on parameter constraints (e.g., format validation).

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 clearly states the tool's purpose: 'Get results for a specific event within a WCA competition.' It specifies the verb ('Get'), resource ('results'), and scope ('specific event within a competition'), distinguishing it from sibling tools like get_competition_results (which likely returns broader results) and search_competitions_by_event (which searches competitions rather than fetching results).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for usage: 'By default, returns only Final round results for better LLM processing' and explains when to use the 'round' parameter ('Use "all" for all rounds'). However, it does not explicitly state when to use this tool versus alternatives like get_competition_results or search_competitions_by_event, which limits the score to 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/YuchengMaUTK/unofficial-wca-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server