ctfd-mcp
-
项目简介
- 这是一个 MCP 服务器端实现,专门为 CTFd 场景设计。它通过 MCP 框架暴露对 CTFd 的资源(如挑战详情、挑战列表)、工具(如提交 Flag、启动/停止容器)以及资源渲染(以 Markdown 形式展示挑战信息)的访问能力。服务器与 CTFd 的 REST API 进行交互,提供统一的 JSON-RPC 接口,供 LLM 客户端调用来获取上下文、执行外部功能等。
-
主要功能点
- 资源:challenge_resource(CTFd 挑战的 Markdown 表现形式渲染)
- 工具(Tools):
- list_challenges(category, only_unsolved) – 列出可见挑战,支持按分类筛选和未解锁筛选
- challenge_details(challenge_id) – 获取指定挑战的详细信息
- submit_flag(challenge_id, flag) – 提交挑战的答案
- start_container(challenge_id) – 启动与挑战相关的容器(支持多种实现,如动态 Docker、K8s、ctfd-owl 等)
- stop_container(container_id=None, challenge_id=None) – 停止容器(依据挑战类型不同,可能需要 container_id 或 challenge_id)
- 会话与错误处理:将 CTFd 客户端的错误映射为易于理解的 MCP 错误信息,提供更友善的异常输出。
- 会话管理:在 MCP 服务生命周期结束时关闭 CTFd 客户端,确保资源释放。
-
安装与运行方式
- 安装环境:需要 Python 3.x 环境,安装依赖后可运行服务器。
- 启动方式:
- 直接运行服务器程序(默认传输为 stdio),例如通过命令行执行服务器可执行入口。
- 也可通过 MCP 框架提供的多种传输协议启动(如 stdio、SSE、WebSocket 等),以支持不同的客户端接入方式。
- 配置与凭证:
- 通过环境变量配置与 CTFd 实例的认证信息,核心变量包括 CTFD_URL、CTFD_TOKEN、CTFD_SESSION、CTFD_CSRF_TOKEN、CTFD_USERNAME、CTFD_PASSWORD 等。
- 服务器在启动时会读取配置、建立 CTFd 客户端并在需要时执行登录/CSRF 令牌更新等操作。
- 运行后端与客户端对接:
- MCP 客户端将通过 JSON-RPC 调用以上工具和资源,以实现对 CTFd 的上下文服务能力。
-
服务器配置示例说明
- 配置信息需放在客户端的启动描述中,包含服务器名称、启动命令以及参数等。以下为描述性信息(非代码格式):
- server name: ctfd-mcp
- command: ctfd-mcp
- args: [](默认使用 stdio 传输;若需要其他传输,请按运行环境提供相应参数)
- 注释说明:MCP 客户端一般只需要知道服务器的启动命令和必要的参数(若有额外选项由运行环境提供)。本实现默认通过 stdio 启动,若在其他环境中需要 WebSocket/SSE 等传输,请按对应运行时的要求配置。
- 配置信息需放在客户端的启动描述中,包含服务器名称、启动命令以及参数等。以下为描述性信息(非代码格式):
-
基本使用方法
- 启动服务器
- 在支持的运行环境中执行服务器入口(默认使用 stdio 传输)。
- 服务器初始化时会读取环境变量中的 CTFd 配置并建立连接。
- 与 MCP 客户端交互
- 使用客户端发起 JSON-RPC 请求,调用 list_challenges、challenge_details、submit_flag、start_container、stop_container、challenge_resource 等方法。
- 客户端也可以通过资源标识符读取挑战的 Markdown 表现,或通过工具执行挑战相关操作。
- 典型工作流示例
- 获取可用挑战列表
- 查看某个挑战的详细信息
- 提交旗帜以完成挑战
- 启动或停止与挑战相关的容器(如动态 Docker、K8s、ctfd-owl 等实现)
- 启动服务器