get_user_positions
Retrieve detailed breakdown of user collateral and debt positions across all Aave V3 assets to analyze position health and identify liquidation opportunities.
Instructions
Get detailed breakdown of a user collateral and debt positions across all Aave V3 assets.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Ethereum address to query |
Implementation Reference
- src/aave-client.ts:82-129 (handler)Core implementation of the get_user_positions tool. Retrieves user's collateral and debt positions by fetching all reserves and parallel querying user reserve data for each reserve, then categorizing and formatting the positions.async getUserReserves(userAddress: string): Promise<{ collateral: UserReserveData[]; debt: UserReserveData[]; }> { const reserves = await this.getAllReserves(); const collateral: UserReserveData[] = []; const debt: UserReserveData[] = []; // Parallel query all user reserves const userReservePromises = reserves.map(reserve => this.dataProviderContract.getUserReserveData(reserve.tokenAddress, userAddress) ); const userReservesData = await Promise.all(userReservePromises); // Process results for (let i = 0; i < reserves.length; i++) { const reserve = reserves[i]; const userReserve = userReservesData[i]; const totalDebt = userReserve.currentStableDebt + userReserve.currentVariableDebt; if (userReserve.currentATokenBalance > 0n || totalDebt > 0n) { // Use cached decimals from reserves const decimals = reserve.decimals; const data: UserReserveData = { asset: reserve.tokenAddress, symbol: reserve.symbol, currentATokenBalance: userReserve.currentATokenBalance, currentStableDebt: userReserve.currentStableDebt, currentVariableDebt: userReserve.currentVariableDebt, usageAsCollateralEnabled: userReserve.usageAsCollateralEnabled, decimals, balanceFormatted: ethers.formatUnits(userReserve.currentATokenBalance, decimals), debtFormatted: ethers.formatUnits(totalDebt, decimals), liquidationBonus: reserve.liquidationBonus, }; if (userReserve.currentATokenBalance > 0n) { collateral.push(data); } if (totalDebt > 0n) { debt.push(data); } } } return { collateral, debt }; }
- src/index.ts:275-309 (handler)MCP CallToolRequestSchema handler case for get_user_positions. Validates the address input and delegates to AaveClient.getUserReserves, then formats and returns the response as MCP content.case 'get_user_positions': { const address = args?.address as string; if (!address || typeof address !== 'string') { throw new McpError( ErrorCode.InvalidParams, 'address parameter is required and must be a string' ); } if (!aaveClient.isValidAddress(address)) { throw new McpError( ErrorCode.InvalidParams, 'Invalid Ethereum address format' ); } const positions = await aaveClient.getUserReserves(address); return { content: [ { type: 'text', text: JSON.stringify( { address, collateralPositions: positions.collateral, debtPositions: positions.debt, }, null, 2 ), }, ], }; }
- src/index.ts:82-94 (schema)Input schema definition and tool registration for get_user_positions in the ListToolsRequestSchema response.name: 'get_user_positions', description: 'Get detailed breakdown of a user collateral and debt positions across all Aave V3 assets.', inputSchema: { type: 'object', properties: { address: { type: 'string', description: 'Ethereum address to query', }, }, required: ['address'], },