Research · Audit

Company Primer — Get Up to Speed on Any Public Company, Every Number From the Filings

The first-day dossier on a public company — fiscal-year series, segments, capital structure, what changed, insiders, pay — every cell cited, filed as a report.

A primer, not a chat answer: the document an analyst hands the PM on day one of covering a new company — what the company does, four to five fiscal years and the trailing twelve months of numbers, segments, margins and cash, capital structure, capital allocation, what changed in the latest annual report, the 8-K stream since, who is buying and selling, who owns it, what the board pays its executives — every figure cited to the filing it came from, filed with create_report. Built for the analyst picking up a new name, and for anyone who wants the whole picture with a source on every number.

Any assistant can write a twenty-page company overview from memory. The numbers in it are whatever the model last saw, the segment table is a guess, and nothing in it is citable in a meeting. This primer is the same outline built from the as-filed record: the fiscal-year series comes from every 10-K unioned, the segment split from the filer's own XBRL, the risk-factor changes from a pairwise diff of two annual reports, the ownership from Forms 4 and 13F. Where the record has no answer — a discount-rate valuation, a comps multiple, a sell-side rating — the primer says so and leaves that section to the reader.

Why this works with edgar.tools MCP

The discriminating capability is a fiscal-year series unioned across annual reports, segment revenue as numbers rather than a table to re-key, a server-side Item 1A diff, and a report object the server validates:

  • company_brief — identity, headline financials, auditor and ICFR attestation off the 10-K cover, top officers, recent 8-K items, 90-day insider sentiment, top institutional holder.
  • company_filings — pin the latest 10-K and proxy by accession.
  • financial_statements — annual_history returns one column per fiscal year across every 10-K with restatements winning; ttm returns the trailing four quarters; breakdown:segment / breakdown:geography return revenue by axis as numbers with a sums-to-total check.
  • financial_trends — the growth series: revenue, operating income, EPS, diluted shares, SBC, capex, each with YoY and CAGR.
  • financial_snapshot — the twelve ratios from the latest 10-K, plus coarse fiscal-year multiples on the prior EOD close when price data exists.
  • filing_section — Item 1, MD&A, the debt note, the press release behind an 8-K.
  • analyze_filing — on the 10-K, risk_factor_changes: what the filer added, dropped, escalated or de-emphasised versus last year; on the DEF 14A, the Summary Compensation Table, proposals, beneficial ownership and audit fees.
  • material_events — the 8-K stream with per-filing EOD price reaction.
  • insider_activity, institutional_ownership — Forms 3/4/5 and 13F, with coverage dates stated.
  • compare_companies — the peer table on the XBRL metrics.
  • create_report — files the primer. The server enforces the citation contract: every block carries sources, every external source is an SEC URL.

How to use

Copy the procedure below into your Claude / ChatGPT / Gemini conversation with edgar.tools MCP connected, then ask:

Build the Company Primer on [TICKER].

Optionally name the fiscal-year span and the peers: "FY22 to FY25 plus LTM, against WMT, BJ and DG." Otherwise the primer takes the last five fiscal years and picks peers from the filer's own Item 1 competitor sentence.

The output is a report you can open, hand to a PM, and (on the Analyst plan) share as a frozen link. It is not a summary of a chat. For a five-minute triage read instead, run the 10-K Speedrun; the primer's first section is that brief, and it keeps going.

Prompt — paste this into Claude, ChatGPT, or Gemini

The primer (v0.1)

You are writing the primer on one public company for a portfolio manager. The user has handed you a ticker, optionally a fiscal-year span and a peer list. Your job is a cited primer — the document that lets someone who has never opened this company's 10-K start work tomorrow — filed with create_report, not written into the chat. Follow the steps in order. Step labels are fixed (R resolve · G gather · A analyze · W widen · D deliver).

