# IMBA Agent Spend

> IMBA spend MCP: USDT TRC-20 deposit and catalog buy with your key. No withdraw.

- name: com.imbawallet/agent
- version: 0.1.4
- connection class: R1 (autonomous)
- trust: 97/100
- quality: 91/100 (strong)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.imbawallet%2Fagent
- tools: https://api.protogrid.dev/v1/servers/com.imbawallet%2Fagent/tools

**An agent can connect on its own if it already holds `X_IMBA_AGENT_PRIVATE_KEY`, `X_IMBA_AGENT_PRIVATE_KEY`.** Remote endpoint behind a static API key or header. The registry never sees the value; the agent fills the placeholder.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "agent": {
      "type": "http",
      "url": "https://imbawallet.com/mcp/spend",
      "headers": {
        "X-IMBA-Agent-Client-Id": "${X_IMBA_AGENT_CLIENT_ID}",
        "X-IMBA-Agent-Private-Key": "${X_IMBA_AGENT_PRIVATE_KEY}",
        "Authorization": "${X_IMBA_AGENT_PRIVATE_KEY}"
      }
    }
  }
}
```

Placeholders to fill: `${X_IMBA_AGENT_PRIVATE_KEY}`, `${X_IMBA_AGENT_PRIVATE_KEY}`.

## Trust

- hygiene: 100
- liveness: 100
- freshness: 85
- provenance: 100
- drivers: +repository +namespace-matches-repo +dns-namespace +website +reachable +uptime-99% ~updated-50d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 91/100 (strong)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 86 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 19 of 19 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: get_card_details (openWorldHint); kyt_checks (openWorldHint); get_deposit_address (openWorldHint); …
- pass `tools.token_cost`: about 2,327 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: 100 (weight 15)

- pass `deps.known_vulns`: no known advisory in 1 resolved packages
- n/a `deps.mcp_sdk_version`: the official MCP SDK is not in the dependency graph
- pass `deps.resolvable`: @imba_wallet/agent-mcp@0.1.4 resolved: 1 packages

- tools: 19, about 2,327 tokens to load them all
- tool set hash: b88f2ba232bdc05c373a96b9c9ee8be3
- badge: [![protogrid quality](https://protogrid.dev/badge/com.imbawallet/agent.svg)](https://protogrid.dev/servers/com.imbawallet/agent)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Dependencies

- npm @imba_wallet/agent-mcp@0.1.4: resolved, 0 dependencies

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0.

## Remotes

- https://imbawallet.com/mcp/spend (streamable-http, auth api_key ${X_IMBA_AGENT_PRIVATE_KEY}, reachable true, uptime30d 0.9915254)

## Packages

- npm @imba_wallet/agent-mcp@0.1.4 secrets: IMBA_AGENT_PRIVATE_KEY

## Tools (19)

- `create_card`: Issue a Visa/MasterCard prepaid from this agent 2401 USDT so the agent can pay merchants that require a card (airlines, hotels, SaaS, datacenter/GPU clouds). POST /api/pin/create_card. ext_id required. imba_product_id is core.card_product.id. Never payment_source=stars. Never pass client_id. IMBA does not create the booking.
- `get_balance`: GET /api/balance. USDT is the spendable catalog currency.
- `get_card_details`: POST /api/pin/get_card_details for a card this agent owns. Needed to present PAN at merchant checkout (airline, datacenter, SaaS). PAN/CVV arrive as card_encrypted JWE when jwe_public_key is registered (PATCH webhook). Without that key the number is masked. Never logs raw PAN. cvv defaults true. Never pass client_id.
- `get_deposit_address`: POST /api/deposit_address blockchain=tron. Address is issued for the authenticated agent only. Always re-fetch before send. Do not cache. USDT TRC-20 only. 24h unfunded hold.
- `get_spend_policy`: Forbidden rails and tier rules. Allowed catalog: Visa prepaid, travel eSIM, gift cards, paid KYT address screen. Read-only.
- `kyt_check`: Screen a crypto address for dirt (sanctions / mixer exposure). Use BEFORE you accept a TRC-20 send, or AFTER a wallet is blocked and the reason is unclear. POST /api/kyt_check. Body: network (tron_usdt | eth | btc) + address. Debits ~0.99 USDT from 2401. Returns a report — does not gate deposit, does not ban or unblock. TON is not in this catalog. Never pass client_id. Space ~1s.
- `kyt_check_get`: POST /api/kyt_check_get. Poll until the report is ready. Own check only (404 otherwise). Use after kyt_check when a wallet was blocked and you need the dirt report. Never pass client_id.
- `kyt_checks`: POST /api/kyt_checks. Own KYT history plus quote fields. Use to find a past address check. Space ~1s. Never pass client_id.
- `kyt_quote`: POST /api/kyt_quote. Price for a paid crypto-address screen (Didit). Debit is on kyt_check (~0.99 USDT from 2401), not on quote. Off unless didit.enabled and didit.agent_api. Does not gate TRON deposit. Not /api/client/kyt_* and not partner. Space ~1s.
- `list_card_products`: POST /api/card_products. Use id as imba_product_id for create_card (Visa prepaid). Space catalog calls ~1s apart.
- `list_cards`: POST /api/cards for the authenticated agent. No client_id argument.
- `list_esim_plans`: POST /api/esim/plans. Travel/data eSIM. esim_provider=yesim. Optional country ISO2. Use plan id with purchase_esim. Space catalog calls ~1s apart (agent catalog_gap).
- `list_gift_offers`: POST /api/offers. Live gift catalog (~20k positions / ~2k unique: Apple, Google Play, Steam, games, travel, retail). Optional query string. Then purchase_gift with offer_id + ext_id. Space catalog calls ~1s apart. Do not assume a SKU.
- `list_notifications`: POST /api/notifications. Poll this when a Visa payment asks for 3-D Secure. Agents keep payload.code (never SMS, never Telegram). category=codes for 3-D Secure OTP. Also delivered on webhook field otp if callback_url is set, and optional email. Space catalog calls ~1s apart.
- `purchase_esim`: POST /api/esim/new_plan5. Buy a travel/data eSIM plan from this agent 2401. Omit blank/null iccid so SQL takes the new-eSIM path. A set iccid must already belong to this agent. ext_id required. Never Stars.
- `purchase_gift`: POST /api/purchase. Buy a brand gift code (Apple, Steam, Google Play, … — live list). ext_id required. Never payment_source=stars.
- `rotate_hmac`: POST /auth/v1/agent/hmac/rotate. Previous HMAC dies immediately. Requires an existing callback_url (400 callback_url required before rotate otherwise). Pass callback_url here to PATCH webhook first. Plaintext HMAC is returned once — store it; never a Wallet JWT.
- `set_webhook`: PATCH /auth/v1/agent/webhook. Sets https callback_url (required before hmac/rotate), optional X25519 jwe_public_key for card_encrypted, optional email for 3DS OTP. Not SMS. HMAC plaintext is shown once when a URL is first accepted.
- `topup_card`: POST /api/pin/topup_card from this agent 2401 USDT. card_id must belong to the same agent (SQL owner guard). ext_id required. Never Stars.
