Skip to main content
Glama

Get Fund Holdings

secedgar_get_fund_holdings
Read-onlyIdempotent

List what an ETF or mutual fund holds, parsed from the NPORT-P portfolio report it files with the SEC every quarter. The input is the fund — a ticker like VOO, a fund series ID, or the registrant trust — which is the opposite direction from the ownership tools: secedgar_get_institutional_holdings and secedgar_find_holders answer who owns a company, this answers what a fund owns. Each position carries the security name, CUSIP/ISIN/LEI where the filer reports them, share balance, market value in USD, and percent of the fund's net assets, alongside fund-level net assets and total assets. Positions are returned largest-first by percent of net assets, one page of limit rows starting at offset; the full report registers as df_ when a canvas is available, which is how a fund running to thousands of positions is aggregated or joined against the 13F and insider dataframes. An NPORT-P covers exactly one fund series and a registrant trust files one report per series, so a trust with several funds needs the specific fund named — pass its ticker or series_id. Reports publish roughly two months after the period they cover, so every result is dated: the holdings are the portfolio as of report_period_date, not as of today.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
fundYesThe fund whose portfolio you want — a fund ticker ("VOO", "SCHD"), an SEC fund series ID ("S000002839"), or a 10-digit CIK. A ticker names one share class of one series and routes directly; a CIK names the registrant, which files a separate report per series and needs series_id when it runs more than one fund. Fund trusts are indexed by ticker and series, not by name, so a trust name only resolves for a fund that trades under its own name ("SPDR S&P 500 ETF Trust") — pass the CIK otherwise.
limitNoNumber of positions to return inline, largest first by percent of net assets. Default 20. A broad index fund reports thousands of positions, so the inline list is a preview — read the whole portfolio from the dataframe, or page it with offset.
offsetNoPosition to start the page at, 0-based, over the full ordered holdings list. Pass the returned next_offset to read the next page — the report is parsed whole and sliced, so paging is stable and gap-free.
series_idNoSEC fund series identifier ("S000002839"), naming which fund of the registrant to report. Takes precedence over any series the fund input implies. Series IDs come back on fund results from secedgar_company_search and in the series list of a series_required error.
report_dateNoTarget a specific reporting period by its last day (YYYY-MM-DD), e.g. "2025-12-31". Omit for the most recent report. Period ends follow the fund's own fiscal quarters, which are not always calendar quarters — Direxion funds report to February, May, August, and November. available_report_periods in the response lists the ones this call identified; a period missing from that list is still worth requesting directly, since a report the submissions window no longer dates is dated by reading it.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
capNoThe limit cap applied.
formNoEDGAR form name — "NPORT-P", or "NPORT-P/A" for an amended report.
fundNoThe fund input, echoed.
as_ofNoThe portfolio date these holdings are reported as of, and the publication lag behind it.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of positions shown inline.
noticeNoGuidance when the report carried no positions or the page fell past the end.
offsetNoPosition the returned page starts at, 0-based.
datasetNoCanvas dataframe holding every position in the report (the inline holdings[] is a preview capped at limit). Each row carries the fund keys — series_id, registrant_cik, report_period_date, accession_number — alongside the position fields, so it joins against the 13F and insider dataframes on cusip. Absent when canvas is unavailable or the report had no positions.
holdingsNoOne page of positions, `limit` rows starting at `offset`, largest first by percent of net assets.
class_idsNoSEC class IDs of the share classes covered. One report covers every class of the series, so a fund with both an ETF and an admiral-share class reports them together.
series_idNoSEC series ID of the fund this report covers. Absent when the registrant files as a single fund with no series structure, which is how some older exchange-traded trusts are organized.
truncatedNoTrue when the inline holdings list was capped by limit.
filing_dateNoDate the report was submitted to EDGAR (YYYY-MM-DD).
next_offsetNoOffset to pass on the next call to continue through the portfolio. Absent on the last page.
series_nameNoFund name as the filer states it on the report. A closed-end fund organized as a single registrant names itself here with no series_id alongside; absent only when the filer leaves the field blank or writes "N/A".
net_assets_usdNoFund net assets in USD at the report date — the denominator of percent_of_net_assets.
registrant_cikNoCIK of the registrant trust, zero-padded to 10 digits.
total_holdingsNoPositions in the report, before offset and limit — the size of the full portfolio.
is_final_filingNoTrue when the fund reports this as its last filing on the series, which marks a liquidation or merger. Absent when the filing does not answer.
registrant_nameNoEDGAR-conformed name of the registrant trust.
accession_numberNoAccession number — pass to secedgar_get_filing for the full document.
total_assets_usdNoFund total assets in USD at the report date.
report_period_endNoLast day of the fiscal year the reporting period falls in (YYYY-MM-DD) — the fund's fiscal year end, not the portfolio date.
report_period_dateNoLast day of the period this portfolio is reported as of (YYYY-MM-DD). Holdings are the fund's positions on this date, not today's. Absent only when the filer omits it.
publication_lag_daysNoDays between the portfolio date and the filing date. Absent when the report omits its period date.
total_liabilities_usdNoFund total liabilities in USD at the report date.
available_report_periodsNoPeriod end dates of this fund's reports, newest first — the horizon report_date can address, not the fund's full history. It reaches back roughly a decade of quarterly reports, and a period older than that is refused rather than served. A period inside the horizon can still be missing from the list: the dates come from the registrant's recent submissions window, which a trust filing thousands of reports a year outruns in months, and a report the window no longer reaches is dated by reading it only when report_date asks for it.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations (readOnlyHint, openWorldHint, idempotentHint) establish the safety profile, and the description layers on consequential runtime behavior on top: stable gap-free paging via returned next_offset, automatic registration as df_<id> when a canvas is available, and a two-month reporting lag. It also flags the non-obvious dating semantic — results are as of report_period_date, not today.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but efficient — input disambiguation, direction contrast, output fields, paging contract, and timing each appear exactly once with zero redundancy. It sits at the upper bound of skim-ability and loses one point to a posture that front-loads the core contrast and fits the remaining caveats in a tighter tail.

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?

