关于 Migrate to n8n
Migrate to n8n 将 Make 场景和 Zapier 自动化转换为可导入的 n8n 工作流,并逐步报告已转换、待检查和需手动处理的项目。它可作为 MCP 服务或命令行工具运行,场景文件保留在本地。
主要功能
- 01将 Make 导出文件转换为 n8n 工作流
- 02将 Zapier 导出内容转换为工作流
- 03报告已转换、待检查及手动步骤
- 04导入前检查工作流问题
- 05可选上传工作流至 n8n
适用场景
- 01将 Make 场景迁移至 n8n
- 02从 Zapier 导出文件迁移指定自动化
- 03检查需要手动处理的步骤
- 04将转换后的工作流上传为未激活状态
MCP 相关
其 MCP 服务向 MCP 客户端提供转换、检查、替换建议和可选上传工具。上传需要设置 N8N_URL 和 N8N_API_KEY;创建的工作流保持未激活。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y migrate-to-n8nMIGRATE_OUTPUT_DIRFolder for converted workflows and reports (default: Documents/migrate-to-n8n)N8N_URLYour n8n address, to upload results (optional)N8N_API_KEY密钥n8n API key, to upload results (optional)本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
6收录的工具列表 · 更新于 4 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| json | string | 否 | 用户粘贴或附加文件而非提供路径时,填写导出文件的完整内容。path 和 json 二选一,不要同时提供。 |
| path | string | 否 | 此计算机上导出文件的绝对路径(~ 表示主目录)。path 和 json 二选一,不要同时提供。 |
| outputDir | string | 否 | 写入结果的文件夹;若不存在则创建;保留现有文件,并为新文件名添加 " (2)"、" (3)"……。默认值:主目录下的 Documents/migrate-to-n8n。 |
详细介绍
migrate-to-n8n
将 Make 场景和 Zapier zaps 迁移到 n8n。提供导出文件,即可获得可导入的 n8n 工作流,以及一份逐步报告:哪些内容已转换、需要检查什么,以及如何完成剩余部分。
它既可作为 MCP 服务使用(让 Claude、Cursor、VS Code 或任何 MCP 客户端帮你“将此内容转换为 n8n”),也可作为普通的命令行工具使用。免费且开源。你的场景会保留在自己的电脑上。
你将获得什么
场景中的每个步骤最终都会处于以下三种状态之一,报告会列出所有步骤:
| 含义 | 示例 | |
|---|---|---|
| ✅ 已转换 | 导入后即可运行。你只需重新连接凭据。 | Webhook、HTTP 请求、路由器、迭代器、Gmail 发送 |
| ⚠️ 需检查 | 已转换,但有一项明确内容需要检查。 | 没有完全对应 n8n 功能的公式、按列字母写入的工作表 |
| 🛠 手动处理 | 没有安全的自动转换方式。该步骤会保留在原位并处于禁用状态,附带便笺说明要如何处理。 | 私有 Make 应用:你会获得一个已收集好其输入的 Code 节点 |
不会丢弃任何内容。手动处理的步骤会保留工作流连接,因此工作流可以导入并运行,你可以之后再完成这些步骤。 这是 演示场景 转换后在 n8n 2.44 中打开的效果:私有 CRM 应用没有对应的 n8n 节点,因此该步骤会处于禁用状态,并附有操作说明。

