Managed fleet
MDM carries one stable trust profile, and the gateway serves the policy. A policy edit then needs a Claude relaunch, not a profile redeployment.
This is the bootstrap model, which most fleets deploy. First-party and static are compared under Other policy models. Before you start, know the trade: third-party inference ends claude.ai admin-console delivery for the fleet (what that costs). If that console delivers your connectors today, keep Desktop first-party and let Anyray route the coding tools.
Set up the fleet
Set ANYRAY_GATEWAY_PUBLIC_URL to the deployment's public HTTPS gateway origin. Then open Users,
choose Invite users, and open Claude Desktop policy in the macOS steps.
Export a .mobileconfig from Claude Desktop's Configure Third-Party Inference window on an
unmanaged staging Mac
(authoring guide). In Anyray,
choose Import Claude export. JSON works too.
| Comes across | Dropped |
|---|---|
| Models, connectors, plugin marketplaces and skills, workspace and tool restrictions, egress, app policy | Inference URL, helper path, API key, custom headers |
The gateway owns everything in the second column.
In Connectors on Users, paste a claude.ai connector page or add one from the catalog. Anyray asks the server what it is and lists its tools before you add it. Edits reach managed Claude Desktop on the next relaunch, and each developer authorizes OAuth connectors with their own account.
Every row says where the connector reaches. Built-ins and local commands stay on Desktop. The gateway serves remote connectors to every managed tool.
In Skills & Guidance on Users, upload each SKILL.md and write the shared Guidance.
Managed Claude Desktop gets both from the gateway after a relaunch. Every other tool Connect
manages gets the same files in its skills folder on the next policy pull. See
Sync team content.
Package anyray-connect for the fleet, then write both wrappers, the credential helper at
/usr/local/bin/anyray-credential-helper and the bootstrap-headers helper at
/usr/local/bin/anyray-bootstrap-headers-helper:
sudo anyray-connect desktop helper --write --platform posix \
--bin /usr/local/bin/anyray-connect
Choose Download .mobileconfig, then distribute it with Jamf or another MDM. The profile pins
the bootstrap URL (/connect/claude-desktop/bootstrap?os=macos) and the MDM-only
bootstrapHeadersHelper path, hides the claude.ai sign-in option, and holds no API key.
Open Help → Troubleshooting → Copy Managed Configuration Report. It lists which keys the app read, and from which source. Trust the report, not the window.
| What you see | What it means |
|---|---|
| macOS: Configure Third-Party Inference still opens editable | No recognized key reached the app, even when the MDM console reports the profile as delivered |
| Windows: the window is locked | Any value directly under HKLM\SOFTWARE\Policies\Claude locks it, read or not. A locked window proves nothing |
| The report shows the profile, but the app still signs into claude.ai | The profile predates disableDeploymentModeChooser. Redeploy the current one |
The bootstrap and Skills & Guidance URLs answer unauthenticated fetches, so anyone who knows a URL can read its content. Anyray enforces that no credential goes in either, and you should treat internal connector URLs, instructions, and restrictions as discoverable. Use the static model when that is unacceptable.
Three limits to plan around
- Connector OAuth grants, cookies, account sessions, and "Made by Anthropic" connectors cannot be imported. Rebuild supported connectors in the staging configuration, then have each developer authorize them with their own account.
- Anyray prepares the artifact and your MDM installs it. The endpoint-control agent is not a general-purpose MDM and does not install arbitrary macOS profiles.
- Fleet artifacts do not install the Anyray retrieval MCP through
managedMcpServers. Treat retrieval coverage as partial unless the exported policy carries an equivalent tested managed server definition.
How the bootstrap fetch authenticates
Claude Desktop 1.34493.1 and later sends the bootstrap fetch with the headers the
bootstrapHeadersHelper prints. Anyray's wrapper prints Authorization: Bearer <client key> for
the enrolled user, and the gateway answers 401 when it is not a valid client key.
Every Anyray-generated third-party profile (console download, desktop fleet bootstrap, and
desktop fleet static) sets disableDeploymentModeChooser, which hides the claude.ai sign-in
option on managed machines. Without it, a user already signed into claude.ai stays first-party
and the bootstrap is never fetched.
Local one-off test
Quit Claude, set deploymentMode to "3p" in
~/Library/Application Support/Claude-3p/claude_desktop_config.json, and relaunch. This is a
local test only, never a fleet mechanism.
Other policy models
| Model | What MDM carries | How configuration changes |
|---|---|---|
| Bootstrap (this page) | A stable HTTPS URL, the bootstrap-headers helper path, and optional OIDC parameters | Update the bootstrap response, then relaunch Claude |
| First-party | Device policy only, and no inference* key | Desktop stays on claude.ai, and Anyray covers the coding tools |
| Static | The complete policy exported from Claude Desktop, including the fleet credential-helper path | Edit and test in Claude Desktop, then export and redeploy the profile |
Prefer static over bootstrap when the bootstrap policy's unauthenticated readability is unacceptable (full comparison). Already running your own bootstrap or OIDC service? Connect emits its trust anchor instead: Centrally refreshed configuration.
A fleet that switched to third-party by accident recovers cleanly: Recover a fleet that already switched. The one managed Mac, no MDM case is there too.
For Claude Code and the other coding surfaces, continue with Bulk enrollment (MDM).