Limits and errors
The limits that keep tool calls fast and predictable, and what an AI client sees when a call fails.
Limits per call
| What | Limit |
|---|---|
Command output (exec, shell_run) | 32,000 bytes; longer output is cut |
| Command timeout | 60 seconds by default, 900 seconds at most; use job_start for longer work |
Machines per exec_many | 8, each with half the output limit |
read_file | 200,000 bytes by default per call, up to 4,000,000; continue from next_offset |
write_file, copy_between_hosts | 4,000,000 bytes; use transfer_start for larger files |
transfer_start | No size limit; 2 at a time per connection, up to 10,000 files each |
Job output (job_output) | 64,000 bytes per read |
| Terminal output per call | 20,000 characters; waits up to 600 seconds |
Port-forward HTTP body (tunnel_http) | 32 KB |
Open sessions
| What | Limit |
|---|---|
| Shell sessions | 4 per machine; closed after 30 minutes idle |
| Terminals | 8 per connection; closed after 30 minutes idle |
| Tunnels | Closed after 1 hour |
| Schedules | 200 per account |
| Web shares | 24 hours by default when an AI creates one, 30 days at most |
| Waiting approvals | 20 per connection |
Calls that take longer than 10 seconds send MCP progress notifications every 10 seconds when the client asks for them, so the client does not time out while a command, a transfer or an approval is pending.
Plan limits
Plans set how many machines and members an account has, and which features its policies can use, such as per-folder file rules, command rules, schedules, web shares and secret environment variables. See pricing. A call that needs a feature the plan does not include fails with a message saying so.
Errors
A refused or failed call returns an MCP tool result with isError: true and a plain-language message that tells the AI what happened and what to do next. The messages you are most likely to see:
| Message begins with | Meaning |
|---|---|
token lacks fleet.… | The connection was approved without the scope this tool needs. Reconnect and approve the scope. |
refused by this connection's command rules | The policy's command rules deny this command. |
high-risk operation | The AI must show you the exact command, then call again with confirm=true. |
refused by guardrail | A command LetKite never runs, such as wiping a disk. |
waiting for a person to approve this | An approval is pending; the message says who was asked and until when. |
this connection's authorization is no longer valid | The connection was disconnected. Reconnect the client to sign in again. |
Sign-in errors use the standard OAuth error codes (invalid_grant, invalid_client, access_denied and so on). A missing or expired token gets HTTP 401 with a WWW-Authenticate header, and clients sign in again or refresh by themselves.