contractCall
Execute smart contract functions on Ethereum networks by specifying contract address, ABI, and method parameters to interact with blockchain applications.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| contractAddress | Yes | The address of the contract to call | |
| abi | Yes | The ABI of the contract function to call, in JSON format | |
| method | Yes | The name of the method to call | |
| args | No | Optional. The arguments to pass to the contract function | |
| provider | No | Optional. 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. | |
| chainId | No | Optional. 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
- src/tools/core.ts:567-624 (registration)Registers the 'contractCall' tool with the MCP server, including schema and handler function.server.tool( "contractCall", { contractAddress: z.string().describe( "The address of the contract to call" ), abi: z.string().describe( "The ABI of the contract function to call, in JSON format" ), method: z.string().describe( "The name of the method to call" ), args: z.array(z.any()).optional().describe( "Optional. The arguments to pass to the contract function" ), provider: z.string().optional().describe(PROVIDER_DESCRIPTION), chainId: z.number().optional().describe( "Optional. The chain ID to use. If provided with a named network and they don't match, the RPC's chain ID will be used." ) }, async ({ contractAddress, abi, method, args = [], provider, chainId }) => { try { const result = await ethersService.contractCallView( contractAddress, abi, method, args, provider, chainId ); // Format the result let formattedResult = ''; if (result === null || result === undefined) { formattedResult = 'null'; } else if (typeof result === 'object') { formattedResult = JSON.stringify(result, null, 2); } else { formattedResult = String(result); } return { content: [{ type: "text", text: formattedResult }] }; } catch (error) { return { isError: true, content: [{ type: "text", text: `Error calling contract function: ${error instanceof Error ? error.message : String(error)}` }] }; } } );
- src/tools/core.ts:587-623 (handler)The handler function that performs the contractCall by invoking ethersService.contractCallView with the input parameters, formats the result, and returns it as MCP content.async ({ contractAddress, abi, method, args = [], provider, chainId }) => { try { const result = await ethersService.contractCallView( contractAddress, abi, method, args, provider, chainId ); // Format the result let formattedResult = ''; if (result === null || result === undefined) { formattedResult = 'null'; } else if (typeof result === 'object') { formattedResult = JSON.stringify(result, null, 2); } else { formattedResult = String(result); } return { content: [{ type: "text", text: formattedResult }] }; } catch (error) { return { isError: true, content: [{ type: "text", text: `Error calling contract function: ${error instanceof Error ? error.message : String(error)}` }] }; } }
- src/tools/core.ts:569-586 (schema)Zod schema defining the input parameters for the contractCall tool: contractAddress, abi, method, optional args, provider, and chainId.{ contractAddress: z.string().describe( "The address of the contract to call" ), abi: z.string().describe( "The ABI of the contract function to call, in JSON format" ), method: z.string().describe( "The name of the method to call" ), args: z.array(z.any()).optional().describe( "Optional. The arguments to pass to the contract function" ), provider: z.string().optional().describe(PROVIDER_DESCRIPTION), chainId: z.number().optional().describe( "Optional. The chain ID to use. If provided with a named network and they don't match, the RPC's chain ID will be used." ) },