Staffing Math について
Staffing Mathは、業務チームや電話・チャット窓口の人員計画に使うMCPサーバーです。必要FTE、月次採用計画、Erlang Cによる要員数を計算し、入力値や仮定、計算過程を確認できます。
主な機能
- 01定常業務に必要なFTEを計算
- 02需要変化に応じた月次採用計画
- 03離職、採用期間、立ち上がり期間の反映
- 04Erlang Cによる電話・チャット要員算出
- 05入力、仮定、計算手順の表示
- 06インタラクティブな採用計画ビュー
活用シーン
- 01定常業務に必要な人員の見積もり
- 02月次の業務増加に合わせた採用計画
- 03離職率と採用リードタイムの考慮
- 04応答時間目標を満たす窓口要員の算出
MCP 対応
required_fte、hiring_plan、erlang_staffingの3つのツールをMCPクライアントに公開します。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 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
Staffing Math
Claude と ChatGPT に正確な人員計算を提供する MCP サーバーです。3 つのツールがあります。
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 件のケースを 1 件あたり 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 として示しました。離職率と人員数が結果に最も大きく影響するため、回答ではこの 2 つを明示し、離職率 15% と 30% の場合の計画も併記しています。Claude にはその旨を伝え、実際の数値で再計算するよう提案するよう指示されています。現在 30 人で、年間離職率が 25%、立ち上がりに 1 か月かかる場合、同じ予測には 30 件ではなく 53 件の求人が必要です。そのうち 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 です。
インストール
サーバーは 1 つのファイル dist/staffing-math.mjs で構成され、Node 18 以降が必要です。まずリポジトリをクローンしてください。
git clone https://github.com/bsunter93/staffing-math.git
Claude Desktop
Settings を開き、Developer、Edit Config の順に選択して、claude_desktop_config.json にサーバーを追加します。クローン先の絶対パスを指定してください。
{
"mcpServers": {
"staffing-math": {
"command": "node",
"args": ["/full/path/to/staffing-math/dist/staffing-math.mjs"]
}
}
}
Claude Desktop を再起動します。新しいチャットのツールメニューに 3 つのツールが表示されます。
代わりに 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のカスタムコネクター
これらは、公開HTTPS URLでStreamable HTTP経由でリモートサーバーに接続します。ホスト版は無料で利用でき、サインインも不要です。数値は一切保存せず、日付、アプリ、ツール別に呼び出し回数を集計します(利用回数を参照してください)。
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:Pluginsを開き、Add、次にAdd custom MCP serverを選択します。認証は不要です。ChatGPTはプランビューを描画します。更新後、プラグインの設定でRefresh toolsを選ぶと、新しい入力項目が反映されます。
- Gemini:Connectorsを開き、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のみをアップロードします。この2つだけを含むフォルダーをVercelのダッシュボードのプロジェクトページにドラッグすれば、CLIを使わずに同じものをデプロイできます。エンドポイントはhttps://<project>.vercel.app/mcpです。同じハンドラーはCloudflare Workers、Deno、Bunでも動作します。Workersの無料プランでは、減耗を考慮した36か月のプランで、リクエストあたりのCPU制限10msを超える場合があります。有料プランではこの問題は発生しません。
ツール
| ツール | 必須 | オプション(デフォルト値あり) |
|---|---|---|
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 | 上記3項目、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のコピーがあります。3つのツールはいずれも読み取り専用で、ネットワーク呼び出しを行わず、データを保存しません。
利用回数
ホスト版サーバー(staffing-math.vercel.app)は、リクエストごとにカウンターを1つ増やします。集計項目は日付(UTC)、アプリ(openai-mcpなど、User-Agentの最初の単語)、リクエスト内容(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/ は、コミット 758c9d7 時点の Simulator のエンジンをバイト単位で完全にコピーしたものです。月次モデル(run())、170 人を超えてもオーバーフローしない安定した再帰処理を使う 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 の 3 つすべてのトランスポートでの実行が含まれます。
制限事項
Erlang C は、待ち時間中に電話を切る人はいないこと、および区間内の到着が一定であることを前提としているため、最も忙しい時間帯に合わせて人員を配置してください。コストや予算、複数チーム間のルーティング、月内の季節性には対応していません。Operating Model Simulator は複数チーム、チーム間のルーティング、コストを扱います。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。