
CTFd
io.github.MrJamescot由 GitHub 账号 MrJamescot 发布v1.0.4更新于 Oct 24, 2026
MCP server for CTFd v3: list challenges, submit flags, and query scoreboards via AI agents.
概览
面向 CTFd v3 实例的 MCP 服务器,让 AI 助手浏览题目、提交 flag、解锁提示并查看排行榜。
- 可以做什么
- 将服务器指向 CTFd 实例并设置凭据(基础 URL、API 令牌、会话 Cookie 或表单登录)。按分类、名称和是否已解出筛选题目列表,并查看单个题目的完整详情。在明确确认后提交 flag,并解锁提示。将题目附件下载到本地目录。读取公开排行榜、自己的进度和实例元数据。检查认证状态和实例健康状态。
- 适用场景
- 适合在基于 CTFd 的夺旗赛中,让助手协助梳理题目、查询详情、跟踪进度或提交你已找到的 flag。也适合通过可选的 REST 镜像对 CTFd 实例编写脚本。
- 运行要求
- 本地 Python 3.10+ 进程,可从 PyPI 安装(uvx 或 pip)或从源码运行。需要 CTFD_BASE_URL 指向 CTFd v3 实例,并提供一种凭据:CTFD_ADMIN_TOKEN(推荐)、CTFD_SESSION_COOKIE,或 CTFD_USERNAME 加 CTFD_PASSWORD。需要能访问该实例的网络;除非启用 CTFD_ALLOW_PRIVATE_IPS,否则私有和回环地址会被拒绝。
安装
在 SourceWeft 中
- 打开 控制台中的 CTFd,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
CTFd MCP Server
[PyPI - Version] [PyPI - Python Versions] [Docker Pulls] [License: MIT] [GitHub Stars]
A Model Context Protocol (MCP) server for interacting with any CTFd v3 instance. It lets AI tools (Claude Desktop, Cursor, custom agents, ...) authenticate, list and inspect challenges, submit flags, and query instance state through a stable, type-safe interface.
The project ships two interfaces built on the same client library:
- MCP tools (primary) —
ctfd_mcp_server.py, used overstdioorsse. - REST API (optional) —
server/main.py, a FastAPI mirror for scripting, debugging, and Docker deployments.
Credentials (token / cookie / password) live in memory only and are never
echoed in tool output, written to server_state.json, or logged.
Features
- Multiple authentication modes — API token, session cookie, or username/password form login (with CSRF handling).
- Rich challenge queries — paginated listing with
category,search(name), andsolved/unsolvedfilters, plus per-challenge detail retrieval. - Safe flag submission — requires an explicit
confirm=True, returns clear success/failure, and surfaces rate-limit errors. Flags are never logged. - Instance introspection — public instance info, health check, and an authentication-status tool that reveal no secrets.
- Consistent structured errors —
AuthenticationError,CTFdAPIError,ChallengeNotFoundError,SubmissionError,ValidationError,ConfigurationError. - Pagination by default — one page of challenges per call; no accidental full-dump downloads.
- Hardened HTTP — configurable timeouts, one safe retry for idempotent
GETs, no retries forPOSTs (no duplicate submissions), strict JSON/content parsing. - REST + MCP from one codebase — identical behaviour on both interfaces.
- No hardcoded instance —
BASE_URLis validated and configurable at startup and at runtime.
Installation
Requires Python 3.10+.
The fastest way is to install from PyPI:
For MCP clients, point your config at the packaged entry point:
Or run from source:
Configure
CTFD_BASE_URLmay include a path prefix (e.g.https://host/ctfd); the client appends/api/v1automatically.
Running the MCP Server
Most MCP clients launch the server themselves via a command/args config.
For that, your client config should reference ctfd_mcp_server.py:
Manual launch:
MCP tools
With token auth, requests are sent with
Content-Type: application/json(CTFd only honoursAuthorization: Token ...on JSON requests). With cookie/credentials auth, state-changing requests echo the session CSRF nonce as theCSRF-Tokenheader, which is re-fetched from the site after login.
Tools return JSON text. Errors are structured, e.g.:
Running the REST API (optional)
Endpoints (all under /api/v1):
The optional REST API can be protected with an extra bearer token: set
CTFD_API_TOKEN, and requests to/api/v1/*will requireAuthorization: Bearer <token>. The server binds to loopback by default (MCP_HOST=127.0.0.1).
Docker
A ready-made image is published on Docker Hub:
Or build locally (REST mode):
docker compose up --build also works (REST API on http://localhost:8000).
To run the MCP SSE server in a container instead:
Usage examples
MCP (agent)
REST
See DEMO.md for a complete walkthrough and
examples/ for curl and Python snippets.
Development & testing
The test suite mocks the CTFd API (tests/conftest.py::FakeGateway), so unit
tests run offline.
Integration testing against a real CTFd
Run a local CTFd for live tests (recommended over the shared demo instance, which serves HTML on public auth-gated routes):
Security considerations
- Credentials are memory-only. By default nothing is written to
server_state.json. EnablingCTFD_PERSIST_SECRETSis discouraged. - Secrets are never echoed. Tool and API responses, error messages and logs
redact tokens, cookies, passwords and flags (
server/utils.py). - Every tool validates its input before touching the network (
set_base_urlrequires an absolutehttp(s)URL,submit_flagrequiresconfirm=True, etc.). - Controlled retries. Only idempotent
GETrequests are retried (once). Flag submissions are never automatically replayed. - Trust model. The server is a local/dev tool: whoever can call its tools can point it at any CTFd instance and (with a valid credential) read data or submit flags. Do not expose the REST/SSE endpoints on an untrusted network.
- SSRF guard. By default connections to private / loopback / link-local /
metadata addresses are refused (
CTFD_ALLOW_PRIVATE_IPS=1opts out). A local container or a tool pointed at a private instance will get a clear error.
Limitations
- Requires CTFd v3+. The
/api/v1routes used are standard CTFd v3 API routes. - Form login depends on CTFd's web session flow (CSRF nonce extraction is best-effort). API tokens are the recommended authentication method.
difficultyis not a standard CTFd field; challengevalue(points) is returned instead.solvedfiltering uses CTFd'ssolved_by_meflag, which is only meaningful when authenticated.- Instance "version" is reported only when it appears in the rendered page; CTFd has no public version API endpoint.
- Tokens are per-instance. CTFd redirects
/api/v1calls to its login page when a credential is invalid. The server detects this and reports: "the credential is not valid for THIS instance" — a token from one CTFd instance never works on another. - When
CTFD_USERNAME/CTFD_PASSWORDare configured, the server auto-logs-in on demand (rotating the session cookie) whenever a call returns unauthenticated, so expired sessions self-heal. After each login the CSRF nonce is re-fetched from the site (a fresh nonce is required for flag submissions over a web session). - A teamless account sees no
/api/v1/challengeson team-mode instances until it joins or creates a team; the server surfaces CTFd's permission message.
Contributing
Pull requests are welcome. Please:
- Open an issue describing the change.
- Add tests in
tests/(mocked CTFd API preferred). - Run
python -m pytest -qandruff check server ctfd_mcp_server.py tests. - Do not ship credentials in code, tests, or commit
server_state.json/.env.
License
MIT — repository: https://github.com/MrJamescot/ctfd-mcp-server
来源:README.md,提交 c75b77a
工具
0版本历史
3- v1.0.4最新Sep 21, 2026
- v1.0.3Sep 20, 2026
- v1.0.2Sep 20, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分