Sui Testnet MCP server
Connect an MCP-capable client — Claude, Codex, Cursor, Windsurf — to the Sui Testnet faucet over a single streamable-HTTP endpoint. The server exposes three tools: request testnet tokens, poll claim status, and check faucet reachability.
Setup
Pick a client. The endpoint is the same; only the registration syntax differs.
Claude CLI
claude mcp add --transport http faucetme-sui https://faucetme.pro/api/mcpThen run /mcp to confirm it loaded.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"faucetme-sui": {
"transport": "http",
"url": "https://faucetme.pro/api/mcp"
}
}
}Codex CLI
Append to ~/.codex/config.toml:
[mcp_servers.faucetme-sui]
transport = "http"
url = "https://faucetme.pro/api/mcp"Cursor
Settings → MCP → add server:
{
"name": "faucetme-sui",
"transport": "http",
"url": "https://faucetme.pro/api/mcp"
}Windsurf
Add to MCP servers config:
{
"faucetme-sui": {
"command": null,
"transport": "http",
"url": "https://faucetme.pro/api/mcp"
}
}Available tools
Three tools mapped directly to the faucet workflow.
project_info
toolHealth check. Returns MCP / faucet API reachability and the security mode in effect.
{ projectName, apiReachable, securityMode }Example response
{
"projectName": "Sui",
"apiReachable": true,
"securityMode": "internal-token"
}claim_tokens
toolQueues a faucet claim for the given project and wallet via the internal API. Returns a requestId you can poll.
projectSlugstring- Project slug, e.g. "sui".
walletAddressstring- Destination wallet address.
{ requestId, status }Example response
{
"requestId": "8b3e9c1a-…-9f12",
"status": "queued"
}get_claim_status
toolReturns the normalized payout status for a previously created requestId.
projectSlugstring- Project slug, e.g. "sui".
requestIdstring (uuid)- ID returned by claim_tokens.
{ status, txHash?, errorMessage? }Example response
{
"status": "confirmed",
"txHash": "0xabc…dead",
"errorMessage": null
}Claim status values
Both claim_tokens and get_claim_status return one of:
queued- Request accepted, waiting for the dispatcher worker.
sent- Transaction broadcast to the network.
confirmed- Transaction included in a block. txHash available.
failed- Dispatch failed. errorMessage describes the reason.
unknown- State could not be determined yet. Retry.
Example session
After the server is registered, the full flow takes three steps.
- 1.Confirm the server is loadedList MCP servers in your client.
/mcp - 2.Ask the assistant to claimAgent calls claim_tokens({ projectSlug: "sui-testnet", walletAddress: "0xabc..." }).
Claim 1 SUI for 0xabc... on project "sui-testnet" - 3.Poll status until confirmedAgent calls get_claim_status(requestId) until status is confirmed or failed.
What is the status of request <requestId>?
Security model
- No key custody
- The MCP server is a thin proxy in front of the internal faucet API. It never holds wallet keys.
- Optional bearer auth
- Pass authToken on any tool call; set MCP_AUTH_TOKEN on the server to enforce.
- Idempotency
- Each claim_tokens call generates a fresh idempotency key to avoid double-dispatch on retry.
- Client IP attribution
- cf-connecting-ip and x-forwarded-for are forwarded so rate limits attribute to the real caller.
Troubleshooting
- "Bad Request: No valid session ID"
- The client did not send an
initializerequest first. Re-register the server in your client. - Tool returns
apiReachable: false - The internal faucet API is down or unreachable from the MCP container. Check the dashboard for an outage banner.
- Status stuck on
queued - Dispatcher worker is paused or the project hit a rate-limit window. Wait and re-poll
get_claim_status.