Parse, explain, and validate cron expressions via cron-forge-mcp (npx)
How to convert cron expressions to plain English, find next scheduled run times, and validate cron syntax — using cron-forge-mcp via npx, no API key needed.
cron-forge-mcp — parse, explain, and validate cron expressions via MCP
Package: [email protected] (npm) Transport: stdio via npx -y cron-forge-mcp Auth: none — zero config Tools: 3 — explain_cron, next_cron_runs, validate_cron
MCP config
{
"mcpServers": {
"cron": {
"command": "npx",
"args": ["-y", "cron-forge-mcp"]
}
}
}Tool schemas (from tools/list)
| Tool | Required params | Optional |
|---|---|---|
explain_cron | expression (string, 5-field cron) | — |
next_cron_runs | expression (string) | count (1–20, default 5) |
validate_cron | expression (string) | — |
Verified traces
1. explain_cron — human-readable explanation of business-hours schedule
→ tools/call explain_cron {expression: "*/15 9-17 * * 1-5"}
← Cron: */15 9-17 * * 1-5
Schedule:
- Minute: every 15 minutes
- Hour: hours 9-17
- Day of month: every day
- Month: every month
- Day of week: weekdays 1-52. next_cron_runs — next 5 Sunday midnight runs
→ tools/call next_cron_runs {expression: "0 0 * * 0", count: 5}
← Next 5 runs:
2026-06-13T21:00:00.000Z
2026-06-20T21:00:00.000Z
2026-06-27T21:00:00.000Z
2026-07-04T21:00:00.000Z
2026-07-11T21:00:00.000ZNote: times are offset from midnight UTC — the server appears to apply a local timezone offset but labels results with Z (UTC). Consumers should be aware the "next run" times may not be pure UTC.
3. validate_cron — validation of invalid expression
→ tools/call validate_cron {expression: "0 25 * * *"}
← Cron: 0 25 * * *
✓ Minute (0-59): 0
✓ Hour (0-23): 25
✓ Day of month (1-31): *
✓ Month (1-12): *
✓ Day of week (0-6): *BUG: validate_cron does not range-check field values
validate_cron reports "✓ Hour (0-23): 25" — hour 25 is clearly outside the valid 0–23 range, yet the server marks it as valid. The validator only checks structural syntax (correct number of fields, parseable tokens) but does NOT verify that values fall within each field's documented range. Do not rely on validate_cron for semantic validation. It's a parser, not a validator — the label is misleading.
Summary
All 3 tools responded. explain_cron and next_cron_runs produce useful output. validate_cron has a significant false-positive bug where out-of-range values pass validation.
{ "server": "[email protected]", "transport": "stdio", "launcher": "npx -y cron-forge-mcp", "tools_count": 3, "tools": ["explain_cron", "next_cron_runs", "validate_cron"], "calls": [ { "tool": "explain_cron", "input": { "expression": "*/15 9-17 * * 1-5" }, "output": "Cron: */15 9-17 * * 1-5 Schedule: - Minute: every 15 minutes - Hour: hours 9-17 - Day of month: every day - Month: every month - Day of week: weekdays 1-5", "success": true }, { "tool": "next_cron_runs", "input": { "expression": "0 0 * * 0", "count": 5 }, "output": "Next 5 runs: 2026-06-13T21:00:00.000Z 2026-06-20T21:00:00.000Z 2026-06-27T21:00:00.000Z 2026-07-04T21:00:00.000Z 2026-07-11T21:00:00.000Z", "success": true, "note": "timezone offset applied but labeled as UTC (Z) — dates are 7 days apart (correct for weekly) but times show 21:00Z instead of 00:00Z" }, { "tool": "validate_cron", "input": { "expression": "0 25 * * *" }, "output": "Cron: 0 25 * * * ✓ Minute (0-59): 0 ✓ Hour (0-23): 25 ✓ Day of month (1-31): * ✓ Month (1-12): * ✓ Day of week (0-6): *", "success": true, "bug": "validate_cron reports hour 25 as valid (✓) despite being outside 0-23 range — no range checking" } ], "success_rate": "3/3 (100% returned, 1 has validation bug)", "bugs_found": ["validate_cron does not range-check field values — hour 25 passes as valid"] }