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–120; polls every 2 seconds by default (0.5–10)Reports the last activity state it saw rather than failing outright. A wait longer than about 25 seconds is cut off by the 30-second run budget first
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, element_extract, and the working snapshot backup_create takes from a venueId — one shared cap)2030 daysRefuses — snapshot_limit_reached
Backups (backup_create)50IndefiniteRefuses — backup_limit_reached, checked before anything is extracted, 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 — except a copy MOP that still has a run on record, which is kept
Test beds50 (100 devices each)365 days untouchedRefuses — testbed_limit_reached; a save with more than 100 devices fails as too many devices
Endpoint notes (save_endpoint_note)10 per endpoint, 500 in total; 5–500 characters eachKeptRefuses — too_many_notes_for_endpoint / too_many_notes
Data Studio notes (ds_save_note)10 per topic; 5–4,000 characters eachKeptRefuses — too_many_notes_for_topic
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
config_diff output400 lines, with no pagingThe diff is cut off and the response is marked truncated
Run retention7 days for a MOP, 90 days for a test planSwept. A copy run’s runId stops working for venue_copy_undo and for element_copy_verify after 7 days — they answer run_not_found

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 results20 by default, 50 maximum
list_endpoints_by_tag results50 by default, 200 maximum
search_docs, and the ICX, ICX hardware, and Edge doc searches10 by default, 20 maximum
Requests in one MCP JSON-RPC batch20 — more is refused as batch_too_large
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.

LimitValue
Output per device_cli batch256 KB by default
Session transcript4 MB
Held sessionClosed after 4 minutes idle, and after 13 minutes in all — reopen it to continue
Cached device login tokenAt most 15 minutes, so a connection you edit, disable, or delete stops opening consoles quickly
LimitValue
diagram_topology graph2,000 nodes, 4,000 edges
diagram_topology L1 AP LLDP lookups60 APs
diagram_topology L3 static-route reads60 switches
probe_reconcile inventory5,000 cloud devices
probe_reconcile rogue rows returned25 by default, 200 maximum (totals are always included)
LimitValue
One Data Studio request20 seconds (see Timeouts)
ds_diagnose_charts sweep15 charts by default, 60 maximum
ds_list_charts / ds_list_dashboards rows100 by default, 500 maximum

RUCKUS also enforces its own guardrails on every Data Studio chart and dashboard — these are platform limits, not R1-MCP ones:

GuardrailValue
Dimensions per chart6 (3–4 performs best); more fails as DATASTUDIO-20010
Time range31 days. A longer relative range is capped to 31 days; a longer custom range is rejected
Unpaginated table500 rows, whatever row_limit says — turn on server pagination for more
Charts per dashboard40 across all tabs (20 recommended)

Any tool that returns a picture — today, floorplan_map — sends it as an image block Claude can see, within these caps. An image over a cap is refused, not trimmed, with a note to ask for the map link instead.

LimitValueOn exceeding it
Image blocks per response4too_many_images
One image block1.5 MBimage_too_large
All image blocks in one response4 MBtotal_image_budget_exceeded
Floorplan map image800,000 pixels, ≤ 900 KB encoded; widths 1000, 760, 560, then 400 px are tried in turnRendered again at the next smaller width
Inline SVG map60 KBRefused rather than trimmed — use the map link
ASCII floor grid160 × 80 characters
Source floorplan image from R120 MBimage_too_large
PNG decode30 megapixelsimage_too_large
Mirrored floorplan images50 per user per connectionThe oldest are evicted
Cached image metadata30 daysRe-read
Client snapshot cache15 minutesRe-queried from R1
Roam arrows / co-channel pairs drawn80 / 40, busiest firstThe rest are counted, not drawn
Client roster rows1,500
Floor Map launch link15 minutes, one venue, read-only; it cannot renew itselfMint a new one

The VLAN probe puts a real SSID on the air, so its limits are about getting it off again.

LimitValue
Rows (VLANs) per run15
Run deadlineThree times the estimate, never under 15 or over 60 minutes — at the deadline the run is torn down
Waiting for the Service Validation test to appear3 minutes
Test polling per rowEvery 15 seconds, 24 times (about 6 minutes)
Confirmation after preflight10 minutes
Progress streamRe-opened every 10 minutes (a bye frame tells the client to reconnect)
Cleanup requestUp to 50 named ids
Run record30 days, and kept longer while anything it created is not yet deleted

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), including admin login events7 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 audit (admin actions other than logins)90 days2,000
Incidents365 days1,000
Test / unknown7 days400
Any other type30 days4,000

Purging happens on insert, scoped to the class that just arrived — and an hourly sweep also enforces the time windows for every user — and each class purges against its own budget. The high-volume client stream therefore cannot evict a rare incident or admin-audit row to make room for itself. Admin login events are the exception: they ride the client stream, so they share its 7-day window and 20,000-row budget.

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 (up to 100,000 devices), roam pairs 90 days (up to 40,000 pairs), event counters 120 days (up to 20,000 counters).

The webhook receiver accepts a payload of up to 64 KB; a larger one is answered 413 payload_too_large.

LimitValue
Watch expiry24 hours by default, set in whole hours
Maximum168 hours (7 days)
Active watches100 per user — more is refused as watch_limit_reached
Watch notices1,000 per user; delivered ones kept 7 days, undelivered 30 days
Live Console watch started from the page2 hours by default, 24 hours maximum

Expiry is mandatory — there is no permanent watch.

LimitValueOn reaching it
Claude connector access token1 dayClaude refreshes it automatically
Claude connector refresh token90 days, renewed each time it is usedReconnect the connector if it sits unused that long
Dashboard sign-in session30 daysSign in again
Early Access password attempts10 per 15 minutes429 too_many_attempts — wait and retry
Connector registrations5 per minuteRetry shortly

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 tools. 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.