Moltline TimeOps
Business days, meeting overlap and recurrence expansion, deterministic. 3 of 5 tools free.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"timeops": {
"url": "https://mcp.moltlinestudio.com/timeops"
}
}
}Remote endpoints
https://mcp.moltlinestudio.com/timeopsstreamable-httpWhat it can do
Tool inventory
Tools (5)
🟢business_days(start_date, add_days, end_date, holidays)
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.
Input Schema
{
"type": "object",
"properties": {
"start_date": {
"type": "string",
"description": "Anchor date in ISO format YYYY-MM-DD, e.g. \"2026-03-02\"."
},
"add_days": {
"default": 0,
"maximum": 5000,
"minimum": -5000,
"type": "integer",
"description": "Business days to add; negative subtracts. Range -5000 to\n5000. Ignored when end_date is provided."
},
"end_date": {
"default": "",
"type": "string",
"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": {
"default": [],
"items": {
"type": "string"
},
"type": "array",
"description": "Optional list of ISO YYYY-MM-DD dates to treat as\nnon-working days, e.g. [\"2026-12-25\"]."
}
},
"required": [
"start_date"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"additionalProperties": true
}🟢meeting_overlap(offsets_utc, work_start, work_end)
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.
Input Schema
{
"type": "object",
"properties": {
"offsets_utc": {
"items": {
"maximum": 14,
"minimum": -14,
"type": "number"
},
"type": "array",
"description": "One UTC offset per participant, each between -14 and\n+14; fractional offsets allowed, e.g. [-8, 1, 5.5]."
},
"work_start": {
"default": "09:00",
"type": "string",
"description": "Working day start, 24h HH:MM local in every zone.\nDefault \"09:00\"."
},
"work_end": {
"default": "17:00",
"type": "string",
"description": "Working day end, 24h HH:MM; must be later than work_start.\nDefault \"17:00\"."
}
},
"required": [
"offsets_utc"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"additionalProperties": true
}🟢recurrence_expand(start_date, count, every_days, weekly_on)
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.
Input Schema
{
"type": "object",
"properties": {
"start_date": {
"type": "string",
"description": "First date of the series, ISO YYYY-MM-DD."
},
"count": {
"default": 10,
"type": "integer",
"description": "How many dates to generate; values outside 1-60 are clamped\ninto that range. Default 10."
},
"every_days": {
"default": 0,
"type": "integer",
"description": "Interval in days between occurrences; use this OR\nweekly_on, not both."
},
"weekly_on": {
"default": [],
"items": {
"type": "string"
},
"type": "array",
"description": "Weekday names to recur on, e.g. [\"mon\", \"thu\"]; full names\nlike \"monday\" also work."
}
},
"required": [
"start_date"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"additionalProperties": true
}🟢deadline_planner(due_date, tasks, holidays, buffer_days)
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.
Input Schema
{
"type": "object",
"properties": {
"due_date": {
"type": "string",
"description": "The deadline, ISO YYYY-MM-DD."
},
"tasks": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array",
"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."
},
"holidays": {
"default": [],
"items": {
"type": "string"
},
"type": "array",
"description": "Optional list of ISO YYYY-MM-DD dates treated as\nnon-working days."
},
"buffer_days": {
"default": 1,
"type": "integer",
"description": "Business days of safety margin kept free before\ndue_date, clamped to 0-365. Default 1."
}
},
"required": [
"due_date",
"tasks"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"additionalProperties": true
}🟢sla_due(opened_at, sla_hours, business_hours_only, day_start, day_end, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"opened_at": {
"type": "string",
"description": "When the SLA clock started, ISO datetime YYYY-MM-DDTHH:MM."
},
"sla_hours": {
"exclusiveMinimum": 0,
"maximum": 24000,
"type": "number",
"description": "SLA length in hours; greater than 0, at most 24000;\nfractions allowed, e.g. 7.5."
},
"business_hours_only": {
"default": false,
"type": "boolean",
"description": "If true, only time inside day_start-day_end on\nbusiness days counts toward the SLA."
},
"day_start": {
"default": "09:00",
"type": "string",
"description": "Business day start, 24h HH:MM. Default \"09:00\"."
},
"day_end": {
"default": "17:00",
"type": "string",
"description": "Business day end, 24h HH:MM; must be later than day_start.\nDefault \"17:00\"."
},
"holidays": {
"default": [],
"items": {
"type": "string"
},
"type": "array",
"description": "Optional list of ISO YYYY-MM-DD dates that never count as\nworking days."
}
},
"required": [
"opened_at",
"sla_hours"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"additionalProperties": true
}Community
Evidence