Skip to main content
Glama

elfatwitterintelligenceagent_get_trending_tokens

Analyze Twitter in real-time to identify trending cryptocurrencies and tokens, their popularity, and sentiment indicators. Use this tool to discover actively discussed digital assets on social media.

Instructions

Get current trending tokens on Twitter. This tool identifies which cryptocurrencies and tokens are generating the most buzz on Twitter right now. The results include token names, their relative popularity, and sentiment indicators. Use this when you want to discover which cryptocurrencies are currently being discussed most actively on social media. Data comes from ELFA API and represents real-time trends.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
time_windowNoTime window to analyze24h

Implementation Reference

  • MCP call_tool handler that executes the tool by proxying to the Mesh API after parsing the prefixed tool name to extract agent ID and original tool name.
    async def call_tool(name: str, arguments: dict) -> List[types.TextContent]:
        """Call the specified tool with the given arguments."""
        try:
            if name not in self.tool_registry:
                raise ValueError(f"Unknown tool: {name}")
    
            tool_info = self.tool_registry[name]
            result = await self.execute_tool(
                agent_id=tool_info["agent_id"],
                tool_name=tool_info["tool_name"],
                tool_arguments=arguments,
            )
    
            # Convert result to TextContent
            return [types.TextContent(type="text", text=str(result))]
        except Exception as e:
            logger.error(f"Error calling tool {name}: {e}")
            raise ValueError(f"Failed to call tool {name}: {str(e)}") from e
  • Dynamically registers tools from agent metadata, constructing tool names as '{agent_id.lower()}_{tool_name}', e.g., 'elfatwitterintelligenceagent_get_trending_tokens' for agent 'ElfaTwitterIntelligenceAgent'.
    async def process_tool_metadata(self) -> Dict[str, Dict[str, Any]]:
        """Process agent metadata and extract tool information.
    
        Returns:
            Dictionary mapping tool IDs to tool information
        """
        agents_metadata = await self.fetch_agent_metadata()
        tool_registry = {}
    
        # Log filtering status
        if self.supported_agents is not None:
            logger.info(
                f"Filtering tools using supported agent list ({len(self.supported_agents)} agents specified)"
            )
        else:
            logger.info("Loading tools from all available agents (no filter applied)")
    
        for agent_id, agent_data in agents_metadata.items():
            # Skip agents not in our supported list (if a list is specified)
            if (
                self.supported_agents is not None
                and agent_id not in self.supported_agents
            ):
                continue
    
            # Process tools for this agent
            for tool in agent_data.get("tools", []):
                if tool.get("type") == "function":
                    function_data = tool.get("function", {})
                    tool_name = function_data.get("name")
    
                    if not tool_name:
                        continue
    
                    # Create a unique tool ID
                    tool_id = f"{agent_id.lower()}_{tool_name}"
    
                    # Get parameters or create default schema
                    parameters = function_data.get("parameters", {})
                    if not parameters:
                        parameters = {
                            "type": "object",
                            "properties": {},
                            "required": [],
                        }
    
                    # Store tool info
                    tool_registry[tool_id] = {
                        "agent_id": agent_id,
                        "tool_name": tool_name,
                        "description": function_data.get("description", ""),
                        "parameters": parameters,
                    }
    
        # Log which agents contributed tools
        agents_with_tools = set(info["agent_id"] for info in tool_registry.values())
        logger.info(f"Loaded tools from agents: {', '.join(sorted(agents_with_tools))}")
        logger.info(f"Successfully loaded {len(tool_registry)} tools")
    
        return tool_registry
  • Configuration listing supported agents, including 'ElfaTwitterIntelligenceAgent' whose tools are registered with the 'elfatwitterintelligenceagent_' prefix.
    DEFAULT_AGENTS = [
        "CoinGeckoTokenInfoAgent",
        "DexScreenerTokenInfoAgent",
        "ElfaTwitterIntelligenceAgent",
        "ExaSearchAgent",
        "TwitterInfoAgent",
        "AIXBTProjectInfoAgent",
        "EtherscanAgent",
        "EvmTokenInfoAgent",
        "FundingRateAgent",
        "UnifaiTokenAnalysisAgent",
        "YahooFinanceAgent",
        "ZerionWalletAnalysisAgent"
    ]
  • MCP list_tools decorator that exposes all registered tools, including the target tool with its schema from metadata.
    @app.list_tools()
    async def list_tools() -> List[types.Tool]:
        """List all available tools."""
        return [
            types.Tool(
                name=tool_id,
                description=tool_info["description"],
                inputSchema=tool_info["parameters"],
            )
            for tool_id, tool_info in self.tool_registry.items()
        ]
  • Helper that sends the tool execution request to the Mesh API endpoint.
    async def execute_tool(
        self, agent_id: str, tool_name: str, tool_arguments: Dict[str, Any]
    ) -> Dict[str, Any]:
        """Execute a tool on a mesh agent.
    
        Args:
            agent_id: ID of the agent to execute the tool on
            tool_name: Name of the tool to execute
            tool_arguments: Arguments to pass to the tool
    
        Returns:
            Tool execution result
    
        Raises:
            ToolExecutionError: If there's an error executing the tool
        """
        request_data = {
            "agent_id": agent_id,
            "input": {"tool": tool_name, "tool_arguments": tool_arguments},
        }
    
        # Add API key if available
        if Config.HEURIST_API_KEY:
            request_data["api_key"] = Config.HEURIST_API_KEY
    
        try:
            result = await call_mesh_api(
                "mesh_request", method="POST", json=request_data
            )
            return result.get("data", result)  # Prefer the 'data' field if it exists
        except MeshApiError as e:
            # Re-raise API errors with clearer context
            raise ToolExecutionError(str(e)) from e
        except Exception as e:
            logger.error(f"Error calling {agent_id} tool {tool_name}: {e}")
            raise ToolExecutionError(
                f"Failed to call {agent_id} tool {tool_name}: {str(e)}"
            ) from e
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that the tool is a read operation (implied by 'get'), uses real-time data from ELFA API, and returns popularity and sentiment indicators, but lacks details on rate limits, authentication needs, or error handling, leaving behavioral gaps.

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

Conciseness5/5

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

The description is appropriately sized and front-loaded, starting with the core purpose and followed by usage context and data source. Each sentence adds value without redundancy, making it efficient and well-structured.

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

Completeness4/5

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

Given the tool's low complexity (1 parameter, no output schema, no annotations), the description is mostly complete, covering purpose, usage, and data source. However, it could improve by mentioning output structure (e.g., list format) or limitations, slightly reducing completeness.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents the single parameter 'time_window'. The description does not add any parameter-specific details beyond what the schema provides, such as format examples or constraints, meeting the baseline for high coverage.

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

Purpose5/5

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

The description clearly states the tool's purpose with specific verbs ('get', 'identifies') and resources ('trending tokens on Twitter', 'cryptocurrencies and tokens'), distinguishing it from siblings like search_account or search_mentions by focusing on trending analysis rather than account or mention searches.

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

Usage Guidelines4/5

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

It provides clear context for when to use the tool ('when you want to discover which cryptocurrencies are currently being discussed most actively on social media'), but does not explicitly state when not to use it or name specific alternatives among siblings, such as coingeckotokeninfoagent_get_trending_coins for non-Twitter trends.

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/heurist-network/heurist-mesh-mcp-server'

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