Skip to main content
Glama
0xGval
by 0xGval

getTokenInfo

Retrieve token details from Ethereum blockchain by providing a contract address and network ID to analyze token information.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
addressYes
networkIdNoNetwork ID (1 for Ethereum, 101 for Solana)

Implementation Reference

  • Registration of the getTokenInfo MCP tool, including input schema (address, networkId) and inline async handler that fetches data from API and formats response.
    server.tool("getTokenInfo",
      { 
        address: z.string().min(1, "Token address is required"),
        networkId: z.number().int().positive().default(1).describe("Network ID (1 for Ethereum, 101 for Solana)")
      },
      async ({ address, networkId }) => {
        try {
          // Get token info from Codex API
          const tokenInfo = await fetchTokenInfo(address, networkId);
          
          if (!tokenInfo) {
            return {
              content: [{ type: "text", text: `No token information found for ${address} on network ${networkId}` }]
            };
          }
          
          // Format the token info for display
          const response = formatTokenInfoResponse(tokenInfo);
          
          return {
            content: [{ type: "text", text: response }]
          };
        } catch (error) {
          return {
            content: [{ type: "text", text: `Error fetching token info: ${error.message}` }]
          };
        }
      }
    );
  • Zod input schema for getTokenInfo tool parameters.
    { 
      address: z.string().min(1, "Token address is required"),
      networkId: z.number().int().positive().default(1).describe("Network ID (1 for Ethereum, 101 for Solana)")
    },
  • Inline handler function for executing getTokenInfo tool logic: fetches token info, handles errors, formats and returns text response.
    async ({ address, networkId }) => {
      try {
        // Get token info from Codex API
        const tokenInfo = await fetchTokenInfo(address, networkId);
        
        if (!tokenInfo) {
          return {
            content: [{ type: "text", text: `No token information found for ${address} on network ${networkId}` }]
          };
        }
        
        // Format the token info for display
        const response = formatTokenInfoResponse(tokenInfo);
        
        return {
          content: [{ type: "text", text: response }]
        };
      } catch (error) {
        return {
          content: [{ type: "text", text: `Error fetching token info: ${error.message}` }]
        };
      }
    }
  • Core helper function that performs GraphQL query to Codex API for getTokenInfo data.
    async function fetchTokenInfo(address, networkId) {
      try {
        // Use API key from environment variable
        const apiKey = process.env.CODEX_API_KEY;
        if (!apiKey) {
          throw new Error("CODEX_API_KEY environment variable is not set");
        }
        
        const response = await axios({
          url: API_URL,
          method: 'post',
          headers: {
            'Content-Type': 'application/json',
            'Authorization': apiKey
          },
          data: {
            query: `{
              getTokenInfo(address: "${address}", networkId: ${networkId}) {
                name
                symbol
                totalSupply
                address
                circulatingSupply
              }
            }`
          }
        });
        
        if (response.data && response.data.data && response.data.data.getTokenInfo) {
          return response.data.data.getTokenInfo;
        }
        
        return null;
      } catch (error) {
        console.error('Error fetching token info:', error.response?.data || error.message);
        throw new Error(`API error: ${error.response?.data?.errors?.[0]?.message || error.message}`);
      }
    }
  • Helper function to format the raw token info into a readable text response.
    function formatTokenInfoResponse(info) {
      let response = `=== Token Information ===\n`;
      response += `Name: ${info.name || 'N/A'}\n`;
      response += `Symbol: ${info.symbol || 'N/A'}\n`;
      response += `Address: ${info.address || 'N/A'}\n`;
      response += `Total Supply: ${info.totalSupply || 'N/A'}\n`;
      response += `Circulating Supply: ${info.circulatingSupply || 'N/A'}\n`;
      
      // Calculate additional metrics if possible
      if (info.totalSupply && info.circulatingSupply) {
        const totalSupply = parseFloat(info.totalSupply);
        const circulatingSupply = parseFloat(info.circulatingSupply);
        
        if (!isNaN(totalSupply) && !isNaN(circulatingSupply) && totalSupply > 0) {
          const circulationPercentage = (circulatingSupply / totalSupply) * 100;
          response += `Circulation Percentage: ${circulationPercentage.toFixed(2)}%\n`;
        }
      }
      
      return response;
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/0xGval/evm-mcp-tools'

If you have feedback or need assistance with the MCP directory API, please join our Discord server