# CronSpell > Validate cron expressions, explain them in plain English and list their next or previous run times in any IANA time zone, with daylight saving time handled. Free web tool, JSON API and a remote MCP server for AI agents. Pure computation: no sign-up, no API key, nothing stored. ## For AI agents - [MCP server](https://cronspell.mike-tusa.workers.dev/mcp): remote MCP over Streamable HTTP (POST only, stateless, JSON responses). Protocol versions: 2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05. Tools: `validate_cron`, `explain_cron`, `next_cron_runs`, `cron_runs_between`. All read-only. Client config (most MCP clients accept this; some use a different format, for example VS Code uses a `servers` key): `{"mcpServers":{"cronspell":{"type":"http","url":"https://cronspell.mike-tusa.workers.dev/mcp"}}}` - [OpenAPI 3.1 spec](https://cronspell.mike-tusa.workers.dev/openapi.json): machine-readable description of the JSON API - [MCP server card](https://cronspell.mike-tusa.workers.dev/.well-known/mcp/server-card.json): static description of the MCP server and its tools - Works with AI agents and assistants that can call an MCP server or a JSON API, for example Muse, Claude, ChatGPT or Cursor (descriptive only). CronSpell is not affiliated with, endorsed by or sponsored by Meta, Anthropic, OpenAI, Anysphere or any cron software project. ## JSON API (all GET, JSON responses) - `GET https://cronspell.mike-tusa.workers.dev/api/validate?expr=0+9+*+*+1-5`: { valid, expression, normalized, format (standard|seconds|shorthand), dayMatching (or|and), fields { minute: { raw, values }, ... }, description, version }; invalid → 200 { valid: false, error { code, message, field } }. - `GET https://cronspell.mike-tusa.workers.dev/api/explain?expr=*/15+9-17+*+*+MON-FRI`: { expression, normalized, description, notes[], ... }. - `GET https://cronspell.mike-tusa.workers.dev/api/next?expr=0+9+*+*+1-5&tz=America/Denver&count=5`: next runs after `from` (default now). count 1-20. Response { expression, description, timezone, from, direction, count, runs [ { time (local ISO 8601 with offset), utc, unix, weekday, offset, dst? } ], complete, notes[] }. - `GET https://cronspell.mike-tusa.workers.dev/api/previous?expr=...&tz=...&count=...&from=...`: same, most recent past runs first. - `GET https://cronspell.mike-tusa.workers.dev/api/between?expr=...&tz=...&start=...&end=...&limit=20`: runs from start to end (both inclusive), oldest first, limit 1-100, truncated true when there are more. - `from`, `start`, `end`: ISO 8601 with Z or an offset (2026-11-01T09:00:00Z), a local time read in tz (2026-11-01T09:00), or unix seconds; years 1980-2199. Searches look up to 50 years ahead or back. - `expr` max 200 characters (URL-encode spaces as + or %20); `tz` an IANA name (max 64 characters), default UTC. `expression` and `timezone` are accepted as aliases. - `GET https://cronspell.mike-tusa.workers.dev/api/health`: { ok, version }. - Errors: { "error": { "code", "message", "field"? } } with 400 invalid_input / invalid_expression / unsupported_syntax / never_runs / invalid_timezone, 404 not_found, 405 method_not_allowed, 429 rate_limited (Retry-After). - Syntax: 5 fields (minute hour day-of-month month day-of-week) or 6 with a leading seconds field. Each field: *, a value, a range a-b, a list a,b, steps */n, a-b/n, a/n; ? in the day fields means *. Month names JAN-DEC and weekday names SUN-SAT (case-insensitive); weekday 0 and 7 are Sunday. Shorthands: @yearly @annually @monthly @weekly @daily @midnight @hourly. If day-of-month and day-of-week are both restricted, a day matches when either matches (classic cron OR rule). Not supported: Quartz L, W and #, 7-field expressions with a year, @reboot, wrap-around ranges such as FRI-MON. - DST: Schedules are read as wall-clock times in the time zone you pass (default UTC). A local time skipped when clocks jump forward does not run (a note says so), and a local time that happens twice when clocks go back is listed twice, each flagged dst "repeated". Cron daemons differ here (cronie, for example, runs fixed-time jobs from a skipped hour right after the jump and only once in a repeated hour), so check the notes. ## Limits and pricing - No API key and no sign-up. About 60 checks per minute per IP across all /api routes and MCP tools/call (HTTP 429 + Retry-After). Free; there is no paid tier on this site. - The MCP endpoint uses the same limiter: each `tools/call` is one check. Non-check MCP messages don't count as checks, but are capped at about 120/min per IP (HTTP 429 + Retry-After). MCP request bodies are limited to 65536 bytes. - Cron expressions you submit are processed in memory and discarded when the response is sent. They are never written to storage, logs or analytics, and CronSpell makes no network requests. ## Optional - [Privacy](https://cronspell.mike-tusa.workers.dev/privacy) - [Terms](https://cronspell.mike-tusa.workers.dev/terms) - Contact: digitalpromohub.support@gmail.com