Non-negotiables

  • No invention. Every dollar amount, percentage, date, name and quoted phrase comes from a tool result tied to an accession. If a value is not in the filings, write UNKNOWN — never approximate, never fill from memory.
  • The record ends where valuation begins. A DCF, a comps multiple on today's price, a target price, a sell-side rating, an analyst-day takeaway: none of these are in EDGAR. The primer carries one section titled Not in the record that names them and says what the client would need to supply. The coarse fiscal-year multiples financial_snapshot returns are on a prior EOD close over fiscal-year figures; label them so and never present them as a comps analysis.
  • Fiscal years are the filer's, not the calendar's. State the fiscal-year-end month once and label every column by period end. A column headed FY2025 at a May filer and at a December filer are seven months apart.
  • Restated beats original. annual_history lets restatements win; when a cell's provenance names a filing other than source_accession, cite that filing for that cell.
  • A segment is what the filer calls a segment. Use the breakdown axes as returned. An overlaps: true member is a subtotal or a nested region — never add it. If check is partial or exceeds_total, show the unallocated line and name it corporate or eliminations by its sign, as the tool does.
  • Absence is a finding, not a blank. No 10b5-1 sales, no 13F holder above 5%, no auditor change, no risk factor added: write the sentence, cite the call that returned nothing, and state the coverage window the tool reported.
  • File before you summarize. Invoking this primer is the request to file it. Run D1 and D2, then answer in chat with the report URL and the Assessment. Do not ask whether to file, and do not offer create_report as a next step — the report is private to the owner and costs nothing to discard. Offer follow-ups (a peer primer, the FORGE lens, a watch on the name) after the report exists, never instead of it.

Procedure

R1 — Resolve the filer, the span and the anchors. Resolve the ticker with search_companies if the name is ambiguous. Then company_filings({ company, form: "10-K", limit: 3 }) and pin the latest annual report's accession, filing date, fiscal-year-end and the period it covers; if the latest annual is a 20-F or 40-F, name the form and expect the segment and trends paths to be thinner. Then company_filings({ company, form: "DEF 14A", limit: 2 }) and pin the latest proxy. Fiscal-year span: the user's, else the last five fiscal years. Peers: the user's list, else defer to G8. Record the as-of date of the primer as the 10-K filing date.

G1 — Profile. company_brief({ company }). Capture identity (CIK, exchanges, state of incorporation, SIC description, entity type), the headline financials, the governance block (auditor, PCAOB id, whether the auditor attested to ICFR, whether an auditor change is stated — a field the filer did not tag is absent, never false), the officers list, recent_events, insider_activity sentiment and the top institutional holder. The brief is the index to the rest; nothing in it is final until the section-level call confirms it.

G2 — Business. filing_section({ accession: <10-K>, section: "business_overview" }). From Item 1, in your own words: what is sold, to whom, through what channel; how the company makes money (the pricing model, not the mission statement); the reporting segments and what each contains; the competitors the filer names, verbatim as a callout, since G8 picks peers from this sentence when the user named none; the regulatory regime if the filer gives it a subsection; headcount if stated. Do not lift marketing language. Translate.

G3 — The fiscal-year series. financial_statements({ company, statement: "income_statement", period: "annual_history", years: <span> }), then the same for balance_sheet and cash_flow. LTM: if the 10-K is the newest periodic filing, LTM equals the latest fiscal year — say so in the caption and do not call ttm; the trailing-four-quarter sum is only meaningful when a 10-Q post-dates the 10-K, and right after an annual report it can return a figure that is not the fiscal year and not the trailing twelve months either. When a 10-Q is newer, financial_statements({ company, statement: "income_statement", period: "ttm" }) and cash_flow, noting which 10-Qs were summed; a row carrying quarters_summed (also listed under partial_line_items) was tagged in only some of those quarters and is not a twelve-month figure, so use the row that covers every quarter. Then financial_trends({ company, concepts: ["revenue", "gross_profit", "operating_income", "net_income", "eps", "weighted_avg_diluted_shares", "stock_based_compensation", "operating_cash_flow", "capex"], years: <span> }) for YoY and CAGR. Reconcile every trends row against the statement before using it: the series can carry a mislabelled concept (a pre-tax line under net income, a deferred-tax line under operating cash flow), can return fewer years than asked, and can list a concept as unavailable that the statement has. Where they disagree the statement wins; compute YoY from the statement and use the trends only for rows that reconcile. Build one table per statement with a column per fiscal year plus LTM, and a growth table with YoY per year and the span CAGR. Carry each cell's accession; when provenance names a different filing for a cell, cite that one. The balance-sheet history may return values for only the two most recent year-ends; show the columns that have values and say so rather than reconstructing earlier ones.

