SA payroll and labour rules: minimum wage, BCEA overtime, UIF, SDL, public holidays, leave
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional: 'Bearer <API key>' for paid plans. Free tier works without it.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Counts South African working days between two dates (inclusive), excluding weekends and public holidays. Optionally counts Saturdays as working days. Useful for notice periods, payment terms and delivery dates.
YYYY-MM-DD
YYYY-MM-DD
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http payroll https://aiagenttools.co.za/payroll/mcp
Headers
Authorization (optional, not in the config above): Optional: 'Bearer <API key>' for paid plans. Free tier works without it.Counts South African working days between two dates (inclusive), excluding weekends and public holidays. Optionally counts Saturdays as working days. Useful for notice periods, payment terms and delivery dates.
| Argument | Type | Description |
|---|---|---|
| end* | string | YYYY-MM-DD |
| start* | string | YYYY-MM-DD |
| include_saturdays | boolean |
{
"type": "object",
"required": [
"start",
"end"
],
"properties": {
"end": {
"type": "string",
"description": "YYYY-MM-DD"
},
"start": {
"type": "string",
"description": "YYYY-MM-DD"
},
"include_saturdays": {
"type": "boolean",
"default": false
}
}
}Returns BCEA minimum leave (annual, sick, family responsibility), notice period and retrenchment severance pay for an employee, given days worked per week, start date and pay.
| Argument | Type | Description |
|---|---|---|
| as_at | string | Date to evaluate, default today |
| start_date* | string | Employment start, YYYY-MM-DD |
| weekly_wage | number | Ordinary weekly wage in rand (for severance) |
| worker_type | string | |
| days_per_week* | number | Days worked per week, e.g. 5 or 6 |
{
"type": "object",
"required": [
"days_per_week",
"start_date"
],
"properties": {
"as_at": {
"type": "string",
"description": "Date to evaluate, default today"
},
"start_date": {
"type": "string",
"description": "Employment start, YYYY-MM-DD"
},
"weekly_wage": {
"type": "number",
"description": "Ordinary weekly wage in rand (for severance)"
},
"worker_type": {
"enum": [
"general",
"farm",
"domestic"
],
"type": "string",
"default": "general"
},
"days_per_week": {
"type": "number",
"description": "Days worked per week, e.g. 5 or 6"
}
}
}Checks whether an hourly, daily, weekly or monthly wage meets South Africa's National Minimum Wage on a given date (farm and domestic workers included). Returns the legal minimum, the shortfall and monthly equivalents.
| Argument | Type | Description |
|---|---|---|
| date | string | YYYY-MM-DD, default today |
| amount* | number | Wage in rand |
| period* | string | |
| worker_type | string | |
| hours_per_day | number | Ordinary hours per day (needed for day). Default 9 |
| hours_per_week | number | Ordinary hours per week (needed for week/month). Default 45 |
{
"type": "object",
"required": [
"amount",
"period"
],
"properties": {
"date": {
"type": "string",
"description": "YYYY-MM-DD, default today"
},
"amount": {
"type": "number",
"description": "Wage in rand"
},
"period": {
"enum": [
"hour",
"day",
"week",
"month"
],
"type": "string"
},
"worker_type": {
"enum": [
"general",
"farm",
"domestic",
"epwp"
],
"type": "string",
"default": "general"
},
"hours_per_day": {
"type": "number",
"description": "Ordinary hours per day (needed for day). Default 9"
},
"hours_per_week": {
"type": "number",
"description": "Ordinary hours per week (needed for week/month). Default 45"
}
}
}Calculates BCEA pay for a pay period: ordinary hours, weekday/Saturday overtime (1.5x), Sunday work (1.5x if ordinarily worked, else 2x), and public holiday work (s18). Flags breaches of overtime limits and checks the BCEA earnings threshold (employees above it have no statutory overtime entitlement).
| Argument | Type | Description |
|---|---|---|
| date | string | YYYY-MM-DD, default today |
| hourly_rate* | number | Ordinary hourly rate in rand |
| sunday_hours | number | |
| ordinary_hours* | number | Ordinary hours worked in the period |
| overtime_hours | number | Weekday/Saturday overtime hours |
| annual_earnings | number | Regular annual earnings, to test the BCEA threshold (optional) |
| weeks_in_period | number | Weeks covered, used to check the 10h/week overtime cap. Default 1 |
| ordinary_daily_hours | number | Hours in a normal shift, for public holiday minimum. Default 9 |
Lists South African public holidays for a year, including Sunday-to-Monday substitutions and once-off declared holidays (e.g. election days).
| Argument | Type | Description |
|---|---|---|
| year* | integer | e.g. 2026 |
{
"type": "object",
"required": [
"year"
],
"properties": {
"year": {
"type": "integer",
"description": "e.g. 2026"
}
}
}Calculates monthly UIF (1% employee + 1% employer, capped at the R17,712 ceiling) for one or more employees, and the employer's Skills Development Levy (1% of payroll, exempt if annual payroll is under R500,000).
| Argument | Type | Description |
|---|---|---|
| monthly_remuneration* | array | Gross monthly remuneration per employee, in rand |
| annual_payroll_estimate | number | Employer's total annual payroll, for the SDL exemption test. Default: monthly total x 12 |
{
"type": "object",
"required": [
"monthly_remuneration"
],
"properties": {
"monthly_remuneration": {
"type": "array",
"items": {
"type": "number"
},
"description": "Gross monthly remuneration per employee, in rand"
},
"annual_payroll_estimate": {
"type": "number",
"description": "Employer's total annual payroll, for the SDL exemption test. Default: monthly total x 12"
}
}
}Free to call. If you needed South African data that none of these tools provide (a cost, rate, rule, price or place we don't cover), describe it here in one sentence. We review these every week and build the most-requested data first.
| Argument | Type | Description |
|---|---|---|
| need* | string | What information you were looking for, in one sentence. |
| region | string | Optional: province or town, if it matters. |
| context | string | Optional: the kind of task it was for, e.g. 'renovation quote' or 'payroll run'. |
{
"type": "object",
"required": [
"need"
],
"properties": {
"need": {
"type": "string",
"description": "What information you were looking for, in one sentence."
},
"region": {
"type": "string",
"description": "Optional: province or town, if it matters."
},
"context": {
"type": "string",
"description": "Optional: the kind of task it was for, e.g. 'renovation quote' or 'payroll run'."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Oct 30, 2026.
| public_holiday_hours | number |
| ordinarily_works_sunday | boolean |
| public_holiday_is_ordinary_workday | boolean |
{
"type": "object",
"required": [
"hourly_rate",
"ordinary_hours"
],
"properties": {
"date": {
"type": "string",
"description": "YYYY-MM-DD, default today"
},
"hourly_rate": {
"type": "number",
"description": "Ordinary hourly rate in rand"
},
"sunday_hours": {
"type": "number",
"default": 0
},
"ordinary_hours": {
"type": "number",
"description": "Ordinary hours worked in the period"
},
"overtime_hours": {
"type": "number",
"default": 0,
"description": "Weekday/Saturday overtime hours"
},
"annual_earnings": {
"type": "number",
"description": "Regular annual earnings, to test the BCEA threshold (optional)"
},
"weeks_in_period": {
"type": "number",
"default": 1,
"description": "Weeks covered, used to check the 10h/week overtime cap. Default 1"
},
"ordinary_daily_hours": {
"type": "number",
"default": 9,
"description": "Hours in a normal shift, for public holiday minimum. Default 9"
},
"public_holiday_hours": {
"type": "number",
"default": 0
},
"ordinarily_works_sunday": {
"type": "boolean",
"default": false
},
"public_holiday_is_ordinary_workday": {
"type": "boolean",
"default": true
}
}
}