Call this server's tools from your browser. Nothing to install.
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.
Agents needed on a live queue (phone, chat) to answer a target share of contacts within a target time, using Erlang C. Give contacts per hour for the interval being staffed (usually the busiest hour) and handle time in seconds. Returns agents needed, the service level at that number and at one fewer, chance of waiting, occupancy, and people to schedule after shrinkage. Use required_fte for case or ticket work with no answer-time target.
Contacts arriving per hour in the interval being staffed.
Average handle time in seconds: talk plus after-contact work.
Share of paid time agents are off the queue. Converts agents to people scheduled. Default 0.3.
Share of contacts to answer within the target time. Default 0.8.
Target answer time in seconds. Default 20.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http staffing-math https://staffing-math.vercel.app/mcp
Agents needed on a live queue (phone, chat) to answer a target share of contacts within a target time, using Erlang C. Give contacts per hour for the interval being staffed (usually the busiest hour) and handle time in seconds. Returns agents needed, the service level at that number and at one fewer, chance of waiting, occupancy, and people to schedule after shrinkage. Use required_fte for case or ticket work with no answer-time target.
| Argument | Type | Description |
|---|---|---|
| shrinkage | number | Share of paid time agents are off the queue. Converts agents to people scheduled. Default 0.3. |
| service_level | number | Share of contacts to answer within the target time. Default 0.8. |
| contacts_per_hour* | number | Contacts arriving per hour in the interval being staffed. |
| handle_time_seconds* | number | Average handle time in seconds: talk plus after-contact work. |
| answer_within_seconds | number | Target answer time in seconds. Default 20. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"contacts_per_hour",
"handle_time_seconds"
],
"properties": {
"shrinkage": {
"type": "number",
"maximum": 0.95,
"minimum": 0,
"description": "Share of paid time agents are off the queue. Converts agents to people scheduled. Default 0.3."
},
"service_level": {
"type": "number",
"maximum": 0.999,
"minimum": 0.01,
"description": "Share of contacts to answer within the target time. Default 0.8."
},
"contacts_per_hour": {
"type": "number",
"maximum": 100000,
"description": "Contacts arriving per hour in the interval being staffed.",
"exclusiveMinimum": 0
},
"handle_time_seconds": {
"type": "number",
"maximum": 36000,
"description": "Average handle time in seconds: talk plus after-contact work.",
"exclusiveMinimum": 0
},
"answer_within_seconds": {
"type": "number",
"maximum": 3600,
"minimum": 0,
"description": "Target answer time in seconds. Default 20."
}
}
}Month-by-month hiring plan: how many requisitions to open each month so FTE on hand keeps up with FTE needed, after attrition, time to hire and ramp. Give weekly_volume with monthly_growth (0.05 means 5% a month, compounding), or weekly_volume_by_month. Unknown inputs fall back to stated defaults: current headcount defaults to what month 1 needs, attrition to 0, time to hire to 2 months, ramp to 0. When attrition is assumed, the result also gives the plan at 15% and 30%. Give hires_in_flight for people already hired or in the pipeline. Returns the plan table, totals, the arithmetic, and which inputs were assumed. A hire counts as zero capacity until fully ramped.
| Argument | Type | Description |
|---|---|---|
| months | integer | Plan length in months when using monthly_growth. Default 12. |
| shrinkage | number | Share of paid time not available for the work: PTO, sick time, training, meetings. 0.30 means 30%. Default 0.3. |
| ramp_months | integer | Months from start date to full productivity. Default 0. |
| start_month | string | First month of the plan as YYYY-MM, used only to label months. |
| weekly_volume | number | Weekly volume in month 1. Use with monthly_growth. |
| monthly_growth | number | Month-over-month change in weekly volume. 0.05 means 5% a month. Default 0. |
| hires_in_flight | array | People already hired or in the pipeline, and the month they start counting. These are the only way to cover months before a new requisition can land. |
| annual_attrition | number | Share of the team that leaves in a year. 0.25 means 25%. Default 0. |
| minutes_per_case* | number | Average handling time per case, in minutes. |
| target_occupancy | number | Share of available time you plan to keep people busy with the work. Default 0.85. |
| current_headcount | number | FTE on the team today. Default: what month 1 needs, rounded up. |
| hours_per_fte_week | number | Paid hours per full-time person per week. Default 40. |
| time_to_hire_months | integer | Months from opening a requisition to the start date. Default 2. |
| weekly_volume_by_month | array | Average weekly volume in each month of the plan, instead of weekly_volume and monthly_growth. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"minutes_per_case"
],
"properties": {
"months": {
"type": "integer",
"maximum": 36,
"minimum": 1,
"description": "Plan length in months when using monthly_growth. Default 12."
},
"shrinkage": {
"type": "number",
"maximum": 0.95,
"minimum": 0,
"description": "Share of paid time not available for the work: PTO, sick time, training, meetings. 0.30 means 30%. Default 0.3."
},
"ramp_months": {
"type": "integer",
"maximum": 24,
"minimum": 0,
"description": "Months from start date to full productivity. Default 0."
},
"start_month": {
"type": "string",
"description": "First month of the plan as YYYY-MM, used only to label months."
},
"weekly_volume": {
"type": "number",
"maximum": 1000000000,
"description": "Weekly volume in month 1. Use with monthly_growth.",
"exclusiveMinimum": 0
},
"monthly_growth": {
"type": "number",
"maximum": 1,
"minimum": -0.5,
"description": "Month-over-month change in weekly volume. 0.05 means 5% a month. Default 0."
},
"hires_in_flight": {
"type": "array",
"items": {
"type": "object",
"required": [
"month",
"count"
],
"properties": {
"count": {
"type": "integer",
"maximum": 100000,
"minimum": 1,
"description": "How many people."
},
"month": {
"type": "integer",
"maximum": 36,
"minimum": 1,
"description": "Plan month the people start counting as capacity. Use 1 for anyone counting from the start."
}
}
},
"maxItems": 36,
"description": "People already hired or in the pipeline, and the month they start counting. These are the only way to cover months before a new requisition can land."
},
"annual_attrition": {
"type": "number",
"maximum": 0.99,
"minimum": 0,
"description": "Share of the team that leaves in a year. 0.25 means 25%. Default 0."
},
"minutes_per_case": {
"type": "number",
"maximum": 10000,
"description": "Average handling time per case, in minutes.",
"exclusiveMinimum": 0
},
"target_occupancy": {
"type": "number",
"maximum": 1,
"minimum": 0.05,
"description": "Share of available time you plan to keep people busy with the work. Default 0.85."
},
"current_headcount": {
"type": "number",
"maximum": 1000000,
"minimum": 0,
"description": "FTE on the team today. Default: what month 1 needs, rounded up."
},
"hours_per_fte_week": {
"type": "number",
"maximum": 168,
"description": "Paid hours per full-time person per week. Default 40.",
"exclusiveMinimum": 0
},
"time_to_hire_months": {
"type": "integer",
"maximum": 24,
"minimum": 0,
"description": "Months from opening a requisition to the start date. Default 2."
},
"weekly_volume_by_month": {
"type": "array",
"items": {
"type": "number",
"maximum": 1000000000,
"exclusiveMinimum": 0
},
"maxItems": 36,
"minItems": 1,
"description": "Average weekly volume in each month of the plan, instead of weekly_volume and monthly_growth."
}
}
}How many people a steady workload needs. Give weekly volume and minutes per case; shrinkage, target occupancy and hours per week fall back to stated defaults. Returns FTE, people to staff (rounded up), every input marked given or assumed, and the arithmetic with numbers filled in. Use hiring_plan when volume changes over time or the question is about hiring, and erlang_staffing for live queues with an answer-time target.
| Argument | Type | Description |
|---|---|---|
| shrinkage | number | Share of paid time not available for the work: PTO, sick time, training, meetings. 0.30 means 30%. Default 0.3. |
| weekly_volume* | number | Cases, tickets or items arriving per week. |
| minutes_per_case* | number | Average handling time per case, in minutes. |
| target_occupancy | number | Share of available time you plan to keep people busy with the work. Default 0.85. |
| hours_per_fte_week | number | Paid hours per full-time person per week. Default 40. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"weekly_volume",
"minutes_per_case"
],
"properties": {
"shrinkage": {
"type": "number",
"maximum": 0.95,
"minimum": 0,
"description": "Share of paid time not available for the work: PTO, sick time, training, meetings. 0.30 means 30%. Default 0.3."
},
"weekly_volume": {
"type": "number",
"maximum": 1000000000,
"description": "Cases, tickets or items arriving per week.",
"exclusiveMinimum": 0
},
"minutes_per_case": {
"type": "number",
"maximum": 10000,
"description": "Average handling time per case, in minutes.",
"exclusiveMinimum": 0
},
"target_occupancy": {
"type": "number",
"maximum": 1,
"minimum": 0.05,
"description": "Share of available time you plan to keep people busy with the work. Default 0.85."
},
"hours_per_fte_week": {
"type": "number",
"maximum": 168,
"description": "Paid hours per full-time person per week. Default 40.",
"exclusiveMinimum": 0
}
}
}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 Nov 6, 2026.