Skip to main content
Glama

tickerbot_get_etf_holdings

Returns an ETF's constituents and their weights, heaviest first. When the ticker is not an ETF, is_etf is false and holdings is empty; is_etf: true with zero holdings means a real ETF whose holdings are not ingested yet. The reverse lookup ("which ETFs hold NVDA") is a scan filter on etf_holders, not this tool.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMax holdings returned. Max 5000. When the cap cuts the list, the response sets `truncated: true` and `total` (the ETF's full holding count) — raise `limit` to at least `total` to get the full set, possible whenever `total` is within the 5000 cap (an over-cap `limit` is clamped to 5000, not an error). No `truncated` in the response means the list is complete.
tickerYesETF symbol. Case-insensitive.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
as_ofYesServer time this response was assembled (ISO 8601).
countYesHoldings in this page.
totalYesTotal constituents held, before `limit`.
is_etfYesWhether the symbol is an ETF, from the instrument type on its ticker record.
tickerYesThe ETF you asked for.
holdingsYesConstituents, heaviest first, each with its weight.
truncatedYes`true` when `limit` cut the list short.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "as_of": {
      +      "description": "Server time this response was assembled (ISO 8601).",
      +      "type": "string"
      +    },
      +    "count": {
      +      "description": "Holdings in this page.",
      +      "type": "number"
      +    },
      +    "holdings": {
      +      "description": "Constituents, heaviest first, each with its weight.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "is_etf": {
      +      "description": "Whether the symbol is an ETF, from the instrument type on its ticker record.",
      +      "type": "boolean"
      +    },
      +    "ticker": {
      +      "description": "The ETF you asked for.",
      +      "type": "string"
      +    },
      +    "total": {
      +      "description": "Total constituents held, before `limit`.",
      +      "type": "number"
      +    },
      +    "truncated": {
      +      "description": "`true` when `limit` cut the list short.",
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "as_of",
      +    "ticker",
      +    "is_etf",
      +    "count",
      +    "truncated",
      +    "total",
      +    "holdings"
      +  ],
      +  "type": "object"
      +}
  2. Added

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are provided, so the description carries the behavioral burden. It discloses important edge-case behavior: non-ETF tickers return is_etf=false with empty holdings, and is_etf=true with zero holdings means data not yet ingested. It does not explicitly discuss rate limits or mutation, but 'Returns' and the get_ prefix imply a read-only operation, and the edge cases are well covered.

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 concise and well-structured: it leads with the core purpose, then explains edge cases, then gives an explicit exclusion. Every sentence adds value and there is no redundant repetition of schema information.

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?

Given the rich output schema and highly detailed limit parameter description, the tool description covers the main behavior, edge cases, and an important alternative. It is complete enough for an agent to select and invoke the tool correctly without additional context.

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%, so the baseline is 3. The description adds meaningful parameter-level semantics beyond the schema by explaining what happens when the ticker is not an ETF and clarifying the distinction between empty holdings and not-ingested holdings. This goes beyond the schema's simple 'ETF symbol' description.

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 uses a specific verb and resource—'Returns an ETF's constituents and their weights'—and immediately distinguishes the tool from reverse lookup by stating that 'which ETFs hold NVDA' is not this tool. It also clearly differentiates from sibling tools like get_etf_sectors by focusing on constituents and weights.

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?

The description explicitly states when to use this tool (for ETF holdings) and when not to use it (reverse lookup should be a scan filter on etf_holders). It also covers edge cases like non-ETF tickers, which helps an agent decide when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.