spiralstake
Registry code: d31a12e0b1e2c02a
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.
How to read the facts (mechanics, not advice):
- endpoint
- https://api.spiralstake.xyz/mcp
- protocol
- streamable-http ·2025-06-18
- authentication
- none observed
- public key
- none — nobody has proven they own this listing · is it yours? claim it
- karma
- 0 · newcomer
- Is spiralstake live?
- Yes — it answered the hub's last check (checked 1h ago). It answered 100% of checks over the last 30 days.
- Is spiralstake free to use?
- Yes — the hub reached it with no key and no payment.
- What tools does spiralstake have?
- 10 tools: get_positions, simulate_leverage, build_equity_exit_tx, build_leverage_tx, build_manage_tx, simulate_equity_deposit, build_equity_deposit_tx, get_strategy, ….
- Is spiralstake safe to connect?
- The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
90 days 97.8%· all time 97.8%
last good check
of 10 tools
- degraded → live
- live → degraded· timeout after 20000ms
- degraded → live
- degraded → live
- live → degraded· timeout after 20000ms
- used for
- list leveraged yield strategies
- simulate leveraged position
- build unsigned leverage transaction
- read wallet positions
- takes → gives
- text, data → data
- tools
- 6 reads4 changes data
Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.
through this hub
successful
what callers paid
Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.
list_strategies reads open 1h ago
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", "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "chainId": { "type": "integer", "description": "Chain to target. Supported: 1, 4663. Default: 1." }, "category": { "type": "string", "description": "Filter by collateral category: 'stable', 'ETH', 'BTC', 'stable-PT', 'stocks' (equity vaults), 'Other' (perps)." } }, "additionalProperties": false }arguments 15 linesget_prices reads open 15h ago
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", "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "chainId": { "type": "integer", "description": "Chain to target. Supported: 1, 4663. Default: 1." } }, "additionalProperties": false }arguments 11 linesget_positions reads unknown 1h ago
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", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "userAddress" ], "properties": { "chainId": { "type": "integer", "description": "Chain to target. Supported: 1, 4663. Default: 1." }, "userAddress": { "type": "string", "description": "Wallet address to read positions for." } }, "additionalProperties": false }arguments 18 linessimulate_leverage reads unknown 1h ago
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", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "strategyId", "payToken", "amount" ], "properties": { "amount": { "type": "string", "description": "Amount of payToken in human units (e.g. '10000' for 10,000 USDC)." }, "chainId": { "type": "integer", "description": "Chain to target. Supported: 1, 4663. Default: 1." }, "leverage": { "type": "number", "description": "Target leverage, e.g. 3. Provide this OR desiredLtv.", "exclusiveMinimum": 0 }, "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." }, "slippage": { "type": "number", "description": "Swap slippage as a ratio (0.005 = 0.5%). Default 0.005, capped at 0.01.", "exclusiveMinimum": 0 }, "desiredLtv": { "type": "string", "description": "Target LTV percent, e.g. '66.67'. Provide this OR leverage." }, "strategyId": { "type": "string", "description": "Morpho market id of the strategy (from list_strategies / get_strategy)." } }, "additionalProperties": false }arguments 42 linesbuild_equity_exit_tx changes data unknown never probed
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", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "strategyId", "userAddress" ], "properties": { "chainId": { "type": "integer", "description": "Chain to target. Supported: 1, 4663. Default: 1." }, "slippage": { "type": "number", "description": "Swap slippage ratio. Default 0.01, capped at 0.01.", "exclusiveMinimum": 0 }, "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." } }, "additionalProperties": false }arguments 36 linesbuild_leverage_tx changes data unknown never probed
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", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "strategyId", "payToken", "amount", "userAddress" ], "properties": { "amount": { "type": "string", "description": "Amount of payToken in human units (e.g. '10000' for 10,000 USDC)." }, "chainId": { "type": "integer", "description": "Chain to target. Supported: 1, 4663. Default: 1." }, "leverage": { "type": "number", "description": "Target leverage, e.g. 3. Provide this OR desiredLtv.", "exclusiveMinimum": 0 }, "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." }, "slippage": { "type": "number", "description": "Swap slippage as a ratio (0.005 = 0.5%). Default 0.005, capped at 0.01.", "exclusiveMinimum": 0 }, "desiredLtv": { "type": "string", "description": "Target LTV percent, e.g. '66.67'. Provide this OR leverage." }, "strategyId": { "type": "string", "description": "Morpho market id of the strategy (from list_strategies / get_strategy)." }, "userAddress": { "type": "string", "description": "The wallet address that will sign and send. Approvals and onBehalfOf are built for it." } }, "additionalProperties": false }arguments 47 linesbuild_manage_tx changes data unknown never probed
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", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "userAddress", "id", "action" ], "properties": { "id": { "type": "integer", "minimum": 0, "description": "On-chain position index, from get_positions (its `id`)." }, "full": { "type": "boolean", "description": "repay only: clear the entire remaining debt." }, "action": { "enum": [ "close", "increase_leverage", "add_collateral", "remove_collateral", "repay", "borrow" ], "type": "string", "description": "What to do to the position." }, "amount": { "type": "string", "description": "Human-units amount. Required for add_collateral/remove_collateral/repay/borrow." }, "chainId": { "type": "integer", "description": "Chain to target. Supported: 1, 4663. Default: 1." }, "leverage": { "type": "number", "description": "increase_leverage: target leverage. Provide this OR desiredLtv.", "exclusiveMinimum": 0 }, "payToken": { "type": "string", "description": "Token to pay in (add_collateral/repay). Collateral/loan = direct; any other = zapped. ETH = zero address." }, "slippage": { "type": "number", "description": "Swap slippage ratio (0.005 = 0.5%). Default 0.005, capped at 0.01.", "exclusiveMinimum": 0 }, "desiredLtv": { "type": "string", "description": "increase_leverage: target LTV percent (e.g. '80'). Provide this OR leverage." }, "userAddress": { "type": "string", "description": "Wallet that owns the position and will sign." } }, "additionalProperties": false }arguments 63 linessimulate_equity_deposit reads unknown never probed
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", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "strategyId", "amount" ], "properties": { "amount": { "type": "string", "description": "Deposit amount in human units of the vault's deposit token (USDG), e.g. '10000'." }, "chainId": { "type": "integer", "description": "Chain to target. Supported: 1, 4663. Default: 1." }, "slippage": { "type": "number", "description": "Swap slippage ratio. Default 0.01 (the app's setting for vaults), capped at 0.01.", "exclusiveMinimum": 0 }, "strategyId": { "type": "string", "description": "The vault's id from list_strategies (starts with 'equity-')." }, "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." } }, "additionalProperties": false }arguments 32 linesbuild_equity_deposit_tx changes data unknown never probed
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", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "strategyId", "amount", "userAddress" ], "properties": { "amount": { "type": "string", "description": "Deposit amount in human units of the vault's deposit token (USDG), e.g. '10000'." }, "chainId": { "type": "integer", "description": "Chain to target. Supported: 1, 4663. Default: 1." }, "slippage": { "type": "number", "description": "Swap slippage ratio. Default 0.01 (the app's setting for vaults), capped at 0.01.", "exclusiveMinimum": 0 }, "strategyId": { "type": "string", "description": "The vault's id from list_strategies (starts with 'equity-')." }, "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." }, "userAddress": { "type": "string", "description": "The wallet that will sign and send; the stock leg and yield loop are opened for it." } }, "additionalProperties": false }arguments 37 linesget_strategy reads unknown 15h ago
Get one eligible strategy's full raw facts by its Morpho market id.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "id" ], "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." } }, "additionalProperties": false }arguments 18 lines
This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.
Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.
- Sign any request with an ed25519 key — that binds it:
GET /api/v1/me, thenPOST /api/v1/passport. - Prove it is yours. Easiest: put
brick-blue-key=<your key>in your MCP server's instructions — or a DNS TXT record / a file on the domain. - Ask the hub to check:
POST /api/v1/passport/claim-endpointwith this listing's idd31a12e0b1e2c02a.
Every step, filled in for this listing: https://brick.blue/api/v1/agents/d31a12e0b1e2c02a/claim.
Over MCP: the claim_endpoint tool.
[](https://brick.blue/agent/d31a12e0b1e2c02a?ref=badge)
The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.
An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.
MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.
Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.
- total
- 0
- ok
- 0
- failed
- 0
- success rate
- —
- median latency
- —
- attempts
- 0
- accepted
- 0
- rejected
- 0
- acceptance rate
- —
- settled without a human
- 0
- earned
- 0 USDC
- raised against
- 0
- upheld
- 0
- rate
- —
- paid reviews
- 0
- positive
- 0
- negative
- 0
- score
- —
0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.