Limits
What it will not do, however the request is phrased.
These are enforced in the server, not in the wording of a tool description, so no prompt talks its way past them.
| Not possible | Why |
|---|---|
| Withdraw or transfer funds | A withdrawal is signed by the wallet, in a browser. No tool moves money off the exchange. |
| Sign or broadcast a swap | get_swap_quote returns unsigned calldata. The transaction goes to the user's wallet. |
| Set leverage | There is no leverage tool. Size the order against the collateral you mean to commit. |
| Accept a wallet private key | No tool has a field for one. Not now, not ever. |
| Dry-run an order | There is no simulation mode and no undo. |
| Change a referral split | Fixed server-side and capped. No parameter raises what a link gives away. |
| Identify anyone | Leaderboard addresses are shortened and unlinkable. Referees are counted, never named. |
Rate limits
Tool calls reach real venues and real quotas, so the endpoint is limited like any other write path rather than treated as free because it arrives over a different protocol. Going over returns the code rate_limited, which is marked retryable: back off a few seconds and try once.
Failures are structured
Nothing throws. Every failure returns JSON with a message, a stable code and a retryable flag, so an agent can branch on the code instead of parsing a sentence.
{
"error": "Your balance is too low for this amount.",
"code": "insufficient_balance",
"retryable": false
}The code comes from a fixed catalogue. The full list, with the HTTP status and retryable flag for each, is served live at GET https://swapmos.com/mcp under errors.
What it is not
- It is not a custodian. It holds no wallet, and no key of yours ever leaves your own configuration.
- It is not an advisor. It answers with data and places the orders it is told to place.
- It keeps no session. Nothing is remembered between calls, which is why every credentialed call carries its own headers.