leverage
Leveraged-yield router on Morpho. List strategies, simulate, and build UNSIGNED txs.
使うべきか
品質と安全性
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"leverage": {
"url": "https://api.spiralstake.xyz/mcp"
}
}
}リモートエンドポイント
https://api.spiralstake.xyz/mcpstreamable-httpできること
ツール一覧
ツール(10)
🟢list_strategies(category, chainId)
List eligible Spiral strategies on a chain with raw risk facts (collateral/borrow APY, leverage ladder, oracle type, exit liquidity, LTVs, curator). Mainnet (1): correlated yield loops on stables, ETH, BTC and Pendle PTs. Robinhood Chain (4663): stable loops on USDG, directional perps (spiralHints.profile 'leveraged_perp' — APYs are financing carry only) and stock + yield equity vaults (profile 'equity_yield_vault', ids start with 'equity-'). Optionally filter by collateral category.
入力スキーマ
{
"type": "object",
"properties": {
"category": {
"type": "string",
"description": "Filter by collateral category: 'stable', 'ETH', 'BTC', 'stable-PT', 'stocks' (equity vaults), 'Other' (perps)."
},
"chainId": {
"type": "integer",
"description": "Chain to target. Supported: 1, 4663. Default: 1."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_strategy(id, chainId)
Get one eligible strategy's full raw facts by its Morpho market id.
入力スキーマ
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Morpho market id (0x followed by 64 hex chars)."
},
"chainId": {
"type": "integer",
"description": "Chain to target. Supported: 1, 4663. Default: 1."
}
},
"required": [
"id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_prices(chainId)
Current USD prices of every loan and collateral token the chain's strategies use (token address -> USD), including equity-vault stocks. Loan tokens are priced from CoinGecko; collateral from the market oracle × its loan token's price — the same figures the strategies' priceUsd fields carry.
入力スキーマ
{
"type": "object",
"properties": {
"chainId": {
"type": "integer",
"description": "Chain to target. Supported: 1, 4663. Default: 1."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢simulate_leverage(strategyId, payToken, amount, leverage, desiredLtv, ...)
Preview opening a leveraged position — deterministic, read-only, no wallet needed. Returns the resulting leverage, effective LTV, leveraged collateral, expected leveraged APY, price impact, the auto-selected execution path, flash-loan size, and (if the flash loan exceeds direct market liquidity) the public-allocator reallocation fee. Numbers move with market prices.
入力スキーマ
{
"type": "object",
"properties": {
"strategyId": {
"type": "string",
"description": "Morpho market id of the strategy (from list_strategies / get_strategy)."
},
"payToken": {
"type": "string",
"description": "Address of the token you pay in. May be the collateral (opened directly) or any other token (zapped: swapped to collateral first). Native ETH = the zero address 0x0000…0000."
},
"amount": {
"type": "string",
"description": "Amount of payToken in human units (e.g. '10000' for 10,000 USDC)."
},
"leverage": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Target leverage, e.g. 3. Provide this OR desiredLtv."
},
"desiredLtv": {
"type": "string",
"description": "Target LTV percent, e.g. '66.67'. Provide this OR leverage."
},
"slippage": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Swap slippage as a ratio (0.005 = 0.5%). Default 0.005, capped at 0.01."
},
"chainId": {
"type": "integer",
"description": "Chain to target. Supported: 1, 4663. Default: 1."
}
},
"required": [
"strategyId",
"payToken",
"amount"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}⚪build_leverage_tx(strategyId, payToken, amount, leverage, desiredLtv, ...)
Build the UNSIGNED transaction to open a leveraged position, for the given wallet to sign. Non-custodial: this server never signs, sends, or holds keys. The canonical output is the executable { approvals[], tx{to,data,value} } — sign and broadcast it directly (approvals first), plus the same position preview as simulate_leverage. meta.signingUrl is an optional one-click link for a human to sign in their own wallet. The embedded swap calldata is time-sensitive (see meta.expiresAt) — rebuild if stale.
入力スキーマ
{
"type": "object",
"properties": {
"strategyId": {
"type": "string",
"description": "Morpho market id of the strategy (from list_strategies / get_strategy)."
},
"payToken": {
"type": "string",
"description": "Address of the token you pay in. May be the collateral (opened directly) or any other token (zapped: swapped to collateral first). Native ETH = the zero address 0x0000…0000."
},
"amount": {
"type": "string",
"description": "Amount of payToken in human units (e.g. '10000' for 10,000 USDC)."
},
"leverage": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Target leverage, e.g. 3. Provide this OR desiredLtv."
},
"desiredLtv": {
"type": "string",
"description": "Target LTV percent, e.g. '66.67'. Provide this OR leverage."
},
"slippage": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Swap slippage as a ratio (0.005 = 0.5%). Default 0.005, capped at 0.01."
},
"chainId": {
"type": "integer",
"description": "Chain to target. Supported: 1, 4663. Default: 1."
},
"userAddress": {
"type": "string",
"description": "The wallet address that will sign and send. Approvals and onBehalfOf are built for it."
}
},
"required": [
"strategyId",
"payToken",
"amount",
"userAddress"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_positions(userAddress, chainId)
Read a wallet's open/closed Spiral leverage positions from chain state (read-only). For each: collateral/loan, leveraged collateral, net equity, debt, current LTV vs liquidation LTV (with headroom), current leverage, net USD value, and current leveraged APY. No cost-basis / realized P&L (those need off-chain history). Newest first. `equityPositions` lists the wallet's open equity vaults (stock leg + the yield loop(s) it funds); those loops are excluded from `positions`.
入力スキーマ
{
"type": "object",
"properties": {
"userAddress": {
"type": "string",
"description": "Wallet address to read positions for."
},
"chainId": {
"type": "integer",
"description": "Chain to target. Supported: 1, 4663. Default: 1."
}
},
"required": [
"userAddress"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🔴build_manage_tx(userAddress, id, action, amount, payToken, ...)
Build the UNSIGNED transaction to adjust or close an OPEN position, for the given wallet to sign. Non-custodial (never signs/holds keys). Canonical output is the executable { approvals[], tx{to,data,value} } (sign/broadcast directly); meta.signingUrl is an optional link for a human to sign in their own wallet. Actions: 'close' (unwind fully), 'increase_leverage' (borrow to a higher LTV), 'add_collateral' (top up — pay in collateral or any token), 'remove_collateral' (withdraw), 'repay' (pay down debt; set full=true to clear it), 'borrow' (draw more loan token). Get the position `id` from get_positions. Swap calldata (close/increase/zap paths) is time-sensitive — see meta.expiresAt.
入力スキーマ
{
"type": "object",
"properties": {
"userAddress": {
"type": "string",
"description": "Wallet that owns the position and will sign."
},
"id": {
"type": "integer",
"minimum": 0,
"description": "On-chain position index, from get_positions (its `id`)."
},
"action": {
"type": "string",
"enum": [
"close",
"increase_leverage",
"add_collateral",
"remove_collateral",
"repay",
"borrow"
],
"description": "What to do to the position."
},
"amount": {
"type": "string",
"description": "Human-units amount. Required for add_collateral/remove_collateral/repay/borrow."
},
"payToken": {
"type": "string",
"description": "Token to pay in (add_collateral/repay). Collateral/loan = direct; any other = zapped. ETH = zero address."
},
"full": {
"type": "boolean",
"description": "repay only: clear the entire remaining debt."
},
"desiredLtv": {
"type": "string",
"description": "increase_leverage: target LTV percent (e.g. '80'). Provide this OR leverage."
},
"leverage": {
"type": "number",
"exclusiveMinimum": 0,
"description": "increase_leverage: target leverage. Provide this OR desiredLtv."
},
"slippage": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Swap slippage ratio (0.005 = 0.5%). Default 0.005, capped at 0.01."
},
"chainId": {
"type": "integer",
"description": "Chain to target. Supported: 1, 4663. Default: 1."
}
},
"required": [
"userAddress",
"id",
"action"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢simulate_equity_deposit(strategyId, amount, stockLtvPct, slippage, chainId)
Preview depositing USDG into a stock + yield equity vault — deterministic, read-only, no wallet. You end up 1x long the stock (held as your own Morpho collateral), with `stockLtvPct` of its value borrowed as USDG and flash-looped into the vault's yield strategy. Returns the stock received, the borrow, the stock liquidation price and headroom, the yield leg's size/leverage/APY, the net APY at that LTV, fees and price impact per leg.
入力スキーマ
{
"type": "object",
"properties": {
"strategyId": {
"type": "string",
"description": "The vault's id from list_strategies (starts with 'equity-')."
},
"amount": {
"type": "string",
"description": "Deposit amount in human units of the vault's deposit token (USDG), e.g. '10000'."
},
"stockLtvPct": {
"type": "string",
"description": "Stock-leg LTV percent to borrow at (e.g. '50'). Default: the vault's targetLtvPct. Capped at 88% of the stock market's liquidation LTV (55 on a 62.5% market) — a higher value is refused, not clamped."
},
"slippage": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Swap slippage ratio. Default 0.01 (the app's setting for vaults), capped at 0.01."
},
"chainId": {
"type": "integer",
"description": "Chain to target. Supported: 1, 4663. Default: 1."
}
},
"required": [
"strategyId",
"amount"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡build_equity_deposit_tx(strategyId, amount, stockLtvPct, slippage, chainId, ...)
Build the UNSIGNED call batch to deposit into a stock + yield equity vault, for the given wallet to sign. Non-custodial. Returns `calls[]` (approve USDG → router, authorize the router on Morpho, the one-call equityEntry, revoke) to submit as ONE atomic batch (EIP-5792 wallet_sendCalls / Safe), plus the same preview as simulate_equity_deposit. meta.signingUrl is a one-click link for a human to sign in the app. Swap calldata is time-sensitive (meta.expiresAt).
入力スキーマ
{
"type": "object",
"properties": {
"strategyId": {
"type": "string",
"description": "The vault's id from list_strategies (starts with 'equity-')."
},
"amount": {
"type": "string",
"description": "Deposit amount in human units of the vault's deposit token (USDG), e.g. '10000'."
},
"stockLtvPct": {
"type": "string",
"description": "Stock-leg LTV percent to borrow at (e.g. '50'). Default: the vault's targetLtvPct. Capped at 88% of the stock market's liquidation LTV (55 on a 62.5% market) — a higher value is refused, not clamped."
},
"slippage": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Swap slippage ratio. Default 0.01 (the app's setting for vaults), capped at 0.01."
},
"chainId": {
"type": "integer",
"description": "Chain to target. Supported: 1, 4663. Default: 1."
},
"userAddress": {
"type": "string",
"description": "The wallet that will sign and send; the stock leg and yield loop are opened for it."
}
},
"required": [
"strategyId",
"amount",
"userAddress"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡build_equity_exit_tx(strategyId, userAddress, yieldPositionIds, slippage, chainId)
Build the UNSIGNED call batch to fully unwind an OPEN equity vault (from get_positions.equityPositions): close each of its yield loops, then one self-funded router call repays the stock debt, withdraws the stock, swaps it to USDG and returns the proceeds. Submit as ONE atomic batch. Non-custodial; the vault's yield loop cannot be closed alone through build_manage_tx. Only the vault's own loop(s) are closed: those get_positions attributes unambiguously, or exactly the ones you pass in yieldPositionIds. Always read meta.closedYieldPositionIds.
入力スキーマ
{
"type": "object",
"properties": {
"strategyId": {
"type": "string",
"description": "The vault's id ('equity-0x…')."
},
"userAddress": {
"type": "string",
"description": "Wallet that owns the vault and will sign."
},
"yieldPositionIds": {
"type": "array",
"items": {
"type": "integer",
"minimum": 0
},
"description": "The yield loop id(s) to close with the stock leg (from get_positions). Optional when the vault's yieldLoopMatch is tagged/basis/mixed; REQUIRED when it is 'ambiguous'. Nothing outside this list is closed."
},
"slippage": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Swap slippage ratio. Default 0.01, capped at 0.01."
},
"chainId": {
"type": "integer",
"description": "Chain to target. Supported: 1, 4663. Default: 1."
}
},
"required": [
"strategyId",
"userAddress"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}コミュニティ
エビデンス