Scheduling a MOP
mop.schedule runs a MOP for you once at a set time, or daily or weekly,
under one approval you give now. Each occurrence starts a run within a minute
of its time and drives it to the end in the background, change window included.
Schedules are MCP-only: there is no dashboard page for them, so you ask Claude.
How do I schedule a MOP?
Section titled “How do I schedule a MOP?”Ask Claude, for example “run the guest-password MOP every Monday at 06:00 London time”. Claude previews the MOP, shows you the next times in your own time zone, and asks for your OK.
| Recurrence | Fields | Limit |
|---|---|---|
once | at: an ISO date-time with its offset, such as 2026-10-03T02:00:00+01:00 | At most 30 days ahead |
daily | time (HH:MM, 24-hour), tz (an IANA zone such as Europe/London) | Until until |
weekly | time, tz, days (0 = Sunday … 6 = Saturday) | Until until |
until applies only to daily and weekly schedules: by default 30 days from
now, at most 90 days. Giving it for a once schedule is refused with
bad_schedule: “until applies to daily and weekly schedules; a once ends with
its run.” An optional label names the schedule, and params and onFail work
as in mop.start.
What am I approving?
Section titled “What am I approving?”A standing approval: this version of the MOP, with these parameters, at these
times. A MOP with writes goes through the write guard exactly as mop.start
does, so you confirm a preview of every write plus the schedule (the recurrence,
the next three times and when the approval ends). A MOP with a dangerous step
also needs your authenticator code or a dashboard approval.
| The MOP | Who can schedule it |
|---|---|
| Has writes | Engineer and above |
| Only reads | Operator and above. A viewer gets write_blocked: “Your role in this organisation (viewer) can’t schedule runs; an operator or above can schedule a MOP that only reads.” |
Each occurrence runs as you: its writes are sent under your approval, for 12 hours from the start of that run.
Why was an occurrence skipped?
Section titled “Why was an occurrence skipped?”Every occurrence re-checks the approval before it starts a run. If a check
fails, nothing is sent and the occurrence is recorded as skipped with a
reason:
| Reason | Meaning |
|---|---|
approver_left | The person who approved the schedule is no longer in the organisation |
approver_role | That person’s role can no longer send writes |
mop_not_found | The MOP was deleted |
mop_changed | The MOP was saved again since, or its writing steps changed. Schedule it again to approve the new version |
not_ready | The MOP no longer lints, or a parameter is missing |
tier_rose | A step became more dangerous under the write policy than when you approved it |
previous_run_active | The run from an earlier occurrence is still going |
An occurrence found more than 10 minutes late, after an outage, is recorded
as missed. It is never run late.
How do I see my schedules?
Section titled “How do I see my schedules?”Ask Claude: mop.schedules() lists the organisation’s schedules, newest first,
with the next run time, how many runs there have been and the last result
(started, skipped, missed or error, with the run’s status as it
progresses). includeFinished: true adds finished and cancelled schedules,
which are kept 90 days.
How do I stop a schedule?
Section titled “How do I stop a schedule?”mop.unschedule stops future occurrences. It does not stop a run already
going: use mop.abort for that.
| You want to | Ask Claude to | Who |
|---|---|---|
| Stop future occurrences | mop.unschedule({ id }) | The person who made the schedule, or engineer and above |
| Stop a run a schedule already started | mop.abort({ runId }) | Engineer and above |
mop.unschedule returns runStillGoing with the run’s id when a run is still
going. Other refusals: “No schedule id in this org.”, “Schedule id is
status.” for one that already ended, and “Only the person who made the
schedule, or an engineer and up, can cancel it.”
What are the limits?
Section titled “What are the limits?”| Limit | Value | At the limit |
|---|---|---|
| Active schedules per organisation | 20 | ”The org has 20 active schedules; cancel one (mop.unschedule) first.” |
A once schedule | 30 days ahead | bad_schedule |
| A recurring schedule’s approval | 30 days by default, 90 days at most | bad_schedule above 90 days. Nothing fires after until |
| A schedule with no time before it ends | — | “The schedule has no occurrence before it ends.” |