fetchNftsOwnedByMultichainAddresses
Retrieve NFTs owned by multichain wallet addresses across specified blockchain networks. Configure filters to exclude or include specific NFT types and adjust spam confidence levels for accurate results.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| addresses | Yes | A list of wallet address and network pairs | |
| pageKey | No | The cursor to start the search from. Use this to paginate through the results. | |
| pageSize | No | The number of results to return. Default is 100. Max is 100 | |
| withMetadata | No | Whether to include metadata in the results. |
Input Schema (JSON Schema)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"addresses": {
"description": "A list of wallet address and network pairs",
"items": {
"additionalProperties": false,
"properties": {
"address": {
"description": "The wallet address to query. e.g. \"0x1234567890123456789012345678901234567890\"",
"type": "string"
},
"excludeFilters": {
"default": [
"SPAM",
"AIRDROPS"
],
"description": "The filters to exclude from the results. e.g. [\"SPAM\", \"AIRDROPS\"]",
"items": {
"enum": [
"SPAM",
"AIRDROPS"
],
"type": "string"
},
"type": "array"
},
"includeFilters": {
"default": [],
"description": "The filters to include in the results. e.g. [\"SPAM\", \"AIRDROPS\"]",
"items": {
"enum": [
"SPAM",
"AIRDROPS"
],
"type": "string"
},
"type": "array"
},
"networks": {
"default": [
"eth-mainnet"
],
"description": "The blockchain networks to query. e.g. [\"eth-mainnet\", \"base-mainnet\"]",
"items": {
"type": "string"
},
"type": "array"
},
"spamConfidenceLevel": {
"default": "VERY_HIGH",
"description": "The spam confidence level to query. e.g. \"LOW\" or \"HIGH\"",
"enum": [
"LOW",
"MEDIUM",
"HIGH",
"VERY_HIGH"
],
"type": "string"
}
},
"required": [
"address"
],
"type": "object"
},
"type": "array"
},
"pageKey": {
"description": "The cursor to start the search from. Use this to paginate through the results.",
"type": "string"
},
"pageSize": {
"default": 10,
"description": "The number of results to return. Default is 100. Max is 100",
"type": "number"
},
"withMetadata": {
"default": true,
"description": "Whether to include metadata in the results.",
"type": "boolean"
}
},
"required": [
"addresses"
],
"type": "object"
}
Implementation Reference
- api/alchemyApi.ts:123-136 (handler)Core handler function that executes the NFT fetching logic by calling the Alchemy NFT API client with the provided parameters.async getNftsForAddress(params: NftsByAddressParams) { try { const client = createNftClient(); const response = await client.post('/by-address', { ...params }); return response.data; } catch (error) { console.error('Error fetching NFTs for address:', error); throw error; } },
- types/types.d.ts:51-64 (schema)TypeScript interfaces defining the input schema for the NFT fetching parameters, matching the Zod schema used in registration.export interface NftsByAddressParams { addresses: NftsByAddressPair[]; withMetadata: boolean; pageKey?: string; pageSize: number; } export interface NftsByAddressPair { address: string; networks: string[]; excludeFilters: Array<'SPAM' | 'AIRDROPS'>; includeFilters: Array<'SPAM' | 'AIRDROPS'>; spamConfidenceLevel: 'LOW' | 'MEDIUM' | 'HIGH' | 'VERY_HIGH'; }
- index.ts:253-283 (registration)MCP server tool registration including Zod input schema validation and thin wrapper handler that calls the core alchemyApi.getNftsForAddress function.server.tool('fetchNftsOwnedByMultichainAddresses', { addresses: z.array(z.object({ address: z.string().describe('The wallet address to query. e.g. "0x1234567890123456789012345678901234567890"'), networks: z.array(z.string()).default(['eth-mainnet']).describe('The blockchain networks to query. e.g. ["eth-mainnet", "base-mainnet"]'), excludeFilters: z.array(z.enum(['SPAM', 'AIRDROPS'])).default(["SPAM", "AIRDROPS"]).describe('The filters to exclude from the results. e.g. ["SPAM", "AIRDROPS"]'), includeFilters: z.array(z.enum(['SPAM', 'AIRDROPS'])).default([]).describe('The filters to include in the results. e.g. ["SPAM", "AIRDROPS"]'), spamConfidenceLevel: z.enum(['LOW', 'MEDIUM', 'HIGH', 'VERY_HIGH']).default('VERY_HIGH').describe('The spam confidence level to query. e.g. "LOW" or "HIGH"'), })).describe('A list of wallet address and network pairs'), withMetadata: z.boolean().default(true).describe('Whether to include metadata in the results.'), pageKey: z.string().optional().describe('The cursor to start the search from. Use this to paginate through the results.'), pageSize: z.number().default(10).describe('The number of results to return. Default is 100. Max is 100'), }, async (params) => { try { const result = await alchemyApi.getNftsForAddress(params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }], }; } catch (error) { if (error instanceof Error) { console.error('Error in getNFTsForOwner:', error); return { content: [{ type: "text", text: `Error: ${error.message}` }], isError: true }; } return { content: [{ type: "text", text: 'Unknown error occurred' }], isError: true }; } });
- api/alchemyClients.ts:61-68 (helper)Factory function that creates the Axios HTTP client configured for the Alchemy NFT API endpoint, used by the handler.export const createNftClient = () => axios.create({ baseURL: `https://api.g.alchemy.com/data/v1/${API_KEY}/assets/nfts`, headers: { 'accept': 'application/json', 'content-type': 'application/json', 'x-alchemy-client-breadcrumb': BREADCRUMB_HEADER }, });