Skip to main content
Glama

approveNFT

Authorize third-party access to specific NFTs by defining contract details, token ID, and approved address. Facilitates secure NFT management and transfers on Ethereum networks via MCP Ethers Wallet.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
approvedYes
chainIdNo
contractAddressYes
gasOptionsNo
providerNo
tokenIdYes

Implementation Reference

  • Primary handler and registration for the 'approveNFT' MCP tool. Defines input schema, registers the tool with the server, and provides the execution logic that delegates to the low-level approve helper.
    server.tool( "approveNFT", { contractAddress: contractAddressSchema, tokenId: tokenIdSchema, approved: addressSchema, provider: providerSchema, chainId: chainIdSchema, gasOptions: gasOptionsSchema }, async ({ contractAddress, tokenId, approved, provider, chainId, gasOptions }) => { try { const tx = await approve(ethersService, contractAddress, approved, tokenId.toString(), provider, chainId, gasOptions); return { content: [{ type: "text", text: `Successfully approved ${approved} to transfer NFT #${tokenId} Transaction Hash: ${tx.hash} Waiting for confirmation...` }] }; } catch (error) { return { isError: true, content: [{ type: "text", text: `Error approving NFT transfer: ${error instanceof Error ? error.message : String(error)}` }] }; } }
  • TypeScript type definition for approveNFT parameters (note: tool schema uses zod validation inline, this type is auxiliary).
    type ApproveNFTParams = { contractAddress: string; tokenId: string | number; owner: string; approved: string; provider?: string; chainId?: number; gasOptions?: TokenOperationOptions; };
  • Top-level tool registration function that invokes registerERC721Tools, thereby registering the approveNFT tool.
    export function registerAllTools(server: McpServer, ethersService: any) { // Register tool categories registerCoreTools(server, ethersService); registerERC20Tools(server, ethersService); registerERC721Tools(server, ethersService); registerERC1155Tools(server, ethersService); registerNetworkTools(server); registerPromptTools(server); silentLogger.info("All tools registered successfully"); }
  • Low-level helper function implementing ERC721 approve transaction: checks ownership/approval, creates contract instance with signer, sends approve tx.
    export async function approve( ethersService: EthersService, contractAddress: string, approvedAddress: string, tokenId: string | number, provider?: string, chainId?: number, options: TokenOperationOptions = {} ): Promise<ethers.TransactionResponse> { metrics.incrementCounter('erc721.approve'); return timeAsync('erc721.approve', async () => { try { // Get provider and signer from ethers service const signer = ethersService['getSigner'](provider, chainId); const signerAddress = await signer.getAddress(); // Check ownership const owner = await ownerOf(ethersService, contractAddress, tokenId, provider, chainId); if (owner.toLowerCase() !== signerAddress.toLowerCase()) { // Check if signer is approved for all const isApproved = await isApprovedForAll(ethersService, contractAddress, owner, signerAddress, provider, chainId); if (!isApproved) { throw new UnauthorizedTokenActionError( `Not authorized to approve token #${tokenId}. You are not the owner or approved operator.` ); } } // Create contract instance with signer const contractWithSigner = new ethers.Contract(contractAddress, ERC721_ABI, signer); // Prepare transaction overrides const overrides: ethers.Overrides = {}; if (options.gasLimit) overrides.gasLimit = options.gasLimit; if (options.gasPrice) overrides.gasPrice = options.gasPrice; if (options.maxFeePerGas) overrides.maxFeePerGas = options.maxFeePerGas; if (options.maxPriorityFeePerGas) overrides.maxPriorityFeePerGas = options.maxPriorityFeePerGas; if (options.nonce !== undefined) overrides.nonce = options.nonce; // Send transaction const tx = await contractWithSigner.approve(approvedAddress, tokenId, overrides); return tx; } catch (error) { logger.debug('Error approving address for NFT', { contractAddress, tokenId, approvedAddress, error }); throw handleTokenError(error, 'Failed to approve address for NFT'); } }); }

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