One URL:
https://api.moove.xyz/mcp. Authenticate with an existing Moove API key. There is no separate MCP key and no MCP-specific scope.At a glance
Quickstart
1
Create an API key
At moove.xyz/dashboard/api-keys. Pick the Moove Receive Agent to unlock the payment-link tools. The plaintext key is shown once.Moove API Keys →
2
Put the key in an environment variable
MOOVE_API_KEY. Never write the key itself into a config file you commit.3
Add the server to your client
Pick your client in Connect a client.
4
Ask your agent what it can do
It calls
get_account_context first: the account, the tools your key unlocks, and the rate limits that apply.Connect a client
Connect from any client that lets you set a request header. Connecting from claude.ai and ChatGPT needs OAuth, which is coming later.- Claude Code
- Cursor
- Codex
- GitHub Copilot
- Gemini CLI
- MCP Inspector
Add the server to
.mcp.json at your project root. Claude Code expands ${MOOVE_API_KEY} at runtime, so the file holds no secret..mcp.json
"type": "http" is required. Without it the entry is read as a local stdio server.Authentication
Send a Moove API key on every request, in either header:Authorization: Beareris accepted on the MCP server only. The REST API takesX-API-Key.- Only Moove API keys are accepted. A dashboard session token is refused.
- Send both headers and they must carry the same key. Two different keys is a
401.
401 with the REST error body and a challenge header:
There is no OAuth flow yet. Connectors that need OAuth, such as claude.ai and ChatGPT, are coming later.
Authentication →
Tools
Your key’s existing scopes decide which toolstools/list returns. Calling a tool your key does not unlock returns INSUFFICIENT_API_SCOPE. A Moove Receive Agent key unlocks all seven.
Amounts are decimal strings in both arguments and results. Send them as strings to keep them exact. The one exception is
rate from get_market_rates, an indicative number.
get_account_context
get_account_context
Takes no arguments. Call it at the start of a session, and again after
INSUFFICIENT_API_SCOPE or 429.settlement is returned to keys that hold payment_link:create. It is null for other keys, and also when the account has no default wallet or its token cannot be resolved. The tool never returns a wallet address.list_payment_links
list_payment_links
Returns
links, total and nextCursor. total is an upper bound on the matching links and can be null past the end. nextCursor is null on the last page. Links created in the dashboard or with other keys on the same account are included.get_payment_link
get_payment_link
Only links on the key’s own account are returned. Any other id answers
CANNOT_FIND_PAYMENT_LINK, exactly like an id that does not exist.estimate_payment_link
estimate_payment_link
Fiat links only. Returns
toAmount — what the merchant receives in the settlement token after card fees — plus the rails a payer could use with their minimum and maximum amounts, and dateExpired, when the estimate goes stale.Each call fetches a live price from the card provider, so two calls can return different figures. The call is held to a 25-second deadline; a slower price answers CANNOT_CREATE_QUOTE (500, retryable).create_payment_link
create_payment_link
Pass
toAmount for a crypto link, or fiatAmount and fiatCurrency for a fiat link. A fiat link is paid by card and is always single-use, whatever maxUsage says. A fiat link’s expirationDate must also leave time for a card payment to settle, or the call returns PAYMENT_LINK_EXPIRY_TOO_SOON.Both types settle to the account’s default wallet in its settlement token. There is no destination argument: an unknown argument, such as a wallet address, is refused with INVALID_ARGUMENTS.Returns id, url (the checkout URL to share) and dashboardUrl.list_supported_assets
list_supported_assets
Returns every supported chain, and up to
limit matching tokens. truncated is true when more tokens matched — narrow the filters.get_market_rates
get_market_rates
Returns
rate — the fiat paid per one token bought by card, fees included, as a number — and dateUpdated.Response format
responseFormat: "concise" omits the settlement address, the owner id and the transaction URL from each payment link. "detailed" includes them. Every link carries url for the payer and dashboardUrl for the owner.
Prompts and resources
Prompts are filtered like tools:
create-payment-link is listed for keys with payment_link:create, reconcile-payment-links for keys with payment_link:read.
| Resource | moove://guide/payment-links | Contract notes: link types, amounts, settlement, statuses and limits |
Errors
A tool that fails returns a normal tool result withisError: true. The same payload is in structuredContent and mirrored as text.
Codes are the REST error codes, plus three that only the MCP server returns. A tool’s rate limit answers
429, the same code the REST rate-limit body uses.
INSUFFICIENT_API_SCOPE (403) means the key’s scopes do not unlock the tool. Issue a key with the right agent.
HTTP errors
Some requests are refused before any tool runs. These are plain HTTP responses, not tool results.Rate limits
Two layers apply, each per API key and per source IP:
A tool spends the same budget as the REST endpoint it shares a handler with. Creating links over MCP and over REST draws on one allowance, not two.
Rate Limits →
What the MCP server cannot do
Nothing on the server signs, broadcasts or moves money. No tool accepts a private key or a seed phrase.A payment link requests money. It always settles to the key owner’s own default wallet, and no tool lets the caller choose a destination.
Versioning
The server reports its own version, currently1.0.0, independent of the REST path version.
- A new tool is a minor version bump.
- Removing or renaming a tool is a major version bump.
tools/list and new fields in results.
Documentation over MCP
For product and documentation questions, connect your agent to the docs MCP server athttps://docs.moove.xyz/mcp. It needs no key.
Next
Authentication
Keys, scopes and revocation.
Errors
The REST error codes.
Moove Agentic Payments
The skill file for AI coding tools.