MCP-сервер расчёта зарплат и соцвзносов (Тайвань).
Open-source движок расчёта обязательных взносов Тайваня по трудовому/медицинскому страхованию и пенсии (勞健保勞退). По зарплате и статусу застрахованного вычисляет нагрузку всех сторон по трудовому страхованию (вкл. страхование занятости), медицинскому страхованию, пенсии (勞退), страхованию от профзаболеваний и дополнительному взносу медстрахования второго поколения. Также покрывает удержание подоходного налога с зарплаты, неполный месяц при приёме/увольнении в середине месяца, файлы отчётности по доп. медвзносу и расчёт пенсии по старости.
data/ и гоняют один testdata/, результаты идентичны по-битовоПозиционируется как «расчётный движок», а не «гарантия соответствия праву». Встроены официальные параметры 2024–2026 (民國 113–115) годов.
npm install taiwan-payroll # TypeScript / Node
pip install taiwan-payroll # Python
import { createPayrollEngine } from 'taiwan-payroll';
const engine = createPayrollEngine({ year: 2026 });
const r = engine.calculate({
monthlySalary: 42000,
identity: 'category1',
dependents: 1,
employmentInsurance: true,
pensionSelfContribution: 0.06,
});
console.log(r.employee); // { labor: 1050, health: 1302, pensionSelf: 2520, total: 4872 }
console.log(r.employer.occupational); // нагрузка работодателя по профзаболеваниям
// Доп. взнос (6 видов дохода: bonus/parttime/professional/dividend/interest/rent)
engine.calculateSupplementary({ type: 'bonus', amount: 200000, monthlyInsuredSalary: 42000 });
// → { type: 'bonus', chargeable: 32000, rate: '0.0211', premium: 675 }
// Приём/увольнение в середине месяца (трудовое/проф. страхование/пенсия — по дням; медстрахование — по принципу «принадлежность на конец месяца»)
engine.calculateProrated({ monthlySalary: 29500, startDate: '2026-03-08' });
// → { ..., days: { insured: 23 }, healthCharged: true }
Неполный месяц по медстрахованию — по «принципу принадлежности на конец месяца»: взнос за полный месяц по страхователю на конец месяца — за месяц приёма берётся полный месяц, за месяц увольнения не берётся. Это практическое правило Управления медстрахования (не по дням, не связано с порогом 15-го числа).
Из данных отчётности генерируется «файл декларации доп. страхового взноса» Управления медстрахования (CSV / Big5), покрывая 6 видов дохода: премия(62), зарплата по совместительству(63), профдеятельность(65), дивиденды(66), проценты(67), аренда(68). Каждый генератор по-битово сверен с официальными примерами, TS и Python дают идентичный результат.
import { generateSupplementaryBonusFiling } from 'taiwan-payroll';
const { filename, content } = generateSupplementaryBonusFiling({
year: 2026,
filingDate: '20260901',
unit: { taxId: '11111111', name: '甲公司', phone: '0227065866', email: 'a@b.tw', contactName: '王小明' },
records: [
{ action: 'I', payDate: '20260615', payeeId: 'A123456789', payeeName: '李四',
bonusAmount: 50000, insuredSalary: 31800, ytdBonusCumulative: 150000, unitCode: '123456789' },
],
});
// filename: 'DPR111111111150901001.csv'
// content: строка Unicode; реальный файл — в Big5, при сохранении пишите в кодировке Big5.
generateSupplementaryDividendFiling) — из-за дивидендов акциями/вычетов работодателя построчный взнос предоставляет вызывающая сторона (есть удобная функция calcDividendPremium).to_big5_bytes() (core остаётся без зависимостей)./docs/api.По официальным формулам Управления трудового страхования рассчитываются три вида пенсии по старости (все сверены с официальными значениями/формулами, TS ≡ Python):
import { calcOldAgePension, calcOldAgeLumpSum, calcOldAgeSinglePayment, getYearData } from 'taiwan-payroll';
const d = getYearData(2026);
calcOldAgePension(d, { avgInsuredSalary: 32000, years: 35, months: 6 }); // ежемесячный аннуитет (лучшая из двух формул, можно раньше/позже)
calcOldAgeLumpSum(d, { avgInsuredSalary: 30000, years: 10 }); // единовременная по старости
calcOldAgeSinglePayment(d, { avgInsuredSalary: 30000, preSixtyYears: 20 }); // разовое получение (старая система баллов)
среднее×стаж×0.775%+3000 vs ×1.55%), смещение раньше/позже claimOffsetMonths (±4%/год, предел ±5 лет (±20%)); поля averageHighestInsuredSalary, statutoryClaimAge.data/{year}.json — единый источник истины, годовые параметры законодательства (таблицы разрядов, ставки), проверяются JSON Schema.testdata/ — языконезависимые «золотые» тестовые векторы (официальные примеры с source) — основа согласованности поведения между языками.packages/core — TypeScript-движок без зависимостей рантайма.pip install taiwan-payroll, чистая stdlib, API соответствует версии TS (PyPI).https://taiwan-payroll.simoko.workers.dev/mcp (Streamable HTTP) или локально npx taiwan-payroll-mcp (stdio, npm).io.github.supra126/taiwan-payroll), Smithery (установка в один клик) и Glama.| Пункт | Надзорный орган | № документа |
|---|---|---|
| Таблица разрядов застрахованной зарплаты трудового страхования (11 разрядов, предел 45 800) | 勞動部勞保局 | 勞動保2字第1140091863號令 |
| Таблица месячных отчислений пенсии (62 разряда, предел 150 000) | 勞動部勞保局 | 勞動福3字第1140153598號令 |
| Таблица разрядов страхования от профзаболеваний (21 разряд, предел 72 800) | 勞動部勞保局 | 職災保險法§17 |
| Таблица разрядов медстрахования (58 разрядов, предел 313 000) | 衛福部健保署 | 衛部保字第1140153424號令 |
Ставки: трудовое страхование 12,5% (вкл. страхование занятости 1%), медстрахование 5,17%, пенсия (работодатель) 6%, профзаболевания в среднем 0,21%, доп. медвзнос 2,11%.
Сейчас встроены три года — 113/114/115 (2024/2025/2026); таблицы разрядов и № документов каждого года — в sources файла data/{year}.json; год задаётся через createPayrollEngine({ year }), доступные годы — через getAvailableYears().
pnpm install
pnpm validate:data # проверить data schema, непрерывность разрядов, формат векторов
pnpm -r test # прогнать все золотые тестовые векторы
pnpm typecheck
Пакет реализован по публичным нормам и публикациям надзорных органов; результаты расчёта только справочные, фактическая сумма к уплате — по платёжкам Управления трудового и медицинского страхования. Пакет не является юридической или бухгалтерской консультацией.
MIT