Skip to main content
Glama
tradallo

tradallo-reputation

Official

search_records

Search verified trading records by filters like Sharpe ratio, max drawdown, trade count, venue, and principal type to find strategies matching specific risk and return criteria.

Instructions

Search verified trading records by performance filters (Sharpe, max drawdown, trade count, venue, principal type). Returns a list of summary records sorted by the chosen metric. Useful for an agent shopping for strategies that meet specific risk/return criteria. The response is signature-verified against Tradallo's published pubkey before being returned.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
min_sharpeNoMinimum annualized Sharpe ratio.
min_tradesNoMinimum trade count.
max_drawdownNoMaximum drawdown as a fraction (e.g. 0.25 for 25%).
venueNoRestrict to a specific venue (e.g. 'hyperliquid', 'dydx').
principal_typeNo
sort_byNoField to sort results by (descending). Default: net_pnl.
limitNoMax results (default 25, max 100).

Implementation Reference

  • The 'search_records' tool handler — extracts query params from the incoming arguments (principal_type, min_sharpe, min_trades, max_drawdown, venue, sort_by, limit), builds a URLSearchParams string, calls GET /api/v1/search on the TradalloClient, and returns the signed+verified response as JSON.
    case "search_records": {
      const params = new URLSearchParams();
      const a = (args ?? {}) as Record<string, unknown>;
      if (typeof a.principal_type === "string") params.set("principal_type", a.principal_type);
      if (typeof a.min_sharpe === "number") params.set("min_sharpe", String(a.min_sharpe));
      if (typeof a.min_trades === "number") params.set("min_trades", String(a.min_trades));
      if (typeof a.max_drawdown === "number") params.set("max_drawdown", String(a.max_drawdown));
      if (typeof a.venue === "string") params.set("venue", a.venue);
      if (typeof a.sort_by === "string") params.set("sort_by", a.sort_by);
      if (typeof a.limit === "number") params.set("limit", String(a.limit));
      const path = `/api/v1/search${params.toString() ? `?${params.toString()}` : ""}`;
      const data = await client.getSigned<unknown>(path);
      return jsonResult(data);
    }
  • Tool registration with inputSchema for 'search_records': defines properties min_sharpe, min_trades, max_drawdown, venue, principal_type, sort_by, limit. sort_by defaults to 'net_pnl', limit defaults to 25, max is 100.
    {
      name: "search_records",
      description:
        "Discover verified trading records by performance filters. Returns a list of summary records sorted by the chosen metric. Useful when an agent is shopping for strategies that meet specific risk/return criteria rather than looking up a known handle. Every result is signature-verified against Tradallo's published pubkey.\n\nExample:\n  - search_records({ min_sharpe: 1.5, min_trades: 100, max_drawdown: 0.15, sort_by: \"sharpe\", limit: 10 })",
      inputSchema: {
        type: "object",
        properties: {
          min_sharpe: { type: "number", minimum: 0, description: "Minimum annualized Sharpe ratio." },
          min_trades: { type: "integer", minimum: 0, description: "Minimum trade count." },
          max_drawdown: { type: "number", minimum: 0, maximum: 1, description: "Maximum drawdown as a fraction (e.g. 0.25 for 25%)." },
          venue: { type: "string", description: "Restrict to a specific venue (e.g. 'hyperliquid', 'dydx')." },
          principal_type: { type: "string", enum: ["human", "agent"] },
          sort_by: {
            type: "string",
            enum: ["sharpe", "net_pnl", "trade_count", "win_rate"],
            default: "net_pnl",
            description: "Field to sort results by (descending). Default: net_pnl.",
          },
          limit: { type: "integer", minimum: 1, maximum: 100, default: 25, description: "Max results (1-100)." },
        },
      },
      annotations: READ_ONLY_ANNOTATIONS,
    },
  • src/index.ts:104-126 (registration)
    The 'search_records' tool is registered in the ListToolsRequestSchema handler as one of five named tools, with description, inputSchema, and readOnly annotations.
    {
      name: "search_records",
      description:
        "Discover verified trading records by performance filters. Returns a list of summary records sorted by the chosen metric. Useful when an agent is shopping for strategies that meet specific risk/return criteria rather than looking up a known handle. Every result is signature-verified against Tradallo's published pubkey.\n\nExample:\n  - search_records({ min_sharpe: 1.5, min_trades: 100, max_drawdown: 0.15, sort_by: \"sharpe\", limit: 10 })",
      inputSchema: {
        type: "object",
        properties: {
          min_sharpe: { type: "number", minimum: 0, description: "Minimum annualized Sharpe ratio." },
          min_trades: { type: "integer", minimum: 0, description: "Minimum trade count." },
          max_drawdown: { type: "number", minimum: 0, maximum: 1, description: "Maximum drawdown as a fraction (e.g. 0.25 for 25%)." },
          venue: { type: "string", description: "Restrict to a specific venue (e.g. 'hyperliquid', 'dydx')." },
          principal_type: { type: "string", enum: ["human", "agent"] },
          sort_by: {
            type: "string",
            enum: ["sharpe", "net_pnl", "trade_count", "win_rate"],
            default: "net_pnl",
            description: "Field to sort results by (descending). Default: net_pnl.",
          },
          limit: { type: "integer", minimum: 1, maximum: 100, default: 25, description: "Max results (1-100)." },
        },
      },
      annotations: READ_ONLY_ANNOTATIONS,
    },
  • TradalloClient.getSigned<T>() — the helper that performs the actual HTTP GET request for the search_records handler. It fetches from the API, then verifies the ed25519 signature on the envelope before returning the inner data payload.
    async getSigned<T>(path: string): Promise<T> {
      const res = await fetch(`${this.baseUrl}${path}`, {
        headers: { ...this.headers, accept: "application/json" },
      });
      if (res.status === 404) {
        throw new Error(`not_found: ${path}`);
      }
      if (!res.ok) {
        throw new Error(`request failed: ${res.status} ${res.statusText} (${path})`);
      }
      const envelope = (await res.json()) as SignedEnvelope<T>;
      await this.verifyEnvelope(envelope);
      return envelope.data;
    }
Behavior4/5

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

With no annotations, the description carries full burden. It discloses that results are signature-verified, which is a notable behavioral trait. It does not mention authentication, rate limits, or read-only nature, but for a search tool the description is fairly transparent.

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 two sentences with no wasted words. It front-loads the main action and parameters, then adds usage context and verification detail efficiently.

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

Completeness3/5

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

Given no output schema, the description could have detailed the return fields. 'List of summary records' is vague. However, parameter coverage and sibling context make it adequate but not complete.

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 high (86%), so the baseline is 3. The description summarizes the filter parameters but adds no new meaning beyond what the schema provides.

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 searches verified trading records with performance filters and returns sorted summary records. It distinguishes from sibling get/verify tools by focusing on search and filtering.

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 says it is useful when shopping for strategies meeting risk/return criteria, providing clear usage context. It does not mention when not to use it or compare to siblings.

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/tradallo/reputation'

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