tilwhen date engine

Deterministic date arithmetic with auditable receipts: business days, due dates, holidays.

Should I use this

Quality & Safety

A
Description quality
97%
Schema completeness
98%
Naming quality
87%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'invoice_due' description lacks action verbin invoice_due

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,104Tokens (tool definitions)
~4.3 KBTypical response size
Significant attention impact (3.21% of 128k context)

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": {
    "tilwhen": {
      "url": "https://mcp.tilwhen.com/mcp"
    }
  }
}

Remote endpoints

https://mcp.tilwhen.com/mcpstreamable-http

What it can do

Tool inventory

Tools (9)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢parse_date_query(q, tz, locale)

Parses queries like "90 business days from today in uganda" into a normalized operation, answers it, and returns the auditable receipt. Ambiguous dates (03/04/2027) return needsClarification instead of a guess.

Input Schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "The date question in plain language. Pass the user's wording rather than a date you computed."
    },
    "tz": {
      "type": "string",
      "maxLength": 64,
      "default": "UTC",
      "description": "IANA timezone that defines \"today\" (e.g. Africa/Kampala). Default UTC."
    },
    "locale": {
      "type": "string",
      "enum": [
        "mdy",
        "dmy"
      ],
      "description": "Resolves ambiguous slash dates; omit to receive clarification choices"
    }
  },
  "required": [
    "q"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "parsed": {
      "anyOf": [
        {
          "type": "object",
          "properties": {},
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ],
      "description": "Normalized operation, or null when the query could not be understood confidently"
    },
    "confidence": {
      "type": "number",
      "description": "1.0 is a clean grammar hit; below 0.5 the query is refused rather than guessed"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Machine-readable notes, e.g. unsupported_unit or time_ignored"
    },
    "needsClarification": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "Present when the query is genuinely ambiguous (e.g. 03/04/2027); offers explicit choices instead of a guess"
    },
    "canonicalUrl": {
      "type": [
        "string",
        "null"
      ],
      "description": "tilwhen page that answers this query, to cite; null when no page covers it"
    },
    "answer": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "The calculated answer, absent when parsed is null"
    },
    "receipt": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "Auditable receipt, absent when parsed is null"
    }
  },
  "required": [
    "parsed",
    "confidence",
    "warnings"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢add_days(date, days, tz)

The date N whole calendar days after a date (exclusive counting: the start date is day 0). Omit date for today in tz. For working days use business_days; for the gap between two dates use days_between.

Input Schema

{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)",
      "default": "today"
    },
    "days": {
      "type": "integer",
      "minimum": -100000,
      "maximum": 100000,
      "description": "Whole calendar days to add. Negative counts backwards."
    },
    "tz": {
      "type": "string",
      "maxLength": 64,
      "default": "UTC",
      "description": "IANA timezone that defines \"today\" (e.g. Africa/Kampala). Default UTC."
    }
  },
  "required": [
    "days"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "answer": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "The calculated answer (kind-discriminated)"
    },
    "receipt": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "Auditable receipt: inputs, timezone, convention, workweek, holiday calendar, exclusions, versions, stable result ID"
    }
  },
  "required": [
    "answer",
    "receipt"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢subtract_days(date, days, tz)

The date N whole calendar days before a date (exclusive counting: the start date is day 0). Omit date for today in tz. For working days use business_days; for the gap between two dates use days_between.

Input Schema

{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)",
      "default": "today"
    },
    "days": {
      "type": "integer",
      "minimum": -100000,
      "maximum": 100000,
      "description": "Whole calendar days to subtract. Negative counts forwards."
    },
    "tz": {
      "type": "string",
      "maxLength": 64,
      "default": "UTC",
      "description": "IANA timezone that defines \"today\" (e.g. Africa/Kampala). Default UTC."
    }
  },
  "required": [
    "days"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "answer": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "The calculated answer (kind-discriminated)"
    },
    "receipt": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "Auditable receipt: inputs, timezone, convention, workweek, holiday calendar, exclusions, versions, stable result ID"
    }
  },
  "required": [
    "answer",
    "receipt"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢days_between(from, to, tz)

Signed whole calendar days from the from date to the to date, midnight to midnight in tz: positive when to is later, negative when it is earlier. Endpoints are exclusive, so this is the gap and consecutive dates are 1 apart. Either date may be "today", resolved in tz. For working days between two dates use business_days; to move a date by N days use add_days or subtract_days.

Input Schema

{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)"
    },
    "to": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)"
    },
    "tz": {
      "type": "string",
      "maxLength": 64,
      "default": "UTC",
      "description": "IANA timezone that defines \"today\" (e.g. Africa/Kampala). Default UTC."
    }
  },
  "required": [
    "from",
    "to"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "answer": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "The calculated answer (kind-discriminated)"
    },
    "receipt": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "Auditable receipt: inputs, timezone, convention, workweek, holiday calendar, exclusions, versions, stable result ID"
    }
  },
  "required": [
    "answer",
    "receipt"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢business_days(from, to, date, days, jurisdiction, ...)

Span mode (from+to): business days between two dates, exclusive of the start day, inclusive of the end day. Add mode (days, optional date): the date N business days away. Passing from or to selects span mode and needs both; days and date are then ignored, so add mode takes its start date in date, not from. Optional holiday jurisdiction or custom calendar, and a selectable working week. For calendar days use add_days, subtract_days or days_between.

Input Schema

{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)"
    },
    "to": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)"
    },
    "date": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)"
    },
    "days": {
      "type": "integer",
      "minimum": -100000,
      "maximum": 100000,
      "description": "Add mode: business days to move. Negative counts backwards."
    },
    "jurisdiction": {
      "type": "string",
      "maxLength": 8,
      "description": "Holiday jurisdiction id: US, GB, GB-SCT, GB-NIR, IE, FR, CA, AU, UG (alias UK for GB). No default: omit for no holiday calendar."
    },
    "customHolidays": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 1000,
      "description": "Custom organizational holiday calendar as ISO dates (mutually exclusive with jurisdiction)"
    },
    "workweek": {
      "type": "string",
      "enum": [
        "mon-fri",
        "sun-thu",
        "mon-sat"
      ],
      "description": "Working week. Default mon-fri (Sat+Sun weekend)."
    },
    "tz": {
      "type": "string",
      "maxLength": 64,
      "default": "UTC",
      "description": "IANA timezone that defines \"today\" (e.g. Africa/Kampala). Default UTC."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "answer": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "The calculated answer (kind-discriminated)"
    },
    "receipt": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "Auditable receipt: inputs, timezone, convention, workweek, holiday calendar, exclusions, versions, stable result ID"
    }
  },
  "required": [
    "answer",
    "receipt"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢invoice_due(invoiceDate, net, roll, jurisdiction, customHolidays, ...)

Due date for Net-N payment terms (calendar days, invoice date = day 0). Optional roll-forward past weekends and, with a jurisdiction or custom calendar, public holidays.

Input Schema

{
  "type": "object",
  "properties": {
    "invoiceDate": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)",
      "default": "today"
    },
    "net": {
      "type": "integer",
      "minimum": 0,
      "maximum": 3650,
      "description": "Net-N payment terms in calendar days (Net 30 = 30)."
    },
    "roll": {
      "type": "boolean",
      "description": "Roll a weekend or holiday due date forward to the next business day. Default false."
    },
    "jurisdiction": {
      "type": "string",
      "maxLength": 8,
      "description": "Holiday jurisdiction id: US, GB, GB-SCT, GB-NIR, IE, FR, CA, AU, UG (alias UK for GB). No default: omit for no holiday calendar."
    },
    "customHolidays": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 1000,
      "description": "Custom organizational holiday calendar as ISO dates (mutually exclusive with jurisdiction)"
    },
    "workweek": {
      "type": "string",
      "enum": [
        "mon-fri",
        "sun-thu",
        "mon-sat"
      ],
      "description": "Working week. Default mon-fri (Sat+Sun weekend)."
    },
    "tz": {
      "type": "string",
      "maxLength": 64,
      "default": "UTC",
      "description": "IANA timezone that defines \"today\" (e.g. Africa/Kampala). Default UTC."
    }
  },
  "required": [
    "net"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "answer": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "The calculated answer (kind-discriminated)"
    },
    "receipt": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "Auditable receipt: inputs, timezone, convention, workweek, holiday calendar, exclusions, versions, stable result ID"
    }
  },
  "required": [
    "answer",
    "receipt"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢next_occurrence(event, weekday, from, tz)

The next occurrence strictly after the base date (default today) of either a tracked event slug (e.g. "christmas") or a weekday (0 = Sunday .. 6 = Saturday). Provide exactly one of event/weekday.

Input Schema

{
  "type": "object",
  "properties": {
    "event": {
      "type": "string",
      "maxLength": 40,
      "description": "Event slug (e.g. christmas). Exactly one of event/weekday."
    },
    "weekday": {
      "type": "integer",
      "minimum": 0,
      "maximum": 6,
      "description": "0 = Sunday .. 6 = Saturday. Exactly one of event/weekday."
    },
    "from": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)"
    },
    "tz": {
      "type": "string",
      "maxLength": 64,
      "default": "UTC",
      "description": "IANA timezone that defines \"today\" (e.g. Africa/Kampala). Default UTC."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "answer": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "The calculated answer (kind-discriminated)"
    },
    "receipt": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "Auditable receipt: inputs, timezone, convention, workweek, holiday calendar, exclusions, versions, stable result ID"
    }
  },
  "required": [
    "answer",
    "receipt"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢holidays(jurisdiction, year)

Observed public holidays with the nominal (legal) date and status: rule (statutory) or declared (officially declared for that year). Declared-only holidays are omitted for undeclared years, with a holiday_data_incomplete warning.

Input Schema

{
  "type": "object",
  "properties": {
    "jurisdiction": {
      "type": "string",
      "maxLength": 8,
      "description": "Holiday jurisdiction id: US, GB, GB-SCT, GB-NIR, IE, FR, CA, AU, UG (alias UK for GB)."
    },
    "year": {
      "type": "integer",
      "minimum": 1600,
      "maximum": 3000,
      "description": "Calendar year to list, e.g. 2027"
    }
  },
  "required": [
    "jurisdiction",
    "year"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "answer": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "The calculated answer (kind-discriminated)"
    },
    "receipt": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "Auditable receipt: inputs, timezone, convention, workweek, holiday calendar, exclusions, versions, stable result ID"
    }
  },
  "required": [
    "answer",
    "receipt"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢explain(op, date, days, from, to, ...)

Runs any operation and returns the receipt plus human-readable derivation steps. Set op, then pass the fields that operation's own tool takes. Use it when the user asks how an answer was reached.

Input Schema

{
  "type": "object",
  "properties": {
    "op": {
      "type": "string",
      "enum": [
        "add_days",
        "subtract_days",
        "days_between",
        "business_days",
        "invoice_due",
        "next_occurrence",
        "holiday_lookup"
      ],
      "description": "Operation to explain. holiday_lookup is the holidays tool; the others share their tool's name."
    },
    "date": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)"
    },
    "days": {
      "type": "integer",
      "minimum": -100000,
      "maximum": 100000,
      "description": "Day count for add_days, subtract_days and business_days add mode."
    },
    "from": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)"
    },
    "to": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)"
    },
    "invoiceDate": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2}|today)$",
      "description": "ISO date YYYY-MM-DD, or \"today\" (resolved in tz)"
    },
    "net": {
      "type": "integer",
      "minimum": 0,
      "maximum": 3650,
      "description": "Net-N payment terms in calendar days (Net 30 = 30)."
    },
    "roll": {
      "type": "boolean",
      "description": "Roll a weekend or holiday due date forward to the next business day. Default false."
    },
    "event": {
      "type": "string",
      "maxLength": 40,
      "description": "Event slug (e.g. christmas). Exactly one of event/weekday."
    },
    "weekday": {
      "type": "integer",
      "minimum": 0,
      "maximum": 6,
      "description": "0 = Sunday .. 6 = Saturday. Exactly one of event/weekday."
    },
    "year": {
      "type": "integer",
      "minimum": 1600,
      "maximum": 3000,
      "description": "Calendar year for holiday_lookup, e.g. 2027"
    },
    "jurisdiction": {
      "type": "string",
      "maxLength": 8,
      "description": "Holiday jurisdiction id: US, GB, GB-SCT, GB-NIR, IE, FR, CA, AU, UG (alias UK for GB). No default: omit for no holiday calendar."
    },
    "customHolidays": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 1000,
      "description": "Custom organizational holiday calendar as ISO dates (mutually exclusive with jurisdiction)"
    },
    "workweek": {
      "type": "string",
      "enum": [
        "mon-fri",
        "sun-thu",
        "mon-sat"
      ],
      "description": "Working week. Default mon-fri (Sat+Sun weekend)."
    },
    "tz": {
      "type": "string",
      "maxLength": 64,
      "default": "UTC",
      "description": "IANA timezone that defines \"today\" (e.g. Africa/Kampala). Default UTC."
    }
  },
  "required": [
    "op"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "receipt": {
      "type": "object",
      "properties": {},
      "additionalProperties": true,
      "description": "Auditable receipt for the operation"
    },
    "steps": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Human-readable derivation, identical to the REST /api/v1/explain output"
    }
  },
  "required": [
    "receipt",
    "steps"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded9 tools
verifiedversion not recorded9 tools