Plugin with MDM
This is the path we recommend for most organizations. You deliver the configuration as a file on each device using the device management you already run: Jamf, Kandji, Intune, JumpCloud, or Linux provisioning tooling.
Two reasons it’s usually the better choice:
- You choose who gets it. Target specific devices or groups, so you can pilot with one team, confirm the data looks right, and widen from there. Managed settings applies to every authenticated user in the org at once, with no way to stage it.
- It uses tooling admins already operate. Pushing a config file to a device group is routine work for whoever runs your fleet, with no new admin surface, and it covers developers on personal Claude accounts and machines whose accounts you don’t centrally control.
The configuration itself is identical to the managed settings path; only the delivery differs. Claude Code reads it locally instead of fetching it from Anthropic.
What lands on the device
A single JSON drop-in, written as root:
Claude Code deep-merges everything in managed-settings.d/ with any existing managed-settings.json, so this is additive: it won’t clobber other policies you already push.
Settings delivered this way are org-enforced: users cannot disable the plugin or override the OPIK_CIPX_* environment, and they apply to every user on the device.
Prepare the configuration
Generate it from Cost Intelligence → Organization Policies → Copy settings file, or start from this template:
The file holds an API key and is world-readable on the device by design, because Claude Code runs as the logged-in user and must be able to read it. Use a service-account key scoped to ingest, never a personal token, and rotate it by re-deploying.
Validate before shipping. A malformed payload is silently ignored by some MDMs, which gives you a rollout that reports success and enforces nothing:
Deploy
Any MDM (Jamf, Kandji, Intune)
JumpCloud
Linux
Ship the JSON to the device (a pkg payload, or a “files and script” policy), then place it as root:
MDM script runners already execute as root. Use absolute tool paths; those runners typically have a minimal PATH.
Verify
As the logged-in user, in a fresh Claude Code session (managed settings load at startup):
Then confirm traces are arriving in the target workspace.
Updating configuration later
Two things worth separating, because it determines how often you touch your MDM:
- Bootstrap configuration: workspace, API key, base URL, upstream gateway. Changing these means re-deploying the file.
- Cost policies: model defaults, output caps, denied MCP servers and skills, thinking budgets. These do not require an MDM push. The daemon fetches the effective policy for the signed-in user from Opik on startup and on an interval, then applies it to the agent’s config.
So you push this file once, and manage cost policy from the Opik dashboard afterwards.
Uninstall
Then, on each device, opik-cipx uninstall removes the hook, stops the daemon, and deletes local state.