{
  "$schema": "https://modelcontextprotocol.io/schemas/server-card.json",
  "schemaVersion": "2024-11-05",
  "name": "timer.ly",
  "title": "timer.ly — countdown URL builder",
  "description": "Stateless countdown URL builder. Composes shareable timer.ly links for durations, target dates, count-up since past dates, and named holidays in five languages. No auth, no rate limits, no PII.",
  "version": "1.0.0",
  "vendor": "Sebastian Messingfeld",
  "homepage": "https://www.timer.ly/",
  "documentation": "https://www.timer.ly/docs",
  "contact": "https://to.messeb.com/contact",
  "logo": "https://www.timer.ly/favicon.png",
  "license": "MIT",
  "serverUrl": "https://www.timer.ly/api/mcp",
  "alternativeUrls": ["https://www.timer.ly/mcp"],
  "transports": [
    { "type": "streamable-http", "url": "https://www.timer.ly/api/mcp" },
    { "type": "http+jsonrpc", "url": "https://www.timer.ly/api/mcp" }
  ],
  "auth": { "type": "none" },
  "capabilities": {
    "tools": { "listChanged": false },
    "streaming": true,
    "logging": false,
    "prompts": false,
    "resources": false
  },
  "tools": [
    {
      "name": "build_duration_url",
      "description": "Build a /in/{duration} URL from days/hours/minutes/seconds. Returns a shareable countdown link.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "days":    { "type": "integer", "minimum": 0 },
          "hours":   { "type": "integer", "minimum": 0 },
          "minutes": { "type": "integer", "minimum": 0 },
          "seconds": { "type": "integer", "minimum": 0 },
          "locale":  { "type": "string", "enum": ["en", "de", "fr", "es", "it"] }
        }
      }
    },
    {
      "name": "build_target_url",
      "description": "Build a /at/{iso} URL from an ISO 8601 datetime.",
      "inputSchema": {
        "type": "object",
        "required": ["iso"],
        "properties": {
          "iso":    { "type": "string" },
          "locale": { "type": "string", "enum": ["en", "de", "fr", "es", "it"] }
        }
      }
    },
    {
      "name": "build_since_url",
      "description": "Build a /since/{iso} URL for a past date.",
      "inputSchema": {
        "type": "object",
        "required": ["iso"],
        "properties": {
          "iso":    { "type": "string" },
          "locale": { "type": "string", "enum": ["en", "de", "fr", "es", "it"] }
        }
      }
    },
    {
      "name": "build_event_url",
      "description": "Resolve a curated event (christmas, new_year, easter, summer_solstice, winter_solstice) to its next occurrence URL.",
      "inputSchema": {
        "type": "object",
        "required": ["event"],
        "properties": {
          "event":  { "type": "string", "enum": ["christmas", "new_year", "easter", "summer_solstice", "winter_solstice"] },
          "locale": { "type": "string", "enum": ["en", "de", "fr", "es", "it"] }
        }
      }
    },
    {
      "name": "list_curated_events",
      "description": "Enumerate the curated event catalog with next-occurrence dates.",
      "inputSchema": { "type": "object", "properties": { "locale": { "type": "string", "enum": ["en", "de", "fr", "es", "it"] } } }
    },
    {
      "name": "list_holidays",
      "description": "List national / bank holidays for UK, US, DE, FR, ES, or IT in a date range.",
      "inputSchema": {
        "type": "object",
        "required": ["country"],
        "properties": {
          "country": { "type": "string", "enum": ["uk", "us", "de", "fr", "es", "it"] },
          "from":    { "type": "string", "description": "YYYY-MM-DD (default today)" },
          "to":      { "type": "string", "description": "YYYY-MM-DD (default today + 365)" }
        }
      }
    },
    {
      "name": "parse_countdown_url",
      "description": "Reverse-parse a timer.ly URL into its encoded payload.",
      "inputSchema": { "type": "object", "required": ["url"], "properties": { "url": { "type": "string" } } }
    }
  ],
  "rateLimit": {
    "policy": "soft",
    "limit": 600,
    "window": "1m",
    "note": "Soft cap of ~600 requests/minute per IP. Burst tolerated. No hard quota; abusive clients may be temporarily blocked at the edge."
  },
  "status": "https://www.timer.ly/api/status"
}
