Build
For developers and agents
Everything the swap form knows can be read by a machine: the catalogue, limits, live quotes, address checks and swap status. No account, no key. An agent that controls a wallet can also create a swap and pay the instruction it gets back.
The files and endpoints
| Address | Format | What it is for |
|---|---|---|
| https://api.sablebolt.io/mcp | MCP, Streamable HTTP | Eight tools: seven read-only and create_swap |
| /openapi.json | OpenAPI 3.1 | The REST API at api.sablebolt.io: assets, routes, limits, quotes, address check, swaps, webhooks, market data |
| /.well-known/agent-skills/index.json | JSON | Eight skills, each mapped to endpoints and a documentation page |
| /.well-known/agent-card.json | JSON | The A2A agent card: interfaces, skills with example questions, the hand-off rule |
| /llms.txt | Markdown | The index for assistants; every page has a markdown twin at its own path plus .md |
| /feed.xml | RSS 2.0 | The blog, one item per post |
The MCP endpoint
https://api.sablebolt.io/mcp
- Transport: Streamable HTTP, protocol version 2025-06-18, stateless: no session to open, no stream to keep. GET answers 405, DELETE 405.
- Authentication: none. Rate: 60 requests a minute per IP on the endpoint; swap creation 10 a minute per IP, shared with the REST route.
- One JSON-RPC request per HTTP call. A batch is refused with 400.
- Every tool carries a title and annotations: readOnlyHint on the seven read tools; create_swap is marked as not read-only and not destructive.
| Tool | Input | Returns | Kind |
|---|---|---|---|
list_assets | — | every asset the form knows: slug, ticker, network, confirmations, extra-id name, availability | read-only |
list_routes | — | every route with its own page, and whether both sides are available right now | read-only |
get_limits | from, to | minimum and maximum for the route, in the asset you send | read-only |
get_quote | from, to, amount | amountTo, networkFee (taken out of the payout), receiveAmount, rate; the final amount is set when the deposit confirms | read-only |
validate_address | asset, address | whether the address has the right format for the asset; not who owns it, not whether an exchange needs a memo | read-only |
get_swap_status | id | stage (1 waiting … 5 done), both addresses, amounts, both transaction hashes; the payment instruction while the deposit is awaited | read-only |
swap_page_link | from, to, amount (optional) | the page where a person completes the swap, with the amount prefilled | read-only |
create_swap | from, to, amount, fromAddress, toAddress; extraId and fromExtraId when a chain needs them | the swap id, the status page and the payment instruction | creates a swap |
Connect a client
Claude Code
One command adds the endpoint as an HTTP server:
claude mcp add --transport http sablebolt https://api.sablebolt.io/mcpClaude.ai and Claude Desktop
Settings → Connectors → Add custom connector, then paste the endpoint URL. There is no sign-in step: the server asks for no credentials.
Cursor
In .cursor/mcp.json in the project, or ~/.cursor/mcp.json for every project:
{
"mcpServers": {
"sablebolt": { "url": "https://api.sablebolt.io/mcp" }
}
}ChatGPT
Settings → Connectors → Developer mode → Create, then name the connector and paste the endpoint URL.
Any other client
A Streamable HTTP client that sends initialize, then tools/list and tools/call, works as is. Send Accept: application/json, text/event-stream; the answer comes back as JSON or as one SSE message.
The hand-off rule
A swap for a person is completed by that person on the page: the assistant hands over swap_page_link, the person checks the amount, both addresses and the memo on screen, then sends the deposit from their own wallet.
create_swap is for an agent that controls the sending wallet itself. The sender address is required on every swap. The form has no refund address: a swap that cannot be completed is handled by support.
The rate floats until the deposit confirms. A quote is an estimate; the payout is set at confirmation.
The payment instruction
create_swap (and POST /v1/swaps) returns a payment instruction next to the deposit address, so an agent with a wallet pays without guessing:
| Field | Meaning |
|---|---|
asset, chain, chainId | the asset slug, the chain it moves on and, on EVM chains, the numeric chain id (1 Ethereum, 56 BNB Smart Chain, 137 Polygon, 8453 Base); null elsewhere |
tokenContract, decimals | the token contract or mint and the precision as the liquidity partner lists them; no contract for a chain's own coin |
address, extraId, extraIdName | the one-time deposit address and, when the chain needs one, the memo or destination tag under its own name; without it the deposit is not matched |
amount, amountBaseUnits | the exact amount to send, in the asset and in base units (satoshi, wei, sun); the base-unit value is rounded up at the last unit, never down |
uri, uriStandard | a wallet URI where a standard exists: BIP-21 for Bitcoin-like coins, ERC-681 for EVM coins and tokens, Solana Pay, monero:, ton://transfer; null where none applies |
note | the one rule in words: send exactly this amount in one transaction from the sending address given |
statusUrl (on the swap) | the status page; get_swap_status and GET /v1/swaps/{id} return the same stages |
The REST API
Described in /openapi.json. Every answer is JSON under data, every error under error with a code. 200 requests a minute per IP across the API, with tighter caps per route:
| Endpoint | What it returns |
|---|---|
GET /v1/assets | every asset, with canSend and canReceive |
GET /v1/routes | every published route |
GET /v1/limits?from=&to= | min and max for the route; 60 a minute |
GET /v1/quote?from=&to=&amount= | the estimate, also as POST with a JSON body; 60 a minute |
POST /v1/address/validate | the address format check; 30 a minute |
POST /v1/swaps | creates a swap and returns the payment instruction; 10 a minute, shared with create_swap |
GET /v1/swaps/{id} | status, stage, both addresses, both transaction hashes; 60 a minute |
POST /v1/swaps/{id}/notify | registers an https URL and a secret for signed swap.status notifications (HMAC-SHA256 over timestamp and body); DELETE removes it; 10 a minute |
GET /v1/network/{chain}, /v1/market/prices, /v1/market/chart/{id} | chain statistics and market data for the pages, cached |
Changelog
- 2026-11-03
- This page. Listed in the official MCP Registry (registry.modelcontextprotocol.io) as io.sablebolt/swaps.
- 2026-11-02
- create_swap and the payment instruction (base units, token contract, decimals, wallet URI); signed swap.status webhooks; canSend and canReceive on every asset; the A2A agent card; payment links at /pay; JSON-RPC batches refused; one creation cap for REST and MCP.
- 2026-10-28
- Launch: REST API v1 described in OpenAPI 3.1, the MCP endpoint with the read tools, llms.txt and markdown twins, the agent-skills index, RSS.
Contact
Questions and bug reports: support@sablebolt.io, or @sablebolt_bot on Telegram. Security reports: the address in /.well-known/security.txt.