One rule
A tool call costs whatever the operation behind it costs.An extraction started from Claude and an extraction started with
POST /api/v2/extractions are the same extraction and are charged the same. There is
no MCP surcharge, no separate allowance, and no separate wallet.
Where the spend appears
Usage is written to the sameCreditUsageLog the rest of the platform writes
to, tagged source='mcp'. So MCP spend is separable from WhatsApp, phone,
website-widget and Runtime API spend in the usage screen, rather than
disappearing into whichever bucket happened to be the default.
That tag is the whole reason the source enum grew.
source defaults to
whatsapp; a new channel that does not declare its own is invoiced and
reported as WhatsApp spend, which is wrong on the bill and invisible in the
one report that would have shown it. The Runtime API’s api source exists for
exactly the same reason.Running out
The billing gate runs before any tool that spends — not after, and not inside the work. When it refuses, you get a tool error, not a fault:usage_blocked for the same condition, and that is the right
answer there — but a 402 reaching a chat client is a transport failure the model
cannot narrate, and a user gets a spinner and a shrug instead of a sentence.
Read tools keep working while the wallet is empty. You can still list agents,
read conversations and poll jobs — being out of credit stops you starting new
work, not looking at what you have.
Watching it
Ask the connected client:What is my ImpelLabs credit balance?That tool needs
usage:read and costs nothing. The dashboard’s usage screen
carries the same figure with the mcp source broken out.
Rate limits
The other reason a call gets refused, and the one where retrying does help.

