Skip to main content
Glama
clumsynonono

Aave Liquidation MCP Server

by clumsynonono

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
NameRequiredDescriptionDefault
addressYesEthereum address to query

Implementation Reference

  • src/index.ts:81-95 (registration)
    Registration of the 'get_user_positions' tool in the MCP server's listTools handler, including name, description, and input schema.
    { 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'], }, },
  • MCP server handler for 'get_user_positions' tool: validates input, calls AaveClient.getUserReserves, and formats response as JSON.
    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 ), }, ], }; }
  • Core implementation of get_user_positions: fetches all reserves, queries user reserve data in parallel, categorizes into collateral and debt positions with formatted values.
    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 }; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/clumsynonono/aave-liquidation-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server