AI / MCP 集成(检索、校验、实时操作页面)
1. 开启(后端配置)
内置 AI 问答(编辑器右下角):在 server/vp_config.json 的 ai 段填写 baseURL / apiKey / models / visionModels(对应旧 VJAGENT_LLM_*),重启后端即可(种子化成固定名 default 的平台端点);也可在 AI 设置里添加 BYO 端点。输入栏相机按钮会截当前大屏并打开标注编辑器(矩形 / 箭头 / 画笔),确认后作为图片附件发给多模态模型;点附件缩略图可查看大图或再编辑。
模型解析优先级:会话已定格 → 用户 BYO 端点 → 平台 default → 文件/环境变量兜底。配置文件的 apiKey 只属于 default,不会补给自建端点;自建端点漏填 Key 会得到 unauthorized: You didn't provide an API key,而两边常提供同名模型(都叫 qwen3.6-plus)看不出差别。AI 设置的端点列表会标「未设 Key」、只给真正生效的那条标「默认」,并可逐条删除;模型药丸显示的是本会话实际所用模型。会话模型首次发言即定格,换端点后要新建会话。
server/vp_config.json(或环境变量 VP_MCP_ENABLED=true 等):
{
"mcp": {
"enabled": true,
"dataDir": "./vp_mcp_data",
"cacheDir": "./pb_data/mcp-cache",
"publicURL": "https://your-host",
"localValidateRoots": [],
"liveEnabled": true,
"liveSecret": "<32+位稳定密钥>"
}
}
- MCP 数据目录
vp_mcp_data/不打包进二进制,与后端放在一起;更新数据后重启后端即可。 liveSecret决定工程 MCP 地址里的 token;不设则每次重启随机、旧地址失效。- 端点:
POST/GET https://<host>/mcp(Streamable HTTP);GET /llms.txt索引。 - 反代(nginx
proxy_pass到127.0.0.1且保留对外 Host)开箱可用:SDK 的 DNS 重绑定保护已关(否则/mcp全部 403invalid Host header),Host 准入看allowedHosts(留空=全放行)。publicURL留空时对外地址按请求推导。
2. 静态工具(检索 / 文档 / 校验)
| Tool | 作用 |
|---|---|
search_widgets / get_widget_metadata |
检索组件、取 options 元数据;搭建型组件返回 childPieces |
search_documentation / get_doc |
检索文档章节;get_doc 传 type 取组件文档(scene-3d 等 builder 绑子系统总览)、传 docId 取文档页 |
list_examples / get_example |
白名单示例 |
validate_project |
校验工程 JSON(内联对象) |
validate_project_file |
按服务器本地路径校验(需配 localValidateRoots,省 token:{ "path": "D:/out/demo.vpproj.json" }) |
与本技能的分工:查 API/文档/校验走 MCP;按规范拼整份 JSON 用本技能 references/(envelope/data/interactions)+ scripts/validate-project-json.mjs 自检。
3. Cursor 配置(静态工具)
{ "mcpServers": { "vjappvisual": { "url": "http://127.0.0.1:8090/mcp" } } }
需 stdio 代理时用 npx -y mcp-remote http://127.0.0.1:8090/mcp。改数据/配置后重启后端再刷新 Cursor MCP 面板。
4. live 实时页面控制(AI 直接操作打开的工程)
编辑态:完整结构编辑(撤销/保存);运行态:读取/交互/临时改属性(reload 还原,不写回工程)。
两种接入:
- 工程地址(配到 Cursor):编辑器右下角「AI」面板复制
http://<host>/mcp/p/<projectId>?token=…写入mcp.json。多标签同工程时page_sessions→page_attach(sessionId)(仅一个时自动附着)。 - 本标签地址(应用内 AI 面板):
http://<host>/mcp/s/<token>精确指向当前标签。
工具面已收敛:同族合并为带 action 的单工具、单/批只留批量;会话端点不注册 page_attach,运行态会话不注册编辑工具。
| Tool 组 | 能力 |
|---|---|
page_sessions / page_attach |
会话总览(含当前目标)/ 选定(仅工程端点) |
page_get_screens / page_list_elements |
结构(摘要省 token);page_list_elements 传 query 即模糊查找 |
page_get_elements |
元素详情:uids 批量(≤50,fields 限定选项);uid/elementUID 单个。两种读法互斥,同传会报错 |
page_get_schemas |
可写属性清单(真实 path/类型/门控 enabled),按 type 去重 |
page_list_widget_types / page_screenshot |
组件类型目录 / 页面截图(视觉核对) |
page_get_selection / page_get_data / page_get_params |
读选中/数据/参数 |
page_interact / page_emit |
交互(action=select/highlight/click)/ 事件 |
page_batch_set_options |
改属性(编辑态持久+可撤销;运行态临时;单条=长度 1 的 changes);返回以 FAILED 开头须先修正 |
page_set_data / page_set_params / page_set_active_screen / page_window |
数据/参数/切页/画面(action=open/close) |
page_add_element / page_remove_element / page_move_element / page_history / page_save |
结构编辑与撤销重做(action=undo/redo);仅编辑态 |
page_export_tsx / page_apply_project |
VP-TSX 环路(仅编辑态):export_tsx({ path, screenUid? }) 把当前页/指定屏导出为 .vp.tsx;`apply_project({ path } |
live 端点同时挂载知识子集(search_documentation / get_doc / get_widget_metadata);示例与校验类工具只在独立 /mcp 生成端点。
推荐工作流(schema-first):page_list_elements → page_get_schemas(uids) 取真实属性 path(绝不臆造)→ 一次 page_batch_set_options(检查 failed/warnings)→ page_screenshot 核对 → page_save。写属性的 path 权威 = live page_get_schemas(或生成 JSON 时的 get_widget_metadata);get_doc 是人读向导,不可作为 path 依据。批量读优先 page_get_elements(uids)/page_get_schemas(uids),不要逐 uid 串行单读。
容易踩的语义(照描述用会踩坑的地方)
- 只回已写入的选项:
page_get_elements(uid)不返回仍是默认值的项(默认值没落库)。要默认值查page_get_schemas。 page_set_data是整表替换,不是追加;空数组 = 清表。列以表结构为准,多余列会被丢掉。page_set_params只在顶层合并:嵌套对象整段替换,null是存 JSON null 而不是删键。page_window分模式:运行态才真的开关浮层;编辑态 open 等于把编辑画布切过去、close 回applied:false。切页面用page_set_active_screen。query只搜当前屏,是普通子串(不是正则),也不搜 uid。要搜别的页先切过去。- 写不了的东西:
interactions、地图/三维/组态的pieces、data-repeater的unitTemplate、选项卡/视图分页——这些是结构字段,只能改 VP-TSX 再page_apply_project。name/visible/locked是列表里的只读元数据,不是属性 path。 - 字体是整对象:写
text-font会覆盖整段,要把size一并带上,否则原有字号丢失。 - 新增页面不能靠单屏 apply:单屏 envelope 按 uid 合并进现有工程,uid 必须已存在;要加页就导出整工程、在里面加好再整体 apply。
- 未知 uid 一律报错:
page_emit的targetUid、page_interact的uid、page_set_active_screen的screenUid、page_list_elements的screenUid都不再静默兜底。limit必须 ≥1,limit=0是错误而不是「不限」。
5. 安全要点
- WS 注册强制鉴权:编辑态验登录+工程 owner;运行态验工程 token,且需页面浮层手动「允许 AI 交互」。
- 仅暴露公开文档与白名单示例;请求体/超时/并发/频率受限;命令按会话串行。
validate_project_file只读localValidateRoots白名单目录(防目录穿越);公网部署慎开。