Protocol

Credits & Billing

What costs a credit

Method / toolCost
initializeFree
tools/listFree
pingFree
notifications/*Free
tools/callaccount_statusFree
tools/call → any other tool1 credit

Credits are organisation-wide, not per-key. They are shared with the REST API: any credits purchased for your account are usable across both surfaces.

How charging works

For every paid tools/call:

  1. The server debits 1 credit before running the tool.
  2. The request executes (with a 15-second timeout).
  3. On success, the response is returned with credits.charged: 1.
  4. On error or timeout, the credit is automatically refunded and credits.refunded: true. You are not billed for failed lookups.

Argument validation runs before the charge step, so malformed requests never consume a credit.

Reading your balance

Every response includes the live balance in result._meta.precursor.credits:

"credits": {
  "charged": 1,
  "remaining": 9998,
  "refunded": false
}

For a quick, free balance check, call the account_status tool. It is the only tool that returns credit balance and key metadata at no cost.

Check your balance
curl -s https://mcp.precursorintelligence.com \
  -H "Authorization: Bearer $PRECURSOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"account_status","arguments":{}}}'

Insufficient credits

Once your balance drops below 1, paid tool calls return:

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": { "code": -32002, "message": "insufficient_credits" }
}

The response carries HTTP status 402. The error persists until you top up from your dashboard. Free methods (initialize, tools/list, ping) and the account_status tool continue to work, so you can always check your balance before topping up.

Cost guidance per tool

Every paid tool costs exactly 1 credit per successful call. There are no premium tools, and pagination does not multiply the cost (one call to search_iocs with limit: 200 is still 1 credit). To keep spend low:

  • Filter aggressively. A broad query with no type filters may return truncated results at the same cost as a precise, targeted one.
  • Cache locally where appropriate. CVE and CPE data refreshes on a 60-second cadence at the source.
  • Use account_status for health checks: it returns your credit balance and key metadata in one free call.
Refunds are automatic

You do not need to detect or claim refunds. When the server times out or returns an error, the credit is reversed before the response is sent, and credits.refunded: true is set so you can log it.