Skip to main content
Glama
tomek7667

mcp-ctftime

by tomek7667

mcp-ctftime

npm version License: MIT

An MCP (Model Context Protocol) server that wraps the public CTFtime API, enabling AI assistants to query CTF events, teams, rankings, and results.

Quickstart

Option 1: npx (no install)

npx mcp-ctftime

Option 2: Global install

npm install -g mcp-ctftime
mcp-ctftime

Option 3: From source

git clone https://github.com/tomek7667/mcp-ctftime.git
cd mcp-ctftime
pnpm install
pnpm build
pnpm start

Related MCP server: CTFd MCP Server

Tools

Tool

Description

ctftime_events(limit?, start?, finish?)

List events in a UNIX timestamp window

ctftime_event(event_id)

Get event details by ID

ctftime_top_teams(year?, limit?)

Get top teams (current or specific year)

ctftime_top_by_country(country_code)

Get top teams by country (current year)

ctftime_team(team_id)

Get team details by ID

ctftime_results(year?)

Get event results for a year

ctftime_votes(year)

Get event votes for a year


Client Setup

Claude Desktop

Claude Desktop supports MCP servers via a JSON configuration file.

Config file location:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Using npx (recommended):

{
	"mcpServers": {
		"ctftime": {
			"command": "npx",
			"args": ["-y", "mcp-ctftime"]
		}
	}
}

Using global install:

{
	"mcpServers": {
		"ctftime": {
			"command": "mcp-ctftime"
		}
	}
}

Restart Claude Desktop after editing the config.


OpenAI Codex CLI

Codex CLI stores MCP configuration in ~/.codex/config.toml.

Using the CLI:

codex mcp add ctftime -- npx -y mcp-ctftime

Or edit ~/.codex/config.toml directly:

[mcp_servers.ctftime]
command = "npx"
args = ["-y", "mcp-ctftime"]

Using global install:

[mcp_servers.ctftime]
command = "mcp-ctftime"

Use /mcp in the Codex TUI to verify the server is connected.


Amp

Amp supports MCP servers via the amp.mcpServers setting in VS Code settings.json or via CLI.

Config file location (VS Code):

  • macOS: ~/Library/Application Support/Code/User/settings.json

  • Windows: %APPDATA%\Code\User\settings.json

  • Linux: ~/.config/Code/User/settings.json

Using npx (recommended):

{
	"amp.mcpServers": {
		"ctftime": {
			"command": "npx",
			"args": ["-y", "mcp-ctftime"]
		}
	}
}

Using global install:

{
	"amp.mcpServers": {
		"ctftime": {
			"command": "mcp-ctftime"
		}
	}
}

Via CLI:

amp mcp add ctftime npx -y mcp-ctftime

Gemini CLI

Gemini CLI stores MCP configuration in ~/.gemini/settings.json.

Using npx (recommended):

{
	"mcpServers": {
		"ctftime": {
			"command": "npx",
			"args": ["-y", "mcp-ctftime"]
		}
	}
}

Using global install:

{
	"mcpServers": {
		"ctftime": {
			"command": "mcp-ctftime"
		}
	}
}

Via CLI:

gemini mcp add ctftime npx -- -y mcp-ctftime

Use /mcp in Gemini CLI to verify server status.


Docker

docker build -t mcp-ctftime .
docker run -i mcp-ctftime

For clients that support Docker-based MCP servers:

{
	"mcpServers": {
		"ctftime": {
			"command": "docker",
			"args": ["run", "-i", "--rm", "mcp-ctftime"]
		}
	}
}

Compatibility

Feature

Supported

Transport

stdio

Node.js

>=18.0.0

Platforms

macOS, Linux, Windows

Tested Clients

Client

Status

Claude Desktop

✅ Verified

OpenAI Codex CLI

✅ Verified

Amp

✅ Verified

Gemini CLI

✅ Verified


Environment Variables

Currently, this server does not require any environment variables. The CTFtime API is public and does not require authentication.


Development

# Clone and install
git clone https://github.com/tomek7667/mcp-ctftime.git
cd mcp-ctftime
pnpm install

# Build
pnpm build

# Run
pnpm start

# Watch mode (auto-rebuild)
pnpm watch

API Reference

This server wraps the public CTFtime API: https://ctftime.org/api/

All timestamps use UNIX epoch seconds. Country codes use ISO 3166-1 alpha-2 format (lowercase, e.g., us, de, pl).

Available Tools

7 tools
ctftime_eventA

