get_balance
Retrieve the current balance of a wallet for a specific or all networks, with optional fiat currency conversion.
Instructions
Get the current balance of the wallet.
Tool call template
This tool declares no required parameters. Add optional parameters from the input schema as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {},
"name": "get_balance"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Query balance for specific network (e.g., "polygon-mainnet" or CAIP-2 "eip155:137"). Use "all" for all networks. Required for EVM wallets; auto-resolved for Solana. | |
| display_currency | No | Display currency for balance conversion (e.g. KRW, EUR). Defaults to server setting. | |
| wallet_id | No | Target wallet ID. Required for multi-wallet sessions; auto-resolved when session has a single wallet. |
Implementation Reference
- Main handler for the 'get_balance' MCP tool. Registers the tool with Zod schema for network, display_currency, and wallet_id params. Calls GET /v1/wallet/balance API endpoint and returns the result via toToolResult helper.
export function registerGetBalance(server: McpServer, apiClient: ApiClient, walletContext?: WalletContext): void { server.tool( 'get_balance', withWalletPrefix('Get the current balance of the wallet.', walletContext?.walletName), { network: z.string().optional().describe('Query balance for specific network (e.g., "polygon-mainnet" or CAIP-2 "eip155:137"). Use "all" for all networks. Required for EVM wallets; auto-resolved for Solana.'), display_currency: z.string().optional().describe('Display currency for balance conversion (e.g. KRW, EUR). Defaults to server setting.'), wallet_id: z.string().optional().describe('Target wallet ID. Required for multi-wallet sessions; auto-resolved when session has a single wallet.'), }, async (args) => { const params = new URLSearchParams(); if (args.network) params.set('network', args.network); if (args.display_currency) params.set('display_currency', args.display_currency); if (args.wallet_id) params.set('walletId', args.wallet_id); const qs = params.toString(); const result = await apiClient.get('/v1/wallet/balance' + (qs ? '?' + qs : '')); return toToolResult(result); }, ); } - Zod input schema for get_balance tool: network (optional string), display_currency (optional string), wallet_id (optional string).
{ network: z.string().optional().describe('Query balance for specific network (e.g., "polygon-mainnet" or CAIP-2 "eip155:137"). Use "all" for all networks. Required for EVM wallets; auto-resolved for Solana.'), display_currency: z.string().optional().describe('Display currency for balance conversion (e.g. KRW, EUR). Defaults to server setting.'), wallet_id: z.string().optional().describe('Target wallet ID. Required for multi-wallet sessions; auto-resolved when session has a single wallet.'), }, - packages/mcp/src/server.ts:17-94 (registration)Import and registration of registerGetBalance in the MCP server factory. Line 17 imports the function, line 94 calls it with server, apiClient, and walletContext.
import { registerGetBalance } from './tools/get-balance.js'; import { registerGetAddress } from './tools/get-address.js'; import { registerGetAssets } from './tools/get-assets.js'; import { registerListTransactions } from './tools/list-transactions.js'; import { registerGetTransaction } from './tools/get-transaction.js'; import { registerGetNonce } from './tools/get-nonce.js'; import { registerCallContract } from './tools/call-contract.js'; import { registerApproveToken } from './tools/approve-token.js'; import { registerSendBatch } from './tools/send-batch.js'; import { registerGetWalletInfo } from './tools/get-wallet-info.js'; import { registerEncodeCalldata } from './tools/encode-calldata.js'; import { registerSignTransaction } from './tools/sign-transaction.js'; import { registerX402Fetch } from './tools/x402-fetch.js'; import { registerWcConnect } from './tools/wc-connect.js'; import { registerWcStatus } from './tools/wc-status.js'; import { registerWcDisconnect } from './tools/wc-disconnect.js'; import { registerConnectInfo } from './tools/connect-info.js'; import { registerGetPolicies } from './tools/get-policies.js'; import { registerListSessions } from './tools/list-sessions.js'; import { registerGetTokens } from './tools/get-tokens.js'; import { registerListIncomingTransactions } from './tools/list-incoming-transactions.js'; import { registerGetIncomingSummary } from './tools/get-incoming-summary.js'; import { registerGetDefiPositions } from './tools/get-defi-positions.js'; import { registerGetHealthFactor } from './tools/get-health-factor.js'; import { registerSimulateTransaction } from './tools/simulate-transaction.js'; import { registerErc8004GetAgentInfo } from './tools/erc8004-get-agent-info.js'; import { registerErc8004GetReputation } from './tools/erc8004-get-reputation.js'; import { registerErc8004GetValidationStatus } from './tools/erc8004-get-validation-status.js'; import { registerGetProviderStatus } from './tools/get-provider-status.js'; import { registerSignMessage } from './tools/sign-message.js'; import { registerErc8128SignRequest } from './tools/erc8128-sign-request.js'; import { registerErc8128VerifySignature } from './tools/erc8128-verify-signature.js'; import { registerListNfts } from './tools/list-nfts.js'; import { registerGetNftMetadata } from './tools/get-nft-metadata.js'; import { registerTransferNft } from './tools/transfer-nft.js'; import { registerBuildUserop } from './tools/build-userop.js'; import { registerSignUserop } from './tools/sign-userop.js'; import { registerHyperliquidTools } from './tools/hyperliquid.js'; import { registerPolymarketTools } from './tools/polymarket.js'; import { registerListOffchainActions } from './tools/list-offchain-actions.js'; import { registerListCredentials } from './tools/list-credentials.js'; import { registerGetRpcProxyUrl } from './tools/get-rpc-proxy-url.js'; import { registerResolveAsset } from './tools/resolve-asset.js'; // Resource registrations (Task 2) import { registerWalletBalance } from './resources/wallet-balance.js'; import { registerWalletAddress } from './resources/wallet-address.js'; import { registerSystemStatus } from './resources/system-status.js'; import { registerSkillResources } from './resources/skills.js'; export interface WalletContext { walletName?: string; // e.g., 'trading-bot' } /** * Prefix description with wallet name for multi-wallet identification (MCPS-03). */ export function withWalletPrefix(description: string, walletName?: string): string { return walletName ? `[${walletName}] ${description}` : description; } export function createMcpServer(apiClient: ApiClient, walletContext?: WalletContext): McpServer { const serverName = walletContext?.walletName ? `waiaas-${walletContext.walletName}` : 'waiaas-wallet'; const server = new McpServer({ name: serverName, version: PKG_VERSION, }); // Register 42 tools registerConnectInfo(server, apiClient); registerListSessions(server, apiClient); registerGetPolicies(server, apiClient, walletContext); registerGetTokens(server, apiClient, walletContext); registerSendToken(server, apiClient, walletContext); registerGetBalance(server, apiClient, walletContext); - ApiClient.get() method used by the handler to make the actual HTTP GET request to the daemon's /v1/wallet/balance endpoint.
export function toToolResult<T>(result: ApiResult<T>): CallToolResult { if ('ok' in result && result.ok) { return { content: [{ type: 'text', text: JSON.stringify(result.data) }], }; } if ('expired' in result && result.expired) { return { content: [{ type: 'text', text: JSON.stringify({ session_expired: true, message: result.message, action: 'Run waiaas mcp setup to get a new token', }), }], // NO isError (H-04: prevents Claude Desktop from disconnecting) }; } if ('networkError' in result && result.networkError) { return { content: [{ type: 'text', text: JSON.stringify({ network_error: true, message: result.message, }), }], // NO isError }; } // Actual API error -- isError: true if ('error' in result) { return { content: [{ type: 'text', text: JSON.stringify({ error: true, ...result.error, }), }], isError: true, }; } // Should never happen -- fallback return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: 'Unknown error' }) }], isError: true, }; } /** * Convert ApiResult to MCP resource result format (ReadResourceResult). */ export function toResourceResult<T>(uri: string, result: ApiResult<T>): ReadResourceResult { if ('ok' in result && result.ok) { return { contents: [{ uri, text: JSON.stringify(result.data), mimeType: 'application/json', }], }; } if ('expired' in result && result.expired) { return { contents: [{ uri, text: JSON.stringify({ session_expired: true, message: result.message, action: 'Run waiaas mcp setup to get a new token', }), mimeType: 'application/json', }], }; } if ('networkError' in result && result.networkError) { return { contents: [{ uri, text: JSON.stringify({ network_error: true, message: result.message, }), mimeType: 'application/json', }], }; } if ('error' in result) { return { contents: [{ uri, text: JSON.stringify({ error: true, ...result.error, }), mimeType: 'application/json', }], }; } return { contents: [{ uri, text: JSON.stringify({ error: true, message: 'Unknown error' }), mimeType: 'application/json', }], }; } // --- ApiClient --- export class ApiClient { private readonly sessionManager: SessionManager; private readonly baseUrl: string; constructor(sessionManager: SessionManager, baseUrl: string) { this.sessionManager = sessionManager; this.baseUrl = baseUrl.replace(/\/+$/, ''); } async get<T>(path: string): Promise<ApiResult<T>> {