Skip to content

Documentation

Connect an AI

LAYA exposes one public, zero-auth MCP server over Streamable HTTP for Kinetiq Elysium (chain 99901 / 0x1863d, native HYPE, 18 decimals).

Endpoint

https://laya-gateway.lovable.app/api/mcp

Aliases: https://laya-gateway.lovable.app/mcp and https://laya-gateway.lovable.app/api/public/mcp. Public review links use explicit LAYA_PUBLIC_ORIGIN configuration, not request headers.

Claude

Claude.ai / Claude Desktop: Settings → Connectors → Add custom connector, paste the endpoint above. For older Desktop builds without remote connectors, use the mcp-remote bridge in claude_desktop_config.json:

{
  "mcpServers": {
    "laya": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://laya-gateway.lovable.app/api/mcp"
      ]
    }
  }
}

Claude Code:

claude mcp add --transport http laya https://laya-gateway.lovable.app/api/mcp

Cursor

~/.cursor/mcp.json or .cursor/mcp.json:

{
  "mcpServers": {
    "laya": {
      "url": "https://laya-gateway.lovable.app/api/mcp"
    }
  }
}

Generic remote MCP

{
  "name": "laya",
  "transport": "streamable-http",
  "url": "https://laya-gateway.lovable.app/api/mcp"
}

Or straight from a shell:

curl -s https://laya-gateway.lovable.app/api/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"laya_network_head","arguments":{}}}'

Capability / source matrix

CapabilitySource / execution boundary
Chain reads, simulation, Signal ReplayLAYA native
HYPE, WHYPE, USDC signing intentsLAYA native · human wallet signs
Immutable Signal Seal deploymentLAYA native · pinned Solidity 0.8.30 · human wallet signs
Wallet ownership challenges, scoped access keysLAYA native · server-verified
Perps markets, v4 pools / quotes, agent lookup, private-pool readsvia Tesera · live read-only relay
Private settlement, production swaps, HyperCore tradesexternal workflow · not LAYA native
Token buybacks, arbitrary deployment, private-key managementexternal workflow · not relayed

External workflows are operated by Tesera, not LAYA; their permissions and execution risks apply.

Explicitly open official Tesera MCP endpoint →

Agent → human review → wallet

Call laya_prepare_intent and hand reviewUrl to the human. It opens independently in a fresh browser and expires after 15 minutes. Review reconstructs only supported typed actions, verifies chain and account, simulates with the connected wallet immediately before signing, and enforces the maximum gas budget. No server-suggested transaction is trusted.

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "laya_prepare_intent",
    "arguments": {
      "type": "hype_transfer",
      "from": "0x0000000000000000000000000000000000000001",
      "destination": "0x0000000000000000000000000000000000000002",
      "amount": "0.001",
      "maxFeeHype": "0.01"
    }
  }
}
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "laya_prepare_intent",
    "arguments": {
      "type": "deploy_signal_seal",
      "from": "0x0000000000000000000000000000000000000001",
      "digest": "0xabababababababababababababababababababababababababababababababab",
      "maxFeeHype": "0.01"
    }
  }
}

Examples use placeholder addresses/digest; replace with your signer, recipient and verified Replay receipt digest. Signal Seal source, ABI and creation bytecode are reproducibly checked at build time with pinned solc 0.8.30, optimizer 200 and Paris EVM. The constructor ABI-encodes one bytes32 digest. A seal is marked live only after a successful receipt, matching runtime code and digest readback. No deployed seal is claimed here.

Wallet-owned access keys

