Troubleshooting
September 16, 2026 · View on GitHub
Contact support
For help with the hosted Kody service at kody.codes, open
/support or email
support@kody.codes. Operators of other Kody
deployments receive support mail at support@<apex>, where <apex> is the
deployment's APP_BASE_URL hostname.
MCP requests fail with email_verification_required
Kody requires a verified account email before any MCP access, including OAuth
authorization. Open the verification link sent at signup, or sign in and use
Resend verification email on /pending-verification, /account, or the
authorize page. Keep an open /oauth/authorize tab so you can continue the same
OAuth request after verifying in another tab, then reconnect or approve again.
Codex keeps asking for codex mcp login kody
Kody access tokens last one hour. A host that stores the refresh token should
call /oauth/token and stay signed in. Cursor does this. Some Codex builds send
the expired access token, get a 401, and ask for a full browser login instead.
Concurrent MCP hosts that share one stored Kody OAuth client can refresh at the
same time. Reusing the previous refresh token returns the current family tokens
instead of minting a new one that invalidates siblings. A consumed token's
one-hour replay is the maximum retention, not a guarantee: after the next
rotation that replay no longer matches and is invalid_grant. Tokens outside
the current/previous pair and that window also need a new browser login.
Try this first:
- Update Codex.
- Run
codex mcp logout kody, thencodex mcp login kody. - If two Codex processes still prompt together, update Kody — overlapping refreshes on one shared client should stay signed in.
If it still happens about every hour or every new Codex launch, that is the host
skipping refresh. Cursor and Claude Code stay logged in. Email
support@kody.codes with your Codex version and
how often it asks again if you want us to look.
Authorize says the request is missing its original connection details
The authorize page needs the original OAuth query (client_id, state, PKCE).
Clicking Approve before that page finishes loading can replace those parameters
with an empty honeypot field, and the server then asks you to start over. Use
the browser Back button when the previous history entry still has client_id in
the URL, or start the connection again from your client.
The host never opens the Kody authorize window
Dynamic OAuth needs the host to open /oauth/authorize. If Admin add-connection
succeeds but enabling the MCP tool in chat never opens that window, retry from
another browser or device. That is a host or environment issue, not a failed
Kody registration. In Open WebUI, do not set an OAuth MCP tool as a model
default or pre-enabled tool — enable it in the chat so the host can open the
authorize window. Hosts that require a pre-registered Client ID and Client
Secret can mint one at Account → Connections → Advanced → MCP OAuth clients
(/account/mcp-oauth-clients) and use the host’s static OAuth mode. Static mode
runs authorize and token exchange.
Adding a remote MCP server fails with Invalid origin uri or redirect URI errors
That message comes from the remote authorization server, not from Kody being
unreachable. Kody identifies as an OAuth client from the deployment origin and
redirects to {origin}/account/mcp-servers/oauth/callback. Allow those values
in the MCP server's identity provider (authorized origins / redirect URIs). When
the authorization server advertises client_id_metadata_document_supported and
the callback origin is HTTPS, Kody also presents
{origin}/oauth/client-metadata.json as its CIMD client_id — allowlist that
URL only for CIMD-capable providers. Then remove and re-add the server. See
Connect remote MCP servers. For a home process behind
Cloudflare Tunnel and Access, also see
Connect a home MCP server and
home-mcp-starter.
Search returns no good matches
- Rephrase the query using domain vocabulary from the search tool’s domain hints (for example “GitHub”, “Cloudflare”, “meta capabilities”).
- Try
metaListCapabilitiesfor the full live registry, including dynamic entries from MCP servers. entity: "capability:id"looks up a known id. It does not turn an empty rankedqueryinto better matches — rephrase or list capabilities instead.
Package checks fail with isolate memory or CPU limits
Bundle validation and publish artifact rebuild run in a short-lived isolate. A
large npm dependency graph can exceed that isolate even when ad hoc execute
imported the same library. The failure is the graph, not a missing file. Do not
vendor the library or switch to a dynamic import. Keep the package as a thin
orchestrator and run the heavy work in a process the owner operates. See
Offload work that does not fit a Worker isolate.
Saved packages missing
Saved packages require an authenticated MCP user. If the client is not signed in, user-scoped package results are empty.
Fetch or secret errors
- Host not approved: complete the approval flow in the app for that secret and host. Self-authored and adopted packages still need this host grant.
- Package not approved for secret: self-authored and adopted packages can
read and use user secrets; unadopted community forks need an
allowed_packagesgrant (or adoption after review). See Secrets and host approval.
MCP servers
If tools from a connected MCP server appear missing, open
/account/mcp-servers (or ask mcpServerList) and
confirm the server is connected and authorized. If authorization finished at the
identity provider but Status stays on tool discovery — or add, reconnect, or
refresh times out before tools appear — the Status field shows the last
sanitized settle error (phase, HTTP status, URLs, and an attempt id). Reconnect
from that page. When Usage is Specific packages only, ad hoc execute and
other packages cannot see or call kody.mcp["server-name"] — only granted
packages can. Home automation is a normal outbound MCP server
(kody.mcp["home"]). See Connect remote MCP servers
and Lock an MCP server to a package.
After a password reset or an in-account password change, reconnect the MCP host: Kody revokes OAuth grants and rejects access tokens issued at or before the change, so a refresh alone is not enough. Signed-in users can also change or set a password from Account without waiting for a reset email.
Job, webhook, or package app failed
Open /account/activity (failures-first) or ask your agent
to use runSummary / runList / runGet. Successful key-less
ad-hoc execute calls are not stored there — only execute failures, keyed
execute runs (including successes), and other runtime surfaces.