LPSignal
Uniswap/PancakeSwap/Aerodrome LP pools and price ranges ranked by net APR after impermanent loss
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"lpsignal": {
"url": "https://api.lpsignal.app/v1/mcp"
}
}
}Remote endpoints
https://api.lpsignal.app/v1/mcpstreamable-httphttps://api.lpsignal.app/v1/mcp/publicstreamable-httpWhat it can do
Tool inventory
Tools (7)
π’list_pools(chain, class, window, sort, order, ...)
Active pools ranked by the net APR (fees β impermanent loss) of their best price range over a window (default 7 days), with that range's ticks, TVL, 24h volume and the pool-level fee APR DEX sites show. Filter by chain and pool class.
Input Schema
{
"type": "object",
"properties": {
"chain": {
"type": "string",
"enum": [
"ethereum",
"bsc",
"base",
"arbitrum",
"optimism",
"polygon",
"robinhood"
]
},
"class": {
"type": "string",
"enum": [
"stable",
"correlated",
"volatile"
],
"description": "stable = stablecoin pairs, correlated = e.g. ETH/stETH, volatile = everything else"
},
"window": {
"type": "integer",
"enum": [
1,
24,
168,
720
],
"description": "backtest window in hours (default 168 = 7 days)"
},
"sort": {
"type": "string",
"enum": [
"netApr",
"feeApr",
"ilApr",
"inRange",
"tvl",
"volume24h",
"fees24h",
"poolApr"
],
"description": "default netApr"
},
"order": {
"type": "string",
"enum": [
"asc",
"desc"
]
},
"minTvlUsd": {
"type": "number",
"description": "default 10000"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "default 10"
},
"offset": {
"type": "integer",
"minimum": 0
}
},
"required": [],
"additionalProperties": false
}π’find_pair_pools(tokenA, tokenB, chain)
Every listed pool of a token pair across chains, DEXes and fee tiers (TVL β₯ $10k), each with its best range by 7-day net APR, best first β a small pool can rank first, so weigh tvlUsd. Symbols are matched case-insensitively, in either order.
Input Schema
{
"type": "object",
"properties": {
"tokenA": {
"type": "string",
"description": "e.g. USDC"
},
"tokenB": {
"type": "string",
"description": "e.g. WETH"
},
"chain": {
"type": "string",
"enum": [
"ethereum",
"bsc",
"base",
"arbitrum",
"optimism",
"polygon",
"robinhood"
]
}
},
"required": [
"tokenA",
"tokenB"
],
"additionalProperties": false
}π’get_pool(chain, address)
A pool's details and its backtest of every range it is evaluated on (fee APR, impermanent loss, net APR, time in range, the exact ticks) over 1 hour, 24 hours, 7 days and 30 days.
Input Schema
{
"type": "object",
"properties": {
"chain": {
"type": "string",
"enum": [
"ethereum",
"bsc",
"base",
"arbitrum",
"optimism",
"polygon",
"robinhood"
]
},
"address": {
"type": "string",
"description": "pool contract address (0x + 40 hex), or a Uniswap v4 pool id (0x + 64 hex)"
}
},
"required": [
"chain",
"address"
],
"additionalProperties": false
}π’backtest_range(chain, address, rangePct, days)
Backtest a symmetric range of Β±rangePct% around the price at the window's start (0 = full range) on a pool over the last `days` days: fee APR, impermanent loss, net APR, time in range, the ticks.
Input Schema
{
"type": "object",
"properties": {
"chain": {
"type": "string",
"enum": [
"ethereum",
"bsc",
"base",
"arbitrum",
"optimism",
"polygon",
"robinhood"
]
},
"address": {
"type": "string",
"description": "pool contract address (0x + 40 hex), or a Uniswap v4 pool id (0x + 64 hex)"
},
"rangePct": {
"type": "number",
"minimum": 0,
"maximum": 50,
"description": "half-width in percent; 0 = full range"
},
"days": {
"type": "integer",
"minimum": 1,
"maximum": 30,
"description": "default 7"
}
},
"required": [
"chain",
"address",
"rangePct"
],
"additionalProperties": false
}π’list_signals(kinds, source, limit, before)
The newest signals: opportunities (net_apr: a range paying a high net APR over 7 days and still today; burst: the last hour; hot_pool: a big pool's fee APR jumping) and risk alerts (depeg, tvl_outflow), with the exact ticks and, once scored, the realised outcome. Each says access: live, or delayed_24h (opportunities on a free plan or without sign-in appear 24 hours after they fired). Page back with before.
Input Schema
{
"type": "object",
"properties": {
"kinds": {
"type": "array",
"items": {
"type": "string",
"enum": [
"net_apr",
"burst",
"hot_pool",
"tvl_outflow",
"depeg",
"smart_lp"
]
}
},
"source": {
"type": "string",
"enum": [
"default",
"rules",
"subscribed"
],
"description": "with a key: rules = your custom-rule matches, subscribed = what your push channels deliver"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "default 10"
},
"before": {
"type": "string",
"description": "page: signals with an id below this"
}
},
"required": [],
"additionalProperties": false
}π’signal_track_record(kind, days)
How past opportunity signals really did: each is backtested again on its exact ticks after the fact (7 days for net_apr, 24 hours for burst). Counts, share positive, median APR at the signal vs realised, the worst.
Input Schema
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"net_apr",
"burst"
],
"description": "default net_apr"
},
"days": {
"type": "integer",
"minimum": 7,
"maximum": 365,
"description": "signals fired in the last N days (default 30)"
}
},
"required": [],
"additionalProperties": false
}π’smart_lp_leaderboard(windowDays, chain, limit)
Wallets ranked by what their closed LP positions made versus simply holding the tokens. Without a Pro key: the top 10, addresses masked.
Input Schema
{
"type": "object",
"properties": {
"windowDays": {
"type": "integer",
"enum": [
30,
90
]
},
"chain": {
"type": "string",
"enum": [
"ethereum",
"bsc",
"base",
"arbitrum",
"optimism",
"polygon",
"robinhood"
]
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "default 10"
}
},
"required": [],
"additionalProperties": false
}Community
Evidence