Get full details for a specific CTFtime event by event_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesCTFtime event id.

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description must fully disclose behavior. It merely states 'Get full details' without explaining what 'full details' includes, potential errors, rate limits, or authentication requirements. This lack of detail is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no extraneous information. It is front-loaded with the purpose and required parameter, making it easy to parse.

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

Completeness3/5

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

Given the absence of an output schema and annotations, the description is minimally adequate but lacks details on the return format, error handling, or examples. For a simple retrieval tool it may suffice, but it could be more informative.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the event_id parameter adequately ('CTFtime event id.'). The description adds no new semantic information about the parameter beyond what the schema provides, so a baseline score of 3 is appropriate.

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 specifies the action 'Get full details' and the resource 'specific CTFtime event' with the required identifier 'by event_id.' It effectively distinguishes this tool from siblings like ctftime_events (which likely lists events) and others.

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

Usage Guidelines3/5

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

The description implies usage when an event_id is known and full details are needed, but it does not provide explicit guidance on when to use this tool over alternatives, nor does it mention any prerequisites or exclusions.

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

ctftime_eventsA

List CTFtime events in a time window. Uses UNIX timestamps (seconds) for start/finish; returns past and upcoming events.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax events (1-100).
startNoUNIX timestamp (seconds) for window start.
finishNoUNIX timestamp (seconds) for window finish.

TDQS

A3.8/5.0
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 the use of UNIX timestamps and that both past and upcoming events are returned. However, it does not mention ordering, pagination, or any potential limits beyond the parameter schema. This leaves gaps in understanding the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences that clearly state the purpose, input format, and output scope. No unnecessary words or redundancy.

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 simple parameter set (3 optional integers) and no output schema, the description combined with the schema covers most needs. It could be improved by noting ordering or pagination behavior, but overall it is sufficient for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/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. The description adds that the tool returns past and upcoming events, which is not in the schema. However, the timestamp format is already described in the schema, so the added value is marginal.

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 lists CTFtime events within a specified time window using UNIX timestamps. The verb 'list' and resource 'CTFtime events' are specific, and it distinguishes from siblings like ctftime_event (singular) and others that handle results or teams.

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

Usage Guidelines3/5

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

The description implies usage for listing events in a time window but does not explicitly state when to use or avoid this tool compared to alternatives like ctftime_event for single events. No exclusions or prerequisites are mentioned.

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

ctftime_resultsA

Get event results for a year (or current year if omitted).

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoYear (e.g., 2025).

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, and the description does not disclose any behavioral traits such as result format, pagination, ordering, or any side effects. The description is too brief to cover necessary behavioral context.

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 a single sentence, efficient and front-loaded. It earns its place but could benefit from slight expansion on output to improve completeness.

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

Completeness2/5

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

Given no output schema, the description fails to explain what 'event results' actually contain—whether it's scores, rankings, or event details. This lack of completeness hinders proper tool selection and invocation.

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 describes the year parameter with type and bounds, and the description adds that omitting it uses the current year. This adds practical meaning beyond the schema, which had no default hint.

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 gets event results for a year, with the default being the current year. This distinguishes it from siblings like ctftime_event (single event) and ctftime_events (list events).

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

Usage Guidelines3/5

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

The description implies usage for retrieving results by year or defaulting to current, but does not provide explicit guidance on when to use this tool versus alternatives like ctftime_top_teams or ctftime_votes.

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

ctftime_teamA

Get information about a specific team by team_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
team_idYesCTFtime team id.

TDQS

A3.6/5.0
Behavior3/5

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

No annotations provided. Description implies a read operation but lacks details on data freshness, rate limits, or response structure. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single concise sentence front-loading the purpose with no extraneous information.

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?

Simple tool with one parameter and no output schema; description covers the essential purpose. Minor gaps like authentication or error handling, but adequate for the complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with 'CTFtime team id.' for team_id. Description adds no additional meaning beyond the schema, so baseline 3.

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?

Description clearly states 'Get information about a specific team by team_id.' with a specific verb and resource, distinguishing it from siblings like ctftime_events or ctftime_top_teams.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives like ctftime_top_by_country or ctftime_events. The description only states what it does.

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

ctftime_top_by_countryA

Get top teams for the current year by country (ISO 3166-1 alpha-2 country code, lowercase).

ParametersJSON Schema
NameRequiredDescriptionDefault
country_codeYesCountry code (e.g., 'pl', 'us', 'de').

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden. It discloses that results are for the current year but omits behavioral traits like authentication, rate limits, or error handling. Adequate but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with no extraneous words. Every part is necessary and informative.

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?

