关于 日本の給与・社会保険・労働法
面向日本薪资团队和软件开发者的薪资与劳动规则 API 和 MCP 服务,可计算各都道府县的扣款及法定金额,并附上依据条文或通知以便核查。
主要功能
- 01薪资与社会保险计算
- 02源泉税与奖金税计算
- 03标准报酬决定与改定
- 04休假免缴与最低工资数据
- 05营业日与节假日计算
- 06附带依据条文及原文
适用场景
- 01计算员工实发工资与扣款
- 02查询各都道府县的保险费率
- 03核算源泉税或休假免缴月份
- 04依据所引条文核查计算结果
MCP 相关
通过 MCP 服务向 AI 助手提供 30 个工具,涵盖薪资、税务、保险、休假和法规查询。可远程连接或通过 npx 运行,返回结果与 HTTP API 相同。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://japan-payroll-api.tsumugi.workers.dev/mcpclaude mcp add --transport http kishida-devil-jp-payroll https://japan-payroll-api.tsumugi.workers.dev/mcp{"mcpServers":{"kishida-devil-jp-payroll":{"type":"http","url":"https://japan-payroll-api.tsumugi.workers.dev/mcp"}}}在 Cursor 中打开{"servers":{"kishida-devil-jp-payroll":{"type":"http","url":"https://japan-payroll-api.tsumugi.workers.dev/mcp"}}}在 VS Code 中打开{"mcpServers":{"kishida-devil-jp-payroll":{"type":"http","url":"https://japan-payroll-api.tsumugi.workers.dev/mcp"}}}{"mcpServers":{"kishida-devil-jp-payroll":{"serverUrl":"https://japan-payroll-api.tsumugi.workers.dev/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
30| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| age | number | 否 | 年龄(岁)。此项或 birth_date 为必填项——长期护理保险仅适用于 40 至 64 岁,因此缺少年龄信息时无法确定保费。建议优先使用 birth_date。 |
| as_of | string | 否 | 保费所属月份:被保险人参保月份内的 ISO 日期,而非发薪日期。雇主可能从本月工资中扣除上月保费(《健康保险法》第 167 条),因此如果次月扣款,请传入发薪日期前一个月内的日期。此日期决定年龄节点并用于选择费率表;日期不在已公布期间内时会返回 422,而不是使用当前费率表。 |
| column | enum | 否 | 员工已提交扶养控除等申告书时填写 甲(通常情况),未提交时填写 乙。默认值为 甲。kou | otsu |
| birth_date | string | 否 | 出生日期,格式为 YYYY-MM-DD。强烈建议优先使用此项,而非 `age`:根据《年龄计算相关法律》,达到某年龄的日期是生日的前一天,因此出生于某月 1 日的人会在前一个月跨过年龄门槛,保费也会比简单计算得出的结果提前一个月变化。 |
| dependants | number | 否 | 源泉控除对象亲属人数。默认值为 0。 |
| income_tax | boolean | 否 | 设为 false 可跳过预扣税。默认值为 true。 |
| prefecture | string | 是 | 雇主适用事业所所在都道府县——可使用英文("Tokyo")、日文("東京" 或 "東京都")或 JIS 代码 1-47。健康保险费率因都道府县而异;养老金费率不变。 |
| resident_tax | number | 否 | 要扣除的居民税金额,单位为日元。居民税由市町村按上一年度收入征收,本工具不会推导该金额——请传入特别征收税额通知书上的金额。 |
| business_type | enum | 否 | 就业保险费率类别。默认值为 general。general | agriculture_forestry_fishery_sake | construction |
| commuting_fare | number | 否 | 驾车或骑自行车通勤时,在通勤补贴之外支付的合理车费或通行费。提供 commuting_distance_km 时,上限为距离档位金额加上此项,最高 150,000。 |
| monthly_salary | number | 是 | 税前月薪(日元),不扣除任何款项。 |
| employment_type | enum | 否 | 役員不属于就业保险被保险人(《雇用保险法》第 4 条)。公司高管请传入 "director",否则计算出的保费会过高。默认值为 employee。employee | director | director_employee |
| commuting_parking | number | 否 | 员工驾车或骑自行车通勤时自行支付的月停车费(日元)。每月最多 5,000,可加到距离档位金额中。需要 commuting_distance_km;仅乘火车通勤时没有可供累加的距离档位。 |
| workers_comp_type | string | 否 | 劳动灾害保险的事业种类编号,例如批发/零售/餐饮/酒店业为 "98"。工伤保险费用全部由雇主承担;除非传入此项,否则不计入,因为费率从 2.5/1000 到 88/1000 不等,且没有安全的默认值。费率表见 list_workers_compensation_rates。 |
| commuting_allowance | number | 否 | 每月通勤补贴(日元)。社会保险将其全额计入报酬;所得税则在上限内免税——公共交通每月上限为 150,000。请勿将其计入 monthly_salary:这样会对其征税;若将其漏掉,则会低估保费。拆分结果会返回在 earnings.items 中。 |
| commuting_distance_km | number | 否 | 驾车或骑自行车通勤的单程距离。免税上限将依据距离表(国税厅 No.2585)而非 150,000 的公共交通上限;不足 2 km 时无免税额。 |
| standard_remuneration | number | 否 | 由算定基础届或月额变更届确定的标准报酬月额。已知时请务必传入。若不传入,等级会根据你提供的工资重新推算;任何有加班费的月份都会算错——月薪 300,000 日元的员工在繁忙月份收入 369,469 日元时,会被多扣 8,445 日元。decide_regular_determination 会返回正确金额。 |
详细介绍
jp-payroll-mcp
这是一个用于计算日本工资、社会保险和劳动事务的 API 与 MCP 服务,而不是查阅表格后返回结果。 涵盖 47 个都道府县的保险费率、源泉所得税、标准报酬月额的确定与调整、休假期间的保险费免除、 加班工资、带薪年假、最低工资、工作日计算、令和 8 年年末调整,以及居民税预估金额。每个答案都附有依据的法条或通知。
我们逐格对照公开的金额表和税额表进行核验,每次变更都会运行 4,689 项验证。
两种使用方式
MCP 服务——用日语向 AI 助手提问。提供 30 个工具,免费,无需 API 密钥。 粘贴 URL(远程 MCP),或通过 npx 安装:
claude mcp add --transport http jp-payroll https://japan-payroll-api.tsumugi.workers.dev/mcp
claude mcp add jp-payroll -- npx -y jp-payroll-mcp
在 Claude.ai 自定义连接器、ChatGPT 和 Cursor 中,粘贴 https://japan-payroll-api.tsumugi.workers.dev/mcp。
HTTP API——集成到软件中。提供 45 个端点、OpenAPI 3.0 和批量处理:
curl "https://japan-payroll-api.tsumugi.workers.dev/v1/payroll?prefecture=Tokyo&monthly_salary=350000&birth_date=1986-04-01"
MCP 服务是 API 的轻量封装,因此两者会返回相同答案。 区别在于提问者是人还是程序。
为什么需要它
自行编写时,可能会得出看似合理、实际错误的数字。3 月 31 日离职与 3 月 30 日离职, 会导致 1 个月的社会保险费差异(东京、40 岁、月薪 30 万日元时,劳资双方合计为 95,130 日元)。4 月 1 日出生的人会在 3 月 31 日满 40 岁,因此护理保险费会提前 1 个月开始缴纳。随时调整中的“2 个等级以上”并未写入《健康保险法》, 而是见于昭和 36 年保发第 4 号通知。
- 解说文章:我们将日本工资计算与社会保险做成了 API 和 MCP
- MCP 服务详情:mcp/README.md
- 大批量处理的付费方案:RapidAPI
以下是英文详细规格。
日本工资、社会保险和劳动法,采用计算而非查表的方式提供结果—— 涵盖所有 47 个都道府县的保险费、源泉所得税、标准报酬的确定与调整、休假期间免缴、最低工资;每个 答案都附有其依据的法令或部长通知。
逐格对照公开表格进行核验:每次变更都会运行 4,689 项断言。
两种使用方式
作为 MCP 服务,通过 AI 助手提问。提供 30 个工具,免费,无需密钥。 远程使用(粘贴 URL)或本地使用(npx):
claude mcp add --transport http jp-payroll https://japan-payroll-api.tsumugi.workers.dev/mcp
claude mcp add jp-payroll -- npx -y jp-payroll-mcp
在 Claude.ai 自定义连接器、ChatGPT 和 Cursor 中,URL 为 https://japan-payroll-api.tsumugi.workers.dev/mcp。
作为 HTTP API,集成到软件中。提供 45 个端点、OpenAPI 3.0 和批量处理:
curl "https://japan-payroll-api.tsumugi.workers.dev/v1/payroll?prefecture=Tokyo&monthly_salary=350000&birth_date=1986-04-01"
MCP 服务是 API 的轻量封装,因此两者会返回相同答案。选择哪种方式,取决于提问者是 人还是程序。
- MCP 服务源码及其专属 README:
mcp/· English - 在线 API:
https://japan-payroll-api.tsumugi.workers.dev - OpenAPI 规范:
/openapi.json
相关工具
日本的法令类 MCP 服务大多只负责检索——它们提供法律文本,把推理工作留给你。这个工具则负责计算, 并返回其所依据的条文。两者相辅相成,而非相互竞争:
| “法律规定是什么?” | “那么我该付多少?” | |
|---|---|---|
labor-law-mcp | 45 部劳动与社会保险法律、厚生劳动省和日本安全卫生信息中心通知 | — |
tax-law-mcp | 24 部税法、17 份国税厅通达、裁决案例 | — |
hourei-mcp-server | 通过 e-Gov 查询任何日本法律 | — |
| jp-payroll-mcp | 完整列出其引用的 28 项条文 | 保险费、源泉所得税、等级调整、免缴 |
如果你已经在使用其中一种工具,可以再搭配使用这个工具。配备两者的助手会根据问题 选用合适的工具。
为什么开发这个项目
- **不存在统一的 API。**开发者需要分别从全国健康保险协会、厚生劳动省以及各都道府县劳动局收集数据。
- **规则繁琐。**保险费按标准报酬月额(共 50 个等级的阶梯函数)计算,而非按实际工资计算——就业保险则是例外, 按实际工资计算。养老金在第 32 级封顶。护理保险仅适用于 40 至 64 岁人群。 员工承担的部分按五舍六入取整(≤ 0.50 日元直接舍去)。任何一处出错, 得出的数字看似合理,实际却是错误的。
MCP 服务
源码位于 mcp/,其中附有独立的 README(日本語)·
English。使用 npm run mcp:test 进行测试——该命令会通过真实的 stdio
传输与真实的 MCP 客户端进行交互,因为即使工具的处理程序已损坏,它仍能正常列出,只有在被调用时才会失败。
MCP 服务免费,并且将始终免费。它是一个分发渠道,而非营收渠道:npm 不会支付任何费用,MCP 也没有自己的计费功能。这是有意为之——问题从来不是计费,RapidAPI 已经解决了这个问题;真正的问题是发现,而对于日本法定数据而言,MCP 是有实测流量的渠道。
端点
| 端点 | 描述 |
|---|---|
GET / | API 信息和端点列表 |
| 工资与保险 | |
GET /v1/prefectures | 全部 47 个都道府县及 JIS 代码 |
GET /v1/insurance-rates?prefecture=Tokyo | 健康保险、长期护理保险、养老金和育儿支援费率 |
GET /v1/standard-remuneration?remuneration=350000 | 查询月额对应的等级 |
GET /v1/standard-remuneration/table | 完整的 50 级表 |
GET /v1/employment-insurance?business_type=general | 雇用保险费率 |
GET /v1/payroll?prefecture=Tokyo&monthly_salary=350000&age=40 | 完整的扣款明细 |
| 最低工资 | |
GET /v1/minimum-wage?prefecture=Tokyo&date=2020-01-01 | 某日期生效的费率 |
GET /v1/minimum-wage/history?prefecture=Tokyo | 自 FY2002 起的完整历史记录 |
| 日历 | |
GET /v1/holidays?year=2026 | 公共假日(或使用 from=/to= 指定范围) |
GET /v1/holidays/check?date=2026-01-01 | 假日/周末/工作日标记 |
GET /v1/business-days?from=&to= | 计算指定范围内的工作日数量 |
GET /v1/business-days/shift?date=&days=1 | 向前或向后移动 N 个工作日 |
| 税务 | |
GET /v1/consumption-tax?date=&amount=&reduced= | 生效税率,可选应用于指定金额 |
GET /v1/consumption-tax/history | 自 1989 年起的所有税率变更 |
| 标识符 | |
GET /v1/corporate-number/validate?number=8700110005901 | 法人番号校验位(Peppol ICD 0188) |
GET /v1/corporate-number/check-digit?base=700110005901 | 12 位基础号码的校验位 |
GET /v1/invoice-number/validate?number=T8700110005901 | 合格发票登记号码 |
| 预扣税 | |
GET /v1/withholding-tax?taxable_amount=300000&dependants=2 | 月度预扣所得税(月額表) |
GET /v1/withholding-tax/daily?taxable_amount=12000&column=hei | 日额表(日額表),包括丙栏 |
GET /v1/withholding-tax/computer?taxable_amount=400000 | 使用公式法计算的相同税额(電算機計算の特例) |
| 奖金 | |
GET /v1/bonus-tax?bonus=500000&previous_month_pay=350000 | 奖金预扣税(賞与の算出率表) |
GET /v1/bonus-insurance?prefecture=Tokyo&bonus=800000&age=40 | 奖金的社会保险费,含两项上限 |
| 标准报酬决定 | |
GET /v1/standard-remuneration/regular?months=350000:30,352000:31,349000:30 | 根据 4 月至 6 月的收入进行定时决定(算定基礎) |
GET /v1/standard-remuneration/revision?current_remuneration=&months=&fixed_pay_change= | 是否需要进行随时改定(月額変更)? |
GET /v1/standard-remuneration/leave-end?kind=childcare¤t_remuneration=&months= | 休假结束返岗时的修订 |
POST /v1/standard-remuneration/annual-average | 通过年度平均进行保险人核定(年間平均による保険者算定),适用于季节性工作 |
| 年末调整 | |
POST /v1/year-end-adjustment | 年末调整(令和8年分):源泉徴収簿中从 ⑦ 到 ㉗ 的所有项目,另附一份“如果申报”的医疗费/捐赠/灾害损失扣除估算 |
| 居民税 | |
POST /v1/resident-tax | 根据上一年度收入和所在市町村估算居民税(住民税の見込み額):所得税额和人均税额、调整抵免、ふるさと納税、减免,以及各都道府县的附加税 |
| 资格与休假 | |
GET /v1/eligibility?month=2026-03&left_on=2026-03-30 | 入职或离职当月是否需要缴纳保险费? |
GET /v1/leave-exemption?kind=childcare&start=&end= | 产假或育儿假可免缴保费的月份 |
GET /v1/age-milestones?birth_date=1986-04-01 | 何时达到 40、65、70 和 75 岁,以及相应变化 |
| 批量 | |
POST /v1/payroll/batch | 一次调用最多处理 500 份工资单,并提供总计 |
| 法规 | |
GET /v1/statute?ref=健康保険法第43条 | 此 API 引用的条文全文 |
GET /v1/statute/index | 所有可用条文及其所属法律 |
include=statute_text | 添加到任意端点,即可附上其引用的条文文本 |
| 元数据 | |
GET /v1/enums | 所有可接受的枚举值和错误代码 |
GET /v1/data-freshness | 各数据集的覆盖范围及下次更新日期 |
prefecture 接受英文名称(Tokyo,不区分大小写)、日文(東京 或 | |
東京都)或 JIS 代码(13)。 |
关键的一次调用
为一名员工计算工资,只需发送一个请求:
curl "https://japan-payroll-api.tsumugi.workers.dev/v1/payroll?prefecture=Tokyo&monthly_salary=350000&age=40&dependants=2"
gross 350,000
social insurance -55,750
----------
after social insurance 294,250 <- the base withholding tax is charged on
withholding income tax -4,480
----------
net pay 289,770
中间那一行才是重点。所得税按扣除社会保险后的工资计算,而不是按税前工资计算;手动推导正是此端点旨在避免的错误。响应还会包含已确定的等级、拆分为员工和雇主份额的各项保费,以及适用的税额档位,因此可以核查计算过程,而不必盲目信任结果。
居民税(住民税)由市町村核定并通知雇主;没有任何 API 能计算它。传入 resident_tax=,即可从实发工资中扣除。
传入 income_tax=false,即可只计算社会保险。
集成前须知
GET /v1/enums会列出所有可接受的值——business_type、column、calendar——以及所有错误代码,让你可以在构建时读取,而不必等到遇到 400 错误才发现。- 错误会携带稳定的
code。invalid_request和missing_parameter表示应修正调用;out_of_coverage表示输入有效,但超出了已发布数据的覆盖范围,需要走不同的处理分支。不要根据英文说明文字进行匹配——它会发生变化。 GET /v1/data-freshness会告知各数据集的最新程度。
数据
| 数据集 | 覆盖范围 | 来源 |
|---|---|---|
| 社会保险费率 | 47 个都道府县,FY2026(令和 8 年度),自 2026-03 起生效 | 協会けんぽ 保険料額表 |
| 标准报酬表 | 50 个健康保险等级 / 32 个养老金等级 | 同上 |
| 雇用保险 | 3 种业务类型,FY2026,自 2026-04-01 起生效 | 厚生労働省 |
| 最低工资 | 47 个都道府县 × 24 年(FY2002–FY2025) | 厚生労働省 地域別最低賃金 |
| 公共假日 | 1,067 天,1955–2027 年 | 内閣府 国民の祝日について |
| 消费税 | 自 1989 年起的 4 个税率期间,含减轻税率 | 国税庁 No.6303 |
| 法人编号校验位 | 算法,无数据集 | 国税庁 チェックデジットの計算 |
| 预扣所得税(月额) | 231 个档位 + 9 个高收入锚点,令和 8 年份 | 国税庁 源泉徴収税額表 |
| 预扣所得税(公式) | 4 张法定税表,适用于令和 8 年份及以后 | 電算機計算の特例 |
所有数值均通过程序从官方电子表格中提取,并非手工转录。提取工具见 scripts/。
为什么不用法条
所得税数值取自国税厅发布的税表,而非通过 e-Gov 法律 API 获取的《所得税法》,因为法条版本未包含 2.1% 的重建特别附加税。在 105,000–107,000 日元区间,乙栏在别表第二中为 3,700 日元,实际操作中则为 3,800 日元;低于 105,000 日元时,税率为 3%,而非 3.063%。法条并非工资计算的正确来源。
超过 740,000 日元后,税表不再是税表,而变成带有边际税率的锚点。这些锚点并不共线——每个锚点都包含舍入结果,因此应直接采用发布的锚点数值,而不是重新计算。乙栏只有两个锚点(740,000 和 1,710,000),甲栏则有九个;根据甲栏锚点测算乙栏超出部分会造成隐性少扣税款。这是此处曾出现的真实错误,通过逐单元格对比发现。
引用可解析为文本
只写出法规名称,让读者自行查找,只算答了一半。本 API 引用的每条规定都已打包,因此可以在同一次往返中将 健康保険法第43条 转换为其实际条文:
curl 'https://japan-payroll-api.tsumugi.workers.dev/v1/statute?ref=健康保険法第43条'
curl '…/v1/standard-remuneration/revision?…&include=statute_text'
实践中的引用写法多种多样,但都能解析——健保法43条、厚年法81条の2、徴収法11条、缺少「第」的写法、引用到条款级别的写法、全角数字。e-Gov 的简称并非从业者使用的简称(e-Gov 称其为 厚生年金法;大家都写 厚年法),因此两种写法均可接受。
文本在构建时从 e-Gov 法令API 获取,而非在请求时获取:如果每次请求都调用 e-Gov,那么他们的服务宕机时,本 API 也会宕机。
scripts/extract-statutes.py 集中维护唯一的规定清单,测试套件会检查代码发出的每条引用是否都能解析——新增的引用若没有对应的规定,构建就会失败,而不会悄无声息地返回空结果。
已知缺口
-
年末调整仅涵盖令和8年分,依据的是国税厅于 2026-08-31 发布的手册(最低工资收入扣除额为 740,000 日元,基础扣除额最高为 1,040,000 日元,新增 特定親族特別控除,以及未满 23 岁人群的生命保险规则)。依法,医疗、捐赠和灾害损失扣除不属于 年末調整;将其作为
tax_return传入,即可获取单独的“如果员工提交申报”估算。 -
**尚未纳入 FY2026 最低工资。**截至 2026-09-02,47 个都道府县中有 46 个已发布 答申(冲绳尚未发布);最早的生效日期为 2026-10-01。API 提供的是 FY2025 数据,即当前适用的费率;对于首次调整日期当天或之后的日期,API 会返回
out_of_coverage,而不是给出上一年的数值。待全部 47 个都道府县公布后,API 将根据厚生劳动省的清单更新。 -
**未对在两家或以上单位工作的员工(二以上事業所勤務)进行分摊。**保费按各单位的报酬比例分摊,但没有输入项可提供其他雇主的金额;API 按仅在一家单位工作的情况计算。
-
**雇用保险历史数据仅涵盖 FY2026。**由于早期年份未经一手来源核实,因此不予提供,而不是猜测。
-
**居民税不在范围内。**居民税取决于上一年的收入和所在市町村,并由市町村征收,而非雇主计算,因此
/v1/payroll会扣除你传入的金额,绝不会自行推算。 -
**判定端点用于判断是否需要申报,并非代为申报。**有几项规则取决于 API 无法获知的事实——例如季节性波动是否「業務の性質上例年発生することが見込まれる」、某项津贴是否属于実費弁償、员工是否已同意。这些都作为声明输入,并在响应中原样返回;保险机构仍可根据 保険者算定得出不同结论。
-
**并未涵盖所有标准报酬的确定方式。**資格取得時決定会返回该决定持续有效的时间,但不会计算初始 報酬月額(健保法42条1項有四种方法,其中三种需要其他员工的数据)。二以上事業所勤務——即汇总多个雇主的报酬并在其间分摊保费——完全未实现。固定工资在三个月窗口内变动两次时发生的重新定基,也未实现。
-
少数实务事项无法从一手文件中找到依据,因此在响应中标记为
guidance.fixed_pay.unverified,而非作为确定结论:家族津贴是否计入固定工资、带薪休假是否计入 支払基礎日数,以及 年俸制 的处理方式。二手来源对这三点的说法一致,但相关部门似乎没有书面说明。
验证
test/verify.mjs 会对运行中的服务运行 4,689 项断言。核心测试是将 API 计算出的保费与官方協会けんぽ工作簿中列出的金额进行比较,覆盖 250 种组合(5 个都道府县 × 50 个等级)——采用公布的个人负担金额,而非重新实现公式。还会检查:
- 等级边界是否连续,以及边界日元金额是否属于较高等级
- 养老金在等级 1 和 32 时是否正确封顶
- 长期护理保险是否在 40 岁时开始缴纳,并在 65 岁时停止
- 就业保险是否按实际工资计费,而其他保费是否按等级计费
- 指定时间点的最低工资(包括生效日期的前一天)
- 是否支持通过全部四种输入形式解析都道府县
- 全部 47 个都道府县是否都能返回有效的工资结算响应
- 工作日计数是否与独立计算的参考值一致
- 2026-09-22 的国民の休日(仅因位于另外两个节日之间才成为假日)
- 一次性皇室假日:大喪の礼、即位礼正殿の儀、結婚の儀
- 法人编号校验位是否与 NTA PDF 中的计算示例一致,以及是否会拒绝同一主体的所有其他校验位
- 源泉扣缴税额表公布的每个单元格——231 个区间 × 8 个甲栏,加上乙栏,共 2,079 个数值,并与国税厅自己的工作簿进行比较
- 通过发票校验位检查并不意味着该号码属于法人:个人经营者也满足相同规则,因此无法根据号码推断持有人身份
- 日本年金機構公布的全部 8 种单等级随時改定案例——健康保险 4 种、养老金 4 种——每种都应得出表中指定的标准报酬,并分别在实际等级和实现所用的扩展等级范围内验证
- 健康保险和养老金是否独立判定:超过养老金上限的加薪会使健康保险等级上升 6 级,而养老金等级完全不变
- 15 天的定時決定回退规则是否仅对短時間就労者触发,而不对其他人触发,且在任何时候都不会在随時改定中触发
/v1/enums是否包含所有封闭值集合,确保新增枚举在抵达集成方用于生成类型的端点之前无法发布
npx wrangler dev --port 8799
node test/verify.mjs
# or against production
BASE=https://japan-payroll-api.tsumugi.workers.dev node test/verify.mjs
开发 / 部署
npm install
npx wrangler dev
npx wrangler deploy
数据嵌入在程序包中(gzip 压缩后约 40 KB),因此无需数据库、KV,也没有冷启动。
响应包含 Cache-Control: public, max-age=3600, stale-while-revalidate=86400。
缓存一小时而非一天,是因为费率会在已知日期变更,且更正内容应在同一天送达调用方;stale-while-revalidate 会在后台刷新期间确保响应即时返回。请注意,workers.dev 响应不会缓存在 Cloudflare 自有边缘节点——每个请求都会调用 Worker。如果之后认为值得启用,使用自定义域名即可开启边缘缓存。
从日本对已部署的 Worker 进行测量:往返延迟中位数为 65 ms,最高为 83 ms;gzip 可将 50 个等级的表格从 6,841 字节压缩到 1,041 字节。
维护
法定数据会在固定日期变更,而错过修订的 API 会继续响应——但给出的数字早已失效。两种机制可防止这种情况。
API 会报告自身的数据过时情况。 GET /v1/data-freshness 会说明每个数据集涵盖的范围及其下次变更时间,主要数据响应也会带有 freshness 标记。即使我们的监控失效,调用方也能看出数据是否过时。
每周任务会监控数据源。
npm run watch # fingerprints each source, alerts Discord on change
npm run watch:dry # same, without notifying
它会检查两项相互独立的内容,因为只检查其中一项会留下漏洞:源文件的哈希值和 Last-Modified(可捕捉静默重新发布),以及日历(可捕捉这样的情况:某个部门在一个新 URL 上发布修订版,却不改动旧版本)。
警报会附上该数据集的确切命令,而不是让人回到这里查找。几个月后看到警报的人,通常已经忘了这个仓库的布局。
提前演练提取器。 最低工资提取器支持 --check,可运行完整提取流程,并与当前发布的数据进行比较,而不会写入任何内容:
curl -L -A "Mozilla/5.0" -o mw.xlsx https://www.mhlw.go.jp/content/11200000/001571219.xlsx
python scripts/extract-minimum-wage.py --check
它应该会提示输出一致。如果财政年度没有变化,但结果不一致,说明提取器与已发布的数据已经出现偏差——最好在 8 月就发现,而不是等到新数据发布当天才发现,因为届时很容易忍不住直接发布脚本生成的任何结果。
将其注册为每周运行:
powershell -ExecutionPolicy Bypass -File scripts
egister_watch_task.ps1
验证付费路径
测试套件无法检查 RapidAPI 的付费套餐是否获得了完整大小的批次:这需要 RapidAPI 签发的代理密钥,而保存在测试中的密钥就不再是密钥了。测试会检查与收入相关的另一半——没有密钥的调用方无法通过设置请求头冒充付费套餐。
每次更改权益配置后,请通过日志确认另一半:
npx wrangler tail --format json
从 RapidAPI 试用工具调用任意端点,并查找请求行。该行应包含订阅名称:
{"channel":"rapidapi","path":"/","status":200,"plan":"BASIC"}
存在 plan 表示代理密钥匹配。rapidapi 请求中的 plan: null 表示密钥不匹配——每位付费客户都会受到免费套餐的限制,却仍被收费。这种故障在外部是无声的,因此值得主动检查,而不是等到有人投诉。
重要日期
| 时间 | 变更内容 |
|---|---|
| March | 協会けんぽ 各都道府县的费率,于 3 月工资月份生效 |
| April | 劳动保险费率;税额表 |
| Late Aug – October | 最低工资,按都道府县陆续发布,自 10 月起生效 |
| February | 内阁府发布次年的节假日安排 |
刷新任何数据集后,更新 src/data/freshness.json,并运行
npm run rapidapi:prepare,以便重新验证线上 API 并重新生成 OpenAPI 规范。
发布流水线
每个 API 都是 recipes/<slug>/recipe.py 下的一份配方——端点只需在此声明一次,OpenAPI 规范和 RapidAPI 列表文本都会据此生成。
npm run rapidapi:prepare
对于每份配方,该命令都会:
- 验证配方,
- 调用线上 API 上声明的每个端点,并要求返回可解析的 JSON 和 200 状态码——对于有必需参数的端点,还要求省略参数时返回 400。此步骤可捕捉
recipe.py与src/index.ts之间的偏差, - 写入
build/openapi/<slug>.openapi.json, - 发送 Discord 通知,其中包含列表 URL、规范路径以及需要粘贴的确切值。
列表需要手动创建。Add-API 表单位于
https://rapidapi.com/provider/<id>/new,并受 reCAPTCHA v3 保护,因此最终提交由人工完成——填写三个字段,选择“Specify using: OpenAPI”,然后上传生成的规范。每个 API 大约需要两分钟,不会拖慢每周发布一到两个 API 的节奏。
在 .env 中设置 DISCORD_WEBHOOK_URL(参见 .env.example),通知才能实际送达;未设置时,消息只会打印到控制台。
浏览器会话
npm run rapidapi:login 会打开一个真实的 Chrome 窗口,供你手动登录——脚本不会获取密码。会话会保存在 rapidapi_profile/ 中(已加入 gitignore)。会话过期后,请重新运行该命令。
操作安全
state/pipeline.halt.json会暂停所有操作,直到有人将其移除。会话失效时会调用set_halt();重新登录成功后会调用clear_halt()。pipeline/rapidapi/config.py中的MAX_PUBLISH_PER_DAY/MIN_SECONDS_BETWEEN_PUBLISH用于控制发布频率,使其符合人工操作的节奏。
许可与署名
底层数据是日本政府的开放数据,遵循公共データ利用規約(第1.0版),该协议允许商业使用和再分发,但须注明出处。每个响应都包含一个注明来源的 attribution 区块。
本服务未获得任何日本政府机构的认可。 在将其用于法定申报前,请先对照官方来源进行核实。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。