
1. 为什么我把 n8n 和 AI 绑在一起用n8n 是一个开源的工作流自动化平台能做什么简单说它把「定时触发、HTTP 请求、数据库读写、邮件发送、日历创建」这些动作串成一条流水线你画好节点连线它替你跑。适合谁适合手里有一堆重复性操作、又不想写完整后端服务的开发者也适合想把 AI 能力塞进业务流程里的技术团队。我最初用 n8n 只是做定时抓数据、推送到群机器人这类事。后来发现一个痛点工作流越写越多但每次调用都要人去点、去填参数AI 明明能理解意图却没法直接触发这些流程。直到 n8n 内置了 MCP Server Trigger 节点加上 TaoToken 这种统一 Key/API 通道整条链路才真正打通——AI 识别意图调用 MCP 工具MCP 触发 n8n 工作流工作流去操作真实系统。这篇要交付的东西很具体一份可复制的 docker-compose.yml一份带 WebSocket 转发的 Nginx 配置一段 MCP Server 注册代码以及容器启动、接口连通性验证的完整动作。你跟着做能拿到一个「AI 能调用的 n8n 工作流」的最小闭环。先说清楚整体架构避免后面迷路。n8n 跑在 Docker 容器里前面挂 Nginx 做反向代理和 HTTPS 终止n8n 内部创建一个 MCP Server Trigger 节点暴露一个 MCP 地址AI 工具比如支持 MCP 的客户端连上这个地址就能读取你注册进去的工作流工作流里需要调用大模型时走 TaoToken 的统一 API 通道Key 和 Base URL 集中管理不用在每个节点里散落配置。这个组合的价值在于n8n 负责「执行」MCP 负责「暴露能力」TaoToken 负责「统一模型入口」。三者各司其职你不需要自己写一个 Agent 框架也不需要把 API Key 硬编码到每个工作流节点里。我试过把日历创建、邮件发送、数据同步三个工作流都注册成 MCP 工具AI 客户端里用自然语言说「帮我明天下午三点加个会」它就能自动选工具、填参数、触发执行。下面从部署开始一步步来。2. TaoToken 前置准备与统一 Key 通道在写 docker-compose 之前先把模型通道这件事定下来。n8n 工作流里如果要调用大模型比如做意图识别、文本总结、参数抽取传统做法是在每个 HTTP Request 节点里填 API Key 和 Base URL。工作流一多Key 散落各处换一次 Key 要改十几个节点非常痛苦。TaoToken 在这里的角色是「统一 Key/API 通道」。你可以在它的控制台创建一个 API Key拿到一个统一的 Base URL所有模型调用都走这个入口。n8n 里只需要在一个地方配置这个 Key其他节点引用即可。具体操作路径打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后进入控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在 API Keys 页面创建一个新 Key。这个 Key 就是后面 n8n 和 MCP Server 都要用的凭证。创建完 Key 之后你需要记下两个东西Base URL 是 https://taotoken.net/api 以及你的 Key 字符串通常以 sk- 开头。注意 API 地址不带 UTM 参数就是干净的 https://taotoken.net/api 。如果你不确定用哪个模型可以先到模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 试一下确认 Key 能正常调用再往 n8n 里配。这一步别跳过很多人后面报 401 就是因为 Key 没验证过。对于长期跑编码类或 Agent 类工作流的场景可以关注 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 它更适合高频调用的自动化任务。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 配置细节以文档为准。这里强调一个原则n8n 工作流里不要硬编码 Key。正确做法是把 Key 写进 n8n 的 Credential 或者环境变量节点里引用变量名。这样换 Key 只改一处MCP Server 那边也用同一个环境变量保持语义一致。准备好 Key 和 Base URL 之后就可以进入 Docker 部署环节了。下面给的 compose 文件里会预留环境变量位置你把自己的 Key 填进去即可。3. 可复制的 docker-compose.yml 与 Nginx 配置这一节是全文的核心交付物。我直接把可复制的配置贴出来你改掉域名和 Key 就能用。先看 docker-compose.yml。相比单条 docker run 命令compose 的好处是配置集中、重启方便、卷和网络声明清晰。version: 3.8 services: n8n: image: n8nio/n8n:latest container_name: n8n restart: unless-stopped ports: - 127.0.0.1:5678:5678 environment: - GENERIC_TIMEZONEAsia/Shanghai - TZAsia/Shanghai - N8N_HOSTn8n.example.com - N8N_PORT5678 - N8N_PROTOCOLhttps - N8N_EDITOR_BASE_URLhttps://n8n.example.com - WEBHOOK_URLhttps://n8n.example.com - N8N_PROXY_HOPS1 - N8N_ENCRYPTION_KEYyour_encryption_key_here - TAOTOKEN_API_KEYsk-your-key-here - TAOTOKEN_BASE_URLhttps://taotoken.net/api volumes: - n8n_data:/home/node/.n8n networks: - n8n_net volumes: n8n_data: networks: n8n_net: driver: bridge几个关键点解释一下。N8N_HOST、N8N_EDITOR_BASE_URL、WEBHOOK_URL 这三个必须配成你的真实域名否则 webhook 回调地址会错MCP 地址也会错。N8N_PROXY_HOPS1 是因为前面有 Nginx 一层代理不配的话 n8n 拿不到真实客户端 IP。N8N_ENCRYPTION_KEY 用于加密 Credential自己生成一个随机字符串别用默认值。TAOTOKEN_API_KEY 和 TAOTOKEN_BASE_URL 是我预留的环境变量n8n 工作流里通过 $env.TAOTOKEN_API_KEY 引用。这样 Key 不进代码库也不散落在节点里。启动命令docker compose up -d docker compose logs -f n8n看到日志里出现 Editor is now accessible via: https://n8n.example.com 就说明容器起来了。接下来是 Nginx 配置。n8n 的编辑器依赖 WebSocket不配 Upgrade 头会出现「无法保存工作流」的诡异问题。完整配置如下server { listen 443 ssl http2; server_name n8n.example.com; ssl_certificate /etc/nginx/certs/fullchain.pem; ssl_certificate_key /etc/nginx/certs/privkey.pem; location / { proxy_pass http://127.0.0.1:5678; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_read_timeout 3600s; proxy_send_timeout 3600s; } }proxy_read_timeout 调大是因为 MCP 长连接和 webhook 等待可能超过默认 60 秒。WebSocket 那三行是必须的少了就会在保存工作流时报错。配置好后重载 Nginxnginx -t nginx -s reload到这里n8n 已经可以通过域名访问了。打开 https://n8n.example.com 设置管理员账号进入编辑器界面。下一步是创建 MCP Server 并注册工作流。4. 创建 MCP Server 并注册工作流进入 n8n 编辑器后先创建一个最小工作流来验证链路。我以「创建日程」为例这个场景足够直观又能体现 AI 调用的价值。新建工作流添加一个 MCP Server Trigger 节点。这个节点的作用是启动一个 MCP 服务器暴露一个地址连上来的 AI 客户端可以读取你注册进去的工具。节点配置里有一个 Path比如填 /mcp那么完整地址就是 https://n8n.example.com/mcp。然后在 MCP Server Trigger 节点下挂一个 Tool 节点Tool 里再调用具体的工作流逻辑。这里有两种做法一种是把逻辑直接写在 Tool 下面另一种是引用已有工作流。我推荐后者工作流独立维护MCP 只做暴露层。创建日程的工作流逻辑添加一个「日历」节点选你常用的邮箱平台比如 Google Calendar 或 Outlook先创建 Credential填入第三方平台的 API Key。然后在日历节点里选「创建事件」参数是标题、开始时间、结束时间。这三个参数在 MCP Tool 里要描述清楚方便大模型正确抽取。Tool 的描述字段很关键。不要只写「创建日程」要写「根据用户提供的标题、开始时间、结束时间在指定日历中创建一个事件。时间格式为 ISO 8601」。描述越准确大模型填参数越靠谱。工作流里如果需要调用大模型做意图识别或参数抽取添加一个 HTTP Request 节点配置如下{ method: POST, url: {{$env.TAOTOKEN_BASE_URL}}/v1/chat/completions, headers: { Authorization: Bearer {{$env.TAOTOKEN_API_KEY}}, Content-Type: application/json }, body: { model: claude-3-5-sonnet, messages: [ {role: user, content: 从这句话里抽取日程标题、开始时间、结束时间{{$json.user_input}}} ] } }注意 Base URL 和 Key 都走环境变量不硬编码。模型 ID 按你实际可用的填TaoToken 文档里有模型列表。工作流保存后回到 MCP Server Trigger 节点把刚创建的工作流添加为 Tool。激活工作流右上角开关打开MCP 地址就生效了。验证 MCP 地址是否可达curl -N https://n8n.example.com/mcp如果返回 SSE 流或连接保持说明 MCP Server 正常。如果返回 404检查 Path 是否和 Nginx location 匹配如果返回 502检查 n8n 容器是否在跑。接下来在 AI 客户端里注册这个 MCP 地址。以支持 MCP 的客户端为例配置片段如下{ mcpServers: { n8n-calendar: { url: https://n8n.example.com/mcp, transport: sse } } }保存后客户端会拉取工具列表你应该能看到「创建日程」这个工具。用自然语言说「帮我明天下午三点加一个项目评审会」观察它是否自动调用工具并返回成功。这一步跑通整条链路就活了AI 识别意图 → 调用 MCP 工具 → 触发 n8n 工作流 → 操作真实日历。下面说几个我踩过的坑。5. 常见报错排查401、local proxy failed、reading choices这一节按真实报错来对照你遇到问题直接搜关键词。401 Unauthorized。最常见的原因是 TaoToken API Key 没配或配错。检查三处docker-compose 里的 TAOTOKEN_API_KEY 是否填了真实 Keyn8n 工作流 HTTP Request 节点里是否用了 {{$env.TAOTOKEN_API_KEY}}Key 是否在控制台被删除或过期。还有一种情况是 Authorization 头拼写错误必须是 Bearer 加空格加 Key。如果 Key 正确仍报 401去模型对话页面用同一个 Key 发一条消息确认 Key 本身有效。local proxy failed。这个报错通常出现在 n8n 容器无法访问外部 API 时。原因可能是容器网络配置问题或者 Base URL 写成了 localhost。注意容器里的 localhost 指向容器自己不是宿主机。如果你在容器里访问宿主机的服务要用宿主机的内网 IP 或 host.docker.internal。TaoToken 的 Base URL 是公网地址 https://taotoken.net/api 容器直接访问即可不需要代理。reading choices。这个报错说明你解析响应时响应体里没有 choices 字段。常见原因请求根本没成功返回的是错误对象或者模型 ID 写错导致返回了非预期结构。排查方法在 HTTP Request 节点里打开「Response」查看原始返回如果是 {error: {...}}先解决错误如果返回正常但结构不同检查你用的模型是否走的是 OpenAI 兼容格式。TaoToken 的 /v1/chat/completions 是 OpenAI 兼容的choices[0].message.content 是标准路径。OAuth 相关报错。如果你在日历节点用 OAuth 连接第三方平台报 OAuth 错误通常是回调地址不匹配。检查第三方平台后台配置的回调 URL 是否和 n8n 的 WEBHOOK_URL 一致。n8n 的 OAuth 回调走的是 https://n8n.example.com/rest/oauth2-credential/callback 这个地址必须能在第三方平台的白名单里。MCP 连接失败。如果 AI 客户端连不上 MCP 地址先确认 n8n 工作流是激活状态未激活的 MCP Trigger 不监听。再确认 Nginx 的 proxy_read_timeout 够大SSE 长连接容易被短超时切断。最后确认客户端用的 transport 是 sse不是 stdio。WebSocket 保存失败。如果你在编辑器里保存工作流时报错或者界面卡住八成是 Nginx 少了 Upgrade 头。对照第 3 节的配置确认 proxy_http_version 1.1、Upgrade、Connection 三行都在。排查顺序建议先 curl 测 MCP 地址再测 TaoToken API最后测 AI 客户端。逐层排除不要一上来就怀疑最上层。6. 把这条链路用起来从验证到长期运行链路跑通之后你可以做几件事让它真正产生价值。第一把常用工作流都注册成 MCP 工具。比如「发送邮件」「查询数据库」「同步文件」「生成周报」。每个工具描述写清楚参数和用途AI 客户端里就能用自然语言调度。工具多了之后建议按业务分组MCP Server 可以建多个每个负责一类能力。第二把 TaoToken 的 Key 集中管理。所有工作流的模型调用都走同一个 Base URL 和 Key换模型只改一个地方。如果你有多个环境开发、生产用不同的 Key在 n8n 里通过环境变量区分。第三验证模型调用是否正常。除了在工作流里看日志也可以直接到模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 发一条消息确认 Key 和模型都可用。这一步在排障时特别有用能快速区分是 Key 问题还是工作流问题。第四长期跑编码类或 Agent 类任务的话Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 更适合高频调用场景。接入细节看文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite Key 管理在 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。最后说一个实用技巧n8n 的 MCP Server Trigger 支持多个 Tool 挂载你可以把「创建日程」「查询日程」「取消日程」三个工作流挂在同一个 MCP Server 下AI 客户端会一次性拉到三个工具根据用户意图自动选择。这样你不需要为每个功能单独配一个 MCP 地址管理成本低很多。整条链路的核心就三件事n8n 负责执行MCP 负责暴露TaoToken 负责统一模型入口。配置一次后面加工作流只是往 MCP 里挂 Tool 的事。