# Quant-UX MCP Server Expose a self-hosted [Quant-UX](https://github.com/KlausSchaefers/quant-ux) prototyping instance to any MCP client (Claude Code, Codex CLI, Cursor, DeepSeek Harness, ...) over **Streamable HTTP**. ## 架构 ``` ┌──────────────────────── 服务器 124.222.27.183 ────────────────────────┐ │ │ │ ┌───────────────┐ ┌────────────────┐ ┌──────────────────────┐ │ │ │ quantux-mcp │──▶│ quant-ux- │──▶│ quant-ux-backend │ │ │ │ :8091 (MCP) │ │ frontend :8082 │ │ :8080 (Java, REST) │ │ │ └───────────────┘ └────────────────┘ └──────────────────────┘ │ │ ▲ quantux_default 网络 │ └────────┼─────────────────────────────────────────────────────────────┘ │ HTTPS/HTTP + Bearer API Key ┌────┴─────┐ ┌─────────┐ ┌───────┐ │Claude Code│ │ Codex CLI │ │ ...任何 MCP 客户端 │ └──────────┘ └─────────┘ └───────┘ ``` ## 已部署 | 项目 | 值 | |---|---| | MCP 端点 | `http://124.222.27.183:8091/mcp` | | 传输 | Streamable HTTP(MCP 协议 2025-11-25) | | 鉴权 | `Authorization: Bearer `(`.env` 中) | | Quant-UX 账号 | 服务器以 `QUX_ADMIN_EMAIL` 自动登录;JWT 临近到期时线程安全刷新,agent 无需关心登录 | | 容器 | `quantux-mcp`(docker compose,`restart: always`),接入 `quantux_default` 网络 | ## 工具清单(14 个) | 工具 | 说明 | |---|---| | `quantux_login` / `quantux_register` | 登录 / 注册 Quant-UX 账号 | | `quantux_list_apps` / `quantux_get_app` / `quantux_dump_app` | 列出 / 概览 / 原始模型 | | `quantux_create_app` / `quantux_delete_app` | 创建 / 删除原型(默认 375×667,可设桌面尺寸) | | `quantux_add_screen` | 添加屏幕(第一个自动成为起始屏) | | `quantux_add_widget` | 添加组件:Box/Label/Button/TextBox/Password/TextArea/Image/Icon/HotSpot | | `quantux_update_widget` / `quantux_delete_widget` | 修改样式/位置/文案 / 删除组件 | | `quantux_connect_flow` | 画交互连线(点击 A 跳转 B) | | `quantux_export_html` | **导出为单文件离线交互 HTML**(内嵌模型+图片,双击即用,**自动附带一致性验证结果**) | | `quantux_verify_export` | **导出后跑完整一致性测试**(渲染/连线/跳转/控件/图表/表格/动画/类型覆盖,返回详细报告) | | `quantux_apply_changes` | 底层逃生舱:直接提交 raw delta 数组 | | `quantux_health` | 健康检查 | ## 一致性验证(quantux_verify_export) 每次导出后自动运行(quickjs 内执行引擎 + DOM 桩),检查项: - **渲染**:起始屏组件数、屏幕层结构 - **连线**:连线驱动元素数、点击跳转(before→after 屏幕名) - **控件**:输入可编辑、CheckBox 切换、下拉选项 - **数据组件**:图表 SVG 数、表格数、进度条/评分/步进器 - **动画**:屏幕过渡是否应用 - **覆盖**:组件类型分 supported / partial / unsupported 示例(GoAuto 导出自动验证结果):`verdict=PASS, widgetCount=72, wiredCount=6, navigation=true` 命令行独立使用:`python quantux_verify.py --file export.html` 或 `--app ` ## 导出离线交互 HTML 任何原型都可以导出成一个**完全离线的单文件 HTML**(双击即可在浏览器里点击交互,无需服务器): - 通过 MCP:调用 `quantux_export_html(app_id)`,得到文件名 - 下载:使用 `quantux_export_html` 返回的短期、单文件范围下载地址;默认 10 分钟有效 - 或从服务器 `~/quantux-mcp/exports/` 目录直接取 - 已实测:CMAutoBuy(1366×768,194 组件,点击跳转正常)、GoAuto(商品列表→详情跳转正常) 支持组件:Box / Label / Button / TextBox / Password / TextArea / Image / Icon / HotSpot / CheckBox / RadioBox / Switch / ToggleButton / SegmentButton / SegmentPicker / DropDown;高级组件(图表、数据网格、逻辑块)以背景盒渲染。 **交互一致性(与 Quant-UX 线上模拟器对齐,jsdom 实测通过)**: | Quant-UX 线上交互 | 导出 HTML | 状态 | |---|---|---| | 连线跳转(点击按钮→目标屏幕) | ✅ click 事件导航 | ✅ 一致 | | 连线事件类型 | click / dblclick / mouseover | ✅ 一致 | | 组连线(group→屏幕) | ✅ 组内任一组件触发 | ✅ 一致 | | 输入框打字 / 密码框 / 日期 | ✅ 可输入(非只读) | ✅ 一致 | | CheckBox / RadioBox / Switch 切换 | ✅ 点击切换选中态 | ✅ 一致 | | DropDown 下拉选择 | ✅ 选项渲染+选择 | ✅ 一致 | | ToggleButton / SegmentButton 按压 | ✅ 点击按压态 | ✅ 一致 | | **屏幕动画**(fade/slide/zoom/grow + 时长/缓动) | ✅ CSS 过渡(读 screen.animation 配置) | ✅ 一致 | | **图表** Bar / Line / Pie / Ring(MultiRing/StackedRing 近似) | ✅ 内联 SVG + 调色板 | ✅ 一致(数据格式 props.data 二维数组) | | **表格**(表头+数据行,props.data CSV 格式) | ✅ HTML table | ✅ 一致 | | **ProgressBar / Rating / Stepper / HSlider / VolumeSlider / LockSlider** | ✅ 渲染+交互 | ✅ 一致 | | **IFrameWidget / NavBar / NavMenu / QDate / QDateDropDown / Tree / SortableList** | ✅ 基础渲染 | ✅ 一致 | | **Repeater / DataList 模板重复**(rows/grid 布局、间距、自动分布) | ✅ 行×列重复渲染模板,每个副本可交互 | ✅ 一致(静态模式;数据绑定需后端时以行×列填充) | | Rest / Script / LogicOr / 数据绑定(需后端) | 以背景盒渲染 | ❌ 离线无法支持 | ## 客户端接入配置 ### Claude Code(`claude mcp add` 或项目 `.mcp.json`) ```bash claude mcp add quantux \ --transport http \ --url http://124.222.27.183:8091/mcp \ --header "Authorization: Bearer " ``` 或 `.mcp.json`(项目根目录): ```json { "mcpServers": { "quantux": { "type": "http", "url": "http://124.222.27.183:8091/mcp", "headers": { "Authorization": "Bearer " } } } } ``` ### Codex CLI(`~/.codex/config.toml`) ```toml [mcp_servers.quantux] type = "http" url = "http://124.222.27.183:8091/mcp" headers = { "Authorization" = "Bearer " } ``` ### 任意 MCP 客户端(通用) ```json { "mcpServers": { "quantux": { "type": "http", "url": "http://124.222.27.183:8091/mcp", "headers": { "Authorization": "Bearer " } } } } ``` > `` 见服务器 `~/quantux-mcp/.env`。 ## Agent 使用示例 给 agent 的自然语言指令: > 用 quantux 工具创建一个 375×667 的"购物 App"原型:先建应用,再加一个"商品列表"屏幕,放 3 个商品卡片(Box+Label),底部放一个"购物车"按钮,最后把按钮连到"购物车"屏幕。 ## 本地开发 / 重新部署 ```bash cd ~/quantux-mcp sudo docker compose up -d --build # 重建并启动 sudo docker compose logs -f quantux-mcp # 日志 sudo docker compose down # 停止 ``` 环境变量(`.env`): - `MCP_API_KEY`:调用方必须携带的 Bearer 密钥 - `QUX_ADMIN_EMAIL` / `QUX_ADMIN_PASSWORD`:启动时自动登录的账号 - `QUX_BASE_URL`:Quant-UX 前端地址(容器内默认 `http://quant-ux-frontend:8082`) - `MCP_EXPORT_TOKEN_TTL_SECONDS`:导出文件短期下载令牌有效期,默认 600 秒,范围 60~3600 秒 ## 安全提示 - MCP 端点暴露在公网时,**务必设置强 `MCP_API_KEY`**,并建议在腾讯云安全组中将 8091 端口的来源限制为可信 IP - Quant-UX 后端凭据(admin 账号)只在 MCP 服务器内部使用,不会泄露给调用方 - 长期 `MCP_API_KEY` 只允许放在 Authorization 请求头;不得放入导出 URL、工单或日志。导出地址使用随机短期令牌,并且只允许下载对应的单个文件。 - 健康检查中的 `logged_in` / `token_valid` 表示 Quant-UX JWT 当前仍有效,`token_expires_at` 为 UTC 到期时间;不能再用“Token 字符串存在”代替有效登录。