← WebMCP Directory

Tool tree

canix402.compx.io

Finance & CryptoTools verified
Website
Canix402 Live: search DeFi opportunities in the browser with the same MCP tools agents use. Walletless receipts, no server-side signing or submission.
Explore capabilities
    canix_healthAnswer

    Check canix402 gateway liveness via GET /health. Free endpoint.

    View tool JSON
    {
      "name": "canix_health",
      "kind": "answer",
      "impl": "imperative",
      "description": "Check canix402 gateway liveness via GET /health. Free endpoint.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "/webmcp"
    }
    canix_get_metadataAnswer

    Fetch canix402 metadata and endpoint policy matrix via GET /metadata. Free endpoint.

    View tool JSON
    {
      "name": "canix_get_metadata",
      "kind": "answer",
      "impl": "imperative",
      "description": "Fetch canix402 metadata and endpoint policy matrix via GET /metadata. Free endpoint.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "/webmcp"
    }
    canix_get_discoveryAnswer

    Fetch the discovery catalog via GET /discovery. Free endpoint.

    View tool JSON
    {
      "name": "canix_get_discovery",
      "kind": "answer",
      "impl": "imperative",
      "description": "Fetch the discovery catalog via GET /discovery. Free endpoint.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "/webmcp"
    }
    canix_get_openapiAnswer

    Fetch the OpenAPI contract via GET /openapi.json. Free endpoint.

    View tool JSON
    {
      "name": "canix_get_openapi",
      "kind": "answer",
      "impl": "imperative",
      "description": "Fetch the OpenAPI contract via GET /openapi.json. Free endpoint.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "/webmcp"
    }
    canix_get_token_pricesAction

    Fetch CompX USD oracle prices for Algorand asset IDs via POST /pricing. Free endpoint; missing prices are returned as null.

    View tool JSON
    {
      "name": "canix_get_token_prices",
      "kind": "act",
      "impl": "imperative",
      "description": "Fetch CompX USD oracle prices for Algorand asset IDs via POST /pricing. Free endpoint; missing prices are returned as null.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "assetIds": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "type": "integer",
              "minimum": 0
            }
          }
        },
        "required": [
          "assetIds"
        ]
      },
      "page": "/webmcp"
    }
    canix_list_execution_shapesAnswer

    List verified execution shape catalog metadata via GET /execution/shapes (free). Returns shapeKey, requiredInputs, opportunityRole, docsPath, and meta.caveatsDocsPath from the live protocol registry. Catalog only — compile unsigned groups with canix_get_execution_quote (paid). Do not guess pool discovery, opt-ins, min-balance, slippage, liquidity limits, or app upgrades — read protocol/docs/execution-shapes/protocol-caveats.md and each shape's docsPath.

    View tool JSON
    {
      "name": "canix_list_execution_shapes",
      "kind": "answer",
      "impl": "imperative",
      "description": "List verified execution shape catalog metadata via GET /execution/shapes (free). Returns shapeKey, requiredInputs, opportunityRole, docsPath, and meta.caveatsDocsPath from the live protocol registry. Catalog only — compile unsigned groups with canix_get_execution_quote (paid). Do not guess pool discovery, opt-ins, min-balance, slippage, liquidity limits, or app upgrades — read protocol/docs/execution-shapes/protocol-caveats.md and each shape's docsPath.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "/webmcp"
    }
    canix_list_opportunitiesAction

    List top aggregated DeFi opportunities across supported chains ranked by risk then APY (GET /opportunities). Each row includes chain (algorand|base). Paid ~0.01 USDC.

    View tool JSON
    {
      "name": "canix_list_opportunities",
      "kind": "act",
      "impl": "imperative",
      "description": "List top aggregated DeFi opportunities across supported chains ranked by risk then APY (GET /opportunities). Each row includes chain (algorand|base). Paid ~0.01 USDC.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          },
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "includeInactive": {
            "type": "boolean"
          },
          "protocol": {
            "type": "string",
            "enum": [
              "tinyman",
              "pact",
              "folks-finance",
              "compx",
              "dorkfi",
              "myth-finance",
              "haystack",
              "reti",
              "alpha-arcade",
              "stamm",
              "morpho",
              "aave",
              "aerodrome"
            ]
          },
          "chain": {
            "type": "string",
            "enum": [
              "algorand",
              "base"
            ]
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          },
          "sessionReceipt": {
            "type": "string",
            "minLength": 1,
            "description": "Prepaid session receipt (X-Canix-Session). Omit to pay per request with paymentSignature. If this header was sent, Caddy skipped x402; a 402 SESSION_* means drop the header and retry with paymentSignature."
          }
        }
      },
      "page": "/webmcp"
    }
    canix_search_opportunitiesAction

    Search/filter opportunities via GET /opportunities/search. Optional chain=algorand|base. Optional assetIds is a comma-separated list of ASA ids (0 = ALGO). Paid ~0.01 USDC.

    View tool JSON
    {
      "name": "canix_search_opportunities",
      "kind": "act",
      "impl": "imperative",
      "description": "Search/filter opportunities via GET /opportunities/search. Optional chain=algorand|base. Optional assetIds is a comma-separated list of ASA ids (0 = ALGO). Paid ~0.01 USDC.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "minApy": {
            "type": "number"
          },
          "maxApy": {
            "type": "number"
          },
          "minTvlUsd": {
            "type": "number",
            "minimum": 0
          },
          "chain": {
            "type": "string",
            "enum": [
              "algorand",
              "base"
            ]
          },
          "assetIds": {
            "type": "string",
            "description": "Comma-separated ASA ids (0 = ALGO)."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          },
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "includeInactive": {
            "type": "boolean"
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          },
          "sessionReceipt": {
            "type": "string",
            "minLength": 1,
            "description": "Prepaid session receipt (X-Canix-Session). Omit to pay per request with paymentSignature. If this header was sent, Caddy skipped x402; a 402 SESSION_* means drop the header and retry with paymentSignature."
          }
        }
      },
      "page": "/webmcp"
    }
    canix_get_personalized_opportunitiesAction

    Fetch wallet-aware opportunities matched to held assets (GET /opportunities/personalized). Applies eligibility rules so full/gated venues are not recommended as enterable. Use canix_check_eligibility for missingAssets/gates/capacity. Paid ~0.05 USDC.

    View tool JSON
    {
      "name": "canix_get_personalized_opportunities",
      "kind": "act",
      "impl": "imperative",
      "description": "Fetch wallet-aware opportunities matched to held assets (GET /opportunities/personalized). Applies eligibility rules so full/gated venues are not recommended as enterable. Use canix_check_eligibility for missingAssets/gates/capacity. Paid ~0.05 USDC.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "minLength": 58,
            "maxLength": 58,
            "description": "58-character account address."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          },
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "includeInactive": {
            "type": "boolean"
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          },
          "sessionReceipt": {
            "type": "string",
            "minLength": 1,
            "description": "Prepaid session receipt (X-Canix-Session). Omit to pay per request with paymentSignature. If this header was sent, Caddy skipped x402; a 402 SESSION_* means drop the header and retry with paymentSignature."
          }
        },
        "required": [
          "address"
        ]
      },
      "page": "/webmcp"
    }
    canix_get_opportunity_historyAnswer

    Fetch a bounded APY/TVL history series for one opportunity (GET /opportunities/{opportunityId}/history). Window is 1d, 7d, or 30d (default 30d). Empty points until snapshots exist. Includes a stability signal so snapshot APY cannot dominate plan sizing. Paid ~0.01 USDC.

    View tool JSON
    {
      "name": "canix_get_opportunity_history",
      "kind": "answer",
      "impl": "imperative",
      "description": "Fetch a bounded APY/TVL history series for one opportunity (GET /opportunities/{opportunityId}/history). Window is 1d, 7d, or 30d (default 30d). Empty points until snapshots exist. Includes a stability signal so snapshot APY cannot dominate plan sizing. Paid ~0.01 USDC.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "opportunityId": {
            "type": "string",
            "minLength": 1
          },
          "window": {
            "type": "string",
            "enum": [
              "1d",
              "7d",
              "30d"
            ]
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          },
          "sessionReceipt": {
            "type": "string",
            "minLength": 1,
            "description": "Prepaid session receipt (X-Canix-Session). Omit to pay per request with paymentSignature. If this header was sent, Caddy skipped x402; a 402 SESSION_* means drop the header and retry with paymentSignature."
          }
        },
        "required": [
          "opportunityId"
        ]
      },
      "page": "/webmcp"
    }
    canix_check_eligibilityAction

    Check whether a wallet can enter selected opportunities before quoting (POST /eligibility). Pass address and opportunityIds (1–25). Returns canEnter, missingAssets, gates, capacity, suggestedSwap, and eligibilityFullyCheckable. NFD/creator gates stay unresolved — canEnter is never true until fully checkable. Paid ~0.01 USDC.

    View tool JSON
    {
      "name": "canix_check_eligibility",
      "kind": "act",
      "impl": "imperative",
      "description": "Check whether a wallet can enter selected opportunities before quoting (POST /eligibility). Pass address and opportunityIds (1–25). Returns canEnter, missingAssets, gates, capacity, suggestedSwap, and eligibilityFullyCheckable. NFD/creator gates stay unresolved — canEnter is never true until fully checkable. Paid ~0.01 USDC.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "minLength": 1,
            "description": "Account address."
          },
          "opportunityIds": {
            "type": "array",
            "minItems": 1,
            "maxItems": 25,
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "refresh": {
            "type": "boolean"
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          },
          "sessionReceipt": {
            "type": "string",
            "minLength": 1,
            "description": "Prepaid session receipt (X-Canix-Session). Omit to pay per request with paymentSignature. If this header was sent, Caddy skipped x402; a 402 SESSION_* means drop the header and retry with paymentSignature."
          }
        },
        "required": [
          "address",
          "opportunityIds"
        ]
      },
      "page": "/webmcp"
    }
    canix_get_planAction

    Compile an allocation intent into an ordered unsigned plan (POST /plans). Pass address and budget { assetId, amount } (base units; 0 = ALGO). Optional constraints and opportunityIds. Optional swapSlippage for multi-router compose. Returns eligibility, live multi-router opt-in/swap groups when requiredAssetIds differ from the budget asset, setup/enter quotes[] as independent unsigned groups (never merged), expected position delta, attached data.simulation when groups compiled, x402 + network fee totals, and expiry. Paid ~0.25 USDC. Canix does not sign or submit.

    View tool JSON
    {
      "name": "canix_get_plan",
      "kind": "act",
      "impl": "imperative",
      "description": "Compile an allocation intent into an ordered unsigned plan (POST /plans). Pass address and budget { assetId, amount } (base units; 0 = ALGO). Optional constraints and opportunityIds. Optional swapSlippage for multi-router compose. Returns eligibility, live multi-router opt-in/swap groups when requiredAssetIds differ from the budget asset, setup/enter quotes[] as independent unsigned groups (never merged), expected position delta, attached data.simulation when groups compiled, x402 + network fee totals, and expiry. Paid ~0.25 USDC. Canix does not sign or submit.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "minLength": 1,
            "description": "Account address."
          },
          "budget": {
            "type": "object",
            "required": [
              "assetId",
              "amount"
            ],
            "properties": {
              "assetId": {
                "type": "integer",
                "minimum": 0
              },
              "amount": {
                "type": "string",
                "minLength": 1
              }
            }
          },
          "constraints": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "maxProtocolWeightBps": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10000
              },
              "noNewBorrows": {
                "type": "boolean"
              },
              "executionReadyOnly": {
                "type": "boolean"
              },
              "minTvlUsd": {
                "type": "number",
                "minimum": 0
              },
              "maxSourceAgeSeconds": {
                "type": "integer",
                "minimum": 0
              },
              "maxAllocations": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10
              }
            }
          },
          "opportunityIds": {
            "type": "array",
            "minItems": 1,
            "maxItems": 25,
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "swapSlippage": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "refresh": {
            "type": "boolean"
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          },
          "sessionReceipt": {
            "type": "string",
            "minLength": 1,
            "description": "Prepaid session receipt (X-Canix-Session). Omit to pay per request with paymentSignature. If this header was sent, Caddy skipped x402; a 402 SESSION_* means drop the header and retry with paymentSignature."
          }
        },
        "required": [
          "address",
          "budget"
        ]
      },
      "page": "/webmcp"
    }
    canix_get_protocol_opportunitiesAction

    List opportunities for a single protocol (GET /protocols/{protocol}/opportunities). Paid ~0.01 USDC.

    View tool JSON
    {
      "name": "canix_get_protocol_opportunities",
      "kind": "act",
      "impl": "imperative",
      "description": "List opportunities for a single protocol (GET /protocols/{protocol}/opportunities). Paid ~0.01 USDC.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "protocol": {
            "type": "string",
            "enum": [
              "tinyman",
              "pact",
              "folks-finance",
              "compx",
              "dorkfi",
              "myth-finance",
              "haystack",
              "reti",
              "alpha-arcade",
              "stamm",
              "morpho",
              "aave",
              "aerodrome"
            ]
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          },
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "includeInactive": {
            "type": "boolean"
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          },
          "sessionReceipt": {
            "type": "string",
            "minLength": 1,
            "description": "Prepaid session receipt (X-Canix-Session). Omit to pay per request with paymentSignature. If this header was sent, Caddy skipped x402; a 402 SESSION_* means drop the header and retry with paymentSignature."
          }
        },
        "required": [
          "protocol"
        ]
      },
      "page": "/webmcp"
    }
    canix_get_positionsAction

    Fetch Algorand DeFi positions for a wallet via GET /positions. Paid ~0.005 USDC. First call returns PAYMENT-REQUIRED metadata; retry with paymentSignature.

    View tool JSON
    {
      "name": "canix_get_positions",
      "kind": "act",
      "impl": "imperative",
      "description": "Fetch Algorand DeFi positions for a wallet via GET /positions. Paid ~0.005 USDC. First call returns PAYMENT-REQUIRED metadata; retry with paymentSignature.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "minLength": 1,
            "description": "Account address."
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          },
          "sessionReceipt": {
            "type": "string",
            "minLength": 1,
            "description": "Prepaid session receipt (X-Canix-Session). Omit to pay per request with paymentSignature. If this header was sent, Caddy skipped x402; a 402 SESSION_* means drop the header and retry with paymentSignature."
          }
        },
        "required": [
          "address"
        ]
      },
      "page": "/webmcp"
    }
    canix_list_claimableAction

    List claimable DeFi rewards for a wallet via GET /positions/claimable. Returns USD value, network-fee / worth-claiming hints, claim shapeKeys, and claimAllQuotes ready for canix_get_execution_quote. Paid ~0.001 USDC. Then compile with canix_get_execution_quote (~0.10 USDC flat); groups are never merged. Sign and submit locally.

    View tool JSON
    {
      "name": "canix_list_claimable",
      "kind": "act",
      "impl": "imperative",
      "description": "List claimable DeFi rewards for a wallet via GET /positions/claimable. Returns USD value, network-fee / worth-claiming hints, claim shapeKeys, and claimAllQuotes ready for canix_get_execution_quote. Paid ~0.001 USDC. Then compile with canix_get_execution_quote (~0.10 USDC flat); groups are never merged. Sign and submit locally.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "minLength": 1,
            "description": "Account address."
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          },
          "sessionReceipt": {
            "type": "string",
            "minLength": 1,
            "description": "Prepaid session receipt (X-Canix-Session). Omit to pay per request with paymentSignature. If this header was sent, Caddy skipped x402; a 402 SESSION_* means drop the header and retry with paymentSignature."
          }
        },
        "required": [
          "address"
        ]
      },
      "page": "/webmcp"
    }
    canix_get_execution_quoteAction

    Compile one or more unsigned groups (POST /execution/quotes). Algorand shapes return Algorand groups; Morpho shapes (base:morpho:vault:*), Aave shapes (base:aave:v3:*), and Aerodrome shapes (base:aerodrome:v2:*) return unsigned Base calldata. Pass an Algorand userAddress unless the shape is on Base. Omitting a Base address does not change rank, eligibility, price, or access. Pass quotes: [{ shapeKey, input }, ...]. Required input fields vary by shapeKey — call canix_list_execution_shapes and use each shape's requiredInputs (userAddress is always required). Response data is an ExecutableQuote array. Paid flat ~0.10 USDC per request on Algorand or Base (not per item). On failure, error.details includes quoteIndex and shapeKey. Do not guess pool discovery, opt-ins, min-balance, slippage, liquidity limits, or app upgrades — read protocol/docs/execution-shapes/protocol-caveats.md and each shape's docsPath. Haystack Launch compiles here too: mainnet:haystack:v1:launch:token takes an existing ipfs:// or https:// assetUrl, and mainnet:haystack:v1:buy:bonding buys a token still on the curve (direct bonding-asset payment, or a Haystack-router leg). A bonding buy is not canix_swap.

    View tool JSON
    {
      "name": "canix_get_execution_quote",
      "kind": "act",
      "impl": "imperative",
      "description": "Compile one or more unsigned groups (POST /execution/quotes). Algorand shapes return Algorand groups; Morpho shapes (base:morpho:vault:*), Aave shapes (base:aave:v3:*), and Aerodrome shapes (base:aerodrome:v2:*) return unsigned Base calldata. Pass an Algorand userAddress unless the shape is on Base. Omitting a Base address does not change rank, eligibility, price, or access. Pass quotes: [{ shapeKey, input }, ...]. Required input fields vary by shapeKey — call canix_list_execution_shapes and use each shape's requiredInputs (userAddress is always required). Response data is an ExecutableQuote array. Paid flat ~0.10 USDC per request on Algorand or Base (not per item). On failure, error.details includes quoteIndex and shapeKey. Do not guess pool discovery, opt-ins, min-balance, slippage, liquidity limits, or app upgrades — read protocol/docs/execution-shapes/protocol-caveats.md and each shape's docsPath. Haystack Launch compiles here too: mainnet:haystack:v1:launch:token takes an existing ipfs:// or https:// assetUrl, and mainnet:haystack:v1:buy:bonding buys a token still on the curve (direct bonding-asset payment, or a Haystack-router leg). A bonding buy is not canix_swap.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "quotes": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "required": [
                "shapeKey",
                "input"
              ],
              "properties": {
                "shapeKey": {
                  "type": "string",
                  "minLength": 1
                },
                "input": {
                  "type": "object",
                  "required": [
                    "userAddress"
                  ],
                  "properties": {
                    "userAddress": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "number"
                      },
                      {
                        "type": "boolean"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                }
              }
            }
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          },
          "sessionReceipt": {
            "type": "string",
            "minLength": 1,
            "description": "Prepaid session receipt (X-Canix-Session). Omit to pay per request with paymentSignature. If this header was sent, Caddy skipped x402; a 402 SESSION_* means drop the header and retry with paymentSignature."
          }
        },
        "required": [
          "quotes"
        ]
      },
      "page": "/webmcp"
    }
    canix_get_quoteAction

    Get a stateless multi-router swap quote via POST /swaps/quote. Quotes enabled routers in parallel and returns the best expected net out. Optional router forces one adapter. Pass the response data unchanged into canix_optin / canix_swap.

    View tool JSON
    {
      "name": "canix_get_quote",
      "kind": "act",
      "impl": "imperative",
      "description": "Get a stateless multi-router swap quote via POST /swaps/quote. Quotes enabled routers in parallel and returns the best expected net out. Optional router forces one adapter. Pass the response data unchanged into canix_optin / canix_swap.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "minLength": 1,
            "description": "Account address."
          },
          "fromAssetId": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "string",
                "pattern": "^[0-9]+$"
              }
            ]
          },
          "toAssetId": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "string",
                "pattern": "^[0-9]+$"
              }
            ]
          },
          "amount": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "string",
                "pattern": "^[1-9][0-9]*$"
              }
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "fixed-input",
              "fixed-output"
            ]
          },
          "router": {
            "type": "string",
            "enum": [
              "haystack",
              "hogswap",
              "tinyman",
              "pact-smart-router",
              "folks-router",
              "asastats"
            ]
          },
          "slippage": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "disabledProtocols": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "Tinyman",
                "Humble",
                "TinymanV2",
                "Algofi",
                "Algomint",
                "Pact",
                "Folks",
                "TAlgo"
              ]
            }
          },
          "maxGroupSize": {
            "type": "integer",
            "minimum": 1,
            "maximum": 16
          },
          "maxDepth": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4
          }
        },
        "required": [
          "address",
          "fromAssetId",
          "toAssetId",
          "amount"
        ]
      },
      "page": "/webmcp"
    }
    canix_optinAction

    Build missing output-asset and application opt-ins via POST /swaps/optin for the winning quote. Free endpoint; pass the quote data object unchanged.

    View tool JSON
    {
      "name": "canix_optin",
      "kind": "act",
      "impl": "imperative",
      "description": "Build missing output-asset and application opt-ins via POST /swaps/optin for the winning quote. Free endpoint; pass the quote data object unchanged.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "minLength": 58,
            "maxLength": 58,
            "description": "58-character account address."
          },
          "quote": {
            "type": "object",
            "required": [
              "router",
              "address",
              "fromAssetId",
              "toAssetId",
              "amount",
              "type",
              "quotedAmount",
              "minOut",
              "networkFeeMicroAlgos",
              "slippageBps",
              "createdAt",
              "expiresAt",
              "score",
              "alternatives",
              "legs",
              "payload"
            ],
            "properties": {
              "router": {
                "type": "string",
                "enum": [
                  "haystack",
                  "hogswap",
                  "tinyman",
                  "pact-smart-router",
                  "folks-router",
                  "asastats"
                ]
              },
              "address": {
                "type": "string",
                "minLength": 58,
                "maxLength": 58,
                "description": "58-character account address."
              },
              "fromAssetId": {
                "type": "string",
                "pattern": "^[0-9]+$"
              },
              "toAssetId": {
                "type": "string",
                "pattern": "^[0-9]+$"
              },
              "amount": {
                "type": "string",
                "pattern": "^[1-9][0-9]*$"
              },
              "type": {
                "type": "string",
                "enum": [
                  "fixed-input",
                  "fixed-output"
                ]
              },
              "quotedAmount": {
                "type": "string",
                "pattern": "^[0-9]+$"
              },
              "minOut": {
                "type": "string",
                "pattern": "^[0-9]+$"
              },
              "networkFeeMicroAlgos": {
                "type": "string",
                "pattern": "^[0-9]+$"
              },
              "slippageBps": {
                "type": "integer",
                "minimum": 0,
                "maximum": 10000
              },
              "createdAt": {
                "type": "string",
                "format": "date-time"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time"
              },
              "score": {
                "type": "object",
                "required": [
                  "expectedNetOut",
                  "minOut",
                  "expectedIn",
                  "networkFeeMicroAlgos",
                  "feeAlreadyNetted"
                ],
                "properties": {
                  "expectedNetOut": {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  "minOut": {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  "expectedIn": {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  "maxIn": {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  "networkFeeMicroAlgos": {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  "feeAlreadyNetted": {
                    "type": "boolean"
                  }
                }
              },
              "alternatives": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "router",
                    "status"
                  ],
                  "properties": {
                    "router": {
                      "type": "string",
                      "enum": [
                        "haystack",
                        "hogswap",
                        "tinyman",
                        "pact-smart-router",
                        "folks-router",
                        "asastats"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "quoted",
                        "error",
                        "skipped",
                        "timeout"
                      ]
                    },
                    "expectedNetOut": {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    },
                    "minOut": {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    },
                    "networkFeeMicroAlgos": {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    },
                    "reason": {
                      "type": "string"
                    }
                  }
                }
              },
              "legs": {
                "type": "array",
                "items": {}
              },
              "payload": {}
            }
          }
        },
        "required": [
          "address",
          "quote"
        ]
      },
      "page": "/webmcp"
    }
    canix_swapAction

    Build unsigned swap transactions via paid POST /swaps/transactions (~0.005 USDC) for the winning quote. Omit paymentSignature for x402 preflight, then retry with the same inputs. Canix does not sign or submit.

    View tool JSON
    {
      "name": "canix_swap",
      "kind": "act",
      "impl": "imperative",
      "description": "Build unsigned swap transactions via paid POST /swaps/transactions (~0.005 USDC) for the winning quote. Omit paymentSignature for x402 preflight, then retry with the same inputs. Canix does not sign or submit.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "minLength": 58,
            "maxLength": 58,
            "description": "58-character account address."
          },
          "quote": {
            "type": "object",
            "required": [
              "router",
              "address",
              "fromAssetId",
              "toAssetId",
              "amount",
              "type",
              "quotedAmount",
              "minOut",
              "networkFeeMicroAlgos",
              "slippageBps",
              "createdAt",
              "expiresAt",
              "score",
              "alternatives",
              "legs",
              "payload"
            ],
            "properties": {
              "router": {
                "type": "string",
                "enum": [
                  "haystack",
                  "hogswap",
                  "tinyman",
                  "pact-smart-router",
                  "folks-router",
                  "asastats"
                ]
              },
              "address": {
                "type": "string",
                "minLength": 58,
                "maxLength": 58,
                "description": "58-character account address."
              },
              "fromAssetId": {
                "type": "string",
                "pattern": "^[0-9]+$"
              },
              "toAssetId": {
                "type": "string",
                "pattern": "^[0-9]+$"
              },
              "amount": {
                "type": "string",
                "pattern": "^[1-9][0-9]*$"
              },
              "type": {
                "type": "string",
                "enum": [
                  "fixed-input",
                  "fixed-output"
                ]
              },
              "quotedAmount": {
                "type": "string",
                "pattern": "^[0-9]+$"
              },
              "minOut": {
                "type": "string",
                "pattern": "^[0-9]+$"
              },
              "networkFeeMicroAlgos": {
                "type": "string",
                "pattern": "^[0-9]+$"
              },
              "slippageBps": {
                "type": "integer",
                "minimum": 0,
                "maximum": 10000
              },
              "createdAt": {
                "type": "string",
                "format": "date-time"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time"
              },
              "score": {
                "type": "object",
                "required": [
                  "expectedNetOut",
                  "minOut",
                  "expectedIn",
                  "networkFeeMicroAlgos",
                  "feeAlreadyNetted"
                ],
                "properties": {
                  "expectedNetOut": {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  "minOut": {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  "expectedIn": {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  "maxIn": {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  "networkFeeMicroAlgos": {
                    "type": "string",
                    "pattern": "^[0-9]+$"
                  },
                  "feeAlreadyNetted": {
                    "type": "boolean"
                  }
                }
              },
              "alternatives": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "router",
                    "status"
                  ],
                  "properties": {
                    "router": {
                      "type": "string",
                      "enum": [
                        "haystack",
                        "hogswap",
                        "tinyman",
                        "pact-smart-router",
                        "folks-router",
                        "asastats"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "quoted",
                        "error",
                        "skipped",
                        "timeout"
                      ]
                    },
                    "expectedNetOut": {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    },
                    "minOut": {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    },
                    "networkFeeMicroAlgos": {
                      "type": "string",
                      "pattern": "^[0-9]+$"
                    },
                    "reason": {
                      "type": "string"
                    }
                  }
                }
              },
              "legs": {
                "type": "array",
                "items": {}
              },
              "payload": {}
            }
          },
          "slippage": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          },
          "sessionReceipt": {
            "type": "string",
            "minLength": 1,
            "description": "Prepaid session receipt (X-Canix-Session). Omit to pay per request with paymentSignature. If this header was sent, Caddy skipped x402; a 402 SESSION_* means drop the header and retry with paymentSignature."
          }
        },
        "required": [
          "address",
          "quote",
          "slippage"
        ]
      },
      "page": "/webmcp"
    }
    canix_create_sessionAction

    Buy a prepaid agent session (POST /sessions, ~0.25 USDC). One x402 payment mints a walletless receipt that unlocks N research calls and M quotes/plans until TTL. Sessions are receipts, not keys. Create/refresh cannot be paid with an existing session.

    View tool JSON
    {
      "name": "canix_create_session",
      "kind": "act",
      "impl": "imperative",
      "description": "Buy a prepaid agent session (POST /sessions, ~0.25 USDC). One x402 payment mints a walletless receipt that unlocks N research calls and M quotes/plans until TTL. Sessions are receipts, not keys. Create/refresh cannot be paid with an existing session.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          }
        }
      },
      "page": "/webmcp"
    }
    canix_refresh_sessionAction

    Refresh a prepaid session (POST /sessions/refresh, ~0.25 USDC). Resets N/M and TTL in place, or mints a new receipt if the previous one is gone. One-shot only.

    View tool JSON
    {
      "name": "canix_refresh_session",
      "kind": "act",
      "impl": "imperative",
      "description": "Refresh a prepaid session (POST /sessions/refresh, ~0.25 USDC). Resets N/M and TTL in place, or mints a new receipt if the previous one is gone. One-shot only.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sessionId": {
            "type": "string",
            "minLength": 1
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          }
        }
      },
      "page": "/webmcp"
    }
    canix_get_sessionAnswer

    Read remaining N/M and expiry for a prepaid session receipt (GET /sessions/{sessionId}). Free. Prefer this over the public indexer /transactions showcase.

    View tool JSON
    {
      "name": "canix_get_session",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read remaining N/M and expiry for a prepaid session receipt (GET /sessions/{sessionId}). Free. Prefer this over the public indexer /transactions showcase.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sessionId": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "sessionId"
        ]
      },
      "page": "/webmcp"
    }
    canix_create_watchSensitive Action

    Register a paid wallet watch retainer (POST /watch, ~0.25 USDC). Address + thresholds + optional HTTPS webhook. HMAC secret shown once. Canix never stores wallet keys.

    View tool JSON
    {
      "name": "canix_create_watch",
      "kind": "transact",
      "impl": "imperative",
      "description": "Register a paid wallet watch retainer (POST /watch, ~0.25 USDC). Address + thresholds + optional HTTPS webhook. HMAC secret shown once. Canix never stores wallet keys.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "minLength": 58,
            "maxLength": 58,
            "description": "58-character account address."
          },
          "thresholds": {
            "type": "object",
            "additionalProperties": false,
            "minProperties": 1,
            "properties": {
              "healthFactor": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "claimableUsd": {
                "type": "number",
                "minimum": 0
              },
              "apyDropBps": {
                "type": "integer",
                "minimum": 1,
                "maximum": 100000
              },
              "retiCapacity": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "const": true
                  },
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "minStakerSlotsRemaining": {
                        "type": "integer",
                        "minimum": 0
                      },
                      "minAlgoRoomMicroAlgos": {
                        "type": "string",
                        "pattern": "^[0-9]+$"
                      }
                    }
                  }
                ]
              }
            }
          },
          "webhookUrl": {
            "type": "string",
            "minLength": 8,
            "maxLength": 2048
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          }
        },
        "required": [
          "address",
          "thresholds"
        ]
      },
      "page": "/webmcp"
    }
    canix_refresh_watchAction

    Refresh a paid watch retainer (POST /watch/refresh, ~0.25 USDC). Extends TTL. Optionally rotateSecret. One-shot only.

    View tool JSON
    {
      "name": "canix_refresh_watch",
      "kind": "act",
      "impl": "imperative",
      "description": "Refresh a paid watch retainer (POST /watch/refresh, ~0.25 USDC). Extends TTL. Optionally rotateSecret. One-shot only.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "watchId": {
            "type": "string",
            "minLength": 1
          },
          "rotateSecret": {
            "type": "boolean"
          },
          "paymentSignature": {
            "type": "string",
            "minLength": 1,
            "description": "Optional PAYMENT-SIGNATURE base64 payload. Omit on first call to receive PAYMENT-REQUIRED metadata."
          }
        },
        "required": [
          "watchId"
        ]
      },
      "page": "/webmcp"
    }
    canix_get_watchAnswer

    Read a watch receipt and recent threshold firings (GET /watch/{watchId}). Free. Does not return the HMAC secret.

    View tool JSON
    {
      "name": "canix_get_watch",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read a watch receipt and recent threshold firings (GET /watch/{watchId}). Free. Does not return the HMAC secret.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "watchId": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "watchId"
        ]
      },
      "page": "/webmcp"
    }
    canix_rotate_watch_secretAction

    Rotate the watch webhook HMAC secret (POST /watch/{watchId}/rotate-secret). Free. Requires the current secret.

    View tool JSON
    {
      "name": "canix_rotate_watch_secret",
      "kind": "act",
      "impl": "imperative",
      "description": "Rotate the watch webhook HMAC secret (POST /watch/{watchId}/rotate-secret). Free. Requires the current secret.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "watchId": {
            "type": "string",
            "minLength": 1
          },
          "webhookSecret": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "watchId",
          "webhookSecret"
        ]
      },
      "page": "/webmcp"
    }