返回市场
流动-go

流动-go

作者:dshills2 星标更新:2025-11-18

项目介绍

GoFlow

基于模型上下文协议(MCP)服务器的可视化工作流编排工具

Go 版本 许可证 状态

GoFlow 允许开发者将多个 MCP 工具无缝链接成复杂的、可重用的工作流,包含条件逻辑、数据转换和并行执行等功能——所有这些都不需要编写代码。

功能

  • 🔗 可组合性:无缝链接来自多个 MCP 服务器的工具
  • ♻️ 可重用性:将工作流保存为 YAML 文件并在项目之间共享
  • 📊 可观察性:完整的执行历史记录及详细的调试工具
  • 🎨 视觉构建器:终端用户界面(TUI)用于交互式工作流设计
  • 🚀 不需要编码:简单的 YAML 语法或视觉构建器
  • 🔒 安全第一:凭据存储在系统密钥环中,不在工作流文件中
  • ⚡ 性能:通过连接池和并行处理实现高效执行

快速开始

安装

从源码构建(预发布版 - 尚无二进制文件)

git clone https://github.com/dshills/goflow.git
cd goflow
go build -o goflow ./cmd/goflow

# 可选:安装到系统路径
sudo mv goflow /usr/local/bin/

需求:Go 1.21 或更高版本

第一个工作流

创建一个简单的读取-转换-写入管道:

# 1. 注册一个 MCP 服务器
goflow server add filesystem npx -y @modelcontextprotocol/server-filesystem /tmp

# 2. 创建测试数据
echo '{"data": [{"price": 10.5}, {"price": 20.3}, {"price": 5.2}]}' > /tmp/input.json

# 3. 复制示例工作流
cp examples/simple-pipeline.yaml ~/.goflow/workflows/data-pipeline.yaml

# 4. 运行工作流
goflow run data-pipeline

# 5. 检查输出
cat /tmp/output.txt
# 输出:Total: 36.0

结果:GoFlow 读取了 JSON 文件,计算了价格总和(36.0),并将结果写入文本文件——这一切都是通过文件系统 MCP 服务器编排完成的!

GoFlow 是什么?

问题

模型上下文协议(MCP)服务器是强大的 AI 辅助开发工具,但它们独立运行。构建复杂自动化需要:

  • 手动链接工具调用
  • 编写胶水代码进行数据转换
  • 实现错误处理和重试机制
  • 管理服务器连接和状态

解决方案

GoFlow 提供:

  1. 视觉工作流构建器:使用终端用户界面设计工作流
  2. 声明式 YAML 语法:以代码形式定义工作流
  3. MCP 服务器编排:自动管理连接
  4. 数据转换:内置 JSONPath、jq 和模板表达式
  5. 高级控制流:条件分支、循环、并行执行
  6. 错误处理:配置重试策略和备用路径
  7. 执行历史:完整的审计跟踪和支持调试

核心概念

工作流

工作流是由节点和边组成的有向无环图(DAG)。每个节点执行特定操作,边定义执行顺序。

version: "1.0"
name: "my-workflow"
description: "此工作流的作用"

variables:
  - name: "input_file"
    type: "string"
    default: "/tmp/data.json"

servers:
  - id: "filesystem"
    command: "npx"
    args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]

nodes:
  - id: "start"
    type: "start"

  - id: "read"
    type: "mcp_tool"
    server: "filesystem"
    tool: "read_file"
    parameters:
      path: "${input_file}"
    output: "contents"

  - id: "end"
    type: "end"
    return: "${contents}"

edges:
  - from: "start"
    to: "read"
  - from: "read"
    to: "end"

节点类型

类型目的示例用例
start工作流入口点始终需要
end工作流出口点返回最终结果
mcp_tool调用 MCP 服务器工具读取文件,发起 API 调用
transform数据转换提取字段,计算值
condition条件分支根据数据路由
loop集合迭代处理多个项
parallel并发执行并行处理文件

变量

变量存储工作流状态并在节点间传递数据:

variables:
  - name: "threshold"
    type: "number"
    default: 100

nodes:
  - id: "check"
    type: "condition"
    condition: "${value} > ${threshold}"

服务器

MCP 服务器为工作流节点提供工具:

servers:
  - id: "filesystem"
    command: "npx"
    args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]

  - id: "http"
    command: "npx"
    args: ["-y", "@modelcontextprotocol/server-fetch"]

示例

简单管道

读取 JSON,转换数据,写入输出:

