Skip to main content
Glama
arhancanli

cron-check

Cron Check

CI npm downloads OpenSSF Scorecard License: MIT

Cron is where agents make confident mistakes: 0 0 13 * 5 runs every Friday and every 13th, not only on Friday the 13th; */7 in the minute field leaves a 4-minute gap at the top of each hour; Quartz and AWS count Sunday as 1 where Unix cron counts it as 0; GitHub Actions never runs a schedule more often than every 5 minutes. Cron Check answers with the rules of the scheduler in question:

  • Explain and check up to 20 expressions: plain English, the dialect (detected or given), errors with the field that is wrong, the gotchas above, schedules that never fire (February 30), and the next runs.

  • Next runs in any time zone, local and UTC, with runs that fall into a daylight-saving gap or repeat flagged, because schedulers treat them differently.

  • Convert between Unix cron, GitHub Actions, Kubernetes, AWS EventBridge, Quartz and Spring: seconds and year fields, the ? rule, weekdays written as names so the numbering cannot bite. What a target cannot express (Unix's day-of-month OR day-of-week in AWS) is refused with the fix.

Runs offline. No key needed.

Built and maintained by Arhan Canli.

Install

Install in Cursor Install in VS Code Install in Goose

Needs Node.js 20 or newer. No account or key.

Claude Code

claude mcp add cron-check -- npx -y cron-check-mcp

Claude Desktop: download cron-check-mcp-<version>.mcpb from the latest release and open it. The bundle is signed; verify it with gh attestation verify <file> --repo arhancanli/cron-check-mcp.

Any other client (Windsurf, Zed, Cline, Continue and others), in its MCP config file:

{
  "mcpServers": {
    "cron-check": {
      "command": "npx",
      "args": [
        "-y",
        "cron-check-mcp"
      ]
    }
  }
}

Docker

docker build -t cron-check-mcp https://github.com/arhancanli/cron-check-mcp.git && docker run -i --rm cron-check-mcp

Hosted (Streamable HTTP): node src/server.mjs --http serves stateless MCP at POST /mcp (port from PORT, default 3000).

Related MCP server: cron-mcp

Example

An agent calls explain_cron with:

{
  "expressions": [
    "0 9 * * 1-5",
    "*/7 * * * *",
    "0 0 1 * 1",
    "0 0 30 2 *",
    "cron(0 12 ? * MON-FRI *)",
    "0 0/5 14 * * ?",
    "0 10 ? * 6#3",
    "@daily",
    "61 * * * *",
    "0 0 L * *"
  ]
}

and gets back (recorded from the live server on 2026-09-26):

{
  "results": [
    {
      "expression": "0 9 * * 1-5",
      "valid": true,
      "dialect": "unix",
      "description": "At 09:00, Monday through Friday",
      "next_utc": [
        "2026-09-28T09:00:00Z",
        "2026-09-29T09:00:00Z",
        "2026-09-30T09:00:00Z"
      ]
    },
    {
      "expression": "*/7 * * * *",
      "valid": true,
      "dialect": "unix",
      "description": "Every 7 minutes",
      "next_utc": [
        "2026-09-26T17:14:00Z",
        "2026-09-26T17:21:00Z",
        "2026-09-26T17:28:00Z"
      ],
      "warnings": [
        "*/7 in the minute field restarts at 0 each hour, so the last gap is shorter than 7."
      ]
    },
    {
      "expression": "0 0 1 * 1",
      "valid": true,
      "dialect": "unix",
      "description": "At 00:00, on day 1 of the month, and on Monday",
      "next_utc": [
        "2026-09-28T00:00:00Z",
        "2026-10-01T00:00:00Z",
        "2026-10-05T00:00:00Z"
      ],
      "warnings": [
        "Both day fields are restricted, so it runs on days matching either one (day-of-month OR day-of-week), not only days matching both."
      ]
    },
    {
      "expression": "0 0 30 2 *",
      "valid": false,
      "dialect": "unix",
      "description": "At 00:00, on day 30 of the month, only in February",
      "error": "It never fires: no date in the next six years matches (for example February 30)."
    },
    {
      "expression": "cron(0 12 ? * MON-FRI *)",
      "valid": true,
      "dialect": "aws",
      "description": "At 12:00, Monday through Friday",
      "next_utc": [
        "2026-09-28T12:00:00Z",
        "2026-09-29T12:00:00Z",
        "2026-09-30T12:00:00Z"
      ],
      "warnings": [
        "EventBridge cron runs in UTC unless the schedule sets a time zone (EventBridge Scheduler)."
... (44 more lines)

Tools

Tool

What it does

convert_cron

Rewrites a cron expression for another scheduler (unix, github, kubernetes, aws, quartz, spring): seconds and year fields, ? rules, weekday numbering (written as names). Says why when the target cannot express it.

explain_cron

Explains up to 20 cron expressions in plain English and checks them: valid or why not, the dialect, gotchas (day-of-month OR day-of-week, uneven steps, GitHub's 5-minute floor), schedules that never fire, and the next 3 runs in UTC.

next_runs

The next runs of a cron expression in an IANA time zone (default UTC), as local time with weekday and UTC, after a given moment or now. Runs that land in a daylight-saving gap or repeat are flagged, as schedulers differ there.

How it behaves

  • Offline and read-only: no network call at all (factory.allowHosts is empty). Descriptions come from cronstrue (MIT); parsing, matching and next runs from this server's own engine, time zones from Node's ICU database.

  • Dialects: unix (Vixie cron: two restricted day fields match either one), github (UTC, 5-minute floor), kubernetes (macros, ? read as *), aws (EventBridge: six fields with a year, Sunday is 1, ? required in one day field), quartz (seconds first, optional year, Sunday is 1), spring (seconds first, Sunday is 0 or 7). L, W and # are understood where the dialect has them.

  • Results are compact JSON with a matching output schema.

Benchmark

Measured 2026-09-26 with gpt-5.4-mini, 10 fixed tasks graded by fixed checks (bench/tasks.json, raw results in bench/results/).

Server

Correct

Input tokens

Output tokens

Tool calls

Median time

This server

10/10

13063

485

10

2.0 s

@pipeworx/mcp-crontab, a published cron MCP server

6/10

9967

444

11

1.9 s

Performance

Measured 2026-09-26 from Dubai, home connection against the live upstream, Node 24.19.0 (bench/perf.json, scripts/perf.mjs in the factory).

Call

First call

Repeat

Result size

explain_cron: 10 expressions across dialects

13 ms

4 ms

2,248 chars

next_runs: 02:30 daily in New York across the spring-forward change

8 ms

0.4 ms

452 chars

convert_cron: weekdays at 09:00 to AWS EventBridge

4 ms

0.4 ms

187 chars

First call: a fresh server process, including the TLS connection and the upstream's own time. Repeat: the same call again, answered from the in-process cache, so it shows this server's own overhead.

Tool definitions the model reads on every turn (name, description, input schema): 1,872 characters, against 834 for @pipeworx/mcp-crontab, a published cron MCP server. The full tool list, with the output schemas and annotations clients use to validate results, is 3,017 characters (832 for the alternative).

More MCP servers by Arhan Canli

  • Actions Check: Checks GitHub Actions workflows: outdated actions, old Node runtimes, retired runners, injection.

  • Domain Health: Email and domain checks: SPF lookup limits, DKIM keys, DMARC, DNS records, registration expiry.

  • End of Life: Is this version still supported? EOL dates, latest patch and upgrade target for 470+ products.

  • Internet Standards: RFC sections, status, obsoleted-by chains, errata and IANA registries for coding agents.

  • License Check: Open source license answers: SPDX ids, copyleft, and whether a dependency's license fits yours.

  • Package Truth: Checks packages exist before install: version, deprecation, vulnerabilities, licence. 7 ecosystems.

  • Release Notes: What changed between two versions of a package: breaking changes, deprecations, security fixes.

  • Citation Check: Verifies citations: finds fabricated or mismatched references and retractions, returns clean BibTeX.

  • The whole collection, 7 more

License

MIT, Copyright (c) 2026 Arhan Canli.

Available Tools

3 tools
convert_cronConvert cron between schedulersA
Read-onlyIdempotent

Rewrites a cron expression for another scheduler (unix, github, kubernetes, aws, quartz, spring): seconds and year fields, ? rules, weekday numbering (written as names). Says why when the target cannot express it.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
fromNodetected when omitted
expressionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
toYes
expressionYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description need not repeat those. It adds meaningful behavioral context beyond annotations: it specifies handling of seconds and year fields, ? rules, weekday numbering as names, and explicitly states it explains why when the target cannot express a conversion. This enriches the agent's understanding of edge cases and error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with zero filler. The main action ('rewrites') and supported schedulers are front-loaded, followed by specific conversion rules and error behavior. Every word earns its place; no redundant information or repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (3 params, output schema exists), the description covers the core conversion behavior and error handling ('says why when the target cannot express it'). The output schema covers return values, so that need not be described. It omits details about the input expression's accepted format, but that is largely covered by the schema's maxLength and the implied cron syntax. Overall, it provides sufficient context for correct invocation, though it could mention auto-detection of 'from' explicitly rather than relying on the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (only 'from' has a description: 'detected when omitted'). The description does not explain the 'expression' parameter or the 'to' parameter beyond listing allowed schedulers in the enum. It fails to compensate for the low coverage, leaving agents without guidance on how to format the expression or what the target scheduler value means semantically.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Rewrites a cron expression for another scheduler' and explicitly lists the six supported schedulers. It also mentions specific conversion details (seconds, year fields, ? rules, weekday numbering) that distinguish it from the sibling tools explain_cron and next_runs. The purpose is unambiguous and differentiates well from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for cron conversion but does not explicitly mention when to use this tool versus alternatives like explain_cron or next_runs. There are no exclusion criteria or comparative guidance, leaving the selection to inference. The distinct verb 'rewrites' helps, but explicit routing is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

explain_cronExplain and check cron expressionsA
Read-onlyIdempotent

Explains up to 20 cron expressions in plain English and checks them: valid or why not, the dialect, gotchas (day-of-month OR day-of-week, uneven steps, GitHub's 5-minute floor), schedules that never fire, and the next 3 runs in UTC.

ParametersJSON Schema
NameRequiredDescriptionDefault
dialectNodetected when omitted
expressionsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare the tool read-only, idempotent, and non-destructive. The description goes beyond that by disclosing concrete behavioral details: it handles up to 20 expressions, reports validity and reasons, identifies dialect, surfaces known gotchas, detects never-firing schedules, and returns the next 3 runs in UTC. This gives the agent a rich picture of what the tool will do.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the core action ('Explains up to 20 cron expressions in plain English') and then uses a compact colon-separated list to enumerate behaviors. Every phrase adds information, and the structure makes the tool's scope immediately scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and the annotations cover safety/idempotence, the description covers the essential invocation context: input limits, validation behavior, dialect handling, known edge cases, and return content. No critical behavioral aspect needed for selecting or calling the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%: the dialect parameter is described ('detected when omitted') while expressions is not. The description adds some meaning by mentioning the 20-expression limit and that the tool checks dialect, but it does not fully compensate for the undocumented expressions parameter or explain how the dialect input relates to the output. The schema and description together are adequate but not comprehensive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs ('explains', 'checks') tied to a clear resource ('cron expressions') and enumerates concrete outputs: validity, dialect, gotchas, never-firing schedules, and next runs. This content also distinguishes it from siblings like convert_cron and next_runs by showing it performs explanation and validation, not just conversion or run calculation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use the tool—whenever a cron expression needs explanation or validation—but it does not explicitly state when not to use it or name alternatives such as convert_cron or next_runs. There is no direct routing guidance, so the agent must infer the boundary from the feature list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

next_runsWhen a cron expression firesA
Read-onlyIdempotent

The next runs of a cron expression in an IANA time zone (default UTC), as local time with weekday and UTC, after a given moment or now. Runs that land in a daylight-saving gap or repeat are flagged, as schedulers differ there.

ParametersJSON Schema
NameRequiredDescriptionDefault
fromNoISO date-time
countNodefault 5
dialectNodetected when omitted
timezoneNo
expressionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
runsYes
timezoneYes
expressionYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it specifies the output includes local time, weekday, and UTC, and that runs in DST gaps or repeats are flagged. This helps the agent understand edge-case handling without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no redundant phrasing. It front-loads the core purpose (next runs), then adds essential details (time zone, output format, DST handling). Every sentence earns its place, and the structure is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema (not shown) and annotations covering safety and idempotency, so the description does not need to enumerate return fields. It provides key contextual details: time zone default, output formatting, and DST edge cases. It does not mention error conditions or the default count, but count is already in the schema. Overall, it is complete enough for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema describes three of five parameters (from, count, dialect), leaving timezone and expression without descriptions (60% coverage). The description clarifies the timezone parameter by stating the default is UTC and explains 'from' as 'after a given moment or now'. It does not add details for count or dialect, but the schema already covers those. The description partially compensates for the coverage gap, so it meets the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'list' (implied by 'The next runs of a cron expression') and the resource (cron expression), with details about time zone, output format (local time, weekday, UTC), and the starting point (after a given moment or now). It distinguishes this from siblings (convert_cron, explain_cron) by focusing on computing future executions rather than conversion or explanation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool (when you need the next execution times of a cron expression), but it does not explicitly contrast it with sibling tools or state when not to use it. There is no mention of alternatives or conditions that would route an agent to convert_cron or explain_cron. The guidance is implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.1.0
    • First observedconvert_cron
    • First observedexplain_cron
    • First observednext_runs

TDQS

A4.3/5.0

Scored across 3 tools

Disambiguation5/5

Each tool serves a distinct purpose: conversion between schedulers, explanation/validation, and computing future runs. There is no overlap in functionality, and an agent can easily select the appropriate tool based on the task.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern (convert_cron, explain_cron, next_runs). The naming is clear and predictable, with 'cron' as the subject and a specific action verb prefix.

Tool Count5/5

With exactly 3 tools, the server is tightly scoped to core cron operations: conversion, explanation, and scheduling. Each tool is essential and there is no bloat or unnecessary redundancy.

Completeness5/5

The tool set covers the full lifecycle of working with cron expressions: understanding (explain), adapting (convert), and planning (next_runs). No obvious missing operations exist for the server's stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables exploration, explanation, and management of crontab entries, including translating cron expressions into plain English and calculating upcoming execution times.
    8
    4
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Parse, validate, and explain cron expressions with pay-per-call via x402 (USDC on Base L2), returning next run times in any timezone.
    1
    MIT