- CLI: run
ish check. It prints a checklist of your account, active workspace, and local simulation setup, and exits non-zero when something is blocking. Seeish check. - MCP: ask the agent to confirm who you are and list your workspaces. A read-only reply means the connection and sign-in landed. See Connecting.
Auth failures
The CLI resolves a token from five sources in a fixed order before every call:--token,
--token-file, ISH_TOKEN, the saved OAuth session in ~/.ish/config.json, then a legacy
pasted token. The first source that produces a token wins. See
Authentication for the full order and the config file shape.
No auth token found
No auth token found
--token,
--token-file, or ISH_TOKEN is set.Fix. For interactive use, run ish login once. For CI and automation, set one of
the explicit sources instead:Session expired
Session expired
ish login to sign in again. Add --verbose to see the raw response if
you need to understand why the refresh failed.ish login always runs the full browser flow. You rarely need to re-run it just
because time passed: every command auto-refreshes a stale token with regular use. To
check whether you are signed in, run ish status, not ish login.Saved token is invalid
Saved token is invalid
Saved token is invalid. Run "ish login" to re-authenticate., sometimes with a trailing hint about a dev or prod environment.Cause. The saved token is not expired locally but the API rejected it. The common
case is an environment mismatch: a token minted by the dev Supabase project presented to
the prod API, or the reverse. The two sign with different keys, so each rejects the
other’s tokens.Fix. Match the token to the API it is presented to. The hint in the error names
which side to change:ish check reports a failed account, but my token is fine
ish check reports a failed account, but my token is fine
ish check shows [FAIL] Account not logged in even though you pass a
token through --token, --token-file, or ISH_TOKEN.Cause. This was a defect in older builds that read only the config file. Current
ish check resolves auth the same way every other command does, so a token-file or
ISH_TOKEN runner reads [ OK ].Fix. Upgrade the CLI, then re-run with the token source you use in CI:MCP tool returns [auth_failed] or [forbidden]
MCP tool returns [auth_failed] or [forbidden]
[auth_failed] or [forbidden].Cause. [auth_failed] means the session token is missing or rejected. [forbidden]
means you are signed in but lack access to that resource. A billing wall does not arrive
as [auth_failed]: it surfaces as [usage_limit_reached] or [insufficient_credits].Fix. On [auth_failed], reconnect the client so it runs sign-in again (see
Connecting). On [forbidden], confirm you are in the right
workspace and that the resource belongs to your account. Do not
re-login on [usage_limit_reached] or [insufficient_credits]: check
credits and limits instead.OAuth sign-in
Both surfaces sign in over OAuth in the browser. The CLI listens on a loopback address (127.0.0.1 on an OS-assigned port) and opens your browser at the sign-in URL; the
provider redirects back to that loopback with the result. MCP clients run the same kind of
browser flow on first connect.
ish login: the browser did not open
ish login: the browser did not open
ish login prints Opening browser to sign in... and then waits, but no
browser window appears (common over SSH, in a container, or on a headless host).Cause. The CLI cannot launch a browser in this environment. The loopback server is
still listening and the sign-in URL is still valid.Fix. ish login prints the URL right after the “opening browser” line:--token-file or ISH_TOKEN (see
Authentication).ish login: timed out, or OAuth state mismatch
ish login: timed out, or OAuth state mismatch
ish login ends with Login timed out. Please try again., or with an
OAuth state mismatch error that flags a possible CSRF attempt and asks you to try
again.Cause. The timeout means no redirect reached the loopback server in time (the
browser never completed sign-in, or it could not reach 127.0.0.1). The state mismatch
means the value returned by the provider did not match the one the CLI sent, so the CLI
refuses the response.Fix. Run ish login again and complete sign-in promptly in the browser that
opens. Use the same machine for the browser and the CLI so the browser can reach the
loopback address. If a local firewall or VPN blocks loopback redirects, allow them, or
authenticate with --token-file or ISH_TOKEN instead.MCP client: the agent reports no ish tools
MCP client: the agent reports no ish tools
Tunnels and localhost
ish study run dispatches to ish’s remote fleet by default, where the browser runs in the
cloud. A remote run needs the iteration URL to be publicly reachable. There are two ways to
point the fleet at work on your machine, and they are easy to confuse.
ish study run --local: it runs the browser on your machine
with Playwright, directly against the URL, including a plain http://localhost:3000, with
no tunnel. Reach for ish connect only when you specifically need the remote fleet
(cloud browser, larger pool, more parallelism) to reach your localhost. See
ish study run and ish connect.Remote run can't reach my localhost URL
Remote run can't reach my localhost URL
ish study run against http://localhost:3000 produces empty or
failed participants because the cloud browser cannot open your machine.Cause. The remote fleet runs in the cloud. It cannot reach a localhost URL on your
machine without a tunnel.Fix. Either run locally, or open a tunnel and point the iteration at the public URL:ish connect needs a port
ish connect needs a port
ish connect exits with Pass a port: ish connect <port> (e.g. ish connect 3000). or Invalid port: ....Cause. connect requires the local port your dev server listens on, as a number
between 1 and 65535.Fix. Pass the port:--proxy /<prefix>=<port>
(repeatable):Chatbot endpoint fails with TunnelInactive
Chatbot endpoint fails with TunnelInactive
error_kind: "TunnelInactive":chatbot_setup and chatbot_test return a structured failure carrying the same
error_kind: "TunnelInactive" from the smoke probe (not [network_error], which is the
general transport-failure case).Cause. The endpoint is marked tunnel-backed but no tunnel is currently active. The
CLI runs a pre-flight check before dispatch and refuses to run a chatbot that ish cannot
reach.Fix. Open the tunnel first, then run:The connect verb is missing on a hosted MCP client
The connect verb is missing on a hosted MCP client
connect tool (actions start / status / stop) is absent or refused.Cause. The hosted server exposes two tools. The tunnel-control verb connect is
local-only and hidden when the server runs hosted (JWT mode), because the hosted
server’s localhost is the cloud loopback, not your machine. Only the read-only
connect_status tool stays available when hosted: it reads the backend’s tunnel state
rather than spawning one.Fix. Open the tunnel from a terminal with ish connect <port>, then create the
endpoint as tunnel-backed. To get the connect verb itself, run the MCP locally with
ISH_AUTH_MODE=local. Or host the bot at a public URL and create the endpoint with no
tunnel. See the Connect tools.Gated previews and protected URLs
A remote run needs to reach the iteration URL the way a real visitor would. A URL behind a password, a preview-deploy cookie, or a login form will block participants unless ish has the credentials. Configure them once on the workspace; participants reuse them on any study that points at a matching origin. Credentials are encrypted at rest and never read back.Participants land on a login or password wall
Participants land on a login or password wall
A short-lived tokenized preview link expired mid-run
A short-lived tokenized preview link expired mid-run
A public URL is still being treated as gated
A public URL is still being treated as gated
Still stuck
Exit codes and errors
Authentication
Connecting an agent
ish check
ish feedback from the CLI. See
ish feedback.