Skip to main content
Glama

erc20_getTokenInfo

Retrieve ERC20 token details like name, symbol, decimals, and total supply by providing the contract address on Ethereum networks.

Instructions

Get detailed information about an ERC20 token including its name, symbol, decimals, and total supply. Alternative naming for compatibility with MCP client tests.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
contractAddressYesThe address of the ERC20 token contract
tokenAddressNoDEPRECATED: Use contractAddress instead. The address of the ERC20 token contract
providerNoOptional. Either a network name or custom RPC URL. Use getAllNetworks to see available networks and their details, or getNetwork to get info about a specific network. You can use any network name returned by these tools as a provider value.
chainIdNoOptional. The chain ID to use. If provided with a named network and they don't match, the RPC's chain ID will be used.

Implementation Reference

  • Registration of the 'erc20_getTokenInfo' tool using server.tool, including schema and handler function. This is the primary location where the tool is defined and registered with the MCP server.
      server.tool(
        "erc20_getTokenInfo",
        "Get detailed information about an ERC20 token including its name, symbol, decimals, and total supply. Alternative naming for compatibility with MCP client tests.",
        {
          contractAddress: contractAddressSchema,
          tokenAddress: tokenAddressSchema.optional(),  // Deprecated
          provider: providerSchema,
          chainId: chainIdSchema
        },
        async (params) => {
          // Map deprecated parameters
          const mapped = mapParameters(params);
          
          try {
            const contractAddr = mapped.contractAddress || params.tokenAddress;
            if (!contractAddr) {
              throw new Error('Either contractAddress or tokenAddress must be provided');
            }
            const tokenInfo = await ethersService.getERC20TokenInfo(
              contractAddr,
              mapped.provider,
              mapped.chainId
            );
            
            return {
              content: [{ 
                type: "text", 
                text: `Token Information:
    Name: ${tokenInfo.name}
    Symbol: ${tokenInfo.symbol}
    Decimals: ${tokenInfo.decimals}
    Total Supply: ${tokenInfo.totalSupply}`
              }]
            };
          } catch (error) {
            return {
              isError: true,
              content: [{ 
                type: "text", 
                text: `Error getting token information: ${error instanceof Error ? error.message : String(error)}`
              }]
            };
          }
        }
      );
  • The handler function for erc20_getTokenInfo tool that processes parameters, calls EthersService.getERC20TokenInfo, and returns formatted token information or error.
        async (params) => {
          // Map deprecated parameters
          const mapped = mapParameters(params);
          
          try {
            const contractAddr = mapped.contractAddress || params.tokenAddress;
            if (!contractAddr) {
              throw new Error('Either contractAddress or tokenAddress must be provided');
            }
            const tokenInfo = await ethersService.getERC20TokenInfo(
              contractAddr,
              mapped.provider,
              mapped.chainId
            );
            
            return {
              content: [{ 
                type: "text", 
                text: `Token Information:
    Name: ${tokenInfo.name}
    Symbol: ${tokenInfo.symbol}
    Decimals: ${tokenInfo.decimals}
    Total Supply: ${tokenInfo.totalSupply}`
              }]
            };
          } catch (error) {
            return {
              isError: true,
              content: [{ 
                type: "text", 
                text: `Error getting token information: ${error instanceof Error ? error.message : String(error)}`
              }]
            };
          }
        }
      );
  • Input schema definition for the erc20_getTokenInfo tool, referencing shared Zod schemas for parameters.
    {
      contractAddress: contractAddressSchema,
      tokenAddress: tokenAddressSchema.optional(),  // Deprecated
      provider: providerSchema,
      chainId: chainIdSchema
    },
  • Low-level helper function getTokenInfo that implements the core logic for fetching ERC20 token information, likely wrapped by EthersService.getERC20TokenInfo.
    export async function getTokenInfo(
      ethersService: EthersService,
      tokenAddress: string,
      provider?: string,
      chainId?: number
    ): Promise<ERC20Info> {
      metrics.incrementCounter('erc20.getTokenInfo');
      
      return timeAsync('erc20.getTokenInfo', async () => {
        try {
          // Check rate limiting
          const identity = `${tokenAddress}:${provider || 'default'}`;
          if (!rateLimiter.consume('token', identity)) {
            throw new ERC20Error('Rate limit exceeded for token operations');
          }
          
          // Create cache key
          const cacheKey = createTokenCacheKey(
            CACHE_KEYS.ERC20_INFO,
            tokenAddress,
            chainId
          );
          
          // Check cache first
          const cachedInfo = contractCache.get(cacheKey);
          if (cachedInfo) {
            return cachedInfo as ERC20Info;
          }
          
          // Get provider from ethers service
          const ethersProvider = ethersService['getProvider'](provider, chainId);
          
          // Create contract instance
          const contract = new ethers.Contract(tokenAddress, ERC20_ABI, ethersProvider);
          
          // Fetch token information
          const [name, symbol, decimals, totalSupply] = await Promise.all([
            contract.name(),
            contract.symbol(),
            contract.decimals(),
            contract.totalSupply()
          ]);
          
          // Format data
          const tokenInfo: ERC20Info = {
            name,
            symbol,
            decimals,
            totalSupply: totalSupply.toString()
          };
          
          // Cache result for future use (1 day TTL)
          contractCache.set(cacheKey, tokenInfo, { ttl: 86400000 });
          
          return tokenInfo;
        } catch (error) {
          logger.debug('Error getting ERC20 token info', { tokenAddress, error });
          
          if (error instanceof Error && (
            error.message.includes('contract not deployed') || 
            error.message.includes('invalid address')
          )) {
            throw new TokenNotFoundError(tokenAddress);
          }
          
          throw handleTokenError(error, 'Failed to get token information');
        }
      });
    }
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It describes a read-only operation ('Get detailed information'), which implies non-destructive behavior, but doesn't mention potential errors (e.g., invalid addresses), rate limits, authentication needs, or response format. For a tool with no annotations, this leaves significant gaps in understanding how it behaves in practice.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded, with the core purpose stated in the first sentence. The second sentence about 'Alternative naming' is somewhat tangential but may serve a purpose for compatibility. Overall, it's efficient with minimal waste, though the second sentence could be more directly helpful to an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (interacting with blockchain tokens), lack of annotations, and no output schema, the description is incomplete. It doesn't explain what the return values look like (e.g., JSON structure), error conditions, or how it integrates with sibling tools like 'getAllNetworks' for provider details. For a tool in this context, more behavioral and output guidance is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, meaning all parameters are documented in the input schema. The description adds no parameter-specific information beyond what's in the schema (e.g., it doesn't explain how 'contractAddress' differs from 'tokenAddress' beyond deprecation or clarify 'provider' usage). With high schema coverage, the baseline score of 3 is appropriate, as the description doesn't compensate with additional insights.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get detailed information about an ERC20 token including its name, symbol, decimals, and total supply.' It specifies the verb ('Get') and resource ('ERC20 token') with concrete examples of information returned. However, it doesn't explicitly differentiate from sibling tools like 'getERC20TokenInfo' or 'getERC20Balance', which appear to offer similar functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It mentions 'Alternative naming for compatibility with MCP client tests,' which hints at a technical reason for duplication but doesn't help an agent decide between this tool and 'getERC20TokenInfo' or other token-related tools. No explicit when/when-not instructions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/crazyrabbitLTC/mcp-ethers-server'

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