Skip to main content
Glama

read.pool.info

Read-onlyIdempotent

Retrieve detailed lending pool information including APY history. Analyze rate trends and compare pools using pool address.

Instructions

Get detailed info for a single lending pool including APY history over time. Useful for analyzing rate trends and comparing pools. Use read.pool.list to discover pool addresses.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pool_addressYesPool address
daysNoNumber of days of APY history
chain_idNoChain ID: 8453 (Base), 130 (Unichain), or 10 (Optimism)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
poolYes
apy_historyYes

Implementation Reference

  • Tool handler for 'read.pool.info' – fetches pool details and APY history. Takes chain_id, pool_address, and days parameters. Calls api.getPools() to find pool metadata and api.getPoolApyHistory() for APY trend data, returns combined result with error handling.
    server.registerTool(
      "read.pool.info",
      {
        annotations: {
          title: "Get Pool Info",
          readOnlyHint: true,
          destructiveHint: false,
          idempotentHint: true,
          openWorldHint: true,
        },
        description:
          "Get detailed info for a single lending pool including APY history over time. Useful for analyzing rate trends and comparing pools. Use read.pool.list to discover pool addresses.",
        inputSchema: {
          pool_address: z.string().describe("Pool address"),
          days: z.number().default(14).describe("Number of days of APY history"),
          chain_id: z.number().default(8453).describe(CHAIN_ID_DESCRIPTION),
        },
        outputSchema: PoolDetailOutput,
      },
      async ({ pool_address, days, chain_id }) => {
        try {
          const [allPools, apy_history] = await Promise.all([
            api.getPools(chain_id),
            api.getPoolApyHistory(chain_id, pool_address, days),
          ]);
          const poolList = Array.isArray(allPools)
            ? allPools
            : ((allPools as Record<string, unknown>).data as unknown[]);
          const pool = Array.isArray(poolList)
            ? (poolList as Record<string, unknown>[]).find(
                (p) =>
                  ((p.address ?? p.pool_address) as string)?.toLowerCase() ===
                  pool_address.toLowerCase(),
              )
            : null;
          if (!pool) {
            return {
              content: [
                {
                  type: "text" as const,
                  text: `Error: Pool ${pool_address} not found on chain ${chain_id}.`,
                },
              ],
              isError: true,
            };
          }
          const detail = { pool, apy_history };
          return {
            content: [{ type: "text" as const, text: JSON.stringify(detail, null, 2) }],
            structuredContent: detail,
          };
        } catch (err) {
          return {
            content: [
              {
                type: "text" as const,
                text: `Error: ${err instanceof Error ? err.message : String(err)}`,
              },
            ],
            isError: true,
          };
        }
      },
    );
  • Output schema (PoolDetailOutput) for the read.pool.info tool – defines response shape with pool metadata and APY history array.
    export const PoolDetailOutput = z.object({
      pool: z.record(z.unknown()),
      apy_history: z.array(z.record(z.unknown())),
    });
  • Registration call in the main index – registerPoolTools is invoked with the server and api instances, which registers both read.pool.list and read.pool.info tools.
    registerPoolTools(server, api);
  • Helper method getPoolApyHistory on ArcadiaApiClient – makes GET request to /pools/historic_apy with chain_id, pool_address, and days to fetch APY history data used by read.pool.info.
    async getPoolApyHistory(chainId: number, poolAddress: string, days = 14) {
      return this.get("/pools/historic_apy", {
        chain_id: chainId,
        pool_address: poolAddress,
        days,
      });
    }
  • Helper method getPools on ArcadiaApiClient – makes GET request to /pools with chain_id to fetch all pools, used by read.pool.info to find the specific pool by address.
    async getPools(chainId: number) {
      return this.get<ApiListResponse>("/pools", { chain_id: chainId });
    }
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint. Description adds context about APY history but no additional behavioral disclosures beyond that.

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, front-loaded with main purpose, no wasted words. Highly concise and structured.

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?

Description is sufficient given the presence of output schema. It covers purpose, usage, and relationship to siblings.

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 description does not need to add parameter info. The description mentions APY history but does not elaborate on parameters 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 the tool gets detailed info for a single lending pool including APY history. It distinguishes from sibling read.pool.list which discovers pool addresses.

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

Usage Guidelines5/5

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

Explicitly states when to use (analyzing rate trends, comparing pools) and provides alternative (use read.pool.list to discover pool addresses).

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/arcadia-finance/mcp-server'

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