Skip to content
R1-MCP
Get Support

Limits and quotas

Most surprising R1-MCP behaviour is a limit doing its job. This page collects them, with what each one does when you reach it.

LimitValueOn reaching it
code_mode run budget30 seconds wall clock, shared across every API call the program makesThe run is cut off. At 20 seconds the budget snapshot on each response gains a warning — the program is expected to return partial results and continue in a fresh run
One call_r1 request15 secondsSurfaces as a structural error envelope; the measured time is still billed to the run budget
RUCKUS token mint15 secondstimeout — the R1 token endpoint didn’t respond
One Data Studio request20 secondsstatusText: "timeout" on the ds_* response
await_request poll loop60 seconds by default, settable 1–120Reports the last activity state it saw rather than failing outright
Write Guard confirmation10 minutes from the previewConfirming a stale preview returns a fresh preview instead of executing

await_request polls an asynchronous R1 operation to completion. R1 returns 404 for an activity it has accepted but not yet made resolvable, so a 404 is treated as not yet, not as failure — the loop keeps polling until its own timeout bounds the wait. Once any poll has returned a real activity body, a subsequent timeout is a genuine one.

call_r1 never throws on an HTTP error; it returns a response you can inspect. What it retries automatically:

StatusBehaviour
401Exactly one refresh-and-retry
429Auto-retried for GET, PUT, DELETE only — at most 2 retries, honouring Retry-After, with the wait capped at 5 seconds. POST and PATCH are not replayed unless you pass retryOn429: true
406Retried once with the versioned media type R1 named. If the 406 names none, it surfaces as-is
415A body-less request is retried once with the Content-Type R1 named

call_r1_gql requests are POSTs, so they are never auto-retried on a 429 unless you opt in — and opting in is only safe for reads, since Service Validation has real mutations.

Every response carries retried, so the retry count is always visible.

Everything R1-MCP stores for you is bounded, per user.

ArtifactCapRetentionAt the cap
Snapshots (venue_extract)2030 daysRefuses — snapshot_limit_reached
Backups (backup_create)50IndefiniteRefuses — backup_limit_reached, and nothing frees itself
MOPs / test plans you author50Untouched drafts age out after 30 daysRefuses — mop_limit_reached
Copy MOPs the engine compiles10030 daysEvicts the oldest
Test beds50 (100 devices each)365 daysRefuses
LimitValueOn exceeding it
Snapshot config5 MBsnapshot_too_large — restrict domains and re-extract
Backup config5 MBbackup_too_large — back up fewer domains separately
MOP steps200, or 400 for an API-only MOPThe plan is rejected as plan_invalid; split it by domains
Runs kept per MOP20Oldest dropped
Run retention7 days for a MOP, 90 days for a test planSwept

A compiled copy plan gets the raised 400-step cap because it is API-only. An over-cap plan is the signal to plan each subset of domains into its own MOP.

LimitValue
device_cli commands per batch20, run sequentially in the held session
search_endpoints results10 by default, 20 maximum
Autopilot wall clockmaxWallMin — 30 minutes by default, 120 maximum
Autopilot runsOne at a time, per user

A long configuration job is applied as several batches of twenty into the same held session, not as one giant push. Autopilot expiry pauses a run; it never fails it.

The webhooks feature stores what it receives, per user, with retention that varies by event class. This is why a month-old client event is gone while a month-old incident is not.

Event classKeptRow cap
Client stream (event)7 days20,000
AP infrastructure (ap_event)30 days5,000
RADIUS / auth (radius)30 days4,000
Activity — “what changed before the outage”90 days2,000
Admin audit90 days2,000
Incidents365 days1,000
Test / unknown7 days400

Purging is lazy — it happens on insert, scoped to the class that just arrived — and each class purges against its own budget. The high-volume client stream therefore cannot evict a rare incident or admin row to make room for itself.

Anything you ask about outside these windows isn’t missing data; it is data that was never retained. Derived stores have their own windows: the client registry keeps 180 days, roam pairs 90 days, event counters 120 days.

LimitValue
Watch expiry24 hours by default
Maximum168 hours (7 days)

Expiry is mandatory — there is no permanent watch.

A tool you cannot see is not a broken tool. R1-MCP exposes a single MCP tool — code_mode — and inside it the r1 object carries 13 always-on primitives. Everything else appears only when its feature is enabled. get_reference itself appears only once you have at least one feature on.

After enabling a feature, reconnect the connector in Claude so it picks up the new tool list.