Koskamo

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.

Zovo PTO Accrual Calculator MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-08Published by Zovo
MCP endpoint (Streamable HTTP)
https://pto-accrual.zovo.one/mcp
Vendor documentation

What its tools do

2 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

2 of 2 have a description · 2 of 2 declare behavior hints · 2 of 2 with parameters document them all

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

Community listingRegistry 1.0.0

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
Server-advertised capabilities
{
  "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.

Zovo PTO Accrual Calculator works out paid time off (PTO, vacation, sick leave) balances from an accrual policy. calculate_pto_balance handles one employee: accrual per hour worked, per pay period or per year (front-loaded or accrued evenly), tenure tiers, max balance, annual cap, carryover limit and reset date, waiting period, and time taken. It returns the balance as of a date, a dated ledger, upcoming accruals, a year-end projection with hours at risk, and PDF, Excel and CSV files. calculate_team_pto_balances applies one policy to a list of employees and returns one balance per person. Pass every policy detail and every time-off date the user gives. It is not legal advice.

Tools

2 advertised

calculate_pto_balance — Calculate PTO balance
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

calculate_pto_balance input schema
{
  "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."
    }
  }
}
calculate_pto_balance output schema
{
  "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
}
calculate_pto_balance annotations
{
  "title": "Calculate PTO balance",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
calculate_team_pto_balances — Calculate team PTO balances
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

calculate_team_pto_balances input schema
{
  "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."
    }
  }
}
calculate_team_pto_balances output schema
{
  "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
}
calculate_team_pto_balances annotations
{
  "title": "Calculate team PTO balances",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

pto-accrual-widget — Zovo PTO Accrual Calculator view

Advertised by the server during the last successful anonymous check.

Interactive view for Zovo PTO Accrual Calculator.

pto-accrual-widget URI
ui://widget/pto-accrual-v1-1.0.0-3d13d79f77a4746dba062b219e6e01dc39d7c8b6c87aa9af65ee06806cf39434.html

MIME type: text/html;profile=mcp-app

pto-accrual-widget-legacy — Zovo PTO Accrual Calculator view (previous versions)

Advertised by the server during the last successful anonymous check.

pto-accrual-widget-legacy URI template
ui://widget/pto-accrual-{version}.html

MIME type: text/html;profile=mcp-app

30-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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http zovo-pto-accrual-calculator-mcp https://pto-accrual.zovo.one/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add zovo-pto-accrual-calculator-mcp --url https://pto-accrual.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable zovo-pto-accrual-calculator-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "zovo-pto-accrual-calculator-mcp": {
      "url": "https://pto-accrual.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "zovo-pto-accrual-calculator-mcp": {
      "type": "streamableHttp",
      "url": "https://pto-accrual.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start zovo-pto-accrual-calculator-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "zovo-pto-accrual-calculator-mcp": {
      "type": "http",
      "url": "https://pto-accrual.zovo.one/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http zovo-pto-accrual-calculator-mcp https://pto-accrual.zovo.one/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://pto-accrual.zovo.one/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.