扑动流mcp
flutterflow-mcp 是一个围绕命令面板模型构建的原始FlutterFlow MCP服务器。
什么是轨道
Orbit在设计上不同于多工具MCP服务器:
- 一个主要工具:
orbit - 命令面板中的动词
cmd(help,snapshots.create,changeset.apply等等) - 具有持久索引/图形的SQLite快照缓存
- 策略引擎(
orbit.policy.json+环境覆盖) - 事务性变更集流程:
new -> add -> preview -> validate -> apply
特性
- Node.js 18+TypeScript严格实现
- 克劳德桌面/光标/风帆/克劳德代码/Codex的MCP标准传输
- 端口上单独的HTTP健康/状态/策略服务
8080 - FlutterFlow API适配器(套
FLUTTERFLOW_API_TOKEN用于远程读/写) - SQLite快照存储(文件、哈希、符号、边)
- 导航+组件使用图索引
- 具有手动审批模式的安全编辑策略引擎
- 轨道架构包资源:
- orbit://schema/index - orbit://schema/doc/{id} - orbit://schema/snippet/{id}
快速开始
1) 安装
npm i2) 配置env(本地启动时可选)
export FLUTTERFLOW_API_TOKEN=your_token_here如果没有令牌,MCP服务器仍然会启动,但调用FlutterFlow API的命令(例如 projects.list, snapshots.create, snapshots.refresh)将返回丢失令牌错误,直到您设置它。
可选API路径替代:
export FLUTTERFLOW_API_BASE_URL=https://api.flutterflow.io/v2
export FLUTTERFLOW_API_LIST_PROJECTS_PATH=/l/listProjects
export FLUTTERFLOW_API_LIST_PARTITIONED_FILES_PATH=/listPartitionedFileNames
export FLUTTERFLOW_API_PROJECT_YAMLS_PATH=/projectYamls
export FLUTTERFLOW_API_VALIDATE_PROJECT_YAML_PATH=/validateProjectYaml
export FLUTTERFLOW_API_UPDATE_PROJECT_YAML_PATH=/updateProjectByYaml
export FLUTTERFLOW_API_MIN_INTERVAL_MS=10003) 快跑
npm start这将开始:
- 通过stdio的MCP服务器
- HTTP服务器已打开
http://localhost:8080
终点:
GET /healthGET /statusGET /policy
如果HTTP端口已在使用中,Orbit现在将继续使用MCP stdio并向stderr记录警告。 您可以通过以下方式完全禁用HTTP端点:
export ORBIT_HTTP_ENABLED=0MCP客户端设置
使用 npm start 作为您的MCP命令。
克劳德桌面/光标/风帆
使用 templates/mcp-config.local.json 作为基础:
{
"mcpServers": {
"ff_orbit_mcp": {
"command": "npm",
"args": ["start"],
"cwd": "/absolute/path/to/ff-mcp",
"env": {
"FLUTTERFLOW_API_TOKEN": "YOUR_TOKEN"
}
}
}
}克劳德代码
使用项目配置文件 .mcp.json (你可以复制 templates/claude-code.mcp.json):
{
"mcpServers": {
"ff_orbit_mcp": {
"command": "npm",
"args": ["start"],
"cwd": "/absolute/path/to/ff-mcp",
"env": {
"FLUTTERFLOW_API_TOKEN": "YOUR_TOKEN"
}
}
}
}或者使用CLI添加它:
claude mcp add -s project -e FLUTTERFLOW_API_TOKEN=YOUR_TOKEN ff_orbit_mcp -- npm startCodex(命令行界面/应用程序)
选项A:通过CLI添加:
codex mcp add ff_orbit_mcp --env FLUTTERFLOW_API_TOKEN=YOUR_TOKEN -- node /absolute/path/to/ff-mcp/dist/main.js在使用上述命令之前构建一次:
npm run build选项B:添加 ~/.codex/config.toml (参见 templates/codex-config.toml):
[mcp_servers.ff_orbit_mcp]
command = "npm"
args = ["start"]
cwd = "/absolute/path/to/ff-mcp"
env = { FLUTTERFLOW_API_TOKEN = "YOUR_TOKEN" }
enabled = true代理规则包
此存储库现在包括用于代理的克隆就绪规则/设置包:
- 规则:
.cursor/rules/ - 剧本:
docs/agent-playbook.md - MCP配置模板:
templates/mcp-config.local.json,templates/mcp-config-remote.json,templates/claude-code.mcp.json,templates/codex-config.toml - 安装程序脚本:
scripts/install-cursor-rules.sh
将规则安装到另一个仓库中:
./scripts/install-cursor-rules.sh /absolute/path/to/target-project动态观察命令选项板
主要工具签名:
orbit({
cmd: string,
args?: object,
snapshot?: string,
format?: "json" | "explain"
})发现命令:
orbit({ cmd: "help" })核心小组:
- 发现:
projects.list,snapshots.create,snapshots.refresh,snapshots.refreshSlow,snapshots.ensureFresh,snapshots.info,snapshots.ls - API功能:
api.capabilities - 查询:
search,page.create,page.scaffold,page.get,page.update,page.preflightDelete,page.remove(推荐),page.delete(低级),page.clone,component.get,component.extractFromWidget,component.instance.insert,tree.locate,tree.subtree,tree.find(别名),tree.validate,tree.repair,graph.nav,graph.usage,pages.list,textfields.list,widget.get,widget.getMany,widgets.list,widgets.find,widgets.findText,widgets.updateMany,widgets.copyPaste,widget.create,widget.insert,widget.wrap,widget.unwrap,widget.duplicate,widget.deleteSubtree,widget.replaceType,widget.removeChildren,widget.move,widget.moveMany,widget.reorder,widget.action.list,widget.action.get,widget.bindAction,widget.bindData,widget.set,widget.delete,selection.get,selection.clear,intent.run,routes.list,routes.listByPage,routes.validate,routes.upsert,routes.delete,settings.get - 总结:
summarize.page,summarize.component,summarize.project - 编辑:
changeset.new,changeset.add,changeset.preview,changeset.validate,changeset.apply,changeset.applySafe,changeset.rollback,changeset.revert,changeset.drop - 架构:
schema.search,schema.read,schema.snippet
高投资回报率食谱
- 使用确定性配方生成最佳实践页面(先预览):
- orbit({ cmd:"page.scaffold", args:{ name:"login2", recipe:"auth.login", preview:true } }) - orbit({ cmd:"page.scaffold", args:{ name:"preferences", recipe:"settings.basic", params:{ toggles:["Notifications","Dark mode"] }, apply:true } }) - orbit({ cmd:"intent.run", args:{ text:"create a list page called products with search", preview:true } })
- 将小部件复制两次:
- orbit({ cmd:"widget.duplicate", args:{ nameOrId:"login", nodeId:"id-Text_a", count:2, apply:true } })
- 在一次调用中插入小部件:
- orbit({ cmd:"widget.insert", args:{ nameOrId:"login", type:"Divider", beforeNodeId:"id-Button_b", apply:true } })
- 批量更新文本小部件:
- orbit({ cmd:"widgets.updateMany", args:{ nameOrId:"login", filter:{ type:"Text" }, set:{ text:"James NC" }, apply:true } })
- 使用一个规范搜索命令查找小部件:
- orbit({ cmd:"widgets.find", args:{ nameOrId:"login", type:"TextField", textContains:"Password" } })
- 批量获取精确的小部件:
- orbit({ cmd:"widget.getMany", args:{ nameOrId:"login", nodeIds:["id-Text_a","id-Button_b"] } })
- 将按钮路由到另一个页面:
- orbit({ cmd:"routes.upsert", args:{ nameOrId:"login", nodeId:"id-Button_b", toPageNameOrId:"DailyDashboard", apply:true } })
- 检查和验证页面路由:
- orbit({ cmd:"routes.listByPage", args:{ nameOrId:"login", direction:"both" } }) - orbit({ cmd:"routes.validate", args:{ nameOrId:"login", strict:true } })
- 批量移动和打开小部件:
- orbit({ cmd:"widget.moveMany", args:{ nameOrId:"login", nodeIds:["id-Text_b","id-Text_c"], afterNodeId:"id-Button_b", apply:true } }) - orbit({ cmd:"widget.unwrap", args:{ nameOrId:"login", nodeId:"id-Row_wrap", apply:true } })
- 列出/获取小部件触发操作:
- orbit({ cmd:"widget.action.list", args:{ nameOrId:"login", nodeId:"id-Button_b" } }) - orbit({ cmd:"widget.action.get", args:{ nameOrId:"login", nodeId:"id-Button_b", trigger:"ON_TAP" } })
- 在读/写之前确保快照的新鲜度:
- orbit({ cmd:"snapshots.ensureFresh", args:{ staleMinutes:30 } })
- 在对话跟进中使用粘性选择:
- orbit({ cmd:"selection.get" }) - orbit({ cmd:"intent.run", args:{ text:"unwrap this", apply:true } })
- 安全应用编排:
- orbit({ cmd:"changeset.applySafe", args:{ changesetId:"chg_x", confirm:true } })
- 回滚最新应用的变更集:
- orbit({ cmd:"changeset.rollback", args:{ latestApplied:true, confirm:true, apply:true } })
- 更安全的页面删除流程:
- orbit({ cmd:"page.preflightDelete", args:{ nameOrId:"login2" } }) - orbit({ cmd:"page.remove", args:{ nameOrId:"login2", apply:true } }) - page.remove 首先尝试硬删除,如果FlutterFlow拒绝删除有效负载,则可以回退到归档模式。
- 验证/修复树完整性:
- orbit({ cmd:"tree.validate", args:{ nameOrId:"login" } }) - orbit({ cmd:"tree.repair", args:{ nameOrId:"login", fixOrphans:true, fixMissingNodes:true, apply:true } })
可选支持工具:
orbit_policy_getorbit_policy_set(禁用,除非ORBIT_ALLOW_POLICY_WRITE=1)orbit_export_changeset
快照工作流
orbit({cmd:"projects.list"})orbit({cmd:"snapshots.create", args:{projectId:"..."}})- 查询针对
snapshotID - 跑
snapshots.refresh在敏感的更改之前,以避免过时的决策(现在默认情况下被限制以减少429秒)
动态观察快照是时间点,可能已经过时。 当FlutterFlow返回时 versionInfo (partitionerVersion, projectSchemaFingerprint),Orbit会存储它并将其用于更智能的增量刷新决策。 如果FlutterFlow是限速刷新(429),首选预算爬网模式:
orbit({ cmd:"snapshots.refreshSlow", args:{ passes:4, pauseMs:15000, maxFetch:25, concurrency:1, sleepMs:250 } })orbit({ cmd:"snapshots.refresh", args:{ mode:"full", fetchStrategy:"bulk" } })用于低请求全同步尝试orbit({ cmd:"snapshots.refresh", args:{ mode:"full", fetchStrategy:"file", maxFetch:5, concurrency:1, sleepMs:1000 } })用于分块完全同步,无需重新列出每次通过(chunkedFull对于完整+文件,默认为true)
安全编辑工作流程
changeset.newchangeset.add(一个或多个补丁)changeset.preview(差异+风险)changeset.validate(YAML+结构+策略)changeset.apply随着confirm:true(包括远程validateProjectYaml推送前检查)
如果策略需要手动批准,则拒绝申请并返回手动有效载荷。
策略引擎
默认文件: orbit.policy.json
领域:
allowProjectsallowFileKeyPrefixesdenyFileKeyPrefixesmaxFilesPerApplymaxLinesChangedrequireManualApprovalallowPlatformConfigEditssafeMode:readOnly | guidedWrite | fullWrite
Env覆盖:
ORBIT_POLICY_ALLOW_PROJECTSORBIT_POLICY_ALLOW_FILE_PREFIXESORBIT_POLICY_DENY_FILE_PREFIXESORBIT_POLICY_MAX_FILES_PER_APPLYORBIT_POLICY_MAX_LINES_CHANGEDORBIT_POLICY_REQUIRE_MANUAL_APPROVALORBIT_POLICY_ALLOW_PLATFORM_CONFIG_EDITSORBIT_POLICY_SAFE_MODEORBIT_ALLOW_POLICY_WRITE=1(启用orbit_policy_set)
Fly.io部署
flyctl launch
flyctl secrets set FLUTTERFLOW_API_TOKEN=your_token_here
flyctl deployfly.toml 配置了自动挂起:
auto_start_machines = trueauto_stop_machines = "suspend"min_machines_running = 0
发展
npm run build
npm test
npm start安全说明
- 保持
FLUTTERFLOW_API_TOKEN仅在环境变量或秘密管理器中。 - 快照数据库可以包含完整的项目YAML,应将其视为敏感数据。
orbit.policy.json应该对代码进行审查,因为它控制着写入边界。- 内置只读防护功能,拒绝直接应用自定义代码并解锁
lib/main.dart.
FlutterFlow项目API覆盖率
Orbit通过适配器层支持所有当前记录的FlutterFlow项目API(v2):
POST/GET /l/listProjectsGET /listPartitionedFileNamesGET /projectYamls(包括projectYamlBytesbase64压缩解码)POST /validateProjectYamlPOST /updateProjectByYaml
