Shift Scheduler
Server Details
Builds optimal 24/7 staff rosters with a real MILP solver: rest rules, skills, nights, fairness.
- Status
- Healthy
- Uptime
- 100.0% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 4 tools
The four tools split cleanly into example discovery (list/get), submission (build), and async result retrieval (get_shift_roster_result). The only related pair is list vs get examples, which follow standard list/detail semantics and are not ambiguous.
All tool names use a consistent lowercase snake_case verb_noun pattern: build_shift_roster, get_shift_example, get_shift_roster_result, list_shift_examples. The naming makes each tool's purpose immediately readable and predictable.
Four tools is well-scoped for a focused scheduling service: one to solve, one to fetch async results, and two to discover and load example inputs. Each tool has a distinct job, so the set feels neither padded nor sparse.
The toolset covers the full workflow: list and fetch examples, submit a roster build, and poll for results. Edge cases like running jobs and too-large inputs are explicitly addressed, leaving no obvious dead ends for the core use case.
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. If it has status 'too_large', shorten the horizon or reduce people/shift types and retry. 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 60 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=true and idempotentHint=true, so the description's job is to add context. It does: it mentions solve time (5-60 s), the possibility of a 'running' status that requires fetching results later, and a 'too_large' status with retry guidance. This goes beyond the annotations and informs the agent of async behavior and failure modes. No contradiction with annotations is evident.
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 dense and purposeful. It front-loads the primary purpose, then timing, then usage instructions, and finally an example. Each sentence serves a function, and the inline minimal example is compact and illustrative. It is slightly long but not wasteful; every part 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?
Given the tool's complexity (9 parameters, nested objects, no output schema), the description covers the essential usage points: what the tool does, the two input modes, timing, and how to handle async results and oversized problems. It lists the output types at a high level but not the exact structure, which is acceptable without an output schema. The description is sufficient for an agent to call the tool correctly and know what to expect.
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?
With 89% schema description coverage, the baseline is 3. The description adds value by providing a minimal example that clarifies the structure of the input (days, shifts, demands, people, grids, parameters), and by explaining the two modes (example vs roster fields) and the semantics of status values. It doesn't repeat schema details but does give a concrete usage pattern, which helps the agent understand how parameters fit together.
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 ('Solve'), resource ('staff rostering problem'), and the expected outputs (who works which shift, coverage, unfilled posts, hours per person, warnings). It also differentiates from siblings by mentioning the two input modes (example vs roster fields) and referencing get_shift_roster_result for async results, which clearly distinguishes it from the getter and example tools.
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 explicit guidance on when to use this tool vs alternatives: it says to pass either 'example' or roster fields, and to call get_shift_roster_result if the status is 'running'. It also tells the user to call get_shift_example for complete inputs. While it doesn't explicitly state 'use this when you need to solve a roster', the context is clear. It lacks a comprehensive exclusion list but covers the key decision points.
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.
1 tool update
- Changed
build_shift_roster1 field changed- changed
Input schema / properties / parameters / descriptionPrevious value: -"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)."New value: +"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 60 here), GapPercent (2)."
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.
Employee scheduling, staffing feasibility, localized demos, schedule reports and CSV export.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceGenerates 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.