anthropics/edgartools-sec-data
How to pull SEC EDGAR data with the edgartools Python package — company lookup, filings, XBRL financial statements, and filing sections like Item 1A risk factors. Use whenever a task involves SEC filings, 10-K/10-Q data, or company financials.
npx skills add https://github.com/anthropics/cwc-workshops --skill edgartools-sec-data
edgartools is the desk's standard way to read SEC data. It is preinstalled in your environment. Work in Python (a script or python -c), not by fetching sec.gov pages by hand.
The SEC requires a contact identity on automated requests. Do this before any other call, every session:
from edgar import set_identity
set_identity("Research Desk workshop [email protected]") # use the EDGAR_IDENTITY value you were given
(Equivalently, the EDGAR_IDENTITY environment variable, exported before running Python.)
from edgar import Company
company = Company("NVDA") # by ticker (or CIK)
company.name, company.cik, company.industry
filings = company.get_filings(form="10-K") # also "10-Q", "8-K", "DEF 14A", ...
latest_10k = filings.latest() # most recent of that form
latest_10q = company.get_filings(form="10-Q").latest()
latest_10k.form, latest_10k.filing_date, latest_10k.accession_no
Pick whichever of the latest 10-K / 10-Q is more recent when asked for "the most recent filing". Foreign private issuers file 20-F instead of 10-K.
filing = latest_10k
tenk = filing.obj() # rich object for 10-K/10-Q: sections, financials
# Sections (10-K item numbers; 10-Q uses Part/Item naming)
risk_factors = tenk["Item 1A"] # Risk Factors text
mda = tenk["Item 7"] # Management's Discussion & Analysis
business = tenk["Item 1"]
# Plain text of the whole filing if you need to search it
text = filing.text()
Sections are long — extract what you need rather than pasting whole sections into your reply.
financials = tenk.financials # also: company.get_financials() for the latest annual figures
income = financials.income_statement()
balance = financials.balance_sheet()
cashflow = financials.cashflow_statement()
These return tabular objects (pandas-friendly). Typical fields: total revenue, gross profit, operating income, net income, cash and equivalents, total debt, inventory, R&D expense. The same statement usually carries the prior period's column — use it for year-over-year comparisons instead of fetching another filing.
Consolidated revenue hides the story; the segment note is where concentration and regional shifts show up. Segment data lives in the financial-statement notes (ASC 280), not the primary statements:
# The segment/geography breakdown is a note, not a primary statement.
# Search the filing text for the segment note and read the tables around it.
text = filing.text()
for marker in ["Segment Information", "revenue by geographic", "Disaggregation of Revenue"]:
idx = text.find(marker)
if idx != -1:
print(text[idx : idx + 3000]) # the note's tables follow the heading
break
Report segment/geography revenue alongside the consolidated figure and call out: any region or segment that moved more than ~20% year over year, and any customer-concentration disclosure (usually phrased "one customer accounted for X% of revenue").
company.get_filings(form="10-K") is sorted; take the first two) and compare.company.get_filings(form="4") lists Form 4 insider transaction filings.dir(obj), help(obj)) or fall back to filing.text() and targeted searching, and note the fallback in your output.value / 1e6) and label them.Take anthropics/edgartools-sec-data from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.