Skip to main content
Glama

list_user_queries

Retrieve queries created by a specific user handle from Dune Analytics to review their contributions and analyze query history.

Instructions

List queries by user handle.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
handleNo
limitNo

Implementation Reference

  • The MCP tool handler for 'list_user_queries', decorated with @mcp.tool(). Resolves user handle to ID, fetches query list from DuneService, handles errors, and returns formatted string summary.
    def list_user_queries(handle: Optional[str] = None, limit: int = 10) -> str:
        """
        List queries by user handle.
        """
        target_handle = handle or config.DUNE_USER_HANDLE
        
        if not target_handle:
            return (
                "Error: No user handle provided. "
                "Please provide a 'handle' argument or set DUNE_USER_HANDLE in your .env file."
            )
    
        user_id = dune_service.get_user_id_by_handle(target_handle)
        
        # Check for sentinel -1 (Blocked)
        if user_id == -1:
            return "Error: Public search is currently blocked by Dune's security. Please use 'search_spellbook' or 'get_query_details' instead."
            
        if not user_id:
            return f"Error: Could not find user with handle '{target_handle}'."
            
        results = dune_service.list_user_queries(user_id, limit)
        
        # Handle WAF/Error in results
        if isinstance(results, dict) and "error" in results:
            return f"Error: {results['error']}"
    
        if not results:
            return f"No queries found for user '{target_handle}'."
    
        summary = []
        for q in results:
            summary.append(f"ID: {q.get('id')} | Name: {q.get('name')} | Owner: {q.get('owner')}")
        
        return "\n".join(summary)
  • Helper method in DuneService/DuneClient class that performs the GraphQL query to Dune API to retrieve the list of queries for a given user ID, processes the response, and returns formatted results.
    def list_user_queries(self, user_id: int, limit: int = 10) -> Any: # Changed return hint
        """
        List queries for a given user ID using Dune's GraphQL endpoint.
        """
        if user_id == -1: # WAF Block sentinel
             return {"error": "User lookup failed due to Cloudflare block. Cannot list queries."}
    
        url = "https://core-api.dune.com/public/graphql" # Redundant, but good for clarity.
        
        payload = {
            "operationName": "ListUserQueries",
            "variables": {"userId": user_id, "limit": limit},
            "query": """
                query ListUserQueries($userId: Int!, $limit: Int!) {
                    queries(
                        filters: { userId: { equals: $userId } }
                        pagination: { first: $limit }
                    ) {
                        edges {
                            node {
                                id
                                name
                                description
                                user {
                                    name
                                    handle
                                }
                            }
                        }
                    }
                }
            """
        }
    
        response_data = self._get_graphql_response(payload)
        
        if response_data and "error" in response_data and response_data["error"] == "WAF_BLOCK":
             return {"error": "Public search is currently blocked by Dune's security."}
    
        if response_data:
            edges = response_data.get("data", {}).get("queries", {}).get("edges", [])
            
            results = []
            for edge in edges:
                node = edge.get("node", {})
                if not node:
                    continue
                    
                results.append({
                    "id": node.get("id"),
                    "name": node.get("name"),
                    "owner": node.get("user", {}).get("handle", "unknown"),
                    "description": node.get("description", "")
                })
            return results
        return []

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/nice-bills/dune-mcp'

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