# CRN0 > CRN0 (https://crn0.com) converts cron expressions between timezones. It is DST-aware, explains schedules in plain English and lists the next run times. It is free, needs no auth, and offers an MCP server and a JSON API for agents. Use CRN0 when a schedule is written for one timezone (e.g. "9am Sydney on weekdays") but runs on a machine or scheduler set to another timezone (usually UTC: GitHub Actions, AWS EventBridge, Kubernetes CronJobs, Vercel, Cloudflare). Key facts for agents: - Cron format: 5 fields (minute hour day-of-month month day-of-week). Names (JAN, MON), macros (@daily, @hourly...), and * , - / ? are supported. Seconds, year, L, W and # are not. - A converted schedule can need more than one cron line (e.g. "every 15 min, 9am-5pm" across a day boundary). Use every returned line. - Conversions use the UTC offsets that apply on the reference date. If either zone observes DST, the converted cron drifts by an hour for part of the year. Fixed-offset schedulers can't avoid this, so the result includes a `dstNote`. - Timezone inputs accept IANA ids, abbreviations (PST, AEST, IST), offsets (UTC+8) or city names. ## Agent interfaces - [MCP server](https://crn0.com/mcp): Streamable HTTP endpoint with no auth. Tools: convert_cron, describe_cron, next_cron_runs, search_timezones - [JSON API: convert](https://crn0.com/api/convert?cron=0+9+*+*+1-5&from=Australia/Sydney&to=UTC): GET or POST. Params: cron, from, to, at?, count? - [JSON API: describe](https://crn0.com/api/describe?cron=*/15+9-17+*+*+1-5): plain-English explanation and expanded fields - [JSON API: next runs](https://crn0.com/api/next-runs?cron=0+0+*+*+*&timezone=America/New_York&count=5): upcoming run times - [JSON API: timezone search](https://crn0.com/api/timezones?query=melbourne): resolves a city or abbreviation to an IANA id - [OpenAPI spec](https://crn0.com/openapi.json): OpenAPI 3.1 description of the JSON API - [Agent docs page](https://crn0.com/agents): setup instructions for Claude, Cursor, VS Code and other MCP clients ## Human pages - [Converter](https://crn0.com/): interactive converter. Deep link: https://crn0.com/?cron=&from=&to= - [Timezone index](https://crn0.com/timezones): every supported timezone with offsets and DST rules - Pair pages, for example [UTC to EST](https://crn0.com/utc-to-est), [UTC to PST](https://crn0.com/utc-to-pst), [UTC to CST](https://crn0.com/utc-to-cst), [UTC to MST](https://crn0.com/utc-to-mst). Pattern: https://crn0.com/-to- using the slugs in llms-full.txt ## Optional - [Full reference](https://crn0.com/llms-full.txt): tool schemas, API examples and every timezone slug - [Sitemap](https://crn0.com/sitemap.xml) --- # Full reference ## MCP server Endpoint: https://crn0.com/mcp. Transport: Streamable HTTP (stateless, JSON responses). Auth: none. Client config (Claude Desktop, Cursor, Windsurf, VS Code and others): ```json { "mcpServers": { "crn0": { "type": "http", "url": "https://crn0.com/mcp" } } } ``` Claude Code: `claude mcp add --transport http crn0 https://crn0.com/mcp` Raw JSON-RPC example: ```bash curl -s https://crn0.com/mcp -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"convert_cron","arguments":{"cron":"0 9 * * 1-5","from":"Australia/Sydney","to":"UTC"}}}' ``` ## Tools ### convert_cron Convert a cron expression from one timezone to another so it fires at the same real-world instants. Returns the converted cron line(s), plain-English descriptions, offsets, warnings (day shifts, multi-line results, DST) and the next run times in both zones. Input schema: ```json { "type": "object", "properties": { "cron": { "type": "string", "description": "Standard 5-field cron, e.g. \"0 9 * * 1-5\", or a macro like \"@daily\"." }, "from": { "type": "string", "description": "Timezone the schedule is written in (IANA id, abbreviation, offset or city). Default \"UTC\"." }, "to": { "type": "string", "description": "Timezone of the machine/scheduler that will run it, e.g. \"UTC\" for most cloud schedulers." }, "at": { "type": "string", "description": "ISO 8601 date used to evaluate DST offsets. Defaults to now." }, "count": { "type": "integer", "minimum": 1, "maximum": 50, "description": "How many upcoming runs to list (default 3)." } }, "required": [ "cron", "to" ] } ``` ### describe_cron Validate a cron expression and explain it in plain English, with the expanded values of each field. Input schema: ```json { "type": "object", "properties": { "cron": { "type": "string", "description": "Standard 5-field cron, e.g. \"0 9 * * 1-5\", or a macro like \"@daily\"." } }, "required": [ "cron" ] } ``` ### next_cron_runs List the next run times of a cron expression evaluated in a given timezone (DST-aware), in UTC and local wall time. Input schema: ```json { "type": "object", "properties": { "cron": { "type": "string", "description": "Standard 5-field cron, e.g. \"0 9 * * 1-5\", or a macro like \"@daily\"." }, "timezone": { "type": "string", "description": "Timezone the cron is evaluated in. Default \"UTC\"." }, "count": { "type": "integer", "minimum": 1, "maximum": 50, "description": "Number of runs (default 5)." }, "from": { "type": "string", "description": "ISO 8601 start instant. Defaults to now." } }, "required": [ "cron" ] } ``` ### search_timezones Look up IANA timezone ids and current UTC offsets by city, country, abbreviation or IANA name. Input schema: ```json { "type": "object", "properties": { "query": { "type": "string", "description": "e.g. \"Melbourne\", \"IST\", \"Europe/\"" }, "limit": { "type": "integer", "minimum": 1, "maximum": 50, "description": "Max results (default 10)." } }, "required": [ "query" ] } ``` ## JSON API Every endpoint accepts GET query params or a POST JSON body. CORS is open. Errors return HTTP 400 with `{"error": "..."}`. ```bash curl 'https://crn0.com/api/convert?cron=0+9+*+*+1-5&from=Australia/Sydney&to=UTC' ``` Response (abridged): ```json { "input": { "cron": "0 9 * * 1-5", "description": "At 09:00 on Monday through Friday.", "timezone": { "iana": "Australia/Sydney", "label": "AEST", "offset": "UTC+11" } }, "output": { "crons": ["0 22 * * 0-4"], "descriptions": ["At 22:00 on Sunday through Thursday."], "timezone": { "iana": "UTC", "label": "UTC", "offset": "UTC+0" } }, "deltaMinutes": -660, "dayShifts": [-1], "warnings": [], "dstNote": "The offset between these timezones changes during the year because of daylight saving time...", "nextRuns": [{ "utc": "...", "source": "...", "target": "..." }], "url": "https://crn0.com/?cron=0+9+*+*+1-5&from=Australia%2FSydney&to=UTC" } ``` ## Common schedules - `0 9 * * *`: Every day at 9am - `0 9 * * 1-5`: Weekdays at 9am - `*/15 * * * *`: Every 15 minutes - `0 0 * * *`: Every day at midnight - `30 2 * * 0`: Sundays at 2:30am - `0 0 1 * *`: First of every month - `0 */6 * * *`: Every 6 hours - `0 17 * * 5`: Fridays at 5pm ## Timezones with landing pages Use the slug in pair URLs: https://crn0.com/-to-. Any IANA timezone also works with the API, MCP tools and the converter. | slug | abbr | name | IANA | offset | |---|---|---|---|---| | utc | UTC | Coordinated Universal Time | UTC | UTC+0 | | gmt | GMT | Greenwich Mean Time (UK) | Europe/London | UTC+0 / UTC+1 (DST) | | est | EST | Eastern Time | America/New_York | UTC-5 / UTC-4 (DST) | | cst | CST | Central Time | America/Chicago | UTC-6 / UTC-5 (DST) | | mst | MST | Mountain Time | America/Denver | UTC-7 / UTC-6 (DST) | | pst | PST | Pacific Time | America/Los_Angeles | UTC-8 / UTC-7 (DST) | | akst | AKST | Alaska Time | America/Anchorage | UTC-9 / UTC-8 (DST) | | hst | HST | Hawaii Time | Pacific/Honolulu | UTC-10 | | ast | AST | Atlantic Time | America/Halifax | UTC-4 / UTC-3 (DST) | | brt | BRT | Brasília Time | America/Sao_Paulo | UTC-3 | | art | ART | Argentina Time | America/Argentina/Buenos_Aires | UTC-3 | | wet | WET | Western European Time | Europe/Lisbon | UTC+0 / UTC+1 (DST) | | cet | CET | Central European Time | Europe/Paris | UTC+1 / UTC+2 (DST) | | eet | EET | Eastern European Time | Europe/Athens | UTC+2 / UTC+3 (DST) | | msk | MSK | Moscow Time | Europe/Moscow | UTC+3 | | sast | SAST | South Africa Standard Time | Africa/Johannesburg | UTC+2 | | wat | WAT | West Africa Time | Africa/Lagos | UTC+1 | | eat | EAT | East Africa Time | Africa/Nairobi | UTC+3 | | gst | GST | Gulf Standard Time | Asia/Dubai | UTC+4 | | pkt | PKT | Pakistan Standard Time | Asia/Karachi | UTC+5 | | ist | IST | India Standard Time | Asia/Kolkata | UTC+5:30 | | npt | NPT | Nepal Time | Asia/Kathmandu | UTC+5:45 | | ict | ICT | Indochina Time | Asia/Bangkok | UTC+7 | | sgt | SGT | Singapore Time | Asia/Singapore | UTC+8 | | hkt | HKT | Hong Kong Time | Asia/Hong_Kong | UTC+8 | | china | CST | China Standard Time | Asia/Shanghai | UTC+8 | | pht | PHT | Philippine Time | Asia/Manila | UTC+8 | | awst | AWST | Australian Western Time | Australia/Perth | UTC+8 | | jst | JST | Japan Standard Time | Asia/Tokyo | UTC+9 | | kst | KST | Korea Standard Time | Asia/Seoul | UTC+9 | | acst | ACST | Australian Central Time | Australia/Adelaide | UTC+9:30 / UTC+10:30 (DST) | | aest | AEST | Australian Eastern Time | Australia/Sydney | UTC+10 / UTC+11 (DST) | | brisbane | AEST | Brisbane Time (Queensland) | Australia/Brisbane | UTC+10 | | nzst | NZST | New Zealand Time | Pacific/Auckland | UTC+12 / UTC+13 (DST) |