Skip to main content
This reference lists the tools on the Judt MCP server. Each tool sends a request to the Judt API as the caller, so the tool has the same permissions, validation, and errors as the API operation. To connect a client, see Connect to MCP.

Server

Authentication settings

Each request to the MCP server must have a credential in the Authorization 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 no Authorization header. The client opens a browser, you sign in, select an organization, and approve access. The required scope depends on the API requests that a tool sends:
  • apps:read: tools that only read, such as list_apps, read_file, and request_secrets.
  • apps:write: all other tools.
  • offline_access: gives the client a refresh token, so you don’t sign in again each hour.
If a request has no credential or a credential that isn’t valid, the server returns 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 an Mcp-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).
Tool names are stable identifiers. Judt doesn’t rename a tool.

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: Send an ETag in 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 as structuredContent, 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 optional idempotency_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 a url to the App’s Secrets page in the Judt dashboard. If the client supports URL elicitation (revision 2026-07-28), the client opens the page for the user. Otherwise, give the url to the user, and then call request_secrets again.
  • To make a value that no other service gives you, such as a session signing key, call generate_secret.
See Secrets.

Troubleshooting

  • 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/mcp and that the client uses the Streamable HTTP transport, not SSE or stdio.
The client doesn’t support MCP authorization, or the configuration has an Authorization header. Remove the header to use OAuth, or use an API key.
The OAuth access token is expired or revoked, or it was issued for a different resource. Refresh the token, or sign in again. If you get the token yourself, request the resource https://api.judt.ai/mcp.
The OAuth token doesn’t have apps:write. Disconnect the client, connect it again, and approve all the requested access.
Your organization role is 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.
The API key reaches only one App. It can’t create Apps or tokens, and other Apps return 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.
Only an organization-wide API key can create an App token. OAuth access tokens and App tokens can’t.
The work continues on the server. Call the tool again with the same 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.
The dev server can’t build or start the App. Read 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.
The file changed after you read it. Read the file again, and then make the change again with the new etag.
  • old_string_not_found: old_string isn’t in the file. Read the file, and copy the text exactly, with its whitespace and line breaks.
  • old_string_not_unique: old_string is in the file more than one time. Add more of the text around it, or set replace_all to true.
The client doesn’t support URL elicitation. Give the url to the user. After the user sets the Secrets, call request_secrets again to make sure that each one is provided.
The client keeps the tool list from when it connected. Reconnect the client to load the current list. Some clients also let you turn off tools one at a time; make sure that the tool is on.
Call 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.