Skip to main content
Glama
0xsl1m

cerebrus-pulse-mcp

cerebrus_pulse

Analyze Hyperliquid perpetuals with multi-timeframe technical analysis including RSI, EMAs, Bollinger Bands, VWAP, and cross-timeframe confluence. Provides trend, derivatives data, and market regime.

Instructions

Get multi-timeframe technical analysis for a Hyperliquid perpetual. Supports 6 timeframes: 5m, 15m, 1h, 4h, 1d, 1w (daily/weekly aggregated from 1h). Returns RSI, EMAs (20/50/200), ATR, Bollinger Bands, VWAP, Z-score, trend direction, cross-timeframe confluence with alignment scoring, derivatives data (funding, OI, spread), and market regime. Cost: $0.02 USDC via x402.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
coinYesCoin ticker (e.g., BTC, ETH, SOL). Case-insensitive.
timeframesNoComma-separated timeframes: 5m, 15m, 1h, 4h, 1d, 1w. Default: 1h,4h1h,4h

Implementation Reference

  • Tool 'cerebrus_pulse' is registered as an MCP tool with name, description and inputSchema (requires 'coin', optional 'timeframes').
    Tool(
        name="cerebrus_pulse",
        description=(
            "Get multi-timeframe technical analysis for a Hyperliquid perpetual. "
            "Supports 6 timeframes: 5m, 15m, 1h, 4h, 1d, 1w (daily/weekly aggregated from 1h). "
            "Returns RSI, EMAs (20/50/200), ATR, Bollinger Bands, VWAP, Z-score, "
            "trend direction, cross-timeframe confluence with alignment scoring, "
            "derivatives data (funding, OI, spread), and market regime. Cost: $0.02 USDC via x402."
        ),
        inputSchema={
            "type": "object",
            "properties": {
                "coin": {
                    "type": "string",
                    "description": "Coin ticker (e.g., BTC, ETH, SOL). Case-insensitive.",
                },
                "timeframes": {
                    "type": "string",
                    "description": "Comma-separated timeframes: 5m, 15m, 1h, 4h, 1d, 1w. Default: 1h,4h",
                    "default": "1h,4h",
                },
            },
            "required": ["coin"],
        },
    ),
  • Handler for 'cerebrus_pulse': validates coin via _validate_coin, gets optional timeframes (default '1h,4h'), then calls _api_get('/pulse/{coin}', params={'timeframes': ...}).
    elif name == "cerebrus_pulse":
        coin = _validate_coin(arguments["coin"])
        timeframes = arguments.get("timeframes", "1h,4h")
        result = _api_get(f"/pulse/{coin}", params={"timeframes": timeframes})
  • Helper _validate_coin: validates/normalizes coin ticker (uppercases, checks regex).
    def _validate_coin(coin: str) -> str:
        """Validate and normalize a coin ticker. Raises ValueError on bad input."""
        coin = coin.strip().upper()
        if not _COIN_RE.match(coin):
            raise ValueError(f"Invalid coin ticker: {coin!r}")
        return coin
  • Helper _api_get: makes GET request to cerebro Pulse API, handles 402/429 errors.
    def _api_get(path: str, params: dict | None = None) -> dict[str, Any]:
        """Make a GET request to the Cerebrus Pulse API."""
        with _make_client() as client:
            resp = client.get(path, params=params)
    
            if resp.status_code == 402:
                # Return payment details so the agent/user knows cost
                return {
                    "status": "payment_required",
                    "message": "This endpoint requires x402 USDC payment on Base or Solana.",
                    "url": f"{BASE_URL}{path}",
                    "payment_details": resp.headers.get("X-Payment", "See x402 SDK docs"),
                    "help": "Install the x402 SDK and set CEREBRUS_WALLET_KEY (Base) or CEREBRUS_WALLET_KEY_SOLANA (Solana) to enable auto-payment. See https://cerebruspulse.xyz/guides/x402-payments",
                }
    
            if resp.status_code == 429:
                return {
                    "status": "rate_limited",
                    "message": "Rate limit exceeded. Back off and retry.",
                    "detail": resp.json() if resp.headers.get("content-type", "").startswith("application/json") else resp.text,
                }
    
            resp.raise_for_status()
            return resp.json()
  • CLI mapping for 'pulse' tool (short name) registered in _CLI_TOOLS dict.
    "pulse":         ("/pulse/{coin}",      [("coin", True, str, None),
                                             ("timeframes", False, str, "1h,4h")]),
Behavior4/5

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

No annotations are provided, so the description carries full behavioral burden. It discloses the paid nature ($0.02), the read-only operation (Get), and aggregation details (daily/weekly from 1h). It does not mention rate limits or authentication, but given the read-only, paid nature, the description is fairly transparent. The cost is a key behavioral trait.

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 a single sentence that packs in the tool's purpose, supported timeframes, all returned indicators, data types, and cost. Every part is informative with no redundancy or filler. It is front-loaded with the primary action and resource.

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

Completeness5/5

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

Despite having no output schema, the description enumerates all key return values (RSI, EMAs, ATR, Bollinger Bands, VWAP, Z-score, trend direction, cross-timeframe confluence, derivatives data, market regime) and the cost. This provides a complete picture of what the tool returns, sufficient for an AI agent to decide whether to invoke it.

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

Parameters4/5

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

Schema coverage is 100%, but the description adds value by listing all 6 supported timeframes (5m, 15m, 1h, 4h, 1d, 1w) and noting the default ('1h,4h'). It also clarifies that coin is case-insensitive, reinforcing the schema. This goes beyond the schema's description of timeframes as a comma-separated string.

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 specifies the verb 'Get', the resource 'multi-timeframe technical analysis', and the scope 'for a Hyperliquid perpetual'. It lists supported timeframes and key indicators, and distinguishes from siblings like cerebrus_funding (funding rates) and cerebrus_basis (basis) by focusing on comprehensive technical analysis.

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?

The description explicitly states the cost ($0.02 USDC via x402), which serves as a usage constraint. It implies the tool is for technical analysis of Hyperliquid perpetuals, but does not explicitly mention when not to use it or suggest alternatives among siblings. The list of indicators provides context for when to use it, but lacks exclusion criteria.

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

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/0xsl1m/cerebrus-pulse-mcp'

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