Skip to main content
Glama

get_hip4_outcome

Read-onlyIdempotent

Retrieve a HIP-4 outcome by outcome_id, returning the full aggregate including latest open interest, paired set supply, parity, and currency data.

Instructions

Get a single HIP-4 outcome by outcome_id. Returns the full Hip4OutcomeAggregate including aggregated_oi (latest both-sides OI snapshot, paired set supply, parity, and currency).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
outcome_idYesHIP-4 outcome_id (integer). Each outcome has two sides: '<10*id>' (Yes) and '<10*id+1>' (No).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
dataYesResult data object

Implementation Reference

  • src/index.ts:1609-1618 (registration)
    Registration of the get_hip4_outcome tool via registerTool helper.
    registerTool(
      "get_hip4_outcome",
      "Get a single HIP-4 outcome by outcome_id. Returns the full Hip4OutcomeAggregate including aggregated_oi (latest both-sides OI snapshot, paired set supply, parity, and currency).",
      { outcome_id: Hip4OutcomeIdParam },
      ObjectOutputSchema,
      async (params) => {
        const result = await hip4Request(`/outcomes/${encodeURIComponent(String(params.outcome_id))}`);
        return formatResponse(result.data);
      }
    );
  • Handler function for get_hip4_outcome: calls the HIP-4 REST API endpoint /outcomes/{outcome_id} via hip4Request, then formats the response.
    async (params) => {
      const result = await hip4Request(`/outcomes/${encodeURIComponent(String(params.outcome_id))}`);
      return formatResponse(result.data);
  • Input schema param for outcome_id, accepting number or string.
    const Hip4OutcomeIdParam = z
      .union([z.number(), z.string()])
      .describe("HIP-4 outcome_id (integer). Each outcome has two sides: '<10*id>' (Yes) and '<10*id+1>' (No).");
  • Output schema used by get_hip4_outcome; returns a single data object.
    const ObjectOutputSchema: ZodRawShape = {
      data: z.record(z.unknown()).describe("Result data object"),
    };
  • Helper function hip4Request that makes authenticated GET requests to the HIP-4 REST API (since the SDK does not yet have a hip4 namespace). Used by get_hip4_outcome to call /outcomes/{outcome_id}.
    async function hip4Request(
      path: string,
      query?: Record<string, unknown>
    ): Promise<{ data: unknown; nextCursor?: string }> {
      const url = new URL(`${HIP4_BASE_PATH}${path}`, HIP4_BASE_URL);
      if (query) {
        for (const [k, v] of Object.entries(query)) {
          if (v === undefined || v === null) continue;
          url.searchParams.set(k, String(v));
        }
      }
      const headers: Record<string, string> = {
        "Content-Type": "application/json",
        "User-Agent": "0xarchive-mcp/1.9.0",
      };
      if (apiKey) headers["X-API-Key"] = apiKey;
    
      const controller = new AbortController();
      const timeout = setTimeout(() => controller.abort(), 60000);
      try {
        const response = await fetch(url.toString(), {
          method: "GET",
          headers,
          signal: controller.signal,
        });
        const text = await response.text();
        let body: any;
        try {
          body = text ? JSON.parse(text) : null;
        } catch {
          body = text;
        }
        if (!response.ok) {
          const requestId =
            response.headers.get("x-request-id") || body?.meta?.requestId;
          const message =
            (body && (body.error?.message || body.error || body.message)) ||
            `HTTP ${response.status}`;
          throw new OxArchiveError(message, response.status, requestId ?? undefined);
        }
        if (body && typeof body === "object" && "data" in body) {
          return {
            data: body.data,
            nextCursor: body.meta?.nextCursor,
          };
        }
        return { data: body };
      } finally {
        clearTimeout(timeout);
      }
    }
Behavior4/5

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

Annotations already indicate read-only, idempotent, and non-destructive. Description adds return structure details beyond annotations, but does not disclose potential edge cases or performance traits.

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?

Two sentences, no fluff. Key information is front-loaded: action, resource, return type.

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?

Tool is simple (single parameter, read-only). Output schema exists. Description covers core functionality and return fields adequately for agent invocation.

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 coverage is 100% and describes outcome_id suffix logic. Description merely restates 'by outcome_id' without adding new semantic value beyond schema.

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?

Description clearly states it gets a single HIP-4 outcome by outcome_id and specifies the return fields (full Hip4OutcomeAggregate with aggregated_oi details). Distinguishes from sibling 'get_hip4_outcomes' by focusing on single item retrieval.

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

Usage Guidelines3/5

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

No explicit when-to-use or alternatives provided. While sibling list implies use for single outcome vs list, description does not guide selection or state prerequisites.

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/0xArchiveIO/0xarchive-mcp'

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