Token导航 LogoToken导航TokenDH.com
Flutterflow MCP logo
数据服务未说明官方级别未说明来源级核验

Flutterflow MCP

MCP Server

一个基于命令面板模型的FlutterFlow MCP服务器,提供SQLite快照缓存、策略引擎和事务性变更集流程,适用于FlutterFlow项目的开发和管理。

工具数

1

提示词数

0

GitHub Stars

10

资源数

0
TypeScriptClaude数据分析ClaudeCursor

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

作者 / 组织

jamesnocode

提供方

jamesnocode

最后核验

2026/5/17 20:21

快速接入

先看主来源和安装命令,再打开仓库或文档;下面只保留这个条目的关键接入事实。

详细介绍

扑动流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 i

2) 配置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=1000

3) 快跑

npm start

这将开始:

  • 通过stdio的MCP服务器
  • HTTP服务器已打开 http://localhost:8080

终点:

  • GET /health
  • GET /status
  • GET /policy

如果HTTP端口已在使用中,Orbit现在将继续使用MCP stdio并向stderr记录警告。 您可以通过以下方式完全禁用HTTP端点:

export ORBIT_HTTP_ENABLED=0

MCP客户端设置

使用 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 start

Codex(命令行界面/应用程序)

选项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_get
  • orbit_policy_set (禁用,除非 ORBIT_ALLOW_POLICY_WRITE=1)
  • orbit_export_changeset

快照工作流

  1. orbit({cmd:"projects.list"})
  2. orbit({cmd:"snapshots.create", args:{projectId:"..."}})
  3. 查询针对 snapshot ID
  4. 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)

安全编辑工作流程

  1. changeset.new
  2. changeset.add (一个或多个补丁)
  3. changeset.preview (差异+风险)
  4. changeset.validate (YAML+结构+策略)
  5. changeset.apply 随着 confirm:true (包括远程 validateProjectYaml 推送前检查)

如果策略需要手动批准,则拒绝申请并返回手动有效载荷。

策略引擎

默认文件: orbit.policy.json

领域:

  • allowProjects
  • allowFileKeyPrefixes
  • denyFileKeyPrefixes
  • maxFilesPerApply
  • maxLinesChanged
  • requireManualApproval
  • allowPlatformConfigEdits
  • safeMode: readOnly | guidedWrite | fullWrite

Env覆盖:

  • ORBIT_POLICY_ALLOW_PROJECTS
  • ORBIT_POLICY_ALLOW_FILE_PREFIXES
  • ORBIT_POLICY_DENY_FILE_PREFIXES
  • ORBIT_POLICY_MAX_FILES_PER_APPLY
  • ORBIT_POLICY_MAX_LINES_CHANGED
  • ORBIT_POLICY_REQUIRE_MANUAL_APPROVAL
  • ORBIT_POLICY_ALLOW_PLATFORM_CONFIG_EDITS
  • ORBIT_POLICY_SAFE_MODE
  • ORBIT_ALLOW_POLICY_WRITE=1 (启用 orbit_policy_set)

Fly.io部署

flyctl launch
flyctl secrets set FLUTTERFLOW_API_TOKEN=your_token_here
flyctl deploy

fly.toml 配置了自动挂起:

  • auto_start_machines = true
  • auto_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/listProjects
  • GET /listPartitionedFileNames
  • GET /projectYamls (包括 projectYamlBytes base64压缩解码)
  • POST /validateProjectYaml
  • POST /updateProjectByYaml

目录标签

目录标签

TypeScriptClaude数据分析FlutterFlow本地部署MCP服务器命令面板SQLite缓存策略引擎

支持客户端

ClaudeCursor

接入字段

传输方式(transport,传输协议)

未说明

鉴权方式(authType,认证方式)

session

工具数量(toolCount,工具数)

1

资源数量(resourceCount,资源数)

0

提示词数量(promptCount,提示词数)

0

权限和风险

未说明session部署方式未说明

接入前请确认传输方式、认证方式和部署位置,并根据实际工具能力限制访问范围。

安装前确认

不要直接授予不必要的文件、网络或账号权限;先核对安装命令和配置内容。

仍需确认:installCommand

来源信息

继续浏览同类 MCP