概述
MPE Flow 是一款高性能跨协议工作流编排与执行引擎。通过单一可执行文件,即可无缝运行桌面端图形界面 (GUI) 或独立无头命令行工具 (CLI)。
单二进制,双运行模式
- 无启动参数 → 启动 Tauri 桌面端图形化界面
- 携带命令行参数 → 进入无头高并发 CLI 执行模式
在 Linux 平台上,同时支持原生桌面端图形化界面(.deb / .AppImage)与轻量免依赖纯 CLI 二进制。
MPE Flow 是一款高性能跨协议工作流编排与执行引擎。通过单一可执行文件,即可无缝运行桌面端图形界面 (GUI) 或独立无头命令行工具 (CLI)。
在 Linux 平台上,同时支持原生桌面端图形化界面(.deb / .AppImage)与轻量免依赖纯 CLI 二进制。
前往 更新日志 页面下载 Windows 平台安装包(.exe 安装程序或免安装版),双击即可完成安装。
前往 更新日志 页面下载 macOS 的 Universal DMG 镜像包(单个安装包已同时原生适配 Apple Silicon M 系列芯片与 Intel 芯片机型)。双击打开 DMG 文件后,将 MPE 图标拖入 Applications(应用程序) 文件夹即可。
原因告知:由于当前项目为开源阶段,发布版本尚未购买并配置昂贵的 Apple 商业开发者证书公证(Apple Notarization)。macOS 系统的 Gatekeeper 安全机制在首次运行未签名应用时,会拦截并弹出安全警示:“无法打开 MPE,因为 Apple 无法检查其是否包含恶意软件” 或 “MPE 已损坏,您应该将它移到废纸篓”。这是 macOS 对未签名软件的默认安全拦截策略,软件源码完全公开、无毒安全,请放心使用。
遇到拦截提示时,只需通过以下任一方式解除隔离,后续即可正常双击启动:
方式一:终端命令一键解除隔离属性(推荐,彻底解决“损坏”提示)
将 MPE 拖入“应用程序”文件夹后,打开系统自带的“终端 (Terminal)”,粘贴并执行以下命令:
xattr -cr /Applications/MPE.app
执行完成后,再次在“启动台”或“访达”中直接双击 MPE.app 即可直接运行,此后系统将永久信任并正常打开。
方式二:通过访达右键强制打开
Control 键不放,同时使用鼠标右键点击(或触控板双指轻点)MPE 图标,在弹出的上下文菜单中点击“打开 (Open)”。MPE Flow 为 Linux 平台同时提供了原生桌面端 GUI 安装包与轻量独立无头 CLI 二进制:
前往 更新日志 页面下载 .deb 包并通过 dpkg 安装:
sudo dpkg -i mpe_*_amd64.deb || sudo apt-get install -f
下载便携 .AppImage 包,赋予可执行权限后直接双击或终端运行:
chmod +x MPE_*.AppImage
./MPE_*.AppImage
适用于 Docker 容器、无头服务器与 CI/CD 流水线环境:
# 下载并解压 CLI
curl -LO https://download.mpe.run/releases/latest/mpe-vX.Y.Z-linux-x86_64.tar.gz
tar xzf mpe-vX.Y.Z-linux-x86_64.tar.gz
# 赋予执行权限并移入 PATH
chmod +x mpe
sudo mv mpe /usr/local/bin/
# 验证安装
mpe --help
创建一个工作流文件 hello.mpf(默认采用简洁直观的 YAML 格式):
_version: 1
flow:
uuid: example-flow
name: Hello World
nodes:
- uuid: entry-1
type: entry
name: Start
data:
type: entry
- uuid: http-1
type: http:request
name: Fetch Data
data:
type: http:request
url: https://httpbin.org/get
method: get
- uuid: end-1
type: end
name: End
data:
type: end
connections:
- id: conn-1
source_node_uuid: entry-1
target_node_uuid: http-1
source_port_id: out
target_port_id: in
- id: conn-2
source_node_uuid: http-1
target_node_uuid: end-1
source_port_id: "true"
target_port_id: in
运行工作流:
mpe run -f hello.mpf
自 v0.3.0 起,MPE 流程文件(.mpf)默认采用 YAML 格式存储,带来清晰的 Git 差异与多行脚本编写体验。底层引擎、CLI、桌面端与在线 Playground 均原生自适应解析 YAML 与历史 JSON 格式。您可以通过 mpe flow fmt 随时在两种格式间转换或格式化。
MPE Flow 原生内置了深度集成的全域 AI 流程编排架构师(Agentic AI Copilot),具备自然语言工作流生成、自主推进「执行到底」、自适应折行排版优化与一键报错智能自愈等全套智能体能力。
内置 AI 助手支持连接任意兼容 OpenAI 协议的大模型服务(包括 DeepSeek、OpenAI、Claude、Kimi、通义千问等,或通过 Ollama / vLLM 本地离线私有化部署的模型)。所有工作流、Token 和测试数据完全留存在本地设备,无强制云端同步或账户锁定。
前往系统设置 全局设置 → AI 助手 即可添加与管理模型服务商:
http://localhost:11434/v1)。deepseek-chat、deepseek-reasoner、gpt-4o、claude-3-5-sonnet)。MPE Flow 提供了四种无缝衔接的 AI 助手交互入口:
| 交互形态 | 快捷键 / 触发方式 | 功能说明 |
|---|---|---|
| 右侧 Copilot 侧边栏 | Ctrl+I / Cmd+I | 内置多会话管理、历史记录持久化、模型实时切换与上下文感知对话。 |
| 脱离吸附 (浮动窗口) | 按住顶部拖拽 / 点击脱离按钮 | 将 Copilot 变为独立可拖拽移动的浮动窗口,适合多显示器编程。拖回右侧边缘即可一键重新吸附。 |
| Spotlight 快捷指令 | Ctrl+K / Cmd+K | 居中唤起全局指令弹窗,无需展开侧边栏即可通过自然语言一键生成流程、排版或调试。 |
| CLI AI 双向桥接 | mpe ai "<指令>" |
在终端直接向 AI 助手下发指令,自动联动正在运行的 GUI 界面或在无头模式下执行。 |
AI Copilot 不仅能回答文本,更通过强类型 Tool Calling 直接操控图形化画布:
batch_create_pipeline 能力,一条指令即可原子化创建多节点复合流转拓扑并自动建立端口连线。面向复杂的多步验证与探索性编排场景:
batch_create_pipeline 默认 auto_run: true),自动触发执行并采集报告,确保交付即验证通过。aiMaxIterations): 在 AI 设置中支持配置 ReAct 最大推理轮次(5~100 轮,默认 20,提供 10、20、40、60 快捷预设)。当复杂任务达到轮次上限时,AI 优雅暂停并给出友好的后续操作指引。<think> 标签,提供可折叠展开的推理思考过程展示。当协议节点执行遇到异常(HTTP 500、WebSocket 握手超时、断言失败等):
点击 关联本地项目,将工作流与本地源码工程建立连接:
MPE Flow 为全域 AI 助手配备了高频键盘快捷指令与人机协同工具桥接:
/): 在聊天输入框中输入 / 即可呼出自动补全悬浮面板:
/fix — 一键深度诊断并修复当前选中节点或最近失败节点的配置报错。/explain — 剖析当前激活工作流的拓扑结构、变量流转与业务链路。/test — 根据上游协议返回的数据特征,智能生成断言节点与边界用例。ask_user): 当大模型需要用户决策(如选取鉴权范围、确认环境地址、选择替代分支方案)时,自动生成交互式单选/多选或表单卡片,支持可选空提交,并安全挂起工具执行循环,等待用户点击提交后继续推进。Ctrl+K / Cmd+K) 中直接即时切换当前模型。terminal_exec): AI 可在关联的工作区中执行经白名单严格校验的系统命令(如 git status、npm test、cargo check),高危操作强制触发卡片二次确认。| 命令 | 说明 | 示例 |
|---|---|---|
mpe run |
执行工作流文件 (.mpf),支持指定激活环境与运行时变量覆盖 | mpe run -f flow.mpf -e staging --var TIMEOUT=5000 |
mpe validate |
校验工作流结构(不执行) | mpe validate -f flow.mpf |
mpe debug |
单步调试输出(NDJSON 协议),自动带入激活环境 | mpe debug -f flow.mpf -e dev |
mpe stress |
运行多协议压力测试,支持环境解析 | mpe stress run -f flow.mpf -e staging -u 50 -r 10 |
mpe env |
全局环境文件管理(list, show, set, delete) | mpe env list --format table |
mpe flow |
工作流管理与格式化(list, show, create, delete, fmt) | mpe flow fmt -f flow.mpf --to yaml |
mpe report |
报告管理(list, show, delete) | mpe report list |
mpe run-node |
单节点协议连通性验证 | mpe run-node '{"type":"redis:connect","host":"127.0.0.1","port":6379}' |
mpe serve |
启动常驻 Ingress Webhook 模拟网关守护进程,Tokio 高并发派发与平滑停机 | mpe serve -f ingress_flow.mpf -p 9527 |
mpe mcp serve |
将工作流作为原生 MCP Server 发布(9528 共享网关或按流隔离路由) | mpe mcp serve -f flow.mpf --transport stdio |
mpe flow convert |
在声明式 YAML DSL 与标准 .mpf 格式之间双向无损互转 | mpe flow convert flow.mpf flow.yaml |
mpe plugin |
插件管理(dir, list, install) | mpe plugin list |
mpe ai |
终端驱动或对话 AI Copilot(与 GUI 双向联动或无头运行) | mpe ai "创建一个登录并提取 Token 的工作流" |
mpe open |
在运行中的桌面 GUI 应用中打开指定工作流文件 | mpe open flow.mpf |
# 查看所有命令
mpe --help
# 指定激活环境、输出 Markdown 摘要与导出独立离线 HTML 测试报告
mpe run -f flow.mpf -e staging --summary summary.md --export-html report.html
# 启动常驻 Ingress 模拟服务网关
mpe serve -f webhook_mock.mpf -p 9527
# 通过 stdio 发布原生 MCP 工具供 Claude Desktop 或 Cursor 调用
mpe mcp serve -f search_tool.mpf --transport stdio
# 在声明式精简 YAML 与标准 .mpf 文件之间双向互转
mpe flow convert flow.mpf declarative.yaml
mpe flow convert declarative.yaml flow.mpf
# 全局环境文件管理
mpe env list --format table
mpe env show staging --source merged
mpe env set staging API_BASE=https://api.staging.com --local
mpe env delete staging --local
# 格式化流程文件或在 YAML 与 JSON 之间转换
mpe flow fmt ./flows/hello.mpf --to yaml
mpe flow fmt --all --to yaml
# 查看特定命令帮助
mpe run --help
mpe serve --help
mpe mcp serve --help
mpe env --help
mpe run 提供完善的 CI/CD 原生支持,具备规范化退出码、生命周期三阶段对齐的 JUnit XML 测试套件({flow} :: Setup、{flow} :: Main、{flow} :: Teardown)、自动生成 GitHub Actions Step Summary Markdown 摘要,以及独立交互式 HTML 报告导出。
# 导出 JUnit XML 并自动写入 GitHub Actions Step Summary
mpe run -f flow.mpf -e staging \
--report junit --report-file results.xml \
--summary "$GITHUB_STEP_SUMMARY" \
--export-html report.html
在仓库中添加工作流步骤,通过 dorny/test-reporter 在 Pull Request 中自动执行工作流并展示测试报告:
name: Flow Tests
on:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run MPE flows
run: |
mpe run -f tests/flows/api-smoke.mpf \
--report junit --report-file results.xml \
--summary "$GITHUB_STEP_SUMMARY" \
--export-html report.html
- name: Publish test report
if: always()
uses: dorny/test-reporter@v1
with:
name: MPE Flow Results
path: results.xml
reporter: java-junit
fail-on-error: 'true'
JUnit XML 报告将每个工作流按 Setup、Main 与 Teardown 三个阶段独立划分 <testsuite>,节点报错输出与失败快照直接嵌入在 failure 追踪中,便于在 CI 页面直观排查。
CLI 命令执行时默认向标准输出 (stdout) 输出规范的 JSON 结构体:
{
"success": true,
"data": null,
"error": null,
"execution_time": 156,
"node_reports": [
{
"node_uuid": "entry-001",
"node_type": "entry",
"node_name": "Start",
"status": "success",
"duration_ms": 1,
"used_port_id": "out"
},
{
"node_uuid": "http-001",
"node_type": "http:request",
"node_name": "Fetch Data",
"status": "success",
"duration_ms": 233,
"output_data": {
"success": true,
"status": 200,
"body": { ... },
"headers": { ... }
}
}
],
"flow_report": {
"flow_name": "Hello World",
"total_nodes": 3,
"executed_count": 3,
"status": "success",
"duration_ms": 234
}
}
| 状态码 | 含义说明 |
|---|---|
0 |
执行成功 (Success):所有执行节点与断言均顺利通过 |
1 |
用例失败 (Test Failure):一个或多个协议节点执行异常或断言未通过 |
2 |
配置错误 (Config Error):命令行参数非法、流程文件不存在或 YAML/JSON 校验失败 |
3 |
基础设施错误 (Infra Failure):网络不可达、端口连接被拒或执行步骤超时 |
MPE 流程文件采用 .mpf 扩展名,遵循 FlowFile 统一包装格式。流程文件默认采用 YAML 格式持久化(同时保持对历史 JSON 文件的无缝向下兼容):
_version: 1
flow:
uuid: my-flow
name: My Flow
initial_variables:
api_base: https://api.example.com
token: abc123
nodes:
# 节点列表数组 ...
connections:
# 连线列表数组 ...
| Field | Type | Required | Description |
|---|---|---|---|
_version |
number | No | File format version (default: 1) |
flow |
object | Yes | Flow data container |
| Field | Type | Required | Description |
|---|---|---|---|
uuid |
string | Yes | Unique flow identifier |
name |
string | Yes | Human-readable flow name |
initial_variables |
object | No | 工作流自身内置的兜底变量(通过 {{key}} 插值)。作为四级级联解析中的兜底层。 |
nodes |
array | Yes | 属于 Main 业务核心阶段的节点列表 |
connections |
array | Yes | Main 阶段节点之间的有向连线集合 |
setup |
object | No | 可选的 FlowSubGraph 子图({ nodes: [], connections: [] }),在测试前单次执行,导出的变量直接注入 Main 阶段。 |
teardown |
object | No | 可选的 FlowSubGraph 子图,在测试后单次执行(用于告警通知与清理),注入只读保留变量 $report。 |
环境变量集已不再内嵌保存在 .mpf 流程文件中,而是作为独立的 YAML 文件存储在 <flows_dir>/environments/ 目录下(如 dev.yaml、staging.yaml、prod.yaml),支持跨所有流程全局共享。历史旧流程文件中内嵌的环境配置在加载时会自动忽略,请通过环境管理器或 mpe env 命令重新创建。
uuid: node-uuid
type: http:request
name: My HTTP Request
data:
type: http:request
url: https://api.example.com
method: get
| Field | Type | Required | Description |
|---|---|---|---|
uuid |
string | Yes | Unique node identifier |
type |
string | Yes | Node type (e.g. http, entry) |
name |
string | Yes | Display name |
data |
object | Yes | Node configuration. Must include "type" matching the node type |
on_error |
string | No | Error strategy: "route_to_false" (default), "ignore", "abort_flow" |
每个节点的 data 对象内部必须显式包含 "type": "<node_type>" 以便 Rust 核心引擎正确反序列化,其取值必须与节点顶层的 type 字段完全保持一致。
连线定义了工作流节点之间的有向执行流向与数据传递拓扑。
id: conn-1
source_node_uuid: entry-1
target_node_uuid: http-1
source_port_id: out
target_port_id: in
| 字段 | 说明 |
|---|---|
source_node_uuid |
源节点的 UUID |
target_node_uuid |
目标节点的 UUID |
source_port_id |
源节点输出端口:out(单输出端口)、true/false(双分支端口) |
target_port_id |
所有节点的输入端口统一必须为 "in" |
target_port_id 必须是 "in"(而非 "input")true/false)的节点,建议同时连接两条分支连线,避免某分支无连线导致意外终止流程entry 只有 out 输出端口,end 只有 in 输入端口无输出端口| 节点类型 (Node Type) | 输入端口 (Input) | 输出端口 (Output) |
|---|---|---|
entry | 无 | out |
end | in | 无 |
http:request | in | true / false |
http:ingress | in(可选触发) | out |
http:respond | in | out |
conditional | in | true / false |
script | in | true / false |
assertion | in | true / false |
variable:extractor | in | out |
flow:sub (Subflow) | in | true / false |
ws:*, tcp:*, udp:*, sse:connect/listen, graphql:* | in | true / false |
sse:disconnect, graphql:disconnect, proxy | in | out |
{{var}} 插值语法只能读取工作流变量池中的变量。协议节点的直接输出独立缓存在 last_node_output 中,默认不会自动写入变量池。
如需在后续节点中通过 {{var}} 引用上一步的输出数据,请先通过 variable:extractor 变量提取节点或 script 脚本节点提取到变量池。
| 插值语法 | 说明 |
|---|---|
{{variable_name}} |
引用变量池中的指定变量 |
{{obj.field}} |
通过点号语法访问嵌套 JSON 对象的内部字段 |
flow.initial_variables 中定义variable:extractor 配合 JSONPath 从 last_node_output 提取script 节点中使用 fn.variables.set(name, value)// variable:extractor example
{
"type": "variable:extractor",
"data": {
"type": "variable:extractor",
"output_mappings": [
{ "source": "$.body.id", "target": "user_id" },
{ "source": "$.status", "target": "http_status" }
]
}
}
// Later use: {{user_id}}, {{http_status}}
MPE Flow 深度内置了一系列免声明的动态变量,在每个步骤执行时实时计算取值:
| 动态变量 | 说明 | 取值示例 |
|---|---|---|
{{$timestamp}} |
当前 Unix 毫秒时间戳 | 1772867200123 |
{{$isoTimestamp}} |
ISO 8601 UTC 格式当前标准时间 | 2026-09-07T12:00:00.000Z |
{{$guid}} / {{$uuid}} |
随机生成的 UUID v4 唯一标识 | a3f89021-4b12-42fe-b58f-287517c2f829 |
{{$randomInt}} |
随机 6 位正整数 (0-999999) | 482103 |
{{$randomAlphaNumeric}} |
随机 8 位大小写字母与数字组合字符串 | k9X2mQ8L |
conditional and assertion nodes read directly from last_node_output:
| Node | Path Format | Example |
|---|---|---|
conditional.field_path |
Plain name, {{var}}, or $.path |
status, $.body.id |
assertion.target |
JSONPath with $. prefix (required) |
$.status, $.body.data.id |
{{obj.field.subfield}}{{items[0]}}{{func()}}MPE Flow 将环境配置从工作流文件中彻底解耦。环境定义作为独立的 YAML 文件存储在 <flows_dir>/environments/ 目录下(默认位于 ~/.app/flows/environments/,亦可通过 MPE_ENVIRONMENTS_DIR 环境变量覆盖),支持在所有工作流之间全局复用 dev、staging、prod 等多套环境变量集。
每个环境均支持双文件设计,天然兼顾团队协同共享与个人本地敏感机密隔离:
<name>.yaml): 存储团队通用配置(如服务域名、公共端口、公共超时策略等),直接随工作流一同提交入库 Git。<name>.local.yaml): 在本地机器上无缝覆盖共享文件中的同名变量,专用于存放开发者个人 API Token、数据库密码与私钥。建议在 .gitignore 中添加 *.local.yaml,彻底杜绝机密误入代码仓库。# <flows_dir>/environments/staging.yaml(团队共享,提交入库 Git)
name: staging
description: 测试环境配置
variables:
API_URL: https://staging-api.example.com
TIMEOUT_MS: 5000
MOCK_MODE: false
# <flows_dir>/environments/staging.local.yaml(个人本地私有,加入 .gitignore)
name: staging
variables:
AUTH_TOKEN: dev_secret_bearer_token_xyz987
CLIENT_SECRET: sk_staging_99214a8f
在单次执行、单步调试或并发压测工作流时,变量将严格按照以下四级优先级进行级联解析与合并:
| 优先级 | 变量层级 | 作用域与来源 | 典型应用场景 |
|---|---|---|---|
| 1 (最低) | 流程兜底变量 (Flow Fallback) | .mpf 流程内的 flow.initial_variables |
工作流自身内置的缺省变量,保证脱离全局环境时流程依然可自包含运行。 |
| 2 | 共享环境文件 | 环境目录下的 <name>.yaml |
团队共享的全局环境地址、公共超时阈值与通用开关配置。 |
| 3 | 本地私有覆盖 | 环境目录下的 <name>.local.yaml |
当前开发机私有的密码、测试账号凭据或本地代理配置。 |
| 4 (最高) | 运行时参数覆盖 | CLI --var KEY=VALUE 或运行入参 |
CI/CD 动态临时注入的构建流水线号、单次测试参数或运行时环境变量。 |
级联合并后的变量统一通过裸键语法读取:{{API_URL}} 或嵌套字段 {{USER.id}}。请勿添加 env. 前缀(如 {{env.API_URL}} 属于无效语法,引擎将提示找不到该变量)。
flow.initial_variables,生成自包含的单文件。内置凭据安全扫描,自动检测 key、secret、token、password、auth、cred、cert、private 等敏感关键字并提示清除,避免密钥外泄。环境目录默认跟随流程目录派生(<flows_dir>/environments),支持通过以下方式灵活自定义:
environmentsDir)。MPE_ENVIRONMENTS_DIR=/path/to/environments。config.toml(位于 $MPE_CONFIG 或系统数据目录)中设置 storage.environments_dir。mpe env)在无头 CI/CD 服务器或脚本中,可直接通过 mpe env 子命令全功能管理环境文件:
# 列出所有环境(名称、变量数、是否存在本地私有覆盖、文件路径)
mpe env list --format table
# 查看指定环境变量(支持查看 merged 合并层、base 共享层或 local 本地层)
mpe env show staging --source merged
mpe env show staging --source base
mpe env show staging --source local
# 向团队共享环境写入变量
mpe env set staging API_URL=https://staging.example.com TIMEOUT_MS=6000
# 向本地私有覆盖层写入敏感机密(保存至 .local.yaml)
mpe env set staging AUTH_TOKEN=secret_token_12345 --local
# 删除指定环境的本地覆盖层或完整删除环境
mpe env delete staging --local
mpe env delete staging
在 mpe run、mpe debug 或 mpe stress run 中通过 -e, --env <NAME> 指定环境:
# 指定 staging 环境执行流程
mpe run -f flows/checkout.mpf -e staging
# 指定环境并附加运行时变量临时覆盖
mpe run -f flows/checkout.mpf -e staging --var TIMEOUT_MS=10000 --var NOTIFY=true
# 指定 staging 环境进行压力测试
mpe stress run -f flows/checkout.mpf -e staging -u 100 -r 15
MPE Flow 将工作流执行模型升级为原生的一等公民生命周期三阶段架构。告别了脆弱、难以排查的回调函数机制,每个阶段均是完整的可视化多协议画布子图,无缝兼容所有协议节点:
在 0.5.0-beta 版本中,传统的流程 Hook 机制(EntryConfig.hooks)已被彻底移除。取而代之的是功能强大、可视化可编排的 Teardown 后置阶段。支持在测试结束后使用真实的协议节点(HTTP、脚本、断言、数据库操作)执行告警与清理,具备完整的连线路由、变量插值与断点调试能力。
| 阶段名称 | 对应字段 | 执行频次与场景 | 核心职责与变量流转 |
|---|---|---|---|
| Setup (前置预热) | flow.setup |
运行前单次执行 | 登录认证预热、Token 获取、测试数据集初始化与测试环境预校验。Setup 节点中导出的所有变量会自动合并注入 Main 业务阶段的变量上下文。 |
| Main (核心业务) | flow.nodes / flow.connections |
单次运行 / 压测并发循环 / 数据集逐行消费 | 被测试的核心业务拓扑图。在阶梯高并发压测 (mpe stress run) 时,仅在各虚拟用户间并发循环 Main 阶段节点,Setup 与 Teardown 仅在加压前后单次执行,确保 QPS/P99 指标纯净。 |
| Teardown (后置清理) | flow.teardown |
运行后单次执行(无论成败) | 飞书/企业微信/Slack/邮件告警推送、临时脏数据与测试会话清理。继承 Main 阶段所有变量,并注入只读保留变量 $report。 |
$report 报告变量Teardown 阶段在启动时会自动注入代表 Main 核心业务执行结果的保留变量 $report,可在节点配置或脚本中直接读取:
{{$report.status}} — Main 阶段执行状态("success"、"failed"、"cancelled")。{{$report.duration_ms}} — 核心业务流程的实际执行耗时(毫秒)。{{$report.node_reports}} — 各节点执行明细、输出数据、状态码与断言判定结果列表。# 示例:在 Teardown 的 HTTP 节点中向群机器人发送自动化测试汇总卡片
{
"msg_type": "text",
"content": {
"text": "【API 自动化测试报告】状态: {{$report.status}}, 核心链路耗时: {{$report.duration_ms}}ms"
}
}
false 端口,系统将跳过 Main 阶段(标记为 stages.main.status == "skipped"),但依然会执行 Teardown 阶段清理已申请的前置资源。stages.main.status 保持 "success" — 严格区分业务功能正确性与基础设施清理偶发故障。(y, x) 坐标自上而下、从左向右确定性执行,彻底杜绝 JSON 数组乱序执行隐患。画布左上方常驻紧凑的阶段切换胶囊栏(Setup | Main | Teardown),悬停即可查看各阶段说明。添加、连线、删除节点以及撤销/重做操作均严格隔离在当前活跃阶段内。
工作流各阶段的起始触发点,单图画布中必须且只能存在一个有效 Entry 节点(支持画布调色板便捷添加,具备防重复唯一性保护)。
{
"uuid": "entry-1",
"type": "entry",
"name": "开始",
"data": { "type": "entry" }
}
工作流终端节点。当执行流推进至 end 节点时,当前阶段正常终止。
{
"uuid": "end-1",
"type": "end",
"name": "结束",
"data": { "type": "end" }
}
子流程节点支持将其他独立工作流(.mpf 文件或工作区已存流程)作为模块化子节点嵌入到当前流程中,实现高内聚、可复用的复杂业务流编排。
支持直接从左侧侧边栏流程列表拖拽任意流程文件到画布中央,系统将自动创建并绑定该流程的子流程节点。双击子流程节点或在配置面板中点击“打开流程”,将在顶部多标签栏 (FlowTabBar) 中以独立标签打开目标子流程,便于即时查看与编辑,同时保留当前父流程的草稿与调试状态。
{
"uuid": "subflow-1",
"type": "flow:sub",
"name": "用户登录与鉴权子流程",
"data": {
"type": "flow:sub",
"target_flow_id": "7b6c3d9a-1234-5678-abcd-ef0123456789",
"target_flow_path": "./subflows/auth.mpf",
"inherit_all_variables": true,
"variable_mappings": [
{ "source": "parent_username", "target": "login_user" },
{ "source": "parent_password", "target": "login_pass" }
],
"export_all_variables": true,
"output_mappings": [
{ "source": "access_token", "target": "auth_token" }
]
}
}
| 参数字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
target_flow_id | string (可选) | null | 工作区中已保存流程的 UUID(桌面端 GUI 模式下引用)。 |
target_flow_path | string (可选) | null | 目标 .mpf、.yaml 或 .json 流程文件的相对或绝对路径(跨环境迁移与 CLI 模式引用)。 |
inherit_all_variables | boolean | true | 是否自动将父流程上下文中的所有变量继承给子流程。 |
variable_mappings | array | [] | 显式入参映射规则(source 父变量名/表达式 → target 子流程变量名),优先级高于自动继承。 |
export_all_variables | boolean | true | 子流程执行完毕后,是否将子流程产生的所有变量自动回传合并至父流程变量池。 |
output_mappings | array | [] | 显式出参回传规则(source 子流程变量名 → target 父流程变量名),用于精准控制回传命名。 |
MPE Flow 内置静态代码与变量流转推断分析引擎。配置面板能够深度解析目标子流程结构,预先推断出其内部提取并导出的变量清单(如 variable:extractor 或 script 导出的变量),在子流程面板中直接呈现「预期导出变量预览」,支持一键复制变量名,并在下游节点引用时智能弱化未声明告警提示。
MPE Flow 的 DAG 编译器在预检阶段即对子流程依赖图执行拓扑排序与环路检测。若存在直接自引用(A → A)或相互间接循环调用(A → B → A),校验器将立即拦截并给出明确的环路路径报错,彻底防止无限递归死锁。
子流程执行完毕后,其内部所有节点的执行耗时、状态、输入输出及断言指标均完整保存在层级化的执行报告树中,可在执行历史面板中层层展开深入溯源。
发送高吞吐 HTTP/HTTPS 网络请求,支持 GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS 等全套标准方法。
{
"uuid": "http-1",
"type": "http:request",
"name": "用户登录接口",
"data": {
"type": "http:request",
"url": "{{api_base}}/api/v1/auth/login",
"method": "post",
"headers": {
"Authorization": "Bearer {{token}}"
},
"body_type": "body",
"content_type": "json",
"body": "{\"username\": \"admin\", \"password\": \"{{password}}\"}",
"timeout_ms": 30000
}
}
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
url |
string | — | 目标请求地址,全面支持 {{var}} 变量动态插值 |
method |
string | get |
HTTP 方法(大小写不敏感) |
headers |
object | {} |
请求头键值对映射表,支持环境变量注入 |
body_type |
string | none |
请求体格式:none / body (文本/JSON) / form-data / x-www-form-urlencoded / binary |
content_type |
string | json |
内容类型提示:json / text / html / xml |
timeout_ms |
number | 30000 |
超时毫秒数 (支持 1000–300000ms) |
{
"success": true,
"status": 200,
"body": { "id": 1, "token": "eyJhbGciOi..." },
"headers": { "content-type": "application/json" },
"timing": { "connect_ms": 45, "total_ms": 150 }
}
MPE Flow 支持在工作流内直接启动轻量级内嵌 HTTP 服务端监听,无需启动独立的 Express/Nginx 即可完成 Webhook 触发、异步回调与接口 Mock 仿真验证。
http:ingress 节点在指定端口上启动监听,负责捕获外部推送的 Webhook 请求或客户端调用。执行器与调试引擎会自动将其作为起始根节点优先触发。
uuid: ingress-1
type: http:ingress
name: 订单 Webhook 接收器
data:
type: http:ingress
port: 8080
path: /api/v1/webhook/order
method: post
timeout_ms: 30000
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
port | number | 8080 | 本地监听绑定的 TCP 端口 |
path | string | / | 匹配的 URL 路由路径(如 /api/webhook) |
method | string | any | 期待的 HTTP 请求方法(get、post、put、delete、any) |
timeout_ms | number | 30000 | 等待接收请求的最大超时时间(毫秒) |
{{request_body}} — 外部客户端发来的 JSON 或原始请求体文本。{{headers}} — 请求头映射(如 x-hub-signature-256、authorization)。{{query}} — URL Query 查询参数键值对。{{connection_id}} — 本次 HTTP 连接上下文 ID(供下游 http:respond 关联回包)。http:respond 节点与 http:ingress 节点配合使用,通过 connection_id 将自定义的状态码、响应头与响应体回写给外部客户端。
uuid: respond-1
type: http:respond
name: 确认回调成功
data:
type: http:respond
connection_id: "{{connection_id}}"
status_code: 200
headers:
Content-Type: application/json
body: '{"code": 0, "msg": "Webhook received successfully", "order_id": "{{order_id}}"}'
根据预设规则或动态表达式判定执行分支,将流程路由至 true 或 false 输出端口。
{
"uuid": "cond-1",
"type": "conditional",
"name": "校验 HTTP 状态码",
"data": {
"type": "conditional",
"condition_type": "simple",
"field_path": "status",
"operator": "equal",
"expected_value": 200
}
}
{
"data": {
"type": "conditional",
"condition_type": "advanced",
"advanced_expression": "status >= 200 && status < 300"
}
}
| 操作符 | 说明 |
|---|---|
equal | 等于 |
not_equal | 不等于 |
greater | 大于 |
greater_or_equal | 大于等于 |
less | 小于 |
less_or_equal | 小于等于 |
contains | 包含子字符串 |
starts_with | 以此开头 |
ends_with | 以此结尾 |
exists | 字段存在 |
在高性能轻量级 QuickJS 安全沙箱运行时中执行 JavaScript 代码(支持完整 ES2020 语法标准)。
{
"uuid": "script-1",
"type": "script",
"name": "处理业务数据",
"data": {
"type": "script",
"script": "const data = JSON.parse(fn.response.raw); fn.variables.set('user_id', data.body.id);",
"timeout_ms": 5000
}
}
| API 方法 / 属性 | 说明 |
|---|---|
fn.variables.get(name) | 从当前流程变量池中读取变量 |
fn.variables.set(name, value) | 向当前流程变量池中写入变量(自动传递给下游) |
fn.response.raw | 上游节点完整原始响应内容(JSON 序列化字符串) |
fn.response.code | 上游 HTTP 状态码(仅 HTTP 节点生效) |
fn.console.log(msg) | 向执行详情面板的日志控制台输出运行日志 |
fn.flow.stop(reason) | 正常终止流程执行 |
fn.flow.abort(reason) | 异常中止流程执行 |
fn.util.encodeBase64(str) | Base64 字符串编码 |
fn.util.md5(str) | 计算 MD5 哈希摘要 |
fn.util.sha256(str) | 计算 SHA-256 哈希摘要 |
fn.util.uuid() | 生成标准 UUID v4 字符串 |
fn.util.sleep(ms) | 挂起当前执行指定毫秒数 |
校验上游数据是否符合业务预期,生成包含实际值、期望值与判定耗时的结构化测试报告。
{
"uuid": "assert-1",
"type": "assertion",
"name": "校验接口返回",
"data": {
"type": "assertion",
"mode": "all",
"assertions": [
{ "id": "a1", "description": "状态码为 200", "target": "$.status", "operator": "eq", "expected": 200 },
{ "id": "a2", "description": "包含业务数据", "target": "$.body.data", "operator": "exists" }
]
}
}
| 类别 | 支持的操作符 |
|---|---|
| 等值比对 | eq (等于), ne (不等于) |
| 数值比对 | gt (大于), gte (大于等于), lt (小于), lte (小于等于) |
| 字符串比对 | contains (包含), not_contains (不包含), matches (正则匹配) |
| 存在性判定 | exists (字段存在且非空), not_exists (字段不存在) |
| 集合包含 | in (属于集合), not_in (不属于集合) |
| 类型校验 | type_is (类型为 string/number/boolean/array/object) |
| 区间范围 | between (数值在区间内) |
断言的目标路径 target 统一采用以 $. 开头的标准 JSONPath 语法(例如 $.status、$.body.id、$.body.users[0].name)。
提供针对 WebSocket 双向长连接全生命周期管控的三个专用节点:连接、收发/消息收集与关闭。
// 建立 WebSocket 连接 (ws:connect)
{ "type": "ws:connect", "data": { "type": "ws:connect", "url": "wss://echo.example.com/ws" } }
// 发送消息并收集对端回包 (ws:send_collect)
{ "type": "ws:send_collect", "data": {
"type": "ws:send_collect",
"connection_id": "ws-connect-uuid",
"message": "{\"type\":\"ping\"}",
"collect_timeout_ms": 10000
}
}
// 主动断开连接 (ws:close)
{ "type": "ws:close", "data": { "type": "ws:close", "connection_id": "ws-connect-uuid" } }
{ "type": "tcp:connect", "data": { "type": "tcp:connect", "host": "localhost", "port": 8080 } }
{ "type": "tcp:send", "data": { "type": "tcp:send", "connection_id": "uuid", "data": "Hello" } }
{ "type": "tcp:receive", "data": { "type": "tcp:receive", "connection_id": "uuid" } }
{ "type": "tcp:close", "data": { "type": "tcp:close", "connection_id": "uuid" } }
{ "type": "udp:bind", "data": { "type": "udp:bind", "local_addr": "0.0.0.0", "local_port": 8888 } }
{ "type": "udp:send_to", "data": { "type": "udp:send_to", "connection_id": "uuid", "data": "Hello", "target_addr": "192.168.1.100", "target_port": 9999 } }
{ "type": "udp:recv_from", "data": { "type": "udp:recv_from", "connection_id": "uuid" } }
{ "type": "udp:close", "data": { "type": "udp:close", "connection_id": "uuid" } }
{ "type": "sse:connect", "data": { "type": "sse:connect", "url": "https://api.example.com/events" } }
{ "type": "sse:listen", "data": { "type": "sse:listen", "connection_id": "uuid", "max_events": 100 } }
{ "type": "sse:disconnect", "data": { "type": "sse:disconnect", "connection_id": "uuid" } }
{ "type": "graphql:connect", "data": { "type": "graphql:connect", "endpoint": "https://api.example.com/graphql" } }
{ "type": "graphql:query", "data": { "type": "graphql:query", "connection_id": "uuid", "query": "query { users { id name } }" } }
{ "type": "graphql:subscribe", "data": { "type": "graphql:subscribe", "connection_id": "uuid", "query": "subscription { newUser { id } }" } }
{ "type": "graphql:introspect", "data": { "type": "graphql:introspect", "connection_id": "uuid" } }
{ "type": "graphql:disconnect", "data": { "type": "graphql:disconnect", "connection_id": "uuid" } }
更多应用层与存储协议(Redis、MySQL/PostgreSQL、MongoDB、Kafka、SMTP、gRPC、MCP 等)均以一键安装的轻量级侧边进程插件形式提供 — 详见下方插件开发章节或访问 插件市场。
MPE Flow 内置全功能图形化交互调试器(同时支持 CLI 交互式单步调试)。可在任意节点挂起执行、实时查看/修改上下文变量、跳过不稳定节点或注入模拟产物。
鼠标悬停在画布任意节点上,点击节点顶部的断点红点即可切换断点状态。开启调试运行后,执行器将在遇到断点节点前自动暂停并聚焦画布视口。
| 动作 | 快捷键 | 说明 |
|---|---|---|
| 继续执行 (Continue) | F5 / 继续 | 恢复流程执行,直至遇到下一个断点或整个流程执行完毕。 |
| 单步跳过 (Step Over) | F10 | 执行当前暂停节点并立即在下一个相连节点暂停。遇到子流程节点时,将在后台完整运行整个子流程并在父流程下一节点暂停。 |
| 单步步入 (Step Into) | F11 | 在子流程 (flow:sub) 节点暂停时按 F11 步入其内部,并在子流程的首个有效节点暂停。对常规协议节点行为同单步跳过。 |
| 单步步出 (Step Out) | Shift + F11 | 当在子流程内部暂停时,快速执行完当前子流程剩余全部节点,并暂停在父流程中该子流程节点的下一个后继节点。 |
| 跳过节点 (Skip Node) | — | 忽略当前节点的实际网络/系统执行,指定下游输出端口分支(如 true / false)并可自定义注入模拟 output 数据。 |
| 执行到底 (Run to End) | — | 临时忽略后续所有断点,直接以正常模式运行完毕。 |
| 终止调试 (Stop) | — | 强制中止当前调试会话,生成截至当前暂停节点的阶段性调试报告。 |
面对多层嵌套子流程的复杂业务场景,MPE Flow 调试引擎原生支持嵌套调用栈帧 (DebugCallFrame) 与分层级单步穿透。
当执行推进至子流程节点时:
主流程 > 鉴权子流程),并在子流程首个执行节点高亮闪烁暂停。右侧执行面板 - 堆栈中将动态呈现清晰的嵌套调用链路:
#0 根工作流 (订单主链路) → 子流程节点: 支付结算
#1 支付结算 (Payment Pipeline) → 子流程节点: Token 刷新
#2 Token 刷新 (OAuth2 Refresh) → HTTP 节点: /oauth/token [PAUSED 已暂停]
点击调用栈中的任意父级栈帧,画布视口与变量面板将即刻回溯切换至该层级的工作流视图与变量快照,支持在父子流程之间随时横向对照调试数据。
MPE Flow 支持从庞大的工作流中框选局部子图或单节点按需独立触发执行,无需从 Entry 节点完整跑完全流程。
run_slice)在画布上框选或多选目标节点,右键唤出上下文菜单并选择 执行选中节点:
在自动化流转过程中,协议节点或 AI 智能体可通过 ask_human 协议发起人工确认或补充输入:
MPE Flow 调试引擎支持贯穿 Setup → Main → Teardown 全生命周期的无缝断点调试。
在单步步进 (F10/F11) 或恢复执行直至遇到 Setup/Teardown 中的断点节点时:
已完成、暂停中、等待执行)。$report。MPE Flow 宿主内核原生内置了高性能 Model Context Protocol (MCP) Server 服务引擎(flow-engine/src/mcp_server)。无需编写额外的 Python 或 TypeScript 胶水代码,也无需依赖外部插件二进制,即可直接将任意多协议工作流发布为供大模型(Cursor、Claude Desktop、本地智能体)调用的强类型 AI 工具。
区别于外部进程插件,MCP 服务发布直接运行在 MPE 宿主核心引擎中,原生支持高性能 Streamable HTTP 与标准 stdio 双通信协议、零内存拷贝变量流转与全自动参数 Schema 推导。
默认情况下,发布的工作流会自动接入运行在端口 9528 上的集中式共享网关(紧邻 Ingress 监听器 9527,可在「设置 → 网络」中自定义):
/mcp): 在 AI 客户端中仅需配置一次该网关地址,即可自动发现宿主中已发布的所有工作流工具。后续新增、修改或卸载工作流,客户端无需更改任何配置。/{flow-slug}/mcp): 支持通过 slug 路径前缀直接访问指定工作流,提供独立的上下文与参数隔离。MPE Flow 自动根据工作流元数据编译生成标准 JSON Schema 工具定义:
flow.name(转换为符合规范的 slug 标识,具备确定性重名消歧机制)。flow.description。flow.initial_variables,每个初始变量自动映射为一个输入参数,包含类型、描述与默认值。variable:extractor、http:request 或 script 节点)的产物将直接格式化为 MCP 工具调用的返回结果,喂入大模型上下文。在桌面端应用中将流程发布为 MCP 工具极度便捷:
打开「设置 → MCP 服务治理」标签页,集中查看与管理所有已注册的 MCP 服务实例:
MPE Flow 支持一键复制开箱即用的客户端配置文件片段:
通过子进程标准输入输出直接通信,零网络端口监听,轻量且安全:
// Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json
// 或 Cursor: .cursor/mcp.json
{
"mcpServers": {
"mpe-search-tool": {
"command": "mpe",
"args": [
"mcp",
"serve",
"-f",
"/path/to/search_tool.mpf",
"--transport",
"stdio"
]
}
}
}
多个 AI 客户端统一连接至本机常驻共享网关:
{
"mcpServers": {
"mpe-gateway": {
"url": "http://127.0.0.1:9528/mcp"
}
}
}
mpe mcp)在终端或无头服务器中通过命令行管理 MCP 服务生命周期:
# 启动单流程 stdio 服务(零端口占用)
mpe mcp serve -f ./flows/weather_api.mpf --transport stdio
# 后台守护启动 9528 共享网关
mpe mcp start --gateway --port 9528 --detach
# 将指定工作流发布并挂载到共享网关
mpe mcp start -f ./flows/database_query.mpf --shared
# 列出所有已注册与运行中的 MCP 服务实例
mpe mcp list --all
# 导出指定实例的 Cursor / Claude Desktop 配置代码段
mpe mcp config-snippet <实例ID或流程名称>
# 工作流修改后热重载实例
mpe mcp reload <实例ID或流程名称>
# 停止或移除已发布的服务实例
mpe mcp stop <实例ID或流程名称>
mpe mcp remove <实例ID或流程名称>
插件用于扩展 MPE Flow 的协议节点生态。插件作为独立的侧边子进程(Sidecar Process)运行,通过标准输入输出 (stdio) 与宿主进行轻量级 JSON-RPC 2.0 通信(按行分隔,支持 LF 与 CRLF)。应用启动时宿主自动拉起插件完成 describe 握手,将其声明的节点动态注册到全局 NodeRegistry 中。插件节点在工作流编排、执行引擎与测试报告中与内置原生节点享有完全一致的一等公民体验。
将包含 plugin.json 元数据清单的插件目录放入系统插件存放目录(默认位于 get_data_dir()/plugins;Windows 下位于 %APPDATA%/multi-protocol-flow-executor/plugins;可通过 MPE_PLUGIN_DIR 环境变量自定义覆盖)。宿主在启动时自动同步扫描:格式不合法的插件将被安全跳过,连续 3 次握手失败的插件将被临时隔离以保障宿主稳定性。
| 配置项 | 说明 |
|---|---|
name | 插件唯一标识(遵循命名规范,通常与插件目录名一致) |
version | 语义化版本号 (SemVer) |
description | 插件功能中文/英文描述 |
min_host_version | 兼容的最低宿主版本限制 |
entry | 启动该插件的命令 command 与参数 args(原生支持 Python/Node 等解释型脚本作为插件直接运行) |
env | 注入到插件子进程的环境变量键值对 |
permissions | 权限声明项 |
capabilities.streaming | true 表示常驻守护进程;false 表示按需启动并在空闲 60 秒后自动回收 |
capabilities.single_node | 节点级能力:true 表示支持通过 mpe run-node 命令单节点测试连通性 |
locales / default_locale | 界面多语言支持声明,宿主通过 MPE_LOCALE 环境变量向插件下发当前语言 |
协议插件作为独立开源仓库托管在 multi-protocol-flow GitHub 组织下(如 Kafka、Redis、MongoDB、gRPC、DB、SMTP 等)。同时,MPE Flow 宿主已原生内置 Model Context Protocol (MCP) Server 服务发布引擎(提供 9528 共享网关与按流路由),外部 MCP 客户端工具调用则可通过插件或标准连接器编排。可在 GUI 插件市场或 插件市场页面 一键安装扩展。
插件 SDK 与底层 Wire 通信协议契约统一托管在独立的开源公共仓库中:multi-protocol-flow/mpe-plugin-sdk。Rust SDK 提供一等公民的强类型支持,同时提供轻量级 Python 和 Node.js 插件脚手架。Wire 类型直接共享自 mpe-plugin-sdk::protocol,确保宿主与插件之间永远不会产生协议漂移。
Plugin Trait(实现 describe 声明节点元数据 + execute 执行协议调用;可选实现 flow_ended 释放每轮执行资源)plugins/ 插件目录中进行联调docs/plugin-guide.md (英文) / docs/plugin-guide.zh-CN.md (中文) 以及 docs/plugin-protocol.mddocs/plugin-architecture.md、docs/plugin-perf.md(可在 multi-protocol-flow GitHub 组织中查阅)可在桌面端 GUI 设置面板的 插件市场 (Plugin Market) 标签页中一键浏览与安装插件,或直接通过 CLI 命令行进行管理:
mpe plugin dir
mpe plugin list
mpe plugin install <name> [--version <v>] [--registry <url>] [--dir <dir>] [--force]
GET {base}/plugins 返回可用插件列表,每项包含各操作系统平台的打包资产 (zip) url 与可选的 sha256 校验和(宿主将严格校验哈希,杜绝篡改)。windows-x64 | windows-arm64 | linux-x64 | linux-arm64 | macos-x64 | macos-arm64。plugin.json 与所有相关依赖产物。公共插件注册中心默认通过 GitHub Pages 静态托管 (multi-protocol-flow.github.io/mpe-plugin-registry)。在网站的 插件市场页面 也可直接浏览最新插件生态。