Server
Authentication settings
Each request to the MCP server must have a credential in theAuthorization header. The server doesn’t accept the session cookie of the Judt dashboard. For how to get each credential, see Authentication.
API key
OAuth
Use OAuth with a client that supports MCP authorization. Add the server URL with noAuthorization header. The client opens a browser, you sign in, select an organization, and approve access.
apps:read: tools that only read, such aslist_apps,read_file, andrequest_secrets.apps:write: all other tools.offline_access: gives the client a refresh token, so you don’t sign in again each hour.
401 with a WWW-Authenticate header. The header holds the resource_metadata URL and the scopes, so that an MCP client can find the authorization server and start OAuth.
Supported features
The server is stateless. Each HTTP request stands alone, and the server doesn’t issue anMcp-Session-Id.
Tools
The Effect column shows the tool’s annotations. Many clients use them to decide when to ask you before a call.- Read-only: the tool changes nothing (
readOnlyHint). - Write: the tool adds or changes data, but doesn’t replace or remove data that exists.
- Destructive: the tool can replace or remove data that exists or the published App, change the App’s address or access, or create an API key (
destructiveHint).
API operations without a tool
Arguments
A tool’s arguments are the path, query, and header parameters and the JSON body fields of its API operation. The input schema of each tool gives the full list, with the same descriptions as the API reference. The names change in these cases:if_match or if_none_match without quotes, as read_file and write_file return it in etag.
A list tool that has an optional ID argument also gets one item. For example, list_deployments with deployment_id returns that deployment with its details, and ignores the list arguments.
Results
A successful call returns the API’s JSON response asstructuredContent, and the same JSON as text. If the response has an ETag header, the result also holds etag.
A failed call has isError: true. The result holds the API’s error, in the form {"error": {"code": "...", "message": "..."}}. For a tool that changes data, the result also holds the idempotency_key that the request used.
Retries and long calls
Each tool that changes data takes an optionalidempotency_key. If a call returns 504, call the tool again with the same key. The retry returns the result of the first request, and doesn’t do the work again. create_visitor_token, create_deep_link, and create_preview store nothing, so a retry makes a new token or URL.
A call such as deploy or run_command can take a long time. If the client sends a progressToken, the server sends a progress notification every 10 seconds until the call returns.
Secrets
No tool takes a Secret’s value, so a value never goes through the conversation.- To get a value from the user, call
request_secrets. While a Secret is missing, the result holds aurlto the App’s Secrets page in the Judt dashboard. If the client supports URL elicitation (revision2026-07-28), the client opens the page for the user. Otherwise, give theurlto the user, and then callrequest_secretsagain. - To make a value that no other service gives you, such as a session signing key, call
generate_secret.
Troubleshooting
The client can't connect, or every call returns 401 unauthenticated
The client can't connect, or every call returns 401 unauthenticated
- Make sure that the header is
Authorization: Bearer judt_..., with no quotes around the key. - Make sure that the key isn’t expired or revoked on the API keys page.
- The server doesn’t accept the dashboard’s session cookie. Use an API key or OAuth.
- Make sure that the URL is
https://api.judt.ai/mcpand that the client uses the Streamable HTTP transport, not SSE or stdio.
The browser doesn't open for OAuth
The browser doesn't open for OAuth
Authorization header. Remove the header to use OAuth, or use an API key.401 with invalid_token in WWW-Authenticate
401 with invalid_token in WWW-Authenticate
https://api.judt.ai/mcp.403 insufficient_scope
403 insufficient_scope
apps:write. Disconnect the client, connect it again, and approve all the requested access.403 forbidden
403 forbidden
member, and the tool needs owner or admin, for example to deploy or to change Secrets. Ask an owner or admin to do the action, or to change your role.403 app_scoped_token, or 404 not_found for an App that exists
403 app_scoped_token, or 404 not_found for an App that exists
404. Call list_apps to see the App that the key reaches. To work on all Apps, use an organization-wide key or OAuth.With OAuth, the token reaches only the organization that you selected when you signed in. To use a different organization, sign in again.403 api_token_required on create_app_token
403 api_token_required on create_app_token
A call times out, or returns 504
A call times out, or returns 504
idempotency_key to get the result of the first request. The 504 result holds the key that the request used.If the client stops waiting before the server answers, increase the client’s tool timeout. A deploy can take up to 9 minutes. The server sends progress notifications every 10 seconds, so that clients that reset their timeout on progress keep waiting.create_preview returns 422 preview_failed
create_preview returns 422 preview_failed
detail in the result for the build output, fix the code, and call create_preview again. To see more, call list_logs with environment set to development.write_file, edit_file, or delete_file returns 412
write_file, edit_file, or delete_file returns 412
etag.edit_file returns old_string_not_found or old_string_not_unique
edit_file returns old_string_not_found or old_string_not_unique
old_string_not_found:old_stringisn’t in the file. Read the file, and copy the text exactly, with its whitespace and line breaks.old_string_not_unique:old_stringis in the file more than one time. Add more of the text around it, or setreplace_alltotrue.
request_secrets returns a url, but no page opens
request_secrets returns a url, but no page opens
url to the user. After the user sets the Secrets, call request_secrets again to make sure that each one is provided.A tool is missing from the client
A tool is missing from the client
Something else is wrong
Something else is wrong
send_feedback with type set to bug, and say what you tried and what happened. Include the request_id from the error, if there is one.