For a 5-parameter tool with three input aliases (ticker, series ID, CIK), a paging protocol, a dataframe registration behavior, and time-dependent semantics, the description closes every gap: the multi-series trust case, the ordering contract, the orphan-period caveat, and the cross-reference to secedgar_company_search for valid series IDs. An output schema exists to document return values, so the narrative can focus purely on caller-relevant behavior.

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%, so the baseline of 3 applies; the description doesn't lose points for missing parameter docs. However, the rich dataset semantics it explains (lag, dating, one-report-per-series) speak to overall behavior rather than adding meaning to individual parameters, which the per-param schema descriptions already cover thoroughly.

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?

Leads with a specific verb and resource — 'List what an ETF or mutual fund holds' — and pins it to the SEC NPORT-P report. The very first sentence frames the sibling ownership tools as the 'opposite direction,' unambiguously separating this from secedgar_get_institutional_holdings and secedgar_find_holders in a 15-tool namespace.

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?

Names the alternatives explicitly with the condition that selects this tool: 'secedgar_get_institutional_holdings and secedgar_find_holders answer who owns a company, this answers what a fund owns.' It also gives a concrete when-not-to-use rule for registrant trusts with multiple series, telling the agent to pass a ticker or series_id without guessing a name.

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.

TDQS

A4.1/5.0
Disambiguation4/5

Most tools have clearly distinct purposes, with detailed descriptions that explicitly separate similar-sounding ones (e.g., secedgar_get_institutional_holdings vs secedgar_find_holders vs secedgar_get_beneficial_owners). The four ownership/holdings tools share a domain but are each tied to a different filing type and direction, so an agent reading carefully should not misselect.

Naming Consistency4/5

All tools share the secedgar_ prefix and mostly follow a get_/search_/dataframe_ convention. Minor deviations like fetch_frames, compare_companies, and find_holders break the otherwise consistent verb pattern, but the naming remains predictable and readable.

Tool Count4/5

16 tools is slightly above the typical well-scoped range, but the SEC EDGAR domain is broad enough that the count is defensible. Each tool covers a distinct data source or workflow, and the dataframe management pair adds necessary infrastructure rather than bloat.

Completeness4/5

The tool set covers company lookup, full-text filing search, XBRL concepts and frames, financial histories, comparisons, insider trades, institutional holdings, beneficial owners, fund holdings, and material events. Minor gaps exist — e.g., no explicit exhibit-content retrieval and no direct way to list all filings for a company beyond recent submissions — but core workflows are well covered.