Distill Markets
Verified SEC filing data for US equities, served as 27 read-only MCP tools: fundamentals from 10-K and 10-Q filings, point-in-time values as they were first…
Что умеет
- Get Briefing: [Free] Single-ticker briefing in one call — government macro series, the sector capex aggregate, eight quarters of SEC fundamentals, four quarters of financial ratios, and the company's
- Get Macro: [Free] 16 government-sourced indicators (Fed Funds Rate, CPI, unemployment, 10Y Treasury yield, WTI crude oil, industrial production, housing starts, financial conditions, etc.) with z-scor
- Get Company Profile: [Free] SEC company profile, as EDGAR carries it: `cikNumber`, `name`, `entityType`, `sicCode`/`sicDescription`, `category`, `stateOfIncorporation`, `fiscalYearEnd`, address, `exch
Какие данные видит
Нужен ли аккаунт
Не нужен: сервер работает без входа
Verified SEC filing data for US equities, served as 27 read-only MCP tools: fundamentals from 10-K and 10-Q filings, point-in-time values as they were first reported, financial health ratios, 13F institutional holders and manager portfolios, Schedule 13D/13G blockholders, Form 4 insider activity, segment revenue, 16 government macro series, and a cross-sectional screener with as-of support.
Every figure traces to an EDGAR accession number. Factual data only, no opinions or recommendations. A free tier covers the top tickers without a key; a free API key unlocks all tickers. OAuth 2.1 sign-in.
Как подключить
Как подключить Distill Markets к Claude
Адрес сервера, который нужно вставить в настройках Claude:
https://distill-markets--distillmarkets.run.tools
- Откройте Claude (сайт claude.ai или приложение для компьютера).
- Перейдите в Настройки → Коннекторы (в английском интерфейсе: Settings → Connectors).
- Нажмите Добавить пользовательский коннектор (Add custom connector).
- Вставьте адрес сервера, скопированный ниже, в поле URL удалённого MCP-сервера и нажмите Добавить.
- В чате нажмите + → Коннекторы и включите новый коннектор.
Пользовательские коннекторы доступны на тарифах Free, Pro, Max, Team и Enterprise. На Free можно добавить только один. В Team и Enterprise коннектор сначала добавляет владелец организации в Настройки организации → Коннекторы.
Авторизация
После нажатия Добавить откроется окно входа в сервис. Войдите под своим аккаунтом и подтвердите доступ. Пароль Claude не видит.
Как подключить Distill Markets к ChatGPT
Адрес сервера, который нужно вставить в настройках ChatGPT:
https://distill-markets--distillmarkets.run.tools
- Откройте ChatGPT в браузере (chatgpt.com). Нужен тариф Plus, Pro, Business, Enterprise или Edu.
- Один раз включите режим разработчика: Настройки → Приложения → Дополнительные настройки → Режим разработчика (Settings → Apps → Advanced settings → Developer mode).
- Откройте Настройки → Коннекторы и нажмите Создать (Create).
- Заполните форму: Название (любое), Описание (одна фраза, что делает сервис), URL MCP-сервера (скопируйте ниже).
- В поле Аутентификация выберите OAuth, если сервис требует вход, иначе Нет. Нажмите Создать.
- В новом чате откройте + → Приложения/Коннекторы и включите коннектор.
Название раздела у OpenAI менялось (Connectors → Apps/Plugins). Если пункт называется иначе, ищите «режим разработчика» в настройках. В рабочих пространствах Business/Enterprise администратор должен разрешить пользовательские коннекторы.
Авторизация
При первом использовании ChatGPT откроет окно входа в сервис. Войдите и подтвердите доступ.
Как подключить Distill Markets к Cursor
Адрес сервера, который нужно вставить в настройках Cursor:
https://distill-markets--distillmarkets.run.tools
Быстрый способ: нажмите кнопку Открыть в Cursor ниже, Cursor сам предложит добавить сервер.
Вручную:
- В Cursor откройте Settings → Cursor Settings → MCP и нажмите Add new global MCP server.
- Вставьте JSON, скопированный ниже, в открывшийся файл
~/.cursor/mcp.json(для одного проекта:.cursor/mcp.jsonв корне проекта). - Сохраните файл. Сервер появится в списке MCP; при необходимости пройдите авторизацию по кнопке рядом с ним.
Авторизация
Если сервис требует вход, рядом с сервером в списке MCP появится кнопка авторизации.
Список инструментов сервера (27)
Технические названия из tools/list. Нужны только разработчикам.
| get_briefing | [Free] Single-ticker briefing in one call — government macro series, the sector capex aggregate, eight quarters of SEC fundamentals, four quarters of financial ratios, and the company's ten most recent SEC filings. Every block is filed or government-sourced. `filedEvents` rows are as-filed: form type, filing date, the 8-K item codes the filer selected (null on forms that carry none, e.g. Form 4), and the EDGAR accession number. `health.history` carries operating margin, net margin, debt/equity and current ratio — arithmetic on filed lines, with no composite score over them. `capitalCycle.pctUnclassified` is served beside pctAccelerating/ pctDecelerating because those two are shares of the whole sector cohort and are typically small; without it they read as if they partitioned the sector. Free tier: top ~50 tickers without API key (rate-limited 30/hr). All tickers with a free API key. Cheapest way to get an overview of a ticker. |
| get_macro | [Free] 16 government-sourced indicators (Fed Funds Rate, CPI, unemployment, 10Y Treasury yield, WTI crude oil, industrial production, housing starts, financial conditions, etc.) with z-scores and trend direction. Same payload regardless of ticker — global context. Each indicator carries `statsBasis`: "level" (default) or "period-change". CPI's zScore90d/percentile2y are computed on its month-over-month % change, not its index level — a low percentile there means "inflation has been running cool", not "the index is near a 2-year low". `percentile2ySampleSize` reports how many observations the percentile was actually ranked against, so a sparser series' percentile is visibly narrower than a full 2-year window. Free tier — no API key required. |
| get_company_profile | [Free] SEC company profile, as EDGAR carries it: `cikNumber`, `name`, `entityType`, `sicCode`/`sicDescription`, `category`, `stateOfIncorporation`, `fiscalYearEnd`, address, `exchanges`, `tickers`, `formerNamesJson`. Useful for entity disambiguation and confirming you have the right company. NO GICS SECTOR. `sicCode` is the SEC's own classification and is the only one here. GICS sector lives on screen_universe rows — and if you need sector for many tickers, page screen_universe rather than calling this per ticker: a measured session spent 397 profile calls where 7 screen pages would have done. Free tier. |
| get_sec_filings | [Free] Recent SEC filings for a ticker, optionally filtered by form type. Returns filing date, form type, URL to the SEC document, accession number. Form 4 filings are insider transactions. 8-K filings contain item codes (5.02 = officer change, 9.01 = financial exhibits, etc.). Free tier (scope `sec:read`, included on free keys via the benchmark funnel). |
| get_insider_activity | [Free] Insider (SEC Form 4) transaction activity for a ticker over a look-back window, parsed straight from EDGAR. Returns a summary — openMarketBuys / openMarketSells (counts of code-P / code-S trades), netOpenMarketShares (P shares − S shares), totalBuyValue / totalSellValue, distinctBuyers / distinctSellers, totalTransactions — plus the individual `transactions` list (owner name, role, officer title, transaction date, SEC code + description, acquired/disposed, shares, price per share, value, shares owned after, direct/indirect, derivative flag, security title). Code P marks an open-market purchase and code S an open-market sale; other codes cover option exercises, gifts, and tax-withholding dispositions. The summary splits counts, shares and value by code so purchases and sales are reported separately. Every transaction traces to a Form 4 accession via get_sec_filings. `limit` is capped server-side at 500 regardless of what you pass — read back `effectiveLimit` (what was actually applied) and `truncated` (true when the window holds more transactions than fit in this page) rather than assuming the requested limit was honored verbatim. `totalTransactions` always counts the WHOLE window, never bounded by the limit/page size — it is the number to trust for "how much insider activity happened here", even when `transactions` itself is a truncated page of it. To read past the first page, pass `offset` and walk `nextOffset` until it comes back null; the summary describes the whole window on every page. SUMMARY COVERS COMMON STOCK ONLY. Every open-market figure (buy/sell counts, values, net shares, distinct buyers/sellers) aggregates Form 4 Table I rows. Derivative (Table II) lines — option writes, warrants — reuse the same P/S codes for a different act and their price column is not a per-share equity price, so they are excluded from the summary while still appearing in `transactions` with `isDerivative` true and counted in `totalTransactions` / `derivativeTransactions |
| get_institutional_ownership | [Free top-5 / Analyst depth] Institutional (13F) ownership of a ticker for one reporting quarter: the holder population (holdersCount, filerCikCount, totalValue, totalShares) plus the ranked largest holders. Every manager holding $100M+ in 13F securities files within 45 days of quarter-end. THREE THINGS TO GET RIGHT BEFORE SUMMARISING THIS PAYLOAD: 1. COMPLETE BY DEFAULT. A 13F quarter only fills in over the ~45 days after quarter-end, so the newest quarter ON FILE is normally one most managers have not filed for yet. This returns the newest quarter that PASSED the completeness guard, not the newest present. Measured on AAPL: the in-flight 2026-06-30 quarter read $51.6B across 1,170 holders against 2026-03-31's $2,396.3B across 6,051. That 98% gap is a filing artefact, not selling. Pass `period` to read an in-flight quarter deliberately; it returns with isPeriodComplete false and a `note` saying so. Never report a partial quarter as settled fact, and never compare one to a complete quarter. 2. NULL MEANS UNKNOWN, NEVER ZERO. newHolders, exitedHolders, valueQoQPct, holdersQoQDelta, sharesQoQPct, and per-holder sharesQoQPct / isNewPosition are null whenever the comparison cannot be certified: the baseline quarter was itself incomplete, the holder had no prior position, or the key lacks `ownership:detail`. Say "not known" for these. Do not read null as "no change", and do not fold it into a count or an average. 3. A HOLDER IS A FILER FAMILY. Vanguard reports AAPL through nine separate CIKs, summed into ONE row carrying memberCikCount 9, so holdersCount is not inflated by filing structure. holderKey is stable across quarters, so a manager reorganising its filing entities does not look like an exit plus a new position. familyKey is null for a lone filer. filerCikCount >= holdersCount. Values are full dollars; percent fields are FRACTIONS (0.05 = +5%). A free key returns the 5 largest holders with their dollar value |
| get_ownership_history | [Analyst] Quarterly institutional-ownership series for a ticker, NEWEST FIRST. Per quarter: holdersCount, filerCikCount, totalValue, totalShares, and the quarter-over-quarter changes (newHolders, exitedHolders, valueQoQPct, holdersQoQDelta, sharesQoQPct). Use it to judge whether institutions have been accumulating or distributing across quarters. Quarters still being filed are EXCLUDED by default, and that default is load bearing: appending an in-flight quarter to this series produces a ~98% cliff that reads as a mass exodus and is purely a filing artefact (see get_institutional_ownership). Pass include_partial=true to get them, flagged isPeriodComplete false. One exception to the default: a ticker with NO complete quarter at all returns its partial series rather than nothing, so check isPeriodComplete on each row before describing a trend or plotting a level. Null in any comparative means UNKNOWN, never zero. Values are full dollars; percent fields are fractions (0.05 = +5%). Analyst tier (scope `ownership:detail`). |
| get_blockholders | [Free top-5 / Analyst full list] Schedule 13D/13G beneficial-ownership filers of a ticker — the current "who owns >5%" population, one row per filer/filer-group, each taken from its single MOST RECENT filing (every 13D/A or 13G/A restates the whole position, so the latest filing IS the current stake). 13D and 13G are the two beneficial-ownership schedule types: a 13D is filed when the holder may seek to influence control (activists, strategics); a 13G is the short form certifying a passive stake (index funds, asset managers). Rows carry filingType ("13D"/"13G"), isAmendment/amendmentNo, filedAt, eventDate (the date the threshold was crossed), personCount (group filings list up to 100 reporting persons), and percentOfClass — the filer's own stated percent, served exactly as filed, never recomputed; for a group filing it is the MAX across members, never the sum (members restate the same aggregate). Event-driven timeliness is the point: a 13D appears here within days of the stake being disclosed, where 13F (get_institutional_ownership) shows it only after quarter-end + 45 days. Coverage spans 2015 onward — filings before the SEC's 2024-12-18 structured-XML boundary are parsed from the older text-only filing format (the "text era"), so older stakes appear too, not just ones disclosed after that date. Every row carries `isStale`: true when its filing is more than 365 days old. 13D/13G has no forced quarterly refresh the way 13F does, so an old filing can still be a filer's genuine current stake — isStale is a visibility flag, never a filter (a stale row is still returned, just sorted after the non-stale ones, oldest last). Free keys see the five largest holders with truncated=true; the full list requires the Analyst tier (scope `ownership:detail`). |
| search_managers | [Free] Find institutional managers by name and get the `holderKey` that get_manager_portfolio needs. Returns holderKey, holderName, familyKey, periodOfReport, positionCount, totalValue and memberCikCount per match, largest first. CALL THIS FIRST. get_manager_portfolio takes a holderKey (a family slug like `vanguard`, or a 10-digit filer CIK), never a display name, so guessing the key from a name will 404. Fewer than 2 characters returns a 400. Matching is on the DISPLAY NAME as filed, so a match is not proof of identity: "Vanguard Group" and an unrelated "Vanguard Capital Wealth Advisors" both match "vanguard". Check positionCount and totalValue before deciding which one the user meant, and say which you picked. Every result is described by one settled quarter (the newest that passed the completeness guard), so a manager who has stopped filing will not appear. Values are full dollars. |
| get_manager_portfolio | [Free headline / Analyst depth] What one institutional manager owns: their whole-book totals plus their largest positions for a 13F quarter. This is the "what does Vanguard hold" side of 13F; get_institutional_ownership is the "who holds Apple" side. THE ONE MISTAKE TO AVOID: THE TOTALS ARE WHOLE, THE LIST IS NOT. `positionCount` and `totalValue` describe the manager's ENTIRE portfolio. `positions` does not — it carries their largest holdings covering ~95% of book value, capped at 200 names. NEVER sum the returned positions and present that as the portfolio value. For Vanguard at 2026-03-31 the stored 200 positions total 72.1% of a $6.73T book spread over 4,978 holdings; summing them understates the portfolio by more than a quarter. Quote `totalValue` for the portfolio, `storedValueShare` for how much of it the list covers, and say "the largest N of positionCount positions" whenever `positionsTruncated` is true. ALSO GET RIGHT: 1. COMPLETE BY DEFAULT. Returns the newest quarter that passed the completeness guard, not the newest on file. Requesting a quarter the manager has not filed for returns 404 rather than a partial row, so a 404 here often means "has not filed yet", not "no such manager". Pass `period` deliberately; check isPeriodComplete on what comes back. 2. NULL MEANS UNKNOWN, NEVER ZERO. newPositions, exitedPositions, valueQoQPct, positionsQoQDelta, and per-position portfolioWeight / sharesQoQPct / isNewPosition are null when the comparison cannot be certified or the key lacks `ownership:detail`. Say "not known"; never read it as "no change". 3. A MANAGER IS A FILER FAMILY. Vanguard's filing entities count as one manager (memberCikCount 10 for that quarter). Note that the same field on a ticker-side holder row counts only the CIKs holding THAT ticker, so 9 there and 10 here is not a contradiction. 4. EXITS ARE A COUNT, NOT A LIST. `exitedPositions` counts the WHOLE book. There is no field naming which positions they were |
| get_ticker_managers | [Analyst] Which managers hold a ticker, and which of them opened, added to or cut the position this quarter. Answers what the top-20 holder list structurally cannot: holders past rank 20, and direction of travel per manager. Each row gives the manager's value, shares, rankInPortfolio and portfolioWeight — the weight is what separates a concentrated position from a tracker weighting. THIS IS NOT A COMPLETE HOLDER REGISTER, and the response says so in `note` every time. A manager appears only when this ticker is among their larger positions, because each manager's stored book covers ~95% of their value (200 names at most). An institution holding the name deep in a large portfolio is genuinely absent. Measured on AAPL at 2026-03-31: 6,051 institutions hold it, 5,461 appear here, so 590 are missing. Describe results as "managers for whom this is a meaningful position", never as "all holders", and use get_institutional_ownership for the largest holders by value (authoritative to its depth of 20). THE FILTERS EXCLUDE UNKNOWNS rather than assuming false. A manager whose change could not be certified against the prior quarter is dropped from newPositions, increased and reduced. So the three do not partition the whole: AAPL 2026-03-31 gives 5,461 all / 155 new / 2,260 increased / 2,800 reduced. Do not present a filtered count as a share of total holders, and do not infer "the rest sold". `increased` and `reduced` also exclude brand-new positions, which have no prior count to have moved from and are reported by `newPositions` instead. Values are full dollars; percents are fractions. An invalid filter returns 400. Analyst tier (scope `ownership:detail`). |
| get_sec_fundamentals | [Free] Latest SEC-reported fundamentals from XBRL: revenue, net income, operating income, gross profit, R&D, EPS, total assets, equity, long-term debt, cash, operating cash flow, PP&E (`ppe`), trade receivables (`receivables`), shares outstanding, fiscal year, period end. IMPORTANT — quarterly vs annual: `revenue` / `netIncome` / `operatingIncome` are the LATEST REPORTED PERIOD, which is a single QUARTER when `latestForm` is "10-Q" (e.g. Apple revenue ~$111B, not the ~$416B fiscal year). `flowPeriod` states that window outright ("3 months", "12 months", or an itemised "mixed: ..." when the three figures do not share one) and is read off the served facts, not inferred from `latestForm`. For ANNUAL figures read the trailing-year fields instead: `trailingRevenue`, `trailingNetIncome`, `trailingOperatingIncome`, `trailingEbitda`. `trailingBasis` says how they were built: "TTM" = four contiguous quarters summed, "FY" = the latest reported fiscal year, which is the fallback when the quarterly chain has a gap and is NOT twelve trailing months — for an issuer three quarters past its year end it is a window that closed nine months ago. A "TTM" closing on a fiscal year end takes its fourth quarter from the issuer's own annual less its own first three quarters, because SEC files no standalone fourth-quarter figure. Each trailing figure resolves its own window, so `trailingBasis` is itemised ("mixed: revenue TTM, netIncome FY") when they differ. Balance-sheet fields (assets, equity, long-term debt, cash, ppe, receivables) are point-in-time — no adjustment needed. `trailingEbitda` carries `ebitdaBasis` naming what its D&A add-back includes: "DD&A" (a combined depreciation-and-amortization concept was filed), "depreciation+ amortization" (depreciation and intangible amortization were filed separately and summed), "depreciation-only" (no intangible-amortization figure available — understates EBITDA for issuers with material intangibles, e.g. serial acquirers), or "depreciation+a |
| get_events | [Free] SEC 8-K filing events for a ticker. Each row carries the filing timestamp (`createdAt`) and the catalyst category (`catalystCategory`); rows can be matched to get_sec_filings rows by timestamp. `catalystCategory` names the 8-K item THE FILER selected — item 2.06 is titled "Material Impairments", 4.01 "Changes in Registrant's Certifying Accountant", 3.01 "Notice of Delisting". Where a filing carries several items it is the highest-materiality specific one, with the catch-all items (1.01, 8.01, 9.01) yielding to a specific co-filed item. It is a filed fact, not an assessment of the company: it says what the filing was filed UNDER, never whether that is good or bad news. For the raw item codes themselves, read `items` on the matching get_sec_filings row. Factual SEC filing events only — no direction, no thesis, no investment advice. Free tier and above. |
| get_changes | [Free] Delta feed: what's new or changed in the last window. Returns two independently-paged streams — new SEC 8-K filing events and new SEC filings — since the cutoff. Use this in an agent loop to track recent activity: call it on a schedule and react only to deltas, instead of re-pulling everything. Both streams are filing-derived; `newEvents` rows identify the company and when the filing landed, and carry no classification of their own. Use get_events for a ticker's catalyst categories, or `items` on the `newFilings` rows for the raw 8-K item codes (null on forms that have no items, e.g. Form 4). PAGINATION: `nextCursor` in the response is non-null whenever either stream still has results left inside the window. Walk it: pass the returned `nextCursor` back as `cursor` on the next call, and stop once `nextCursor` comes back null. Each call — each page — counts once against the `changes` sub-quota, so walking N pages costs N calls, not one call per window. CLOCK NOTE, per stream: SEC-catalyst signals are timestamped to the FILING DATE (midnight UTC), not detection time — an hour-precision `since` (e.g. '2h') can miss a signal for a filing dated yesterday but only detected overnight; prefer a date-based window (e.g. '7d') over hour precision when watching that stream. New SEC filings are timestamped to ingestion time, so hour precision behaves as expected there. Free tier. |
| get_compare | [Free up to 3 / Analyst up to 10] One call for NAMED tickers: a fundamentals snapshot plus the top 5 SEC filing events for each. Without the Analyst scope the first 3 are compared and the rest are named in the `tickers` warning. This is the batch-depth lane — reach for it instead of fanning out per-ticker calls once you already know which companies you want. Pick the lane by what you have. screen_universe filters the WHOLE universe by metric and is the bulk lane (page it — ~3,000+ companies, full metric sets). get_compare takes a list you already hold and returns depth on each. The per-ticker tools go deeper still on a single name. The comparing is yours to do: the response is the same filed figures placed side by side, with no ranking, score or verdict across the set. Free tier up to 3 tickers; Analyst tier up to 10. |
| get_financial_health | [Free newest-4 / Analyst depth] Financial ratio panel, up to 20 quarters: operating margin, net margin, ROA, ROE, debt/equity, current ratio, cash-to-debt, cash-flow-to-debt. ~3,400 covered companies — returns null history for uncovered tickers. Every figure here is arithmetic over two filed lines, so you can re-derive any of them from get_sec_fundamentals and check this endpoint against us. One caveat on `operatingMargin`: its numerator is whichever operating-income concept the filer tagged, and filers that never tag us-gaap:OperatingIncomeLoss (most banks and insurers, plus a minority of operating companies — IBM among them) are served a PRE-TAX income concept instead. Pre-tax includes non-operating items, so such a margin is not comparable to a true operating margin. get_sec_fundamentals returns `operatingIncomeConceptUsed`, which names the exact concept for a given ticker; the `note` on this response repeats the rule. NO COMPOSITE SCORE. A 0-100 health score and its trend label were withdrawn on 2026-08-26 and are not coming back as a filterable field. No filing states what a company's health score should be, so neither you nor we could verify one — and the old score saturated at its ceiling while margins fell, and read as distress for regulated utilities whose leverage is structural. Read the ratios below across the history instead; that is the judgement this endpoint declines to make for you. Note: this panel lags 10-Q filings by ~8 days (separate refresh job from sec_company_facts). For freshest fundamentals use get_sec_fundamentals. Every tier gets the latest panel. Free: history is the newest 4 quarters, with truncated=true and quartersAvailable naming the full depth. Analyst: all 20 quarters. |
| compute_valuation | [Free] Bring-your-own-price valuation: supply a share price and get the panel computed from VERIFIED SEC fundamentals - market cap, enterprise value, P/E, P/B, P/S, EV/Sales, EV/EBITDA, earnings yield, FCF yield, with the flow basis (TTM/FY) labeled and suppressed ratios explained in `notes`. Get the price from any quote source you have access to; Distill never stores or redistributes it. Factual computation only - expresses no view on cheap vs expensive. `enterpriseValue`'s net-debt component carries `netDebtBasis`, e.g. "LTD noncurrent + current maturities - cash; excludes leases" - it widens to include current maturities of long-term debt when filed (not just the noncurrent portion), but NEVER folds in operating/finance leases; the label always states that exclusion explicitly. `evToEbitda`'s EBITDA denominator is computed the same way get_sec_fundamentals' `trailingEbitda` is - see that tool's `ebitdaBasis` for what its D&A add-back includes. Free tier. |
| get_fundamentals_history | [Free newest-3 / Analyst depth] Multi-year fiscal-year fundamentals series: revenue, margins, net income, OCF, capex, FCF, R&D, dividends, buybacks, balance sheet - up to 20 years, as reported (latest filing wins on restatement). The trajectory view: use for growth rates, margin trends, capital-allocation history. SHARE COUNTS: `sharesOutstanding` is a period-end count on the basis in force when it was filed and is never restated, so the series steps by the split factor at every stock split - do NOT compute a multi-year share change from it (AAPL FY2018 to FY2025 reads +211% that way). Use `weightedAverageSharesDiluted`, which the filer restates for splits and which reads -25.0% over that same window. Its restatement reaches back two fiscal years before the first annual filing after each split and no further, so a window reaching further back than that can still contain one step (AAPL FY2017 is still on the pre-split basis). EPS: `epsBasic`/`epsDiluted` carry the identical break, on the identical boundary. `epsDiluted` is filed net income divided by that period's own weighted-average DILUTED share count, so it inherits whichever basis `weightedAverageSharesDiluted` carries; `epsBasic` is restated on the same boundary by the same filing, but this response carries no weighted-average BASIC count to reconstruct it from. netIncome / weightedAverageSharesDiluted, both already in the row, reconstructs the filed epsDiluted - useful when a row's own epsDiluted is null. It does not widen the comparable window past weightedAverageSharesDiluted's own, and does not reconstruct epsBasic. Each year also carries earningsReleaseDate/earningsReleaseSource: the filing date of the first 8-K Item 2.02 after that fiscal year's period end, derived from SEC filings rather than announced. Covers years whose period end falls on or after the filings index start (earningsReleaseCoverageFrom); null before it and for non-8-K reporters. Free: the newest 3 fiscal years, with truncated=true an |
| get_segment_revenue | [Free newest-2 / Analyst depth] Revenue by business segment, product line and geography, as the filer stated it in its 10-K/10-Q XBRL. Each axis carries `periods` (one row per period-end/span/unit/partition: the consolidated total the members were reconciled against, the filing's own reconciling items, the reconciliationStatus, the accessionNumber) and `members` (label, rawNames = the filer's XBRL member spellings, lineageState, and one value per period). Every served breakdown sums to within 0.1% of the consolidated revenue the SAME filing reported: as stated, after that filing's own eliminations, or within a stated remainder (reconciliationStatus Exact / ExactAfterEliminations / Remainder). Breakdowns that do not reconcile are not served. `concept` names the total the members were reconciled against, which can be a sibling revenue concept of the members' own. `derived: true` marks a computed fourth quarter (fiscal year minus the three filed quarters of the same member); everything else is a number the filer stated. A value names its period by `periodKey`, the same string the period row carries; `partitionId` separates two breakdowns a filer states on one axis in one period and is 1 for almost every filer. `changeClass` compares a value with the previous served statement of the same member-period (new, identical, precision, rounding, recast, scale, sign) - `recast` means the filer restated it. Coverage: US domestic 10-K/10-Q filers, from SEC's Financial Statement and Notes data sets, which trail a filing by one to five weeks. Single-segment filers report no breakdown. Figures are as reported, in the filer's reporting currency. A filer whose ticker resolves to another registrant is addressed by CIK in the HTTP API at /api/v1/sec/segments/cik/{cik}. Free: the newest 2 fiscal years of each axis, with truncated=true and fiscalYearsAvailable naming the full depth. Analyst: the full window and as_of. |
| get_server_info | [Free] MCP server manifest info: package version, tool count, and the API base this server is pointed at. Call this first if a documented tool seems unexpectedly missing from your session — the manifest returned here is always the current one for this connection. |
| get_asof_fundamentals | [Free, 10/day] Fundamentals as KNOWABLE on a past date: only filings accepted by that date, values AS THEN REPORTED — no lookahead, no restatement substitution. Each value carries the EDGAR accession of the filing that stated it. This is the time-travel view: use it to reconstruct what an investor could actually have known (e.g. before a restatement landed), or to build survivorship- and restatement-bias-free backtests. Annual basis by default. period='quarterly' returns the latest SINGLE-QUARTER panel knowable at the date instead: native quarterly rows where the issuer filed them, YTD-subtraction synthesis where it filed cumulatively (values marked synthesized:true; a synthesized quarter combines two filings and is dated to the later one). Each value carries `period` (Q1..Q4). Contrast with get_sec_fundamentals / get_fundamentals_history, which are latest-filing-wins (today's view of the past). Point-in-time corpus covers 2009 onward. DELISTED companies resolve too (YHOO, CELG, MON, XLNX, RTN, TWX...): the identity layer maps historical tickers to CIKs, and the response carries companyName plus delistedAt (Form 25/15 event date) when the issuer later stopped reporting. Live tickers have delistedAt null. Free tier (scope `pit:asof`), capped at 10 calls a day; Analyst and above are unlimited. Universe-scale as-of screening and the bulk as-of panel export are the Pro-anchored siblings — see `screen_universe`'s `as_of` parameter (scope `pit:asof:bulk`). |
| get_fact_versions | [Analyst] Version timeline: EVERY filing's statement of each fact — how a number changed across the filing that first reported it and every subsequent filing that restated it. Each version has the value, filing date, form, EDGAR accession, and the raw XBRL `concept` behind the row. Several concepts can map to one conceptGroup (e.g. NetIncomeLoss vs ProfitLoss) — two same-accession rows with different concepts are NOT a restatement; a real restatement is the same concept changing across different accessions. Works for delisted issuers too (historical-ticker identity layer). Annual basis by default. period='quarterly' includes every reporting span, each row labeled `period` AS FILED: Q1..Q4 single quarters, H1/9M YTD-cumulative, FY annual, TTM trailing-twelve-month, PT balance-sheet instant. Rows at different spans are different facts, not restatements. Quarterly timelines are large — narrow with concept/period_end. The point-in-time corpus lags the latest-facts store by roughly weeks: an empty or missing recent period can mean the filing exists but has not yet reached this corpus. Cross-check get_sec_fundamentals' lastUpdated before reading an empty result as not filed. Analyst tier (scope `pit:read`). |
| get_revisions | [Free counts / Analyst detail] Facts whose reported value changed materially between the earliest version this corpus holds and the latest filing that reported them. A CHANGED VALUE IS NOT A RESTATEMENT, and most of these are not. Measured across 60 tickers: of 86 flagged facts, 3 were verified error corrections. The rest were discontinued-operations re-presentations after a spin-off, reverse-merger entity changes, retrospective adoption of a new accounting standard, and tag changes — legitimate revisions in every case, and this tool is named for what it measures rather than for a conclusion it cannot reach. Never report a row here as a company having restated its financials unless something beyond this payload establishes that. `changeType` on each detail row names the mechanism where the evidence identifies one: `entity-change` (the original filing states no revenue for the period at all — the reverse-merger shape, where the two values belong to different entities), `multi-period-recast` (one filing moved this concept across two or more periods in the same direction — what a standard adoption and a discontinued-ops re-presentation both look like), `amendment` (the value moved in a form ending /A, the one signal pointing TOWARD a genuine correction), and `unclassified` where none matched. Verified corrections land in `unclassified`; treat it as the shortlist to investigate, never as a finding on its own. Two further mechanisms never appear because they are excluded rather than labelled: a tag change, and a pair of values living in one filing. Returns counts (`revisedFactKeys` of `annualFactKeys`) on every tier; the per-fact detail rows (original vs latest value, `changeType`, both EDGAR accessions, relative delta) require the Analyst tier (scope `pit:read`) — on a free key `revisions` is empty and `note` explains the upgrade. Detail rows cap at 100 by |relDelta| — narrow with concept/period_end to reach a fact ranked below the cap. Each detail row carries `ori |
| get_deep_history | [Pro] Text-parsed annual fundamentals for FY1995-2009 — the pre-XBRL era, before machine-readable filings existed. Covers non-financial single-registrant US filers. Verified tier only, reported per fact as `verifiedBy`: 'continuity' (continuity-checked against a second independently-typeset print of the same fact), 'continuity-widened' (a single surviving print with no second print available to corroborate, admitted instead by in-filing structural anchors and magnitude guards) — both across the whole window — and, for FY2009 only, a third tier 'xbrl' (the filer has a genuine no-lookahead XBRL first-print for that exact concept and the text value directly agrees with it; disagreeing values are never served). A FY2009 filer gets EITHER 'continuity' or 'xbrl' per concept, never both: 'xbrl' requires a genuine XBRL first-print for that concept, 'continuity' for FY2009 is scoped to filers with no XBRL first-print for any core concept at all (the crisis-year coverage gap left by XBRL's 2009-2011 mandatory phase-in); 'continuity-widened' sits outside that either/or and can appear at any fiscal year, including FY2009. The response `note` carries the current measured precision for 'continuity' and 'continuity-widened' separately, each with n and 95% CI. Quote whichever tier's claim you're citing from the response note, always with n and CI, never the bare percentage; this description deliberately omits the figures so they cannot go stale. LOOK UP BY TICKER OR BY CIK — EXACTLY ONE, never both, never neither. `cik` is the drill-down path for screen_pre2009's CIK-only results: 57.8% of this cohort carries no ticker at all, so most of the screen's rows can ONLY be pulled here by `cikNumber`. In the by-CIK response, `ticker` is a best-effort, DISPLAY-ONLY field and is null for genuinely ticker-less CIKs — the expected, common case, not an error — and `companyName` comes from the fact rows' own registrant name as filed, not from a ticker crosswalk. NOT XBRL-GRADE, AND NEVER MERG |
| screen_pre2009 | [Pro] Universe-scale point-in-time SCREEN over the pre-2009 (FY1995-2009) text-parsed corpus — the screening sibling of get_deep_history (single-name lookup) and screen_universe (the 2009+ XBRL screener). A SEPARATE, smaller surface: never commingled with the XBRL screener's results, own filter whitelist, own result shape. CIK-FIRST RESULTS. 57.8% of this cohort carries no ticker at all (crawled CIK-only, resolved company from the filing itself, never assigned a ticker in modern records) — every result carries `cikNumber` (always present); `ticker` is best-effort and commonly null. Do not assume a result has a ticker before displaying or joining on one. `ticker`, when present, is a PRESENT-DAY identity resolution (today's live ticker mapping, or else the most-recently-active historical one) for the row's CIK — it is NOT scoped to `fiscal_year`. Ticker strings are reused across unrelated issuers over the decades, so a backtester must never join pre-2009 identity on `ticker`; `cikNumber` is the only stable join key this screen guarantees. EX-FINANCIALS BY CONSTRUCTION. The underlying table excludes SIC 6000-6799 (banks, insurers, REITs) at load time — never a runtime filter, so it cannot be turned off. Their statement shape isn't modeled by this dataset. A VISIBLY THINNER METRIC SET than screen_universe: ratios are computed from 7 of the 21 pre-2009 text-parse concepts (Revenue, NetIncome, TotalAssets, Equity, CurrentAssets, CurrentLiabilities, LongTermDebt) — no margins beyond net_margin, no leverage suite beyond a single LongTermDebt/TotalAssets ratio, no Piotroski/Altman-Z/forensic suite. A ratio is null — never fabricated as 0, an unbounded outlier, or a clamp-boundary value — whenever its inputs are missing, the denominator is non-positive, or the computed ratio itself falls outside a generous plausible range. A FILTER ON A METRIC EXCLUDES ROWS WHERE THAT METRIC IS NULL — it does not rank them low. Nulls are common in this corpus (the response's note points |
| get_capex_cycles | [Free] Sector capital-cycle aggregates from SEC capex data. Pass no args for all eleven GICS sectors. Pass `sector` for that sector's drill-down: constituent tickers, median capex/revenue ratio, and the accelerating and decelerating shares. Those two shares are fractions of the WHOLE mature-year cohort and are typically small — neither exceeded ~11% for any sector in FY2025 — so read them against `pctUnclassified` (the remainder, routinely 86-91%) rather than as a split of the sector. `pctAcceleratingOfClassified` and `pctDeceleratingOfClassified` restate the split over the labelled tickers alone. This tool is sector-level only. There is no per-ticker capex path on the launch surface; for a single name's capex use get_fundamentals_history. Free tier. |
| screen_universe | [Free] Universe screener — filter the FULL company set by per-company SEC metrics (latest fiscal year, one issuer per CIK): margins, leverage (debt/EBITDA, net debt/EBITDA), R&D intensity, working-capital days (DSO/DIO), capex intensity, free-cash-flow margin & conversion (fcf_margin = FCF/revenue, fcf_conversion = FCF/net-income; FCF = operating cash flow − capex; both excl. Financials & Real Estate), buyback intensity, net dilution, and Piotroski F-score. Filters are AND-combined. Returns matching companies (ticker + name) with ALL their metric values, every number SEC-sourced. Response fields are camelCase versions of the filter metrics with ONE exception: the Piotroski F-score field is `piotroskiF`, not `piotroski`. When a margin filter is present, Financials and Real Estate are auto-excluded (their margins are non-comparable). This is the cross-metric universe screen in one call — e.g. filter net_margin>0.15 AND debt_to_ebitda<2 AND net_dilution<0 (share count shrinking), or filter debt_to_ebitda>6 AND accruals_ratio>0.1. Basis note (live mode only): piotroskiF is the latest QUARTERLY score; every other metric on a row is the last full FISCAL YEAR (fiscalYear). Two vintages sit on one row — the response `note` field restates this in plain language on every live (non-as-of) call. health_score is no longer a filter or a field (see get_financial_health). Accounting & capital-discipline metrics (Canon 1+2, latest FY), each a bare computed number with its source formula: asset_growth (YoY asset-base growth), accruals_ratio ((NI−OCF)/assets, Sloan), m_score_5 (Beneish 1999 M-score), gp_to_assets (Novy-Marx gross profitability). accruals/gp/m_score exclude Financials & Real Estate. These are raw academic-anomaly figures, not verdicts and not alpha signals — e.g. filter m_score_5>-1.78 AND accruals_ratio>0.1, or filter gp_to_assets>0.3 AND asset_growth<0.15. Point-in-time: pass `as_of` (a calendar QUARTER-END: Mar-31/Jun-30/Sep-30/Dec-31, 2009-06-30 onward) to run t |