Skip to main content
Glama
YuchengMaUTK

Unofficial WCA MCP Server

by YuchengMaUTK

search_championships

Find World Cube Association championship competitions by type, including World, Continental, and National Championships. Filter results using continent codes or country ISO2 codes to locate specific speedcubing events.

Instructions

Search for WCA championships with optional filtering.

Returns championship competitions which are the most prestigious competitions in speedcubing including World Championships, Continental Championships, and National Championships.

Args: page: Page number for pagination (default: 1) championship_type: Filter by championship type: - "world" for World Championships - continent codes like "Europe", "Asia", "North America" for Continental Championships
- country ISO2 codes like "US", "CN", "DE" for National Championships - None for all championships (default)

Returns: Paginated championship data with competition details

Example: search_championships(championship_type="world") - World Championships only search_championships(championship_type="US") - US National Championships

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNo
championship_typeNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • The @mcp.tool() decorated handler function that defines and implements the 'search_championships' tool. It handles input parameters, calls the WCAAPIClient for data retrieval with appropriate filters, and manages errors.
    @mcp.tool()
    async def search_championships(
        page: int = 1,
        championship_type: str = None
    ) -> Dict[str, Any]:
        """Search for WCA championships with optional filtering.
        
        Returns championship competitions which are the most prestigious competitions
        in speedcubing including World Championships, Continental Championships, and
        National Championships.
        
        Args:
            page: Page number for pagination (default: 1)
            championship_type: Filter by championship type:
                              - "world" for World Championships
                              - continent codes like "Europe", "Asia", "North America" for Continental Championships  
                              - country ISO2 codes like "US", "CN", "DE" for National Championships
                              - None for all championships (default)
            
        Returns:
            Paginated championship data with competition details
            
        Example:
            search_championships(championship_type="world") - World Championships only
            search_championships(championship_type="US") - US National Championships
        """
        try:
            async with WCAAPIClient() as client:
                # Build filters based on championship_type
                filters = {}
                if championship_type:
                    # The API expects the type parameter for filtering
                    filters["type"] = championship_type.lower()
                
                championships_data = await client.get_championships(
                    page=page,
                    **filters
                )
                return championships_data
        except APIError as e:
            raise Exception(f"Failed to search championships: {e}")
        except Exception as e:
            raise Exception(f"Unexpected error searching championships: {e}")
  • The WCAAPIClient.get_championships method that fetches championships data from the WCA static API, applies client-side filtering by championship type (world, continent, country), and implements pagination.
    async def get_championships(
        self,
        page: int = 1,
        per_page: int = 25,
        **filters
    ) -> Dict[str, Any]:
        """Get championships with optional filtering.
        
        Args:
            page: Page number (1-based) - Note: static API doesn't support pagination
            per_page: Items per page (max 100) - Note: static API doesn't support pagination
            **filters: Additional filter parameters - Note: static API has limited filtering
            
        Returns:
            Paginated championship data
        """
        # For the static API, we get all championships and handle filtering/pagination client-side
        data = await self._make_request("championships.json")
        
        # Handle filtering by type if specified
        items = data.get("items", []) if isinstance(data, dict) else []
        
        if "type" in filters:
            filter_type = filters["type"].lower()
            if filter_type == "world":
                items = [item for item in items if item.get("region") == "world"]
            else:
                # Filter by region (continent or country)
                items = [item for item in items if item.get("region", "").lower() == filter_type]
        
        # Simple client-side pagination
        start_idx = (page - 1) * per_page
        end_idx = start_idx + per_page
        paginated_items = items[start_idx:end_idx]
        
        return {
            "items": paginated_items,
            "total": len(items),
            "page": page,
            "per_page": per_page,
            "pagination": {
                "page": page,
                "size": per_page,
                "total_pages": (len(items) + per_page - 1) // per_page
            }
        }
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. It discloses that the tool returns paginated results and provides filtering capabilities, which is helpful. However, it doesn't mention important behavioral aspects like rate limits, authentication requirements, error conditions, or what happens when no championships match the filter. For a search tool with no annotation coverage, this leaves significant behavioral gaps.

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 with clear sections: purpose statement, return explanation, args documentation, returns statement, and examples. Every sentence adds value. It could be slightly more concise by combining some sentences, but overall it's efficiently organized with zero wasted text.

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 has an output schema (so return values don't need explanation in description), 2 parameters with 0% schema coverage, and no annotations, the description does a good job covering the essentials. It explains the tool's purpose, parameters, and provides examples. The main gap is lack of behavioral context like error handling or performance characteristics, which would be helpful for a search tool.

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?

The schema has 0% description coverage, so the description must fully compensate. It provides excellent parameter semantics: it explains that 'page' is for pagination with default value 1, and 'championship_type' accepts specific string values ('world', continent codes, country ISO2 codes) or null for all championships. The description adds substantial meaning beyond the bare schema, including examples of valid values and their interpretations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches for WCA championships with optional filtering and specifies the types of championships included (World, Continental, National). It distinguishes from siblings like 'search_competitions_by_date' by focusing specifically on championship competitions rather than all competitions. However, it doesn't explicitly contrast with 'get_championship_details' which retrieves details for a specific championship.

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 when to use this tool - when searching for championship competitions with optional filtering. The example usage demonstrates specific scenarios. However, it doesn't explicitly state when NOT to use it or when to prefer sibling tools like 'search_competitions_by_date' for non-championship competitions or 'get_championship_details' for detailed information about a specific championship.

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