Skip to main content
Glama
Beyond-Network-AI

Beyond MCP Server

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
NameRequiredDescriptionDefault
platformYesSocial platform (farcaster, twitter, telegram)
walletAddressYesEthereum wallet address (0x...)

Implementation Reference

  • 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}`);
      }
    }
  • Calls registerContentTools which registers the get-wallet-profile tool among others on the MCP server.
    registerContentTools(server, providerRegistry);
Behavior1/5

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

Tool has no description.

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

Conciseness1/5

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

Tool has no description.

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

Completeness1/5

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

Tool has no description.

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

Parameters1/5

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

Tool has no description.

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

Purpose1/5

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

Tool has no description.

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

Usage Guidelines1/5

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

Tool has no description.

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

Related 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/Beyond-Network-AI/beyond-mcp-server'

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