MCP门户部署
此仓库包含用于MCP门户的React前端和FastAPI后端。当前版本随附了容器化部署资源以及基于Redis的任务/会话管理功能。
先决条件
- Docker 和 Docker Compose
- 如果您打算运行MCP任务(设置
OPENAI_API_KEY)
使用 Docker Compose 运行
- 将你的环境变量复制到一个(文件/地方)中
.env文件(可选)或在你的 shell 中导出它们:
export OPENAI_API_KEY=sk-...
export OPENAI_MODEL=gpt-4.1-mini
export OPENAI_BASE_URL=https://api.openai.com/v1
export REACT_APP_API_BASE_URL=http://localhost:8000- 构建并启动服务:
docker-compose up --build这会启动三个容器:
- Redis – 存储当前/之前的任务元数据和控制台流。 - 后端 – FastAPI 应用程序在 http://localhost:8000。 - 前端 – 使用静态React构建服务 http://localhost:3000。
- 访问
http://localhost:3000在您的浏览器中。
持久任务日志
任务输出被流式传输到 Redis,并持久化保存到文本文件中 backend/task_logs该目录被挂载到后端容器中,因此日志在重启后仍能保留。
您可以通过API下载任务日志:
curl -LO http://localhost:8000/tasks//log/download构建和发布Docker镜像
该存储库附带了一个辅助脚本,用于构建前端和后端镜像,并(可选地)将它们推送到注册表。这避免了运行两个独立的进程 docker build 每次更新堆栈时都要执行命令。
# Build both images and tag them under your registry/namespace
./scripts/build-images.sh -r ghcr.io/your-org -t v1.2.3
# Build and push (requires registry login)
./scripts/build-images.sh -r ghcr.io/your-org -t v1.2.3 --push使用 ./scripts/build-images.sh --help 要查看可用选项,包括如何覆盖前端构建期间使用的API基础URL。
部署到Kubernetes
后端API增强
- Redis 现在可以追踪活跃、已完成、已取消和失败的任务,以及它们的控制台输出。
/tasks相关终端点会公开任务历史记录、日志以及可下载的文本文件,以便进行长期存储。- 控制台日志在任务完成后会自动持久化,并通过 Redis 保留,以便进行重放或未来的存储解决方案使用。
后端项目结构
FastAPI 后端的组织结构如下 backend/app 采用受ftnt-qa-gpt启发的模块化布局:
backend/app/api/– 按资源(测试用例、大型语言模型、任务等)分组的路由定义。backend/app/models/– SQLAlchemy ORM 模型。backend/app/schemas/– Pydantic 请求/响应模型。backend/app/services/– 共享业务逻辑(运行队列、任务编排、MCP辅助工具)。backend/app/core/并且backend/app/db/– 应用配置、Redis 辅助工具和数据库会话管理。
backend/main.py 现在只是通过(某种方式)实例化应用程序 backend.app.create_app()这使得在不触及入口点的情况下更容易扩展单个层。
开发说明
- 前端构建嵌入了
REACT_APP_API_BASE_URL在编译时。在构建过程中覆盖默认设置,使用:
REACT_APP_API_BASE_URL=http://your-backend:8000 docker-compose build frontend- 要在本地运行后端服务而不使用 Docker,请安装依赖项并启动 Uvicorn:
pip install -r backend/requirements.txt
uvicorn backend.main:app --reload确保 REDIS_URL 指向一个可访问的 Redis 实例。
配置MCP服务器和OTP支持
后端会自动为每个任务建立MCP客户端连接。默认情况下,它会连接到一个单独的Chrome DevTools代理 MCP_SERVER_URL当多因素认证需要通过电子邮件发送一次性密码(OTP)时,您可以注册 gmail-otp-mcp 在浏览器会话中使用代理,以便代理能够无需额外设置即可获取验证码。
设置以下可选环境变量以自定义配置:
| 变量 | 描述 |
|---|---|
MCP_PRIMARY_SERVER_NAME 用于主MCP服务器条目的名称(默认为 http)。 | |
MCP_PRIMARY_SERVER_ALIASES | 用逗号分隔的别名,它们指向同一个主服务器URL。 |
MCP_GMAIL_OTP_URL | Gmail OTP MCP 代理的URL。定义后,该服务器将对所有任务可用。 |
MCP_GMAIL_OTP_SERVER_NAME | Gmail OTP 服务器条目的可选别名(默认为 gmailOtp)。 |
MCP_SERVERS_FILE | 可选的JSON文件路径,用于描述MCP服务器。接受顶级(或根级)路径 { "mcpServers": { ... } } 对象或别名到服务器定义的简单映射。 |
MCP_ADDITIONAL_SERVERS | 描述额外MCP服务器的JSON对象。每个键是别名,每个值要么是URL字符串,要么是一个包含(此处原文未完整,假设后续内容为描述该对象应包含的属性或信息)... 的对象 url 关键和可选的额外配置。 |
示例 shell 配置:
export MCP_SERVER_URL=http://localhost:9000/sse
export MCP_GMAIL_OTP_URL=http://localhost:9100/sse
export MCP_ADDITIONAL_SERVERS='{"fileManager": {"url": "http://localhost:9200/sse", "capabilities": ["fs"]}}'或者,将服务器定义放入一个JSON文件中,并通过引用该文件来使用 MCP_SERVERS_FILE:
{
"mcpServers": {
"chrome:lab1": {"url": "http://localhost:9000/sse"},
"gmail:otp": {"url": "http://localhost:9100/sse"}
}
}export MCP_SERVERS_FILE=./config/mcp-servers.json诸如环境变量等 MCP_GMAIL_OTP_URL 并且 MCP_ADDITIONAL_SERVERS 继续覆盖文件中的条目,以便您可以在不同环境中重用相同的JSON配置。
基于这些值,代理可以调用Chrome DevTools MCP,从Gmail获取一次性密码(OTP),并连接到任何其他已注册的代理 无需对任务定义做进一步更改。