G4 — Segments and geography. financial_statements({ company, statement: "breakdown:segment", period: "annual" }) and statement: "breakdown:geography". One table per axis: member, value, share of total, with the check result stated under the table and the unallocated line shown when the check is partial or exceeds total. The breakdown reads the latest ingested 10-K, which for a few weeks after an annual report is the prior year's; compare source_accession with the R1 anchor and state the vintage in the caption, taking the current year's segment growth rates from the MD&A. If the breakdown call returns nothing, read the segment note by tag — filing_section({ accession: <10-K>, section: "note:SegmentReportingDisclosureTextBlock" }); a wrong-tag error carries the filing's full tag list, so pick the segment tag from it — and build the table from the note, labelled from the note text. If a just-announced quarter matters, its segment table is on the earnings 8-K: filing_section({ accession: <8-K>, section: "earnings_release", tables: "segment" }).

G5 — Margins, returns and the MD&A story. financial_snapshot({ company }) for the twelve ratios and the health rating; its source.accession can also lag a just-filed 10-K — compute the margin series from G3 and use the snapshot for the ratios it alone carries (returns, liquidity, leverage). Then filing_section({ accession: <10-K>, section: "mdna" }). From the MD&A: the filer's own explanation of the year's revenue change (volume, price, mix, FX, acquisitions); gross and operating margin movement in basis points with the stated drivers; the largest cost story of the year; and from Liquidity and Capital Resources, capex actual and planned, dividends, repurchases with average price, debt issued and repaid, cash and investments. Record the margin series from G3 beside the filer's narrative, not instead of it.

G6 — Capital structure. From the G3 balance sheet: cash and short-term investments, total debt (current plus long-term, labelled derived when you summed), lease liabilities, equity, diluted share count from the trends. Then filing_section({ accession: <10-K>, section: "note:DebtDisclosureTextBlock" }) (or note:LongTermDebtTextBlock; a wrong tag returns the tag list). From the debt note: each instrument with principal, coupon, maturity and any stated covenant; the revolver size and drawn amount; the maturity ladder. The yield the market puts on that debt is not in the filing — the coupon is. Say so in the table caption. Capital returned in the span: sum dividends and repurchases from the G3 cash-flow series and set them beside operating cash flow and capex.

G7 — What changed. analyze_filing({ accession: <10-K> }). From risk_factor_changes: the risks added, dropped, escalated and de-emphasised versus the prior annual, each with its written summary; keep the three to five that would change a view and say why in one sentence each. Then material_events({ company, days: 365 }): the 8-K stream since the prior annual, each with item codes, date and price_reaction where present (state the session; do not pool unknown with the others). Flag 4.02 restatements, 5.02 executive transitions, 1.01 material agreements, 2.03 new debt, 8.01 other events. For the one or two 8-Ks that matter most, read the press release: filing_section({ accession: <8-K>, section: "press_release" }).

G8 — Peers. If the user named peers, use them. Otherwise take the competitors the filer named in G2 that are SEC registrants, up to five. compare_companies({ identifiers: [<target>, ...peers], metrics: ["revenue", "net_income", "gross_profit", "operating_income", "margins", "growth"], periods: 3 }). One table, target first. The comparison may serve the target's prior fiscal year and may omit gross_profit or margins for some sets; where it does, add the target's current-year row from G3 and say which columns were not returned. Peers are on the filer's own say-so or the user's; the primer does not claim the set is complete. Valuation multiples across the peers are not in the record — see the Not-in-the-record section.

G9 — Who is buying, selling and holding. insider_activity({ company, days: 365, limit: 50 }). Capture the summary (buy and sell counts, net value, unique insiders), the largest trades with pct_position_changed, every open-market purchase, and 10b5-1 status with plan_adoption where the sale carries one. State summary.coverage and, when gap_in_window is true, say that absence inside the gap is not evidence. Read the transaction codes before repeating the brief's sentiment label: a sell side made of tax-withholding dispositions on vesting (code F) with no open-market purchase for years is "no signal", not "bearish". If the response carries a self-check caveat that the summary's net value diverges from the transaction-level sum, quote both figures. Then institutional_ownership({ company, limit: 25 }): the top holders with current/new/carried tag and quarter-over-quarter change, concentration of the top ten, and summary.freshness_shares_pct stated beside the table.

