Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.llmquantdata.com/llms.txt

Use this file to discover all available pages before exploring further.

Available as MCP tool: etf_holdings — call directly from Claude / Cursor / any MCP client. See MCP Server for the 60-second setup.
Live   1 credit (0 if unsupported)

What it does for your agent

etf_holdings returns the latest available regulatory disclosure holdings for a single US-listed ETF — full position list (subject to limit), each row normalized to a common EtfHolding shape with ticker / cusip / isin / sedol identifiers, weight, market_value, shares, and sector / country / asset_type. Rows are sorted by weight descending. Use it when the agent needs the actual position table — to compute concentration (Top-10 weight, HHI), overlap between two ETFs (call twice and diff by CUSIP / ISIN), or to build a thematic basket from an ETF’s underlying. For ETF basic info, top-N summary, and exposure breakdowns, prefer the lighter etf_lookup which is free. The endpoint splits behaviour by coverage: covered tickers return rows + 1 credit; tickers outside coverage return 200 OK with coverage_status="unsupported", empty holdings, and 0 credits — so probing coverage never costs you money. There is no server-side compare endpoint; cross-ETF overlap is computed client-side.

Response

data
EtfHoldingsResult
required
meta.count
number
Number of rows returned (may be < limit for small ETFs or 0 when unsupported).
meta.limit
number
The limit actually applied for this call.
meta.creditsUsed
number
1 for full / partial / stale returns. 0 when coverage_status="unsupported".
meta.remainingCredits
number
Account credits remaining.
200 OK · etf_holdings (supported)
{
  "data": {
    "ticker": "SPY",
    "fund_name": "SPDR S&P 500 ETF Trust",
    "issuer": "State Street",
    "holdings": [
      {
        "holding_name": "APPLE INC",
        "ticker": "AAPL",
        "cusip": "037833100",
        "isin": "US0378331005",
        "sedol": null,
        "asset_type": "equity",
        "sector": "Information Technology",
        "country": "US",
        "shares": 168000000,
        "market_value": 30450000000,
        "weight": 0.071,
        "notional_value": null,
        "source": "sec_nport",
        "source_url": "https://www.sec.gov/files/dera/data/form-n-port-data-sets/2019q4_nport.zip#FUND_REPORTED_HOLDING.tsv",
        "as_of_date": "2019-09-30"
      },
      {
        "holding_name": "MICROSOFT CORP",
        "ticker": "MSFT",
        "cusip": "594918104",
        "isin": "US5949181045",
        "sedol": null,
        "asset_type": "equity",
        "sector": "Information Technology",
        "country": "US",
        "shares": 78000000,
        "market_value": 27890000000,
        "weight": 0.065,
        "notional_value": null,
        "source": "sec_nport",
        "source_url": "https://www.sec.gov/files/dera/data/form-n-port-data-sets/2019q4_nport.zip#FUND_REPORTED_HOLDING.tsv",
        "as_of_date": "2019-09-30"
      }
    ],
    "source": "sec_nport",
    "source_url": "https://www.sec.gov/files/dera/data/form-n-port-data-sets/2019q4_nport.zip#FUND_REPORTED_HOLDING.tsv",
    "as_of_date": "2019-09-30",
    "fetched_at": "2026-05-12T03:14:00Z",
    "stale": false,
    "coverage_status": "full",
    "coverage_notice": "Latest available SEC regulatory disclosure snapshot. Not the issuer's daily latest holdings."
  },
  "meta": { "count": 2, "limit": 50, "creditsUsed": 1, "remainingCredits": 99 }
}
200 OK · etf_holdings (unsupported)
{
  "data": {
    "ticker": "IBIT",
    "fund_name": null,
    "issuer": null,
    "holdings": [],
    "source": "sec_nport",
    "source_url": null,
    "as_of_date": null,
    "fetched_at": null,
    "stale": false,
    "coverage_status": "unsupported",
    "coverage_notice": "IBIT is not in the current covered ETF list. As a spot Bitcoin trust, its SEC disclosure path differs from the conventional ETFs we cover today."
  },
  "meta": { "count": 0, "limit": 50, "creditsUsed": 0, "remainingCredits": 100 }
}

Credit rule

Coverage outcomeHTTPcreditsUsed
full / partial / stale (holdings returned)2001
unsupported (no holdings, explicit notice)2000
Caller has insufficient credits and ticker is in coverage402n/a — holdings not returned
Caller has insufficient credits and ticker is outside coverage2000 — coverage envelope is delivered without spending credits
Core rule: probing coverage is always free; only successful holdings retrieval costs a credit.

Notes

For overlap between two ETFs, call etf_holdings twice and diff client-side. Join by cusip first, then isin, then ticker — holding rows often have a null ticker for bonds / cash / derivatives, but stable identifiers like CUSIP survive.
Concentration metrics (Top-10 weight, HHI) are cheap once you have the rows. Sort is already weight-descending; just slice.
Use etf_lookup first (free) to confirm coverage and read holdings_count before deciding the limit for this call. Broad-market ETFs like VTI have thousands of positions; default limit=50 is enough for most agent workflows.

Current limitations

Not current / daily holdings. Rows reflect the latest SEC official regulatory disclosure snapshot (typically monthly or quarterly disclosure with a public-release lag), not the issuer’s daily book. as_of_date makes this explicit.
Per-row ticker is nullable. Bonds, cash, derivatives, and crypto trusts frequently have no ticker in a holdings row. Always fall back to CUSIP / ISIN for identification and joins.
No etf_compare_holdings server-side. Cross-ETF overlap, weight-difference, and basket comparisons are agent-side computations from two etf_holdings calls.
Historical-date query is not supported today. This endpoint always returns the latest available snapshot. Historical querying by as_of_date is on the roadmap.
Coverage is limited. Currently covered: SPY, QQQ, VTI, SOXX, ARKK and other curated popular ETFs. IBIT / DRAM are outside coverage today.
No issuer-PDF parsing, no paid data providers. Issuer fact-sheet PDFs are not in the data sources.

Direct invocation

// Default — top 50 by weight
{
  "method": "tools/call",
  "params": {
    "name": "etf_holdings",
    "arguments": { "ticker": "SPY" }
  }
}

// Custom limit
{
  "method": "tools/call",
  "params": {
    "name": "etf_holdings",
    "arguments": { "ticker": "VTI", "limit": 200 }
  }
}

Full parameter reference

ticker
string
required
US-listed ETF ticker (e.g. SPY, QQQ, VTI, SOXX, ARKK). Case-insensitive; the server uppercases and trims. Tickers outside coverage return 200 OK with coverage_status="unsupported" and creditsUsed=0.
limit
integer
default:50
Maximum number of holdings rows to return, sorted by weight descending. Default 50. Max 500. For broad-market ETFs (e.g. VTI), the full underlying list will exceed the maximum; cursor-based pagination is on the roadmap.

ETF Lookup

Fund identity, SEC mapping, top holdings summary, and exposure breakdowns — free.

Equity Historical Prices

ETF OHLCV history lives on the equity daily-bar endpoint.

MCP Server setup

Connect Claude / Cursor / any harness in 60 seconds.