CLI and MCP server for kicktipp.com and kicktipp.de
kicktipp-agent has 6 read-only tools with generally clear naming (all verb-prefixed: get_*) and reasonable descriptions (avg ~150 chars). However, several critical gaps reduce confidence: (1) Most tools have completely EMPTY input schemas ({}), making them impossible to validate or extend. (2) Output schemas are uniformly generic (all use OUTPUT_SCHEMA = { data: z.unknown() }), providing no structure for LLMs to extract typed results. (3) Parameters that DO exist (matchday, bonus, reconnect) have good descriptions and constraints (1-34 range, optional flags), but the prevalence of empty inputs suggests incomplete tool design. (4) No error handling guidance, tools throw generic Error() messages rather than actionable recovery hints. (5) No tool annotations (readOnlyHint, etc.) despite all tools being read-only, missing an opportunity to signal safety to the client. The server is functional but falls short of production-grade definition quality.
Connect or reconnect a Kicktipp account. Call this when the user asks to set up kicktipp-agent, log in, or reconnect. Returns a localhost URL they must open in a browser. Never ask them to paste a password into chat.
Get all matches and your current bets for a matchday. Shows team names (use these exact names for place_bets), your placed bets, and odds.
Get player rankings for a matchday. Includes matches/results and ranking table with points.
Get the match schedule with results for a matchday.
Check current configuration. Call this first for a status snapshot. If the user wants to connect or set up Kicktipp, call connect_account instead. If setup_url is set, ask the user to open that localhost page. Most tools require a community.
Get today's matches with bet status. Shows which games are happening today and whether bets have been placed.
Three tools (get_status, get_today_matches) have completely empty input schemas ({}). This violates schema documentation requirements and prevents parameter validation, extension, or LLM understanding of valid inputs. Even if a tool takes no required parameters, the schema should declare this explicitly.
All six tools use a generic OUTPUT_SCHEMA = { data: z.unknown() }. This provides zero structure to the LLM, the agent cannot know what fields (matches, bets, leaderboard, etc.) each tool returns. Output schemas must document the actual response structure (e.g., { data: { matches: [...], total: number } }) so downstream tools and the LLM can extract and chain results.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are declared, despite all tools being read-only. Annotating with readOnlyHint=true signals safety and helps clients optimize caching and retry behavior.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 65 | 2025-06-18+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Error handling uses generic Error() messages (e.g., 'Kicktipp session expired. Ask the user to open ${url} to reconnect.'). While the message is helpful, there is no structured error categorization or recovery guidance. Errors should distinguish retryable vs user-fixable vs fatal, and include actionable next steps (e.g., 'USER_ACTION_REQUIRED: Open URL to reconnect').
The matchday parameter (used in get_bets, get_schedule, get_leaderboard) is optional but omits 'current matchday' behavior documentation. Descriptions say 'Omit for current matchday' but do not explain what 'current' means if the season is off or if the user is not in a community. Add explicit fallback logic or error messages.