G10 — Governance and pay. analyze_filing({ accession: <DEF 14A> }). From the proxy: the Summary Compensation Table for the named executive officers (latest fiscal year, with total), the proposals and the board's recommendation, has_say_on_pay, beneficial ownership of directors and officers and any 5% holders, auditor and audit fees. Set audit fees beside the G1 auditor identity. If no DEF 14A exists in the window (a foreign private issuer, a controlled company on a 10-K Part III), say so and take Part III from the 10-K where the filer put it there.

A1 — Assessment. One bolded central claim about what this company is, economically, in the span: what grew, what it cost, what the balance sheet looks like after it, and what the 10-K itself says changed. Two or three pillars, each pointing into a section of the evidence. No stance on the stock.

A2 — Coherence findings. Each as "field A says X, field B says Y, same record": revenue growth in the trends against the segment that supplied it; net income against operating cash flow and SBC across the span; repurchases against diluted share count (did buybacks shrink the count or offset grants?); capex planned in the MD&A against the capex series; debt maturities inside two years against cash and the revolver; the insider-sentiment line in the brief against the actual G9 trades; an escalated risk factor against an 8-K item that would explain it.

W1 — Peer primers (optional). Run this procedure on one or two of the G8 peers and link the reports from the Open questions section. Do not fold them into this dossier.

