Zovo PTO Accrual Calculator MCP
A community MCP server that calculates PTO accruals based on user-defined policies, providing balance checks, dated ledgers, year-end projections, and team balance reports via CSV input.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://pto-accrual.zovo.one/mcpWhat its tools do
2 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (2)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Calculate PTO balance based on accrual policy and hire date
- Generate dated ledger of accrued, used, and forfeited hours
- Project PTO balance to year-end and identify hours at risk
- Compute team balances from a CSV or Excel file
Source and maintenance
Protocol and capabilities
- Server
- pto-accrual 1.0.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 2 advertised
- Resources
- 1 advertised
- Resource templates
- 1 advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
},
"resources": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
2 advertised
calculate_pto_balance — Calculate PTO balance
Use this when someone asks how much PTO they have, wants a PTO accrual calculator or vacation accrual calculator, or needs an employee's PTO, vacation or sick leave balance from an accrual policy. Give the accrual rule as accrual_amount + accrual_unit (hours, days, weeks) + accrual_per (year, month, week, pay_period, hour_worked), e.g. 2 weeks a year = 2, weeks, year; 1 hour per 30 worked = 0.0333, hours, hour_worked; use accrual_rate text only as a fallback. Takes the policy (per hour worked like 1 h per 30, hours per pay period with weekly/biweekly/semimonthly/monthly pay, or a yearly amount front-loaded or accrued evenly), tenure tiers, hire date, max balance, annual cap, carryover limit and reset date, waiting period, hours worked, and time taken (dates, hours or ranges; future dates are planned). Returns the balance as of a date (default today, US Eastern), available hours, a dated ledger with accrued, used, capped and forfeited hours, upcoming accruals, a year-end projection with hours to use before the reset, and PDF, Excel and CSV files. Does not give legal advice, check state law compliance, compute PTO payout in money, or connect to payroll. For several employees use calculate_team_pto_balances.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"state": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
],
"description": "Optional US state, e.g. CA, for an informational note on state paid sick leave accrual rules."
},
"pay_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Any real payday for weekly or biweekly pay, e.g. 2026-01-09, so accruals land on the right Fridays. Default: the first Friday on or after the ledger start."
},
"hire_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Hire (start) date, e.g. 2024-03-04. Used for tenure tiers, the waiting period and the first partial pay period."
},
"as_of_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Date to report the balance on, e.g. 2026-10-26. Default: today in US Eastern time."
},
"first_year": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "For annual_front_loaded: prorated (default, first grant prorated by days left in the year) or full."
},
"hours_used": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Total PTO hours used without dates, e.g. 40 for \"I used 40 hours this year\". Subtracted on the as-of date. Use time_taken when dates are known."
},
"reset_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "When the accrual year resets (carryover is applied), e.g. \"01-01\" (default January 1), \"July 1\", or \"anniversary\" (hire anniversary), or \"none\"."
},
"time_taken": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"maxLength": 8000
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "object",
"required": [
"date"
],
"properties": {
"date": {
"type": "string",
"maxLength": 40,
"description": "Day off, e.g. 2026-03-02 (or the first day of a range)."
},
"note": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
],
"description": "Optional label, e.g. Vacation (shortened to 40 characters)."
},
"hours": {
"type": [
"number",
"string",
"null"
],
"description": "Hours used, e.g. 8 or 4. Default one day (hours_per_day), or each weekday of a range."
},
"end_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Last day of a range, e.g. 2026-03-06 (weekdays only are counted)."
}
},
"additionalProperties": {}
}
]
},
"maxItems": 1000
}
]
},
{
"type": "null"
}
],
"description": "PTO used or planned, as a list [{\"date\":\"2026-03-02\",\"hours\":8}] or text \"2026-03-02 8h, 2026-07-06 to 2026-07-10, Dec 24 4h\". Future dates count as planned time off in the projection."
},
"accrual_per": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
],
"description": "How often accrual_amount is earned: year, month, week, pay_period, or hour_worked. Required for hours; days or weeks without it are read as per year."
},
"annual_days": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Days of PTO per year, e.g. 15. Converted with hours_per_day (default 8)."
},
"max_balance": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Maximum balance (accrual stops at this cap until hours are used), in hours, e.g. 240, or \"30 days\"."
},
"accrual_rate": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Fallback only, when you cannot fill accrual_amount/accrual_unit/accrual_per: the rule as text with a number, unit and period, e.g. \"1 per 30\", \"4.62 hours per paycheck\", \"15 days a year\". Hours without a period are refused."
},
"accrual_unit": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Unit of accrual_amount: hours (default), days, or weeks (weeks = days_per_week x hours_per_day)."
},
"annual_hours": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Hours of PTO per year, e.g. 120. Use instead of annual_days."
},
"hours_worked": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"maxLength": 8000
},
{
"type": "array",
"items": {
"type": "object",
"required": [
"date",
"hours"
],
"properties": {
"date": {
"type": "string",
"maxLength": 40,
"description": "Any date in the pay period, e.g. 2026-01-09."
},
"hours": {
"type": [
"number",
"string"
],
"description": "Hours worked that pay period, e.g. 72."
}
},
"additionalProperties": {}
},
"maxItems": 600
}
]
},
{
"type": "null"
}
],
"description": "Actual hours worked per pay period for per_hour_worked, e.g. [{\"date\":\"2026-01-09\",\"hours\":72}] or \"2026-01-09: 72, 2026-01-23: 80\". Periods not listed use the standard hours."
},
"tenure_tiers": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"maxLength": 600
},
{
"type": "array",
"items": {
"type": "object",
"properties": {
"from_year": {
"type": [
"number",
"string",
"null"
],
"description": "Completed years of service when this tier starts, e.g. 0, 3, 6."
},
"annual_days": {
"type": [
"number",
"string",
"null"
],
"description": "Days per year in this tier, e.g. 15."
},
"accrual_rate": {
"type": [
"number",
"string",
"null"
],
"description": "Or a rate in the method's unit, e.g. 0.0577 per hour worked or 6.15 per pay period."
},
"annual_hours": {
"type": [
"number",
"string",
"null"
],
"description": "Hours per year in this tier, e.g. 120."
}
},
"additionalProperties": {}
},
"maxItems": 12
}
]
},
{
"type": "null"
}
],
"description": "Tenure tiers (years of service), as text \"0-2: 10 days, 3-5: 15 days, 6+: 20 days\" or a list [{\"from_year\":0,\"annual_days\":10},{\"from_year\":3,\"annual_days\":15}]. \"years 3-5\" starts at the 3rd work anniversary."
},
"days_per_week": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Workdays per week, default 5. Converts weeks of PTO to hours."
},
"employee_name": {
"anyOf": [
{
"type": "string",
"maxLength": 1000
},
{
"type": "null"
}
],
"description": "Optional name for the ledger header, e.g. Dana Kim."
},
"hours_per_day": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Hours in one PTO day, default 8, e.g. 7.5."
},
"pay_frequency": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Pay schedule: weekly, biweekly (default, every two weeks), semimonthly (15th and last day), or monthly."
},
"accrual_amount": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Preferred way to give the rule: the amount earned, e.g. 15 (with accrual_unit days, accrual_per year), 4.62 (hours per pay_period) or 0.0333 (hours per hour_worked)."
},
"accrual_method": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"description": "How PTO is earned: per_hour_worked (e.g. 1 h per 30 h worked), per_pay_period (fixed hours each paycheck, e.g. 4.62 h), annual_front_loaded (whole year granted at once on the reset date), annual_accrued_per_period (yearly amount, e.g. 15 days, spread evenly over pay periods). Optional: inferred from the other fields."
},
"hours_per_week": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Standard hours per week, default 40, e.g. 30 for part time. Used when hours worked are not given."
},
"waiting_period": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Waiting period after hire before PTO can be used, e.g. \"90 days\" or \"3 months\"."
},
"carryover_limit": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Hours that may roll over at the reset date, e.g. 40. 0 = use it or lose it. Leave out for unlimited rollover."
},
"starting_balance": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Known balance on starting_balance_date, in hours, e.g. 32.5 (from a pay stub), or \"4 days\"."
},
"annual_accrual_cap": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Most hours that can be earned in one accrual year, e.g. 48."
},
"waiting_period_rule": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "accrue_but_locked (default: hours accrue from hire but cannot be used until the waiting period ends) or no_accrual (nothing accrues during the waiting period)."
},
"starting_balance_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Date of the starting balance, e.g. 2026-01-01. Default: the start of the current accrual year (or the hire date if later)."
},
"hours_worked_per_period": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Hours worked in each pay period, for per_hour_worked when it differs from the standard (40 h/week), e.g. 64."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"kind",
"employee",
"as_of",
"as_of_label",
"as_of_source",
"balance_hours",
"balance_days",
"available_hours",
"ledger_start",
"policy",
"year_to_date",
"projection",
"upcoming",
"tier",
"ledger_rows_total",
"ledger_preview",
"assumptions",
"warnings",
"notes",
"downloads"
],
"properties": {
"kind": {
"type": "string"
},
"tier": {
"type": "object",
"required": [
"current",
"next_change",
"next"
],
"properties": {
"next": {
"type": [
"string",
"null"
]
},
"current": {
"type": [
"string",
"null"
]
},
"next_change": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
},
"as_of": {
"type": "string"
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"policy": {
"type": "object",
"required": [
"method",
"method_label",
"rule",
"pay_frequency",
"hours_per_day",
"reset",
"carryover_limit_hours",
"max_balance_hours",
"annual_accrual_cap_hours",
"waiting_period_ends",
"tiers"
],
"properties": {
"rule": {
"type": "string"
},
"reset": {
"type": "string"
},
"tiers": {
"type": "array",
"items": {
"type": "string"
}
},
"method": {
"type": "string"
},
"method_label": {
"type": "string"
},
"hours_per_day": {
"type": "number"
},
"pay_frequency": {
"type": "string"
},
"max_balance_hours": {
"type": [
"number",
"null"
]
},
"waiting_period_ends": {
"type": [
"string",
"null"
]
},
"carryover_limit_hours": {
"type": [
"number",
"null"
]
},
"annual_accrual_cap_hours": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
},
"employee": {
"type": [
"string",
"null"
]
},
"upcoming": {
"type": "array",
"items": {
"type": "object",
"required": [
"date",
"accrual_hours",
"balance_hours"
],
"properties": {
"date": {
"type": "string"
},
"accrual_hours": {
"type": "number"
},
"balance_hours": {
"type": "number"
}
},
"additionalProperties": false
}
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"downloads": {
"type": "object",
"properties": {
"csv": {
"type": "string"
},
"pdf": {
"type": "string"
},
"xlsx": {
"type": "string"
}
},
"additionalProperties": false
},
"projection": {
"type": "object",
"required": [
"through",
"balance_hours",
"accrued_hours",
"planned_time_off_hours",
"reset_date",
"forfeit_at_reset_hours",
"use_by"
],
"properties": {
"use_by": {
"type": [
"string",
"null"
]
},
"through": {
"type": "string"
},
"reset_date": {
"type": [
"string",
"null"
]
},
"accrued_hours": {
"type": "number"
},
"balance_hours": {
"type": "number"
},
"forfeit_at_reset_hours": {
"type": "number"
},
"planned_time_off_hours": {
"type": "number"
}
},
"additionalProperties": false
},
"as_of_label": {
"type": "string"
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"as_of_source": {
"type": "string"
},
"balance_days": {
"type": "number"
},
"ledger_start": {
"type": "string"
},
"year_to_date": {
"type": "object",
"required": [
"since",
"accrued",
"used",
"capped_lost",
"forfeited"
],
"properties": {
"used": {
"type": "number"
},
"since": {
"type": "string"
},
"accrued": {
"type": "number"
},
"forfeited": {
"type": "number"
},
"capped_lost": {
"type": "number"
}
},
"additionalProperties": false
},
"balance_hours": {
"type": "number"
},
"ledger_preview": {
"type": "array",
"items": {
"type": "object",
"required": [
"date",
"event",
"accrued",
"used",
"capped",
"forfeited",
"balance"
],
"properties": {
"date": {
"type": "string"
},
"used": {
"type": "number"
},
"event": {
"type": "string"
},
"capped": {
"type": "number"
},
"accrued": {
"type": "number"
},
"balance": {
"type": "number"
},
"forfeited": {
"type": "number"
}
},
"additionalProperties": false
}
},
"available_hours": {
"type": "number"
},
"ledger_rows_total": {
"type": "number"
}
},
"additionalProperties": false
}{
"title": "Calculate PTO balance",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}calculate_team_pto_balances — Calculate team PTO balances
Use this when an owner or HR person wants PTO balances for a team: one PTO, vacation or sick leave balance per employee from one accrual policy (accrual_amount + accrual_unit + accrual_per, e.g. 15, days, year) and a list of employees (typed, pasted CSV, or an attached CSV/Excel file with name, hire date, starting balance, hours used). Applies the same policy options as calculate_pto_balance (per hour worked, per pay period, annual front-loaded or accrued, tenure tiers, caps, carryover and reset, waiting period). Returns each person's balance, hours used this year, year-end projection and hours at risk at the reset, team totals, and PDF, Excel (with each person's ledger) and CSV files. Does not give legal advice, process payroll, or compute PTO payout in money. For one person's dated ledger use calculate_pto_balance.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"pay_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Any real payday for weekly or biweekly pay, e.g. 2026-01-09, so accruals land on the right Fridays. Default: the first Friday on or after the ledger start."
},
"employees": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"maxLength": 200000
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"maxLength": 1000
},
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 1000,
"description": "Employee name, e.g. Dana Kim (shortened to 80 characters)."
},
"hire_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Hire date, e.g. 2023-05-15."
},
"used_hours": {
"type": [
"number",
"string",
"null"
],
"description": "PTO hours used since the starting date (or this accrual year), e.g. 24."
},
"annual_days": {
"type": [
"number",
"string",
"null"
],
"description": "Override days per year for this person, e.g. 20."
},
"accrual_rate": {
"type": [
"number",
"string",
"null"
],
"description": "Override accrual rate for this person, e.g. 0.05."
},
"starting_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Balance on starting_balance_date in hours, e.g. 12."
},
"hours_worked_per_period": {
"type": [
"number",
"string",
"null"
],
"description": "Hours per pay period for part-time staff, e.g. 48."
}
},
"additionalProperties": {}
}
]
},
"maxItems": 5000
}
]
},
{
"type": "null"
}
],
"description": "The team: a list of employees, or CSV text with a header such as \"name,hire_date,starting_balance,used_hours\" and one row per person. Up to 500."
},
"hire_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Hire (start) date, e.g. 2024-03-04. Used for tenure tiers, the waiting period and the first partial pay period."
},
"as_of_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Date to report the balance on, e.g. 2026-10-26. Default: today in US Eastern time."
},
"first_year": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "For annual_front_loaded: prorated (default, first grant prorated by days left in the year) or full."
},
"reset_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "When the accrual year resets (carryover is applied), e.g. \"01-01\" (default January 1), \"July 1\", or \"anniversary\" (hire anniversary), or \"none\"."
},
"accrual_per": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
],
"description": "How often accrual_amount is earned: year, month, week, pay_period, or hour_worked. Required for hours; days or weeks without it are read as per year."
},
"annual_days": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Days of PTO per year, e.g. 15. Converted with hours_per_day (default 8)."
},
"max_balance": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Maximum balance (accrual stops at this cap until hours are used), in hours, e.g. 240, or \"30 days\"."
},
"accrual_rate": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Fallback only, when you cannot fill accrual_amount/accrual_unit/accrual_per: the rule as text with a number, unit and period, e.g. \"1 per 30\", \"4.62 hours per paycheck\", \"15 days a year\". Hours without a period are refused."
},
"accrual_unit": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Unit of accrual_amount: hours (default), days, or weeks (weeks = days_per_week x hours_per_day)."
},
"annual_hours": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Hours of PTO per year, e.g. 120. Use instead of annual_days."
},
"hours_worked": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"maxLength": 8000
},
{
"type": "array",
"items": {
"type": "object",
"required": [
"date",
"hours"
],
"properties": {
"date": {
"type": "string",
"maxLength": 40,
"description": "Any date in the pay period, e.g. 2026-01-09."
},
"hours": {
"type": [
"number",
"string"
],
"description": "Hours worked that pay period, e.g. 72."
}
},
"additionalProperties": {}
},
"maxItems": 600
}
]
},
{
"type": "null"
}
],
"description": "Actual hours worked per pay period for per_hour_worked, e.g. [{\"date\":\"2026-01-09\",\"hours\":72}] or \"2026-01-09: 72, 2026-01-23: 80\". Periods not listed use the standard hours."
},
"tenure_tiers": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"maxLength": 600
},
{
"type": "array",
"items": {
"type": "object",
"properties": {
"from_year": {
"type": [
"number",
"string",
"null"
],
"description": "Completed years of service when this tier starts, e.g. 0, 3, 6."
},
"annual_days": {
"type": [
"number",
"string",
"null"
],
"description": "Days per year in this tier, e.g. 15."
},
"accrual_rate": {
"type": [
"number",
"string",
"null"
],
"description": "Or a rate in the method's unit, e.g. 0.0577 per hour worked or 6.15 per pay period."
},
"annual_hours": {
"type": [
"number",
"string",
"null"
],
"description": "Hours per year in this tier, e.g. 120."
}
},
"additionalProperties": {}
},
"maxItems": 12
}
]
},
{
"type": "null"
}
],
"description": "Tenure tiers (years of service), as text \"0-2: 10 days, 3-5: 15 days, 6+: 20 days\" or a list [{\"from_year\":0,\"annual_days\":10},{\"from_year\":3,\"annual_days\":15}]. \"years 3-5\" starts at the 3rd work anniversary."
},
"days_per_week": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Workdays per week, default 5. Converts weeks of PTO to hours."
},
"hours_per_day": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Hours in one PTO day, default 8, e.g. 7.5."
},
"pay_frequency": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Pay schedule: weekly, biweekly (default, every two weeks), semimonthly (15th and last day), or monthly."
},
"accrual_amount": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Preferred way to give the rule: the amount earned, e.g. 15 (with accrual_unit days, accrual_per year), 4.62 (hours per pay_period) or 0.0333 (hours per hour_worked)."
},
"accrual_method": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"description": "How PTO is earned: per_hour_worked (e.g. 1 h per 30 h worked), per_pay_period (fixed hours each paycheck, e.g. 4.62 h), annual_front_loaded (whole year granted at once on the reset date), annual_accrued_per_period (yearly amount, e.g. 15 days, spread evenly over pay periods). Optional: inferred from the other fields."
},
"employees_file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"file_name": {
"type": "string",
"description": "Original file name if known, e.g. statement.pdf."
},
"mime_type": {
"type": "string",
"description": "Media type if known, e.g. application/pdf."
},
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
}
},
"description": "Optional CSV or Excel (.xlsx) file of employees with columns like name, hire date, starting balance, hours used, e.g. team-pto.csv."
},
"hours_per_week": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Standard hours per week, default 40, e.g. 30 for part time. Used when hours worked are not given."
},
"waiting_period": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Waiting period after hire before PTO can be used, e.g. \"90 days\" or \"3 months\"."
},
"carryover_limit": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Hours that may roll over at the reset date, e.g. 40. 0 = use it or lose it. Leave out for unlimited rollover."
},
"starting_balance": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Known balance on starting_balance_date, in hours, e.g. 32.5 (from a pay stub), or \"4 days\"."
},
"annual_accrual_cap": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Most hours that can be earned in one accrual year, e.g. 48."
},
"waiting_period_rule": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "accrue_but_locked (default: hours accrue from hire but cannot be used until the waiting period ends) or no_accrual (nothing accrues during the waiting period)."
},
"starting_balance_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Date of the starting balance, e.g. 2026-01-01. Default: the start of the current accrual year (or the hire date if later)."
},
"hours_worked_per_period": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
}
]
},
{
"type": "null"
}
],
"description": "Hours worked in each pay period, for per_hour_worked when it differs from the standard (40 h/week), e.g. 64."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"kind",
"as_of",
"as_of_label",
"as_of_source",
"policy",
"employees_total",
"employees",
"totals",
"projection_through",
"reset_date",
"source_file",
"assumptions",
"warnings",
"notes",
"downloads"
],
"properties": {
"kind": {
"type": "string"
},
"as_of": {
"type": "string"
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"policy": {
"type": "object",
"required": [
"method",
"method_label",
"rule",
"pay_frequency",
"hours_per_day",
"reset",
"carryover_limit_hours",
"max_balance_hours",
"annual_accrual_cap_hours",
"waiting_period_ends",
"tiers"
],
"properties": {
"rule": {
"type": "string"
},
"reset": {
"type": "string"
},
"tiers": {
"type": "array",
"items": {
"type": "string"
}
},
"method": {
"type": "string"
},
"method_label": {
"type": "string"
},
"hours_per_day": {
"type": "number"
},
"pay_frequency": {
"type": "string"
},
"max_balance_hours": {
"type": [
"number",
"null"
]
},
"waiting_period_ends": {
"type": [
"string",
"null"
]
},
"carryover_limit_hours": {
"type": [
"number",
"null"
]
},
"annual_accrual_cap_hours": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
},
"totals": {
"type": "object",
"required": [
"balance_hours",
"projected_year_end_hours",
"forfeit_at_reset_hours",
"accrued_ytd",
"used_ytd"
],
"properties": {
"used_ytd": {
"type": "number"
},
"accrued_ytd": {
"type": "number"
},
"balance_hours": {
"type": "number"
},
"forfeit_at_reset_hours": {
"type": "number"
},
"projected_year_end_hours": {
"type": "number"
}
},
"additionalProperties": false
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"downloads": {
"type": "object",
"properties": {
"csv": {
"type": "string"
},
"pdf": {
"type": "string"
},
"xlsx": {
"type": "string"
}
},
"additionalProperties": false
},
"employees": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"hire_date",
"balance_hours",
"available_hours",
"accrued_ytd",
"used_ytd",
"projected_year_end_hours",
"forfeit_at_reset_hours",
"tier",
"flags"
],
"properties": {
"name": {
"type": "string"
},
"tier": {
"type": [
"string",
"null"
]
},
"flags": {
"type": "array",
"items": {
"type": "string"
}
},
"used_ytd": {
"type": "number"
},
"hire_date": {
"type": [
"string",
"null"
]
},
"accrued_ytd": {
"type": "number"
},
"balance_hours": {
"type": "number"
},
"available_hours": {
"type": "number"
},
"forfeit_at_reset_hours": {
"type": "number"
},
"projected_year_end_hours": {
"type": "number"
}
},
"additionalProperties": false
}
},
"reset_date": {
"type": [
"string",
"null"
]
},
"as_of_label": {
"type": "string"
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"source_file": {
"anyOf": [
{
"type": "object",
"required": [
"name",
"rows_read",
"employees_used",
"skipped"
],
"properties": {
"name": {
"type": "string"
},
"skipped": {
"type": "number"
},
"rows_read": {
"type": "number"
},
"employees_used": {
"type": "number"
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"as_of_source": {
"type": "string"
},
"employees_total": {
"type": "number"
},
"projection_through": {
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Calculate team PTO balances",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
1 advertised
pto-accrual-widget — Zovo PTO Accrual Calculator view
Interactive view for Zovo PTO Accrual Calculator.
ui://widget/pto-accrual-v1-1.0.0-3d13d79f77a4746dba062b219e6e01dc39d7c8b6c87aa9af65ee06806cf39434.htmlpto-accrual-widget-legacy — Zovo PTO Accrual Calculator view (previous versions)
ui://widget/pto-accrual-{version}.html30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1337 ms
- 95th percentile latency
- 1337 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1337 ms · metadata changed · 2 tool(s), 1 resource(s), 1 resource template(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http zovo-pto-accrual-calculator-mcp https://pto-accrual.zovo.one/mcpCodex
codex mcp add zovo-pto-accrual-calculator-mcp --url https://pto-accrual.zovo.one/mcpCursor
{
"mcpServers": {
"zovo-pto-accrual-calculator-mcp": {
"url": "https://pto-accrual.zovo.one/mcp"
}
}
}Cline
{
"mcpServers": {
"zovo-pto-accrual-calculator-mcp": {
"type": "streamableHttp",
"url": "https://pto-accrual.zovo.one/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"zovo-pto-accrual-calculator-mcp": {
"type": "http",
"url": "https://pto-accrual.zovo.one/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http zovo-pto-accrual-calculator-mcp https://pto-accrual.zovo.one/mcpClaude Desktop
https://pto-accrual.zovo.one/mcpWindsurf
{
"mcpServers": {
"zovo-pto-accrual-calculator-mcp": {
"serverUrl": "https://pto-accrual.zovo.one/mcp"
}
}
}Let your agent find its tools
Find servers like Zovo PTO Accrual Calculator MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.