Skip to content
SZ-MCP
Get Support

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.

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.

RecurrenceFieldsLimit
onceat: an ISO date-time with its offset, such as 2026-10-03T02:00:00+01:00At most 30 days ahead
dailytime (HH:MM, 24-hour), tz (an IANA zone such as Europe/London)Until until
weeklytime, 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.

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 MOPWho can schedule it
Has writesEngineer and above
Only readsOperator 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.

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:

ReasonMeaning
approver_leftThe person who approved the schedule is no longer in the organisation
approver_roleThat person’s role can no longer send writes
mop_not_foundThe MOP was deleted
mop_changedThe MOP was saved again since, or its writing steps changed. Schedule it again to approve the new version
not_readyThe MOP no longer lints, or a parameter is missing
tier_roseA step became more dangerous under the write policy than when you approved it
previous_run_activeThe 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.

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.

mop.unschedule stops future occurrences. It does not stop a run already going: use mop.abort for that.

You want toAsk Claude toWho
Stop future occurrencesmop.unschedule({ id })The person who made the schedule, or engineer and above
Stop a run a schedule already startedmop.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.”

LimitValueAt the limit
Active schedules per organisation20”The org has 20 active schedules; cancel one (mop.unschedule) first.”
A once schedule30 days aheadbad_schedule
A recurring schedule’s approval30 days by default, 90 days at mostbad_schedule above 90 days. Nothing fires after until
A schedule with no time before it ends—“The schedule has no occurrence before it ends.”