CTFd MCP 服务端实现
使用说明内容(Markdown格式)
- 项目简介
- 该仓库实现了一个面向 CTFd 的 MCP 服务器,能够将 CTFd 的挑战、挑战详情、提交旗帜、以及容器相关的功能暴露为 MCP 的资源和工具,供大模型客户端通过标准的 MCP 协议进行查询与操作。
- 主要功能点
- 资源暴露:提供 challenge 的 Markdown 快照资源,方便 LLM 客户端渲染挑战描述、附件等信息。
- 工具暴露:实现以下可由 MCP 客户端调用的后端操作
- list_challenges(category?, only_unsolved?)
- challenge_details(challenge_id)
- submit_flag(challenge_id, flag)
- start_container(challenge_id)
- stop_container(container_id?, challenge_id?)
- 容器/实例支持:
- dynamic_docker(ctfd-whale): 通过 /api/v1/containers 启动/停止容器
- dynamic_check_docker(ctfd-owl): 通过 /plugins/ctfd-owl/container 启动/停止容器
- k8s(Kubernetes): 通过 /api/v1/k8s/* 系列接口管理实例
- 安全与会话管理:结合 CTFd 的令牌、会话 cookie 与 CSRF 令牌策略,提供 CSRF 刷新、令牌重试、重登录等容错处理。
- 错误映射:将 CTFd 客户端错误映射为 MCP 能理解的错误描述,便于 MCP 客户端呈现友好信息。
- 资源格式化:/challenges 资源以 Markdown 格式渲染,便于直接展示给用户或在对话中显示。
- 安装步骤
- 环境要求:Python 3.13+
- 安装/部署方式通常有两种:
- 使用 uvx 直接从 PyPI 启动:uvx ctfd-mcp
- 从源码运行(开发模式):uvx --from . ctfd-mcp
- 依赖与构建通常会自动处理,请确保环境中已有 Python、网络访问权限以及 CTFd 实例可访问。
- 服务器配置(MCP 客户端配置说明) 下面的配置用于 MCP 客户端在启动时链接到此 MCP 服务器。配置信息以 json 形式给出,包含服务器名称、启动命令及参数等。请将示例中的占位值替换为实际环境信息。该客户端不需要在此处进行配置说明,只需要服务器提供的启动参数,帮助 MCP 客户端正确连接与调用。
{ "mcpServers": { "ctfd-mcp": { "command": "uvx", "args": ["ctfd-mcp"], "env": { "CTFD_URL": "https://ctfd.example.com", "CTFD_TOKEN": "your_user_token" } // 说明: // - 命令: 启动 MCP 服务器的主命令 // - 参数: 启动参数,通常指向仓库中的 MCP 服务实现 // - env: 环境变量,用于连接目标 CTFd 实例。CTFD_TOKEN 使用普通用户令牌,或使用其他认证方式(如 CTFD_SESSION、CTFD_USERNAME/CTFD_PASSWORD 等),具体以服务器实现的认证策略为准。 } } }
- 基本使用方法
- 启动服务器
- 使用部署脚本或命令启动 ctfd-mcp 服务器(如上配置所示的命令组合)。
- 客户端交互
- MCP 客户端通过 JSON-RPC 方式向服务器请求资源、执行工具等。
- 常见操作包括查询可见挑战、获取挑战详情、提交旗帜、以及启动/停止挑战对应的容器实例。
- 运行模式
- 服务器默认支持 stdio 等传输模式,并通过 FastMCP 框架处理请求与响应。
- 排错与日志
- 如遇认证、CSRF、网络调用等错误,服务器会通过统一的错误格式返回给客户端,便于诊断。