Injective Trading Account, Skill Guide
Query balances and open positions for any Injective account. No transactions/ signatures required. All reads are public.
When to apply
- When you are trading on Injective, and need information about your account
- When you are performing queries but not intending to perform transactions
MCP Tools
The following tools in the Injective MCP Server are used by this skill.
Use the injective-mcp-servers skill for instructions on set up and usage.
The "activities" section describes the when and how to make these tool calls.
account_balances
Returns bank + subaccount balances for an address.
account_balances
address: inj1...
denom: usdt ← optional: filter to one token
Returns:
bankBalances[]- wallet-level balances (all denoms or filtered)subaccountBalances[]- per-subaccount trading balancessubaccountId- 0x... hex IDdenom- token denomdeposit.totalBalance- total (available + in orders)deposit.availableBalance- free to trade
account_positions
Returns open perpetual positions with P&L.
account_positions
address: inj1...
market: BTC ← optional: filter by symbol
Returns per position:
market- symbol (BTC, ETH, etc.)direction- long | shortquantity- contracts heldentryPrice- average entry in USDTmarkPrice- current oracle priceunrealizedPnl- USDT P&L at mark pricemargin- posted marginleverage- effective leverage
token_metadata
Resolve any denom to human-readable metadata.
token_metadata
denom: peggy0xdac17f958d2ee523a2206206994597c13d831ec7
Returns: { symbol, name, decimals, type, peggyDenom }
Activities
When the user's request contains the following questions, map them to the MCP tool calls indicated.
"What's my balance?"
account_balances(address: inj1...)
→ show bankBalances + subaccountBalances summary
"Do I have enough USDT to trade?"
account_balances(address: inj1..., denom: usdt)
→ check subaccountBalances[0].deposit.availableBalance
If bank balance has USDT but subaccount doesn't:
Use subaccount_deposit to move funds in.
Note that this is not a read/ query, and will involve a transaction.
Important: Bank balance (wallet) ≠ exchange subaccount balance. Funds must be deposited to the exchange subaccount via MsgDeposit before placing derivative orders. Always check subaccount balance and auto-deposit if needed before trading.
"Show my positions and P&L"
account_positions(address: inj1...)
→ display each position with entry vs mark price and unrealizedPnl
"What's my total portfolio value?"
account_balances → sum all balances in USD equivalent
account_positions → add unrealized P&L
Denoms
Denoms are analogous to cryptocurrencies and fungible tokens. Injective, being a MultiVM blockchain, supports multiple categories of denoms.
Denoms of different categories have different formats. See: ./references/denom-formats.md
Use token_metadata to resolve any denom to a human-readable symbol.
Margin Calculation
When estimating required margin for a position:
- Add 1–2% buffer above the exact minimum (
price × qty × initialMarginRatio). The chain may reject orders at the exact minimum due to rounding. - Use
max(oraclePrice, markPrice)for margin validation. The chain validates against the higher of the two. Margin calculated from oracle price alone may be insufficient if mark price is higher. stakeUsdtis margin, not notional. The user's stake is their margin (collateral).qty = stake × leverage / price.
Subaccount IDs
Injective uses subaccounts for isolated margin.
The default subaccount index is 0:
subaccountId = address + "000000000000000000000000" + "0".padStart(24, "0") + "0000"
In practice, the MCP tools default to subaccount index 0 automatically.
Advanced users can specify subaccountId explicitly on trade tools.
Related skills
This skill uses the following skills:
injective-mcp-servers
If these skills are not available, selectively run the following commands to install them:
npx skills add InjectiveLabs/agent-skills --skill injective-mcp-servers
Prerequisites
- Injective MCP server must be running
- User prompts should be issued from an AI tool that is configured to talk to the Injective MCP server