MCP server for CTFtime.org - Access CTF events, teams, and rankings
Server provides 4 well-named, read-only tools with adequate descriptions and basic input schemas. Naming follows verb_noun convention (get_*). All tool descriptions are present and reasonably detailed (avg ~100 chars). Input schemas declare parameter types and include reasonable descriptions. However, output schemas are NOT documented, there is no specification of what fields the tools return or their types. Error handling is present but generic (returns error strings rather than structured errors with recovery guidance). No parameter validation constraints (enums, min/max bounds). Formatters produce human-readable markdown but the LLM-facing output schema is undefined. All tools are READ_ONLY and well-isolated, supporting good composition.
Retrieve detailed information about a specific CTF event.
Retrieve past CTF events from CTFtime.org.
Retrieve top-ranked CTF teams from CTFtime.org.
Retrieve upcoming CTF events from CTFtime.org.
Output schemas are not documented. Tools return formatted text (via formatters) but LLMs have no schema definition of returned fields, types, or structure. This prevents downstream tool composition and forces LLMs to parse unstructured markdown.
Input parameters lack validation constraints. 'limit' and 'days_ahead'/'days_back' are unbounded integers in the schema, no min/max declared. The code applies min(max(1, limit), 100) and defaults, but LLMs see no constraints and may pass absurd values. Should declare 'minimum: 1, maximum: 100' in schema.
Error handling returns raw error strings ('HTTP Error: 404 - ...', 'Request Error: ...') rather than structured errors with recovery guidance. Per pattern:recovery-guide, errors should suggest next steps. E.g., 'Event not found. Try get_upcoming_ctfs() to see available events.' instead of bare HTTP status.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 15 | - | v1 |
The 'event_id' parameter in get_event_details is an integer with minimal guidance. Description says 'The CTFtime event identifier' but does not indicate: Is there a lookup tool to find event IDs? Can I use event names? Should I call get_upcoming_ctfs first? Missing dependency hints force extra reasoning or failed calls.
Response formatters strip some event metadata (e.g., 'logo' field visible in code but returned text only includes it if present). No schema definition of what get_event_details actually returns, the formatter preview in the code shows partial fields but the full JSON response structure is opaque to LLMs.