Limits and quotas
Most surprising SZ-MCP behaviour is a limit doing its job. This page collects them, with what each one does when you reach it.
Timeouts
Section titled “Timeouts”| Limit | Value | On reaching it |
|---|---|---|
code_mode run budget | 20 seconds wall clock, shared across every call the program makes | The run is cut off with code_mode exceeded 20000ms wallclock budget, returned as a tool error |
One call request to SmartZone | 15 seconds | The request is aborted; surfaces as a network_error envelope, and the time still counts against the run budget |
| Service ticket mint (login) | 15 seconds | invalid_host — the controller did not respond in time |
| API version detection, per candidate | 15 seconds | Detection stops; a timeout is not treated as “try the next version” |
The run budget is per code_mode call, not per conversation. Every new call
gets a fresh 20 seconds, which is why the right response to hitting it is to
split the work rather than retry the same program.
| Limit | Value | On exceeding it |
|---|---|---|
code_mode program source | 20,000 characters | Rejected before execution: code must be under 20,000 characters |
| Host / FQDN | 253 characters | Rejected on save |
| SmartZone username | 200 characters | Rejected on save |
| SmartZone password | 500 characters | Rejected on save |
| Credential label | 100 characters | Rejected on save |
Result caps
Section titled “Result caps”These bound what the discovery primitives return in one call. Neither is a cap on what exists — both report the full total separately.
| Primitive | Default | Maximum | Total available |
|---|---|---|---|
search_endpoints | 20 results | 50 | count gives the pre-limit total |
list_endpoints_by_tag | 50 results | 200 | count gives the total under the tag |
list_endpoints_by_tag takes an offset, so a tag larger than 200 operations
is paged rather than truncated. search_endpoints has no offset — narrow the
query or add a tag instead.
get_endpoint_details inlines $ref pointers to a depth of 3. Deeper
references, and any cycle, are left as { $ref: "…" } rather than expanded.
Caches and lifetimes
Section titled “Caches and lifetimes”| Item | Lifetime | Notes |
|---|---|---|
| Service ticket | 25 minutes | Cached in KV per user, deliberately shorter than SmartZone’s idle timeout. Flushed on credentials save, delete and Test connection |
| Full OpenAPI spec | Per isolate, until eviction | Loaded from object storage on the first get_endpoint_details for that surface; adds a few hundred ms to that one call |
| Web session cookie | 30 days | szmcp_session |
| MCP access token | 30 days | Prefixed szmk_ |
| MCP refresh token | 90 days | Rotated on every use; the old one is revoked |
| OAuth authorization code | 10 minutes | Single use |
| MCP client registration | 30 days | Claude re-registers automatically |
Retries
Section titled “Retries”call never throws on an HTTP error, and retries exactly one thing:
| Status | Behaviour |
|---|---|
| 401 | The cached ticket is discarded, a fresh one is minted, and the request is retried once. A second 401 is returned to you |
| Everything else | Returned as-is. No automatic retry on 429, 5xx or anything other status |
There is no backoff, no Retry-After handling, and no retry budget beyond that
single 401 attempt. A rate-limited or flapping controller surfaces directly to
the model.
Rate limits
Section titled “Rate limits”| Limit | Value | On reaching it |
|---|---|---|
| MCP client registrations | 20 per IP per hour | 429 with {"error": "rate_limited"} |
This bounds the Dynamic Client Registration endpoint only. Normal use registers once per connector, so reaching it usually means something is re-registering in a loop.
Account scope
Section titled “Account scope”| Limit | Value |
|---|---|
| SmartZone controllers per account | One |
| MCP scopes | One — sz:call |
| MCP tools exposed | One — code_mode |
Saving new credentials replaces the stored controller; there is no list of connections to switch between.
Limits that are not SZ-MCP’s
Section titled “Limits that are not SZ-MCP’s”Two ceilings sit outside this service and are worth naming, because they look like SZ-MCP limits from the inside:
- Your SmartZone account’s permissions. Anything it cannot do returns a
403from the controller. SZ-MCP adds no restrictions of its own — see Security model. - The controller’s own pagination. WSG list endpoints typically take
listSizeandindexand return{ list, hasMore, totalCount }. Those caps are SmartZone’s; SZ-MCP passes your query through unchanged.