{"_id":"migrate-to-n8n","_rev":"2-401e78d5f04bcd9d47be3500983b1701","name":"migrate-to-n8n","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.0-stage":{"name":"migrate-to-n8n","version":"0.0.0-stage","_id":"migrate-to-n8n@0.0.0-stage","stub":true,"maintainers":[{"name":"kotiniiqqk","email":"kotiniiqq@protonmail.com"}],"dist":{"shasum":"26e66493f8bb7a9f8f37b837145e26484a0a90ca","tarball":"https://registry.npmjs.org/migrate-to-n8n/-/migrate-to-n8n-0.0.0-stage.tgz","fileCount":2,"integrity":"sha512-vGbdIXVqI8t3iuxUhVn5lRXDwMzjejMe7ZwIIPsB+3I7+pPaCuu4W1PpaOqzkPZAlnIAn0EW6IR4JA9st3GEyw==","signatures":[{"sig":"MEYCIQCr/CJac76UocHePtzOjxZNLYYCVzgcRfEx/zlx0/hY4gIhAOsarCg0HVWO+hqCSlHXlzq+mkphOTPFI1GiqhPRBEEh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":336},"_npmUser":{"name":"kotiniiqqk","email":"kotiniiqq@protonmail.com"},"description":"Temporary package placeholder for staged publishing","directories":{}},"0.2.0":{"_id":"migrate-to-n8n@0.2.0","bin":{"migrate-to-n8n":"dist/cli.js"},"bugs":{"url":"https://github.com/kotiniiqq/migrate-to-n8n/issues"},"dist":{"shasum":"f4098c83bd6aaeef11865341e0b481446dea25ca","tarball":"https://registry.npmjs.org/migrate-to-n8n/-/migrate-to-n8n-0.2.0.tgz","fileCount":35,"integrity":"sha512-NepHarcODk/YuMMfYX8+aet3dvOcVeDMFJ6hP5OVHuDfNCj5XecmKbo2WXc2u1Og595roa2Od3XLrlMdii5C5g==","signatures":[{"sig":"MEUCIFWLMZvmBcCa9AntWlTsl7KeIsM36f1zdZjTea58e0BcAiEA2lElpFEyYNxKSYIMfP8t1mIOCinq7cyWgVfeun0kkwI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDRylTREg/B6q1UxMLJGn129tlwOlX1kPj5xRzr3+vU+AiEAoSHPI+2W67dgbSwlJAJGZCCapAo0UoY0/gIZF9uSZng="}],"unpackedSize":362633},"name":"migrate-to-n8n","type":"module","author":{"name":"Kyrylo Kalashnyk","email":"kotiniiqq@gmail.com"},"engines":{"node":">=22"},"gitHead":"da04bd4cfd6f39716d166b9b74d2d8f831290db2","license":"MIT","mcpName":"io.github.kotiniiqq/migrate-to-n8n","scripts":{"e2e":"tsx e2e/import.ts && tsx e2e/run.ts","mcpb":"npm run build && tsx scripts/build-mcpb.ts","test":"node --import tsx --test \"test/**/*.test.ts\"","build":"tsc -p tsconfig.build.json","corpus":"tsx scripts/corpus.ts","readme":"tsx scripts/readme-blocks.ts","n8n-apps":"tsx scripts/gen-n8n-apps.ts","n8n-types":"tsx scripts/fetch-n8n-types.ts","typecheck":"tsc --noEmit","prepublishOnly":"npm run build && npm test"},"version":"0.2.0","_npmUser":{"name":"kotiniiqqk","email":"kotiniiqq@protonmail.com"},"homepage":"https://github.com/kotiniiqq/migrate-to-n8n#readme","keywords":["n8n","make","make.com","integromat","zapier","migration","mcp","mcp-server","automation","workflow"],"repository":{"url":"git+https://github.com/kotiniiqq/migrate-to-n8n.git","type":"git"},"_npmVersion":"11.17.0","description":"Convert Make and Zapier automations into n8n workflows, with a report of what to check. MCP server and CLI.","directories":{},"maintainers":[{"name":"kotiniiqqk","email":"kotiniiqq@protonmail.com"}],"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.6.7","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.15","typescript":"^7.0.2","@types/node":"^24.19.2"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/migrate-to-n8n_0.2.0_1792924278124_0.39494522979573476"}}},"time":{"created":"2026-10-25T10:30:21.981Z","modified":"2026-10-25T10:31:18.547Z","0.0.0-stage":"2026-10-25T10:30:21.981Z","0.2.0":"2026-10-25T10:31:18.213Z"},"description":"Convert Make and Zapier automations into n8n workflows, with a report of what to check. MCP server and CLI.","maintainers":[{"name":"kotiniiqqk","email":"kotiniiqq@protonmail.com"}],"readme":"# migrate-to-n8n\n\n<!-- mcp-name: io.github.kotiniiqq/migrate-to-n8n -->\n\n[![npm](https://img.shields.io/npm/v/migrate-to-n8n)](https://www.npmjs.com/package/migrate-to-n8n)\n[![downloads](https://img.shields.io/npm/dm/migrate-to-n8n)](https://www.npmjs.com/package/migrate-to-n8n)\n[![ci](https://github.com/kotiniiqq/migrate-to-n8n/actions/workflows/ci.yml/badge.svg)](https://github.com/kotiniiqq/migrate-to-n8n/actions/workflows/ci.yml)\n[![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n\nMove your **Make** scenarios and **Zapier** zaps to **n8n**. Give it the export, get an n8n workflow you can\nimport, plus a report on every step: what converted, what you should check, and how to finish the rest.\n\nIt works as an MCP server (ask Claude, Cursor, VS Code or any MCP client to \"convert this to n8n\") and as a\nplain command-line tool. Free and open source. Your scenarios stay on your computer.\n\n![Make blueprint or Zapier export → migrate-to-n8n → n8n workflow and report](https://raw.githubusercontent.com/kotiniiqq/migrate-to-n8n/main/docs/assets/how-it-works.svg)\n\n## What you get\n\nEvery step of your scenario ends up in one of three states, and the report lists them all:\n\n| | What it means | Example |\n|---|---|---|\n| ✅ **converted** | Runs after import. You only reconnect credentials. | Webhook, HTTP request, router, iterator, Gmail send |\n| ⚠️ **review** | Converted, with one named thing to check. | A formula with no exact n8n twin, a sheet written by column letter |\n| 🛠 **manual** | No safe automatic equivalent. The step sits in place, disabled, with a sticky note that says what to do. | A private Make app: you get a Code node that already collects its inputs |\n\nNothing gets dropped. Manual steps keep the workflow connected, so it imports and runs while you finish them.\nThis is the [demo scenario](docs/demo/lead-routing.blueprint.json) after conversion, opened in n8n 2.44: the\nprivate CRM app has no n8n node, so its step waits disabled, with a note on what to do.\n\n![The converted demo scenario in the n8n editor](https://raw.githubusercontent.com/kotiniiqq/migrate-to-n8n/main/docs/assets/n8n-result.png)\n\nFormulas carry over too: `{{formatDate(1.date; \"DD.MM.YYYY\")}}` becomes\n`{{ DateTime.fromISO(String($('Webhook').item.json.body.date)).toFormat('dd.LL.yyyy') }}`.\n\n<!-- corpus:start -->\nMeasured on 2026-10-22 on the public Make blueprints and Zapier exports found on GitHub:\n\n| Source | Workflows | Steps | ✅ Converted | ⚠️ To review | 🛠 Manual | Broken outputs | Time (median) |\n|---|---:|---:|---:|---:|---:|---:|---:|\n| Make | 1,432 | 10,129 | 42.7% | 40.5% | 16.7% | 0 | 0.7 ms |\n| Zapier | 148 | 910 | 7% | 63.7% | 29.2% | 0 | 0.3 ms |\n<!-- corpus:end -->\n\n\"Broken outputs\" counts workflows that n8n would reject. The test suite also imports a sample of these\nworkflows into real n8n 2.44 and 1.123, and runs some of them through their webhooks to compare the answers\nwith Make. Many public Zapier exports come without step settings or code, which keeps the Zapier numbers lower.\n\n## Try it in one minute\n\nYou need [Node.js](https://nodejs.org) 22 or newer.\n\n```bash\nnpx migrate-to-n8n convert my-scenario.blueprint.json\n```\n\nThe workflow and the report go to `Documents/migrate-to-n8n`. Import the `.n8n.json` file in n8n:\n**Workflows → Import from File**.\n\nNo export at hand? Try the [demo scenario](docs/demo/lead-routing.blueprint.json): download it and run the same\ncommand on it.\n\n## Step by step\n\n### 1. Export from Make or Zapier\n\n- **Make**: open the scenario, click **⋯** at the bottom of the editor, choose **Export Blueprint**.\n- **Zapier**: **Settings → Security and data → Download my Zap workflows**. You get one file with all your zaps.\n  Pick the ones you want with `list_zaps` (or `migrate-to-n8n list-zaps <file>`).\n\n### 2. Connect it to your AI client\n\n**Claude Desktop**: download [migrate-to-n8n.mcpb](https://github.com/kotiniiqq/migrate-to-n8n/releases/latest/download/migrate-to-n8n.mcpb)\nand open it. Claude Desktop installs it in one click. The settings are optional: an output folder, and your n8n\naddress and API key if you want uploads.\n\n**Claude Code**:\n\n```bash\nclaude mcp add migrate-to-n8n -- npx -y migrate-to-n8n serve\n```\n\n**Cursor, VS Code, Windsurf and other clients**: add this to the client's MCP config\n(`.cursor/mcp.json`, `.vscode/mcp.json`, …):\n\n```json\n{\n  \"mcpServers\": {\n    \"migrate-to-n8n\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"migrate-to-n8n\", \"serve\"],\n      \"env\": { \"N8N_URL\": \"\", \"N8N_API_KEY\": \"\" }\n    }\n  }\n}\n```\n\nVS Code uses `\"servers\"` instead of `\"mcpServers\"`.\n\n### 3. Convert\n\nAttach the file in the chat (or give its path) and ask:\n\n> Convert this Make scenario to n8n and help me finish what doesn't convert.\n\nThe assistant gets the report and walks you through every step marked ⚠️ or 🛠.\n\n### 4. Import into n8n\n\nImport the `.n8n.json` file (**Workflows → Import from File**), pick your credentials in the nodes the report lists,\npoint webhook senders to the new URL, run it once with test data, then activate it.\n\nWith `N8N_URL` and `N8N_API_KEY` set (n8n → **Settings → n8n API**), the assistant can upload the workflow\nfor you. It creates a new, inactive workflow named \"… (migrated)\" and never touches existing ones.\n\n## Tools\n\n| Tool | What it does |\n|---|---|\n| `convert_make` | Make blueprint → n8n workflow file + report |\n| `convert_zapier` | Zapier export → one workflow file + report per zap |\n| `list_zaps` | The zaps in a Zapier export: title, steps, apps, on/off |\n| `suggest_replacement` | How one module or step is handled, and what to use instead |\n| `supported_modules` | Search what converts automatically |\n| `check_n8n_workflow` | Problems left in a workflow file: broken links, disabled steps, placeholders, credentials |\n| `upload_to_n8n` | Create the workflow in your n8n, inactive (only when `N8N_URL` and `N8N_API_KEY` are set) |\n\n## What converts\n\nFlow control converts in full on both sides: routers and paths (every matching route runs, as in Make and\nZapier), filters with AND/OR groups, iterators and aggregators, error handlers, schedules, variables, webhooks and\nresponses, HTTP requests, JSON, Formatter, Code, Delay, Storage. About 50 Make formula functions, Make date\nformats, operators and 25 Zapier Formatter transforms translate to n8n expressions.\n\n<!-- supported:start -->\n<details>\n<summary><b>Make</b>: 135 modules and steps convert automatically</summary>\n\n| Module / step | Becomes in n8n |\n|---|---|\n| `*:makeApiCall` | HTTP Request (the app's API) |\n| `airtable:ActionCreateRecord` | Airtable: Create |\n| `airtable:ActionGetRecord` | Airtable: Get |\n| `airtable:ActionSearchRecords` | Airtable: Search |\n| `airtable:ActionUpdateRecords` | Airtable: Update |\n| `airtable:TriggerWatchRecords` | Airtable Trigger |\n| `anthropic-claude:createAMessage` | Anthropic: Message a Model |\n| `anthropic-claude:simpleTextPrompt` | Anthropic: Message a Model |\n| `apify:fetchDatasetItems` | HTTP Request (Apify API) |\n| `apify:finishedActorRuns` | Webhook (Apify) |\n| `apify:runActor` | HTTP Request (Apify API) |\n| `apify:runActorNew` | HTTP Request (Apify API) |\n| `builtin:BasicAggregator` | Aggregate |\n| `builtin:BasicFeeder` | Split Out |\n| `builtin:BasicFilter` | No Operation |\n| `builtin:BasicIterator` | Split Out |\n| `builtin:BasicRepeater` | Code (repeat) |\n| `builtin:BasicRouter` | No Operation (fan-out) |\n| `code:ExecuteCode` | Code |\n| `csv:ParseCSV` | Code (parse CSV) + Split Out |\n| `datastore:AddRecord` | Data Table: Insert Row |\n| `datastore:DeleteRecord` | Data Table: Delete Rows |\n| `datastore:ExistRecord` | Data Table: If Row Exists |\n| `datastore:GetRecord` | Data Table: Get Rows |\n| `datastore:SearchRecord` | Data Table: Get Rows |\n| `datastore:UpdateRecord` | Data Table: Update / Upsert |\n| `discord:createMessage` | Discord: Send Message |\n| `dropbox:createShareLink` | HTTP Request (Dropbox API) |\n| `dropbox:uploadLargeFile` | Dropbox: Upload |\n| `email:ActionSendEmail` | Send Email (SMTP) |\n| `email:TriggerNewEmail` | Email Trigger (IMAP) |\n| `facebook-pages:CreatePost` | Facebook Graph API: Page Post |\n| `facebook-pages:CreatePostWithPhotos` | Facebook Graph API: Page Photo Post |\n| `gateway:CustomWebHook` | Webhook |\n| `gateway:WebhookRespond` | Respond to Webhook |\n| `gemini-ai:createACompletionGeminiPro` | Google Gemini: Message a Model |\n| `gmail:ActionSendEmail` | Gmail: Send |\n| `gmail:sendAnEmail` | Gmail: Send |\n| `gmail:TriggerNewEmail` | Gmail Trigger |\n| `google-calendar:createAnEvent` | Google Calendar: Create Event |\n| `google-calendar:deleteAnEvent` | Google Calendar: Delete Event |\n| `google-calendar:searchEvents` | Google Calendar: Get Many Events |\n| `google-docs:createADocument` | Google Docs: Create |\n| `google-docs:createADocumentFromTemplate` | Google Drive: Copy (template) |\n| `google-docs:getADocument` | Google Docs: Get |\n| `google-drive:createAFolder` | Google Drive: Create Folder |\n| `google-drive:getAFile` | Google Drive: Download |\n| `google-drive:moveAFileIntoAFolder` | Google Drive: Move |\n| `google-drive:searchForFilesFolders` | Google Drive: Search |\n| `google-drive:shareAFileFolder` | Google Drive: Share |\n| `google-drive:uploadAFile` | Google Drive: Upload |\n| `google-drive:watchFilesInAFolder` | Google Drive Trigger |\n| `google-email:ActionCreateDraft` | Gmail: Create Draft |\n| `google-email:ActionSendEmail` | Gmail: Send |\n| `google-email:createADraft` | Gmail: Create Draft |\n| `google-email:sendAnEmail` | Gmail: Send |\n| `google-email:TriggerNewEmail` | Gmail Trigger |\n| `google-email:TriggerWatchEmails` | Gmail Trigger |\n| `google-email:triggerWatchNewEmails` | Gmail Trigger |\n| `google-sheets:addRow` | Google Sheets: Append Row |\n| `google-sheets:createSpreadsheet` | Google Sheets: Create Spreadsheet |\n| `google-sheets:deleteRow` | Google Sheets: Delete Rows |\n| `google-sheets:filterRows` | Google Sheets: Get Rows (+ Filter) |\n| `google-sheets:getCell` | HTTP Request (Sheets API, read a cell) |\n| `google-sheets:getSheetContent` | Google Sheets: Get Rows (+ Filter) |\n| `google-sheets:searchRows` | Google Sheets: Get Rows (+ Filter) |\n| `google-sheets:searchRowsAdvanced` | Google Sheets: Get Rows (+ Filter) |\n| `google-sheets:updateCell` | HTTP Request (Sheets API, write a cell) |\n| `google-sheets:updateRow` | Google Sheets: Update Row |\n| `google-sheets:watchRows` | Google Sheets Trigger (row added) |\n| `http:ActionGetFile` | HTTP Request (file) |\n| `http:ActionSendData` | HTTP Request |\n| `http:ActionSendDataAPIKeyAuth` | HTTP Request (API key) |\n| `http:ActionSendDataBasicAuth` | HTTP Request (basic auth) |\n| `http:DownloadFile` | HTTP Request (file) |\n| `http:MakeRequest` | HTTP Request |\n| `instagram-business:CreateAReelPost` | Facebook Graph API: Instagram reel + publish |\n| `instagram-business:CreatePostPhoto` | Facebook Graph API: Instagram media + publish |\n| `json:AggregateToJSON` | Aggregate + Edit Fields |\n| `json:CreateJSON` | Edit Fields |\n| `json:ParseJSON` | Edit Fields (JSON) |\n| `json:TransformToJSON` | Edit Fields |\n| `linkedin:CreateCompanyImagePost` | LinkedIn: Create Post |\n| `linkedin:CreateCompanyPost` | LinkedIn: Create Post |\n| `linkedin:CreatePost` | LinkedIn: Create Post |\n| `linkedin:ShareImage` | LinkedIn: Create Post |\n| `manychat:SetSubscriberCustomField` | HTTP Request (ManyChat API) |\n| `markdown:Compile` | Markdown → HTML |\n| `notion:createAPage` | Notion: Create Database Page |\n| `notion:updateADatabaseItem` | Notion: Update Database Page |\n| `open-router:createAChatCompletion` | HTTP Request (OpenRouter API) |\n| `openai-gpt-3:askAnything` | OpenAI: Message a Model |\n| `openai-gpt-3:CreateCompletion` | OpenAI: Message a Model |\n| `openai-gpt-3:createModelResponse` | OpenAI: Message a Model |\n| `openai-gpt-3:GenerateImage` | OpenAI: Generate an Image |\n| `openai-gpt-3:messageAssistantAdvanced` | OpenAI: Message a Model (instructions) |\n| `openai-gpt-3:transformTextToStructuredData` | OpenAI: Message a Model (JSON) |\n| `perplexity-ai:createAChatCompletion` | HTTP Request (Perplexity API) |\n| `placeholder:Placeholder` | No Operation |\n| `regexp:HTMLToText` | Edit Fields |\n| `regexp:Parser` | Code |\n| `regexp:Replace` | Edit Fields |\n| `resend:sendAnEmail` | HTTP Request (Resend API) |\n| `rss:ActionReadArticles` | RSS Read |\n| `rss:TriggerNewArticle` | RSS Feed Trigger |\n| `scenario-service:ReturnData` | Edit Fields (sub-workflow output) |\n| `slack:CreateMessage` | Slack: Send Message |\n| `slack:InviteUsers` | Slack: Invite to Channel |\n| `supabase:ActionCreateARecord` | Supabase: Create Row |\n| `supabase:createARow` | Supabase: Create Row |\n| `supabase:searchRows` | Supabase: Get Many Rows |\n| `supabase:upsertARecord` | Supabase: Create Row |\n| `telegram:DownloadFile` | Telegram: Get File |\n| `telegram:SendReplyMessage` | Telegram: Send Message |\n| `telegram:WatchUpdates` | Telegram Trigger |\n| `twilio:SendSMS` | Twilio: Send SMS |\n| `twitter:createATweet` | X (Twitter): Create Tweet |\n| `typeform:ListResponses` | HTTP Request (Typeform API) |\n| `typeform:WatchEventsWithResponses` | Typeform Trigger |\n| `util:ComposeTransformer` | Edit Fields |\n| `util:FunctionAggregator2` | Aggregate + Edit Fields |\n| `util:FunctionIncrement` | Code (counter) |\n| `util:FunctionSleep` | Wait |\n| `util:GetVariable2` | Edit Fields |\n| `util:GetVariables` | Edit Fields |\n| `util:SetMultipleVariables` | Edit Fields |\n| `util:SetVariable2` | Edit Fields |\n| `util:SetVariables` | Edit Fields |\n| `util:Sleep` | Wait |\n| `util:Switcher` | Edit Fields |\n| `util:TextAggregator` | Aggregate + Edit Fields |\n| `webflow:publishAnItem` | HTTP Request (Webflow API) |\n| `webflow:updateItem` | Webflow: Update Item |\n| `whatsapp-business-cloud:sendMessage` | WhatsApp: Send Message |\n| `xml:ParseXML` | XML (to JSON) |\n\n</details>\n\n<details>\n<summary><b>Zapier</b>: 98 modules and steps convert automatically</summary>\n\n| Module / step | Becomes in n8n |\n|---|---|\n| `AICLIAPI:get_completion` | OpenAI: Message a Model |\n| `AirtableCLIAPI:create_or_update_record` | Airtable: Upsert |\n| `AirtableCLIAPI:createRecord` | Airtable: Create |\n| `AirtableCLIAPI:newRecordInView` | Airtable Trigger |\n| `AirtableCLIAPI:updateRecord` | Airtable: Update |\n| `BranchingAPI:branch` | No Operation (fan-out) |\n| `ChatGPTCLIAPI:chat_completion` | OpenAI: Message a Model |\n| `ChatGPTCLIAPI:chat_completion_memory` | OpenAI: Message a Model |\n| `ChatGPTCLIAPI:conversation` | OpenAI: Message a Model |\n| `CodeCLIAPI:*` | Code |\n| `DelayAPI:delay_for` | Wait |\n| `DelayAPI:delay_until` | Wait |\n| `DelayCLIAPI:delay_for` | Wait |\n| `DelayCLIAPI:delay_until` | Wait |\n| `EmailCLIAPI:*` | Send Email |\n| `ExcelCLIAPI:add_row` | Microsoft Excel: Append to Table |\n| `ExcelCLIAPI:add_rows` | Microsoft Excel: Append to Table |\n| `FilterAPI:filter` | Filter |\n| `FilterCLIAPI:filter` | Filter |\n| `FilterCLIAPI:zapier_filter` | Filter |\n| `GmailAPI:message` | Gmail: Send (or Gmail Trigger as the first step) |\n| `GmailV2API:message` | Gmail: Send (or Gmail Trigger as the first step) |\n| `GoogleMailCLIAPI:message` | Gmail: Send (or Gmail Trigger as the first step) |\n| `GoogleMailV2CLIAPI:message` | Gmail: Send (or Gmail Trigger as the first step) |\n| `GoogleSheetsAPI:add_row` | Google Sheets: Append Row |\n| `GoogleSheetsAPI:add_rows` | Google Sheets: Append Row |\n| `GoogleSheetsCLIAPI:add_row` | Google Sheets: Append Row |\n| `GoogleSheetsCLIAPI:add_rows` | Google Sheets: Append Row |\n| `GoogleSheetsV2API:add_row` | Google Sheets: Append Row |\n| `GoogleSheetsV2API:add_rows` | Google Sheets: Append Row |\n| `GoogleSheetsV2API:new_or_updated_row` | Google Sheets Trigger |\n| `GoogleSheetsV2API:new_row` | Google Sheets Trigger |\n| `GoogleSheetsV2API:new_row_notify_hook` | Google Sheets Trigger |\n| `GoogleSheetsV2API:updated_row_notify_hook` | Google Sheets Trigger |\n| `GoogleSheetsV2CLIAPI:add_row` | Google Sheets: Append Row |\n| `GoogleSheetsV2CLIAPI:add_rows` | Google Sheets: Append Row |\n| `GoogleSheetsV2CLIAPI:new_or_updated_row` | Google Sheets Trigger |\n| `GoogleSheetsV2CLIAPI:new_row` | Google Sheets Trigger |\n| `GoogleSheetsV2CLIAPI:new_row_notify_hook` | Google Sheets Trigger |\n| `GoogleSheetsV2CLIAPI:updated_row_notify_hook` | Google Sheets Trigger |\n| `HubSpotCLIAPI:_zap_raw_request` | HTTP Request (HubSpot API: API request) |\n| `HubSpotCLIAPI:company_crmSearch` | HTTP Request (HubSpot API: Search companies) |\n| `HubSpotCLIAPI:contact_crmSearch` | HTTP Request (HubSpot API: Search contacts) |\n| `HubSpotCLIAPI:create_associations` | HTTP Request (HubSpot API: Create an association between two records) |\n| `HubSpotCLIAPI:deal_crmSearch` | HTTP Request (HubSpot API: Search deals) |\n| `HubSpotCLIAPI:find_associations` | HTTP Request (HubSpot API: Find the associations of a record) |\n| `HubSpotCLIAPI:update_crm_deal` | HTTP Request (HubSpot API: Update a deal) |\n| `HubSpotCLIAPI:upsert_contact` | HubSpot: Create or Update Contact |\n| `InterfacesCLIAPI:new_form_submission` | n8n Form Trigger |\n| `LinearCLIAPI:create_issue` | Linear: Create Issue |\n| `LoopingCLIAPI:*` | Split Out |\n| `NotionCLIAPI:create_database_item` | Notion: Create Database Page |\n| `OpenAiCLIAPI:send_prompt` | OpenAI: Message a Model |\n| `S3API:file` | AWS S3: Upload |\n| `ScheduleAPI:*` | Schedule Trigger |\n| `SlackAPI:channel_message` | Slack: Send Message (or Slack Trigger as the first step) |\n| `SlackAPI:direct_message` | Slack: Send Message (to a user) |\n| `SlackAPI:send_channel_message` | Slack: Send Message (or Slack Trigger as the first step) |\n| `SlackCLIAPI:channel_message` | Slack: Send Message (or Slack Trigger as the first step) |\n| `SlackCLIAPI:direct_message` | Slack: Send Message (to a user) |\n| `SlackCLIAPI:send_channel_message` | Slack: Send Message (or Slack Trigger as the first step) |\n| `StorageCLIAPI:get_all_values` | Code (static data) |\n| `StorageCLIAPI:get_value` | Code (static data) |\n| `StorageCLIAPI:increment_value` | Code (static data) |\n| `StorageCLIAPI:remove_value` | Code (static data) |\n| `StorageCLIAPI:set_value` | Code (static data) |\n| `TableCLIAPI:create_record` | Data Table: Insert Row |\n| `TableCLIAPI:find_record` | Data Table: Get Rows |\n| `TableCLIAPI:increment_value` | Code (increment a Data Table value) |\n| `TableCLIAPI:new_or_updated_record` | Schedule + Data Table (watch rows) |\n| `TableCLIAPI:new_record` | Schedule + Data Table (watch rows) |\n| `TableCLIAPI:update_record` | Data Table: Update Row |\n| `TableCLIAPI:updated_record` | Schedule + Data Table (watch rows) |\n| `TallyCLIAPI:response` | Webhook (Tally) |\n| `TelegramCLIAPI:send_message` | Telegram: Send Message |\n| `TodoistV2DevAPI:new_task` | Todoist: Create Task |\n| `WebHookCLIAPI:catch_hook` | Webhook |\n| `WebHookCLIAPI:catch_raw_hook` | Webhook |\n| `WebHookCLIAPI:custom_request` | HTTP Request |\n| `WebHookCLIAPI:get` | HTTP Request |\n| `WebHookCLIAPI:hook` | Webhook |\n| `WebHookCLIAPI:hook_raw` | Webhook |\n| `WebHookCLIAPI:hook_v2` | Webhook |\n| `WebHookCLIAPI:patch` | HTTP Request |\n| `WebHookCLIAPI:post` | HTTP Request |\n| `WebHookCLIAPI:put` | HTTP Request |\n| `WebhooksCLIAPI:catch_hook` | Webhook |\n| `WebhooksCLIAPI:catch_raw_hook` | Webhook |\n| `WebhooksCLIAPI:custom_request` | HTTP Request |\n| `WebhooksCLIAPI:get` | HTTP Request |\n| `WebhooksCLIAPI:hook` | Webhook |\n| `WebhooksCLIAPI:hook_raw` | Webhook |\n| `WebhooksCLIAPI:hook_v2` | Webhook |\n| `WebhooksCLIAPI:patch` | HTTP Request |\n| `WebhooksCLIAPI:post` | HTTP Request |\n| `WebhooksCLIAPI:put` | HTTP Request |\n| `ZapierFormatterCLIAPI:*` | Edit Fields |\n| `ZapierMailCLIAPI:outbound` | Send Email |\n\n</details>\n<!-- supported:end -->\n\nAnything else still gets a place in the workflow: the closest of 362 n8n app nodes, an HTTP request to the\napp's API, or a Code node with the inputs already wired, each disabled with a note on how to finish it.\n\n## What does not convert, and why\n\n- **Credentials.** Make and Zapier never export them. Create them in n8n; the report lists which nodes need one.\n- **Data.** Make data stores and Zapier Tables become n8n Data Tables (n8n 1.113 or newer) with the same\n  fields, but the rows stay behind.\n- **Webhook URLs.** n8n gives each webhook a new address. The report names them so you can update the senders.\n- **Python code** from Zapier or Make. n8n runs Python, but reads inputs differently in 1.x and 2.x: the code is\n  placed in a Code node for you to adapt.\n- **Output field names of apps.** n8n's app nodes sometimes name results differently. Steps that read them are\n  marked ⚠️ so you can check the field once after a test run.\n\n## Command line\n\n```text\nmigrate-to-n8n convert <file> [-o <folder>] [--zap <id or title>]...\nmigrate-to-n8n list-zaps <file>\nmigrate-to-n8n supported [text] [--source make|zapier]\nmigrate-to-n8n check <workflow.json>\nmigrate-to-n8n upload <workflow.json>      # needs N8N_URL and N8N_API_KEY\nmigrate-to-n8n serve                       # MCP server over stdio\n```\n\n## Development\n\n```bash\nnpm install\nnpm run n8n-types     # n8n's node catalogs, for the tests (kept out of the package)\nnpm test              # unit tests, golden conversions, checks against n8n's own node descriptions\nnpm run corpus -- download && npm run corpus -- stats    # measure on public exports (needs gh)\ndocker compose -f docker-compose.e2e.yml up -d && npm run e2e   # real n8n 2.x and 1.x\n```\n\nEvery node the converter writes is checked against the parameter descriptions of n8n 2.44 and 1.123: names,\nallowed values and display rules. The n8n catalogs are downloaded for tests only and never ship.\n\n## Roadmap\n\n- Routers inside Make error-handler routes (today the modules of a handler are placed in one line on the error output).\n- More apps, driven by what people convert. Tell me which ones you need.\n\n## Contact\n\nFeedback, ideas, job offers or custom projects (n8n, MCP, AI automation): [kotiniiqq@gmail.com](mailto:kotiniiqq@gmail.com).\nBug reports and feature requests are welcome in [Issues](https://github.com/kotiniiqq/migrate-to-n8n/issues).\n\n## License\n\nMIT. Make, Zapier and n8n are trademarks of their owners; this project is not affiliated with them.\n","readmeFilename":"README.md","homepage":"https://github.com/kotiniiqq/migrate-to-n8n#readme","keywords":["n8n","make","make.com","integromat","zapier","migration","mcp","mcp-server","automation","workflow"],"repository":{"url":"git+https://github.com/kotiniiqq/migrate-to-n8n.git","type":"git"},"author":{"name":"Kyrylo Kalashnyk","email":"kotiniiqq@gmail.com"},"bugs":{"url":"https://github.com/kotiniiqq/migrate-to-n8n/issues"},"license":"MIT"}