公式也会一并转换:{{formatDate(1.date; "DD.MM.YYYY")}} 会变为
{{ DateTime.fromISO(String($('Webhook').item.json.body.date)).toFormat('dd.LL.yyyy') }}。
统计数据基于 2026-10-22 在 GitHub 上找到的公开 Make 蓝图和 Zapier 导出文件:
| 来源 | 工作流 | 步骤 | ✅ 已转换 | ⚠️ 需检查 | 🛠 手动处理 | 损坏的输出 | 时间(中位数) |
|---|---|---|---|---|---|---|---|
| Make | 1,432 | 10,129 | 42.7% | 40.5% | 16.7% | 0 | 0.7 ms |
| Zapier | 148 | 910 | 7% | 63.7% | 29.2% | 0 | 0.3 ms |
“损坏的输出”统计 n8n 会拒绝的工作流数量。测试套件还会将部分工作流导入真实的 n8n 2.44 和 1.123,并通过它们的 webhook 运行其中一些,与 Make 的结果进行比较。许多公开的 Zapier 导出文件不包含步骤设置或代码,因此 Zapier 的数据较低。
一分钟上手
你需要 Node.js 22 或更高版本。
npx migrate-to-n8n convert my-scenario.blueprint.json
工作流和报告会保存到 Documents/migrate-to-n8n。在 n8n 中导入 .n8n.json 文件:
工作流 → 从文件导入。
手边没有导出文件?试试演示场景:下载后运行相同的命令即可。
操作步骤
1. 从 Make 或 Zapier 导出
- Make:打开场景,点击编辑器底部的 ⋯,选择 Export Blueprint。
- Zapier:设置 → 安全与数据 → 下载我的 Zap 工作流。你会获得一个包含所有 zaps 的文件。
使用
list_zaps(或migrate-to-n8n list-zaps <file>)选择所需的 zaps。
2. 将其连接到 AI 客户端
Claude Desktop:下载 migrate-to-n8n.mcpb 并打开。Claude Desktop 会一键安装。设置为可选项:输出文件夹,以及用于上传的 n8n 地址和 API 密钥。
Claude Code:
claude mcp add migrate-to-n8n -- npx -y migrate-to-n8n serve
Cursor、VS Code、Windsurf 和其他客户端:将以下内容添加到客户端的 MCP 配置中
(.cursor/mcp.json、.vscode/mcp.json……):
{
"mcpServers": {
"migrate-to-n8n": {
"command": "npx",
"args": ["-y", "migrate-to-n8n", "serve"],
"env": { "N8N_URL": "", "N8N_API_KEY": "" }
}
}
}
VS Code 使用 "servers",而不是 "mcpServers"。
3. 转换
在聊天中附加文件(或提供其路径),然后提出请求:
将此 Make 场景转换为 n8n,并帮助我完成无法转换的部分。
助手会获取报告,并引导你完成所有标记为 ⚠️ 或 🛠 的步骤。
4. 导入 n8n
导入 .n8n.json 文件(工作流 → 从文件导入),在报告列出的节点中选择凭据,
将 Webhook 发送方指向新的 URL,使用测试数据运行一次,然后激活工作流。
设置 N8N_URL 和 N8N_API_KEY 后(n8n → 设置 → n8n API),助手可以为你上传工作流。
它会创建一个名为“……(已迁移)”的新工作流,并将其设为非活动状态;绝不会修改现有工作流。
工具
| 工具 | 功能 |
|---|---|
convert_make | Make 蓝图 → n8n 工作流文件 + 报告 |
convert_zapier | Zapier 导出文件 → 每个 zap 对应一个工作流文件 + 报告 |
list_zaps | 列出 Zapier 导出文件中的 zap:标题、步骤、应用、开/关状态 |
suggest_replacement | 说明如何处理某个模块或步骤,以及可用什么替代 |
supported_modules | 搜索可自动转换的内容 |
check_n8n_workflow | 检查工作流文件中遗留的问题:断开的链接、已禁用的步骤、占位符、凭据 |
upload_to_n8n | 在你的 n8n 中创建工作流并设为非活动状态(仅当设置了 N8N_URL 和 N8N_API_KEY 时) |
可转换内容
两边的流程控制都可完整转换:路由器和路径(与 Make 和 Zapier 一样,运行所有匹配的路由)、 带 AND/OR 组的筛选器、迭代器和聚合器、错误处理程序、计划、变量、Webhook 和响应、HTTP 请求、 JSON、Formatter、Code、Delay、Storage。约 50 个 Make 公式函数、Make 日期格式、运算符以及 25 种 Zapier Formatter 转换都会转换为 n8n 表达式。
Make:135 个模块和步骤可自动转换
| 模块 / 步骤 | 在 n8n 中对应 | |---|---| | `*:makeApiCall` | HTTP Request(应用的 API) | | `airtable:ActionCreateRecord` | Airtable:创建 | | `airtable:ActionGetRecord` | Airtable:获取 | | `airtable:ActionSearchRecords` | Airtable:搜索 | | `airtable:ActionUpdateRecords` | Airtable:更新 | | `airtable:TriggerWatchRecords` | Airtable 触发器 | | `anthropic-claude:createAMessage` | Anthropic:向模型发送消息 | | `anthropic-claude:simpleTextPrompt` | Anthropic:向模型发送消息 | | `apify:fetchDatasetItems` | HTTP Request(Apify API) | | `apify:finishedActorRuns` | Webhook(Apify) | | `apify:runActor` | HTTP Request(Apify API) | | `apify:runActorNew` | HTTP Request(Apify API) | | `builtin:BasicAggregator` | 聚合 | | `builtin:BasicFeeder` | 拆分输出 | | `builtin:BasicFilter` | 无操作 | | `builtin:BasicIterator` | 拆分输出 | | `builtin:BasicRepeater` | Code(重复执行) | | `builtin:BasicRouter` | 无操作(扇出) | | `code:ExecuteCode` | Code | | `csv:ParseCSV` | Code(解析 CSV)+ 拆分输出 | | `datastore:AddRecord` | Data Table:插入行 | | `datastore:DeleteRecord` | Data Table:删除行 | | `datastore:ExistRecord` | Data Table:检查行是否存在 | | `datastore:GetRecord` | Data Table:获取行 | | `datastore:SearchRecord` | Data Table:获取行 | | `datastore:UpdateRecord` | Data Table:更新 / 插入或更新 | | `discord:createMessage` | Discord:发送消息 | | `dropbox:createShareLink` | HTTP Request(Dropbox API) | | `dropbox:uploadLargeFile` | Dropbox:上传 | | `email:ActionSendEmail` | 发送电子邮件(SMTP) | | `email:TriggerNewEmail` | 电子邮件触发器(IMAP) | | `facebook-pages:CreatePost` | Facebook Graph API:发布主页帖子 | | `facebook-pages:CreatePostWithPhotos` | Facebook Graph API:发布主页照片帖子 | | `gateway:CustomWebHook` | Webhook | | `gateway:WebhookRespond` | 响应 Webhook | | `gemini-ai:createACompletionGeminiPro` | Google Gemini:向模型发送消息 | | `gmail:ActionSendEmail` | Gmail:发送 | | `gmail:sendAnEmail` | Gmail:发送 | | `gmail:TriggerNewEmail` | Gmail 触发器 | | `google-calendar:createAnEvent` | Google Calendar:创建活动 | | `google-calendar:deleteAnEvent` | Google Calendar:删除活动 | | `google-calendar:searchEvents` | Google Calendar:获取多个活动 | | `google-docs:createADocument` | Google Docs:创建 | | `google-docs:createADocumentFromTemplate` | Google Drive:复制(模板) | | `google-docs:getADocument` | Google Docs:获取 | | `google-drive:createAFolder` | Google Drive:创建文件夹 | | `google-drive:getAFile` | Google Drive:下载 | | `google-drive:moveAFileIntoAFolder` | Google Drive:移动 | | `google-drive:searchForFilesFolders` | Google Drive:搜索 | | `google-drive:shareAFileFolder` | Google Drive:共享 | | `google-drive:uploadAFile` | Google Drive:上传 | | `google-drive:watchFilesInAFolder` | Google Drive 触发器 | | `google-email:ActionCreateDraft` | Gmail:创建草稿 | | `google-email:ActionSendEmail` | Gmail:发送 | | `google-email:createADraft` | Gmail:创建草稿 | | `google-email:sendAnEmail` | Gmail:发送 | | `google-email:TriggerNewEmail` | Gmail 触发器 | | `google-email:TriggerWatchEmails` | Gmail 触发器 | | `google-email:triggerWatchNewEmails` | Gmail 触发器 | | `google-sheets:addRow` | Google Sheets:追加行 | | `google-sheets:createSpreadsheet` | Google Sheets:创建电子表格 | | `google-sheets:deleteRow` | Google Sheets:删除行 | | `google-sheets:filterRows` | Google Sheets:获取行(+ 筛选) | | `google-sheets:getCell` | HTTP Request(Sheets API,读取单元格) | | `google-sheets:getSheetContent` | Google Sheets:获取行(+ 筛选) | | `google-sheets:searchRows` | Google Sheets:获取行(+ 筛选) | | `google-sheets:searchRowsAdvanced` | Google Sheets:获取行(+ 筛选) | | `google-sheets:updateCell` | HTTP Request(Sheets API,写入单元格) | | `google-sheets:updateRow` | Google Sheets:更新行 | | `google-sheets:watchRows` | Google Sheets 触发器(新增行) | | `http:ActionGetFile` | HTTP Request(文件) | | `http:ActionSendData` | HTTP Request | | `http:ActionSendDataAPIKeyAuth` | HTTP Request(API 密钥) | | `http:ActionSendDataBasicAuth` | HTTP Request(基本身份验证) | | `http:DownloadFile` | HTTP Request(文件) | | `http:MakeRequest` | HTTP Request | | `instagram-business:CreateAReelPost` | Facebook Graph API:Instagram Reels + 发布 | | `instagram-business:CreatePostPhoto` | Facebook Graph API:Instagram 媒体 + 发布 | | `json:AggregateToJSON` | 聚合 + 编辑字段 | | `json:CreateJSON` | 编辑字段 | | `json:ParseJSON` | 编辑字段(JSON) | | `json:TransformToJSON` | 编辑字段 | | `linkedin:CreateCompanyImagePost` | LinkedIn:创建帖子 | | `linkedin:CreateCompanyPost` | LinkedIn:创建帖子 | | `linkedin:CreatePost` | LinkedIn:创建帖子 | | `linkedin:ShareImage` | LinkedIn:创建帖子 | | `manychat:SetSubscriberCustomField` | HTTP Request(ManyChat API) | | `markdown:Compile` | Markdown → HTML | | `notion:createAPage` | Notion:创建数据库页面 | | `notion:updateADatabaseItem` | Notion:更新数据库页面 | | `open-router:createAChatCompletion` | HTTP Request(OpenRouter API) | | `openai-gpt-3:askAnything` | OpenAI:向模型发送消息 | | `openai-gpt-3:CreateCompletion` | OpenAI:向模型发送消息 | | `openai-gpt-3:createModelResponse` | OpenAI:向模型发送消息 | | `openai-gpt-3:GenerateImage` | OpenAI:生成图像 | | `openai-gpt-3:messageAssistantAdvanced` | OpenAI:向模型发送消息(指令) | | `openai-gpt-3:transformTextToStructuredData` | OpenAI:向模型发送消息(JSON) | | `perplexity-ai:createAChatCompletion` | HTTP Request(Perplexity API) | | `placeholder:Placeholder` | 无操作 | | `regexp:HTMLToText` | 编辑字段 | | `regexp:Parser` | Code | | `regexp:Replace` | 编辑字段 | | `resend:sendAnEmail` | HTTP Request(Resend API) | | `rss:ActionReadArticles` | RSS 阅读 | | `rss:TriggerNewArticle` | RSS Feed 触发器 | | `scenario-service:ReturnData` | 编辑字段(子工作流输出) | | `slack:CreateMessage` | Slack:发送消息 | | `slack:InviteUsers` | Slack:邀请加入频道 | | `supabase:ActionCreateARecord` | Supabase:创建行 | | `supabase:createARow` | Supabase:创建行 | | `supabase:searchRows` | Supabase:获取多行 | | `supabase:upsertARecord` | Supabase:创建行 | | `telegram:DownloadFile` | Telegram:获取文件 | | `telegram:SendReplyMessage` | Telegram:发送消息 | | `telegram:WatchUpdates` | Telegram 触发器 | | `twilio:SendSMS` | Twilio:发送短信 | | `twitter:createATweet` | X (Twitter):创建推文 | | `typeform:ListResponses` | HTTP Request(Typeform API) | | `typeform:WatchEventsWithResponses` | Typeform 触发器 | | `util:ComposeTransformer` | 编辑字段 | | `util:FunctionAggregator2` | 聚合 + 编辑字段 | | `util:FunctionIncrement` | Code(计数器) | | `util:FunctionSleep` | 等待 | | `util:GetVariable2` | 编辑字段 | | `util:GetVariables` | 编辑字段 | | `util:SetMultipleVariables` | 编辑字段 | | `util:SetVariable2` | 编辑字段 | | `util:SetVariables` | 编辑字段 | | `util:Sleep` | 等待 | | `util:Switcher` | 编辑字段 | | `util:TextAggregator` | 聚合 + 编辑字段 | | `webflow:publishAnItem` | HTTP Request(Webflow API) | | `webflow:updateItem` | Webflow:更新项目 | | `whatsapp-business-cloud:sendMessage` | WhatsApp:发送消息 | | `xml:ParseXML` | XML(转为 JSON) |Zapier:98 个模块和步骤自动转换
其他内容也会纳入工作流:从 362 个 n8n 应用节点中选择最接近的节点、向应用 API 发送 HTTP 请求,或使用输入已连线的 Code 节点;这些内容都会被禁用,并附上完成配置的说明。
哪些内容无法转换,以及原因
- 凭据。 Make 和 Zapier 从不导出凭据。请在 n8n 中创建凭据;报告会列出需要凭据的节点。
- 数据。 Make 数据存储和 Zapier Tables 会转换为 n8n Data Tables(n8n 1.113 或更高版本),并保留相同的字段,但数据行不会一并迁移。
- Webhook URL。 n8n 会为每个 webhook 分配新地址。报告会列出这些地址,以便你更新发送方。
- 来自 Zapier 或 Make 的 Python 代码。 n8n 可以运行 Python,但在 1.x 和 2.x 中读取输入的方式不同:代码会放入 Code 节点,供你调整。
- 应用的输出字段名称。 n8n 的应用节点有时会使用不同的结果名称。读取这些结果的步骤会标记为 ⚠️,以便你在测试运行后检查一次字段。
命令行
migrate-to-n8n convert <file> [-o <folder>] [--zap <id or title>]...
migrate-to-n8n list-zaps <file>
migrate-to-n8n supported [text] [--source make|zapier]
migrate-to-n8n check <workflow.json>
migrate-to-n8n upload <workflow.json> # needs N8N_URL and N8N_API_KEY
migrate-to-n8n serve # MCP server over stdio
开发
npm install
npm run n8n-types # n8n's node catalogs, for the tests (kept out of the package)
npm test # unit tests, golden conversions, checks against n8n's own node descriptions
npm run corpus -- download && npm run corpus -- stats # measure on public exports (needs gh)
docker compose -f docker-compose.e2e.yml up -d && npm run e2e # real n8n 2.x and 1.x
转换器写入的每个节点都会根据 n8n 2.44 和 1.123 的参数说明进行检查:包括名称、允许的值和显示规则。n8n 目录仅为测试而下载,不会随项目发布。
路线图
- Make 错误处理路由中的路由器(目前,处理程序的模块会被放在错误输出上的同一行)。
- 根据用户的转换需求支持更多应用。告诉我你需要哪些应用。
联系方式
欢迎提供反馈、想法、工作机会或定制项目(n8n、MCP、AI 自动化):[email protected]。 欢迎通过 Issues 提交错误报告和功能请求。
许可证
MIT。Make、Zapier 和 n8n 是其各自所有者的商标;本项目与这些公司无关。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。