Connection
inferenceProvider
enum
Since 1.2581.0
Inference provider. Selects the inference backend. Setting this key activates third-party mode.
One of: gateway, anthropic, bedrock, mantle, vertex, foundry
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
More detail
More detail
disableDeploymentModeChooser removes. In 3P mode, if the selected provider’s required credential keys are missing or invalid, the app shows a configuration error. A value the app cannot read (a misspelt, wrongly cased or unknown provider, or a value of the wrong type) still counts as set when machine-wide device management sent it: a macOS configuration profile, Windows policy under HKLM, or the root-owned policy file on Linux. The app then asks for 3P mode and, in 3P mode, shows a configuration error whose details name this key. An unreadable bootstrapUrl from the same sources counts the same way unless bootstrapEnabled is false. An unreadable value does not count where the user can write it: the local configuration file, or Windows policy under HKCU. Neither does an empty value (a value of only spaces is unreadable, not empty), or a Windows value of type REG_BINARY, REG_MULTI_SZ or REG_QWORD. Each of those reads as not set. When this key is not set, the app launches in standard mode unless another setting asks for 3P mode, such as a bootstrapUrl that bootstrapEnabled has not turned off. Keys for providers other than the selected one are ignored. Each provider’s required keys are documented on its dedicated page under Inference providers.inferenceCredentialKind
enum
Since 1.8555.0
Credential kind. Selects the credential source. When set, only that source is used (no fallback).
One of: static, helper-script, interactive, vendor-profile, workforce, external-idp
Self-hosted install: MDM profile. In self-hosted mode it names the device’s sign-in to the host, never the host’s model credential.
inferenceSessionLifetimeSec
integer
Range: 1 or more
Since 1.14271.0
Sign-in session lifetime. How long a sign-in stays valid under your IdP’s session policy. Shows a re-authenticate banner before it expires.
Self-hosted install: Not supported. The session host is the one source for how long a sign-in to it lasts, and it reads no figure from this key.
userContentRendererUrl
string
Since 1.24012.0
Artifact preview iframe origin. HTTPS origin of the user-content-renderer deployment used for artifact and file previews. Defaults to the commercial host when unset.
Self-hosted install: Not supported. Names where Desktop loads its previews from, and no session host passes the setting on to Desktop yet.
inferenceCustomHeaders
object: name → value
Since 1.8089.0
Custom inference headers. Extra headers on every inference request — routing and tenant headers only (org IDs, Bedrock Guardrails). No credentials; use the credential helper for tokens.
Self-hosted install: Server side. The host makes the model calls, so it adds the admin’s headers to them.
More detail
More detail
ANTHROPIC_CUSTOM_HEADERS).Use this for fleet-wide, non-secret constants. Do not put API keys, bearer tokens or other credentials here — this map is stored and distributed as plain configuration. For tokens, and for per-user or per-session values, have the credential helper script emit JSON with a headers field; those are merged over these static entries (helper wins on conflict).inferenceCredentialHelper
string
Since 1.2581.0
Helper script. Absolute path to an executable that prints the credential, optionally with per-request headers.
Self-hosted install: MDM profile. Names a program on the person’s computer, reused for the device’s sign-in to the host.
More detail
More detail
0; any output on stderr is logged but ignored. Stdout must contain only one of the formats below (no banners, prompts, or log lines).Output format is either:- a single bare token (the API key / bearer token), or
- a JSON object
{"token": "...", "headers": {"Name": "Value", ...}}when per-request headers are needed (merged over Custom inference headers, helper wins on conflict)
CLAUDE_HELPER_CONTEXT in its environment (interactive, mid-session-refresh, background, scheduled-task, setup-test) so it can decide whether to prompt the user — see the credential-helper docs for the full contract.Result is cached for the TTL below. On TTL expiry the helper is re-invoked transparently (no user prompt, no relaunch).Expiry and refresh: the app checks the active credential’s expiry before each turn and refreshes silently when possible (re-runs the helper, or uses the stored refresh token for interactive sign-in kinds). If the provider returns HTTP 401 mid-turn, the same silent refresh is attempted before surfacing an error. When silent refresh fails, a prompt appears with a provider-specific action (re-sign-in for interactive kinds; admin-contact for static credentials). Applies to all providers, and to both Cowork and Code.Typical use: a shell script that pulls from Keychain, 1Password CLI, or an internal secret broker. Example:security find-generic-password -s anthropic-api -wIf this field is set, static credential fields (API key, bearer token) are ignored. The helper always wins.inferenceCredentialHelperWindows
string
Since 2.2553.0
Helper script (Windows). Absolute path of the helper executable on Windows devices, used there instead of Helper script. Leave unset to use Helper script on every operating system.
Self-hosted install: MDM profile. Names a Windows program on the person’s computer, reused for the device’s sign-in to the host.
More detail
More detail
C:\... or C:/...). Windows devices run this executable with the same arguments, timeout, TTL and environment as Helper script; macOS and Linux devices ignore it. An invalid value here stops the connection on Windows devices only. Desktop releases that predate this setting ignore it and run Helper script on every operating system.inferenceCredentialHelperArgs
string[]
Since 2.110.0
Helper script arguments. Arguments passed to the helper script, one per entry, in order. Leave unset to run it with none.
Self-hosted install: MDM profile. Gives arguments to a helper program on the person’s computer, reused for the device’s sign-in to the host.
More detail
More detail
["--environment", "production"] runs helper --environment production. Use it to keep one installed script and let the configuration each user receives decide what it does (which environment, tenant or vault to read), instead of packaging a script per case.Entries may not be empty and may not contain a double quote ("), a percent sign (%) or control characters, on any platform: a Windows .cmd/.bat helper receives its arguments through cmd.exe, where those characters would change the command. A .cmd/.bat script sees each argument quoted (%1 is "production", %~1 strips the quotes); .ps1, .exe and POSIX helpers receive them bare. Arguments are visible in the diagnostic report and to other processes on the machine, so do not put secrets in them; the helper exists to fetch the secret.A changed list takes effect the way a changed path does.inferenceCredentialHelperTtlSec
integer
Default: 3600
Range: 1 or more
Since 1.2581.0
Helper script TTL. Helper output is cached for this many seconds; once it expires the helper re-runs without a relaunch (before the next turn when set above 120).
Self-hosted install: MDM profile. Sets how long the desktop app caches its helper’s output, reused for the device’s sign-in to the host.
inferenceCredentialHelperTimeoutSec
integer
Default: 60
Range: 1–600
Since 1.8089.0
Credential helper timeout. Maximum wait for the helper executable to finish. Raise this if the helper opens a browser for interactive sign-in.
Self-hosted install: MDM profile. Bounds a helper program on the person’s computer, reused for the device’s sign-in to the host.
inferenceCredentialHelperSilentRefreshEnabled
boolean
Default: true
Since 1.10628.0
Re-run helper for silent refresh. On credential expiry, re-run the helper (CLAUDE_HELPER_CONTEXT=mid-session-refresh) to recover silently. Turn off if the helper can’t run non-interactively.
Self-hosted install: MDM profile. Decides how the desktop app re-runs its helper on the person’s computer, reused for sign-in to the host.
egressProxyUrl
string
Since 1.44121.1
Proxy server URL. Send the app’s and the agent’s traffic through this HTTP proxy instead of the operating system’s proxy settings.
Guide for this setting
Self-hosted install: MDM profile. Names the proxy for the person’s computer, and a host’s network belongs to its operator.
Admin Console: Not available.
More detail
More detail
git, and plugin commands) to one HTTP proxy. Use it when your gateway or the internet is reachable only through a corporate proxy and you cannot rely on the system proxy. It is a reachability setting, not an egress control.The value is an http:// or https:// URL, usually with a port. SOCKS proxies and embedded credentials (user:pass@) are rejected. Give a local forwarding proxy on the device as http://127.0.0.1:port; an https:// loopback address cannot be verified from inside the Cowork workspace VM. Requests to localhost, 127.0.0.1, [::1], and *.local names bypass the proxy so local MCP servers keep working; everything else goes through it, and if the proxy is unreachable requests fail rather than connect directly. The engine receives it as HTTPS_PROXY and HTTP_PROXY with a matching NO_PROXY; if Claude Code managed settings on the device set those variables, they win for the engine on the host. Traffic that never uses this proxy: the Cowork workspace VM on Linux, credential and header helper scripts, the update download, the Windows sign-in broker, and pages opened in the system browser.Read once at launch from device management (MDM) or the local configuration file only; a configuration server cannot deliver it, because the app may need the proxy to reach that server. A profile that sets only this key (or only the other app-behavior keys, such as disableAutoUpdates) does not take over a connection users set up in the app, but those keys are read from one source as a group, so put the proxy in the same profile as your update settings. Changes apply at the next app start. When egressProxyPacUrl is also set, the PAC file wins and this key is ignored.egressProxyPacUrl
string
Since 1.44121.1
Proxy auto-config (PAC) URL. URL of a PAC file that decides the proxy per request. Wins over the proxy server URL when both are set.
Guide for this setting
Self-hosted install: MDM profile. Describes the network of the person’s computer, which Desktop applies to its own traffic.
Admin Console: Not available.
More detail
More detail
egressProxyUrl, except that bypassing is the script’s decision: localhost, 127.0.0.1, and [::1] still never use a proxy, but *.local names and everything else follow whatever it returns. If the PAC file cannot be downloaded, the app connects directly rather than failing.On macOS and Windows the Cowork workspace VM is handed a copy of the script when it starts and evaluates it for each request itself; there myIpAddress() returns the VM’s internal address rather than the device’s, so a script that chooses by client subnet gives the VM its off-network answer (if that download fails, the VM connects directly). The Claude Code engine behind Chat, Cowork, and Code cannot evaluate a PAC file, so the app hands it one proxy (whichever the script returns for your inference endpoint) plus a bypass for loopback and *.local names. If the script answers DIRECT or only SOCKS for that endpoint, the engine uses no proxy at all, so have it return an HTTP PROXY host:port entry there; if the engine needs different rules, set HTTPS_PROXY and NO_PROXY in Claude Code managed settings, which win for the engine on the host.coworkVmIpv6Enabled
boolean
Since 1.52386.0
Enable IPv6 in the workspace VM. Give the Cowork workspace VM an IPv6 address and route so the agent’s tools can reach IPv6-only hosts through the device. macOS and Windows; off by default.
Self-hosted install: Not supported. Configures Cowork’s local virtual machine, which a host session does not have.
More detail
More detail
true, the Cowork workspace VM on macOS and Windows gets a static IPv6 address (a unique local fd… address) and an IPv6 default route on its virtual network next to its IPv4 address, and the VM’s gateway forwards that traffic over the device’s own IPv6 connectivity, as it already does for IPv4. Use it when the tools the agent runs in the VM (shell commands, package installs, git, and plugin commands) must reach IPv6-only destinations. The VM’s resolver then also returns IPv6 (AAAA) answers. A connection the VM makes over IPv6 succeeds only where the device’s own IPv6 does; on a device without working IPv6, destinations that have both keep working over IPv4 and IPv6-only destinations stay unreachable. Because the VM’s address is unique-local, most tools in it keep preferring IPv4 for destinations that have both, so IPv6 mostly carries traffic to IPv6-only destinations.This is a reachability setting, not an egress control: coworkEgressAllowedHosts keeps deciding which hostnames the agent’s tools may reach, by name, over either protocol, and IPv6 literals are still not accepted there. Hosts your policies allow must also be reachable, and filtered the way you intend, over IPv6 on your network.Unset (default): the VM is IPv4-only and its resolver returns no IPv6 answers. A change takes effect the next time the workspace VM starts, typically at the next app launch. Does not apply to the Cowork workspace VM on Linux or to Code sessions, which use the device’s own network stack.Gateway
inferenceGatewayBaseUrl
string
Since 1.2581.0
Gateway base URL. Full URL of the inference gateway endpoint.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
inferenceGatewayApiKey
string
Since 1.2581.0
Gateway API key. API key for the configured inference gateway.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
Admin Console: Not available.
inferenceGatewayAuthScheme
enum
Default: bearer
Since 1.3036.0
Gateway auth scheme. How the gateway credential is sent on the wire (Authorization: Bearer vs x-api-key header).
One of: bearer (default), x-api-key
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
inferenceGatewayOidcAuthFlow
enum
Since 1.25927.0
Gateway sign-in flow. How the IdP sign-in runs: system browser (default) or the OS Microsoft Entra broker.
One of: browser, broker
Self-hosted install: Not supported. Deprecated name for the choice of sign-in window on the person’s computer.
More detail
More detail
browser(default) — opens the system browser for an authorization-code (PKCE) sign-in on a loopback redirect URI. See the IdP setup notes oninferenceGatewayOidcfor redirect-URI registration.broker— signs in through the OS identity broker (Web Account Manager on Windows, Company Portal on macOS). Requires the IdP to be Microsoft Entra ID — theissueroninferenceGatewayOidcmust behttps://login.microsoftonline.com/{tenant-id}/v2.0. The broker satisfies Conditional Access policies that require a compliant/managed device or token protection, and needs no loopback redirect. The Entra app registration must include the broker redirect URIsms-appx-web://Microsoft.AAD.BrokerPlugin/{client-id}(Windows) andmsauth.com.anthropic.claudefordesktop://auth(macOS) under the Mobile and desktop applications platform. Not supported on Linux.
scopes, and forwards it to the customer’s own gateway; both endpoints of that trust relationship are inside the customer’s control. A desktop that has the external-idp kind reads this key, together with inferenceGatewayOidc, as that kind’s sign-in flow; it stays readable.inferenceGatewayOidc
object
Since 1.6889.0
Gateway SSO IdP (OIDC). External IdP for gateway sign-in. The user’s token from this issuer is sent to the gateway as the Bearer credential.
Guide for this setting
Self-hosted install: Not supported. Deprecated name for a sign-in that runs on the person’s computer.
More detail
More detail
<issuer>/.well-known/openid-configuration, runs an OIDC authorization-code-with-PKCE sign-in in the system browser with clientId, and sends the resulting token as Authorization: Bearer on every inference request. Leave this unset for a gateway that hosts its own RFC 8414 metadata at <baseUrl>/.well-known/oauth-authorization-server. A desktop that has the external-idp kind reads this block as that kind’s identity-provider key; it stays readable, so a fleet keeps this spelling until every desktop is on such a release.Bearer token type. id_token (the default) sends the OIDC ID token; the gateway validates signature, iss, and aud (the clientId configured here). access_token sends the OAuth access token, for gateways that validate as a resource server (Portkey, Kong, Envoy JWT filter, AWS API Gateway authorizers); scopes must then name the gateway’s registered API scope. Either way the gateway must check aud, not just signature and issuer, or it accepts any token from your tenant.IdP setup. The callback is http://127.0.0.1:<port>/callback by default (http://localhost:<port>/callback with redirectHost: "localhost"); register exactly the one you use and include /callback. Entra: a public-client app with a Mobile and desktop applications redirect URI of http://127.0.0.1/callback (any port; omitting the path fails with AADSTS50011); in access_token mode also grant the gateway API’s delegated permission, or sign-in fails with AADSTS65001. Okta: a Native app with the exact URI http://127.0.0.1:<port>/callback and that port in redirectPort.Refresh. With offline_access the app renews the token silently and prompts a browser sign-in only when refresh fails. Google never returns an id_token on refresh, so a Google Workspace-backed gateway in id_token mode re-prompts about hourly; access_token mode is unaffected.Child attributes (11)
Child attributes (11)
id_token (default), access_tokenMore detail
More detail
scopes — api://<gateway-app-id>/.default, or a named delegated scope you exposed via Expose an API. With only the standard OIDC scopes (openid profile email offline_access) Entra returns a v1.0 Microsoft Graph token whose issuer (https://sts.windows.net/<tenant>/) doesn’t match the v2.0 issuer configured here, so a gateway that validates iss rejects it. On IdPs that set the access-token audience out-of-band (Keycloak audience mapper, Auth0 default audience, Okta custom authorization server), a resource scope in scopes isn’t required — the audience comes from the IdP-side configuration.More detail
More detail
offline_access as an unknown scope; include the server’s own refresh-token scope in Scopes instead.More detail
More detail
resource=<value> on the authorization, token and refresh requests, so the access token the IdP issues is audience-restricted to the gateway or proxy rather than to the IdP’s own APIs. Use it with bearerTokenType: access_token; in id_token mode the ID token’s audience is always clientId. Ignored with the OS-broker sign-in flow (the sign-in flow key set to broker), which is Entra-only.Microsoft Entra ID: leave unset — the v2.0 endpoint rejects resource; request the API scope in scopes instead (api://<gateway-app-id>/.default). AD FS: enter one of the relying-party trust’s identifiers, spelled as it is registered there. A value with no scheme (a host name with or without a port or path, a single name, or a GUID; name:digits also reads as a host name with a port) is sent as https://<value>; an identifier with a scheme of its own (urn:…, or an organization-defined one such as VENDOR:URI:…) is sent exactly as written. A trust whose only identifier is a bare name or GUID will not match, because those are sent as https://<value>: add an https://… or urn:… identifier to the trust and enter that one here. With any other identity provider, use an absolute URI without a fragment (RFC 8707 — the IdP rejects one as invalid_target). Changing it signs users in again.127.0.0.1, localhostMore detail
More detail
inferenceIdpAuthFlow
enum
Since 2.7032.0
Identity provider sign-in flow. How the identity-provider sign-in runs: system browser (default) or the OS Microsoft Entra broker.
One of: browser, broker
Self-hosted install: MDM profile. Chooses a sign-in window on the person’s computer, also used for the device’s sign-in to the host.
More detail
More detail
browser(default) — opens the system browser for an authorization-code (PKCE) sign-in on a loopback redirect URI. See the IdP setup notes oninferenceIdpOidcfor redirect-URI registration.broker— signs in through the OS identity broker (Web Account Manager on Windows, Company Portal on macOS). Requires the IdP to be Microsoft Entra ID — theissueroninferenceIdpOidcmust behttps://login.microsoftonline.com/{tenant-id}/v2.0. The broker satisfies Conditional Access policies that require a compliant/managed device or token protection, and needs no loopback redirect. The Entra app registration must include the broker redirect URIsms-appx-web://Microsoft.AAD.BrokerPlugin/{client-id}(Windows) andmsauth.com.anthropic.claudefordesktop://auth(macOS) under the Mobile and desktop applications platform. Not supported on Linux.
scopes and forwards it to the customer’s own gateway or proxy; both endpoints of that trust relationship are inside the customer’s control.inferenceIdpOidc
object
Since 2.7032.0
Identity provider (OIDC). Your organization’s OpenID Connect identity provider. The user’s token is sent as the Bearer credential to the gateway or the Bedrock proxy.
Self-hosted install: MDM profile. Configures an interactive sign-in on the person’s computer, reused to sign the device in to the host.
More detail
More detail
inferenceCredentialKind: "external-idp". The app discovers <issuer>/.well-known/openid-configuration, runs an OIDC authorization-code (PKCE) sign-in in the browser with clientId (or through the OS broker, see inferenceIdpAuthFlow) and sends the token as Authorization: Bearer on every inference request: to inferenceGatewayBaseUrl on the gateway provider, or on Bedrock to inferenceBedrockBaseUrl, which is then required: only a proxy that validates the token accepts it, never Amazon Bedrock itself (to sign in straight to Bedrock use interactive, AWS IAM Identity Center). On Bedrock this kind has no model discovery: list the models in inferenceModels.Bearer token type. id_token (the default) sends the OIDC ID token; the receiver validates signature, iss and aud (the clientId here). access_token sends the OAuth access token, for gateways and proxies that validate as an OAuth resource server; scopes must then name the registered API scope. Either way the receiver must check aud, or it accepts any token from your tenant.IdP setup. The callback is http://127.0.0.1:<port>/callback (localhost with redirectHost: "localhost"); register exactly that. Entra: a public-client app with a Mobile and desktop applications redirect URI http://127.0.0.1/callback (omitting the path fails with AADSTS50011); in access_token mode also grant the API’s delegated permission, or sign-in fails with AADSTS65001. Okta: a Native app with http://127.0.0.1:<port>/callback and that port in redirectPort.Refresh. With offline_access the app renews the token silently and asks for a browser sign-in only when refresh fails (Google returns no id_token on refresh, so id_token mode there re-prompts about hourly).Older names. Gateway configurations written before this key use inferenceGatewayOidc / inferenceGatewayOidcAuthFlow with the interactive kind; they stay readable and mean the same sign-in.Child attributes (11)
Child attributes (11)
id_token (default), access_tokenMore detail
More detail
scopes — api://<gateway-app-id>/.default, or a named delegated scope you exposed via Expose an API. With only the standard OIDC scopes (openid profile email offline_access) Entra returns a v1.0 Microsoft Graph token whose issuer (https://sts.windows.net/<tenant>/) doesn’t match the v2.0 issuer configured here, so a gateway that validates iss rejects it. On IdPs that set the access-token audience out-of-band (Keycloak audience mapper, Auth0 default audience, Okta custom authorization server), a resource scope in scopes isn’t required — the audience comes from the IdP-side configuration.More detail
More detail
offline_access as an unknown scope; include the server’s own refresh-token scope in Scopes instead.More detail
More detail
resource=<value> on the authorization, token and refresh requests, so the access token the IdP issues is audience-restricted to the gateway or proxy rather than to the IdP’s own APIs. Use it with bearerTokenType: access_token; in id_token mode the ID token’s audience is always clientId. Ignored with the OS-broker sign-in flow (the sign-in flow key set to broker), which is Entra-only.Microsoft Entra ID: leave unset — the v2.0 endpoint rejects resource; request the API scope in scopes instead (api://<gateway-app-id>/.default). AD FS: enter one of the relying-party trust’s identifiers, spelled as it is registered there. A value with no scheme (a host name with or without a port or path, a single name, or a GUID; name:digits also reads as a host name with a port) is sent as https://<value>; an identifier with a scheme of its own (urn:…, or an organization-defined one such as VENDOR:URI:…) is sent exactly as written. A trust whose only identifier is a bare name or GUID will not match, because those are sent as https://<value>: add an https://… or urn:… identifier to the trust and enter that one here. With any other identity provider, use an absolute URI without a fragment (RFC 8707 — the IdP rejects one as invalid_target). Changing it signs users in again.127.0.0.1, localhostMore detail
More detail
inferenceStreamIdleTimeoutSec
integer
Range: 300–1,800
Since 1.44121.1
Stream idle timeout. Extra seconds to wait for model output on a streaming response that is sending only keep-alive pings. Gateway provider only. Default 300.
Self-hosted install: Server side. The host makes the model calls, so it sets how long a stream sending only keep-alive pings may wait for output.
More detail
More detail
CLAUDE_STREAM_IDLE_TIMEOUT_MS). It only helps when the gateway writes SSE keep-alive ping events (or : comment lines) into the response while the upstream model is silent — for example a LiteLLM proxy with keep-alive pings enabled in front of Amazon Bedrock. With pings arriving, Claude Code accepts at least about five minutes of keep-alives and then waits this many seconds more for real model output before abandoning the request. Gateway provider only; the other providers keep Claude Code’s defaults.A response on which nothing at all arrives — no pings — still fails after about 5 minutes regardless of this key, because at the device a silent connection cannot be told apart from a dead one. If long generations fail behind a gateway that does not send pings, configure the gateway to send them rather than raising this value. A common case is automatic compaction, in which a session sends its whole conversation in one streaming request and waits for a long summary; when that request fails, the error reads Prompt is too long · automatic compaction failed: followed by the cause. While this key is set, the app’s value takes precedence over CLAUDE_STREAM_IDLE_TIMEOUT_MS in Claude Code’s own managed settings for sessions the app starts; when it is unset, that setting still applies. Values outside 300–1800 are rejected at parse time (the error is listed in the diagnostics report) and the default applies.Anthropic
inferenceAnthropicApiKey
string
Since 1.8089.0
Claude API key. Leave blank to sign in with your browser, or to supply the key via a credential helper.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
Admin Console: Not available.
Bedrock
inferenceBedrockRegion
string
Since 1.2581.0
AWS region. AWS region for the Bedrock runtime endpoint.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
inferenceBedrockBaseUrl
string
Since 1.2581.0
Bedrock base URL. For VPC endpoints or gateway proxies. Host origin only.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
inferenceBedrockServiceTier
enum
Since 1.5186.0
Bedrock service tier. Sent as the X-Amzn-Bedrock-Service-Tier header. Leave unset for on-demand.
One of: flex, priority
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
More detail
More detail
inferenceBedrockBearerToken
string
Since 1.2581.0
AWS bearer token. Static bearer token for inference. For providers that support profile or helper-script credentials, prefer those.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
Admin Console: Not available.
inferenceBedrockSsoStartUrl
string
Since 1.6259.0
AWS SSO start URL. Enables in-app AWS sign-in (no AWS CLI needed). Set with the three SSO fields below.
Self-hosted install: Not supported. Drives a browser sign-in on the person’s computer, and a host never calls Bedrock as the person.
inferenceBedrockSsoRegion
string
Since 1.6259.0
AWS SSO region. IAM Identity Center home region.
Self-hosted install: Not supported. Configures a browser sign-in on the person’s computer, and a host-run session has no browser.
inferenceBedrockSsoAccountId
string
Since 1.6259.0
AWS SSO account ID. 12-digit AWS account ID assigned to users in IAM Identity Center.
Self-hosted install: Not supported. Names an AWS account for a browser sign-in on the person’s computer, which a host never performs.
inferenceBedrockSsoRoleName
string
Since 1.6259.0
AWS SSO role name. IAM Identity Center permission-set name granting bedrock:InvokeModel* on the account above.
Self-hosted install: Not supported. Names an AWS role for a browser sign-in that is only possible on the person’s computer.
inferenceBedrockProfile
string
Since 1.2581.0
AWS profile name. AWS named profile to use for Bedrock inference credentials.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
inferenceBedrockAwsDir
string
Since 1.2581.0
AWS config directory. Folder with AWS config/credentials. Defaults to ~/.aws when no bearer token is set.
Self-hosted install: Not supported. Names a folder on the person’s computer that a host does not have.
inferenceBedrockAwsCliPath
string
Since 1.13576.0
AWS CLI path. Absolute path to the aws executable. Leave unset to find it on PATH.
Self-hosted install: Not supported. Names a program on the person’s computer, and a host has no such program, browser or person.
Vertex
inferenceVertexProjectId
string
Since 1.2581.0
GCP project ID. Google Cloud project ID for Vertex AI inference.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
inferenceVertexRegion
string
Since 1.2581.0
GCP region. GCP region where your Vertex AI Claude models are deployed.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
inferenceVertexBaseUrl
string
Since 1.2581.0
Vertex AI base URL. PSC endpoint, if using one.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
inferenceVertexOAuthClientId
string
Since 1.2581.0
Vertex OAuth client ID. Desktop-app OAuth client ID. Enables Sign in with Google instead of a credentials file.
Self-hosted install: Not supported. Configures a Google browser sign-in on the person’s computer, and a host calls Vertex as its own identity.
inferenceVertexOAuthClientSecret
string
Since 1.2581.0
Vertex OAuth client secret. Secret for the Desktop-app OAuth client above. Google classifies installed-app client secrets as non-confidential, so this may be set from hosted config.
Self-hosted install: Not supported. Secret for the person’s own Google sign-in, and a host calls Vertex as its own Google identity.
inferenceVertexOAuthScopes
string
Since 1.2581.0
Vertex OAuth scopes. Override the Google OAuth scopes (space-separated). Leave blank for the default.
Self-hosted install: Not supported. Sets scopes for a browser sign-in on the person’s computer, and a host calls Vertex as its own identity.
inferenceVertexOAuthLoginHint
string
Since 1.12603.0
Vertex OAuth login hint. Pre-fill Google’s account chooser and forward to your federated IdP. {username} expands to the OS login name.
Self-hosted install: Not supported. Steers a browser sign-in on the person’s computer, and a host calls Vertex as its own Google identity.
inferenceVertexWorkforceAudience
string
Since 1.10628.0
Workforce Identity audience. Workforce-pool provider audience. When set, sign-in uses your own IdP plus a GCP STS exchange instead of a Google identity.
Self-hosted install: Not supported. Configures a sign-in the person completes on their computer, and a host calls Vertex as its own identity.
inferenceVertexWorkforceUserProject
string
Since 1.10628.0
Workforce Identity billing project. GCP project for STS billing and quota. Defaults to the Vertex project ID above.
Self-hosted install: Not supported. Bills the exchange of the person’s own sign-in token, and a host calls Vertex as its own identity.
inferenceVertexWorkforceAuthFlow
enum
Since 1.25927.0
Workforce Identity sign-in flow. How the IdP sign-in runs: system browser (default) or the OS Microsoft Entra broker.
One of: browser, broker
Self-hosted install: Not supported. Chooses how the person signs in on their computer, and a host calls Vertex as its own identity.
More detail
More detail
browser(default) — opens the system browser for an authorization-code (PKCE) sign-in on a loopback redirect URI. See the IdP setup notes oninferenceGatewayOidcfor redirect-URI registration; the same rules apply here.broker— signs in through the OS identity broker (Web Account Manager on Windows, Company Portal on macOS). Requires the workforce-pool IdP to be Microsoft Entra ID — theissueroninferenceVertexWorkforceOidcmust behttps://login.microsoftonline.com/{tenant-id}/v2.0. The broker satisfies Conditional Access policies that require a compliant/managed device or token protection, and needs no loopback redirect. The Entra app registration must include the broker redirect URIsms-appx-web://Microsoft.AAD.BrokerPlugin/{client-id}(Windows) andmsauth.com.anthropic.claudefordesktop://auth(macOS) under the Mobile and desktop applications platform. Not supported on Linux.
inferenceVertexWorkforceOidc
object
Since 1.10628.0
Workforce Identity IdP (OIDC). Your organization’s OIDC IdP. The app runs an authorization-code-with-PKCE flow against this issuer and exchanges the returned ID token at GCP STS.
Self-hosted install: Not supported. Sets up the person’s sign-in on their own computer, and a host calls Vertex as its own Google identity.
Child attributes (9)
Child attributes (9)
127.0.0.1, localhostMore detail
More detail
inferenceVertexCredentialsFile
string
Since 1.2581.0
GCP credentials file path. Absolute path to service-account JSON. Leave blank to fall back to ADC.
Self-hosted install: Not supported. Names a file on the person’s computer that no host has.
Foundry
inferenceFoundryResource
string
Since 1.2581.0
Azure AI Foundry resource name. Azure AI Foundry resource name used to construct the endpoint URL.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
inferenceFoundryBaseUrl
string
Since 2.110.0
Azure AI Foundry base URL. Full base URL for a gateway or proxy in front of Foundry, path included (replaces https://RESOURCE.services.ai.azure.com/anthropic).
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
More detail
More detail
<value>/v1/messages instead of https://<resource>.services.ai.azure.com/anthropic/v1/messages, carrying the same credential and headers the app would send to Foundry: each user’s Entra ID token for the Azure Cognitive Services audience as Authorization: Bearer with Entra sign-in, otherwise the API key or the credential helper’s output. Claude Code sessions receive the value as ANTHROPIC_FOUNDRY_BASE_URL, so use the same value you would give Claude Code in a terminal. inferenceFoundryResource is still required and should name the resource behind the gateway; the app sends nothing to the resource directly while this is set. Must be https, or http to a proxy at a loopback address on the device itself (127.0.0.1, localhost or [::1]).inferenceFoundryApiKey
string
Since 1.2581.0
Azure AI Foundry API key. API key for Azure AI Foundry inference.
Self-hosted install: Not supported. Part of the device’s own route to the model, and a session host’s route is its operator’s to set.
Admin Console: Not available.
inferenceFoundryTenantId
string
Since 1.9255.0
Entra ID tenant ID. Directory (tenant) ID of the Entra ID app registration that has the Cognitive Services scope.
Self-hosted install: Not supported. Names the tenant for an Entra sign-in on the person’s computer.
inferenceFoundryClientId
string
Since 1.9255.0
Entra ID client ID. Application (client) ID of the Entra ID app registration. Device-code sign-in requires the app to allow public client flows.
Self-hosted install: Not supported. Configures an Entra sign-in the person completes on their computer.
inferenceFoundryAuthFlow
enum
Since 1.19367.0
Entra ID sign-in flow. How Entra sign-in runs: device code (default), system browser, or the OS identity broker.
One of: device-code, browser, broker
Self-hosted install: Not supported. Chooses how the person’s Entra sign-in runs on their computer.
More detail
More detail
device-code(default) — shows a code to enter at microsoft.com/devicelogin. The app registration must have Allow public client flows enabled.browser— opens the system browser for an authorization-code (PKCE) sign-in on a loopback redirect URI. The app registration must includehttp://127.0.0.1/callbackunder the Mobile and desktop applications platform (Entra ignores the loopback port, but not the path). Works with Allow public client flows disabled, and is unaffected by Conditional Access policies that block device-code authentication.broker— signs in through the OS identity broker (Web Account Manager on Windows, Company Portal on macOS), so it can satisfy Conditional Access policies that require a compliant/managed device or token protection. The app registration must include the broker redirect URIsms-appx-web://Microsoft.AAD.BrokerPlugin/{client-id}(Windows) andmsauth.com.anthropic.claudefordesktop://auth(macOS) under the Mobile and desktop applications platform. Not supported on Linux.
broker as unset and use device code.Models
modelDiscoveryEnabled
boolean
Since 1.8089.0
Model discovery. Auto-populate the model picker from the provider at launch.
Self-hosted install: Not supported. A session host states the models it offers, so Desktop discovers none itself, whatever this says.
More detail
More detail
modelPrefer1mContext
boolean
Since 1.28929.0
Use 1M wherever it’s available. Every model that offers 1M, in your list or from your gateway, shows one option and requests 1M.
Self-hosted install: Server side. When on, the host gives a session that names no model the 1M-token context, and tells Desktop.
More detail
More detail
inferenceModels entry sets supports1m or, under discovery, when your gateway’s model list marks it. Equivalent to setting prefer1m on each of those entries, but also applies under dynamic discovery. To leave one listed model out, remove its supports1m. Beside a model list in which no entry sets supports1m, this setting does nothing. Older Claude Desktop versions show both options and only start the default model on its 1M option.inferenceModels
object[]
Since 1.2581.0
Model list. Override the auto-discovered model list. First entry is the default.
Self-hosted install: Server side. The host runs a session only on a model from this list, and tells Desktop what to show.
More detail
More detail
claude-sonnet-5), Bedrock inference-profile IDs (us.anthropic.claude-sonnet-5), or Foundry deployment names. Entries may be plain ID strings or objects.Gateway: the name must be the exact ID your gateway’s /v1/models endpoint returns. If you set supports1m on an alias (sonnet) but discovery returns the full ID, the variant won’t appear.Extended context (supports1m) is a capability assertion you make about your deployment; only set it for models you’ve confirmed support the 1M-token window:"claude-sonnet-5[1m]" is shorthand for the same entry. When an ID is listed both bare and with [1m] (as a gateway lists it), the picker shows one model with a 1M variant; put labelOverride on the bare entry (a label on the [1m] spelling is ignored there); tier-tagged entries are not folded. prefer1m: true (no effect without supports1m) shows only the 1M variant of the model. Under dynamic discovery (no explicit list), set modelPrefer1mContext instead.Display label (labelOverride) is for IDs the picker can’t derive a friendly name from (Bedrock ARNs, gateway routing aliases). Display-only; name is still what the app sends:anthropicFamilyTier) tells the app which Claude tier (haiku/sonnet/opus/fable/mythos) an entry stands in for, so bare tier aliases (e.g. in Code sessions) resolve to your model. isFamilyDefault: true picks the winner when several entries share a tier:claude-sonnet-5 by default, so include that exact ID in the list (see autoModeEnabled).Child attributes (7)
Child attributes (7)
sonnet, opus, haiku, fable, mythoslow, medium, high, xhigh, maxdefaultModelEffort
enum
Since 2.110.0
Default model effort. Effort level the default model (the first listed model) starts at, instead of Anthropic’s recommended level: low, medium, high, xhigh or max.
One of: low, medium, high, xhigh, max
Self-hosted install: Server side. The host sets the effort of a session that names none, and tells Desktop what to preselect.
More detail
More detail
inferenceModels entry, or the first model your endpoint returns under discovery) starts at in Chat, Cowork and Code, in place of Anthropic’s recommended level for that model: one of low, medium, high, xhigh, max. It is a starting point, not a lock: a person’s own effort choice for that model still applies unless alwaysStartWithDefaultModel is on, and other models keep their recommended level. A level the model doesn’t offer falls to the nearest level it offers below it (its lowest level when none is lower), and it never exceeds that model’s maxEffort. In Code sessions a CLAUDE_CODE_EFFORT_LEVEL environment variable or an effortLevel in Claude Code’s own settings still takes precedence, as it does over any picker default.alwaysStartWithDefaultModel
boolean
Since 2.110.0
Always start with the default model. New conversations and tasks start on the default model and effort level, not each person’s last-used ones. People can still change both for the current one.
Self-hosted install: Server side. Desktop’s model picker acts on it, starting each new session on the default model.
More detail
More detail
true, each new conversation or task in Chat, Cowork and Code starts on the default model (the first inferenceModels entry), and the model and effort choices a person makes are no longer saved as their defaults. When unset or false, a person’s last model and effort choice is remembered per tab, as before. Choices saved before the setting was turned on are kept and apply again if it is turned off.inferenceModelPricingEnabled
boolean
Since 1.37937.0
Show estimated cost. Show an estimated cost on the Usage page at Anthropic list price; turn on to set a multiplier or per-model rates.
Self-hosted install: Server side. When on, the host gives its sessions the admin’s rates and multiplier; Desktop shows cost once they report it per turn.
More detail
More detail
true turns on a USD estimate priced at Anthropic’s published list price and is the only switch that does: inferenceModelPricingMultiplier and inferenceModelPricing refine the estimate while this is on and are ignored otherwise; turning this off hides them in the config editors without clearing them. Claude Code performs the calculation, so the same figures appear in its own cost reporting for Code sessions. Model IDs Claude Code cannot map to a Claude model (an opaque gateway alias, an inference-profile ARN it cannot resolve) are left out of the estimate until inferenceModelPricing gives them a rate. A machine-level Claude Code managed modelPricing (MDM / managed-settings.json / server-managed) takes precedence over all three keys.inferenceModelPricingMultiplier
number
Range: 0–1
Since 1.37937.0
Price multiplier. Scales every estimated cost (0.85 = 85% of the price); between 0 and 1.
Self-hosted install: Server side. While Show estimated cost is on, the host hands Claude Code this multiplier for the cost its sessions report.
More detail
More detail
modelPricing.multiplier: a number in (0, 1] applied to every computed cost, whether the model was priced at Anthropic list price or by an inferenceModelPricing row; use it for a flat contracted discount. Applies only while inferenceModelPricingEnabled is true; on its own it does not turn the estimate on. Ignored when a machine-level Claude Code managed modelPricing is present.inferenceModelPricing
object[]
Since 1.37937.0
Model pricing. Per-model rates replacing Anthropic list price in the Usage page’s estimate.
Self-hosted install: Server side. While Show estimated cost is on, the host hands Claude Code these rates for the cost its sessions report.
More detail
More detail
inputPerMtok, outputPerMtok, cacheReadPerMtok, cacheWritePerMtok, all four required; cacheWritePerMtok prices both 5-minute and 1-hour cache writes); rows apply only while inferenceModelPricingEnabled is true and do not turn the estimate on by themselves. Mirrors Claude Code’s managed modelPricing.overrides, and name is matched the same way: a built-in Claude model ID (e.g. claude-sonnet-4-6, or its Bedrock, Vertex, or Foundry ID) covers every dated and provider spelling of that model; any other value (a gateway alias, an inference-profile ARN) matches that exact ID only (case-insensitive) and wins over a built-in row. An ID Claude Code cannot map to a Claude model at all gets no estimate until a row here prices it. inferenceModelPricingMultiplier still applies on top of a row.modelPricing (MDM / managed-settings.json / server-managed) takes precedence over this table.Child attributes (5)
Child attributes (5)
modelCatalogEnabled
boolean
Since 2.110.0
Model catalog metadata. Fetch the published Claude Code model catalog to get model picker names, descriptions, and effort options. When off, the app uses only its bundled copy.
Self-hosted install: Server side. The host serves the model catalog’s rows to Desktop, and to nobody for whom this is off.
Admin Console: Not available.
More detail
More detail
downloads.claude.ai, or from modelCatalogUrl when that is set, and verified against a key built into the app; a copy bundled with the app is used until one has been fetched, or when the host is unreachable) and uses it to fill in each picker entry’s display name, description, and thinking/effort options in the Chat, Cowork, and Code tabs. It never changes which models are offered, their order, or the default model (the first inferenceModels entry): those, 1M-context variants, and labelOverride still come from inferenceModels / discovery, and a model the catalog does not list keeps the built-in label. With modelCatalogEnabled: false, the app makes no catalog request and ignores any copy it fetched earlier. Picker names, descriptions, effort options, and recommended effort levels then come from the copy bundled with the installed app version, so they change only with app updates; labelOverride, defaultModelEffort, and maxEffort still apply. A model that copy does not list, typically one released after that version, may show no effort options until the app is updated. Applies to deployments configured on the device or by a bootstrap server; an install managed from the Claude admin console takes its model names and options from the console’s settings and never fetches the catalog.modelCatalogUrl
string
Since 2.110.0
Model catalog URL. Fetch the model catalog and its signature file from this URL (a mirror inside your network serving Anthropic’s published files) instead of downloads.claude.ai.
Self-hosted install: Server side. Only Desktop versions too old to take the model catalog’s rows from their session host fetch from here.
Admin Console: Not available.
More detail
More detail
.raw-sig.json appended to the path) from this URL instead of https://downloads.claude.ai/model-catalog/v1/catalog.json, for a gateway or mirror inside your network serving Anthropic’s two published files byte-for-byte. The document is still verified against the key built into the app, so an edited or re-signed copy is refused and the app keeps its last verified copy (or the bundled one); there is no key to configure. https:// is required (http:// only to a loopback address, and only when set on the device itself; a bootstrap server may not deliver a loopback or non-https:// value); the server must answer the GET directly (redirects are not followed) and may honor If-None-Match with 304, and must serve a document at least as new as the one the install last accepted (or the bundled seed) — an older one is refused and re-fetched on the retry interval until the mirror catches up. Ignored when modelCatalogEnabled is false, and on an install managed from the Claude admin console (which never fetches the catalog). A value that is not a valid URL, names a link-local or cloud-metadata host (e.g. 169.254.169.254, metadata.google.internal), or is a loopback / non-https:// value a bootstrap server delivers, turns the catalog fetch off (no fallback to downloads.claude.ai); the last fetched or bundled copy keeps labelling the pickers. On an install configured for a bootstrap server, the default location is not fetched until the server’s configuration applies after sign-in, so a device does not poll downloads.claude.ai while the server may yet name a mirror; a mirror URL set on the device, cached earlier, or served in a pre-sign-in subset still fetches. Diagnostics report the location only as hosted, custom, invalid or pending; the value itself is treated like bootstrapUrl: host name only in telemetry, printed in full in the diagnostics bundle.Capabilities
Cowork surface
coworkTabEnabled
boolean
Default: true
Since 1.9659.0
Allow Cowork. Enable Cowork. Claude works on longer tasks like research, analysis, and documents.
Self-hosted install: Not supported. On a session host desktopHome alone decides Cowork: to turn Cowork off, set desktopHome to off in its policy document.
Code surface
isClaudeCodeForDesktopEnabled
boolean
Default: true
Since 1.2581.0
Allow Code. Enable Code. Claude writes and runs code.
Self-hosted install: Server side. The host refuses Code sessions and routines where the tab is off, and tells Desktop to hide it.
sshHostAllowlist
string[]
Since 1.40609.0
SSH host allowlist. SSH hosts for Code sessions. Unset: off unless the device’s Claude Code managed settings list hosts. An admin’s empty list: off even then. * allows any host.
Guide for this setting
Self-hosted install: Not supported. Governs SSH sessions started from the person’s computer, which self-hosted installs never offer.
More detail
More detail
build01.corp.example.com) or *. wildcards (*.corp.example.com matches the apex and subdomains at any depth); matching is case-insensitive and ignores a user@ prefix. The list is compared with the HostName that the user’s SSH configuration (~/.ssh/config) gives for the host they entered, or with the entered host itself when the configuration has no entry for it or cannot be evaluated. So an alias is allowed when the host it points to is listed, whatever the alias is called, and refused when it is not. A session’s jump hosts (ProxyJump, or ProxyCommand ssh -W %h:%p host) must be listed too, by HostName. One the app fails to read, and any other ProxyCommand (ssh -i…), is permitted when the resolved host matches (this key governs which hosts the app offers, not network egress). The built-in SSH library refuses every ProxyJump.This is opt-in because a remote session runs Claude Code on the SSH host and the app forwards the session’s inference credential to it, plus your OTLP collector endpoint and auth headers when otlpEndpoint is set. List only hosts you trust with those. Token-based credentials are forwarded. File-based credentials (Bedrock IAM Identity Center sign-in or AWS profile, Vertex Google sign-in or a credentials file) are never forwarded, and a session that needs one from the device is refused.If this key is unset, an sshHostAllowlist in Claude Code’s own managed-settings file on the device still applies; when both are set, this key wins where the app’s configuration is admin-managed (MDM, the admin console, or a device-managed bootstrap URL) and otherwise applies only while that file sets none. allowedWorkspaceFolders still applies on the remote host. Claude Code’s managed settings on a host replace the sandbox, network, permission, and MCP rules this app sends unless they set parentSettingsBehavior to "merge".sshClientPath
string
Since 1.46388.1
SSH client program. Absolute path to the OpenSSH ssh program the app runs for SSH sessions. Unset: the first ssh on the user’s PATH.
Guide for this setting
Self-hosted install: Not supported. Names the ssh program on the person’s computer, and self-hosted installs offer no SSH sessions.
More detail
More detail
ssh: evaluating the user’s SSH configuration (ssh -G), making the SSH connection and its channels, and the Code tab’s terminal. ssh-keygen and ssh-add are taken from the same directory when they exist there, otherwise from PATH. The program must be OpenSSH 7.6 or newer. To carry the connection on Windows it must be Win32-OpenSSH 9.4 or newer, or another OpenSSH 8.5 or newer under Program Files, such as Git for Windows’ usr\bin\ssh.exe, only where device policy, or the configuration server it names, sets this key and sets the SSH connection engine setting to system-openssh; the app points such a client at the .ssh folder of the user’s Windows profile, and asks for a password, code or key passphrase only on a direct connection (no jump host, ProxyCommand, Match exec, KnownHostsCommand, PKCS11Provider or SecurityKeyProvider); otherwise only a key that needs nothing typed signs in. Set such a client only on desktops with one user. On macOS and Linux a wrapper script that ends in one is accepted, on Windows it must be an .exe (no .cmd, .bat or .ps1). When this key is set and the program is missing, cannot be run, or is too old, SSH sessions fail with an error telling the user to ask their IT administrator — the app never falls back to another ssh. The connection itself runs through this program on the system-OpenSSH engine, which the SSH connection engine setting’s system-openssh value selects on every platform; when the app’s built-in SSH library makes the connection instead, this key still governs configuration evaluation (ssh -G), host-key lookups (ssh-keygen) and the terminal. On a device that a Claude.ai sign-in has moved to an admin-console organization (see disableDeploymentModeChooser), the device profile’s value is ignored: set the key in admin settings (which cannot name such a client). There, until the organization’s configuration has loaded, no client is pinned.sshTransport
enum
Since 1.52386.0
SSH connection engine. Which SSH engine carries Code sessions: the OpenSSH ssh program on the device, or the app’s built-in SSH library. Unset or auto: the build’s default.
One of: auto, system-openssh, builtin
Guide for this setting
Self-hosted install: Not supported. Chooses the SSH engine on the person’s computer, and self-hosted installs offer no SSH sessions.
More detail
More detail
system-openssh: the app makes every SSH connection by running an OpenSSH ssh program — the one sshClientPath names, otherwise the first ssh on the user’s PATH (on Windows, a Win32-OpenSSH ssh.exe: the PATH one, else the in-box or Microsoft-installed client) — so the organization’s own OpenSSH build, with its Kerberos/GSSAPI, certificate and ssh_config support, is what authenticates. The program must be OpenSSH 7.6 or newer (Windows: Win32-OpenSSH 9.4 or newer, or another OpenSSH that sshClientPath names: see that key). When sshClientPath is set and that program cannot be used, sessions fail with an error telling the user to ask their IT administrator rather than falling back; when it is unset and Windows has no usable client, the built-in library is used.builtin: the app’s built-in SSH library makes the connection, whatever the build’s default.auto or unset: the build’s default engine.An explicit value overrides the default at each host’s next connect or reconnect. An open app takes a device profile’s change at its next configuration check. From a configuration server it takes only builtin, once two checks in a row return it (about 12 minutes by default); other values wait until it is reopened or the user signs in again. A value that cannot be read, such as a misspelling, counts as builtin and waits likewise. Once a server’s configuration has loaded it decides, even if it omits the key; until then the device profile’s value applies. On a device that a Claude.ai sign-in has moved to an admin-console organization (see disableDeploymentModeChooser), the device profile’s value is ignored: set the key in the admin console. There, until the organization’s configuration has loaded, the build’s default engine is used.Chat surface
chatTabEnabled
boolean
Since 1.13576.0
Allow Chat. Enable Chat. Quick questions and drafting.
Self-hosted install: Not supported. No Chat session can start on a session host, so the switch has nothing to turn on or off there.
desktopHome
enum
Since 1.52386.0
Desktop home. Unifies Chat and Cowork into one home. When set, it replaces Allow Chat, Advanced file analysis, and Allow Cowork. Leave unset to keep those.
One of: standard, off
Self-hosted install: Server side. Alone decides Cowork, which is on only while this is unset or standard; else the host refuses it and Desktop hides it.
More detail
More detail
standard turns on Unified Claude, which combines Chat and Cowork into one experience. off turns Chat and Cowork off entirely. isClaudeCodeForDesktopEnabled still decides Code. Remove the key to hand control back to chatTabEnabled, chatAdvancedFileAnalysisEnabled, and coworkTabEnabled. Values are case-sensitive, so Standard is not recognized. A value that the app does not recognize is read as off, so update the app on devices before you deploy a value added in a later version.chatAdvancedFileAnalysisEnabled
boolean
Since 1.14271.0
Advanced file analysis. Allow Claude to run code in a local sandbox to analyze attached files it can’t read natively — like Excel and PowerPoint. Off by default.
Self-hosted install: Not supported. Configures a Chat session’s local sandbox, and no Chat session can start on a self-hosted install.
More detail
More detail
coworkEgressAllowedHosts, and no others. If that list is unset or empty, they have no network access. With * in the list they can reach any host, as in Cowork. Plugin CLIs are the exception: they can always reach the hosts their plugin declares, plus the listed hosts (with *, only the declared hosts). Older app versions give the sandbox no network access by default.As in Cowork, commands run without an approval prompt. So they can upload anything the sandbox can read to a listed host, and run what they download from one. To have Claude ask before each command, set Bash to ask in builtinToolPolicy, which also applies to Cowork and Code. To let commands install packages, list the hosts of the package manager’s default index (for pip, pypi.org and files.pythonhosted.org). For a private mirror, list its host instead. Nothing points package managers at a mirror, so each command must name it (for pip, --index-url).Project folders are not available in the sandbox of a chat started while a rule on Read, Grep or Glob is set: in disabledBuiltinTools, in builtinToolPolicy with a value other than allow, or as a deny or ask rule in Claude Code’s own managed settings on the device, whether or not the rule covers the folder. They are not available either where those managed settings cannot be read, or where Claude Code takes its managed settings from a gateway. Claude’s file tools still read what the rules allow.Workspace
coworkEgressAllowedHosts
string[]
Since 1.2581.0
Allowed egress hosts. Hosts agent tools may reach in Cowork and Chat (Code: in part). An empty list acts as unset for tools, but stops Claude opening sites in the built-in browser.
Guide for this setting
Self-hosted install: Server side. Tools in the host’s sessions make the network calls, so the host limits which addresses they may reach.
More detail
More detail
* also bounds where Claude may browse in the built-in browser. When unset, Cowork and Chat refuse web fetch.Entries are exact hostnames (api.github.com), wildcards (*.corp.com matches subdomains at any depth, not corp.com itself), or * to allow all. IP addresses match only when listed exactly. In Cowork and Chat, web fetch always blocks localhost and private addresses, and shells reach only listed hosts (not your inference provider’s, unless listed), or none when unset. Code’s shell obeys that limit only on macOS, and with bubblewrap and socat on Linux or WSL2; elsewhere, Windows included, it reaches any host. Code’s web fetch isn’t limited.Any entry except bare * may carry a :port suffix (*.corp.com:8443) restricting it to that port. IPv6 literals are not supported. Invalid entries are dropped with a log warning and the rest still work. An unreadable value counts as an empty list. Ports are enforced for the Cowork sandbox’s web fetch, shell, and package-install egress; plugin CLIs also reach hosts their plugin declares and ignore port-scoped entries for now, and the Code translation treats them as the bare host. Only deploy port-scoped entries once your whole fleet supports them (disableAutoUpdates pins builds). On an older build, a single one invalidates the session’s whole shell and package-install allowlist.Open listed hosts on your network firewall too.allowedWorkspaceFolders
object[]
Since 1.2581.0
Allowed workspace folders. Folders where Claude may work. Applies to Cowork and Code sessions and to the project folders a chat reads. Leave unset for unrestricted access.
Self-hosted install: Server side. The host refuses file access outside folders listed as full paths, and Desktop checks those listed with ~ or a variable.
More detail
More detail
~ and these environment variables, expanded per user: %OneDrive%, %OneDriveCommercial%, %OneDriveConsumer%, %APPDATA%, %LOCALAPPDATA%, %USERNAME%, %XDG_DOCUMENTS_DIR%. The set is fixed; an entry that references any other %VAR%, or one that is unset on the device, allows none.Each folder is interpreted on the machine the session runs on. For a Code session on an SSH host, ~ means the remote user’s home, an entry that references a %VAR% allows none there, and the session’s working directory must be inside one of the folders as they exist on that host. One list serves every machine: ["~/work", "/srv/work"] governs ~/work for each user, on a managed Mac or a Linux host, and /srv/work on a host that has it. A folder that names nothing real on a given machine allows nothing there. On an SSH host, an entry counts only if it is an absolute path as that host spells one (~/work, not work; on Windows C:\work, not \work), with no ... On Linux or Mac a \ counts as /, except a leading \\. One inside another listed folder does not count on its own (its read-only mode still applies); if it is a link, list the folder it points to. An empty list allows none; unset leaves access unrestricted.A listed folder is one Claude may write as well as read, unless the entry’s mode (Access mode in Setup) makes it read-only; that field’s own description says how far read-only reaches. A Code session can reach every listed folder, not only the one it was opened in. Setting this key also turns on Claude Code’s sandbox where it runs (macOS, or Linux and SSH hosts with bubblewrap): there a shell command normally writes in the listed folders without an approval prompt, and its writes to most other places, such as a package cache in the home directory, are refused. A home directory holds shell start-up files and SSH keys, so list work folders, not a whole home directory.The list also limits which folders of a project a chat reads.Child attributes (3)
Child attributes (3)
rw, roMore detail
More detail
* ? [ ] ( ) { } | + or a double quote. List each folder by its real path: shell commands may not be stopped in a folder listed through a link. Not enforced on Windows hosts, nor on a host with Claude Code managed settings of its own unless they set parentSettingsBehavior to merge. Not covered: MCP servers, hooks, the terminal, commands in sandbox.excludedCommands, and git worktrees, which Claude Desktop and Claude Code still create inside the folder.If a read-only entry’s %VAR% cannot be filled in (unset, unsupported, or any %VAR% over SSH), the folder above the variable is read-only instead, or every listed folder if the entry names none above it. A variable that only another operating system sets (%APPDATA% on macOS) leaves the entry without effect while it is unset there.A read-only folder that contains Claude’s own data directory (for example the home folder; over SSH, ~/.claude on the host) is enforced in Cowork only. Configure narrower folders for Code coverage. Over SSH, keep a Claude Code config folder moved by CLAUDE_CONFIG_DIR outside read-only folders.blockReadsOutsideWorkingDirectories
boolean
Since 1.46388.1
Block reads outside working directories. Keep Claude from reading files outside a Code session’s working directories. File tools refuse such reads; sandboxed shell commands lose the home directory.
Self-hosted install: Server side. The host starts Code sessions, so it hands Claude Code the block on reads outside their folders.
More detail
More detail
true, Code sessions refuse reads outside their working directories (the session folder plus any allowedWorkspaceFolders). The file tools (Read, Grep, Glob) refuse them in every permission mode; where Claude Code’s sandbox runs (macOS, or Linux and SSH hosts with bubblewrap, once allowedWorkspaceFolders is set or an egress allowlist applies: in third-party deployments one applies unless coworkEgressAllowedHosts contains *, in first-party deployments none does) shell commands cannot see the home directory and other user folders (/Users, /home, mounted volumes) and a read there is refused with no prompt; elsewhere (Windows, Linux without bubblewrap, or neither folders nor an egress allowlist in effect) such shell reads prompt for approval. The app keeps the user’s git configuration files (which may themselves embed credentials such as URL tokens; a symlinked one stays hidden), its own Claude Code installation, and the session’s plugin and attachment folders readable (not on a Windows SSH host, where plugin files and attachments stay out of the file tools’ reach under the block). An allowed folder that is or contains the home directory leaves it readable.Users can re-open folders (even their whole home) in their own Claude Code settings with sandbox.filesystem.allowRead or permissions.additionalDirectories; settings files tracked in a git repository cannot. The key travels on Claude Code’s managed-settings channel: another Claude Code managed-settings source replaces it unless that source sets parentSettingsBehavior to "merge", and one that sets sandbox.filesystem.allowManagedReadPathsOnly reduces it to approval prompts. This is permissions.blockReadsOutsideWorkingDirectories in Claude Code’s managed settings.Unset (default): nothing changes.autoModeEnabled
boolean
Since 1.10628.0
Allow Auto mode. Offer Auto mode in Code (on unless set to false); set to true to also offer it in Cowork as “Automatically approve”. Claude decides which actions need approval.
Self-hosted install: Server side. The host allows or refuses Auto mode for the sessions it runs, and tells Desktop what to offer.
More detail
More detail
permissions.defaultMode, takes precedence, and Cowork does not offer it. Set to true to also offer Automatically approve in Cowork (Cowork sessions still start by asking before each action until the user picks it). Set to false to remove the option from both tabs. In Auto mode Claude runs a safety classifier on each action and only prompts for approval on actions it judges risky, instead of following the static per-tool policy.Requires a session model that supports the safety classifier — which models qualify depends on the deployment’s provider and the app version. With a model that lacks support the option is greyed out and Code sessions do not start in it. builtinToolPolicy and this key may both be set; Auto mode is a user-selectable option alongside the default policy, not a replacement for it.By default on a gateway, the safety classifier sends its own requests through your gateway to Claude Sonnet 5, whatever model the session uses. Make sure your gateway accepts the exact ID claude-sonnet-5 and the context-1m-2025-08-07 value in the anthropic-beta request header. If you set inferenceModels, list that ID there and in any group’s model list (no supports1m needed). Sonnet 5 then also shows in the model picker. If the gateway rejects those requests or the list omits the ID, Auto mode stays available but can block actions it would otherwise allow. In Code, users see those actions marked Blocked.In Code sessions, a separately deployed Claude Code managed-settings file that sets disableAutoMode to "disable" also keeps Auto mode hidden and off, whatever this key says.disableBypassPermissionsMode
boolean
Since 1.46388.1
Disable bypass permissions mode. Remove the bypass permissions mode from Code sessions and Cowork tasks, so Claude always follows the permission policy. Off by default.
Self-hosted install: Not supported. A session host never offers bypass mode, so every session it runs already has it off.
More detail
More detail
true, sessions cannot run in bypass permissions mode: the app stops offering the mode in Code and Cowork, and a session that requests it anyway is downgraded. This is the disableBypassPermissionsMode setting from the permissions section of Claude Code’s managed settings; a separately deployed Claude Code managed-settings file that sets it to "disable" also removes the mode, whichever source sets it.Unset (default): users the deployment otherwise allows can choose bypass permissions mode.disableBundledSkills
boolean
Since 1.15962.0
Disable bundled skills and workflows. Disables Claude Code’s bundled skills and workflows (deep-research and similar). Use where WebFetch/WebSearch aren’t available.
Self-hosted install: Server side. The host starts Claude Code, so it is the one that turns the bundled skills off.
skillCreationEnabled
boolean
Since 1.25927.0
Allow user-created skills. Allow users to create and upload their own skills. When off, the creation and upload surfaces are hidden and the agent’s skill-creation tools are disabled.
Self-hosted install: Server side. The host stores people’s skills, so when this is off it refuses new ones and tells Desktop to hide creation.
More detail
More detail
false to block user skill creation: the skill-creation and upload surfaces are hidden (the skill_creation feature is served as blocked by the organization), and the agent’s skill-creation tools (saving skills from a conversation, skill proposals) are not offered in sessions — the same effect as turning off the User-created skills organization setting available to claude.ai enterprise admins.This is a feature-availability control enforced in the app’s UI, not a data boundary: skills are files on the user’s machine, and files already present there (or placed there outside the app) are not removed or blocked by this key. Skills themselves remain usable; organization-distributed plugins and bundled skills are unaffected (to disable bundled skills, use disableBundledSkills).userPluginMarketplacesEnabled
boolean
Since 1.37937.0
Allow user-added plugin marketplaces. Allow users to add plugin marketplaces. When off, marketplaces your organization did not provision are hidden and the app’s sessions do not load their plugins.
Self-hosted install: Server side. Desktop hides and refuses adding a marketplace when off; no session host loads a person’s own marketplaces yet.
More detail
More detail
false to restrict plugins to your organization’s marketplaces: the add-marketplace surfaces are hidden, and the app refuses adds that still reach it (deep links, stale UI). Any other marketplace present on the device is then hidden in every tab, whether a user added it in the app earlier or something outside the app registered it (for example Claude Code in a terminal, under ~/.claude): its plugins are not listed, and installs and updates from it are refused. The sessions the app starts load plugins only from your organization’s marketplaces, the organization plugins directory, the app’s own uploads and the user’s own skills folder, enforced through Claude Code’s marketplace allowlist (strictKnownMarketplaces, passed as the app’s managed settings). Nothing is deleted: removing the key or setting it back to true restores them. Marketplaces provisioned by your organization (allowedPluginMarketplaces) and the organization plugins directory are unaffected, and plugins users uploaded are governed by userPluginUploadsEnabled, not this key.This is a feature-availability control, not a data boundary. Claude Code in a terminal reads the same ~/.claude folder and is governed only by its own managed settings, not by this key. Claude Code may ignore this allowlist on a device that deploys its own Claude Code managed settings; restrict marketplaces in those settings as well.This key applies only while the app runs in third-party mode. If users could otherwise sign in to Claude.ai on the device, also set disableDeploymentModeChooser so the app stays in third-party mode.userPluginUploadsEnabled
boolean
Since 1.37937.0
Allow user-added plugins. Allow users to add their own plugins. When off, every in-app option for adding one is hidden and uploads that still reach the app are refused.
Self-hosted install: Server side. The host keeps the plugins people upload and loads them in their sessions, and refuses new ones when this is off.
More detail
More detail
false to stop users adding plugins of their own: every in-app option for doing so is hidden, and the app refuses uploads that still reach it.This is a feature-availability control enforced in the app, not a data boundary: plugins already installed (or placed on disk outside the app) are not removed or blocked by this key. Plugins from organization-provisioned marketplaces and the organization plugins directory are unaffected.This key applies only while the app runs in third-party mode. If users could otherwise sign in to Claude.ai on the device, also set disableDeploymentModeChooser so the app stays in third-party mode.scheduledTasksEnabled
boolean
Since 2.110.0
Allow scheduled tasks. Allow scheduled tasks in Cowork and Code. When off, the Scheduled page is hidden, existing tasks stop running, and Claude cannot create new ones.
Self-hosted install: Server side. The host runs scheduled tasks, so when this is off it refuses to create or run them.
More detail
More detail
false to turn scheduled tasks off for every user. The Scheduled section in Cowork and the routines list in the Code tab are hidden, together with every other place a schedule can be created. Tasks that already exist on a device no longer run; they are kept, not deleted, and run again once the key is removed or set to true. Claude is not offered the tools that create, change or run these tasks, and sessions start without Claude Code’s own in-session scheduling tools (the /loop command, its cron tools and its wake-up timer).It does not remove task files already on the user’s machine. A change takes effect at the next app launch.keepAwakeEnabled
boolean
Since 2.7032.0
Allow keep awake. Let Claude keep the computer awake. When off, Claude never prevents sleep and hides the keep-awake switches in Settings, the Scheduled page and the Code tab.
Self-hosted install: Server side. Desktop itself asks the person’s computer to stay awake, and shows the keep-awake switches.
More detail
More detail
false to make sure Claude never prevents the computer from sleeping: those switches are hidden and no part of the app keeps the computer awake. Users’ saved choices are kept but ignored, and apply again once the key is removed or set to true. Scheduled tasks are unaffected and still run only while the computer is awake and the app is open.A change takes effect on a running app.developerModeEnabled
boolean
Since 2.37337.1
Allow Developer Mode. Let users turn on Developer Mode. When off, the app’s developer tools and the option to install an unpacked extension are unavailable.
Self-hosted install: Server side. Desktop offers its own Developer menu, developer tools and debugger on the person’s computer.
More detail
More detail
false to keep Developer Mode off on every device that receives this setting: the Developer menu and the Help → Troubleshooting → Enable Developer Mode item are removed, the developer tools and the debugger cannot be opened (any already open are closed), a user’s own developer_settings.json opt-in is ignored, and the app refuses to install an extension from a folder. Packaged (.mcpb) extensions are governed by isDesktopExtensionEnabled, not this key.This is a feature control, not a sandbox: extensions already installed from a folder stay installed and keep working, and an extension folder copied into the app’s extensions folder by hand is not blocked.A change takes effect on a running app, except that the Install unpacked extension button in Settings keeps its launch-time state until the app restarts (clicking it while the key is off shows an error).quickEntryDefaultShortcut
string
Since 3.1623.0
Default Quick Entry shortcut. Set the shortcut that opens Quick Entry, such as Ctrl+Alt+K, for users who haven’t set their own in Settings. Use “off” for no shortcut.
Self-hosted install: Server side. Desktop registers its Quick Entry shortcut with the operating system of the person’s computer.
More detail
More detail
- Modifiers and one key joined by
+, such asCtrl+Alt+KorAlt+Space. Modifiers includeCtrl,Alt,Shift,CmdandSuper.CommandOrControlmeans Cmd on macOS and Ctrl elsewhere, so one value works on every platform. A combination must pairCtrl,CmdorSuperwithAltorShift, except forAlt+Space. Write modifier and key names exactly as shown:ctrlis not read asCtrl. off(the string, notfalse): no shortcut. Users can still open Quick Entry from Claude’s tray or menu bar icon and set a shortcut in Settings.double-tap-option: macOS only. Windows and Linux keep the built-in shortcut.
F11, Ctrl+C, Shift+K or Alt+Shift+K, which typing and other apps rely on. It also rejects any combination that includes Insert, Capslock or F5, which screen readers use. Choose a combination that users don’t need elsewhere.If Claude can’t use the value as a shortcut, it ignores the value and keeps the built-in one. If another app already uses the shortcut, Claude on macOS uses the built-in shortcut. On Windows and Linux, Quick Entry keeps its previous shortcut, or none at start-up. Users can choose another in Settings.A change takes effect on a running app.quickEntryScreenshotsEnabled
boolean
Since 3.6556.1
Allow screenshots of the screen and other apps. Let users take screenshots of their screen or other apps’ windows in Quick Entry on macOS. When off, it offers none and never asks for Screen Recording access.
Self-hosted install: Server side. Desktop takes the picture on the person’s computer and offers it in its own Quick Entry window.
More detail
More detail
false to turn this off on every device that receives this setting. Quick Entry still opens, but offers no screenshot and no such button, and Claude does not ask for that permission. Outside Quick Entry, another app’s window that a user mentions with @ in a chat comes without its picture. Users cannot turn it back on.With quickEntryFileSharingEnabled off as well, Quick Entry shows no permission banner at all.On Windows and Linux, Quick Entry takes text only, so this key changes nothing there.This key does not cover:- A screenshot that a user takes with the operating system’s own tools and then pastes or attaches. That is a file upload.
- Pictures that Claude takes of its own content, such as an artifact, a file preview, a page in the built-in browser (
builtinBrowserEnabled) or the feedback form. - A local MCP server or desktop extension that captures the screen (
isLocalDevMcpEnabled,isDesktopExtensionEnabled). - Other apps, or the operating system, capturing Claude’s windows.
quickEntryFileSharingEnabled
boolean
Since 3.6556.1
Allow sharing files open in other apps. Let users attach the file open in another app’s window in Quick Entry on macOS. When off, it offers none and never asks for Accessibility access.
Self-hosted install: Server side. Desktop finds the file on the person’s computer and offers it in its own Quick Entry window.
More detail
More detail
false to turn this off on every device that receives this setting, including devices where the permission is already granted. Quick Entry still opens, but offers no file from another app’s window and no such button, and it does not ask for that permission. Outside Quick Entry, another app’s window that a user mentions with @ in a chat comes without its file. Users cannot turn it back on.With quickEntryScreenshotsEnabled off as well, Quick Entry shows no permission banner at all.On Windows and Linux, Quick Entry takes text only, so this key changes nothing there.This key does not cover:- A file that a user attaches, pastes or drags into Claude themselves. That is a file upload.
- Claude’s other uses of the Accessibility permission where a user has granted it, such as telling a double tap of Option from a keyboard shortcut.
skipWebFetchPreflight
boolean
Since 1.37937.0
Skip WebFetch domain check. Skip Claude Code’s WebFetch domain lookup against api.anthropic.com in Code sessions. Off by default; turn on when that host is blocked.
Self-hosted install: Not supported. A session host always skips the web fetch preflight check, whatever is written.
More detail
More detail
api.anthropic.com whether the domain is on Anthropic’s content blocklist, and refuses the fetch if that lookup cannot complete. Third-party deployments route inference elsewhere and often block api.anthropic.com at the firewall; with the lookup on, every WebFetch in Code sessions then fails with “Unable to verify if domain … is safe to fetch”, and where the host is reachable, every fetched hostname is sent to Anthropic. (Cowork sessions fetch through the app’s own allowlisted fetch and never run this lookup.)Off (default): the lookup runs as it does today, so api.anthropic.com must be reachable from users’ machines for Code-session WebFetch to work (listed under Egress Requirements). Set to true when users’ machines cannot reach api.anthropic.com (corporate firewall, government network) or you do not want fetched hostnames sent there: Code sessions then fetch without the lookup and never contact that host for it. This is the same skipWebFetchPreflight setting Claude Code reads from its own managed-settings file; the app passes it to every session it starts. This key does not restrict which domains Claude may fetch. Neither does coworkEgressAllowedHosts in Code sessions, where it only pre-approves its hosts; builtinToolPolicy can require approval for every fetch.builtinToolPolicy
object: name → value
Since 1.8089.0
Built-in tool policy. Approval per tool or rule such as Bash(curl *). “ask” prompts the user before each matching call. “allow” is the default. To block, use Disabled built-in tools.
Self-hosted install: Server side. The host hands each session the admin’s allow or ask rule for each built-in tool.
More detail
More detail
disabledBuiltinTools), and scopes apply in the same sessions. A bare Bash key also governs Claude Code’s PowerShell tool (its shell on Windows PCs without Git for Windows); argument-scoped Bash(…) keys do not. Scoped ask rules reach sessions only through Claude Code’s managed-settings channel, so another Claude Code managed-settings source replaces them unless it sets parentSettingsBehavior to "merge" (bare names hold either way). They need the same fleet-wide build support, and an older build drops a scoped ask entry as a configuration error (which also blocks WSL sessions on Windows until that client updates), so the tool runs unprompted.An ask entry, bare or scoped, also turns off the app’s remembered “always allow” choices for that tool, so each prompted call is confirmed individually. ask on a file tool (Read, Write, Edit, Glob, Grep) prompts in Cowork, Chat and Code sessions. Calls that Cowork and Chat always refuse are still refused without a prompt: paths outside the session’s connected folders (in Chat, outside its scratch directory and its project’s folders) and protected or sensitive files inside them. A scheduled task in Cowork waits at the prompt, which appears in the task’s session and, when that session is not in view, as a desktop notification. Code side chats cannot prompt, so they block matching calls. An unusable entry is dropped and recorded as a configuration error; a value other than allow or ask is treated as ask and reported. To remove a tool or deny a rule outright, use Disabled built-in tools instead.disabledBuiltinTools
string[]
Since 1.2581.0
Disabled built-in tools. Built-in tools, or argument-scoped permission rules such as Read(//**/.env), denied in Cowork and Code.
Self-hosted install: Server side. The host starts each session with the built-in tools and tool uses the admin denies turned off.
More detail
More detail
Bash, Edit, WebFetch or WebSearch, or an argument-scoped permission rule such as Bash(curl *) or Edit(//**/*.env). A bare name covers every call (a bare Bash entry also covers the PowerShell tool); a scoped rule covers matching calls in every permission mode, including Auto and bypass. Scopes are matched for Bash(…) and PowerShell(…) (a command pattern) and for file paths written as Read(…) (covers Read, Grep, Glob) or Edit(…) (covers Edit, Write, NotebookEdit); many other tools take Tool(<field>:<pattern>). WebSearch and WebFetch are bare-name only: to allow specific hosts, use coworkEgressAllowedHosts.Scoped Bash(…) rules apply in Code sessions only; Cowork’s shell follows only a bare Bash entry. Start absolute file paths with //, not /: a relative pattern such as Read(**/.env) covers only a Code session’s project folder and none of Cowork’s connected folders. Scoped rules need fleet-wide build support (disableAutoUpdates pins builds): an older build passes a scoped entry to Claude Code unchecked. An entry whose pattern contains ) followed by a space or comma is enforced only through Claude Code’s managed-settings channel, so another Claude Code managed-settings source replaces it unless that source sets parentSettingsBehavior to "merge"; every other entry is enforced either way.An unusable entry (a tool name in the wrong letter case, an unbalanced parenthesis, a scoped WebSearch(…) or WebFetch(…)) is kept, because the deny list is served exactly as written, and raises a configuration warning.toolSearchEnabled
boolean
Default: false
Since 1.21459.0
Enable tool search. Load MCP tool schemas on demand (tool search) instead of inlining every schema into context.
Guide for this setting
Self-hosted install: Server side. The host starts Claude Code, so it turns tool search on or off for its sessions.
More detail
More detail
- Claude API, Vertex AI, Bedrock, or Bedrock Mantle with no custom base URL: not needed. The app leaves Claude Code’s experimental betas on there, as terminal Claude Code does, so tool search is on by default (on Vertex AI, for Claude 4.5 and newer models). To turn it off in Code, Cowork, and Chat, set
ENABLE_TOOL_SEARCHtofalsein theenvblock of OS-level Claude Code managed settings (withparentSettingsBehavior: "merge"). Earlier app versions treat these like the last case. - Gateway provider, app versions bundling Claude Code 2.1.247 or later: requests add only the tool-search shape (the
tool-search-tool-2025-10-19anthropic-betavalue, deferred tool loading,tool_referencecontent blocks); every other experimental Claude Code beta stays suppressed. OS-level Claude Code managed settings that keep that suppression or turnENABLE_TOOL_SEARCHoff still win; setENABLE_TOOL_SEARCHtoforcethere instead (withparentSettingsBehavior: "merge"). Sessions the app runs in Claude Code’s gateway mode (an opt-in for users on the gateway’s own sign-in) get its gateway-safe tool-search shape instead. - Foundry, a custom base URL, and earlier app versions: the app suppresses Claude Code’s experimental betas for the session and the key lifts that, so requests carry the tool-search shape together with Claude Code’s other experimental betas for that provider. On Vertex with app versions bundling Claude Code older than 2.1.221, leave this unset while any model older than Claude 4.5 is in use; those engines send the header regardless of model and Vertex’s pre-4.5 stacks reject it.
organizationInstructions
string
Since 1.37937.0
Organization instructions. Appended to Claude’s system prompt in Chat, Cowork, and Code. Guidance the model follows, not an enforced control. Up to 3,000 characters.
Self-hosted install: Server side. The host adds the admin’s instructions to every session it starts.
More detail
More detail
CLAUDE.md instructions still apply.Read from the app’s loaded configuration when a session starts; a changed value generally takes effect for sessions started after the next app launch. Leading and trailing whitespace is trimmed; an empty string is treated as unset. Maximum 3,000 characters; a longer value is rejected (the key is ignored with a configuration error) rather than truncated. Line breaks are preserved when the value is delivered as JSON, a bootstrap response, a .mobileconfig profile, or a .reg file; the Group Policy (ADMX) and Intune text box for this setting is single-line.requireCoworkFullVmSandbox
boolean
Default: false
Since 1.2581.0
Require full VM sandbox. Runs tools inside an isolated VM instead of the host. Stronger isolation; slower file access and no host-process tools.
Self-hosted install: Not supported. Chooses how Cowork runs on the person’s own computer, and third-party installs no longer read it.
Admin Console: Not available.
Authentication
disableDeploymentModeChooser
boolean
Default: false
Since 1.3834.0
Disable Claude.ai sign-in. Users see only this provider at the login screen. The option to sign in to Claude.ai is hidden.
Self-hosted install: MDM profile. Shapes Desktop’s sign-in screen and configuration source, settled before Desktop reaches the host.
Admin Console: Not available.
More detail
More detail
sessionRetentionHold; every other key, update keys included, comes from the organization’s configuration. A profile that sets only app-behavior keys (disableAutoUpdates, …) and no other key, not even forceLoginOrgUUID, is not affected: it keeps those keys over the organization’s configuration without this key, and adding this key there would make the profile the device’s whole configuration. The account menu offers the way back to a profile that sets a provider or a server. forceLoginOrgUUID in the profile limits the move to the organizations it lists. A value served only by the profile’s own bootstrapUrl server does not keep the device.disableDeepLinkRegistration
boolean
Default: false
Since 1.6889.0
Disable claude:// deep-link handling. Stop external apps and websites from opening Claude Desktop via claude:// links.
Self-hosted install: MDM profile. Desktop registers claude:// links on the person’s computer at launch, before it has signed in to the host.
Built-in browser
builtinBrowserEnabled
boolean
Default: false
Since 2.2553.0
Allow the built-in browser. Offer the built-in browser in Cowork and Code sessions so users and Claude can open and work with web pages. Site sign-ins stay on the device until cleared.
Self-hosted install: Not supported. The browser pane lives in Desktop on the person’s computer, and host sessions get no browser tools.
Admin Console: Set automatically.
More detail
More detail
bootstrapUrl set, put this key in the served configuration: a device-profile value alone leaves the browser off. On an install managed from the Claude admin console this follows the console’s Built-in browser switch.When a public site opens or is framed in the pane, and before Claude works with it, the app checks its address (query removed) against Anthropic’s site safety list on releases.claude.com, signed out, with no account, organization, or device identifier (admin console installs: signed in, on the host that serves their configuration). A site it blocks stays blocked to Claude under every key below. Private addresses, names resolving to them, and internal-suffix or single-label names are never sent (a name under a public domain is checked even if only your VPN resolves it). Allow releases.claude.com through your firewall: if a check fails, users can browse but Claude’s page tools stay off for that site.builtinBrowserDefaultDomainPolicy and its two site lists restrict where Claude may browse. A separately deployed Claude Code managed-settings file still applies: disableBrowserExternalNavigation: true keeps the browser off even with this key on, and browserExternalPageTools: "disabled" keeps the pane but turns Claude’s page tools off for external sites. Takes effect after the app restarts.builtinBrowserDefaultDomainPolicy
enum
Default: allow
Since 2.2553.0
Default site policy in the built-in browser. Whether Claude may open sites in the built-in browser by default; the allowed or blocked list is the exception. Mirrors the Claude in Chrome site policy.
One of: allow (default), block
Self-hosted install: Not supported. Sets the default for Desktop’s browser tools, and host sessions get no browser tools to allow or block.
Admin Console: Set automatically.
More detail
More detail
builtinBrowserEnabled is on, in both Cowork and Code sessions, and decides which sites Claude may open, read, or act on with its browser tools; users can still view any site themselves. allow (default): every site except entries in builtinBrowserBlockedDomains. block: no site except entries in builtinBrowserAllowedDomains. Under either policy coworkEgressAllowedHosts, when set to anything but *, is an outer bound: sites outside it are refused to Claude in the browser too. A site Anthropic’s site safety list blocks stays blocked to Claude under either policy (see builtinBrowserEnabled); for a site the list only flags for confirmation, Claude asks the user before each of its actions under allow, and skips that confirmation only when the site matches a builtinBrowserAllowedDomains entry under block. A value that cannot be read is treated as block until it is fixed.The policy also limits what pages load: a page in the pane, including one a user opened, cannot load frames, scripts, images, or other content from a site the policy does not admit (a blocked page a user opens still loads content from its own site). Under block, or with a coworkEgressAllowedHosts list, include the CDN and API hosts your allowed sites depend on.This key and the two site lists work the same way as the Claude in Chrome site policy in the admin console. They are set separately here, except on an install managed from the Claude admin console, where they follow your organization’s browser site permissions there.builtinBrowserAllowedDomains
string[]
Since 2.2553.0
Allowed sites in the built-in browser. Sites Claude may open, read, and act on in the built-in browser when the default site policy is block. Users can still view other sites.
Self-hosted install: Not supported. Lists sites allowed for Desktop’s browser tools, and host sessions get no browser tools.
Admin Console: Set automatically.
More detail
More detail
builtinBrowserDefaultDomainPolicy is block; ignored under allow. A site matching an entry is one Claude may open and work with using its browser tools; every other external site is treated as blocked by your organization: Claude cannot open it, cannot read or act on it, and frames, popups, and redirects into it from a page Claude is working on are refused. A user can still type its address and view it themselves. Listing a site here never unblocks a site Anthropic’s site safety list blocks (see builtinBrowserEnabled); for a site that list only flags for confirmation, an entry here is your organization vouching for it, so Claude works with it without asking before each action.Entries use the same grammar as coworkEgressAllowedHosts, except that bare * is dropped: as in Claude in Chrome, no allowed-sites entry opens every site. Set the policy to allow for that. A wildcard whose base is a public suffix (*.co.uk, *.github.io) is likewise ignored so an entry can never open a whole shared registry. Any other entry outside that grammar is kept but matches nothing (the app log and the editor name it); a value that cannot be read at all allows nothing until it is fixed. A plain hostname entry (example.com) also covers its www. form, and a www. entry covers the bare name, but no other subdomain. localhost dev servers are always reachable, so listing them changes nothing.Empty or unset (default): under block, Claude may open no external site. On an install managed from the Claude admin console this follows your organization’s browser site permissions there.builtinBrowserBlockedDomains
string[]
Since 2.2553.0
Blocked sites in the built-in browser. Sites Claude may not open, read, or act on in the built-in browser when the default site policy is allow. Users can still view them.
Self-hosted install: Not supported. Lists sites blocked for Desktop’s browser tools, and host sessions get no browser tools.
Admin Console: Set automatically.
More detail
More detail
builtinBrowserDefaultDomainPolicy is allow (the default); ignored under block. A site matching an entry is treated as blocked by your organization: Claude cannot open it, cannot read or act on it with its browser tools, and frames, popups, and redirects into it from a page Claude is working on are refused. A user can still type its address and view it themselves: the pane shows a “blocked by your organization’s policy” banner and Claude’s tools stay off there. To take the external browser away from users as well, deploy Claude Code’s disableBrowserExternalNavigation managed setting instead. A blocked site is refused before the site safety check, so its address is never sent to Anthropic.Entries use the same grammar as coworkEgressAllowedHosts; * blocks every external site. An entry outside that grammar is kept but matches nothing (the app log and the editor name it); a value that cannot be read at all blocks every external site until it is fixed. As in Claude in Chrome, a plain hostname entry (example.com) also covers its www. form, and a www. entry covers the bare name, but no other subdomain. localhost dev servers are never affected.Use this key for exceptions inside an allowed egress wildcard or when egress is open. Empty or unset (default): no sites beyond the egress list are blocked. On an install managed from the Claude admin console this follows your organization’s browser site permissions there.Connectors
claudeAiImport
object
Since 1.10628.0
Claude.ai data import. Lets users import Claude.ai chats and projects, plus earlier Claude sessions on this computer, when enabled is true. automatic3pImport is a separate switch.
Self-hosted install: Server side. Desktop can still export sessions stored on the person’s computer, and imports none, since no session runs there.
Child attributes (5)
Child attributes (5)
More detail
More detail
enabled and turns nothing on by itself; automatic3pImport is not affected. An entry that is not a UUID allows nothing and is reported. An empty list, or one that cannot be read, allows no organization, so no import is offered; a null or blank value is read as not set. A provisioned sign-in import names no organization, so it is not offered while the list is set. Each import is reported to your OpenTelemetry collector as the event desktop_claude_ai_import, with the ID of the organization it came from. It is an info-level event: set otlpDesktopLogLevel to info to receive it.enabled.More detail
More detail
true; for organizations managed from the Claude admin console (the hosted configuration) it is on unless an admin turns it off there. When the app launches under this organization, it copies this computer’s earlier third-party sessions into its store, with Settings → Import’s importer (originals are kept). It lists the earlier configuration’s Cowork artifacts in this organization. If still offered, optional plugins the user switched on return. Organization plugins directory: switched on. allowedPluginMarketplaces entry with an unchanged source or on the new gateway or bootstrap origin: reinstalled without asking. Plugins the user uploaded (unless userPluginUploadsEnabled is off; they can run programs on this computer) and skills they saved (unless skillCreationEnabled is off) are installed again without asking, on or off as they were; a skill that declares tools, hooks, metadata or unknown settings arrives off. Not copied: plugins from user-added marketplaces or with code in another repository. Earlier Cowork projects are added, their instructions held until the user accepts them. The user’s Cowork memory, global instructions and Instructions for Claude are copied and used at once, unreviewed (no memory if it was paused). Earlier scheduled tasks are added, each on or off as it was: one that was on runs at its next scheduled time. Runs at most once per device under device-delivered configuration and once more after it joins the hosted configuration. Under the hosted configuration it takes sessions from any earlier device configuration (including ones a console sign-in created) but never those stored under another organization’s hosted configuration; under device-delivered configuration, only those stored while no organization ID was configured, and only once one is. Turn on enabled too so users can import skipped sessions by hand.enabled is true.More detail
More detail
show: always; needs enabled or a sign-in import. detect: if enabled finds earlier Claude sessions.One of: off, detect, showMCP
managedMcpServers
object[]
Since 1.2581.0
Managed MCP servers. Org-pushed MCP servers: remote (HTTP/SSE) or local (stdio command). May embed bearer tokens.
Self-hosted install: Server side. The host connects the admin’s MCP servers and applies each tool’s rule, and tells Desktop which local ones to start.
More detail
More detail
http://<callbackHost>:<callbackPort>/callback; register that exact value with the OAuth provider. Tokens refresh automatically during a session.toolPolicy locks the per-tool approval state, keyed by tool name: "blocked" removes the tool from the session and labels it admin-blocked, "ask" requires approval on every call (Allow once / Deny only; no persistent always-allow; a scheduled Cowork task waits at that prompt), "allow" pre-approves. Tools not listed follow the user’s choice: the prompt offers a persistent Always allow, except for tools that can modify data, which show a session-scoped Allow for this task alongside Allow for all tasks with a malicious-instruction warning. In Code sessions, blocked and ask are forwarded as Claude Code permission rules; allow is not.Keys may contain * wildcards ("read_*" matches every tool whose name starts with read_; anchored, and * is the only wildcard). When several wildcard keys match, the strictest applies (blocked > ask > allow). An exact-name key wins over matching wildcards, with two exceptions in the stricter direction: in Code sessions a wildcard ask, or a wildcard blocked other than the bare "*", beats a less strict exact key (so "*": "blocked" plus exact "allow" entries still works as deny-by-default there); and in chat approval prompts and always-allow persistence a wildcard ask keeps every matching tool behind a per-call prompt even when a more permissive exact key matches, while direct tool invocations such as artifact or widget calls follow the exact key.For the bundled Microsoft 365 connector, the send tools (outlook_send_mail, outlook_send_draft, outlook_forward_mail, outlook_create_event, outlook_update_event, teams_send_chat_message, teams_send_channel_message, teams_reply_channel_message) cannot be loosened below ask; an allow setting resolves to ask.Child attributes
Child attributes
More detail
More detail
toolPolicy alone: orgPluginSettings is not consulted for it, even when the entry sets no toolPolicy. A built-in entry (one with server) is the exception: it applies to a plugin’s server of the same name only when a toolPolicy is written on it, and then carries that toolPolicy and the built-in’s rule that its send and other irreversible tools cannot be loosened below ask, but not the built-in’s other default prompts. An http, sse or stdio entry is also a server the app itself connects to or launches. To set permissions for a server that only a plugin runs, without the app connecting to or launching anything, use an entry with transport: "policy-only".Any value other than allow, ask or blocked is read as blocked for that tool, and a toolPolicy that is not a map of tool names blocks every tool of the server; both are reported as configuration errors.For a plugin server that Claude Code launches or connects to itself (a marketplace plugin’s), the permissions travel on Claude Code’s managed-settings channel: another Claude Code managed-settings source on the device replaces them unless that source sets parentSettingsBehavior to "merge". blocked on a server the app connects to itself holds either way.- microsoft365
- websearch
- github
- http / sse
- stdio
- policy-only
server is microsoft365. The in-app configuration window calls it Microsoft 365.microsoft365global, us-gov-high, us-gov-dodenabled (default), disabledMore detail
More detail
cp1 client capability, so Microsoft Entra issues access tokens that live up to about 28 hours and are cut off within minutes by a claims challenge when an administrator revokes sessions, disables the account, or the user’s risk changes — and, where the tenant enforces an IP named-location or Global Secure Access compliant-network Conditional Access policy, when the token is presented from outside that network. Tenants without such a policy get the longer lifetime and the fast revocation but no network-based replay protection; set disabled to keep standard one-hour, non-CAE tokens on every sign-in path. A change applies to tokens issued after the connector respawns with it; an already-cached long-lived token is served until it expires (Disconnect → Connect signs in afresh).mcpPersistentAlwaysAllowEnabled
boolean
Default: true
Since 1.24012.9
Allow persistent tool approvals. Offer the persistent “Always allow” approval options for MCP tools. Disable to keep tool approvals per-call or session-scoped only.
Self-hosted install: Server side. When off, the host leaves lasting MCP tool approvals out of its sessions, and tells Desktop not to offer them.
More detail
More detail
toolPolicy entry offer a persistent grant: Always allow, or Allow for all tasks for tools that can modify data. The Tool permissions picker in Connector settings also lets users pre-approve tools. These grants persist across sessions with no expiry.When disabled, the persistent options are hidden from approval prompts and from the Connector settings picker, and previously stored persistent grants stop being honored. Scheduled-task runs also stop offering, recording, and replaying the Allow for all scheduled runs approval (Always allow in Code sessions), unless a scheduled-task approval lifetime of one day or more is set. Users can still approve each call. Outside scheduled-task runs, in chat and Cowork they can also choose Allow for this task, except for read-only tools on servers they added themselves.A per-tool toolPolicy entry on managedMcpServers always takes precedence over this key: blocked, ask, and allow behave exactly as documented there whether this key is enabled or not.This key governs chat and Cowork, and also Code sessions on the device (including WSL) or over SSH. In those Code sessions, with the key disabled, the prompt for an MCP tool offers Allow for this session instead of Always allow, except on scheduled-task runs. This approval is not saved to Claude Code’s settings files. It lasts until the session is deleted, and sessions forked or started from it do not inherit it. Claude Code’s own allow rules and hooks still apply. Allow rules in its settings files, including ones saved earlier with Always allow, and hooks in its settings or plugins keep allowing the tool until they are removed. Code sessions receive only the blocked and ask values of toolPolicy entries, so a tool set to allow still prompts there, and this key applies to it.mcpScheduledTaskApprovalLifetimeDays
integer
Range: 0–3,650
Since 2.7032.0
Scheduled-task tool approval lifetime. How many days a scheduled task may reuse a lasting MCP-tool approval before it asks again. 0 removes the lasting option. Leave blank for no time limit.
Self-hosted install: Server side. The host limits how many days a scheduled task may reuse a lasting MCP tool approval, and tells Desktop.
More detail
More detail
0 removes the lasting option, and approvals already stored stop being reused. Leave it blank to change nothing. Choose a number comfortably longer than the gap between runs.The limit covers MCP tools only, and a toolPolicy entry on managedMcpServers still takes precedence. If a configuration server delivers the setting, then after each launch scheduled tasks ask instead of reusing stored approvals (as at 0) until the app has fetched the configuration again.If mcpPersistentAlwaysAllowEnabled is off, a limit of one day or more brings the lasting option back for scheduled tasks only.Code tab: the limit covers only lasting approvals given after this setting took effect. An earlier one was usually saved as an allow rule in Claude Code’s own settings: for a scheduled task, the project’s .claude/settings.local.json, under permissions.allow. Any allow rule in Claude Code’s settings keeps allowing the tool without asking, even at 0, until that entry is removed. That includes a rule written by hand, and one saved by Always allow in an ordinary Code session in the same project, which the app offers whenever mcpPersistentAlwaysAllowEnabled is on. In an ordinary Code session over SSH, if this setting has a value (even 0), Always allow for a tool of a server set up on the host lasts for the session only and saves no rule there.isLocalDevMcpEnabled
boolean
Default: true
Since 1.2581.0
Allow local MCP servers. Local stdio servers added via the Developer settings. On third-party deployments, off also stops plugins’ local servers. Remote servers keep working.
Self-hosted install: Server side. When off, only the local MCP servers the host names start on the person’s computer, and none the person added.
More detail
More detail
false from any source also stops plugins’ local (stdio) MCP servers in Cowork, Chat and Code sessions. That covers .mcpb bundles and plugins from every marketplace, your organization’s included. In Code it also stops the local servers in Claude Code’s own configuration files (~/.claude.json, a project’s .mcp.json). It also stops a local server in Claude Code’s managed-mcp.json whose command, arguments or environment use ${VAR}. Remote servers keep working. Plugins placed in the org-plugins directory on the computer are not affected: the desktop still runs their servers.Set to false in a device-management profile, this key also locks down the local (stdio) entries of managedMcpServers: the app starts one only when that profile itself lists an entry of the same name, and with the profile’s own command, arguments and environment. Only the profile’s value engages this. A false from a configuration server or the admin console turns user-added servers off and does not engage it.Claude Code’s own managed settings, on the device or (for Code sessions on a Claude API key) from the Claude Console, may override this key: see managed settings.allowedPluginMcpServers
object[]
Since 2.2553.0
Allowed plugin MCP servers. Servers plugins may connect in sessions, beyond the managed list above and organization plugins. An empty list allows none; unset keeps today’s rules.
Self-hosted install: Server side. The host connects a plugin’s remote MCP server only where this list admits it; while it is unset, none connects.
More detail
More detail
isLocalDevMcpEnabled set to false stops plugins’ local servers and, in Code, those of Claude Code’s own configuration files.When set, Cowork, Chat and Code sessions connect the managed list above and the servers the desktop serves from the administrator’s org-plugins directory, plus only servers declared by other plugins (user-installed or marketplace) that match an entry. An entry in the managed list above with transport: "policy-only" sets a plugin server’s tool permissions but does not admit it; to admit that server, list the server’s own URL here. Claude Code configuration-file servers (~/.claude.json, a project’s .mcp.json, claude mcp add) are never connected. With the key set, the desktop starts no plugin server on the computer itself, whatever the entries say. The one exception is the MCP servers it serves to sessions from the org-plugins directory. Each entry is a URL pattern in Claude Code’s form, {"serverUrl": "https://*.example.com/*"} (* wildcards; a host * spans a.b): a plugin’s remote server connects when its URL matches an entry. No entry admits a plugin’s local (stdio) server, and an empty list admits no plugin server. Other shapes, the serverName and serverCommand forms included, are dropped and reported; a value that is not a list, or has no readable entry, locks sessions to the managed list and the org-plugins directory’s servers, and stops every other desktop-started plugin server. User-added local servers and extensions keep their own keys.Claude Code’s own managed settings, on the device or (for Code sessions on a Claude API key) from the Claude Console, may override this key: see managed settings.Child attributes (1)
Child attributes (1)
deniedPluginMcpServers
object[]
Since 2.16120.0
Blocked plugin MCP servers. Remote servers plugins may not connect, even if the allowed list admits them; in Code sessions, configuration-file servers too. Unset or empty blocks none.
Self-hosted install: Server side. The host refuses a plugin’s remote MCP server that this list matches, even where the allowed list admits it.
More detail
More detail
allowedPluginMcpServers; a server that matches both lists stays blocked. In a Code session that reads Claude Code configuration-file servers (~/.claude.json, a project’s .mcp.json, claude mcp add), a matching remote server from those files is refused as well. The managed list above, the servers the desktop serves from the administrator’s org-plugins directory, user-added local servers and extensions are not affected: remove those at their own keys. Each entry is a URL pattern in Claude Code’s form, {"serverUrl": "https://*.example.com/*"} (* wildcards; a host * spans a.b). An entry matches an address, not a server: the same server under another host name or an IP address, or behind a plugin’s local (stdio) server, which has no URL, is not matched. https://*.example.com/* does not match http://, wss:// or the bare example.com; a pattern such as example.com/*, which names no scheme, matches nothing, and a lone * matches every URL. To keep a plugin’s servers out whatever address they use, set allowedPluginMcpServers, which admits only the servers it lists. The desktop reads no other shape, the serverName and serverCommand forms included: a value that is not a list, or that holds any entry the desktop cannot read, is reported and blocks every plugin’s remote server (and those configuration-file remote servers), because skipping an entry of a block list would let its server connect. The servers named above as not affected still connect.Claude Code’s own managed settings, on the device or (for Code sessions on a Claude API key) from the Claude Console, may override this key: see managed settings.Child attributes (1)
Child attributes (1)
mcpToolTimeoutSec
integer
Range: 60–3,600
Since 1.37937.0
MCP tool call timeout. Per-call timeout for MCP tool calls, in seconds. Default 180 (3 minutes).
Self-hosted install: Server side. The host starts Claude Code, so it sets how long an MCP tool call may run.
More detail
More detail
isLocalDevMcpEnabled permits them, user-added local servers — follow this value so they never cut a call short first; while the key is unset, calls to user-added local servers are additionally limited to 60 seconds by the desktop. Values outside 60–3600 are rejected at parse time (the error is listed in the diagnostics report) and the defaults apply.The timeout is global (there is no per-server or per-tool form), so size it for the slowest tool you need to complete: long-running tools on one server extend the window during which a stuck call on any server holds its turn. Cowork’s built-in shell tool runs under the same cap: a single command’s timeout_ms (itself limited to 600 seconds) cannot exceed this value.Authentication
microsoftAuthBroker
enum
Default: auto
Since 1.19367.0
Microsoft 365 native sign-in broker. “disabled” forces browser-based Microsoft 365 sign-in; “required” fails sign-in when the OS broker is unavailable, so the refresh token stays broker-held.
One of: auto (default), disabled, required
Self-hosted install: Not supported. Steers the sign-in of Desktop’s bundled Microsoft 365 connector, started for no session on a self-hosted install.
More detail
More detail
auto (default): use the OS sign-in broker where available (WAM on Windows, the Company Portal SSO extension on macOS) and fall back to a browser sign-in otherwise. disabled: always use the browser sign-in. required: fail sign-in when the broker is unavailable rather than falling back to the browser, so the refresh token stays broker-held. Linux has no broker, so required is not supported there. Desktop builds older than the version that introduced required treat it as disabled (browser-only sign-in) — the opposite posture — so gate rollout on client version.microsoftAuthDefaultAccount
enum
Default: disabled
Since 2.26454.0
Microsoft 365 sign-in with the Windows account. “enabled”: when a user clicks Connect on Windows, Microsoft 365 signs in with the work account already signed in to Windows, without the account picker.
One of: enabled, disabled (default)
Self-hosted install: Not supported. Picks the account for Desktop’s bundled Microsoft 365 connector, started for no session on a self-hosted install.
More detail
More detail
disabled (default): Connect shows the account picker when no account is connected. enabled: on Windows, when microsoftAuthBroker is not disabled, Connect first signs in silently with the account Windows already uses. The tenantId on the microsoft365 entry in managed MCP servers must be a tenant GUID. With common, organizations or consumers, users always get the picker. Users also get the picker for accounts from another tenant, guest accounts and personal Microsoft accounts, when the silent sign-in fails, and when the computer cannot store credentials securely. A user who already signed in to Microsoft 365 through the browser keeps that account. After a user disconnects Microsoft 365, or a different person signs in to Claude on this computer, Connect always shows the picker for that connector on this computer, including for a disconnect that happened before this setting was turned on. Turning this setting off stops new silent sign-ins and signs nobody out: users already connected keep their account until they disconnect. macOS and Linux are not affected. Third-party deployments only: first-party installs ignore this setting.Extensions
isDesktopExtensionEnabled
boolean
Default: false
Since 1.2581.0
Allow desktop extensions. .dxt and .mcpb installs.
Self-hosted install: Not supported. Desktop keeps extensions off on a self-hosted install, whatever this setting says.
More detail
More detail
isDesktopExtensionSignatureRequired
boolean
Default: false
Since 1.2581.0
Require signed extensions. Reject desktop extensions that are not signed by a trusted publisher.
Self-hosted install: Not supported. Desktop installs no extension on a self-hosted install, so there is no signature for it to require.
Telemetry & updates
deploymentOrganizationUuid
string
Since 1.2581.0
Organization UUID. A UUID you generate. Tags telemetry so Anthropic support can locate your fleet’s events, and namespaces each user’s local data. Not used for auth.
Self-hosted install: MDM profile. Tags the desktop app’s telemetry and names its local data on the person’s computer.
Admin Console: Set automatically.
More detail
More detail
disableEssentialTelemetry
boolean
Default: false
Since 1.2581.0
Block essential telemetry. Crash and performance reports to Anthropic.
Guide for this setting
Self-hosted install: MDM profile. Desktop starts its crash reports to Anthropic at launch, before sign-in, and a host’s sessions never send any.
More detail
More detail
disableNonessentialTelemetry
boolean
Default: false
Since 1.2581.0
Block nonessential telemetry. Product-usage analytics (no message content) and diagnostic-report uploads.
Guide for this setting
Self-hosted install: MDM profile. Desktop sends usage analytics to Anthropic from before sign-in, and a host’s sessions never send any.
More detail
More detail
disableNonessentialServices
boolean
Default: false
Since 1.2581.0
Block nonessential services. Connector favicons, artifact-preview and MCP Apps iframes, and the Linux spellcheck dictionary. Connector widgets fall back to text; spellcheck is off on Linux.
Self-hosted install: MDM profile. Desktop fetches connector icons, preview frames and a dictionary, starting before it has signed in to the host.
More detail
More detail
*.claudemcpcontent.com), and the spellcheck dictionary the built-in spellchecker downloads on Linux. Turning this on blocks all of them. (macOS and Windows use the system spellchecker. Windows still downloads a dictionary for a language it cannot check natively; this key does not stop that download.)What you lose when this is on: connectors show without icons, the hosted artifact preview frame does not load (artifacts still render locally), connectors that return MCP Apps show the text tool result instead of the widget, Excel files in the Code tab preview only through Claude’s workspace (the local VM) instead of that frame, and spellcheck underlines are off on Linux.Destinations are listed under Egress Requirements → Nonessential services.OTLP
otlpEndpoint
string
Since 1.2581.0
OTLP endpoint. Where OpenTelemetry logs and metrics are sent. Leave blank to disable.
Self-hosted install: Not supported. Whoever runs the host names the collector in the host’s own configuration, for its sessions and Desktop’s events.
otlpProtocol
enum
Default: http/protobuf
Since 1.2581.0
OTLP protocol. Transport protocol for the OpenTelemetry exporters.
One of: http/protobuf (default), http/json, grpc
Self-hosted install: Not supported. Set beside the collector’s address in the host’s own configuration.
More detail
More detail
http/protobuf instead of grpc on Windows, and on other platforms whenever the Claude Code engine is given an HTTP proxy (the operating system’s proxy, egressProxyUrl or egressProxyPacUrl, or HTTPS_PROXY / HTTP_PROXY in a Claude Code settings file); the application log notes the substitution. The desktop application’s own events always go over http/json to <endpoint>/v1/logs. None of this changes the endpoint, so choose grpc only for a collector that also serves OTLP/HTTP at the same address; otherwise keep http/protobuf and point otlpEndpoint at the collector’s OTLP/HTTP receiver (conventionally port 4318).otlpHeaders
object: name → value
Since 1.2581.0
OTLP headers. Static collector headers — routing and tenant headers only. No credentials here; use Collector authentication or the headers helper script for tokens.
Self-hosted install: Not supported. The host keeps the collector’s headers in its own configuration, so no document that a device fetches holds them.
otlpAuthMode
enum
Since 1.30096.1
Collector authentication. inference-credential sends the user’s inference bearer token to the collector as Authorization: Bearer.
One of: none, inference-credential
Self-hosted install: Not supported. Would send the person’s model token to the collector; a self-hosted Desktop holds none, and no host reads this.
More detail
More detail
inference-credential adds Authorization: Bearer <token> to every export, using the token the app currently holds for the inference provider, with no helper script to deploy. The collector must accept that token as issued: an identity-provider sign-in (external-idp, gateway or Bedrock proxy) forwards the identity provider’s token, which carries the audience you registered, Microsoft Entra on Foundry issues the Foundry resource’s token, and Vertex workforce identity forwards a Google Cloud access token; static gateway and Bedrock keys are forwarded as-is. Because the token can also call inference as the user, use this only for a collector you operate; for anything else, use the headers helper script with an ingest-scoped credential. Kinds that never produce a bearer (AWS SigV4 kinds on Bedrock, Google ADC / OAuth files on Vertex, API-key kinds) export without it, and so does Sign in with Claude Console, whose token is the user’s own and is never sent to a collector. Use the helper script instead. Cowork tasks pick up the current token each time they start; a Code session keeps the token it started with for as long as it stays open; the desktop’s own event exporter uses the current token on every flush. Before sign-in, exports go out unauthenticated. An Authorization header printed by the headers helper script wins over this.otlpHeadersHelper
string
Since 1.30096.1
OTLP headers helper script. Absolute path to an executable that prints a JSON object of collector headers. Merged over the static headers and Collector authentication; the helper wins.
Self-hosted install: Not supported. Desktop sends its own events to the host, which holds the collector’s headers, so it runs no helper.
More detail
More detail
{"Authorization": "Bearer …"}. The desktop runs it (no arguments; output cached for a few minutes, and a failure is not retried for 30 seconds) whenever it needs collector headers and merges the result over OTLP headers and the Collector authentication header (the helper wins on conflict). Cowork tasks get the current output when they start; Code and Cowork sessions are also given the script as Claude Code’s own otelHeadersHelper, so an open session re-runs it as tokens rotate (on Windows this applies to .exe, .cmd and .bat helpers; a .ps1 helper applies at session start only); the desktop’s own event exporter re-runs it per flush. Session start waits at most two seconds for a slow helper and otherwise proceeds without its headers until it finishes. Use this when the collector needs a credential the inference sign-in cannot provide, when the collector token rotates, or when the config comes from a hosted admin console, which cannot store header values. If the helper fails, telemetry is sent without its headers — check the app log.otlpResourceAttributes
object: name → value
Since 1.5354.0
Resource attributes. Extra resource attributes to attach to every span/metric. A static enduser.id set here always wins over the runtime identity.
Self-hosted install: Server side. The host stamps these attributes on the session telemetry it sends and on Desktop’s events that it forwards.
More detail
More detail
enduser.id is set here, the desktop fills it with the signed-in user’s runtime identity; a value you set here always wins. process.owner (the OS login name) is always emitted; set it here to override.otlpDesktopLogLevel
enum
Default: error
Since 1.9255.0
Desktop telemetry export level. Controls the Claude Desktop application’s events, separate from Cowork and Code sessions. Defaults to error.
One of: off, error (default), warn, info, debug
Self-hosted install: Server side. The host tells Desktop at which level to send its own events, and filters them again before it forwards them.
otlpContentCapture
enum[]
Since 1.15962.0
Content capture. Content categories Claude Desktop sends unredacted to your collector. userPrompts also sends Claude’s responses. If empty, no category is enabled (default).
Any of: userPrompts, assistantResponses, toolDetails, toolContent, rawApiBodies
Self-hosted install: Server side. The host decides how much of a session’s content its telemetry carries.
More detail
More detail
userPrompts— user-typed prompt textassistantResponses— assistant message texttoolDetails— tool input arguments, e.g. the web-search query stringtoolContent— tool output content, e.g. fetched page text or command stdoutrawApiBodies— inference API request and response bodies, each cut at 61,440 characters by default
OTEL_LOG_* env vars; see the Claude Code monitoring docs.In Claude Desktop, Claude’s responses are included when user prompts are captured, even if assistantResponses is not listed. To exclude them, set OTEL_LOG_ASSISTANT_RESPONSES to 0 in the env block of Claude Code’s managed settings, not in Claude Desktop’s managed configuration. That 0 also wins when assistantResponses is listed, but rawApiBodies still includes responses. Claude Desktop ignores a 0 set in Claude Code’s per-user Windows registry policy (HKCU). If a device has several managed sources, set the 0 in the highest-priority one with a policy. Excluding responses this way requires Claude Desktop 2.37337.1 or later.Claude Code managed settings set no policy if they are missing, empty, or hold only wslInheritsWindowsSettings, managedSourcesBehavior, or empty objects such as "permissions": {}. Adding OTEL_LOG_ASSISTANT_RESPONSES to such settings makes them a policy, so also set parentSettingsBehavior to "merge" there. Without "merge", Claude Code can drop the restrictions that Claude Desktop passes to it. If the settings already set a policy, add only OTEL_LOG_ASSISTANT_RESPONSES to their env block, and read Interaction with Claude Code’s own managed settings before you change parentSettingsBehavior.otlpTracesEnabled
boolean
Since 1.22209.0
Export traces. Also export OpenTelemetry traces from Cowork tasks and Code sessions. Uses Claude Code’s session tracing.
Self-hosted install: Server side. The host turns traces on or off in the session telemetry it sends.
More detail
More detail
CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1 + OTEL_TRACES_EXPORTER=otlp) in spawned Cowork tasks and Code sessions. Each user interaction exports a trace whose spans and events carry trace_id/span_id, enabling end-to-end correlation in your observability backend (metrics do not carry trace context; correlate those via session.id). Traces go to the collector endpoint and protocol configured above. When otlpEndpoint is set, this key alone decides whether those sessions export traces: leaving it unset or false keeps traces off even if Claude Code’s own settings or managed settings (for example a managed-settings.json on the device) turn tracing on. Without otlpEndpoint it has no effect. The span structure may evolve between Claude Code releases; see the Claude Code monitoring docs.otlpAttrMaxChars
integer
Range: 256–15,000,000
Since 2.31226.0
Telemetry attribute length limit. Maximum length, in characters, of captured content such as a raw API body (256–15,000,000). Cowork tasks and Code sessions use 61,440 when unset.
Self-hosted install: Server side. The host cuts long values in the session telemetry it sends.
More detail
More detail
- Cowork tasks and Code sessions: 61,440 when unset. Applies to model responses, tool content and raw API bodies. User prompts are not cut, and
tool_inputkeeps its own smaller limits. A cut request body keeps the oldest messages and loses the newest, so to capture whole bodies withrawApiBodies, set this just above your longest body, not at the maximum. Lower it to reduce volume. While this key andotlpEndpointare set, Claude Code’s own settings and managed settings (for example amanaged-settings.jsonon the device) cannot change the limit or the export interval. - Claude add-in for Microsoft 365: 4,000 when unset. Values above 32,000 count as 32,000.
- The desktop application’s own events are not affected.
max_request_body_size) and 4 MiB per gRPC message (max_recv_msg_size_mib). Keep that limit at a few times the size of your longest body: one export can carry several, and a character takes one byte in Latin text and up to three otherwise. With this key set, Code sessions export events as they happen, not every five seconds, as Cowork tasks already do, so the collector sees more, smaller requests.Auto update
disableAutoUpdates
boolean
Default: false
Since 1.2581.0
Block auto-updates. Stop Claude Desktop from fetching updates entirely (no time limit). You’ll need to push new versions yourself.
Self-hosted install: MDM profile. Desktop starts its updater at launch, before it has signed in to the host.
More detail
More detail
installedUpdateEnforcementEnabled
boolean
Since 3.6556.1
Restart to apply installed updates. With auto-updates blocked, Claude restarts for a newer version installed while it was open, after 72 hours or your window. On Windows it may stay closed.
Self-hosted install: Not supported. Governs Desktop’s own restart for a version installed on the computer, and no session host passes it on to Desktop yet.
More detail
More detail
disableAutoUpdates is set. Both are app-behavior keys: a profile that sets any app-behavior key becomes the only source for all of them, so a profile that held this key alone would drop a disableAutoUpdates set elsewhere.Applies only while disableAutoUpdates is on, where you distribute new versions yourself. When a newer version is installed on a device while Claude is open, the app shows “Relaunch to update” in the sidebar. With this setting on, if nobody relaunches within the window, the app restarts itself and comes back on the page it was showing. installedUpdateEnforcementHours sets the window and says what holds the restart off.On Windows this covers installs from the MSIX package. Claude closes, switches to the newest version on the device (it may be one installed for someone else), and Windows may then open it. Where it does not, Claude stays closed, and scheduled tasks and background work stop, until someone opens it; opened after five minutes, it starts on its default page. If Windows refuses the switch, Claude comes back on the version it had and does not try again until it is reopened. The switch may also end the Cowork tasks of others signed in on that computer.Where it is not set, the restart is off in third-party deployments, and in first-party deployments it follows Anthropic’s own rollout; false keeps it off. An unreadable value counts as false. Turning it on starts a whole new window. It has no effect on updates that Claude downloads itself; autoUpdaterEnforcementHours times those.A version from before this setting existed does not restart by itself and does not know the name: it ignores it in a macOS profile, and from other sources it may show people a configuration warning at every launch. A Windows machine policy that holds only such names, or a Linux managed-settings file that holds one and sets no connection, is rejected as unusable, and the app then also ignores the configuration saved on the device itself.installedUpdateEnforcementHours
integer
Range: 1–72
Since 3.6556.1
Installed-update enforcement window. Hours Claude waits to restart for a newer version installed while it was open. Blank: 72 hours, then until the computer is idle. A number skips the idle wait.
Self-hosted install: Not supported. Times Desktop’s own restart for a version installed on the computer, and no session host passes it on to Desktop yet.
More detail
More detail
disableAutoUpdates is on and the restart is on (installedUpdateEnforcementEnabled). The window starts when the open app first finds a newer version installed; on Linux, where it cannot read the version, any replacement of the app counts. Only time with the app open and the computer awake counts.Leaving it blank uses the 72-hour default and then waits for the machine to be idle (10+ minutes without input) before restarting; setting any explicit value (including 72) restarts once the window elapses regardless of user activity. In both cases the restart holds off while Claude is mid-task, unless the task runs on an SSH host and the app expects to pick it up again after the restart. Where the system reports no idle time, as some Wayland sessions do, a blank window never restarts: set a number.autoUpdaterEnforcementHours
integer
Range: 1–72
Since 1.2581.0
Auto-update enforcement window. Hours before a downloaded update force-installs. Only applies when auto-updates are enabled. Blank = 72-hour default.
Self-hosted install: Server side. Desktop itself quits and installs a downloaded update of the app on the person’s computer.
More detail
More detail
disableAutoUpdates is in place at launch: nothing is downloaded, so this timer never arms. If the policy reaches an already-running app after an update has begun to download, that one update still installs on this timer; no further updates are fetched.Leaving it blank uses the 72-hour default and then waits for the machine to be idle (10+ minutes without input) before restarting; setting any explicit value (including 72) restarts once the window elapses regardless of user activity. In both cases the restart holds off while Claude is mid-task, unless the task runs on an SSH host and the app expects to pick it up again after the restart.updateViaUpdatesHost
boolean
Default: false
Since 1.26832.0
Check for updates on releases.claude.com. Read the update feed from releases.claude.com so api.anthropic.com can stay blocked.
Self-hosted install: Not supported. Where the session host answers the app’s update checks, no Anthropic update server is left to choose.
More detail
More detail
api.anthropic.com which version to install. That host also serves the model APIs, so organizations that block un-approved LLM endpoints at the network edge end up blocking updates too.Turn this on to read the same feed from releases.claude.com, a hostname that carries no model API. api.anthropic.com can then stay blocked without breaking auto-update. Rollout behavior is unchanged; the installer download still comes from downloads.claude.ai as before.If a device profile sets bootstrapUrl to a URL on config.claude.com and leaves bootstrapEnabled on, the app reads the feed from releases.claude.com whatever this key says. Older versions of the app do so only when this key is on, so turn it on as well.releaseChannel
enum
Default: stable
Since 3.1623.0
Release channel. On Stable, devices take each release as it rolls out. On Staggered, they update less often, usually to a version first out on Stable a week or more earlier.
One of: stable (default), staggered
Self-hosted install: MDM profile. On staggered, the person can update only once Desktop has downloaded a build; the session host ignores the channel.
More detail
More detail
stable, which takes each release as it rolls out.Alternative: staggered, which usually updates on Thursdays to a release that has been live in production on stable with no known breaking issues. Typically the staggered release will be 7-14 days behind stable; urgent fixes may be released sooner.Devices download their new version at the next update check and install it on restart. Devices on staggered receive features and fixes, security fixes included, later than devices on stable. A device that’s currently ahead of staggered will stay ahead until staggered catches up to its version.Switching to stable or removing the setting updates devices to the newest release.- An unreadable value, such as a misspelling or capital letter, is read as
staggered. - The setting applies only in third-party mode. A user who signs in to Claude.ai follows
stable, unless their organization manages Claude Desktop from the admin console. - On a device managed from the admin console, this setting applies only while a user is signed in. With no one signed in, the device follows
stable. - The setting has no effect on Linux or Microsoft Store installs.
- See the installation page for more details on where to set the key.
Configuration updates
relaunchEnforcementHours
integer
Default: 24
Range: 0–336
Since 1.40609.0
Configuration relaunch window. Hours a user may keep working on the old configuration after a managed-configuration change is detected. 0 = restart required at once. Blank = 24 hours.
Self-hosted install: Server side. Desktop itself restarts on the person’s computer after a change to the settings it reads from the device.
More detail
More detail
0 shows the dialog at the first observation. One case gets no window, whatever this value: when a device-management profile that sets more than app-behavior keys first applies to an app that started without one, and the app will run on that profile after restarting, the dialog shows at the re-check that confirms it, because until the restart the app stays connected the way it started.A served value is read from the newest served configuration, so tightening or loosening the window takes effect without a restart once two re-checks in a row have served it, and a change to this key alone never asks for one. Like the update keys beside it, a value from a device-management profile that sets only app-behavior keys applies without making the rest of the configuration device-managed, and takes precedence over a served one. Because the key is grouped with the other app-behavior keys, a profile that sets any of them claims the whole group: set this key in the same profile as the update keys you deploy, or a served value is ignored on those devices and the 24-hour default applies.configRecheckIntervalMinutes
integer
Default: 10
Range: 2–30
Since 1.46388.1
Configuration re-check interval. Minutes between the running app’s checks for a changed managed configuration. Blank = 10 minutes.
Self-hosted install: Server side. The host refreshes its own copy of the policy at least this often, and tells Desktop how often to ask it again.
More detail
More detail
304 round-trip. A detected change shows the sidebar relaunch card and starts the relaunchEnforcementHours window, so a saved change reaches a running app within roughly one interval. Defaults to 10 minutes; each wait is jittered by ±10% so a fleet does not poll in lockstep. Values outside 2–30 are rejected with a parse error and the default applies.Applied without a restart: a new served value re-arms the timer once two checks in a row have served it, and a change to this key alone never asks for a relaunch. Set it via MDM or serve it from your configuration endpoint; like the update keys beside it, a value from a device-management profile that sets only app-behavior keys applies without making the rest of the configuration device-managed, and takes precedence over a served one. Because the key is grouped with the other app-behavior keys, a profile that sets any of them claims the whole group, and every key in it is then read from that profile alone: deploy this key in the same profile as the update keys (disableAutoUpdates, autoUpdaterEnforcementHours, …). A profile that sets the update keys without it ignores a served interval and the default applies; a profile that sets only this key ignores served update settings, so a served disableAutoUpdates no longer holds on those devices. A profile that also manages the connection itself (sets bootstrapUrl or the provider keys) follows the normal tier order instead: once a served configuration is in hand it, not the profile, supplies this key.disableLocalConfigCache
boolean
Default: false
Since 2.7032.0
Keep only your organization ID and restrictions on disk. Don’t keep your organization’s name or any permissive setting on disk between launches; only your organization ID and restrictions are kept.
More detail
More detail
Limits
Session retention
chatSessionRetentionDays
integer
Range: 1–3,650
Since 1.52386.0
Chat retention period. Delete chats, with their files, after this many days without activity. Unset: kept until the user deletes them. Projects and memory stay.
Self-hosted install: Not supported. Chat runs only on the person’s computer, so a session host holds no chats to delete.
More detail
More detail
coworkSessionRetentionDays
integer
Range: 1–3,650
Since 1.52386.0
Cowork retention period. Delete Cowork tasks, with their uploads and outputs, after this many days without activity. Unset: kept until the user deletes them. Spaces and memory stay.
Self-hosted install: Server side. The host keeps the Cowork sessions it runs, so it deletes those left idle longer than the admin allows.
More detail
More detail
codeSessionRetentionDays
integer
Range: 1–3,650
Since 1.52386.0
Code retention period. Delete Code sessions, conversation included, after this many days without activity. Unset: kept until the user deletes them. Uncommitted work stays on disk.
Self-hosted install: Server side. The host keeps the Code sessions it runs, so it deletes those left idle longer than the admin allows.
More detail
More detail
sessionRetentionHold
boolean
Since 1.52386.0
Suspend session deletion. Suspend all automatic session deletion for these users (legal hold). While on, the retention periods above delete nothing.
Self-hosted install: Server side. The host keeps the sessions, so it is the one that stops deleting them during a hold.
More detail
More detail
Token limits
inferenceMaxTokensPerWindow
integer
Range: 1 or more
Since 1.2581.0
Max tokens per window. Limits each person’s input and output tokens per window. Cached tokens do not count, so this does not cap your provider’s bill. Leave blank for no limit.
Self-hosted install: Server side. The host makes the model calls, so it counts each person’s tokens and stops them at the cap.
More detail
More detail
inferenceTokenWindowHours to also be set — without a window length the cap is inert and no limit is enforced.Where the app runs the sessions, it keeps each person’s count in a local file, so someone who uses two devices has a separate count on each.inferenceTokenWindowHours
integer
Range: 1–720
Since 1.2581.0
Token cap window. The count resets to zero at the end of each window. A window can last 1 to 720 hours (30 days).
Self-hosted install: Server side. Sets the length of the window for the token cap, which the host counts.
More detail
More detail
inferenceMaxTokensPerWindow is set — the cap only takes effect once both are configured.Each person’s window starts the first time they use the app after their previous window ends, so 24 hours does not mean midnight to midnight.Appearance
endUserAttribution
boolean
Since 1.25927.0
End-user attribution. Show the signed-in user’s identity-provider identity in the sidebar and account menu, and emit it as the OpenTelemetry enduser.id resource attribute.
Self-hosted install: Server side. The host puts the person’s identity on the telemetry it sends, and tells Desktop whether to show the person’s name.
More detail
More detail
enduser.id resource attribute on every span, metric, and log sent to your collector — unless you have set a static enduser.id under Resource attributes, in which case your static value is kept and the runtime identity is not emitted. When off, no identity is shown in the app and no runtime enduser.id is emitted; a static enduser.id under Resource attributes still passes through unchanged. This setting does not gate the process.owner resource attribute (the OS login name), which is standard OpenTelemetry process metadata and is always emitted — set a static process.owner under Resource attributes to override it. Applies to both Cowork tasks and Code sessions.deploymentDisplayName
string
Since 1.24012.0
Deployment display name. Overrides the provider label shown in the sidebar footer, user-menu header, and connection-error banner.
Self-hosted install: Server side. Desktop shows this name in place of the provider’s name in its own window.
Admin Console: Set automatically.
More detail
More detail
deploymentDisplaySubtitle
string
Since 1.24012.0
Deployment display subtitle. Optional detail shown after the deployment display name in the account-menu header.
Self-hosted install: Server side. Desktop shows this detail after the deployment’s name in its account menu.
Admin Console: Not available.
More detail
More detail
disableConfigDeprecationWarnings
boolean
Since 1.40609.0
Hide configuration deprecation warnings. Don’t show users the in-app warning that this configuration uses a deprecated field. The final reminder in the 24 hours before the cut-off still appears.
Self-hosted install: Server side. Desktop shows its warning about deprecated settings in its own window, for configuration that Desktop reads itself.
More detail
More detail
true to suppress the first showing for your users while you migrate; the final 24-hour reminder is always shown, and the deprecation stays listed in the diagnostic report (Help → Troubleshooting) and the hosted configuration editor regardless.banner
object
Since 1.7196.0
Organization banner. A persistent banner across the top of the app window after sign-in.
Self-hosted install: Server side. Desktop draws the admin’s banner across the top of its own window.
Feature discovery
disableFeatureDiscovery
boolean
Default: false
Since 1.21459.0
Hide feature announcements. Suppress unprompted feature-announcement UI: the post-update “What’s new” nudge and new-feature tips. Users can still open release notes themselves.
Self-hosted install: Server side. Desktop hides its own announcements of new features.
More detail
More detail
disableAutoUpdates and autoUpdaterEnforcementHours.Plugins
allowedPluginMarketplaces
object[]
Since 1.17377.1
Plugin marketplaces. Git repositories or hosted marketplace.json URLs to surface as plugin marketplaces in the Directory’s Organization tab. The app re-fetches each periodically.
Self-hosted install: Server side. The host fetches the admin’s plugin marketplaces and loads their plugins into the sessions it runs.
Child attributes
Child attributes
More detail
More detail
manifest.name differs, so an upstream rename cannot silently replace another configured marketplace. It also lets a new entry replace a removed one. Any change to an entry’s url, repo or path (not ref) counts as removing that marketplace and adding another, which uninstalls the plugins that users installed from it, unless the new entry names the marketplace it replaces: in the same change that removes the old entry, set the new entry’s expectedName to exactly the old marketplace’s manifest name (letter case counts), and keep it set. The plugins that users installed then stay installed, with their stored settings, and load from the new source, where the new marketplace lists them under the same names. A plugin that is installed outside the marketplace’s own folder and cannot be moved into it (its code comes from another repository, the new marketplace does not list it, or the new entry has not installed yet) is uninstalled as at any removal. The new entry’s installationPreference applies as for any new entry; under available nothing else is installed and a plugin that a user switched off stays off. Until the new entry installs (it cannot be fetched, or it is refused), the plugins that stay installed do not load; they load again, with no reinstall, once it does. Removing the old entry first and adding the new one in a later change uninstalls the plugins on every computer that syncs in between.available, auto_install, requiredMore detail
More detail
available (the default) lets users install from the Directory’s Organization tab. auto_install installs automatically once per pin (the commit SHA, or a url source’s manifestSha256); a plugin the user removes stays removed until the pin changes. required reinstalls on every sync, so it cannot stay removed. A change that only moves the pin of existing entries, with nothing else in the configuration changed, reaches running apps without a restart once the app’s next two configuration checks both return it; any other change to this list asks for a restart. An auto_install or required entry without that pin (a full 40-character commit SHA in ref, or manifestSha256 for a url source) is treated as available and reported as a config warning: the marketplace still lists, but the entry installs nothing. Left at (or treated as) available, a url marketplace served from your inference gateway’s or bootstrap server’s own origin may instead mark individual plugins "installationPreference": "auto_install" in its marketplace.json: those install automatically with no pin (each such archive needs a sha256), and a plugin the user removes stays removed. On any other origin those marks are ignored.More detail
More detail
x-access-token, which GitHub, GitLab and Azure DevOps accept, and as Authorization: Bearer for url sources); git-credential lines username=<user> and password=<token> when the host needs a particular username (Bitbucket Data Center project or repository access tokens on 9.3+: x-token-auth; GitLab deploy tokens: gitlab+deploy-token-N) — sent as HTTP Basic for url sources; authtype=Bearer and credential=<token> to send Authorization: Bearer <token> (Bitbucket Data Center HTTP access tokens on any version); or, for url sources only, a JSON object of HTTP headers such as {"Authorization": "Bearer …", "X-Tenant": "acme"} (the form an MCP server’s headersHelper prints), all sent on every request to that marketplace — a git source refuses this form. Other keys, blank lines and CRLF are ignored in the line forms; output that opens with { must be a valid header object or the fetch is refused.- github
- git
- url
source is github. The in-app configuration window calls it GitHub.githubanonymous, userGit, credentialHelperorgPluginSettings
object[]
Since 1.8089.0
Organization plugin settings. Admin policy applied to plugin-delivered MCP servers.
Self-hosted install: Server side. The host applies the admin’s per-tool locks, and no plugin’s MCP server is started on the computer.
More detail
More detail
{"mcpServers": {"internal-search": {"toolPolicy": {"delete_document": "blocked"}}}}) is no longer accepted. Desktop versions before 1.15200.0 parse only the record form: on those builds an array value is ignored and plugin tool locks are not enforced, so update the fleet past 1.15200.0 before deploying the array form.If a Managed MCP servers entry is for the same server (same URL, else same name), that entry decides alone: its toolPolicy (if any) applies and the entry here is ignored. A value that cannot be read blocks every tool of every plugin-provided MCP server no Managed MCP servers entry covers.For a plugin server that Claude Code launches or connects to itself (a marketplace plugin’s), the permissions travel on Claude Code’s managed-settings channel: another Claude Code managed-settings source on the device replaces them unless that source sets parentSettingsBehavior to "merge". blocked on a server the app connects to itself holds either way.Child attributes (2)
Child attributes (2)
Source
Bootstrap
bootstrapEnabled
boolean
Default: true
Since 1.10628.0
Use bootstrap config. Fetch and apply the URL above at launch. Turn off to keep the URL saved but skip the fetch.
Self-hosted install: MDM profile. Controls whether the desktop app fetches its configuration, so it cannot travel inside that document.
Admin Console: Not available.
bootstrapUrl
string
Since 1.10628.0
Bootstrap config URL. HTTPS endpoint that returns a per-user JSON config overlay. Values from the response override local settings and become read-only.
Self-hosted install: MDM profile. Tells the desktop app where to fetch its configuration, so it cannot travel inside that document.
Admin Console: Not available.
bootstrapOidc
object
Since 1.10628.0
Bootstrap OIDC parameters. When set, the bootstrap request sends a Bearer token from a browser sign-in (authorization-code-with-PKCE).
Guide for this setting
Self-hosted install: MDM profile. Names the sign-in the desktop app uses to fetch its configuration, so it cannot travel inside it.
Admin Console: Not available.
More detail
More detail
bootstrapOidc.clientId. Writing the sub-fields as separate registry values causes the app to silently fall through to device-code mode.Child attributes (8)
Child attributes (8)
127.0.0.1, localhostMore detail
More detail
bootstrapHeaders
object: name → value
Since 1.32885.1
Bootstrap request headers. HTTP headers sent on every bootstrap config fetch. Use this instead of embedding user:pass@ in the URL.
Guide for this setting
Self-hosted install: MDM profile. Sets headers the desktop app sends to fetch its configuration, so it cannot travel inside that document.
Admin Console: Not available.
More detail
More detail
Authorization: Basic …, an API key header) or a routing/tenant header. When either this or the headers helper script is set and no separate bootstrapOidc provider is configured, the app treats the headers as sufficient auth and does not require a per-user sign-in for the bootstrap fetch. These headers (and the helper script’s below) also accompany requests to a plugin marketplace this server hosts on its own origin (allowedPluginMarketplaces with credentialKind: "inferenceCredential"). Header values are masked in diagnostics and telemetry. For a rotating token, use the headers helper script instead.bootstrapHeadersHelper
string
Since 1.32885.1
Bootstrap headers helper script. Absolute path to an executable that prints a JSON object of bootstrap request headers. Merged over the static headers; the helper wins.
Guide for this setting
Self-hosted install: MDM profile. Names a program on the person’s computer that supplies headers for fetching the app’s configuration.
Admin Console: Not available.
More detail
More detail
{"Authorization": "Bearer …"}. The app runs it (no arguments; output cached for a few minutes) before each bootstrap config fetch and merges the result over Bootstrap request headers (the helper wins on conflict). Use this instead of embedding user:pass@ in the bootstrap URL, or when the bootstrap server needs a rotating token from a secrets manager. When either this or the static headers are set and no separate bootstrapOidc provider is configured, the app treats them as sufficient auth and does not require a per-user sign-in for the bootstrap fetch. If a per-user sign-in also runs (bootstrapOidc or the server’s own device-code flow), that Bearer token wins on Authorization.trustBootstrapDelivery
boolean
Default: false
Since 1.26832.0
Trust bootstrap-delivered settings. Skip the per-user consent prompt for sign-in targets, inference endpoints, helper scripts, and connectors the bootstrap server delivers.
Self-hosted install: MDM profile. Skips a consent prompt on the person’s computer for what the configuration server sends.
Admin Console: Not available.
Labels and badges
Entry labels
The labels under a key start with its type and, where one is recorded, its default, and end with the Claude Desktop version that added the key. Between those, a label appears only where the key differs from most keys.- No MDM only or Admin Console only label: You can set the key in an MDM profile or the local configuration file, or return it from a bootstrap server.
- MDM only: You can set the key only in an MDM profile or the local configuration file. Claude Desktop ignores it in a bootstrap server’s response. Read more.
- Admin Console only: Only the Enterprise Admin Console can set the key. Claude Desktop ignores it in an MDM profile, in the local configuration file and in a bootstrap server’s response. Read more.
- Beta: The feature that the key configures is in beta.
- Deprecated: On third-party deployments Claude Desktop no longer reads the key and ignores any value set for it. Remove it from your configuration.
- Consent required: A value that a bootstrap server or a self-hosted session host delivers applies only after the user approves it, unless machine-scoped device management set that server’s address. For a bootstrap server, the trustBootstrapDelivery key overrides that default. A value set in an MDM profile, the local configuration file or the Enterprise Admin Console needs no approval. Read more.
- Origin-pinned: A URL that a bootstrap server delivers must share the origin of bootstrapUrl, or Claude Desktop drops it. The limit is lifted when bootstrapOidc is set, and it does not apply to a value set in an MDM profile, the local configuration file or the Enterprise Admin Console. Read more.
- required: The object or list entry that holds this field is not valid without it. Depending on the key, Claude Desktop then drops that entry alone, treats the key as unset, or applies a restrictive value in its place.
The Works with column
Unless a label in its entry says otherwise, a key can be set in an MDM profile or the local configuration file, or returned from a bootstrap server. A badge marks another kind of deployment that the key also works with.- Self-hosted: Something acts on the key on a self-hosted install. Its Self-hosted install line gives the reason, and reads Server side or MDM profile, as the badge does on hover. Without the badge, that line reads Not supported, or the entry has none.
-
Admin Console: The key takes effect where your organization manages Claude Desktop from the Enterprise Admin Console. Read more.
- No hover text: The hosted configuration can hold the key. Set it on the console’s pages or, where no page has a field for it, by importing a configuration file or through the Admin API.
- Set automatically on hover and in the key’s entry: Anthropic fills the key in from your organization’s own settings, such as its name or its built-in browser settings, each time an app downloads the configuration. A value written for the key in the hosted configuration has no effect.
- No badge, and Not available in the key’s entry: The hosted configuration can’t hold the key, so you can’t set it from the console.
Self-hosted install line
The self-hosted word matters only on a self-hosted install, where sessions run on a session host that your organization operates and not on the person’s computer. The word says who acts on the key on such an install, and so where to set it; the text beside it gives the reason. On any other install, ignore it.- Server side (
server): in the document your session host reads; the host applies it itself. - Server side (
reported): in the same document; the host passes it on to Claude Desktop, which applies it in its own windows or on the person’s computer. - MDM profile (
client): in Claude Desktop’s own configuration on the computer (device management, the local file, or a bootstrap server that configuration names); the session host ignores it. - Not supported (
none): nothing acts on it on a self-hosted install, whichever of those places sets it.
disableAutoUpdates, installedUpdateEnforcementEnabled, installedUpdateEnforcementHours, autoUpdaterEnforcementHours, updateViaUpdatesHost, releaseChannel, relaunchEnforcementHours, configRecheckIntervalMinutes, egressProxyUrl, egressProxyPacUrl).
The word is what this Claude Desktop release declares. A session host acts on a server or reported key only from the host version that reads it; until then nothing applies the key on a self-hosted install, and Claude Desktop does not fall back to a value set on the computer.
Guides
- Configuration implementation: how configuration differs between a device’s own configuration, the Enterprise Admin Console, and a self-hosted install, and how to write each value type.
- Configuration changelog: the desktop release each key first appeared in.
- Models and effort levels: how the keys under Models work together.
- Unified Claude: how
desktopHomeoverrides the other keys under Chat surface and Cowork surface. - Automatic deletion of idle sessions: which key under Session retention covers a conversation started from the home screen.
Recommended security profiles
The profiles below are illustrative examples rather than built-in presets, and the labels are descriptive only. Use them as starting points and adjust for your environment. Layer the inference-provider keys for your cloud on top of whichever profile you choose.- Standard
- Restricted
- Locked down
Tool permissions for managed MCP servers
EachmanagedMcpServers entry can carry a toolPolicy that locks the approval state per tool:
"allow"— the tool runs without prompting."ask"— the user approves every call; no session-scoped or standing grants are offered."blocked"— the tool is removed from Claude’s session; connector settings show it as blocked by your organization.
mcpPersistentAlwaysAllowEnabled is false. Full prompt options require version 1.22209.0 or later; earlier third-party builds offered only per-call approval. The app reads a toolPolicy value other than "allow", "ask", or "blocked", such as "ask-session", as "blocked" for that tool and reports a configuration error, so write "ask" in place of "ask-session". Managed policies take precedence over user grants, and enforcement happens in the desktop host process, not only in the prompt UI. A deny-by-default posture, "*": "blocked" plus exact "allow" entries for approved tools, is supported, including in Code sessions (where an allowed tool still gets Claude Code’s own approval prompt). See the managedMcpServers reference for wildcard matching, precedence rules, and built-in connector defaults.
On a scheduled Cowork task, the prompt can also offer an Allow for all scheduled runs option. See Tool approvals on scheduled tasks.
Tool approvals on scheduled tasks
On a scheduled task, the approval prompt for an MCP tool that has notoolPolicy entry can offer a standing approval: Allow for all scheduled runs in Cowork, Always allow in Code. Later runs of the task then use the tool without asking.
To make these approvals expire, set mcpScheduledTaskApprovalLifetimeDays to a whole number of days from 1 to 3650. With a value of 30, the option reads Allow for 30 days, the approval lasts 30 days from the moment the user chooses it, and after that the task asks again. Set the value comfortably longer than the time between a task’s runs. The key requires Claude Desktop 2.7032.0 or later. Add it after your devices run that release.
The key’s values:
- Unset (default): approvals never expire. The prompt offers the option, and stored approvals are used, only while
mcpPersistentAlwaysAllowEnabledistrue. 1to3650: each approval lasts that many days. The prompt offers the option even whilemcpPersistentAlwaysAllowEnabledisfalse.0: the prompt doesn’t offer the option, and stored approvals aren’t used. A value that isn’t a whole number from0to3650is treated as0. An empty value is treated as unset.
mcpPersistentAlwaysAllowEnabled is false, until someone removes it.
The time limit doesn’t cover:
- Folder, browser, and built-in tool approvals: these approvals never expire.
- Account-wide grants in Cowork: the account-wide Always allow and Allow for all tasks grants never expire. Of the two keys, only
mcpPersistentAlwaysAllowEnabledaffects them. - Claude Code allow rules in Code sessions: an allow rule in Claude Code’s own settings files, such as one saved when a user chose Always allow before the key was set, keeps allowing the tool, even with a value of
0, until someone removes it. For a scheduled task, look in the project’s.claude/settings.local.jsonfile.