get_tokens
Retrieve registered tokens, including built-in and custom, for a specified blockchain network.
Instructions
Get registered tokens (builtin + custom) for a specific network.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| network | Yes | Network identifier (e.g., "ethereum-sepolia", "polygon-amoy" or CAIP-2 "eip155:1"). |
Implementation Reference
- The registerGetTokens function registers the 'get_tokens' tool on the MCP server. The handler accepts a 'network' parameter, sends a GET request to /v1/tokens?network=... via the ApiClient, and returns the result as a CallToolResult.
export function registerGetTokens(server: McpServer, apiClient: ApiClient, walletContext?: WalletContext): void { server.tool( 'get_tokens', withWalletPrefix('Get registered tokens (builtin + custom) for a specific network.', walletContext?.walletName), { network: z.string().describe('Network identifier (e.g., "ethereum-sepolia", "polygon-amoy" or CAIP-2 "eip155:1").'), }, async (args) => { const params = new URLSearchParams(); params.set('network', args.network); const result = await apiClient.get('/v1/tokens?' + params.toString()); return toToolResult(result); }, ); } - Input schema for get_tokens: a single required 'network' field (string) described as a network identifier (e.g., 'ethereum-sepolia', 'polygon-amoy' or CAIP-2). Validated via zod.
{ network: z.string().describe('Network identifier (e.g., "ethereum-sepolia", "polygon-amoy" or CAIP-2 "eip155:1").'), }, - packages/mcp/src/server.ts:92-92 (registration)Registration of get_tokens tool inside createMcpServer: registerGetTokens(server, apiClient, walletContext) is called at line 92.
registerGetTokens(server, apiClient, walletContext); - packages/mcp/src/server.ts:36-36 (registration)Import statement for registerGetTokens from './tools/get-tokens.js' in the server factory module.
import { registerGetTokens } from './tools/get-tokens.js'; - The toToolResult helper function converts ApiResult to CallToolResult format. Used by the get_tokens handler to format the API response.
export function toToolResult<T>(result: ApiResult<T>): CallToolResult { if ('ok' in result && result.ok) { return { content: [{ type: 'text', text: JSON.stringify(result.data) }], }; } if ('expired' in result && result.expired) { return { content: [{ type: 'text', text: JSON.stringify({ session_expired: true, message: result.message, action: 'Run waiaas mcp setup to get a new token', }), }], // NO isError (H-04: prevents Claude Desktop from disconnecting) }; } if ('networkError' in result && result.networkError) { return { content: [{ type: 'text', text: JSON.stringify({ network_error: true, message: result.message, }), }], // NO isError }; } // Actual API error -- isError: true if ('error' in result) { return { content: [{ type: 'text', text: JSON.stringify({ error: true, ...result.error, }), }], isError: true, }; } // Should never happen -- fallback return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: 'Unknown error' }) }], isError: true, }; } /** * Convert ApiResult to MCP resource result format (ReadResourceResult). */ export function toResourceResult<T>(uri: string, result: ApiResult<T>): ReadResourceResult { if ('ok' in result && result.ok) { return { contents: [{ uri, text: JSON.stringify(result.data), mimeType: 'application/json', }], }; } if ('expired' in result && result.expired) { return { contents: [{ uri, text: JSON.stringify({ session_expired: true, message: result.message, action: 'Run waiaas mcp setup to get a new token', }), mimeType: 'application/json', }], }; } if ('networkError' in result && result.networkError) { return { contents: [{ uri, text: JSON.stringify({ network_error: true, message: result.message, }), mimeType: 'application/json', }], }; } if ('error' in result) { return { contents: [{ uri, text: JSON.stringify({ error: true, ...result.error, }), mimeType: 'application/json', }], }; } return { contents: [{ uri, text: JSON.stringify({ error: true, message: 'Unknown error' }), mimeType: 'application/json', }], }; }