mcpField
N
n8n-hebrew-workflows

n8n-hebrew-workflows

github.com/skills-il生产力13161 次安装3 天前更新
代码仓库

关于 n8n-hebrew-workflows

面向在 n8n 中构建以色列业务自动化的工作流技能,涵盖本地发票、银行、政府数据、WhatsApp 和短信服务。还提供希伯来语处理、税务规则及各服务集成中的注意事项。

主要功能

  1. 01配置 Morning 与 EZCount 发票 API
  2. 02通过 Code 节点运行银行抓取库
  3. 03接入以色列政府 CKAN 数据
  4. 04处理 WhatsApp 与短信网关
  5. 05遵循发票门槛及消息合规规则

适用场景

  1. 01自动创建并发送以色列发票
  2. 02在 n8n 中处理银行交易以供对账
  3. 03查询政府登记或贸易数据
  4. 04发送符合条件的客户通知

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/skills-il/developer-tools --skill n8n-hebrew-workflows

安装后在 Claude Code 中输入/n8n-hebrew-workflows确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

evidence.json
m.html
metadata.json
optimization-log.json
SKILL_HE.md
references/
.gitkeep
israeli-api-endpoints.md
n8n-version-migration.md
n8n-workflow-authoring.md
shabbat-cron-patterns.md
webhook-auth-patterns.md
scripts/
.gitkeep

详细介绍

n8n 希伯来语工作流

说明

第 1 步:确定自动化模式

定时流程以 Schedule Trigger 开始,且必须添加安息日/节假日门控(第 4 步)。事件驱动流程(付款确认、表单提交)以 Webhook 触发器开始。当希伯来语文本需要编码或处理从右向左的文本时,应尽早添加 Code 节点(第 3 步);需要分类或摘要时,则添加 AI Agent 节点(第 7 步)。此处提及的每项以色列服务,其字段参考均见 references/israeli-api-endpoints.md。

第 2 步:在 n8n 中连接以色列 API
Morning(原名 Green Invoice)API

Morning(“hashbonit yeruka”/חשבונית ירוקה)使用 API 密钥和密钥来获取 JWT 令牌(不是 OAuth2)。配置 HTTP Request:

POST https://api.greeninvoice.co.il/api/v1/account/token
Body: { "id": "{{$env.GREEN_INVOICE_API_KEY}}", "secret": "{{$env.GREEN_INVOICE_API_SECRET}}" }

响应中包含有效期为 60 分钟的 JWT;传递该令牌,并设置为 Authorization: Bearer {{$json.token}}。

