Skip to main content
Glama
piquesignal

Pique Signal

Official

get_signals

Read-onlyIdempotent

Retrieve scored Solana token alerts with on-chain safety data, market cap, liquidity, holder metrics, and signal strength. Filter by minimum score and recency.

Instructions

Fetch recent trading signals from Pique Signal. Returns scored Solana token alerts with on-chain safety data, market cap, liquidity, holder metrics, and signal strength.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMax signals to return (default 10)
min_scoreNoOnly return signals with score >= this value
since_minutesNoLook back N minutes (default 60)

Implementation Reference

  • The async handler function for the 'get_signals' tool. It calls api.getRecentAlerts with limit/since_minutes, optionally filters by min_score, and returns the results as JSON.
    async ({ limit, min_score, since_minutes }) => {
      try {
        const signals = await api.getRecentAlerts({
          limit: limit ?? 10,
          since_minutes: since_minutes ?? 60,
        });
        let filtered = signals;
        if (min_score !== undefined) {
          filtered = signals.filter(s => (s.score || 0) >= min_score);
        }
        if (filtered.length === 0) {
          return text('No signals found in the last ' + (since_minutes ?? 60) + ' minutes' +
            (min_score ? ` with score >= ${min_score}` : ''));
        }
        return text(JSON.stringify(filtered, null, 2));
      } catch (err) {
        return error(err.message);
      }
    }
  • Zod input schema for 'get_signals' tool defining optional parameters: limit (1-50), min_score (0-100), since_minutes (1-1440).
    {
      limit: z.number().int().min(1).max(50).optional()
        .describe('Max signals to return (default 10)'),
      min_score: z.number().int().min(0).max(100).optional()
        .describe('Only return signals with score >= this value'),
      since_minutes: z.number().int().min(1).max(1440).optional()
        .describe('Look back N minutes (default 60)'),
    },
  • src/tools.js:79-116 (registration)
    Registration of the 'get_signals' tool via server.tool() with description, schema, metadata hints, and the handler function.
    server.tool(
      'get_signals',
      'Fetch recent trading signals from Pique Signal. Returns scored Solana token alerts with on-chain safety data, market cap, liquidity, holder metrics, and signal strength.',
      {
        limit: z.number().int().min(1).max(50).optional()
          .describe('Max signals to return (default 10)'),
        min_score: z.number().int().min(0).max(100).optional()
          .describe('Only return signals with score >= this value'),
        since_minutes: z.number().int().min(1).max(1440).optional()
          .describe('Look back N minutes (default 60)'),
      },
      {
        title: 'Get Signals',
        readOnlyHint: true,
        destructiveHint: false,
        idempotentHint: true,
        openWorldHint: false,
      },
      async ({ limit, min_score, since_minutes }) => {
        try {
          const signals = await api.getRecentAlerts({
            limit: limit ?? 10,
            since_minutes: since_minutes ?? 60,
          });
          let filtered = signals;
          if (min_score !== undefined) {
            filtered = signals.filter(s => (s.score || 0) >= min_score);
          }
          if (filtered.length === 0) {
            return text('No signals found in the last ' + (since_minutes ?? 60) + ' minutes' +
              (min_score ? ` with score >= ${min_score}` : ''));
          }
          return text(JSON.stringify(filtered, null, 2));
        } catch (err) {
          return error(err.message);
        }
      }
    );
  • The getRecentAlerts method on PiqueSignalAPI class that fetches recent signals from the /api/alerts/recent endpoint, with rate limiting, authentication, and response sanitization.
    async getRecentAlerts({ limit = 10, since_minutes = 60 } = {}) {
      this.#enforceRateLimit();
    
      const since = new Date(Date.now() - since_minutes * 60_000).toISOString();
      const url = new URL('/api/alerts/recent', this.#baseUrl);
      url.searchParams.set('since', since);
      url.searchParams.set('limit', String(Math.min(Math.max(1, limit), 50)));
    
      const res = await fetch(url.toString(), {
        headers: {
          'Accept': 'application/json',
          'Authorization': `Bearer ${this.#apiKey}`,
        },
        signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
      });
    
      if (!res.ok) {
        const status = res.status;
        if (status === 401 || status === 403) throw new Error('Authentication failed');
        if (status === 429) throw new Error('Rate limited by API');
        throw new Error(`API error (${status})`);
      }
    
      const data = await res.json();
      const alerts = data.alerts || [];
      return alerts.map(a => this.#sanitize(a));
    }
Behavior4/5

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

Annotations already indicate read-only and idempotent. Description adds specific return data (safety, market cap, etc.), providing behavioral context beyond annotations. No contradictions.

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?

Single sentence, front-loaded with verb and resource, no wasted words.

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?

No output schema, but description covers return type comprehensively. Purpose, data, and parameters are sufficiently explained for a read-only data fetch tool.

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 has 100% coverage with detailed descriptions for all 3 parameters. Description does not add further parameter detail; baseline 3 is appropriate.

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?

Clearly specifies verb 'fetch', resource 'trading signals' from 'Pique Signal', and lists return types (scored Solana token alerts with on-chain safety data, etc.). Differentiates from siblings like get_positions, get_price which are separate concerns.

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?

States purpose and return value, context is clear given sibling tools are unrelated. However, lacks explicit when-not-to-use or alternative suggestions.

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/piquesignal/piquesignal-mcp'

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