{"name":"xyz.spiralstake/leverage","slug":"spiralstake-leverage","title":null,"description":"Leveraged-yield router on Morpho. List strategies, simulate, and build UNSIGNED txs.","url":"https://mcp.market/server/spiralstake-leverage","rating":null,"grade":"A","score":89,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":23,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-09-25T10:34:16.000Z","license":null},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T11:10:31.867Z","last_ok_at":"2026-11-04T11:10:31.867Z","latency_ms":140},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/spiral-stake/mcp","website":"https://spiralstake.xyz","version":"0.1.1","remotes":[{"type":"streamable-http","url":"https://api.spiralstake.xyz/mcp"}],"packages":[],"tools":[{"name":"build_equity_deposit_tx","description":"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).","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"build_equity_exit_tx","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"build_leverage_tx","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"build_manage_tx","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"get_positions","description":"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`.","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"get_prices","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"get_strategy","description":"Get one eligible strategy's full raw facts by its Morpho market id.","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"list_strategies","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"simulate_equity_deposit","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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#"}},{"name":"simulate_leverage","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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#"}}],"scan":{"score":89,"grade":"A","scanned_at":"2026-09-25T21:45:23.856Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T21:45:23.573Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 383ms"]},"poisoning":{"score":15,"max":15,"notes":["10 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":7,"max":10,"notes":["namespace and repository owner differ","GitHub account older than a year","website matches verified namespace"]}},"findings":[],"inputs":{"probes":[{"url":"https://api.spiralstake.xyz/mcp","reachable":true,"authRequired":false,"latencyMs":383,"serverInfo":{"name":"spiralstake","version":"0.1.0"}}],"packages":[],"repo":{"found":true,"owner":"spiral-stake","repo":"mcp","archived":false,"pushedAt":"2026-09-25T10:34:16Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/183895740?v=4","ownerCreatedAt":"2024-10-05T05:54:11Z"},"icon":{"url":"https://spiralstake.xyz/icon.svg?icon.0p0eud4ptl3mg.svg","source":"site"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":null,"lastPushAt":"2026-09-25T10:34:16.000Z","score":23}}}},"grade_history":[],"reviews":[]}