Skip to main content
Glama

get_domain_details

Fetch detailed information for an ENS domain, including its address, to resolve and analyze domain activity.

Instructions

Fetch detailed information for an ENS domain, including its address.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
domainYes

Implementation Reference

  • main.py:162-227 (handler)
    Handler function decorated with @mcp.tool(), which registers the tool and infers input schema from type annotations (domain: str). Executes the core logic to fetch and format ENS domain details using the query_ens_domain helper.
    @mcp.tool()
    async def get_domain_details(domain: str) -> str:
        """Fetch detailed information for an ENS domain, including its address."""
        domain_data = await query_ens_domain(domain)
        if not domain_data:
            return f"No data found for ENS domain: {domain}"
        
        # Get address
        address = (domain_data["resolvedAddress"]["id"] if domain_data["resolvedAddress"]
                   else domain_data["resolver"]["addr"]["id"] if domain_data["resolver"] and domain_data["resolver"]["addr"]
                   else "None")
        
        # Format dates
        expiry = (datetime.datetime.fromtimestamp(int(domain_data["expiryDate"]))
                  .strftime("%Y-%m-%d %H:%M:%S") if domain_data["expiryDate"]
                  else "None")
        created = (datetime.datetime.fromtimestamp(int(domain_data["createdAt"]))
                   .strftime("%Y-%m-%d %H:%M:%S") if domain_data["createdAt"]
                   else "None")
        
        # Registration details
        registration_info = (
            f"Registration Date: {datetime.datetime.fromtimestamp(int(domain_data['registration']['registrationDate'])).strftime('%Y-%m-%d %H:%M:%S')}\n"
            f"Registration Expiry: {datetime.datetime.fromtimestamp(int(domain_data['registration']['expiryDate'])).strftime('%Y-%m-%d %H:%M:%S')}\n"
            f"Registration Cost: {domain_data['registration']['cost'] or 'Unknown'} Wei\n"
            f"Registrant: {domain_data['registration']['registrant']['id']}"
            if domain_data["registration"]
            else "No Registration"
        )
        
        # Wrapped domain details
        wrapped_info = (
            f"Wrapped Name: {domain_data['wrappedDomain']['name']}\n"
            f"Wrapped Owner: {domain_data['wrappedDomain']['owner']['id']}\n"
            f"Wrapped Expiry: {datetime.datetime.fromtimestamp(int(domain_data['wrappedDomain']['expiryDate'])).strftime('%Y-%m-%d %H:%M:%S')}\n"
            f"Fuses: {domain_data['wrappedDomain']['fuses']}"
            if domain_data["wrappedDomain"]
            else "Not Wrapped"
        )
        
        # Resolver details
        resolver_info = (
            f"Resolver Address: {domain_data['resolver']['address']}\n"
            f"Content Hash: {domain_data['resolver']['contentHash'] or 'None'}\n"
            f"Text Records: {', '.join(domain_data['resolver']['texts']) if domain_data['resolver']['texts'] else 'None'}"
            if domain_data["resolver"]
            else "No Resolver"
        )
        
        return (
            f"ENS Domain: {domain_data['name']}\n"
            f"Address: {address}\n"
            f"Label Name: {domain_data['labelName'] or 'None'}\n"
            f"Label Hash: {domain_data['labelhash'] or 'None'}\n"
            f"Subdomain Count: {domain_data['subdomainCount']}\n"
            f"Owner: {domain_data['owner']['id']}\n"
            f"Registrant: {domain_data['registrant']['id'] if domain_data['registrant'] else 'None'}\n"
            f"Wrapped Owner: {domain_data['wrappedOwner']['id'] if domain_data['wrappedOwner'] else 'None'}\n"
            f"Expiry Date: {expiry}\n"
            f"TTL: {domain_data['ttl'] or 'None'} seconds\n"
            f"Is Migrated: {domain_data['isMigrated']}\n"
            f"Created At: {created}\n"
            f"Registration: {registration_info}\n"
            f"Wrapped Domain: {wrapped_info}\n"
            f"Resolver: {resolver_info}"
        )
  • main.py:27-82 (helper)
    Supporting helper utility that queries the ENS subgraph via GraphQL for detailed domain data, which is then processed by the get_domain_details handler.
    async def query_ens_domain(name: str) -> Optional[Dict[str, Any]]:
        """Query the ENS Subgraph for domain details."""
        query = gql("""
            query GetDomain($name: String!) {
              domains(where: { name: $name }) {
                id
                name
                labelName
                labelhash
                subdomainCount
                resolvedAddress {
                  id
                }
                resolver {
                  address
                  addr {
                    id
                  }
                  contentHash
                  texts
                }
                ttl
                isMigrated
                createdAt
                owner {
                  id
                }
                registrant {
                  id
                }
                wrappedOwner {
                  id
                }
                expiryDate
                registration {
                  registrationDate
                  expiryDate
                  cost
                  registrant {
                    id
                  }
                  labelName
                }
                wrappedDomain {
                  expiryDate
                  fuses
                  owner {
                    id
                  }
                  name
                }
              }
            }
        """)
        result = await graphql_client.execute_async(query, variable_values={"name": name})
        return result["domains"][0] if result["domains"] else None

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/kukapay/ens-mcp'

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