# 参见:examples/simple-pipeline.yaml
version: "1.0"
name: "data-pipeline"

nodes:
  - id: "read"
    type: "mcp_tool"
    tool: "read_file"
    output: "data"

  - id: "transform"
    type: "transform"
    input: "${data}"
    expression: "jq(.data | map(.price) | add)"
    output: "total"

  - id: "write"
    type: "mcp_tool"
    tool: "write_file"
    parameters:
      content: "Total: ${total}"

条件分支

根据数据路由执行:

# 参见:examples/conditional-workflow.yaml
nodes:
  - id: "check_size"
    type: "condition"
    condition: "${file_size} > 1000000"

edges:
  - from: "check_size"
    to: "compress"
    condition: "true"
    label: "大文件"

  - from: "check_size"
    to: "upload"
    condition: "false"
    label: "小文件"

错误处理

带有指数退避的重试:

# 参见:examples/error-handling.yaml
nodes:
  - id: "fetch_api"
    type: "mcp_tool"
    tool: "http_get"
    retry:
      max_attempts: 3
      backoff: "exponential"
      initial_delay: "1s"
      on: ["connection_error", "timeout"]

并行处理

并发处理多个项:

# 参见:examples/parallel-batch.yaml
nodes:
  - id: "process_batch"
    type: "parallel"
    branches:
      - ["read_file1", "transform1", "write1"]
      - ["read_file2", "transform2", "write2"]
      - ["read_file3", "transform3", "write3"]
    merge_strategy: "wait_all"
    max_parallel: 10

更多示例在 examples/ 目录中。

CLI 命令

工作流管理

# 初始化新工作流
goflow init <工作流名称>

# 验证工作流
goflow validate <工作流名称>

# 执行工作流
goflow run <工作流名称> [选项]

# 打开视觉编辑器
goflow edit <工作流名称>

# 列出所有工作流
goflow list

# 导出工作流(可分享)
goflow export <工作流名称>

# 导入工作流
goflow import <文件.yaml>

服务器管理

# 添加 MCP 服务器
goflow server add <服务器ID> <命令> [参数...]

# 列出已注册的服务器
goflow server list

# 测试服务器连接
goflow server test <服务器ID>

# 移除服务器
goflow server remove <服务器ID>

执行历史

# 列出执行
goflow executions [--workflow <名称>]

# 查看执行详情
goflow execution <执行ID>

# 查看执行日志
goflow logs <执行ID>

完整 CLI 参考:快速入门指南

视觉构建器(TUI)

启动交互式终端用户界面:

# 创建或编辑现有工作流
goflow edit <工作流名称>

# 从模板开始
goflow edit <工作流名称> --template etl

概览

视觉工作流编辑器是一个功能齐全的终端用户界面,用于无需编写 YAML 的工作流构建、编辑和验证。它提供了:

  • 视觉画布:节点放置,自动布局和手动定位
  • 节点调色板:6种节点类型,支持搜索过滤(MCP 工具、转换、条件、循环、并行、结束)
  • 属性编辑器:实时验证,带字段级错误消息
  • 验证面板:实时错误检测,导航至有问题的节点
  • 撤销/重做:所有操作的100级撤销堆栈
  • 画布导航:平移、缩放(0.5x到2.0x)、适应所有节点、重置视图
  • 键盘优先:30多种快捷键,类似 vim 的导航(hjkl)
  • 帮助系统:带 ? 键的上下文敏感帮助

构建工作流

1. 添加节点

a 打开节点调色板:

┌─── 添加节点 ────────────────────┐
│                                  │
│ 搜索: [_________________]        │
│                                  │
│ ► 🔧 MCP 工具                    │
│     执行 MCP 服务器工具          │
│                                  │
│   🔄 转换                        │
│     使用 JSONPath、模板或 jq 转换数据 │
│                                  │
│   ❓ 条件                        │
│     条件分支                    │
│                                  │
│ [Enter: 选择] [Esc: 取消]       │
└──────────────────────────────────┘
  • 使用 ↓↑jk 导航
  • 输入以过滤:"trans" → 显示转换
  • Enter 将节点添加到画布

2. 编辑节点属性

选择一个节点并按 e 编辑:

┌─── 编辑节点: tool-1 ───────────┐
│                                  │
│ ► 名称: [tool-1______________]  │
│   服务器ID: [filesystem_____]   │
│   工具名称: [read_file______]   │
│   路径: [/tmp/data.json______]  │
│                                  │
│ [Tab: 下一个] [Enter: 保存]     │
│ [Esc: 取消]                     │
└──────────────────────────────────┘
  • Tab/Shift+Tab 在字段间导航
  • 输入以编辑当前字段
  • 实时验证,带错误高亮显示
  • Enter 保存,Esc 取消

