get-wallet-profile
Fetch social platform profiles linked to an Ethereum wallet address. Specify the platform (e.g., Farcaster, Twitter, Telegram) and wallet to retrieve associated profile data for analysis or integration.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Social platform (farcaster, twitter, telegram) | |
| walletAddress | Yes | Ethereum wallet address (0x...) |
Implementation Reference
- src/mcp/tools/contentTools.ts:230-265 (handler)MCP tool handler for 'get-wallet-profile'. Validates input with Zod schema (platform, walletAddress), retrieves platform provider, calls provider.getUserProfileByWalletAddress(), formats result with formatUserProfile(), returns formatted text content or error.server.tool( "get-wallet-profile", { platform: z.string().describe("Social platform (farcaster, twitter, telegram)"), walletAddress: z.string().describe("Ethereum wallet address (0x...)") }, async ({ platform, walletAddress }) => { try { const provider = providerRegistry.getProviderForPlatform(platform); if (!provider) { return { content: [{ type: "text", text: `Provider for platform '${platform}' not found or not enabled` }], isError: true }; } const profile = await provider.getUserProfileByWalletAddress(walletAddress); return { content: [{ type: "text", text: formatUserProfile(profile) }] }; } catch (error) { return { content: [{ type: "text", text: `Error fetching ${platform} profile for wallet '${walletAddress}': ${error instanceof Error ? error.message : String(error)}` }], isError: true }; } } );
- Zod input schema for get-wallet-profile tool: platform (string), walletAddress (string).{ platform: z.string().describe("Social platform (farcaster, twitter, telegram)"), walletAddress: z.string().describe("Ethereum wallet address (0x...)") },
- Helper function to format UserProfile object into readable text string, including wallet info, metadata.function formatUserProfile(profile: any): string { const metadata = profile.metadata || {}; const verifiedEthAddresses = metadata.verifiedEthAddresses || []; const verifiedSolAddresses = metadata.verifiedSolAddresses || []; let walletInfo = ''; if (verifiedEthAddresses.length > 0 || verifiedSolAddresses.length > 0) { walletInfo = '\nWallet Information:'; if (verifiedEthAddresses.length > 0) { walletInfo += `\n- Verified ETH Addresses: ${verifiedEthAddresses.join(', ')}`; } if (verifiedSolAddresses.length > 0) { walletInfo += `\n- Verified SOL Addresses: ${verifiedSolAddresses.join(', ')}`; } if (metadata.primaryEthAddress) { walletInfo += `\n- Primary ETH Address: ${metadata.primaryEthAddress}`; } if (metadata.primarySolAddress) { walletInfo += `\n- Primary SOL Address: ${metadata.primarySolAddress}`; } } let additionalInfo = ''; if (metadata.custodyAddress) { additionalInfo += `\n- Custody Address: ${metadata.custodyAddress}`; } if (metadata.recoveryAddress) { additionalInfo += `\n- Recovery Address: ${metadata.recoveryAddress}`; } if (metadata.hasEmail) { additionalInfo += '\n- Has Email: Yes'; } if (metadata.activeStatus) { additionalInfo += `\n- Active Status: ${metadata.activeStatus}`; } if (metadata.powerBadge) { additionalInfo += `\n- Power Badge: ${metadata.powerBadge}`; } return ` User Profile: @${profile.username} (${profile.displayName}) Platform: ${profile.platform} Bio: ${profile.bio || 'No bio available'} Followers: ${profile.followerCount || 0} Following: ${profile.followingCount || 0} Verified: ${profile.verified ? 'Yes' : 'No'} User ID: ${profile.id}${walletInfo}${additionalInfo} `; }
- Farcaster provider implementation of getUserProfileByWalletAddress using Neynar SDK's fetchBulkUsersByEthOrSolAddress to fetch user by wallet address and map to UserProfile.async getUserProfileByWalletAddress(walletAddress: string): Promise<UserProfile> { if (!this.client) { console.error('Neynar client not initialized'); throw new Error('Neynar client not initialized'); } try { console.log(`Fetching user profile for wallet address: ${walletAddress}`); // Use the correct endpoint to fetch users by ETH address const response = await this.client.fetchBulkUsersByEthOrSolAddress({ addresses: [walletAddress] }); // The response contains a map of address to array of users const users = response[walletAddress.toLowerCase()]; if (!users || users.length === 0) { console.log(`No user found for wallet address: ${walletAddress}`); throw new Error(`User with wallet address ${walletAddress} not found`); } // Get the most complete profile (one with username and display name) const user = users.find((u: { username: string }) => u.username && !u.username.startsWith('!')) || users[0]; return { id: user.fid.toString(), displayName: user.display_name || '', username: user.username || '', bio: user.profile?.bio?.text || '', profileImageUrl: user.pfp_url || '', followerCount: user.follower_count || 0, followingCount: user.following_count || 0, platform: this.platform, metadata: { verifications: user.verifications || [], verifiedEthAddresses: user.verified_addresses?.eth_addresses || [], verifiedSolAddresses: user.verified_addresses?.sol_addresses || [] } }; } catch (error) { console.error('Error fetching Farcaster user profile by wallet:', error); throw new Error(`Failed to fetch profile for wallet address ${walletAddress}`); } }
- src/mcp/server.ts:26-26 (registration)Calls registerContentTools which registers the get-wallet-profile tool among others on the MCP server.registerContentTools(server, providerRegistry);