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
| Capability | Source / execution boundary |
|---|---|
| Chain reads, simulation, Signal Replay | LAYA native |
| HYPE, WHYPE, USDC signing intents | LAYA native · human wallet signs |
| Immutable Signal Seal deployment | LAYA native · pinned Solidity 0.8.30 · human wallet signs |
| Wallet ownership challenges, scoped access keys | LAYA native · server-verified |
| Perps markets, v4 pools / quotes, agent lookup, private-pool reads | via Tesera · live read-only relay |
| Private settlement, production swaps, HyperCore trades | external workflow · not LAYA native |
| Token buybacks, arbitrary deployment, private-key management | external 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,
POSTone JSON-RPC 2.0 message per request; responses areapplication/json. Stateless — noMcp-Session-Id.GET/DELETEreturn 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-Versionheader → 400. - Errors: parse -32700, invalid request -32600, unknown tool / bad params -32602. Tool-level failures (validation, RPC errors, reverts) return
isError: truewith a JSON explanation. - Native results include
structuredContentand_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 checkseth_chainId == 0x1863dand refuses to serve if it differs. - Nothing is signed or broadcast by the gateway.
laya_prepare_transferreturns an unsigned transaction only.
Native tools (11)
Generated from the same definitions the server executes.
laya_prepare_intentCreate 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_headVerifies 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_blockreplayableA 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_balancereplayableNative 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_balancereplayablebalanceOf(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_priceeth_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_transactionA 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_codereplayableDeployed 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_callreplayableRuns 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_simulatereplayableSimulates 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_transferBuilds 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.