Business days, meeting overlap and recurrence expansion, deterministic. 3 of 5 tools free.
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.
Do business-day math that skips weekends and your holiday list. FREE. Either add N business days to start_date (set add_days), or count the business days between start_date and end_date (set end_date). Typical input {"start_date": "2026-03-02", "add_days": 10} returns {"result_date": "2026-03-16", "result_weekday": "Monday", ...}; with end_date set it returns {"business_days_between": N, "from": ..., "to": ...}. Use when the span must exclude weekends and named holidays. Not for plain calendar-day differences, which are a direct subtraction, and not for scheduling backward from a fixed deadline (deadline_planner). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "dates must be YYYY-MM-DD"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
Anchor date in ISO format YYYY-MM-DD, e.g. "2026-03-02".
Business days to add; negative subtracts. Range -5000 to 5000. Ignored when end_date is provided.
Optional end date, ISO YYYY-MM-DD. When set, the tool counts business days between start_date and end_date instead of adding.
Optional list of ISO YYYY-MM-DD dates to treat as non-working days, e.g. ["2026-12-25"].
Do business-day math that skips weekends and your holiday list. FREE. Either add N business days to start_date (set add_days), or count the business days between start_date and end_date (set end_date). Typical input {"start_date": "2026-03-02", "add_days": 10} returns {"result_date": "2026-03-16", "result_weekday": "Monday", ...}; with end_date set it returns {"business_days_between": N, "from": ..., "to": ...}. Use when the span must exclude weekends and named holidays. Not for plain calendar-day differences, which are a direct subtraction, and not for scheduling backward from a fixed deadline (deadline_planner). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "dates must be YYYY-MM-DD"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
| Argument | Type | Description |
|---|---|---|
| add_days | integer | Business days to add; negative subtracts. Range -5000 to 5000. Ignored when end_date is provided. |
| end_date | string | Optional end date, ISO YYYY-MM-DD. When set, the tool counts business days between start_date and end_date instead of adding. |
| holidays | array | Optional list of ISO YYYY-MM-DD dates to treat as non-working days, e.g. ["2026-12-25"]. |
| start_date* | string | Anchor date in ISO format YYYY-MM-DD, e.g. "2026-03-02". |
{
"type": "object",
"required": [
"start_date"
],
"properties": {
"add_days": {
"type": "integer",
"default": 0,
"maximum": 5000,
"minimum": -5000,
"description": "Business days to add; negative subtracts. Range -5000 to\n5000. Ignored when end_date is provided."
},
"end_date": {
"type": "string",
"default": "",
"description": "Optional end date, ISO YYYY-MM-DD. When set, the tool counts\nbusiness days between start_date and end_date instead of adding."
},
"holidays": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Optional list of ISO YYYY-MM-DD dates to treat as\nnon-working days, e.g. [\"2026-12-25\"]."
},
"start_date": {
"type": "string",
"description": "Anchor date in ISO format YYYY-MM-DD, e.g. \"2026-03-02\"."
}
},
"additionalProperties": false
}Plan a task schedule backward from a hard deadline in business days. PREMIUM (license). Given ordered tasks with business-day durations, returns each task's start/end dates, the latest safe start, and slack from today. Typical input {"due_date": "2026-06-01", "tasks": [{"name": "Draft", "days": 3}, {"name": "Review", "days": 2}]} returns {"schedule": [...], "latest_safe_start": "YYYY-MM-DD", "slack_business_days_from_today": N, "verdict": "..."}. Use when the end date is fixed and steps must be placed backward from it. Not for forward counting from a start date (business_days) and not for response-time targets (sla_due). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "due_date must be YYYY-MM-DD"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
| Argument | Type | Description |
|---|---|---|
| tasks* | array | Ordered list of task objects, each {"name": str, "days": int} where days is the business-day duration (1-365); the first 30 tasks are scheduled. |
| due_date* | string | The deadline, ISO YYYY-MM-DD. |
| holidays | array | Optional list of ISO YYYY-MM-DD dates treated as non-working days. |
| buffer_days | integer | Business days of safety margin kept free before due_date, clamped to 0-365. Default 1. |
Find the shared meeting window across time zones inside working hours. FREE. Give one UTC offset per participant and an optional working-hours window. Typical input {"offsets_utc": [-8, 1, 5.5]} returns {"overlap_utc": ["HH:MM", "HH:MM"], "overlap_minutes": N, "local_windows": [...]}; when no shared window exists it returns {"overlap": null, "verdict": "..."}. Use when people in different zones need one shared slot. Not for converting a single known time between zones, and not for expanding a recurring series (recurrence_expand). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "times must be HH:MM"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
| Argument | Type | Description |
|---|---|---|
| work_end | string | Working day end, 24h HH:MM; must be later than work_start. Default "17:00". |
| work_start | string | Working day start, 24h HH:MM local in every zone. Default "09:00". |
| offsets_utc* | array | One UTC offset per participant, each between -14 and +14; fractional offsets allowed, e.g. [-8, 1, 5.5]. |
{
"type": "object",
"required": [
"offsets_utc"
],
"properties": {
"work_end": {
"type": "string",
"default": "17:00",
"description": "Working day end, 24h HH:MM; must be later than work_start.\nDefault \"17:00\"."
},
"work_start": {
"type": "string",
"default": "09:00",
"description": "Working day start, 24h HH:MM local in every zone.\nDefault \"09:00\"."
},
"offsets_utc": {
"type": "array",
"items": {
"type": "number",
"maximum": 14,
"minimum": -14
},
"description": "One UTC offset per participant, each between -14 and\n+14; fractional offsets allowed, e.g. [-8, 1, 5.5]."
}
},
"additionalProperties": false
}Expand a recurrence rule into a concrete list of ISO dates. FREE. Set every_days for a fixed interval, or weekly_on for specific weekdays. Typical input {"start_date": "2026-01-05", "every_days": 14, "count": 3} returns {"dates": ["2026-01-05", "2026-01-19", "2026-02-02"]}. Use when a recurrence rule has to become concrete dates. Not for counting working days in a span (business_days) and not for finding a slot across zones (meeting_overlap). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "start_date must be YYYY-MM-DD"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
| Argument | Type | Description |
|---|---|---|
| count | integer | How many dates to generate; values outside 1-60 are clamped into that range. Default 10. |
| weekly_on | array | Weekday names to recur on, e.g. ["mon", "thu"]; full names like "monday" also work. |
| every_days | integer | Interval in days between occurrences; use this OR weekly_on, not both. |
| start_date* | string | First date of the series, ISO YYYY-MM-DD. |
{
"type": "object",
"required": [
"start_date"
],
"properties": {
"count": {
"type": "integer",
"default": 10,
"description": "How many dates to generate; values outside 1-60 are clamped\ninto that range. Default 10."
},
"weekly_on": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Weekday names to recur on, e.g. [\"mon\", \"thu\"]; full names\nlike \"monday\" also work."
},
"every_days": {
"type": "integer",
"default": 0,
"description": "Interval in days between occurrences; use this OR\nweekly_on, not both."
},
"start_date": {
"type": "string",
"description": "First date of the series, ISO YYYY-MM-DD."
}
},
"additionalProperties": false
}Compute when a ticket's SLA falls due, wall-clock or business-hours. PREMIUM (license). Typical input {"opened_at": "2026-03-02T15:30", "sla_hours": 8, "business_hours_only": true} returns {"due": "2026-03-03T15:30", "mode": "business hours 09:00-17:00"}; with business_hours_only false the mode is "wall-clock". Use when a response or resolution clock has started and one due moment is needed. Not for multi-step project schedules (deadline_planner). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "opened_at must be ISO YYYY-MM-DDTHH:MM"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
| Argument | Type | Description |
|---|---|---|
| day_end | string | Business day end, 24h HH:MM; must be later than day_start. Default "17:00". |
| holidays | array | Optional list of ISO YYYY-MM-DD dates that never count as working days. |
| day_start | string | Business day start, 24h HH:MM. Default "09:00". |
| opened_at* | string | When the SLA clock started, ISO datetime YYYY-MM-DDTHH:MM. |
| sla_hours* | number | SLA length in hours; greater than 0, at most 24000; fractions allowed, e.g. 7.5. |
| business_hours_only |
{
"type": "object",
"required": [
"due_date",
"tasks"
],
"properties": {
"tasks": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"description": "Ordered list of task objects, each {\"name\": str, \"days\": int}\nwhere days is the business-day duration (1-365); the first 30\ntasks are scheduled."
},
"due_date": {
"type": "string",
"description": "The deadline, ISO YYYY-MM-DD."
},
"holidays": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Optional list of ISO YYYY-MM-DD dates treated as\nnon-working days."
},
"buffer_days": {
"type": "integer",
"default": 1,
"description": "Business days of safety margin kept free before\ndue_date, clamped to 0-365. Default 1."
}
},
"additionalProperties": false
}| boolean |
| If true, only time inside day_start-day_end on business days counts toward the SLA. |
{
"type": "object",
"required": [
"opened_at",
"sla_hours"
],
"properties": {
"day_end": {
"type": "string",
"default": "17:00",
"description": "Business day end, 24h HH:MM; must be later than day_start.\nDefault \"17:00\"."
},
"holidays": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Optional list of ISO YYYY-MM-DD dates that never count as\nworking days."
},
"day_start": {
"type": "string",
"default": "09:00",
"description": "Business day start, 24h HH:MM. Default \"09:00\"."
},
"opened_at": {
"type": "string",
"description": "When the SLA clock started, ISO datetime YYYY-MM-DDTHH:MM."
},
"sla_hours": {
"type": "number",
"maximum": 24000,
"description": "SLA length in hours; greater than 0, at most 24000;\nfractions allowed, e.g. 7.5.",
"exclusiveMinimum": 0
},
"business_hours_only": {
"type": "boolean",
"default": false,
"description": "If true, only time inside day_start-day_end on\nbusiness days counts toward the SLA."
}
},
"additionalProperties": false
}