Quote, build and simulate leveraged DeFi yield positions on Odyssey Loopr.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Build the steps that add collateral ('push': requires collateralToken, amount, borrowToken, leverage) or withdraw it ('pull': requires token, tokenOut, and exactly one of withdrawAmount or withdrawAll). Fields of the other direction are refused, not ignored. Returns UNSIGNED transaction steps for the owner to sign in order; this server never holds keys or sends transactions. The build expires after 180 seconds (`expiresAt`, unix ms): build immediately before signing, not as a plan for later. Builds are single-use: rebuilding an open predicts a different position address, so never replay one. A successful build does not guarantee a successful transaction: pass `steps` to `simulate` and check `ok` before asking anyone to sign. `tokenIn` (zap-in) is build-only: quote in the collateral token, then set `tokenIn` here to add the swap. With `tokenIn` set, `amount` is in `tokenIn` decimals. A zap-in is simulated by the build itself, and a failure gets 422 `simulation_reverted`. Any build the owner funds (open, adjust push, manual repay), zap-in or not, gets 422 `insufficient_balance` (`token`, `required`, `available`) when the owner holds less than it pulls.
EOA that owns the position and signs the steps. The smart account is derived from it server-side.
EVM chain id
Strategy id from list_strategies (`strategyId`)
Position (vault) address
'pull': position collateral token
'push' only: amount to add
'push' only
Target leverage as a plain number between 1 and 100: 3 means 3x (not 1e18 fixed-point)
Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point)
'pull': token to receive
'push' only
'pull' only
'push' only
'push' only. Retry only: route the swap through the swapper instead of the routing engine. Set it when simulate reports a build as failing, then rebuild.
'push' zap-in only: decimal price-impact ceiling
'push' only
'pull' only: collateral to withdraw, in base units
'push' only
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http loopr https://app.odyssey.finance/api/mcp
Build the steps that add collateral ('push': requires collateralToken, amount, borrowToken, leverage) or withdraw it ('pull': requires token, tokenOut, and exactly one of withdrawAmount or withdrawAll). Fields of the other direction are refused, not ignored. Returns UNSIGNED transaction steps for the owner to sign in order; this server never holds keys or sends transactions. The build expires after 180 seconds (`expiresAt`, unix ms): build immediately before signing, not as a plan for later. Builds are single-use: rebuilding an open predicts a different position address, so never replay one. A successful build does not guarantee a successful transaction: pass `steps` to `simulate` and check `ok` before asking anyone to sign. `tokenIn` (zap-in) is build-only: quote in the collateral token, then set `tokenIn` here to add the swap. With `tokenIn` set, `amount` is in `tokenIn` decimals. A zap-in is simulated by the build itself, and a failure gets 422 `simulation_reverted`. Any build the owner funds (open, adjust push, manual repay), zap-in or not, gets 422 `insufficient_balance` (`token`, `required`, `available`) when the owner holds less than it pulls.
| Argument | Type | Description |
|---|---|---|
| owner* | string | EOA that owns the position and signs the steps. The smart account is derived from it server-side. |
| token | string | 'pull': position collateral token |
| amount | string | 'push' only: amount to add |
| chainId* | integer | EVM chain id |
| tokenIn | string | 'push' only |
| leverage | number | Target leverage as a plain number between 1 and 100: 3 means 3x (not 1e18 fixed-point) |
| slippage | number | Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point) |
| tokenOut | string | 'pull': token to receive |
| direction* | string | |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| borrowToken | string | 'push' only |
| withdrawAll | boolean | 'pull' only |
| approvalMode | string | 'push' only |
| forceSwapper | boolean | 'push' only. Retry only: route the swap through the swapper instead of the routing engine. Set it when simulate reports a build as failing, then rebuild. |
| maxPriceImpact | number | 'push' zap-in only: decimal price-impact ceiling |
| tokenInSwapper | string | 'push' only |
| withdrawAmount | string | 'pull' only: collateral to withdraw, in base units |
| collateralToken | string | 'push' only |
| positionAddress* | string | Position (vault) address |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chainId",
"positionAddress",
"strategyId",
"direction",
"owner"
],
"properties": {
"owner": {
"type": "string",
"description": "EOA that owns the position and signs the steps. The smart account is derived from it server-side."
},
"token": {
"type": "string",
"description": "'pull': position collateral token"
},
"amount": {
"type": "string",
"pattern": "^\\d+$",
"description": "'push' only: amount to add"
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"tokenIn": {
"type": "string",
"description": "'push' only"
},
"leverage": {
"type": "number",
"maximum": 100,
"minimum": 1,
"description": "Target leverage as a plain number between 1 and 100: 3 means 3x (not 1e18 fixed-point)"
},
"slippage": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point)"
},
"tokenOut": {
"type": "string",
"description": "'pull': token to receive"
},
"direction": {
"enum": [
"push",
"pull"
],
"type": "string"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"borrowToken": {
"type": "string",
"description": "'push' only"
},
"withdrawAll": {
"type": "boolean",
"description": "'pull' only"
},
"approvalMode": {
"enum": [
"exact",
"max"
],
"type": "string",
"description": "'push' only"
},
"forceSwapper": {
"type": "boolean",
"description": "'push' only. Retry only: route the swap through the swapper instead of the routing engine. Set it when simulate reports a build as failing, then rebuild."
},
"maxPriceImpact": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "'push' zap-in only: decimal price-impact ceiling"
},
"tokenInSwapper": {
"type": "string",
"description": "'push' only"
},
"withdrawAmount": {
"type": "string",
"pattern": "^\\d+$",
"description": "'pull' only: collateral to withdraw, in base units"
},
"collateralToken": {
"type": "string",
"description": "'push' only"
},
"positionAddress": {
"type": "string",
"description": "Position (vault) address"
}
},
"additionalProperties": false
}Build the steps that borrow more against a position. Returns UNSIGNED transaction steps for the owner to sign in order; this server never holds keys or sends transactions. The build expires after 180 seconds (`expiresAt`, unix ms): build immediately before signing, not as a plan for later. Builds are single-use: rebuilding an open predicts a different position address, so never replay one. A successful build does not guarantee a successful transaction: pass `steps` to `simulate` and check `ok` before asking anyone to sign.
| Argument | Type | Description |
|---|---|---|
| owner* | string | EOA that owns the position and signs the steps. The smart account is derived from it server-side. |
| chainId* | integer | EVM chain id |
| marketId | string | |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| borrowAmount* | string | |
| positionAddress* | string | Position (vault) address |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chainId",
"positionAddress",
"strategyId",
"borrowAmount",
"owner"
],
"properties": {
"owner": {
"type": "string",
"description": "EOA that owns the position and signs the steps. The smart account is derived from it server-side."
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"marketId": {
"type": "string"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"borrowAmount": {
"type": "string",
"pattern": "^\\d+$"
},
"positionAddress": {
"type": "string",
"description": "Position (vault) address"
}
},
"additionalProperties": false
}Build the steps that claim rewards. Pass `rewards` exactly as quote_claim returned them. 'compound' requires slippage. Returns UNSIGNED transaction steps for the owner to sign in order; this server never holds keys or sends transactions. The build expires after 180 seconds (`expiresAt`, unix ms): build immediately before signing, not as a plan for later. Builds are single-use: rebuilding an open predicts a different position address, so never replay one. A successful build does not guarantee a successful transaction: pass `steps` to `simulate` and check `ok` before asking anyone to sign.
| Argument | Type | Description |
|---|---|---|
| mode* | string | |
| owner* | string | EOA that owns the position and signs the steps. The smart account is derived from it server-side. |
| chainId* | integer | EVM chain id |
| rewards* | array | |
| slippage | number | Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point) |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| positionAddress |
Build the steps that close a position in full. Returns UNSIGNED transaction steps for the owner to sign in order; this server never holds keys or sends transactions. The build expires after 180 seconds (`expiresAt`, unix ms): build immediately before signing, not as a plan for later. Builds are single-use: rebuilding an open predicts a different position address, so never replay one. A successful build does not guarantee a successful transaction: pass `steps` to `simulate` and check `ok` before asking anyone to sign.
| Argument | Type | Description |
|---|---|---|
| owner* | string | EOA that owns the position and signs the steps. The smart account is derived from it server-side. |
| chainId* | integer | EVM chain id |
| slippage | number | Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point) |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| forceSwapper | boolean | Retry only: route the swap through the swapper instead of the routing engine. Set it when simulate reports a build as failing, then rebuild. |
| receiveToken | string | Token to receive (defaults to the deposit token) |
Build the steps that open a leveraged position. Returns UNSIGNED transaction steps for the owner to sign in order; this server never holds keys or sends transactions. The build expires after 180 seconds (`expiresAt`, unix ms): build immediately before signing, not as a plan for later. Builds are single-use: rebuilding an open predicts a different position address, so never replay one. A successful build does not guarantee a successful transaction: pass `steps` to `simulate` and check `ok` before asking anyone to sign. `tokenIn` (zap-in) is build-only: quote in the collateral token, then set `tokenIn` here to add the swap. With `tokenIn` set, `amount` is in `tokenIn` decimals. A zap-in is simulated by the build itself, and a failure gets 422 `simulation_reverted`. Any build the owner funds (open, adjust push, manual repay), zap-in or not, gets 422 `insufficient_balance` (`token`, `required`, `available`) when the owner holds less than it pulls.
| Argument | Type | Description |
|---|---|---|
| owner* | string | EOA that owns the position and signs the steps. The smart account is derived from it server-side. |
| amount* | string | Collateral (or tokenIn) amount in base units |
| chainId* | integer | EVM chain id |
| tokenIn | string | |
| leverage* | number | Target leverage as a plain number between 1.01 and 100: 3 means 3x (not 1e18 fixed-point). An open must borrow, so 1 is not accepted; to add collateral without borrowing, adjust an existing position |
Build the steps that repay debt. 'auto' requires slippage; 'manual' repays from the owner's wallet. Returns UNSIGNED transaction steps for the owner to sign in order; this server never holds keys or sends transactions. The build expires after 180 seconds (`expiresAt`, unix ms): build immediately before signing, not as a plan for later. Builds are single-use: rebuilding an open predicts a different position address, so never replay one. A successful build does not guarantee a successful transaction: pass `steps` to `simulate` and check `ok` before asking anyone to sign. Any build the owner funds (open, adjust push, manual repay), zap-in or not, gets 422 `insufficient_balance` (`token`, `required`, `available`) when the owner holds less than it pulls.
| Argument | Type | Description |
|---|---|---|
| mode* | string | |
| owner* | string | EOA that owns the position and signs the steps. The smart account is derived from it server-side. |
| chainId* | integer | EVM chain id |
| slippage | number | Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point) |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| repayAmount* | string |
List an owner EOA's Loopr positions with health, leverage and PnL. Requires chainId or chainIds. Pass positionAddress (with chainId, not chainIds) to fetch a single position: it returns `{ position, errors, catalogUnavailable }`, and a null `position` with `errors` rows means the chain could not be read, not that the position does not exist.
| Argument | Type | Description |
|---|---|---|
| owner* | string | Owner EOA |
| chainId | integer | EVM chain id |
| chainIds | array | |
| positionAddress | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"owner"
],
"properties": {
"owner": {
"type": "string",
"description": "Owner EOA"
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"chainIds": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
}
},
"positionAddress": {
"type": "string"
}
},
"additionalProperties": false
}Derive the smart contract account (SCA) that holds Loopr positions for an EOA. Deterministic; the same on every chain.
| Argument | Type | Description |
|---|---|---|
| eoa* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eoa"
],
"properties": {
"eoa": {
"type": "string"
}
},
"additionalProperties": false
}Get one strategy. Pass depositToken/borrowToken when several strategies share a strategyId on the same chain.
| Argument | Type | Description |
|---|---|---|
| chainId* | integer | EVM chain id |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| borrowToken | string | |
| depositToken | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chainId",
"strategyId"
],
"properties": {
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"borrowToken": {
"type": "string"
},
"depositToken": {
"type": "string"
}
},
"additionalProperties": false
}List Loopr leveraged strategies with APY, leverage bounds, deposit/borrow tokens and TVL. Filter by chain, deposit asset or protocol.
| Argument | Type | Description |
|---|---|---|
| assets | array | Deposit token addresses |
| chainIds | array | |
| protocols | array | Protocol families, e.g. 'aave', 'morpho' |
| includeDisabled | boolean | Include delisted strategies (default false) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"assets": {
"type": "array",
"items": {
"type": "string"
},
"description": "Deposit token addresses"
},
"chainIds": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
}
},
"protocols": {
"type": "array",
"items": {
"type": "string"
},
"description": "Protocol families, e.g. 'aave', 'morpho'"
},
"includeDisabled": {
"type": "boolean",
"description": "Include delisted strategies (default false)"
}
},
"additionalProperties": false
}Quote adding collateral ('push', requires leverage) or withdrawing it ('pull'). Returns a quote envelope; `expiresAt` is unix ms and quotes expire after 180 seconds. Amounts are base-unit integer strings.
| Argument | Type | Description |
|---|---|---|
| amount* | string | Collateral to add or withdraw, in base units |
| chainId* | integer | EVM chain id |
| leverage | number | Target leverage as a plain number between 1 and 100: 3 means 3x (not 1e18 fixed-point) |
| slippage | number | Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point) |
| direction* | string | |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| positionAddress* | string | Position (vault) address |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chainId",
"positionAddress",
"strategyId",
"amount",
"direction"
],
"properties": {
"amount": {
"type": "string",
"pattern": "^\\d+$",
"description": "Collateral to add or withdraw, in base units"
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"leverage": {
"type": "number",
"maximum": 100,
"minimum": 1,
"description": "Target leverage as a plain number between 1 and 100: 3 means 3x (not 1e18 fixed-point)"
},
"slippage": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point)"
},
"direction": {
"enum": [
"push",
"pull"
],
"type": "string"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"positionAddress": {
"type": "string",
"description": "Position (vault) address"
}
},
"additionalProperties": false
}Quote borrowing more against a position. Returns a quote envelope; `expiresAt` is unix ms and quotes expire after 180 seconds. Amounts are base-unit integer strings.
| Argument | Type | Description |
|---|---|---|
| chainId* | integer | EVM chain id |
| marketId | string | Morpho market id (optional) |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| borrowAmount* | string | |
| positionAddress* | string | Position (vault) address |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chainId",
"positionAddress",
"strategyId",
"borrowAmount"
],
"properties": {
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"marketId": {
"type": "string",
"description": "Morpho market id (optional)"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"borrowAmount": {
"type": "string",
"pattern": "^\\d+$"
},
"positionAddress": {
"type": "string",
"description": "Position (vault) address"
}
},
"additionalProperties": false
}Quote claiming rewards. 'send' pays them to the owner; 'compound' swaps them into the position and requires slippage. The returned `rewards` feed build_claim. Returns a quote envelope; `expiresAt` is unix ms and quotes expire after 180 seconds. Amounts are base-unit integer strings.
| Argument | Type | Description |
|---|---|---|
| mode* | string | |
| chainId* | integer | EVM chain id |
| slippage | number | Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point) |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| positionAddress* | string | Position (vault) address |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chainId",
"positionAddress",
"strategyId",
"mode"
],
"properties": {
"mode": {
"enum": [
"send",
"compound"
],
"type": "string"
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"slippage": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point)"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"positionAddress": {
"type": "string",
"description": "Position (vault) address"
}
},
"additionalProperties": false
}Quote closing a position in full. Returns a quote envelope; `expiresAt` is unix ms and quotes expire after 180 seconds. Amounts are base-unit integer strings.
| Argument | Type | Description |
|---|---|---|
| chainId* | integer | EVM chain id |
| slippage | number | Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point) |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| positionAddress* | string | Position (vault) address |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chainId",
"positionAddress",
"strategyId"
],
"properties": {
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"slippage": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point)"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"positionAddress": {
"type": "string",
"description": "Position (vault) address"
}
},
"additionalProperties": false
}Quote opening a leveraged position: expected collateral, debt, health factor and liquidation price. Returns a quote envelope; `expiresAt` is unix ms and quotes expire after 180 seconds. Amounts are base-unit integer strings.
| Argument | Type | Description |
|---|---|---|
| amount* | string | Collateral amount in base units |
| chainId* | integer | EVM chain id |
| leverage* | number | Target leverage as a plain number between 1.01 and 100: 3 means 3x (not 1e18 fixed-point). An open must borrow, so 1 is not accepted; to add collateral without borrowing, adjust an existing position |
| slippage | number | Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point) |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| borrowToken | string | Disambiguates strategies that share strategyId and collateral |
| collateralToken* | string |
Quote repaying debt. 'auto' repays from collateral via a flash-loan swap and requires slippage; 'manual' repays from the wallet. Returns a quote envelope; `expiresAt` is unix ms and quotes expire after 180 seconds. Amounts are base-unit integer strings.
| Argument | Type | Description |
|---|---|---|
| mode* | string | |
| chainId* | integer | EVM chain id |
| slippage | number | Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point) |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| repayAmount* | string | |
| withdrawAmount | string | 'auto' only |
| positionAddress* | string | Position (vault) address |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chainId",
"positionAddress",
"strategyId",
"mode",
"repayAmount"
],
"properties": {
"mode": {
"enum": [
"auto",
"manual"
],
"type": "string"
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"slippage": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point)"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"repayAmount": {
"type": "string",
"pattern": "^\\d+$"
},
"withdrawAmount": {
"type": "string",
"pattern": "^\\d+$",
"description": "'auto' only"
},
"positionAddress": {
"type": "string",
"description": "Position (vault) address"
}
},
"additionalProperties": false
}Simulate built steps on a fork (Tenderly) from the owner's address before anyone signs. Pass `steps` and `expiresAt` exactly as a build_* tool returned them. Check `ok`; on failure the failing step carries the revert reason; never ask anyone to sign a failing build. A swap-route failure can be retried by rebuilding with `forceSwapper: true` (build_open, build_adjust push, build_repay auto, build_close). `share` defaults to 'failure-only', so a passing simulation never publishes the owner's calldata as a public link.
| Argument | Type | Description |
|---|---|---|
| from* | string | Owner EOA that will sign the steps |
| share | string | |
| steps* | array | |
| expiresAt* | integer | The build’s expiresAt (unix ms) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"expiresAt",
"from",
"steps"
],
"properties": {
"from": {
"type": "string",
"description": "Owner EOA that will sign the steps"
},
"share": {
"enum": [
"returned",
"failure-only",
"none"
],
"type": "string"
},
"steps": {
"type": "array",
"items": {
"type": "object",
"required": [
"chainId",
"data",
"kind",
"label",
"to",
"value"
],
"properties": {
"to": {
"type": "string"
},
"data": {
"type": "string"
},
"kind": {
"enum": [
"sca-deploy",
"approve",
"execute"
],
"type": "string"
},
"label": {
"type": "string"
},
"value": {
"type": "string",
"pattern": "^\\d+$"
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
}
}
},
"minItems": 1
},
"expiresAt": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The build’s expiresAt (unix ms)"
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 5, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.
| string |
| Position (vault) address |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chainId",
"positionAddress",
"strategyId",
"mode",
"owner",
"rewards"
],
"properties": {
"mode": {
"enum": [
"send",
"compound"
],
"type": "string"
},
"owner": {
"type": "string",
"description": "EOA that owns the position and signs the steps. The smart account is derived from it server-side."
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"rewards": {
"type": "array",
"items": {
"type": "object",
"required": [
"amount",
"proof",
"recipient",
"token"
],
"properties": {
"proof": {
"type": "array",
"items": {
"type": "string"
}
},
"token": {
"type": "string"
},
"amount": {
"type": "string",
"pattern": "^\\d+$"
},
"symbol": {
"type": "string"
},
"decimals": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"usdPrice": {
"type": "string"
},
"recipient": {
"type": "string"
}
}
}
},
"slippage": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point)"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"positionAddress": {
"type": "string",
"description": "Position (vault) address"
}
},
"additionalProperties": false
}| positionAddress* |
| string |
| Position (vault) address |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chainId",
"positionAddress",
"strategyId",
"owner"
],
"properties": {
"owner": {
"type": "string",
"description": "EOA that owns the position and signs the steps. The smart account is derived from it server-side."
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"slippage": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point)"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"forceSwapper": {
"type": "boolean",
"description": "Retry only: route the swap through the swapper instead of the routing engine. Set it when simulate reports a build as failing, then rebuild."
},
"receiveToken": {
"type": "string",
"description": "Token to receive (defaults to the deposit token)"
},
"positionAddress": {
"type": "string",
"description": "Position (vault) address"
}
},
"additionalProperties": false
}| slippage | number | Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point) |
| strategyId* | integer | Strategy id from list_strategies (`strategyId`) |
| borrowToken* | string |
| approvalMode | string | ERC-20 approval size. 'exact' (default) approves only this amount |
| forceSwapper | boolean | Retry only: route the swap through the swapper instead of the routing engine. Set it when simulate reports a build as failing, then rebuild. |
| maxPriceImpact | number | Zap-in only: decimal price-impact ceiling (0.1 = 10%) |
| tokenInSwapper | string |
| collateralToken* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"amount",
"borrowToken",
"chainId",
"collateralToken",
"leverage",
"owner",
"strategyId"
],
"properties": {
"owner": {
"type": "string",
"description": "EOA that owns the position and signs the steps. The smart account is derived from it server-side."
},
"amount": {
"type": "string",
"pattern": "^\\d+$",
"description": "Collateral (or tokenIn) amount in base units"
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"tokenIn": {
"type": "string"
},
"leverage": {
"type": "number",
"maximum": 100,
"minimum": 1.01,
"description": "Target leverage as a plain number between 1.01 and 100: 3 means 3x (not 1e18 fixed-point). An open must borrow, so 1 is not accepted; to add collateral without borrowing, adjust an existing position"
},
"slippage": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point)"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"borrowToken": {
"type": "string"
},
"approvalMode": {
"enum": [
"exact",
"max"
],
"type": "string",
"description": "ERC-20 approval size. 'exact' (default) approves only this amount"
},
"forceSwapper": {
"type": "boolean",
"description": "Retry only: route the swap through the swapper instead of the routing engine. Set it when simulate reports a build as failing, then rebuild."
},
"maxPriceImpact": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Zap-in only: decimal price-impact ceiling (0.1 = 10%)"
},
"tokenInSwapper": {
"type": "string"
},
"collateralToken": {
"type": "string"
}
},
"additionalProperties": false
}| approvalMode | string | 'manual' only |
| forceSwapper | boolean | 'auto' only. Retry only: route the swap through the swapper instead of the routing engine. Set it when simulate reports a build as failing, then rebuild. |
| withdrawAmount | string | 'auto' only |
| positionAddress* | string | Position (vault) address |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chainId",
"positionAddress",
"strategyId",
"mode",
"owner",
"repayAmount"
],
"properties": {
"mode": {
"enum": [
"auto",
"manual"
],
"type": "string"
},
"owner": {
"type": "string",
"description": "EOA that owns the position and signs the steps. The smart account is derived from it server-side."
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"slippage": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point)"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"repayAmount": {
"type": "string",
"pattern": "^\\d+$"
},
"approvalMode": {
"enum": [
"exact",
"max"
],
"type": "string",
"description": "'manual' only"
},
"forceSwapper": {
"type": "boolean",
"description": "'auto' only. Retry only: route the swap through the swapper instead of the routing engine. Set it when simulate reports a build as failing, then rebuild."
},
"withdrawAmount": {
"type": "string",
"pattern": "^\\d+$",
"description": "'auto' only"
},
"positionAddress": {
"type": "string",
"description": "Position (vault) address"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"amount",
"chainId",
"collateralToken",
"leverage",
"strategyId"
],
"properties": {
"amount": {
"type": "string",
"pattern": "^\\d+$",
"description": "Collateral amount in base units"
},
"chainId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "EVM chain id",
"exclusiveMinimum": 0
},
"leverage": {
"type": "number",
"maximum": 100,
"minimum": 1.01,
"description": "Target leverage as a plain number between 1.01 and 100: 3 means 3x (not 1e18 fixed-point). An open must borrow, so 1 is not accepted; to add collateral without borrowing, adjust an existing position"
},
"slippage": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Slippage tolerance as a decimal: 0.005 means 0.5% (not 1e18 fixed-point)"
},
"strategyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Strategy id from list_strategies (`strategyId`)"
},
"borrowToken": {
"type": "string",
"description": "Disambiguates strategies that share strategyId and collateral"
},
"collateralToken": {
"type": "string"
}
},
"additionalProperties": false
}