Skip to content

Get started

Add the analyst to Claude

The AI spend analyst lives in Claude, Claude Code, Cursor and ChatGPT through Immiscible’s MCP server. Ask it what you spent on AI, what is being wasted and which keys nobody is watching. When it wants to change something, a person approves first.

The analyst is five tools on Immiscible’s MCP server at https://immiscible.fly.dev/mcp. Add the server to your assistant, and you can ask it, in your own words, what your company spent on AI last month, what cheaper models or caching would have cost, and which API keys nobody is watching. It answers from your own bills, through the same AI check as https://immiscible.fly.dev/check.

It can also ask to set a monthly budget or to switch a key off. It never does either on its own: a person approves each one, in Slack, Teams or the console, and the analyst hands back a signed receipt once it is done.

#Add it

You need an Immiscible workspace with some spend in it: a provider’s read-only admin key or a usage export, connected in the console under Spend, then Bills, or traffic through the gateway. For the keys, connect the providers under Settings, For engineers, Keys. The analyst answers for the person it acts for, and spend is visible to owners, admins and analysts. Someone with another role will be told so.

claude mcp add --transport http immiscible https://immiscible.fly.dev/mcp \
  --header "Authorization: Bearer $IMMISCIBLE_AGENT_KEY"
  • Claude Code: npx immiscible init makes the agent and writes IMMISCIBLE_AGENT_KEY to .env; load it with export $(grep IMMISCIBLE_ .env | xargs), then run the command. npx immiscible mcp --client claude-code prints it for your own server.
  • Claude on the web and Claude Desktop: the custom connector signs in with OAuth, so no key is pasted. The config file is the other way: it runs the bridge from packages/immiscible-desktop, which has no dependencies, with the agent key in its environment. Claude Desktop reads claude_desktop_config.json, under Settings, Developer.
  • Cursor: the entry goes in .cursor/mcp.json, or ~/.cursor/mcp.json for every project. npx immiscible mcp --client cursor prints it with a one-click install link.
  • ChatGPT: the same server, through a custom connector and OAuth. The tools that change something come back “waiting for approval” whatever the assistant does, and a person in your workspace decides.

Every client, with the config file paths, is in add the MCP server.

#Then paste this

Output
You can use Immiscible's spend analyst tools. Tell me what we spent on AI in
the last 30 days and where it went (spend_summary), what could have been
cheaper (find_waste), and which API keys nobody is watching (unwatched_keys).
Call every saving an estimate and say "up to"; never add the routing and
caching figures together. End with at most three things to do. Do not change
anything unless I ask. If I ask you to set a budget or switch a key off, use
set_budget or revoke_key, tell me it is waiting for a person to approve, and
only finish it once check_action_status says allow.

#What it can do

ToolWhat it doesChanges anything
spend_summaryThe last 30 days of AI spend, by provider, model, team or key, and a month-end forecast once there are 14 recent daysno
find_wasteWhat cheaper models (routing) and caching could have saved, each an upper bound labelled as an estimate with its method; the five biggest cost drivers; whether a budget is missingno
unwatched_keysKeys that still work but have not been used in 90 days, have no named owner, or sit on a personal email address, each with its redacted value, owner, last use and spendno
set_budgetAsks for a monthly budget for the workspace or a team. A person approves it firstyes, once approved
revoke_keyAsks to switch off a key from unwatched_keys. A person approves it, and then an owner confirms it in the console before the key stops working at the provideryes, once approved and confirmed

The three that read are marked read only, and the two that act are marked destructive, so your assistant knows which is which.

#How it asks before it acts

A change goes through the same gate as every agent’s request:

  1. The assistant calls set_budget or revoke_key. Nothing changes. Immiscible records the request and asks a person, in Slack, Teams or the console, with the amount or the key written out.
  2. The assistant tells you it is waiting, and checks with check_action_status.
  3. Once a person approves, the assistant calls the same tool again with the actionId. Exactly what was approved is applied, once, and the answer carries the signed receipt, which anyone can check at https://immiscible.fly.dev/v1/verify.

For the analyst to ask at all, its agent needs the Spend analyst rule: in the console, open Rules (https://immiscible.fly.dev/app/mandates) and add it to that agent. If the agent acts for you and the workspace has another owner, they confirm the rule first, as with any rule that gives an agent something new. Without the rule, the request is refused and the assistant says which rule to add. With it, every budget and key change still goes to a person; the rule only lets the analyst ask.

A budget can be approved by an owner or an admin. Switching a key off needs an owner to confirm it after the approval, and a different owner where there is more than one, as every revocation in discovery does.

#What it cannot see

  • Prompts and answers. The savings are estimates of the most they could be, not what you would have saved.
  • Keys from providers you have not connected for discovery, and agents that use keys you never gave us.
  • Spend on tools billed by seat, such as Copilot.
  • Anything before the 30 days it reads.

#Directory listings

As of 6 October 2026, the analyst is not listed in any directory: not in Claude’s connector directory, the ChatGPT app directory, Cursor’s directory or the MCP Registry. The server.json for the MCP Registry is ready in the repository but has not been published. Until a listing is live, add the server by its address, as above. We will say here when that changes, and we will not put a button on the site for a listing that is not live.