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 等实现)

服务器信息