For a simple one-parameter tool with no output schema, the description covers the core purpose and parameter format. It does not mention return structure, but given the straightforward nature, it is reasonably complete.

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 already describes country_code with min/max length, but the description adds critical format details ('ISO 3166-1 alpha-2, lowercase'), providing value beyond 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?

The description clearly states the action (Get top teams), resource (by country), and specific constraints (current year, ISO 3166-1 alpha-2 lowercase). It distinguishes from siblings like ctftime_top_teams by adding the country filter.

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

Usage Guidelines3/5

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

The description implies usage for retrieving top teams of a specific country but offers no guidance on when to use this tool versus alternatives like ctftime_top_teams or ctftime_team. No explicit when/not-to-use context.

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

ctftime_top_teamsB

Get top teams for a year (or current year if year omitted).

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoYear (e.g., 2025).
limitNoMax teams (1-100).

TDQS

B3.3/5.0
Behavior3/5

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

No annotations provided, so description must carry burden. It correctly implies a read operation ('get') and mentions the default year behavior. However, it does not disclose ordering criteria, data freshness, or any rate limits, leaving gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with verb and object upfront, no redundant words. Every part serves a purpose.

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

Completeness2/5

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

Given no output schema and siblings, the description lacks crucial details: how top teams are ranked (e.g., points?), what output fields are returned, and that limit defaults to 10 (mentioned only in schema). It is too minimal for full context.

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%, with clear parameter descriptions. Description adds value by clarifying that year defaults to current year when omitted, which is not in schema. This enhances agent understanding.

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?

Description clearly states the action 'Get top teams' and the condition 'for a year (or current year if omitted)'. It is specific and distinguishes from siblings like 'ctftime_top_by_country' by omission, but does not explicitly differentiate.

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

Usage Guidelines2/5

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

Description only states when to use (for a year) but provides no guidance on when not to use, prerequisites, or alternatives like 'ctftime_top_by_country' or 'ctftime_results'.

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

ctftime_votesB

Get event votes for a year.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYesYear (e.g., 2025).

TDQS

B3.1/5.0
Behavior2/5

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

No annotations provided, and the description does not disclose any behavioral traits such as read-only nature, rate limits, or required permissions. The tool's behavior is assumed from its name only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, direct sentence with no extraneous words. Highly concise.

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

Completeness3/5

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

For a simple tool with one parameter and no output schema, the description is adequate but lacks details on the return format or limitations, which would help an agent fully understand the tool's output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no meaning beyond the input schema, which already describes the year parameter with an example. Since schema coverage is 100%, baseline is 3.

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 retrieves event votes for a year, distinguishing it from siblings that deal with events, results, or teams. However, it does not define 'event votes,' but the purpose is unambiguous.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives like ctftime_events or ctftime_results. The description provides no context for selection.

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. Dates show when Glama detected each change.

  1. 7 tool updatesv1.0.0
    • First observedctftime_event
    • First observedctftime_events
    • First observedctftime_results
    • First observedctftime_team
    • First observedctftime_top_by_country
    • First observedctftime_top_teams
    • First observedctftime_votes

TDQS

A3.7/5.0
Disambiguation5/5

Each tool targets a distinct CTFtime resource: event details, event listing, results, team info, top teams (overall and by country), and votes. No overlapping functionality.

Naming Consistency4/5

All tools follow the 'ctftime_' prefix with underscore-separated lowercase names. While verbs are not uniform (e.g., 'event' vs 'events', 'top_by_country'), the pattern is predictable and consistent.

Tool Count5/5

Seven tools cover the core read operations for CTFtime without being excessive. The number feels well-scoped for a focused data retrieval server.

Completeness4/5

The tool set covers essential queries: single event, list events, results, team info, top teams, and votes. Minor gaps like search or filtering by year in some tools are not critical.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to access World Cube Association speedcubing data including world records, competitor profiles, competition information, and championship results. Supports queries about rankings, competition schedules, and detailed speedcubing statistics through natural language.
    12
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables interaction with CTFd platforms for Capture The Flag competitions, allowing users to list challenges, read details, manage dynamic Docker containers, and submit flags through natural language.
    5
    25
    Apache 2.0
  • F
    license
    A
    quality
    D
    maintenance
    Provides programmatic access to CTFtime.org data for retrieving information about CTF competitions, team rankings, and event results. It enables users to search for upcoming events, analyze team performance, and access historical competition data through a standardized interface.
    9
    4
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to search, filter, and analyze Microsoft events (conferences, workshops, webinars) using the Microsoft Events API.
    4
    2
    MIT

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/tomek7667/mcp-ctftime'

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