关于 Staffing Math
Staffing Math 面向规划运营团队及电话、聊天队列人力的人员配置需求。三个工具分别计算所需 FTE、月度招聘计划和 Erlang C 配员,并列出输入、假设及计算步骤供核查。
主要功能
- 01计算稳定工作量所需 FTE
- 02按需求变化规划月度招聘名额
- 03模拟离职、招聘周期和爬坡期
- 04用 Erlang C 计算电话或聊天队列人员
- 05展示输入、假设和计算步骤
- 06显示交互式招聘计划视图
适用场景
- 01估算固定工作量所需人力
- 02规划月度业务增长对应的招聘
- 03纳入离职率和招聘提前期
- 04计算达到应答时限目标的队列人力
MCP 相关
它向 MCP 客户端提供 required_fte、hiring_plan 和 erlang_staffing 三种工具。hiring_plan 还提供 MCP Apps 视图,并支持托管或自运行的 HTTP 端点及 stdio。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://staffing-math.vercel.app/mcpclaude mcp add --transport http bsunter93-staffing-math https://staffing-math.vercel.app/mcp{"mcpServers":{"bsunter93-staffing-math":{"type":"http","url":"https://staffing-math.vercel.app/mcp"}}}在 Cursor 中打开{"servers":{"bsunter93-staffing-math":{"type":"http","url":"https://staffing-math.vercel.app/mcp"}}}在 VS Code 中打开{"mcpServers":{"bsunter93-staffing-math":{"type":"http","url":"https://staffing-math.vercel.app/mcp"}}}{"mcpServers":{"bsunter93-staffing-math":{"serverUrl":"https://staffing-math.vercel.app/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
人员配置计算
一个 MCP 服务,可为 Claude 和 ChatGPT 提供精确的人员配置计算。它包含三个工具:
required_fte:计算稳定工作量所需的人数。hiring_plan:在工作量变化时,计算每月需要开放多少招聘职位,并考虑人员流失、招聘周期和上岗爬坡时间。erlang_staffing:计算电话或聊天队列为达到应答时间目标所需的坐席人数(Erlang C)。
模型负责对话,工具负责所有计算,并在给出答案时一并返回:每项输入都会标记为 given 或 assumed,算式中也会填入具体数字。你可以用计算器核对任意答案。
在 Claude 和 ChatGPT 中,hiring_plan 还会以图表呈现答案:按月对比所需 FTE 和现有 FTE,用斜线标出人手不足的月份,并在下方列出要开放的招聘职位。你调整增长率、人员流失率、招聘周期、上岗爬坡时间、非生产时间和人数时,滑块会让服务端重新运行计划,模型也会获知你所做的更改。
计算引擎来自 Operating Model Simulator,原样复制到 vendor/ 中,并包含其自身的测试。
无需安装即可使用:将 https://staffing-math.vercel.app/mcp 添加为连接器。步骤和示例:bensunter.com/staffing-math.html。
示例
我每周处理 4,000 个案例,每个案例需要 12 分钟,非生产时间为 30%。我需要多少人?如果工作量每月增长 5%,招聘计划会是什么样?
required_fte 返回:
Answer: 33.61 FTE, so 34 people.
Inputs
- weekly volume: 4,000 cases (given)
- minutes per case: 12 (given)
- shrinkage: 30% (given)
- target occupancy: 85% (assumed)
- hours per FTE per week: 40 (assumed)
Arithmetic
1. Work per week = 4,000 cases x 12 min / 60 = 800.0 hours
2. Productive hours per FTE = 40 x (1 - 0.3) = 28.00 hours
3. Planned hours per FTE at 85% occupancy = 28.00 x 0.85 = 23.80 hours
4. FTE needed = 800.0 / 23.80 = 33.61
5. People to staff = 33.61 rounded up = 34
Each extra minute per case adds 2.80 FTE.
使用相同输入并设定每月增长 5% 时,hiring_plan 会返回以下答案和表格,以及相同的输入和计算过程:
Answer: open 30 requisitions over 12 months, 4 of them in month 1.
FTE needed goes from 33.61 in month 1 to 57.49 in month 12. Expected leavers over the plan: 0.0.
Requisitions opened in months 11 and 12 are for hires who count in months 13 and 14, assuming the 5% monthly growth continues.
Month 2 is short and new hires can't fix that: the earliest a requisition opened now counts is month 3. Covering it takes overtime, contractors or moving people. People already hired or in the pipeline can count earlier: give them as hires_in_flight.
Attrition was assumed to be 0%. At 15% a year this plan needs 38 requisitions; at 30%, 48. Ask for the team's real rate.
Current headcount was assumed to be exactly what month 1 needs (34), as if the team is fully staffed today. If it has fewer people, give current_headcount.
| 月份 | 每周工作量 | 所需 FTE | 要开放的招聘职位 | 计入人数 | 预计离职人数 | 现有 FTE | 富余 (+) / 短缺 (-) |
|---|---|---|---|---|---|---|---|
| 第 1 个月 | 4,000 | 33.61 | 4 | 0 | 0.00 | 34.00 | +0.39 |
| 第 2 个月 | 4,200 | 35.29 | 1 | 0 | 0.00 | 34.00 | -1.29 |
| 第 3 个月 | 4,410 | 37.06 | 2 | 4 | 0.00 | 38.00 | +0.94 |
| 第 4 个月 | 4,631 | 38.91 | 2 | 1 | 0.00 | 39.00 | +0.09 |
| 第 5 个月 | 4,862 | 40.86 | 3 | 2 | 0.00 | 41.00 | +0.14 |
| 第 6 个月 | 5,105 | 42.90 | 2 | 2 | 0.00 | 43.00 | +0.10 |
| 第 7 个月 | 5,360 | 45.05 | 2 | 3 | 0.00 | 46.00 | +0.95 |
| 第 8 个月 | 5,628 | 47.30 | 3 | 2 | 0.00 | 48.00 | +0.70 |
| 第 9 个月 | 5,910 | 49.66 | 2 | 2 | 0.00 | 50.00 | +0.34 |
| 第 10 个月 | 6,205 | 52.15 | 3 | 3 | 0.00 | 53.00 | +0.85 |
| 第 11 个月 | 6,516 | 54.75 | 3 | 2 | 0.00 | 55.00 | +0.25 |
| 第 12 个月 | 6,841 | 57.49 | 3 | 3 | 0.00 | 58.00 | +0.51 |
提示词没有提供目标占用率、每周工时、当前人数、人员流失率、招聘周期或上岗爬坡时间,因此工具使用默认值,并将每项都列为 assumed。人员流失率和人数对答案影响最大,因此结果会特别说明这两项,并同时给出人员流失率为 15% 和 30% 时的计划。Claude 会被告知这一点,并主动提出使用实际数字重新计算。若目前有 30 人、年人员流失率为 25%,且上岗爬坡需要一个月,同一份预测需要开放 53 个招聘职位,而不是 30 个;其中 12 个在第 1 个月开放,并且在任何新员工计入之前,第 1 至第 3 个月都会人手不足。
手动核算:第 12 个月的工作量为 4,000 x 1.05^11 = 每周 6,841 个案例。也就是 6,841 x 12 / 60 = 1,368 小时,而 1,368 / 23.80 = 57.49 FTE。
安装
该服务只有一个文件 dist/staffing-math.mjs,需要 Node 18 或更高版本。先克隆仓库:
git clone https://github.com/bsunter93/staffing-math.git
Claude Desktop
打开“设置”,然后依次进入“开发者”和“编辑配置”,将服务添加到 claude_desktop_config.json。使用克隆仓库的完整路径:
{
"mcpServers": {
"staffing-math": {
"command": "node",
"args": ["/full/path/to/staffing-math/dist/staffing-math.mjs"]
}
}
}
重新启动 Claude Desktop。在新聊天中,三个工具会显示在工具菜单下。
若要将其安装为 Desktop 扩展,则运行 npm run pack,然后双击生成的 staffing-math.mcpb。
Claude Code
在 Claude Code 中将其作为插件使用:
/plugin marketplace add bsunter93/staffing-math
/plugin install staffing-math@staffing-math
或者将其作为普通 MCP 服务使用:
claude mcp add staffing-math -- node /full/path/to/staffing-math/dist/staffing-math.mjs
Gemini CLI
gemini extensions install https://github.com/bsunter93/staffing-math
仓库中的 gemini-extension.json 会运行同一个捆绑服务。Gemini CLI 会显示工具的文本答案,但不会绘制计划视图。
ChatGPT、Gemini 和 Claude 自定义连接器
这些连接器通过 Streamable HTTP 连接到公共 HTTPS URL 上的远程服务。托管版本可免费使用,无需登录。它不会保存你的任何数据;只会按天、应用和工具统计调用次数(参见使用次数):
https://staffing-math.vercel.app/mcp
如需运行自己的服务,请以 HTTP 模式启动服务器:
node dist/staffing-math.mjs --http --port 3000
它会监听 http://127.0.0.1:3000/mcp。将它置于 HTTPS 后面(使用主机、反向代理或 cloudflared tunnel --url http://localhost:3000 这样的隧道),然后添加 https://your-host/mcp 作为无需身份验证的连接器:
- ChatGPT:插件,然后选择 Add,再选择 Add custom MCP server,无需身份验证。ChatGPT 会绘制计划视图。更新后,在插件设置中选择 Refresh tools 即可获取新的输入项。
- Gemini:连接器,然后选择 Custom。Gemini 会显示文本答案。
- Claude:Settings、Connectors、Add custom connector。如果在服务器上运行,请使用
--host 0.0.0.0。
HTTP 模式是无状态的。每个请求都会启动一个全新的服务器,因此可以横向扩展,无需会话。
托管
api/index.mjs 是同一个服务器,作为单个 Web 标准 fetch 处理程序(src/fetch.ts)运行,由 npm run build 构建。在 Vercel 上:
npx vercel deploy --prod
vercel.json 会将所有路径发送到这一个函数,并告知 Vercel 这里没有框架、无需安装任何内容,也无需构建,因此即使 Vercel 曾经将项目误判为其他类型,也仍然可以部署。.vercelignore 只会上传 api/ 和 vercel.json。在 Vercel 控制面板的项目页面中,拖入仅包含这两个文件的文件夹,无需 CLI 也能部署相同的服务。同一处理程序也可在 Cloudflare Workers、Deno 或 Bun 上运行。在 Workers 免费计划中,带有流失率的 36 个月计划可能会超过每个请求 10ms 的 CPU 限制;付费计划则没有这个问题。
工具
| 工具 | 必需项 | 可选项及默认值 |
|---|---|---|
required_fte | weekly_volume、minutes_per_case | shrinkage 0.30、target_occupancy 0.85、hours_per_fte_week 40 |
hiring_plan | minutes_per_case,以及 weekly_volume(配合 monthly_growth 使用)或 weekly_volume_by_month | 上述三个可选项、months 12、current_headcount(第 1 个月所需人数)、annual_attrition 0、time_to_hire_months 2、ramp_months 0、hires_in_flight(无)、start_month |
erlang_staffing | contacts_per_hour、handle_time_seconds | answer_within_seconds 20、service_level 0.80、shrinkage 0.30 |
分数按分数值填写:0.30 表示 30%。如果 shrinkage 填写为 30,系统会拒绝该值并说明原因。
每个结果都包含一个供模型使用的文本块,以及一个包含相同数字、输入项和步骤的 structuredContent 副本。全部三个工具均为只读,不会发出网络请求,也不会存储任何内容。
使用次数
托管服务 staffing-math.vercel.app 会为每个请求在计数器上加 1:按日期(UTC)、应用(User-Agent 的第一个词,例如 openai-mcp)和请求内容(initialize、tools_list、工具名称或 view)统计。它也会统计客户端连接时发送的应用名称。它绝不会保存工具输入、结果、IP 地址或完整的 User-Agent 字符串。计数可在 /stats 公开查看。
只有设置了 Upstash Redis REST URL 和令牌(KV_REST_API_URL 和 KV_REST_API_TOKEN,或 UPSTASH_REDIS_REST_ 这对变量)时才会进行计数。你自己的副本通过 stdio 或 HTTP 运行时不会进行计数。如果存储服务变慢或宕机,答案仍会正常返回;参见 src/usage.ts。
计划视图
hiring_plan 带有一个 MCP Apps 视图,地址为 ui://staffing-math/hiring-plan.html:这是一个脚本内联且不发出外部请求的 HTML 文件。支持 MCP Apps 的宿主会在回答下方显示它;其他宿主会忽略它,只显示文本。
- 标题和下方的文字就是答案的文字表述,每次变化后,屏幕阅读器都会再次读出它们。
- 图表附有文字说明。将指针移到某个月上,或聚焦图表并使用箭头键,即可听到对该月的描述。
- 每个控件都是带标签的原生滑块或数字输入框,因此可以通过键盘操作。
- “显示数字”会展开完整表格。
- 视图会遵循宿主的浅色或深色主题。
视图本身不会进行计算。移动控件会使用新的参数再次调用 hiring_plan,并绘制返回的结果。
招聘计划的工作原理
- 每月所需 FTE = 每周工作时数 /(每个 FTE 的工时 x (1 - 损耗率) x 目标占用率)。
- 按月应用流失率,其月度值按复利方式折算为年度数值:1 - (1 - 年度流失率)^(1/12)。离职人数是期望值,因此员工人数可以是小数。
- 在第 m 个月开启的招聘申请,会从第 m + 招聘周期 + 爬坡期个月起计入产能。在完全完成爬坡前,新员工计为零,因此计划倾向于尽早开启招聘申请。
- 从新员工最早可计入的月份开始逐月推进;只要在岗 FTE 低于所需 FTE,求解器就会在能让员工及时到岗的月份按整数人数补足缺口,然后重新运行引擎。
- 无法通过新招聘申请解决最早可能到岗月份之前的月份。工具会指出这些月份及缺口。已入职或正在招聘流程中的人员可以弥补缺口:
hires_in_flight接收人数及各组人员开始计入的月份,计划只会开启仍有缺口时所需的招聘申请。 - 计划临近结束时开启的招聘申请,人员会在计划结束后到岗。使用增长率时,求解器会将预测延伸到最后一个月之后,以便仍能规划这些招聘申请,并会说明这一点。使用逐月预测时,计划不会超出你提供的最后一个月。
- 某个月的 FTE 至少比所需人数多 1 时,该月即为富余月份。工具会指出人员过剩最多的月份,视图则会用阴影标示所有富余月份。招聘无法解决富余月份;它会显示需求低于现有人员数量的月份。
- 未提供流失率时,计划会分别按每年 15% 和 30% 重新运行,并报告两种总人数。这些数字是供讨论参考的对照值,并非基准。
测试会检查计划是否覆盖所有可补足缺口的月份,并验证移除任一招聘申请后是否会导致某个月出现缺口,从而确保招聘人数不会超过预测需求。
数学依据
vendor/operating-model-simulator/ 是 Simulator 引擎在提交 758c9d7 中逐字节复制的版本:包括月度模型(run())、使用稳定递归且在超过 170 名 Agent 时不会溢出的 Erlang B 和 C,以及日历辅助函数。required_fte 和 hiring_plan 会构建单团队模型并调用 run();erlang_staffing 会调用 staffFor、serviceLevel 和 erlangC。本仓库在此基础上增加了每周到每月的换算、招聘求解器以及周边的 MCP 服务。
npm install
npm test # upstream engine tests plus this repo's own
npm run check:vendor # confirms vendor/ still matches upstream
npm run build # rebuilds dist/staffing-math.mjs
测试包含对每个工具的手动计算、独立编写的教科书式 Erlang C,用于核验引擎结果,以及通过全部三种传输方式运行测试:内存、Streamable HTTP 和通过 stdio 运行的构建文件。
限制
Erlang C 假设等待期间无人挂断,且整个时间段内的到达率保持稳定,因此应按最繁忙的一小时配置人员。它不考虑成本或预算、不支持多团队路由,也不考虑月内的季节性变化。Operating Model Simulator 支持多个团队、团队之间的路由以及成本。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。