Shift Scheduler
Server Details
Builds optimal 24/7 staff rosters with a real MILP solver: rest rules, skills, nights, fairness.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: build_shift_roster solves a roster, get_shift_example returns a single example input, get_shift_roster_result fetches an async result, and list_shift_examples enumerates available examples. No two tools overlap in function, so an agent can easily select the right one.
All tool names follow a consistent verb_noun pattern in snake_case: build_shift_roster, get_shift_example, get_shift_roster_result, list_shift_examples. The verbs (build, get, list) and nouns are predictable and uniformly structured.
With 4 tools, the server is well-scoped for its purpose of generating shift rosters. It provides the essential operations (build, get example, list examples, fetch result) without unnecessary bloat or a thin surface.
The tool set covers the full workflow: discover examples (list_shift_examples), obtain a template (get_shift_example), submit a job (build_shift_roster), and retrieve the outcome (get_shift_roster_result). There are no obvious dead ends or missing lifecycle steps for the stated domain.
Available Tools
4 toolsbuild_shift_rosterBuild an optimized shift rosterARead-onlyIdempotentInspect
Solve a staff rostering problem to optimality with a MILP solver and return who works which shift each day, coverage, unfilled posts, hours per person and warnings. Solves take 5-60 s. Pass either example (to solve a built-in example as-is) or the roster input fields. If the result has status 'running', call get_shift_roster_result with its job_id. Roster input. Minimal example: {"days": ["2026-10-05", "2026-10-06"], "shifts": [{"shift": "Day", "start": "07:00", "end": "19:00"}, {"shift": "Night", "start": "19:00", "end": "07:00", "night": "yes"}], "demands": [{"name": "RN", "penalty": 500}], "people": [{"name": "Ana", "cost": 40, "max_hw": 48}, ...], "grids": {"RN": {"2026-10-05|Day": 2, "2026-10-05|Night": 1}}, "parameters": {"MinRestHours": 11}}. Call get_shift_example for complete, realistic inputs.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Day labels in order: ISO dates ('2026-10-05') or weekday names ('Mon'). Dates or weekdays enable weekend rules. | |
| grids | No | Optional per-day/shift cells, keyed by a demand name or a person name, each an object keyed 'DAY|SHIFT'. Demand grid value = headcount required (demand with no grid = 1 on every shift). Person grid value: 'a' or 1 = available, 'f' = must work, 0 or missing = UNAVAILABLE (person with no grid = available everywhere). | |
| people | No | ||
| shifts | No | Shift types. A shift may cross midnight (end < start). | |
| skills | No | Who can cover which demand. Omitted = everyone can cover every demand. | |
| demands | No | Posts to fill (roles). Headcount per day/shift goes in grids. | |
| example | No | Solve this built-in example instead of passing the fields below. | |
| parameters | No | Optional rules. MinRestHours (11), MaxConsecutiveDays (6), MaxConsecutiveNights (4), ForbidDayAfterNight ('yes'), NightStartsAfter ('18:00'), MinBlockDays (1), WeekendFairnessPenalty (0), EquityPenalty (0) = even out total hours, NightEquityPenalty (0) = even out total nights (try 20), NightDifferential (1.0), WeekendDifferential (1.0), TimeLimitSeconds (max 120 here), GapPercent (2). | |
| wait_seconds | No | How long to wait for the solve inside this call (default 25). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context beyond annotations: solve duration (5-60 s), the asynchronous 'running' status, and the nature of the returned data. It does not address failure modes other than 'running', but it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main purpose, then timing, then usage modes. The inline JSON example is lengthy but earns its place given the complex nested schema. No sentence is wasted, though the example could arguably be trimmed or referenced rather than fully inlined.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and lack of an output schema, the description is quite complete: it states what the tool returns, how long it takes, how to handle async results, and how to get example inputs. It does not cover error scenarios beyond 'running', but the core invocation workflow is fully specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (89%), so the schema already documents most parameters. The description adds value beyond the schema by explaining the either/or input mode (`example` vs. the roster fields) and providing a minimal example that illustrates how days, shifts, demands, people, grids, and parameters combine. This helps an agent assemble correct input without reading every schema field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action ('Solve a staff rostering problem to optimality') and a clear resource ('a shift roster'), and it lists concrete outputs: who works which shift, coverage, unfilled posts, hours per person, and warnings. It also differentiates itself from siblings by telling the agent when to call get_shift_roster_result and get_shift_example.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the two input modes: pass `example` for a built-in case or pass the roster input fields. It also gives a clear conditional: if status is 'running', call get_shift_roster_result with its job_id, and points the agent to get_shift_example for realistic inputs. This is actionable and distinguishes the tool from its alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shift_exampleGet an example roster inputARead-onlyInspect
Return the full input JSON of one example, in exactly the shape build_shift_roster accepts. Edit it (names, days, headcounts, rules) to match the user's situation.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | es = Spanish shift and post names. | |
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, and the description adds useful behavioral context: the return value is a full input payload in build_shift_roster's exact shape, and it is meant to be edited before use. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The first sentence front-loads the exact behavior and output shape; the second gives actionable guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is low-complexity, has read-only annotations, enum-only parameters, and no output schema. The description gives agents everything needed to call it correctly and understand what the response will be: one full example JSON shaped for build_shift_roster.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents both parameters with enums, and lang has its own description, so parameter meaning is mostly covered by structured data. The description does not add meaning to the name selector, though the enum values are self-explanatory. It adds editing guidance about fields inside the example, not about the parameters themselves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Return') and resource ('full input JSON of one example'), and it distinguishes the tool from siblings by explicitly tying the output shape to build_shift_roster. There is no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use it: when the agent needs a concrete, editable example to adapt for the user's situation. It does not explicitly mention when not to use it or contrast it with list_shift_examples, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shift_roster_resultGet a roster resultARead-onlyInspect
Fetch the result of a build_shift_roster job that returned status 'running'. Waits up to wait_seconds; call again while status is 'running'. Jobs expire 15 minutes after they finish.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ||
| wait_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds valuable behavioral details: it waits up to wait_seconds, requires repeated calls while status is 'running', and notes that jobs expire 15 minutes after finishing. These go beyond the annotations and inform the agent about timing and lifecycle, which is critical for a polling tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and scope. The polling behavior and expiration are stated succinctly. Every clause carries necessary information; there is no fluff or redundancy. It is highly efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a polling tool with two parameters and no output schema, the description covers the essential operational aspects: when to call, how long to wait, and the need to poll repeatedly. It also mentions expiration. The only missing element is error handling or failure behavior, but the tool's purpose is simple and the description provides enough context for an agent to use it correctly. Given the simplicity, it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must clarify parameter meaning. It explains wait_seconds as the maximum wait duration and implies job_id is the identifier from a build_shift_roster call. This provides enough semantic grounding for both parameters. However, it does not specify the format or expected values of job_id, and the description could be more explicit about how wait_seconds interacts with the polling loop, but it is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('fetch') and a clear resource ('result of a build_shift_roster job'), and it explicitly narrows the scope to jobs that returned status 'running'. This differentiates it from siblings: build_shift_roster creates jobs, while get_shift_example and list_shift_examples deal with examples. The purpose is unambiguous and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly specifies when to use the tool: when a build_shift_roster job is running, and it instructs to poll by calling again while the status remains 'running'. It does not explicitly name alternatives or when not to use it, but the condition is explicit enough. The absence of alternative references is a minor gap given the clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_shift_examplesList example rostersARead-onlyInspect
List the built-in example rostering problems (hospital ward, 3-shift plant, security post, fire station, 24/7 help desk). Use one as a starting point for the user's own roster.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so this is clearly a safe read-only operation. The description adds useful context about the built-in example set but does not disclose deeper behavioral details such as response shape or pagination, which are not required here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The core action and resource are front-loaded, and the example names plus intended use are packed efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list tool whose safety profile is fully covered by annotations, the description is complete. It tells the agent what is listed, names the examples, and explains why the agent should call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and an empty input schema, so the description carries no parameter-semantics burden. It still clarifies what content will be listed, which is helpful context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a clear resource ('built-in example rostering problems'), and enumerates the exact examples. It is easy to distinguish from siblings: get_shift_example is singular, while this lists all built-in examples.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: use one of these examples as a starting point for the user's own roster. It does not explicitly discuss when to prefer sibling tools, but the use case is well implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
- First observed
build_shift_roster - First observed
get_shift_example - First observed
get_shift_roster_result - First observed
list_shift_examples
Related MCP Connectors
Generate optimized work shift schedules from staffing demand, availability and fairness rules.
Optimize crew and workforce schedules, resource allocation, and routing with linear and mixed-inte…
Compute real duty rosters from your AI assistant - rule-based vigotime planner, API key or OAuth.
Staff scheduling — manage staff, shifts, assignments, certifications, and requests via AI.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceGenerates legally-compliant weekly shift schedules for Korean workplaces through conversation, using OR-Tools CP-SAT to enforce labor laws such as the 52-hour weekly cap and minor worker protections.MIT
- AlicenseAqualityCmaintenanceEnables solving complex combinatorial optimization problems with logical and numerical constraints through multiple solvers (Z3, CVXPY, HiGHS, OR-Tools). Specializes in portfolio optimization, scheduling, resource allocation, and constraint satisfaction problems.55Apache 2.0
- FlicenseNot gradedqualityDmaintenanceNegotiation math engine for AI agents. Computes Pareto frontiers, generates iso-utility counteroffers, and infers counterpart priorities. 9 tools for any multi-issue negotiation. Zero LLM tokens — pure MILP optimization.-
- AlicenseBqualityCmaintenanceMathematical Optimization MCP Server with PuLP and OR-Tools support135MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.