Optional; public chain reads remain available without a key. Key calls have read/prepare scopes and a shared atomic quota of 120 per minute. Ownership requires a single-use, domain-bound wallet signature; no transaction.

    Protocol

    • Transport: Streamable HTTP, POST one JSON-RPC 2.0 message per request; responses are application/json. Stateless — no Mcp-Session-Id. GET/DELETE return 405 (no SSE stream).
    • Methods: initialize, notifications/initialized (→ 202, no body), ping, tools/list, tools/call. Others → -32601.
    • Protocol versions: 2025-06-18 (default), 2025-03-26, 2024-11-05. An unsupported MCP-Protocol-Version header → 400.
    • Errors: parse -32700, invalid request -32600, unknown tool / bad params -32602. Tool-level failures (validation, RPC errors, reverts) return isError: true with a JSON explanation.
    • Native results include structuredContent and _meta.source = "laya-native"; relayed results carry _meta.source = "upstream:tesera".
    • CORS: *, preflight supported.

    Limits & safety

    • Body ≤ 64 KB; calldata ≤ 8 KB; relayed arguments ≤ 8 KB. JSON-RPC batches rejected.
    • Optional access tokens: 120 requests/minute per key using an atomic shared database counter. Invalid/revoked keys are refused, never downgraded to public access. Ownership requests have 20/minute per owner and 30/minute per trusted-edge IP; challenges expire after 5 minutes and are atomically single-use. Public unkeyed reads remain zero-auth, with no claimed global anonymous rate limit.
    • Use Authorization: Bearer <your-once-shown-token>. Read scope covers reads; prepare scope covers native prepare tools. No key permits signing, broadcasting or accessing another owner's keys. Browser transfer policies are local to the review page.
    • Timeouts: 8 s per RPC attempt, up to 3 attempts on transport errors (backoff); 25 s per tool call.
    • The RPC URL is server-configurable (LAYA_RPC_URL, default https://rpc.elysium.kinetiq.xyz). The server checks eth_chainId == 0x1863d and refuses to serve if it differs.
    • Nothing is signed or broadcast by the gateway. laya_prepare_transfer returns an unsigned transaction only.

    Native tools (11)

    Generated from the same definitions the server executes.

    laya_prepare_intent

    Create a 15-minute, chain-bound public review link for HYPE, supported WHYPE/USDC transfers, or pinned LAYA Signal Seal deployment. No signing or broadcast. maxFeeHype is a required maximum network fee budget.

    inputSchema
    {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "hype_transfer",
            "erc20_transfer",
            "deploy_signal_seal"
          ]
        },
        "from": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "Required signer"
        },
        "destination": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "Transfer recipient"
        },
        "amount": {
          "type": "string",
          "maxLength": 60,
          "description": "Exact decimal transfer amount"
        },
        "token": {
          "type": "string",
          "enum": [
            "WHYPE",
            "USDC"
          ]
        },
        "digest": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{64}$",
          "description": "Signal Replay SHA-256 digest as bytes32"
        },
        "maxFeeHype": {
          "type": "string",
          "maxLength": 60,
          "description": "Positive maximum total network fee in HYPE"
        }
      },
      "required": [
        "type",
        "from",
        "maxFeeHype"
      ],
      "additionalProperties": false
    }
    laya_network_head

    Verifies the RPC reports Kinetiq Elysium (chain id 99901 / 0x1863d) and returns the latest block number, hash, timestamp and gas price.

    inputSchema
    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    laya_get_blockreplayable

    A block header and up to 50 transaction hashes, by number or "latest".

    inputSchema
    {
      "type": "object",
      "properties": {
        "block": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "string",
              "enum": [
                "latest"
              ]
            }
          ],
          "description": "A block number or \"latest\". Defaults to \"latest\"."
        }
      },
      "additionalProperties": false
    }
    laya_get_balancereplayable

    Native HYPE balance (18 decimals) of an address at a block.

    inputSchema
    {
      "type": "object",
      "properties": {
        "address": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "A 0x-prefixed account address."
        },
        "block": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "string",
              "enum": [
                "latest"
              ]
            }
          ],
          "description": "A block number or \"latest\". Defaults to \"latest\"."
        }
      },
      "required": [
        "address"
      ],
      "additionalProperties": false
    }
    laya_erc20_balancereplayable

    balanceOf(owner), decimals() and symbol() of an ERC-20 contract at a block.

    inputSchema
    {
      "type": "object",
      "properties": {
        "token": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "ERC-20 contract address."
        },
        "owner": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "Holder address."
        },
        "block": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "string",
              "enum": [
                "latest"
              ]
            }
          ],
          "description": "A block number or \"latest\". Defaults to \"latest\"."
        }
      },
      "required": [
        "token",
        "owner"
      ],
      "additionalProperties": false
    }
    laya_gas_price

    eth_gasPrice, the latest base fee and the suggested priority fee, plus the HYPE cost of a 21,000-gas transfer.

    inputSchema
    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    laya_get_transaction

    A transaction by hash with its receipt once mined: status, gas used, effective gas price, fee and log count.

    inputSchema
    {
      "type": "object",
      "properties": {
        "hash": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{64}$",
          "description": "A 32-byte 0x-prefixed transaction hash."
        }
      },
      "required": [
        "hash"
      ],
      "additionalProperties": false
    }
    laya_get_codereplayable

    Deployed bytecode size and keccak-256 code hash at an address (bytecode truncated to 4 KB).

    inputSchema
    {
      "type": "object",
      "properties": {
        "address": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "Contract address."
        },
        "block": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "string",
              "enum": [
                "latest"
              ]
            }
          ],
          "description": "A block number or \"latest\". Defaults to \"latest\"."
        }
      },
      "required": [
        "address"
      ],
      "additionalProperties": false
    }
    laya_static_callreplayable

    Runs eth_call with caller-supplied calldata against a contract. Read-only: nothing is signed or sent. Calldata limited to 8 KB.

    inputSchema
    {
      "type": "object",
      "properties": {
        "to": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "Contract address."
        },
        "data": {
          "type": "string",
          "pattern": "^0x([0-9a-fA-F]{2})*$",
          "maxLength": 16386,
          "description": "ABI-encoded calldata, 0x-prefixed hex."
        },
        "from": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "Optional msg.sender."
        },
        "block": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "string",
              "enum": [
                "latest"
              ]
            }
          ],
          "description": "A block number or \"latest\". Defaults to \"latest\"."
        }
      },
      "required": [
        "to",
        "data"
      ],
      "additionalProperties": false
    }
    laya_simulatereplayable

    Simulates a transaction with eth_call and eth_estimateGas at a block. Reports success, return data, revert reason and gas. Nothing is sent.

    inputSchema
    {
      "type": "object",
      "properties": {
        "to": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "Destination address."
        },
        "from": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "Sender address (recommended)."
        },
        "value": {
          "type": "string",
          "pattern": "^[0-9]{1,40}$",
          "description": "Value in wei, as a decimal string."
        },
        "data": {
          "type": "string",
          "pattern": "^0x([0-9a-fA-F]{2})*$",
          "maxLength": 16386,
          "description": "Calldata, 0x-prefixed hex (optional)."
        },
        "block": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "string",
              "enum": [
                "latest"
              ]
            }
          ],
          "description": "A block number or \"latest\". Defaults to \"latest\"."
        }
      },
      "required": [
        "to"
      ],
      "additionalProperties": false
    }
    laya_prepare_transfer

    Builds an unsigned native HYPE transfer for chain 99901: validates addresses and the decimal amount, simulates it, estimates gas, reads nonce and fees, and checks the sender can afford value + max fee. Returns an unsigned transaction only — LAYA never signs or broadcasts.

    inputSchema
    {
      "type": "object",
      "properties": {
        "from": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "Sender address."
        },
        "to": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$",
          "description": "Recipient address."
        },
        "amount": {
          "type": "string",
          "pattern": "^\\d{1,30}(\\.\\d{1,18})?$",
          "description": "Decimal HYPE amount, e.g. 0.05 (max 18 decimals)."
        }
      },
      "required": [
        "from",
        "to",
        "amount"
      ],
      "additionalProperties": false
    }

    Upstream tools — relayed from Tesera

    Checking current upstream catalogue…

    Tools prefixed tesera_ are forwarded to the public third-party server https://mcp.teseralab.com/elysium, which LAYA does not operate and is not affiliated with. Only allowlisted read/analysis tools that the upstream itself marks read-only are listed, and only when upstream is reachable at list time. Broadcasting, trade submission, signing, compilation, key management, webhooks and payment preparation are never relayed — use the source directly for those.

    • tesera_get_logsContract tooling
    • tesera_read_contractContract tooling
    • tesera_token_infoContract tooling
    • tesera_contract_infoContract tooling
    • tesera_decode_transactionContract tooling
    • tesera_trace_callContract tooling
    • tesera_search_docsDocs
    • tesera_perps_marketsPerps (Hyperliquid)
    • tesera_perps_marketPerps (Hyperliquid)
    • tesera_perps_fundingPerps (Hyperliquid)
    • tesera_perps_candlesPerps (Hyperliquid)
    • tesera_perps_accountPerps (Hyperliquid)
    • tesera_perps_riskPerps (Hyperliquid)
    • tesera_perps_scanPerps (Hyperliquid)
    • tesera_v4_poolsUniswap v4
    • tesera_v4_quoteUniswap v4
    • tesera_v4_positionsUniswap v4
    • tesera_v4_analyticsUniswap v4
    • tesera_agent_lookupAgents (ERC-8004)
    • tesera_private_poolPrivacy pools
    • tesera_private_riskPrivacy pools

    Receipt format (laya.receipt/1)

    Fields: schema, id, capturedAt, chain{id,name}, block{number,hash,timestamp}, tool, source, input, ok, output, gas{gasPriceWei,gasEstimate}, digest.

    digest = "sha256:" + hex(SHA-256(canonical(receipt without digest))), where canonical JSON sorts object keys recursively and drops whitespace. Any edit invalidates it. Receipts live in this browser's localStorage only.