D1 — Write the dossier. Sections, in this order, unnumbered: Assessment · Business (what is sold, how it earns, segments, named competitors as a callout, regulation) · Fiscal-year series (income statement, balance sheet, cash flow, one table each, fiscal-year columns plus LTM, with the fiscal-year-end month stated once) · Growth and margins (trends table with YoY and CAGR; margin series; the filer's MD&A explanation of the year, one verbatim callout) · Segments and geography (one table per axis with the check stated) · Capital structure (balance-sheet keyValue; debt instruments table from the note; maturity ladder; caption stating that coupons are from the filing and market yields are not) · Capital allocation (span totals of capex, dividends, repurchases against operating cash flow; stance stated) · What changed (risk-factor changes with one-sentence why; the 8-K timeline with price reaction where present) · Peers (one table, target first, provenance of the set stated) · Ownership and insiders (insider summary and largest trades; holders table; coverage and freshness lines) · Governance and pay (auditor, ICFR, audit fees; compensation table; proposals; beneficial ownership) · Coherence (numbered findings) · What would make this benign (mandatory for a dossier: the coherence findings are reading aids, not allegations; name the disclosed practice or management explanation behind each) · Not in the record (mandatory: valuation, comps multiples, consensus, sell-side, intraday price, management commentary outside filings, with what the client would have to supply) · Open questions · Sources · a citationNote with the method chain. Every sentence quotes a filing or states a verifiable structural fact. The primer's one-page version is the Assessment plus the growth table; a reader with twenty minutes stops there.

D2 — File. Call create_report({ kind: "dossier", title, blocks }) now, in this turn — not as an offer. Title it "<Company> — Company Primer, FY<first>–FY<last> + LTM". Block rules: every block carries sources: [] at minimum, headings and the citationNote included; citationNote.method is an array of strings; do not number headings (the renderer letters sections); one callout per verbatim quote, never a paraphrase inside a callout; tables carry a caption where a check, a coverage window or a derived cell needs stating; external sources are https://www.sec.gov/…-index.htm URLs. Stay under 120 blocks: one table per statement, not one per line item. Share links are minted on the report page (Analyst plan), never by this procedure.

Priors — what each observation is worth

  • The series is the primer; the latest year is a row. A margin, a share count, a capex figure means little alone and a great deal across five columns. Build every table across the span before writing a sentence about the level.
  • The filer's own explanation outranks yours. The MD&A says why revenue moved. Quote it, then set the segment numbers beside it; do not substitute a cleaner story.
  • Share count audits buybacks. Repurchase dollars that leave diluted shares flat are grant offsets, not capital return. The trends give both lines; set them beside each other.
  • Cash audits earnings. Net income that does not convert to operating cash flow across the span, or converts only because of SBC add-backs, is a finding, not a footnote.
  • The debt note is the capital structure; the balance sheet is the summary. Instrument, coupon, maturity and covenant live in the note. A primer that stops at total debt has not read it.
  • Risk-factor changes are management's own signal. A filer rewrites Item 1A when something changed in its own assessment. Added and escalated risks, paired with the 8-K that explains them, are the most forward-looking sentence in the record.
  • Coverage before conclusion. Insider and 13F data carry stated coverage windows and freshness scores. Quote them beside the table; a quiet window inside a coverage gap is silence, not calm.
  • Proxy facts are facts about incentives. What the CEO is paid for, and whether holders voted for it, is the only incentive disclosure the record has. The compensation table is read as rows, not searched as phrases.
  • The record is the floor of the primer, not the ceiling. The client model may add valuation, consensus and news on top; the primer's job is to make every cell underneath it citable.

Stopping conditions

  • If the latest annual is a 20-F or 40-F, the annual_history, trends and breakdown paths may be thin or empty; build the series from the statements as filed, note the form, and mark the growth table partial.
  • If the 10-K is more than a year older than today and the filer has no newer annual, say so and date the primer to the 10-K; check company_filings for an NT 10-K and name it if present.
  • If material_events returns a 4.02 restatement inside the window, say so in the Assessment first: the series may be in flux, and the restated columns in annual_history are the ones to trust.
  • If compare_companies reports every peer as unresolved, file the primer without the Peers section and say the filer's named competitors are not SEC registrants.
  • If the account lacks Pro, financial_statements, filing_section, analyze_filing and the ownership tools return TIER_INSUFFICIENT; call account_status and tell the user what was gated.
Then askRun this on COST.

What the primer carries that a memory-written overview cannot

SectionOverview from memory and the webThis primer
Fiscal-year seriesWhatever snapshot the model trained on, often mixed fiscal and calendarannual_history unions every 10-K, restatements win, each cell carries its accession
SegmentsA re-keyed table, or a guess at the splitbreakdown:segment as numbers with a sums-to-total check and overlap flags
What changed in Item 1ANot attemptedanalyze_filing returns added / dropped / escalated / de-emphasised with written summaries
Capital structureTotal debt from a data vendorThe debt note: instrument, coupon, maturity, covenant, revolver drawn
Insiders and holdersHeadlinesForms 3/4/5 with 10b5-1 plan joins; 13F with current/new/carried and a freshness score, coverage stated
Executive payA news figureThe Summary Compensation Table as rows, with say-on-pay and audit fees from the same proxy
Valuation, comps, consensusConfidently inventedNamed as not in the record, left to the reader to supply
DeliverableA document with no citationsA dossier object the server validated, shareable as a frozen link

Worked run (2026-10-11): Costco, four days after its FY2026 10-K. Twenty-two tool calls, one filed dossier of 47 blocks. The income-statement and cash-flow histories came back five fiscal years deep with restated cells carrying their own accessions; the balance-sheet history carried only two. The trailing-twelve-month call returned a sum that was neither the fiscal year nor any twelve months, and the trends series put the pre-tax line under net income and a deferred-tax line under operating cash flow — both caught by reconciling against the statement, which is why G3 now says the statement wins. The segment breakdown, ratio snapshot and peer comparison were still on the FY2025 filing; the primer carried them with the vintage in the caption and the FY2026 growth rates from the MD&A. The Item 1A diff found seven changes, three of them AI escalations, which no overview from memory would have had.

The primer is the recipe most worth running on a company the assistant "already knows" — that is where a memorised figure is most likely to be a fiscal year stale, and where a cited one is worth the most in the meeting.

  • 10-K Speedrun — the five-minute triage read; the primer's Assessment is that brief, and the primer keeps going. Run the speedrun first when you are still deciding whether the name is worth your time.
  • F.O.R.G.E. Framework — when the primer's growth and share-count tables raise the compounder question.
  • Risk Factors YoY Diff — the full pairwise Item 1A read, when G7's change list is the whole question.
  • Off-Balance-Sheet Commitments Audit — when the capital-structure section leaves you wanting the committed-but-unrecorded side.