n8n và AI agent: quy trình mà bước nào cũng nhìn thấy được
Phần lớn doanh nghiệp sẽ gặp AI agent không phải trong một công cụ lập trình mà trong một quy trình nghiệp vụ: đòi công nợ, phân loại email, trả lời câu hỏi của nhân viên. n8n là nơi rất nhiều thứ như vậy được dựng. n8n 2.x có gì cho agent (node AI Agent, MCP theo cả hai chiều, duyệt lời gọi tool bởi con người, bản preview Agents), một cấu hình self-host đủ sức chạy production, hai workflow đã test để bạn import, và câu hỏi về giấy phép mà công ty dịch vụ nào cũng phải trả lời.

English version: n8n and AI Agents: Workflows Where Every Step Is Visible. Phần 12 của series. Phần trước: Paseo. Series bắt đầu từ Agent Loop.
Yêu cầu đến từ phòng tài chính của một khách hàng, không phải từ team kỹ thuật của họ: "Chúng tôi muốn một AI đi đòi các hoá đơn quá hạn." Sau một buổi chiều ngồi với họ, điều họ thực sự muốn là thế này. Mỗi sáng, tìm các hoá đơn đã quá hạn. Với từng hoá đơn, tra thông tin khách hàng và điều khoản hợp đồng, soạn thư nhắc bằng tiếng Việt hoặc tiếng Anh tuỳ khách, rồi gửi đi, nhưng chỉ sau khi có người bên tài chính xem qua. Ghi lại những gì đã gửi.
Có hai phần cần phán đoán: quyết định thư nhắc nên viết gì, và xử lý thư trả lời. Mọi thứ còn lại là đường ống nối giữa hệ thống kế toán, một hộp thư và một công cụ chat. Còn người sẽ sở hữu hệ thống sau khi chúng tôi rời đi là một chuyên viên vận hành, không viết Python nhưng cả ngày đọc lưu đồ.
Tổ hợp đó, một chút phán đoán bọc trong rất nhiều tích hợp, do một người không phải lập trình viên sở hữu, là nơi phần lớn doanh nghiệp sẽ gặp agent đầu tiên. n8n là công cụ chúng tôi chọn trong tình huống đó, và bài này nói về cách dùng nó cho tốt.
n8n năm 2026 là gì
n8n là một nền tảng tự động hoá quy trình: một canvas nơi bạn nối trigger (webhook, lịch chạy, email mới, tin nhắn chat) với các node làm việc (gọi API, query database, biến đổi dữ liệu, rẽ nhánh), với hàng trăm tích hợp có sẵn. Nó chạy dưới dạng n8n Cloud hoặc self-host, và bản self-host miễn phí cho mục đích nội bộ theo giấy phép fair-code của n8n, điều tôi sẽ quay lại ở cuối vì nó quan trọng với các công ty dịch vụ.
Bản 2.0 ra tháng 12/2025 là một bản siết chặt bảo mật, và nếu lần cuối bạn xem n8n là ở 1.x thì một số mặc định đã đổi. Code node giờ chạy trong task runner tách riêng. Code node không còn đọc được biến môi trường trừ khi bạn cho phép (N8N_BLOCK_ENV_ACCESS_IN_NODE mặc định là true). Node Execute Command và Local File Trigger bị tắt mặc định. Các node đọc ghi file bị giới hạn trong một thư mục. OAuth callback yêu cầu xác thực. Nút Activate thành Publish và Unpublish, MySQL và MariaDB không còn được hỗ trợ làm nơi lưu trữ, và Python dựa trên Pyodide bị bỏ để nhường cho Python native trong task runner chạy ngoài. Tất cả đều tốt cho ai đang chạy agent, vì xét cho cùng agent là những chương trình tự quyết định lúc chạy xem sẽ làm gì.
Riêng với agent, n8n giờ cho bạn bốn thứ:
- node AI Agent, đặt một vòng lặp gọi tool vào bên trong workflow, với chat model, memory và tool gắn vào dưới dạng sub-node;
- MCP theo cả hai chiều: MCP Server Trigger phơi workflow thành tool cho bất kỳ MCP host nào, và MCP Client Tool cho agent trong n8n dùng bất kỳ MCP server nào;
- con người duyệt lời gọi tool, để một người phê duyệt những hành động cụ thể trong Slack, Teams, email hay chat trước khi chúng chạy;
- và từ bản 2.32, Agents (đang preview): trợ lý độc lập dựng trong Agent Builder, gọi được từ Slack, Telegram, Linear, lịch chạy và workflow.
Cách tôi nghĩ về nó là ý tưởng graph engineering ở phần 9 cộng thêm một canvas. Các bước tất định là node bình thường, nhìn thấy được và test được. Phần phán đoán là một node AI Agent với một bộ tool nhỏ, tường minh. Ai đọc được lưu đồ cũng thấy hệ thống làm gì và model được phép quyết định ở đâu.
Một cấu hình self-host đủ sức chạy production
Lệnh docker run một dòng trong docs đủ để dùng thử. Với thứ bạn sẽ phụ thuộc vào, hãy chạy Postgres thay cho SQLite mặc định, tự đặt encryption key, và chạy task runner thành container riêng. Đây là file compose chúng tôi dùng làm điểm xuất phát:
# compose.yaml — n8n 2.x with Postgres and external task runners
services:
postgres:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_DB: n8n
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set in .env}
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n -d n8n"]
interval: 5s
retries: 10
n8n:
image: n8nio/n8n:2.42.7
restart: unless-stopped
ports:
- "127.0.0.1:5678:5678" # behind a reverse proxy, never straight to the internet
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY:?set in .env} # encrypts stored credentials; back it up
WEBHOOK_URL: https://n8n.example.com/
GENERIC_TIMEZONE: Asia/Ho_Chi_Minh
TZ: Asia/Ho_Chi_Minh
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
N8N_DIAGNOSTICS_ENABLED: "false"
N8N_RUNNERS_MODE: external
N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN:?set in .env}
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
runners:
image: n8nio/runners:2.42.7 # must match the n8n version exactly
restart: unless-stopped
environment:
N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN}
depends_on:
- n8n
volumes:
pg_data:
n8n_data:
Có bốn chi tiết đáng giải thích.
Ghim phiên bản, và giữ image runners đi cùng nhịp. Docs ghi rõ tag của n8nio/runners phải khớp chính xác với n8nio/n8n. Nâng cấp cả hai trong cùng một commit.
N8N_ENCRYPTION_KEY là chìa khoá của mọi credential bạn lưu. Nếu bạn không đặt, n8n tự sinh một key ở lần khởi động đầu và giữ trong data volume. Hãy tự đặt, cất trong secret manager, và backup tách riêng khỏi database. Một bản backup database không có key là một hộp đầy API token đã mã hoá mà không ai mở được.
Task runner chạy ngoài là nơi Code node thực thi. Chế độ internal vẫn chạy, và n8n 2.42 in ra cảnh báo deprecated cho nó lúc khởi động: chế độ external là hướng đi tiếp theo, vì cô lập và vì khả năng scale. Code do người viết, và ngày càng nhiều do các công cụ AI dựng workflow viết, không nên chạy bên trong process chính đang giữ credential của bạn.
Bind vào localhost và đặt một proxy phía trước. n8n phục vụ editor, webhook và các endpoint MCP trên cùng một cổng. Kết thúc TLS ở reverse proxy, và nếu bạn mở endpoint MCP qua đó, hãy làm theo docs: tắt proxy buffering, gzip và chunked transfer encoding cho các đường dẫn /mcp, nếu không các response dạng stream sẽ bị treo. Nếu chạy n8n ở queue mode với nhiều replica webhook, hãy định tuyến toàn bộ traffic /mcp* về một replica riêng; kết nối MCP sẽ gãy nếu các request của nó rơi vào những replica khác nhau.
Ví dụ 1: tool của công ty dưới dạng MCP server
Thứ đầu tiên tôi dựng cho khách hàng thường không phải là agent. Mà là một bộ tool nhỏ, chỉ đọc, trên các hệ thống của họ, phơi ra qua MCP, để mọi agent họ dùng (Claude, agent trong IDE, agent trong n8n) chạm vào cùng một nguồn dữ liệu qua một cánh cửa có kiểm soát. Trong n8n, cánh cửa đó là MCP Server Trigger.
Workflow dưới đây phơi ra một tool, lookup_invoice. Trong production, thân tool là một node Postgres hoặc HTTP Request gọi vào hệ thống kế toán; ở đây một Code Tool với một bảng nhỏ giúp ví dụ tự chạy được. Dán nó lên canvas của editor, hoặc import bằng n8n import:workflow --input=invoice-tools.json (import bằng CLI cần trường id ở cấp cao nhất):
{
"id": "invoiceToolsMcp",
"name": "Invoice tools (MCP)",
"nodes": [
{
"name": "MCP Server Trigger",
"type": "@n8n/n8n-nodes-langchain.mcpTrigger",
"typeVersion": 2.1,
"position": [0, 0],
"webhookId": "5f0c7d3e-9a52-4f3b-9d0e-3b1f7a2c6e11",
"parameters": {
"path": "invoices",
"authentication": "bearerAuth",
"instructions": "Read-only lookups in the accounting system. Use lookup_invoice with an id like INV-2026-0412."
},
"credentials": { "httpBearerAuth": { "id": "mcpBearer01", "name": "MCP bearer (invoices)" } }
},
{
"name": "lookup_invoice",
"type": "@n8n/n8n-nodes-langchain.toolCode",
"typeVersion": 1.3,
"position": [0, 220],
"parameters": {
"description": "Look up one invoice by id (e.g. INV-2026-0412). Returns customer, amount in VND, due date and status. Unknown ids return an error listing valid ids.",
"language": "javaScript",
"specifyInputSchema": true,
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"object\",\n \"properties\": {\n \"invoice_id\": { \"type\": \"string\", \"description\": \"Invoice id, e.g. INV-2026-0412\" }\n },\n \"required\": [\"invoice_id\"]\n}",
"jsCode": "// In production this is an HTTP Request or Postgres node; a table keeps the demo self-contained.\nconst invoices = {\n 'INV-2026-0412': { customer: 'Công ty Xây dựng An Phát', amount_vnd: 485000000, due: '2026-10-31', status: 'unpaid' },\n 'INV-2026-0398': { customer: 'Acme Pty Ltd', amount_vnd: 120000000, due: '2026-10-15', status: 'paid' },\n};\nconst inv = invoices[query.invoice_id];\nif (!inv) {\n return `unknown invoice ${query.invoice_id}; known ids: ${Object.keys(invoices).join(', ')}`;\n}\nreturn JSON.stringify({ id: query.invoice_id, ...inv });"
}
}
],
"connections": {
"lookup_invoice": { "ai_tool": [[{ "node": "MCP Server Trigger", "type": "ai_tool", "index": 0 }]] }
},
"settings": { "executionOrder": "v1" }
}
Sau khi import, tạo một credential Bearer Auth với một token ngẫu nhiên đủ dài, chọn nó trên trigger (credential id trong JSON sẽ không tồn tại trên instance của bạn), rồi publish workflow. Trigger có một test URL, chỉ sống khi bạn đang lắng nghe trong editor, và một production URL, sống khi workflow đã được publish. Agent chỉ nên thấy URL production.
Mọi điều ở phần 7 về cách viết tool đều áp dụng ở đây. Mô tả nói rõ tool trả về gì và cần truyền gì. Input có schema. Một id không tồn tại trả về thông điệp liệt kê các id hợp lệ thay vì kết quả rỗng, để model tự sửa được.
Vì đây là MCP thuần, client Python ở phần 7 gọi được nó. Với token trong header:
# call_n8n_mcp_auth.py — the MCP client from part 7, pointed at an n8n workflow
import asyncio
import os
from mcp import Client
from mcp.client.streamable_http import create_mcp_http_client, streamable_http_client
URL = "http://127.0.0.1:5678/mcp/invoices" # production URL of the MCP Server Trigger
http = create_mcp_http_client(headers={"Authorization": f"Bearer {os.environ['N8N_MCP_TOKEN']}"})
async def main():
async with Client(streamable_http_client(URL, http_client=http)) as client:
print("protocol:", client.protocol_version)
print("tools:", [t.name for t in (await client.list_tools()).tools])
for invoice_id in ["INV-2026-0412", "INV-9999"]:
r = await client.call_tool("lookup_invoice", {"invoice_id": invoice_id})
print(invoice_id, "->", r.content[0].text)
asyncio.run(main())
protocol: 2025-11-25
tools: ['lookup_invoice']
INV-2026-0412 -> {"id":"INV-2026-0412","customer":"Công ty Xây dựng An Phát","amount_vnd":485000000,"due":"2026-10-31","status":"unpaid"}
INV-9999 -> unknown invoice INV-9999; known ids: INV-2026-0412, INV-2026-0398
Không có token, cùng lời gọi tool đó nhận 403 Authorization data is wrong!. Để ý dòng protocol: n8n 2.42 nói bản 2025-11-25 có session, chưa phải bản 2026-07-28 không trạng thái, và Python SDK 2.x tự động lùi về bản đó. Điều này quan trọng nếu bạn định scale ngang các endpoint MCP của n8n; cho tới khi n8n áp dụng bản mới, quy tắc định tuyến về một replica ở trên vẫn đứng vững.
Với Claude Code thì vẫn là lệnh như với mọi remote MCP server:
claude mcp add --transport http --scope project invoices https://n8n.example.com/mcp/invoices \
--header "Authorization: Bearer ${N8N_MCP_TOKEN}"
Một điểm kỳ quặc trong docs có thể tiết kiệm cho bạn một giờ: claude.ai yêu cầu người dùng đăng nhập vào n8n khi kết nối tới MCP Server Trigger, kể cả khi authentication đặt là none. Đó là client duy nhất được biết là làm vậy.
Ví dụ 2: một agent bên trong workflow
Giờ tới chính agent. Phòng tài chính nói chuyện với nó trong n8n Chat; nó tra hoá đơn qua MCP server ở trên và soạn thư nhắc. Cấu trúc là node AI Agent với ba sub-node: một chat model, memory, và MCP Client Tool trỏ tới server hoá đơn của chúng ta.
{
"id": "collectionsAgent",
"name": "Collections assistant",
"nodes": [
{
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"typeVersion": 1.5,
"position": [0, 0],
"webhookId": "0b6f3f8e-3c5e-4d7a-9a51-6e2f4c1d8b22",
"parameters": {}
},
{
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"position": [260, 0],
"parameters": {
"options": {
"systemMessage": "You help the finance team chase overdue invoices.\nAlways look invoices up with lookup_invoice; never guess amounts or dates.\nAnswer in the language the user writes in. Amounts are in VND.\nYou cannot send anything yourself. If a reminder is needed, draft it and say who should approve it.",
"maxIterations": 6
}
}
},
{
"name": "Anthropic Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"typeVersion": 1.6,
"position": [120, 220],
"parameters": {
"model": { "__rl": true, "mode": "list", "value": "claude-sonnet-5", "cachedResultName": "Claude Sonnet 5" },
"options": {}
}
},
{
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"typeVersion": 1.4,
"position": [280, 220],
"parameters": { "contextWindowLength": 10 }
},
{
"name": "Invoice tools",
"type": "@n8n/n8n-nodes-langchain.mcpClientTool",
"typeVersion": 1.4,
"position": [440, 220],
"parameters": {
"endpointUrl": "http://localhost:5678/mcp/invoices",
"serverTransport": "httpStreamable",
"authentication": "bearerAuth",
"include": "selected",
"includeTools": ["lookup_invoice"],
"options": {}
},
"credentials": { "httpBearerAuth": { "id": "mcpBearer01", "name": "MCP bearer (invoices)" } }
}
],
"connections": {
"When chat message received": { "main": [[{ "node": "AI Agent", "type": "main", "index": 0 }]] },
"Anthropic Chat Model": { "ai_languageModel": [[{ "node": "AI Agent", "type": "ai_languageModel", "index": 0 }]] },
"Simple Memory": { "ai_memory": [[{ "node": "AI Agent", "type": "ai_memory", "index": 0 }]] },
"Invoice tools": { "ai_tool": [[{ "node": "AI Agent", "type": "ai_tool", "index": 0 }]] }
},
"settings": { "executionOrder": "v1" }
}
Bạn cần gắn credential Anthropic (hoặc đổi node model sang bất kỳ chat model nào khác) trước khi chạy. Tôi đã test phần MCP của workflow này trên n8n 2.42.7 bằng node MCP Client, node này gọi cùng endpoint với cùng credential mà không cần model; còn bản thân agent phụ thuộc vào key model của bạn.
Ba thiết lập gánh phần lớn sự an toàn.
maxIterations: 6. Agent loop ở phần 1, với giới hạn số bước chọn theo nhiệm vụ. Một trợ lý tra cứu và soạn thảo cần hai, ba lời gọi tool. Sáu là rộng rãi. Mặc định mười là quá nhiều cho hầu hết việc nghiệp vụ.
include: selected. MCP Client Tool chỉ phơi lookup_invoice, kể cả khi server về sau mọc thêm một tool ghi. Đây là cách phòng rug pull ở phần 7, áp ở phía client: agent nhận đúng những tool bạn chọn, không phải bất cứ gì server đang cung cấp hôm nay.
System prompt nói rõ agent không được làm gì. Nó không gửi được. Câu đó không phải là guardrail (guardrail là việc nó không có tool gửi), nhưng nó khiến hành vi của agent khớp với quyền của nó, nên agent soạn rồi bàn giao thay vì xin lỗi rằng mình thất bại.
Con người duyệt những hành động quan trọng
Rồi tới lúc phòng tài chính muốn agent tự gửi thư nhắc, có phê duyệt. Đây là chỗ tính năng con người duyệt lời gọi tool của n8n là công cụ đúng, và nó được cấu hình trong giao diện chứ không qua JSON.
Thêm một Gmail tool (hoặc Outlook, hoặc Slack) cho agent và để model điền người nhận, tiêu đề và nội dung bằng $fromAI(), ví dụ {{ $fromAI('to', 'customer billing email') }}. Sau đó mở Tools panel của agent, thêm một bước Human review, chọn kênh phê duyệt (Slack, Microsoft Teams, Gmail, Telegram, Discord, WhatsApp Business Cloud, Google Chat, Outlook hoặc n8n Chat), và đặt tool gửi thư phía sau nó. Tin nhắn phê duyệt có thể hiển thị chính xác điều model muốn làm:
The assistant wants to use {{ $tool.name }}:
{{ JSON.stringify($tool.parameters, null, 2) }}
Khi duyệt, tool chạy với tham số model đưa ra. Khi từ chối, tool không chạy và agent được báo là yêu cầu bị từ chối. Kênh phê duyệt không nhất thiết là kênh chat: phòng tài chính chat với agent trong n8n Chat còn yêu cầu phê duyệt đổ về một kênh Slack mà trưởng phòng theo dõi. Sau đó cập nhật system prompt để nói tool nào cần phê duyệt và phải làm gì khi bị từ chối (báo cho người dùng, đề nghị sửa bản nháp), nếu không agent sẽ thử lại đúng lời gọi đó.
Đây chính là các mức rủi ro ở phần 4, dưới một hình thức mà team vận hành nhìn thấy và tự sửa được. Đọc thì chạy tự do. Ghi mà hoàn tác được thì chạy kèm log. Ghi mà đi ra khỏi công ty, như một email gửi khách hàng, thì chờ một con người.
Agents (preview): cách dựng thứ hai
Từ bản 2.32, n8n còn có Agents, một tính năng tách biệt với node AI Agent, hiện đang ở dạng preview. Bạn tạo agent trong tab Agents của một project, cho nó model, chỉ dẫn và tool (tích hợp, workflow, MCP server, có phê duyệt cho tool nhạy cảm), tuỳ chọn thêm knowledge base, memory và sub-agent, test, rồi publish. Có thể gọi nó từ Slack, Telegram hay Linear, chạy theo lịch, hoặc gọi từ workflow bằng node Message an Agent.
Hướng đi này hợp lý: agent là một đối tượng hạng nhất có bản nháp và bản đã publish, thay vì một node chôn trong workflow. Dù vậy, hiện tại tôi vẫn dựng các quy trình production bằng node AI Agent, vì hành vi của tính năng preview có thể đổi, và vì bản workflow làm cho các bước tất định quanh agent trở nên tường minh. Tôi dùng Agents cho các trợ lý nội bộ, nơi một thay đổi hành vi không tốn kém bao nhiêu.
Câu hỏi về giấy phép
n8n không phải mã nguồn mở theo định nghĩa của OSI. Nó là fair-code theo Sustainable Use License, với một số tính năng enterprise theo giấy phép thương mại riêng. Với công ty dùng n8n cho quy trình của chính mình, chuyện này hiếm khi đáng bận tâm. Với một công ty dịch vụ như chúng tôi, chuyên dựng tự động hoá cho khách hàng, nó quyết định cách cấu trúc dự án. FAQ về giấy phép nói rõ các trường hợp chính:
- Dựng, chạy và bảo trì workflow trên instance n8n của chính bạn thay mặt khách hàng là được phép, kể cả tính phí cho công việc đó, miễn là khách hàng không truy cập trực tiếp vào instance của bạn.
- Cài n8n lên server của chính khách hàng cho họ là được, miễn là bạn không bán kèm dịch vụ hosting, vì như thế là cạnh tranh với n8n Cloud.
- Dùng n8n phía sau sản phẩm của bạn, nơi người dùng kích hoạt những tự động hoá do bạn dựng, là được phép. White-label n8n, hoặc để khách hàng tự dựng workflow trong một n8n do bạn host, thì không.
Tôi không phải luật sư, và FAQ không phải hợp đồng. Khi một deal rơi vào giữa các trường hợp đó, chúng tôi hỏi n8n trước khi ký, không phải sau.
Khi nào n8n là công cụ sai
n8n rất tốt khi công việc chủ yếu là tích hợp kèm một chút phán đoán, khi người sở hữu không phải lập trình viên, và khi phê duyệt và audit là quan trọng. Nó là công cụ sai khi:
- chính logic của agent là sản phẩm: lập kế hoạch phức tạp, nhiều tool, quản lý context tuỳ biến. Thứ đó thuộc về code với một harness (phần 2) và bộ eval (phần 5);
- bạn cần test và code review nghiêm túc cho logic workflow. Workflow sống dưới dạng JSON trong database. Export ra git và review diff được, nhưng không giống với code;
- độ trễ tính bằng mili giây là quan trọng, hoặc khối lượng đủ lớn để chi phí cho mỗi lần thực thi cộng dồn lại;
- workflow đã lớn quá mức một người đọc được trên một canvas. Tới lúc đó nó là một chương trình, và nên được viết như một chương trình.
Một mô hình chạy tốt với chúng tôi là giữ cả hai: agent khó nằm trong code, phơi ra dưới dạng MCP server hoặc sau A2A (phần 7 và 8), còn n8n lo trigger, tích hợp và phê duyệt bao quanh nó. Mỗi bên làm điều mình giỏi, và team vận hành vẫn nhìn thấy mọi bước.
Đến đây là hết đợt này của series. Mười hai phần, từ một vòng lặp bốn mươi dòng tới giao thức, graph, cả đội coding agent và quy trình nghiệp vụ. Công cụ sẽ tiếp tục đổi sau mỗi vài tháng. Những thói quen bên dưới thì không đổi kể từ phần 1: tool nhỏ và tường minh, vòng lặp có giới hạn, kiểm chứng không phụ thuộc vào việc model tự đồng ý với chính nó, và một con người ở những chỗ mà sai lầm đắt giá.
Tài liệu tham khảo
- n8n docs, MCP Server Trigger, Human-in-the-loop for tools, Build and manage agents
- n8n docs, 2.0 breaking changes và task runners
- n8n, Sustainable Use License FAQ
- n8n trên GitHub