以色列 2026 年发票改革(门槛下调): 超过门槛的税务发票需要税务局分配编号(mispar haktza'a)。门槛在年中下调:

生效日期门槛
2026 年 1 月 1 日10,000 NIS
2026 年 6 月 1 日起5,000 NIS

该制度于 2024 年 5 月开始实施(25,000 NIS),随后从 2025 年 1 月起降至 20,000。因此,处理历史发票的工作流必须根据每张发票自身日期当时生效的门槛进行判断。完整时间表见 references/israeli-api-endpoints.md。

这由两条不同的规则管辖,混淆二者是最常见的错误。 卖方的义务依据第 47 条第 (א2)(1) 款,仅在买方提出要求且交易不适用零税率时产生:“ובעסקה שסכומה, בלא המס, עולה על הסכום האמור בסעיף 38(א1), חייב הוא לעשות כן לפי דרישת הקונה; הוראות סעיף קטן זה יחולו לעניין חשבונית מס שהוצאה בשל עסקה שהמס שחל לגביה אינו בשיעור אפס”。买方丧失进项 VAT 抵扣的依据是第 38 条第 (א1) 款,不以买方提出要求为条件:“לא יותר ניכוי מס התשומות הכלול בחשבונית מס שסכומה, בלא המס, עולה על 5,000 שקלים חדשים (מינואר 2026 ועד מאי 2026: 10,000 שקלים חדשים) ושאינה כוללת מספר שהקצה לה המנהל”。因此,切勿把“买方从未提出要求”视为免责理由。注意 עולה על(超过):金额恰好为 5,000 的发票不属于该规则范围,因此应使用 >,而不是 >=。

门槛按 VAT 前金额计算。 应与 Morning 的 amount 字段比较,而不是 totalAmount。按 18% VAT 计算,在 5,000 NIS 门槛附近,两者相差 900 NIS,因此比较错误字段会导致该区间内的发票被错误分类。

将门槛设为可配置变量,不要将数字硬编码。金额单位为谢克尔小数,不是阿哥罗: price: 50 表示 50 NIS。

创建并交付文档是一次调用:没有任何端点可以通过电子邮件发送已有文档,因此交付属于创建操作的一部分,需通过 POST /api/v1/documents 上的 emailContent 和 attachment 实现。Morning 的 API 参考文档是一个仅使用 JS 的应用,对所有路径都返回 HTTP 200,因此本技能尚未验证确切的请求体结构。 不要臆造字段名称,也不要假设其与 EZCount 一致:请先在浏览器中阅读 https://www.greeninvoice.co.il/api-docs;若创建的文档缺少分配编号,应视为需要人工介入,而不是重试。

常用 Morning 端点:

端点方法用途
/api/v1/documents/searchPOST按日期范围、客户和状态搜索发票
/api/v1/documentsPOST创建新发票/收据
/api/v1/clients/searchPOST按名称或 osek 编号查找客户
/api/v1/documents/payments/searchPOST获取付款记录以进行对账
/api/v1/businesses/meGET获取当前企业信息

文档类型代码:10(报价单)、305(税务发票)、320(税务发票+收据)、330(贷项通知单)、400(收据)。完整端点详情和响应架构见 references/israeli-api-endpoints.md。

EZCount(EasyCount)API

EZCount 是常见的 Morning 替代方案。采用 REST + JSON,在请求正文中使用 api_key + api_email 进行身份验证(不是 Bearer,也不是 OAuth)。

POST https://api.ezcount.co.il/api/createDoc
Body: { "api_key": "...", "api_email": "...", "developer_email": "[email protected]",
        "type": 320, "customer_name": "שם הלקוח", "customer_email": "[email protected]",
        "item": [{ "details": "שירותי ייעוץ", "amount": 1, "price": 500, "vat_type": "INC" }] }

文件类型代码与 Morning 使用的税务局编号一致(305/320/330/400)。金额以新谢克尔小数表示;vat_type 默认为 PRE(未含增值税的价格),含增值税时使用 INC。

EZCount 的配额分配挂起状态会返回 HTTP 417,不是可重试字段。 其文档说明:“当文件正在等待税务局分配编号时,我们将返回状态 417。”不存在 allocation_status 字段,重试也不会消除此状态。对于 417,文档提供了四种选择:跳过分配编号、取消文件、提出进一步异议,或反向征税(以零税率增值税重新开具,由买方自行开票)。针对 417 分支处理,展示税务局的消息,并让人工选择,因为四种方式中有三种会产生税务影响。速率限制:每 10 秒 250 个请求,必须顺序发送,不可并行。

EZCount 和 Morning 生成的法律文件效果相同;选择用户已经在使用的套件即可。

通过 Code 节点使用 israeli-bank-scrapers

israeli-bank-scrapers 是一个 Node.js 库,而不是 CLI,因此需要通过 createScraper() 在 Code 节点中运行。要求 Node.js >= 22.22.2。运行需要满足三个条件,按遇到问题的顺序排列:在任务运行器上设置 NODE_FUNCTION_ALLOW_EXTERNAL=israeli-bank-scrapers,以便 require() 可以解析;确保机密传递路径可用(参见下方说明,“使用凭据存储”无法在 Code 节点中实现);以及使用正确的银行专属凭据键。键名是 password,绝不是 userPassword;第一个字段因银行而异(Hapoalim 使用 userCode,Leumi/Mizrahi/Max 使用 username,Discount/Mercantile 使用 id + num,Isracard/Amex 使用 id + card6Digits)。请读取 SCRAPERS[companyId].loginFields,不要自行假设字段结构。

机密传递路径需要谨慎选择,因为在 Code 节点中无法实现“从凭据存储中提取”。 Code 节点没有声明凭据,因此其中不存在 $credentials;而且在 2.x 中,默认也会单独禁止访问 $env。实际可行的方案有三种:在任务运行器上设置 N8N_BLOCK_ENV_ACCESS_IN_NODE=false 并继续使用 $env;从前置的、带有凭据的节点传入机密,但接受机密会进入执行数据;或在企业版中使用外部机密。

Cloudflare 拦截(2026): 机器人检测会阻止 Amex 和 Isracard 上的无头浏览器。维护中的分支 @sergienko4/israeli-bank-scrapers 通过 Camoufox 规避了这一问题。

请考虑抓取是否真的是合适的方案。 这种模式会保存客户当前有效的银行登录凭据,以便无头浏览器以客户身份登录,这与大多数以色列银行关于凭据共享的条款并不相符。《金融信息服务法》(חוק שירות מידע פיננסי)许可的替代方案(开放银行)才是面向客户的应用中更站得住脚的选择。可运行的示例代码、完整的 CompanyTypes 列表以及各银行的登录字段表,见 references/israeli-api-endpoints.md。

data.gov.il CKAN API
GET https://data.gov.il/api/3/action/datastore_search?resource_id=<guid>&q=<term>&limit=100

实用资源 ID:非营利组织注册处(be5b7935-3922-45d4-9638-08871b17ec95),可查询已注册的 Amuta;按 HS 编码划分的贸易统计数据(多个 ID)。API 返回希伯来语字段名;请使用 Code 节点在下游处理前将键名规范化为英文。

WhatsApp Business Cloud

n8n 内置了一流节点:用于发送的 n8n-nodes-base.whatsApp(“WhatsApp Business Cloud”,typeVersion 1.1,凭据 whatsAppApi),以及用于接收消息的 n8n-nodes-base.whatsAppTrigger。操作包括:发送、发送模板、发送并等待响应。

Meta 的两项规则会影响这些工作流。**24 小时客户服务窗口:**用户给你发消息或打电话后,会开启一个 24 小时窗口,在此期间可以发送自由格式消息;窗口之外只能发送预先批准的模板,而定时工作流按定义会在窗口之外触发,因此必须使用“发送模板”。模板需要事先获得批准,并归入营销、实用工具或身份验证这三个类别之一,因此请尽早提交审批。费用按已送达的消息计费(对话计费已于 2025 年 7 月 1 日结束),因此分发循环中的每个项目都会产生费用。

以色列 SMS 网关
网关主机身份验证最适用于
019 Telzar019sms.co.ilBearer 令牌,或用户名 + 密码批量营销、事务性消息
InforUMobilecapi.inforu.co.ilBearer 令牌(强制执行 IP 允许列表)OTP、事务性消息
Nexmo/Vonage ILrest.nexmo.comAPI 密钥 + 密钥国际 + 本地

**019 即使发送失败也会返回 HTTP 200。**身份验证失败时会返回 200 {"status":3,"message":"Username or password is incorrect..."},因此默认的 HTTP Request 节点会将其视为成功,并继续执行工作流,但实际上没有发送 SMS。请启用 Always Output Data,并使用 IF 节点根据 $json.status(0 = 已发送)分支判断,切勿根据 HTTP 状态码判断。除令牌外,InforUMobile 还会强制执行 IP 允许列表,因此也要在那里将 n8n 的出口 IP 列入允许列表,并在 Cardcom 和 Tranzila 中进行相同设置。

电话号码必须采用国际格式 972XXXXXXXXX(去掉开头的 0),规范化时必须进行验证,而不只是重新格式化:以色列固定电话前缀(02/03/04/08/09、072-077)以及 1-800 或 *NNNN 号码都无法接收 SMS,因此盲目地将 0 替换为 972 会悄悄破坏这些号码。各网关的请求正文和字段名称,以及用于检查前缀的规范化器,详见 references/israeli-api-endpoints.md。

影响整个工作流的三条以色列规则

1. 并非所有企业都可以开具税务发票。 עוסק פטור 不得开具 חשבונית מס(305 / 320),也不得收取任何增值税;他们应开具 קבלה 或 חשבונית עסקה。选择单据类型前,先确认增值税状态,绝不要将 305/320 硬编码。零税率情形(出口、向外国居民提供服务)和埃拉特免税也会影响税率,因此 vat_type 必须按每笔交易单独决定。编号必须连续且不可更改;发票出错时,应以贷项通知单(330)取消,绝不能删除;单据需保存 7 年,因此应持久化 PDF,而不是保存会过期的链接。

2. 自动化商业消息受监管。《通信法》(第 40 号修正案)第 30א 条适用于此工具能够发送的每条 SMS 和 WhatsApp 消息。第 30א(ב) 条要求发送前必须取得明确的书面同意。第 30א(י)(1) 条允许在无须证明损害的情况下,对每条违规发送并收到的消息处以最高 1,000 NIS 的赔偿,这正是批量循环发送所面临的风险。Meta 的 24 小时窗口是平台规则,不是法律规定;满足该规则并不代表已取得同意。

标注要求因渠道而异,而且经常被弄错。一般规则(第 30א(ה)(1)(א) 条)要求在消息开头注明 פרסומת。但第 30א(ה)(2) 条是针对 SMS 的例外:通过 SMS 发送的广告只需注明广告主名称和接收拒绝通知的联系方式(“יציין בדבר הפרסומת רק את שמו ואת דרכי יצירת הקשר עמו לצורך מתן הודעת סירוב”)。不要误以为一般规则适用,就在 SMS 模板前加上 פרסומת。

3. 这些工作流所处理的数据属于受监管的个人数据。 支付回调中的 Teudat zehut、实时银行凭据,以及传入第三方大模型的交易描述,都受经修订的《隐私保护法》(第 13 号修正案,2025 年 8 月生效)约束。尽量减少持久化保存的数据,将 Google Sheet 视为受监管数据库并设置保留规则;没有合法依据时,不要将可识别客户身份的数据发送给外国模型。

第 3 步:在 n8n 节点中处理希伯来语数据

Code 节点会以 UTF-8 处理字符串,因此原生支持希伯来语。问题会出现在数据边界处:CSV 导出需要 UTF-8-BOM,否则 Excel 会将其读作 ANSI;HTTP Request 响应需要明确指定 UTF-8 编码;电子邮件正文需要使用 <div dir="rtl">;data.gov.il 返回的希伯来语 JSON 键应在 Code 节点中规范化;字符串长度必须使用 Array.from(str).length,而不是 .length。以色列旧版银行和会计系统导出的文件通常采用 Windows-1255,而非 UTF-8,BOM 建议对此无效;客户提供的姓名还可能包含双向控制字符,导致金额在渲染后的发票上视觉顺序错乱。

使用 Intl.NumberFormat('he-IL', { style: 'currency', currency: 'ILS' }) 格式化货币。以色列单据使用 DD/MM/YYYY 格式:Morning 返回 ISO 8601,但政府数据集返回 DD/MM/YYYY 字符串,因此应显式解析,不要依赖 new Date(s)。解析辅助函数、希伯来语月份映射和会验证前缀的电话号码规范化器见 references/israeli-api-endpoints.md。

步骤 4:遵循安息日的调度

以色列的业务工作流不得在安息日(周五日落至周六日落)和犹太节日期间运行。n8n 的 Schedule Trigger 不提供原生支持,因此请在每个定时工作流的开头添加一个检查节点。

架构: Schedule Trigger -> HTTP Request (Hebcal) -> IF (是否为安息日?) -> 继续或停止

GET https://www.hebcal.com/shabbat?cfg=json&geonameid=293397&M=on

geonameid=293397 代表特拉维夫;耶路撒冷为 281184,海法为 294801,贝尔谢巴为 295530。耶路撒冷的安息日烛光点燃时间为日落前 40 分钟,海法和 Zikhron Ya'akov 为 30 分钟,其他地区为 18 分钟,因此 geonameid 至关重要。用于控制工作流的 Code 节点:

const now = new Date();
const items = $input.first().json?.items;
// FAIL CLOSED: if we cannot read the calendar we do not know, so we do not run.
if (!Array.isArray(items) || items.length === 0) return [];

// Pair each candle-lighting with the FIRST havdalah after it. Taking
// items.find('candles') and items.find('havdalah') is wrong: asked ON a chag,
// Hebcal returns that chag's havdalah BEFORE the next festival's candles, so
// the range test is unsatisfiable and the workflow runs on Yom Kippur.
const ev = items.filter(i => i.category === 'candles' || i.category === 'havdalah')
  .map(i => ({ cat: i.category, at: new Date(i.date) }))
  .sort((a, b) => a.at - b.at);

for (let k = 0; k < ev.length - 1; k++) {
  if (ev[k].cat === 'candles' && ev[k + 1].cat === 'havdalah'
      && now >= ev[k].at && now <= ev[k + 1].at) return [];
}
if (ev.length && ev[0].cat === 'havdalah' && now <= ev[0].at) return [];
return $input.all();

不要悄悄丢弃工作。 return [] 会结束分支,因此安息日期间到期的发票或客户通知会丢失,而不是延后处理。对于客户正在等待的事项,请将项目排队(使用工作流静态数据或表),并通过单独的安息日结束后工作流处理队列。

对于犹太节日,请查询 https://www.hebcal.com/hebcal?v=1&cfg=json&year=now&month=x&maj=on&mod=on&i=on,并筛选 yomtov: true 的项目。两个查询参数都至关重要,而且缺失时都不会报错。month=now 无效:它会返回 HTTP 200 和 "items": [],导致检查永远不会触发。如果没有 i=on,Hebcal 会提供流散地历法:2026 年有 13 个 yomtov 日,而以色列有 8 个,因此业务会在 5 个普通工作日停止。仅使用仅限工作日的 cron 并不能免去此项检查:以色列 2026 年 8 个 yomtov 日中有 6 天落在周日至周四,其中包括 Yom Kippur。references/shabbat-cron-patterns.md 提供修正后的模式、erev chag 所需的以色列本地日期处理方式,以及此检查未涵盖的禁食日和 chol-hamoed 情况。

步骤 5:以色列支付网关 Webhook

三家网关几乎涵盖了以色列所有银行卡交易,但各自采用不同的回调方式。完整的字段表、基础路径和 Bit 流程请参见 references/israeli-api-endpoints.md;此处列出决定正确性的要点。

网关回调形式成功判定去重键
Cardcom v11POST LowProfileResult 到你的 WebHookUrlResponseCode == 0TranzactionId
TranzilaGET 查询参数Response == '000'index
Grow by MeshulamPOST multipart/form-data(不是 JSON)webhookKey 与你存储的密钥匹配,然后重新读取asmachta

ReturnValue 不是 Cardcom 的状态字段。 Cardcom 自己的 v11 规范将其称为“要保存在交易中的数据字符串,通常发送你的唯一订单 ID,你会在 WebHook URL 中收到它”。它是你的透传值,会原样返回。根据它进行分支判断会错误批准被拒绝的支付。v11 中根本没有 DealResponse 字段;InternalDealNumber / CardOwnerID / NumOfPayments 是旧版经典 API 的字段名,不存在于结果对象中,因此使用 InternalDealNumber 构建的去重键始终为 undefined,重复开票保护也就永远不会触发。teudat zehut 和分期付款次数位于 TranzactionInfo 下,字段名分别为 CardOwnerIdentityNumber 和 NumberOfPayments。

绝不要直接依据回调正文开具单据。 Webhook URL 是公开的,而且这三家网关都不会对其负载签名,因此伪造的 POST 只要包含看似合理的金额,就能让工作流开具真实税务发票并消耗真实的分配号码。应先在服务器端重新读取交易(Cardcom 使用 TranzactionId,Grow 使用 getPaymentProcessInfo,Tranzila 使用 index),确认金额后再开具。Grow 还需要调用 approveTransaction 完成交易。

Bit 不是独立 API:它通过 Tranzila v2(在支付页面上设置 bit: true)或启用了 Bit 的 Grow 接入,并以不同的 transactionType 进入同一 Webhook 流程。

Webhook 身份验证

n8n 的 Webhook 节点支持 4 种身份验证模式:None、Basic Auth、Header Auth、JWT Auth。鉴于 2026 年未认证 Webhook 的 CVE 历史,公开可访问的 Webhook 使用“None”实际上就是一个漏洞。但对于上述 3 个以色列网关,传输层身份验证并非真正的控制措施:它们都不会对负载签名,因此,服务器端重新读取才是真正的保护措施。n8n 的 JWT Auth 会验证签名和 exp 声明,但不会验证 iss 或 aud。references/webhook-auth-patterns.md 中提供了可用代码片段,以及会导致朴素 HMAC 检查失效的原始请求体注意事项。

IP 白名单: Cardcom 和 Tranzila 要求将你的 Webhook IP 加入白名单。自托管意味着需要静态 IP 或固定出口的反向代理。

第 6 步:自托管注意事项
n8n 2.x 安全版本线与版本固定

n8n 2.0 于 2025 年 12 月发布;截至 2026 年 9 月,当前稳定版本为 2.38.7。固定为 >= 2.32.1,且绝不要使用 n8nio/n8n:latest。3 个严重漏洞(CVE-2026-44789:HTTP Request 节点原型污染导致 RCE;CVE-2026-44790:Git 节点任意文件读取;CVE-2026-44791:XML 节点补丁绕过)于 2026-05-14 披露,并在 2.22.1 中修复;高危的凭据窃取和沙箱逃逸修复则陆续在 2.31.5 和 2.32.1 中推出。CVE-2026-44789 处于此技能的关键路径上,因为这里的每个以色列集成都是 HTTP Request 节点,而每个支付网关工作流都会添加一个公开的 Webhook 节点。

2.0 的破坏性变更中有两项设置会影响此技能的代码;启用任务运行器(2.0 的默认设置)时,这两项都应配置在运行器上,而不是主容器中:

NODE_FUNCTION_ALLOW_BUILTIN=crypto
NODE_FUNCTION_ALLOW_EXTERNAL=israeli-bank-scrapers

N8N_BLOCK_ENV_ACCESS_IN_NODE 在 2.x 中也默认为 true,因此 Code 节点内的 $env.* 会静默返回空值。凭据存储在此处并不能解决问题,因为 Code 节点未声明任何凭据;请在第 2 步的 3 种方案中选择一种。

n8n 3.0 将于 2026 年 10 月发布,并移除自托管 npm 安装(仅支持 Docker)、Function / Function Item / Item Lists 节点、$getPairedItem 辅助函数,以及包含所有旧版 Agent 模式的 AI Agent 节点 v1。请基于当前的 Tools Agent 构建第 7 步。

完整 CVE 历史、2.0 破坏性变更表、重新启用 Execute Command 的方法、3.0 完整变更清单,以及以色列数据驻留托管选项,请参阅 references/n8n-version-migration.md。

以色列自托管的关键设置

将 GENERIC_TIMEZONE=Asia/Jerusalem 和 TZ=Asia/Jerusalem 都设置好。否则,Schedule Trigger 节点会按 UTC 运行,安息日时间计算将偏差 2-3 小时;以色列的夏令时从 3 月最后一个星期日之前的星期五开始,到 10 月最后一个星期日结束。设置稳定的 N8N_ENCRYPTION_KEY,确保凭据存储在重启后仍然可用;固定镜像标签,并将 Code 节点模块变量配置在任务运行器服务上。可直接使用的 Compose 文件和以色列数据驻留托管表见 references/n8n-version-migration.md。

步骤 7:面向以色列工作流的 n8n AI Agent 节点

n8n 2.x 提供原生 LangChain 集成(“Advanced AI” 节点组):Tools Agent、记忆节点、用于 RAG 的向量存储节点(Pinecone、Qdrant、Supabase pgvector),以及适用于 OpenAI、Anthropic 和通过 Ollama 使用的本地模型的模型节点。请基于 Tools Agent 构建:n8n 3.0 会移除 AI Agent 节点 v1,以及 SQL、Conversational、OpenAI Functions、Plan-and-Execute 和 ReAct 模式。

不要照搬教程中的模型名称。 当前的 Anthropic Chat Model 节点会在运行时从 Anthropic API 获取模型列表,而不是使用固定下拉列表,因此无需等待 n8n 发布新版,列表也会更新。请根据需求选择(用于希伯来语分类的中端前沿模型、用于较长希伯来语法律文本的最强可用模型、该系列中延迟最低的实时聊天模型,或在 PII 必须留在以色列时部署在以色列 VPS 上的本地多语言模型),然后从节点当前提供的选项中选择。对希伯来语语料库使用 RAG 时,请使用多语言嵌入模型(Cohere embed-multilingual-v3.0 或 OpenAI text-embedding-3-large);text-embedding-ada-002 对希伯来语的效果较弱。请注意,将客户交易描述传入外国模型是隐私方面的决策,而不仅仅是质量方面的决策。

n8n MCP 节点。 MCP Client Tool(@n8n/n8n-nodes-langchain.mcpClientTool)作为子节点连接,使 AI Agent 能够调用外部 MCP 服务上的工具,例如 agentskills.co.il 的 hebcal、israeli-bank 和 data-gov-il 服务。MCP Server Trigger(@n8n/n8n-nodes-langchain.mcpTrigger)会将 n8n 工作流本身公开为 MCP 工具,供 Claude Desktop、Cursor 或 Windsurf 调用;从 typeVersion 2 开始,它还支持 n8n 用户身份验证(OAuth2)。没有 toolMcp 节点:这是常见的幻觉,n8n 会拒绝使用该名称的工作流 JSON。希伯来语交易分类器的完整示例见 references/n8n-workflow-authoring.md。

步骤 8:平台选择、工作流 JSON 和凭据

当你需要自托管以满足以色列的数据驻留要求、无限量自动化,或需要完整代码访问权限来处理以色列 API 的特殊情况时,请选择 n8n,而非 Make.com 或 Zapier。这三种平台都没有内置的以色列 API 节点,因此无论选择哪种平台,都需要使用 HTTP Request 和 Code 节点;n8n 是唯一可以托管在以色列区域的平台。

工作流采用 JSON 格式:包含一个 nodes 数组(每个节点都有唯一的 name,用作连接键,以及 type,例如 n8n-nodes-base.httpRequest、typeVersion、parameters 和 position)和一个以源节点名称为键的 connections 对象。通过 POST /api/v1/workflows 导入,然后必须发布才能运行。请为每个节点固定使用当前的 typeVersion,不要照搬教程中的旧版本号;例如,Schedule Trigger 当前为 1.4,而大多数示例仍显示 1.2。

密钥应存储在 n8n 的加密凭据存储中,绝不要直接写入工作流 JSON。这里有一个需要注意的例外:Code 节点没有凭据,因此银行密钥和 HMAC 密钥需要使用步骤 2 中介绍的其中一种方式。Morning 也没有原生凭据,因此请先通过 HTTP Request 请求 /account/token,再将 Authorization: Bearer {{token}} 传递给后续节点;由于 JWT 会在 60 分钟后过期,请在每次执行时刷新。

references/n8n-workflow-authoring.md 中包含完整的对照表、完整的工作流 JSON 示例,以及各服务的凭据设置方法。

示例

示例 1:工作日早晨对账 Morning 发票

“每天早上,提取昨天的 Morning 发票,并标记仍未付款的发票。”

将 Schedule Trigger 设为 0 9 * * 0-4(以色列时间 09:00,因为已设置 GENERIC_TIMEZONE),然后连接到第 4 步的节假日门控节点,因为 2026 年的 8 个 yomtov 节日中有 6 个落在该 cron 时间范围内。接着使用 HTTP Request 请求 /api/v1/account/token 获取 JWT,再使用 HTTP Request 请求 /api/v1/documents/search,通过 Authorization: Bearer {{$json.token}} 进行身份验证,并将 fromDate/toDate 筛选为昨天、将 type 筛选为 305/320;然后使用 IF 节点根据付款状态分支,并添加 SMS 或 Send Email 节点,将希伯来语正文包裹在 <div dir="rtl"> 中。

示例 2:将银行交易写入 Google Sheet,并避开节假日

“每晚抓取我的商业账户,并将新交易追加到表格中,但跳过安息日和节假日。”

依次使用 Schedule Trigger、Hebcal 请求,以及第 4 步中的配对扫描门控节点(失败时关闭);然后使用 Code 节点,通过 createScraper() 运行 israeli-bank-scrapers,并设置真实的 secret 路由;再使用 Code 节点规范化希伯来语描述和 DD/MM/YYYY 日期;最后使用 Google Sheets Append。另添加一个单独的 Error Trigger 工作流,因为无人值守的抓取一旦抛出异常,就会直接停止且不会发送通知。

推荐的 MCP 服务

  • hebcal:希伯来历/犹太历日历和安息日时间,可替代在每个工作流中调用 Hebcal HTTP。
  • israeli-bank:以色列银行账户数据;让 Agent 无需在 Code 节点中运行 israeli-bank-scrapers 即可提取交易。
  • data-gov-il:以色列政府开放数据(CKAN),可查询注册信息,无需手动构建 HTTP Request 节点。

参考链接

来源URL
n8n 文档https://docs.n8n.io/
n8n 2.0 重大变更https://docs.n8n.io/changelog/v20-breaking-changes
n8n 在 Code Node 中启用模块https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/configuration-examples/enable-modules-in-code-node
n8n 屏蔽节点访问https://docs.n8n.io/hosting/securing/blocking-nodes/
Morning(Green Invoice)APIhttps://www.greeninvoice.co.il/api-docs
Hebcal APIhttps://www.hebcal.com/home/developer-apis
data.gov.il CKAN APIhttps://data.gov.il/api/3/action/help_show?name=datastore_search_sql

注意事项

  • Agent 固定使用 :latest 或过时的 2.1x/2.2x 标签。 仅 2.21.4 就有 68 项已发布的安全公告,其中 3 项为严重(CRITICAL)(CVE-2026-44789/44790/44791 漏洞链,已在 2.22.1 中修复),此外,直到 2.32.1 才修复了高危(HIGH)的凭据窃取问题。任何公开的 Webhook 节点都会扩大暴露范围。固定使用 >= 2.32.1;当前稳定版为 2.38.7。
  • Agent 为 MCP 客户端工具写入 @n8n/n8n-nodes-langchain.toolMcp。 不存在这样的节点。对应的类型是 mcpClientTool 和 mcpTrigger。
  • Agent 从定时工作流发送 WhatsApp 自由文本消息。 到那时,Meta 的 24 小时客户服务窗口已关闭,因此只有经批准的模板才能送达。使用 Send Template,并在工作流上线前取得模板批准。
  • Agent 把 EZCount 的 417 当作瞬时错误重试。 417 表示税务局尚未分配号码;重试无法解决此问题。不存在 allocation_status 字段。针对 417 分支处理,并说明文档中列出的 4 种选项。
  • Agent 在 Code 节点中使用 $env 读取密钥。 在 2.x 中默认禁用,因此读取会无声地返回空值,节点随后因值未定义而失败。但凭据存储并不能解决问题(Code 节点没有凭据);请在步骤 2 中选择 3 种方案之一。
  • Agent 在 Code 节点中调用 require(),却没有将模块列入允许列表。 require('crypto') 需要设置 NODE_FUNCTION_ALLOW_BUILTIN=crypto;require('israeli-bank-scrapers') 需要设置 NODE_FUNCTION_ALLOW_EXTERNAL=israeli-bank-scrapers。启用任务运行器后(2.0 默认设置),两者都会在运行器中执行,而不是在主容器中执行。
  • Agent 将 UTC 设为定时触发器的默认时区。 以色列使用 Asia/Jerusalem;夏令时从 3 月最后一个星期日之前的星期五开始,到 10 月最后一个星期日结束。设置 GENERIC_TIMEZONE,并在每次夏令时切换后重新验证。
  • Agent 假设金额已含 VAT。 以色列发票通常显示的是 VAT 前金额(lifnei maam)。Morning 同时返回 amount(VAT 前)和 totalAmount(含 VAT)。当前 VAT 为 18%(2026 年)。
  • Agent 硬编码一个点蜡烛时间。 时间因城市而异(耶路撒冷为日落前 40 分钟,海法和 Zikhron Ya'akov 为 30 分钟,特拉维夫及其他地区为 18 分钟),因此固定时间可能会在某个地方的安息日期间运行。
  • Agent 根据 Cardcom Webhook 的 ReturnValue 进行分支处理。 这是回传的你自己的订单 ID,并非状态。请使用 ResponseCode == 0,并根据 TranzactionId 去重,而不是使用不存在的 InternalDealNumber。
  • Agent 使用 items.find('candles') 和 items.find('havdalah') 构建安息日门控。 如果在 chag 期间查询,Hebcal 会在下一个节日的点蜡烛时间之前返回该 chag 的 havdalah,因此范围测试永远不会为真,工作流会在 Yom Kippur 运行。请将每个点蜡烛时间与下一个 havdalah 配对,并在日历无法读取时默认拒绝通过。
  • Agent 告诉用户将 Code 节点密钥放入凭据存储。 Code 节点没有凭据。请在运行器上启用 $env,或从前置节点传入密钥。
  • Agent 直接根据支付 Webhook 正文开具发票。 URL 是公开的,而且以色列的支付网关都不会对其载荷签名。请先在服务端重新读取交易信息。
  • Agent 将单据类型硬编码为 305/320。 osek patur 可能不能开具税务发票,也可能不能收取 VAT。请先询问 VAT 身份。
  • Agent 在构建短信或 WhatsApp 群发流程时,未检查是否获得同意,也没有退订机制。 《通信法第 40 号修正案》(תיקון 40 לחוק התקשורת)规定的法定赔偿最高为每条消息 1,000 NIS,无需证明损害。
  • 2026 年发票改革的门槛将于 2026 年 6 月 1 日下调。 超过门槛的发票(截至 5 月 31 日为 10K NIS,自 6 月 1 日起为 5K NIS)通过 API 创建时需要分配号码。门槛按 VAT 前金额 计算,因此请与 Morning 的 amount 比较,而不是 totalAmount。将其设为工作流变量。法规使用 עולה על(超过),因此应使用 >,而非 >=;也绝不要根据买方是否提出要求来决定是否执行,因为第 38(א1) 条无论买方是否要求,都会禁止其抵扣。
  • Agent 使用 month=now 且未设置 i=on 来构建 Hebcal 节日门控。 month=now 会返回 HTTP 200,但 items 数组为空,因此门控永远不会触发;省略 i=on 则会返回侨民日历(2026 年有 13 天 yomtov,而以色列有 8 天)。请使用 month=x&i=on。
  • Agent 信任以色列短信网关返回的 HTTP 状态。 019 在认证失败时仍会返回 HTTP 200,并在正文中包含 status: 3。请根据正文中的字段分支,而非状态码。
  • Agent 假设一个 Webhook 就代表一笔付款。 这 3 个网关都会重试。在创建单据前,请根据 TranzactionId / index / asmachta 去重,否则重试会开出重复发票并额外消耗一个分配号码。
  • n8n 编辑器的键盘快捷键在希伯来语布局下会失效。 画布读取的是 e.key,而非 e.code,因此 Ctrl+C 会得到 e.key = 'ב'。编辑时请切换到英文输入法。n8n issue #12569。
  • n8n 的表达式编辑器不支持 RTL。 希伯来语会按从左到右的顺序显示。请将较长的希伯来语文本字面量存储在工作流静态数据中,并按名称引用。
  • 无人值守的工作流若没有 Error Trigger,会静默失败。 定时抓取任务一旦抛出错误就会停止。请添加单独的 Error Trigger 工作流来发送告警。对瞬时故障启用各节点的 Retry On Fail,但安息日门控绝不能启用:重试后最终返回空数据时,必须默认拒绝通过。

随附资源

参考资料
  • references/israeli-api-endpoints.md -- 以色列 API 端点参考(Morning、data.gov.il、短信网关、支付网关、Hebcal)。
  • references/shabbat-cron-patterns.md -- 预构建的、支持安息日的调度模式,并集成 Hebcal。
  • references/webhook-auth-patterns.md -- HMAC 签名验证 + JWT 声明验证 Code 节点代码片段。
  • references/n8n-version-migration.md -- 完整的 CVE 历史、2.0 重大变更表、3.0 完整移除列表、以色列托管选项。
  • references/n8n-workflow-authoring.md -- 平台选择、工作流 JSON 结构、凭据设置、AI Agent 详情、扩展故障排查。

故障排查

症状原因解决方法
Morning API 返回 401JWT 已过期(TTL 为 60 分钟)每次执行开始时刷新令牌;将其连同时间戳缓存到 $getWorkflowStaticData('global'),并在超过 55 分钟后刷新
CSV 导出中的希伯来语乱码缺少 UTF-8 BOM,因此 Excel 会按 ANSI 读取将 Spreadsheet File 编码设为 UTF-8-BOM
Cardcom 回调始终未到达URL 无法从公网访问,或 IP 未列入白名单使用有效 SSL 的公共 HTTPS,将 WEBHOOK_URL 设为与公共主机匹配,并在 Cardcom 控制面板中将 n8n 的 IP 列入白名单
Schedule Trigger 在安息日期间运行服务器时区为 UTC,或门控逻辑配对了错误的蜡烛点燃时间/哈夫达拉时间(见步骤 4)设置 GENERIC_TIMEZONE 和 TZ,然后在 Code 节点中记录 new Date().toString() 以确认;使用配对扫描门控逻辑
israeli-bank-scrapers 在 Code 节点中失败require() 被阻止、机密未定义,或每家银行的凭据键不正确在任务运行器上设置 NODE_FUNCTION_ALLOW_EXTERNAL,选择可用的机密配置方式(步骤 2),并读取 SCRAPERS[companyId].loginFields
Cloudflare 阻止 Amex/Isracard 抓取无头浏览器触发了机器人检测使用维护中的 @sergienko4/israeli-bank-scrapers 分支(Camoufox)

更详细的诊断信息,包括运行器镜像依赖项和 Chromium 的内存下限,请参阅 references/n8n-workflow-authoring.md。

评论

支持 Markdown