Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,559Letters: 14Defects: 1,336counted 4 min ago
teppi

Server definition

Hash
sha256:1ebf6c1387b7f6cdf920c7d2f33c789e61a20c3ccdec0ba1e6250738463ff368
What it is
What a remote MCP server returned when asked what it offers: 10 tools

The blob, as servednamed by its sha256

{ "instructions": "Spiral Stake exposes leveraged-yield (\"looping\") strategies powered by Morpho. Ethereum mainnet is the default; pass chainId to target another supported chain (see a tool's chainId field). Every field is a raw, unit-labeled fact — the only opinion is namespaced under 'spiralHints' and always ships its thresholds, so you can override it.\n\nHow to read the facts (mechanics, not advice):\n- carry = collateralApyPct - netBorrowApyPct; leverage multiplies it. Negative carry can still leave a positive leverageApyPct because the 1x base yield dominates — read the leverageLadder, don't infer.\n- oracle.type: 'nav' shrugs off DEX depegs; 'market' can liquidate on a depeg even if the collateral still redeems 1:1. Weigh against ltvPct.liquidation headroom.\n- exitLiquidity.slippagePct is measured per USD size; null = no route at that size (negative = price improvement). maxLeverage is a liquidity bound, not a safety bound.\nOnly eligible strategies are returned (thin/near-maturity/no-swap-route/zero-APY markets are hidden). Numbers are a snapshot ('asOf'); they move. This is not financial advice.\n\nRobinhood Chain (4663) also lists directional perps (spiralHints.profile \"leveraged_perp\": the APYs are financing carry only) and equity vaults (profile \"equity_yield_vault\": deposit USDG, hold a tokenized stock 1x, the borrowed share farms a yield loop; ids start with \"equity-\"). Equity vaults have their own tools — simulate_equity_deposit / build_equity_deposit_tx / build_equity_exit_tx — and appear under get_positions.equityPositions; their yield loop cannot be managed alone.\n\nExecution is non-custodial. simulate_leverage previews a position (deterministic, no wallet). build_leverage_tx / build_manage_tx return an UNSIGNED transaction for the user's own wallet to sign — this server never signs, sends, or holds keys. It auto-selects the path (direct vs zap-swap, and public-allocator reallocation when liquidity is thin) in the background, just like the app. The canonical output is the executable payload: sign and broadcast approvals[] first, then tx{to,data,value} — directly, with any wallet, signer library, or Safe. meta.signingUrl is an ADDITIONAL convenience for human-driven sessions (a one-click link to review and sign in the app); surface it when a human is in the loop, but autonomous callers should execute the payload. Always simulate before building, and rebuild if meta.expiresAt has passed.", "tools": [ { "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).", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "amount": { "description": "Deposit amount in human units of the vault's deposit token (USDG), e.g. '10000'.", "type": "string" }, "chainId": { "description": "Chain to target. Supported: 1, 4663. Default: 1.", "type": "integer" }, "slippage": { "description": "Swap slippage ratio. Default 0.01 (the app's setting for vaults), capped at 0.01.", "exclusiveMinimum": 0, "type": "number" }, "stockLtvPct": { "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.", "type": "string" }, "strategyId": { "description": "The vault's id from list_strategies (starts with 'equity-').", "type": "string" }, "userAddress": { "description": "The wallet that will sign and send; the stock leg and yield loop are opened for it.", "type": "string" } }, "required": [ "strategyId", "amount", "userAddress" ], "type": "object" }, "name": "build_equity_deposit_tx", "outputSchema": null }, { "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "chainId": { "description": "Chain to target. Supported: 1, 4663. Default: 1.", "type": "integer" }, "slippage": { "description": "Swap slippage ratio. Default 0.01, capped at 0.01.", "exclusiveMinimum": 0, "type": "number" }, "strategyId": { "description": "The vault's id ('equity-0x…').", "type": "string" }, "userAddress": { "description": "Wallet that owns the vault and will sign.", "type": "string" }, "yieldPositionIds": { "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.", "items": { "minimum": 0, "type": "integer" }, "type": "array" } }, "required": [ "strategyId", "userAddress" ], "type": "object" }, "name": "build_equity_exit_tx", "outputSchema": null }, { "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "amount": { "description": "Amount of payToken in human units (e.g. '10000' for 10,000 USDC).", "type": "string" }, "chainId": { "description": "Chain to target. Supported: 1, 4663. Default: 1.", "type": "integer" }, "desiredLtv": { "description": "Target LTV percent, e.g. '66.67'. Provide this OR leverage.", "type": "string" }, "leverage": { "description": "Target leverage, e.g. 3. Provide this OR desiredLtv.", "exclusiveMinimum": 0, "type": "number" }, "payToken": { "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.", "type": "string" }, "slippage": { "description": "Swap slippage as a ratio (0.005 = 0.5%). Default 0.005, capped at 0.01.", "exclusiveMinimum": 0, "type": "number" }, "strategyId": { "description": "Morpho market id of the strategy (from list_strategies / get_strategy).", "type": "string" }, "userAddress": { "description": "The wallet address that will sign and send. Approvals and onBehalfOf are built for it.", "type": "string" } }, "required": [ "strategyId", "payToken", "amount", "userAddress" ], "type": "object" }, "name": "build_leverage_tx", "outputSchema": null }, { "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "action": { "description": "What to do to the position.", "enum": [ "close", "increase_leverage", "add_collateral", "remove_collateral", "repay", "borrow" ], "type": "string" }, "amount": { "description": "Human-units amount. Required for add_collateral/remove_collateral/repay/borrow.", "type": "string" }, "chainId": { "description": "Chain to target. Supported: 1, 4663. Default: 1.", "type": "integer" }, "desiredLtv": { "description": "increase_leverage: target LTV percent (e.g. '80'). Provide this OR leverage.", "type": "string" }, "full": { "description": "repay only: clear the entire remaining debt.", "type": "boolean" }, "id": { "description": "On-chain position index, from get_positions (its `id`).", "minimum": 0, "type": "integer" }, "leverage": { "description": "increase_leverage: target leverage. Provide this OR desiredLtv.", "exclusiveMinimum": 0, "type": "number" }, "payToken": { "description": "Token to pay in (add_collateral/repay). Collateral/loan = direct; any other = zapped. ETH = zero address.", "type": "string" }, "slippage": { "description": "Swap slippage ratio (0.005 = 0.5%). Default 0.005, capped at 0.01.", "exclusiveMinimum": 0, "type": "number" }, "userAddress": { "description": "Wallet that owns the position and will sign.", "type": "string" } }, "required": [ "userAddress", "id", "action" ], "type": "object" }, "name": "build_manage_tx", "outputSchema": null }, { "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`.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "chainId": { "description": "Chain to target. Supported: 1, 4663. Default: 1.", "type": "integer" }, "userAddress": { "description": "Wallet address to read positions for.", "type": "string" } }, "required": [ "userAddress" ], "type": "object" }, "name": "get_positions", "outputSchema": null }, { "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "chainId": { "description": "Chain to target. Supported: 1, 4663. Default: 1.", "type": "integer" } }, "type": "object" }, "name": "get_prices", "outputSchema": null }, { "description": "Get one eligible strategy's full raw facts by its Morpho market id.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "chainId": { "description": "Chain to target. Supported: 1, 4663. Default: 1.", "type": "integer" }, "id": { "description": "Morpho market id (0x followed by 64 hex chars).", "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "get_strategy", "outputSchema": null }, { "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "category": { "description": "Filter by collateral category: 'stable', 'ETH', 'BTC', 'stable-PT', 'stocks' (equity vaults), 'Other' (perps).", "type": "string" }, "chainId": { "description": "Chain to target. Supported: 1, 4663. Default: 1.", "type": "integer" } }, "type": "object" }, "name": "list_strategies", "outputSchema": null }, { "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "amount": { "description": "Deposit amount in human units of the vault's deposit token (USDG), e.g. '10000'.", "type": "string" }, "chainId": { "description": "Chain to target. Supported: 1, 4663. Default: 1.", "type": "integer" }, "slippage": { "description": "Swap slippage ratio. Default 0.01 (the app's setting for vaults), capped at 0.01.", "exclusiveMinimum": 0, "type": "number" }, "stockLtvPct": { "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.", "type": "string" }, "strategyId": { "description": "The vault's id from list_strategies (starts with 'equity-').", "type": "string" } }, "required": [ "strategyId", "amount" ], "type": "object" }, "name": "simulate_equity_deposit", "outputSchema": null }, { "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "amount": { "description": "Amount of payToken in human units (e.g. '10000' for 10,000 USDC).", "type": "string" }, "chainId": { "description": "Chain to target. Supported: 1, 4663. Default: 1.", "type": "integer" }, "desiredLtv": { "description": "Target LTV percent, e.g. '66.67'. Provide this OR leverage.", "type": "string" }, "leverage": { "description": "Target leverage, e.g. 3. Provide this OR desiredLtv.", "exclusiveMinimum": 0, "type": "number" }, "payToken": { "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.", "type": "string" }, "slippage": { "description": "Swap slippage as a ratio (0.005 = 0.5%). Default 0.005, capped at 0.01.", "exclusiveMinimum": 0, "type": "number" }, "strategyId": { "description": "Morpho market id of the strategy (from list_strategies / get_strategy).", "type": "string" } }, "required": [ "strategyId", "payToken", "amount" ], "type": "object" }, "name": "simulate_leverage", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:1ebf6c1387b7f6cdf920c7d2f33c789e61a20c3ccdec0ba1e6250738463ff368 | sha256sum