3. 连接节点

c 开始边创建模式:

  1. 选择源节点(箭头键高亮)
  2. Enter 确认源节点
  3. 选择目标节点
  4. Enter 创建边

画布会自动使用正交(曼哈顿)布局路由边。

4. 验证工作流

v 运行验证:

┌─── 验证错误 (2) ───────┐
│                                  │
│ ► ❌ 节点 'tool-1': 必填字段 '工具名称' 缺失 │
│                                  │
│   ⚠️ 节点 'transform-2': 未连接节点 │
│                                  │
│ [Enter: 导航] [Esc: 关闭]        │
└──────────────────────────────────┘
  • Enter 在错误上导航至有问题的节点
  • 错误(❌)阻止执行,警告(⚠️)仅提供信息

5. 保存工作流

s 将更改保存到磁盘。修改过的工作流会在状态栏显示 *

键盘快捷键参考

正常模式(默认)

节点操作

  • a:添加节点(打开调色板)
  • e:编辑所选节点属性
  • d:删除所选节点
  • c:创建边(连接节点)
  • x:删除所选边

画布导航

  • hjkl↑↓←→:平移画布(滚动)
  • +/=:放大
  • -:缩小
  • 0:重置缩放至 1.0x
  • f:适应所有节点
  • r:重置视图(中心于起始节点)

工作流操作

  • s:保存工作流
  • v:验证工作流
  • u:撤销上次操作
  • Ctrl+r:重做操作

视图切换

  • ?:切换帮助面板
  • V:切换验证面板(大写字母 V)

应用程序

  • q:退出(如有修改会提示)
  • Esc:取消当前操作

编辑模式(属性面板)

  • Tab:下一个字段
  • Shift+Tab:上一个字段
  • Enter:保存更改
  • Esc:取消编辑

调色板模式(节点选择)

  • ↓↑jk:导航节点类型
  • /:聚焦搜索字段
  • 输入:过滤节点类型
  • Enter:选择节点类型
  • Esc:取消

帮助模式(帮助面板)

  • ↓↑jk:滚动帮助文本
  • Esc?:关闭帮助

节点类型和配置

🔧 MCP 工具

执行已注册 MCP 服务器中的工具。

必填字段

  • 名称:节点标识符
  • 服务器ID:已注册的 MCP 服务器
  • 工具名称:要执行的工具
  • 工具特定参数

示例:从文件系统服务器读取文件

🔄 转换

使用 JSONPath、jq 样式或模板表达式转换数据。

必填字段

  • 名称:节点标识符
  • 类型jsonpathjqtemplate
  • 表达式:转换表达式
  • 输入:源变量
  • 输出:目标变量

示例:从 JSON 中提取电子邮件:$.user.email

❓ 条件

根据布尔表达式分支执行。

必填字段

  • 名称:节点标识符
  • 表达式:布尔条件(例如,${count > 10}

注意:条件节点必须有恰好两个出边(真/假路径)

🔁 循环

遍历集合。

必填字段

  • 名称:节点标识符
  • 集合:包含数组的变量(例如,${items}
  • 变量:循环变量名(例如,item

注意:循环体节点连接在一个子图中

⚡ 并行

并发执行多个分支。

必填字段

  • 名称:节点标识符
  • 分支数:并行分支数量
  • 合并策略wait_allwait_anyrace

🏁 结束

可选返回值的出口点。

必填字段

  • 名称:节点标识符
  • 输出:要返回的变量(可选)

画布布局

画布使用分层自动布局算法(Sugiyama 框架),在加载没有位置元数据的工作流时自动定位节点。

手动定位

  • 节点保存其位置
  • 平移以重新定位视口
  • 缩放以查看更多或聚焦细节

视觉反馈

  • 选中的节点:高亮边框
  • 验证错误:红色边框和 ❌ 图标
  • 验证警告:黄色边框和 ⚠️ 图标
  • :正交路由(水平 → 垂直 → 水平)

验证规则

编辑器实时验证工作流:

  1. 结构

    • 无循环依赖(阻止循环)
    • 所有节点均可从起始节点到达
    • 所有边指向有效节点
  2. 节点特定

    • 填充必填字段
    • 有效的表达式语法
    • 有效的