A sweep for companies whose own filings name the US–Canada trade breakdown as a cost, a risk or a change in their business. It finds the filers that name Canada, drops the boilerplate, sorts each one into the way it is exposed, pulls whatever numbers the filer has disclosed, and says who started saying it recently. Built for analysts and portfolio managers repositioning a book, for corporate development and procurement teams checking counterparties, and for anyone who needs to answer "which of these names does this actually touch?" from the record instead of from headlines.
Why this works with edgar.tools MCP
Every issuer that is materially exposed to the new tariffs has to say so in its 10-Q, 10-K or earnings 8-K, and the good ones say exactly how: a 50% duty on a named product line, a refund receivable, an impairment, a USMCA qualification they depend on. A vanilla LLM asked "which companies are exposed to Canada tariffs?" answers from sector intuition (autos, lumber, steel) and cannot tell the company that just booked a charge from the one that pasted a generic risk factor.
With edgar.tools MCP the sweep reads the record directly:
search_filings— full-text search since 2001. Canada-specific filing phrases find the filers.group_by: "first_mention"answers "who is newly talking about this?" for up to 25 companies per call.disclosure_search— searches the XBRL financial-statement notes. This is where the numbers live: tariffs capitalized into inventory, IEEPA refund receivables, countervailing-duty deposit rates, impairments that cite duties.filing_section(mdna,risk_factors) — the narrative when the notes are silent, which is most of the time.material_events— the 8-K side: earnings releases (Item 2.02) and guidance changes that name tariffs.get_universe_membership— pulls the member CIKs of a saved universe, such as a Companies Hub screen for Canada-based registrants, or the user's own watchlist.
How to use
Copy the framework below into your Claude / ChatGPT / Gemini conversation. With edgar.tools MCP connected, the model will call the tools it needs. Then ask:
Run the Canada Trade Exposure sweep over the last six months of 10-Qs and 10-Ks.
Or scope it to your own book:
Run the Canada Trade Exposure sweep on my universe "Industrials core".
The framework (v1.0)
You are a trade-policy analyst. The user hands you either a window (discovery mode) or a set of companies (book mode). Your job is to produce a ranked table of companies whose own filings tie them to the US–Canada tariff dispute, with the type of exposure, the disclosed number if there is one, and when the company first raised it, so the user can decide which names to open first.
Non-negotiables
- Every row cites a filing accession and a verbatim quote of 40 words or fewer. Never add a company because its sector "should" be exposed.
- Boilerplate is not exposure. Blank-check companies (SPACs) and many small filers paste the same macro paragraph ("On February 1, 2025, the U.S. imposed a 25% tariff on imports from Canada and Mexico…"). A company whose only mention is a recital of the policy history, with no statement about its own business, is excluded and counted as boilerplate.
- Put a number in a row only when the filer disclosed it. Most filers do not quantify; "not quantified" is a finding, not a gap to fill with an estimate.
- Classify every row into exactly one exposure type (below). If you have not read enough to classify it, say unclassified rather than guessing.
- Say what you did not reach. If a search has more matches than you paged through, carry the count forward into the coverage line.
Search traps (measured, not hypothetical)
| Trap | What happens | Do this instead |
|---|---|---|
NEAR(tariffs, Canada, 10) | SEC search has no proximity operator: it runs as both terms at any distance (query_rewrite says so), which is far too broad | Use the Canada-specific phrase ladder below |
Bare "Section 338" | Mostly matches IRC §338(h)(10) tax elections in merger agreements | Use "Section 338 of the Tariff Act" |
"counter-tariffs" alone | Mostly generic risk-factor boilerplate that names no country | Only count it when it sits next to Canada, e.g. "Canadian counter-tariffs" |
"imports from Canada" alone | Also matches foreign trade cases, such as Israel's cannabis anti-dumping case against Canada | Read the snippet; the US must be the importing country |
Phrase ladder (Canada-specific)
Run each rung as its own search_filings query so you know which phrase found which company:
"Section 338 of the Tariff Act": the July 20, 2026 proclamations (a 50% duty on targeted Canadian-origin goods)"tariffs on Canadian"OR"Canadian-origin""imports from Canada""Canadian counter-tariffs"OR"retaliatory tariffs imposed by Canada""USMCA-compliant"OR"USMCA review"OR"CUSMA": exposure through the trade agreement itself (qualification, the July 2026 joint review)
Exposure types
| Type | What the filing says | Example shape |
|---|---|---|
| Canadian producer | Operations or mills in Canada selling into the US | Duty deposit rates on Canadian-origin lumber |
| Canadian input | A US business buying Canadian goods or components | "Our business has been negatively affected by these tariffs" |
| USMCA-dependent | Relies on USMCA/CUSMA qualification to avoid tariffs | "USMCA-compliant goods may be subject to new tariffs" |
| Retaliation target | US exports hit by Canadian counter-measures | Canadian counter-tariffs on the company's products |
| Refund / recovery | Booked a recovery of tariffs later ruled invalid (IEEPA) | A refund receivable or a cost-of-sales benefit |
Workflow (ordered, mandatory)
Step 1 — Build the candidate list
Book mode. If the user names a saved universe, call get_universe_membership({ universe_id }) and take its ciks. If they give tickers, resolve each one. For Canada-based registrants, the user builds a Companies Hub screen with Country = Canada, saves it as a universe, and you read it the same way. The thesis screener has no country filter, so the Companies Hub screen is the only way to express "based in Canada".
Discovery mode. Run the phrase ladder with search_filings({ q, forms: ["10-K", "10-Q"], date_from, date_to, size: 50 }), paging with from until results.length < size. Record total for each rung. De-duplicate by CIK and keep the most recent filing per company as its anchor.
In book mode, run the same ladder with ciks set to the universe (2 or more CIKs requires the Analyst tier), so the rung that hit is recorded for every member.
Step 2 — Drop boilerplate and false positives
Read each company's snippet. Exclude, and count by reason:
- SPAC / blank check. The name contains "Acquisition Corp", "Acquisition Co" or "Opportunity Vehicle", and the snippet is a policy recital.
- Macro recital. The text lists tariffs among general economic risks, with no statement about the company's own costs, supply, customers or operations.
- Wrong direction. A non-US country's trade action against Canada.
Step 3 — Who is newly talking about it
Call search_filings({ q: "\"imports from Canada\"" , ciks: <≤25 survivors>, forms: ["10-K", "10-Q"], group_by: "first_mention" }), batching by 25. Record first_seen per company. A first mention in the last two quarters is a new exposure. no_mention_in_window means that phrase never appeared; it does not mean no exposure, since the company may have been found by a different rung.
Step 4 — Pull the numbers (up to 15 companies)
For each surviving company, in order of most recent filing, call disclosure_search({ company: <cik>, query: "tariffs", form: "10-Q", passages: 1 }). If that misses, retry with query: "duties". The notes are where amounts live: inventory capitalization, refund receivables, deposit rates, impairments. Record each amount with the sentence it came from.
A miss in the notes is common. Kadant's 10-Q states that tariffs hurt its business but carries no tariff language in any note. When the notes miss, call filing_section({ accession: <anchor>, section: "mdna" }) and read for the tariff paragraph. Stop at 15 companies and list the rest as NOT QUANTIFIED — NOT READ.
Step 5 — The 8-K side (top 10 only)
For the ten highest-ranked rows, call material_events({ company: <cik>, item: "2.02", days: 120 }) and check the latest earnings release for tariff language in guidance. An earnings deck that names a specific tariff action and its effective date (for example "Section 338 Tariff … taking effect August 19, 2026") beats a 10-Q risk factor as evidence of management attention.
Step 6 — Classify, rank and present
Rank by: disclosed number (largest first), then new exposures, then exposure type in the order Canadian producer → Canadian input → USMCA-dependent → retaliation target → refund/recovery, then recency of the anchor filing.
Canada Trade Exposure · [discovery window | universe name]
Coverage: [rungs run] · [filings read] of [filings matched] · [companies quantified] of [survivors]
[N] companies · excluded: [a] SPAC boilerplate · [b] macro recital · [c] wrong direction
RANK · COMPANY · TYPE · WHAT THE FILING SAYS (≤40 words, quoted) · DISCLOSED NUMBER · FIRST MENTION · NEW? · ANCHOR FILING
NOT QUANTIFIED — NOT READ ([count])
company · rung that found it · anchor filing
WATCH
- The phrases to put on a Keyword Sentinel for this set (see below)Close with a WATCH block. The user can keep this list current by creating a Keyword Sentinel on edgar.tools with the rung phrases that found companies, scoped to the surviving names. Give the exact phrases. Do not claim to have created the sentinel.
Stopping conditions
- If discovery mode would read fewer than half the matched filings on the first two rungs, stop and offer a narrower window before Step 4.
- If a company is a Canadian 40-F filer, its annual report cannot be read by section here. Say so, and read its latest 6-K instead via
search_filings({ ciks: [cik], forms: ["6-K"] }). - If the user asks about a sector rather than Canada ("steel tariffs"), this is the wrong recipe. Run
search_filingswith the tariff concept and the sector's terms directly.
What MCP-grounded Canada Trade Exposure adds
| Element | Without MCP | With MCP |
|---|---|---|
| Who is exposed | Sector guesses (autos, lumber, steel) | search_filings on Canada-specific filing language, one rung at a time |
| Boilerplate vs real exposure | Indistinguishable | Snippet read + explicit SPAC / recital exclusions |
| The numbers | Invented or absent | disclosure_search over the notes: deposits, receivables, impairments |
| New vs long-standing | Unknown | group_by: "first_mention" per company |
| Management attention | Headlines | material_events 2.02 — the earnings deck's own tariff slide |
Sample output structure
A discovery run over 10-Q and 10-K filings from March through September 2026 looks like the preview below.
Canada Trade Exposure · 10-K / 10-Q · 2026-03-01 → 2026-09-25
Coverage: rungs 3–5 run corpus-wide, rung 1 on four names · 40 of 100+ rung-3 matches read · 2 of 11 companies quantified (a deliberately partial preview) 11 companies · excluded: 8 SPAC boilerplate · ~20 macro recitals (a first pass that included bare "counter-tariffs", the trap in the table above) · 1 wrong direction (Israeli anti-dumping case on Canadian cannabis)
| # | Company | Type | What the filing says | Disclosed number | First mention | New? | Anchor |
|---|---|---|---|---|---|---|---|
| 1 | Domtar Corp | Canadian producer | Countervailing and anti-dumping duties on "Canadian-origin softwood lumber products"; impairments driven by "weaker demand, increased duties and tariffs" | CVD deposit 14.63%, AD deposit 20.53% (current); preliminary 7th-review rates 11.70% / 13.25% | — | — | 10-Q 2026-08-14 |
| 2 | Kadant Inc | Canadian input | "In July 2026, the United States imposed tariffs of 50% on certain imports from Canada under Section 338 of the Tariff Act of 1930. Our business has been negatively affected by these tariffs" | Not quantified in the notes; open MD&A | 2025-05-07 | — | 10-Q 2026-08-12 |
| 3 | MasterBrand, Inc. | Canadian input | Earnings deck: "Section 338 Tariff – Tariffs on certain Canadian imports, taking effect August 19, 2026, imposing an additional 50% duty" | Not read | 2026-05-06 | Yes | 8-K 2026-08-04 |
| 4 | Textron Inc | USMCA-dependent | Relies on "rules of the United States-Mexico-Canada Agreement for preferential treatment on tariffs imposed by the U.S. on imports from Canada and Mexico" | Not read | 2026-02-11 | Yes | 10-Q 2026-07-28 |
| 5 | NCS Multistage Holdings | USMCA-dependent | "the United States did not agree to extend the USMCA for an additional term during the July 2026" joint review; measures "could affect USMCA-compliant goods" | Not read | — | — | 10-Q 2026-07-31 |
| 6 | El Pollo Loco Holdings | USMCA-dependent | "certain goods from Canada and Mexico, including USMCA-compliant goods, may be subject to new tariffs unless an exemption applies" | Not read | — | — | 10-Q 2026-08-07 |
| 7 | Imperial Oil Ltd | Canadian producer | "tariffs on certain imports from Canada … In response, Canada announced its own retaliatory tariffs" | Not read | — | — | 10-Q 2026-08-03 |
| 8 | CF Industries Holdings | unclassified | "tariffs on imports from Canada pursuant to the International Emergency Economic Powers Act (IEEPA)" | Not read | 2025-08-07 | — | 10-Q 2026-08-06 |
| 9 | Lindsay Corp | Canadian input | IEEPA tariffs "on imports from Canada, Mexico, China and other countries on certain materials involved in the Company's production of goods" | Not read | 2025-04-03 | — | 10-Q 2026-07-02 |
| 10 | Virco Mfg Corp | unclassified | IEEPA actions "included tariffs on imports from Canada, Mexico, and China, as well as higher tariffs on steel, aluminum, and certain manufactured goods, including furniture" | Not read | 2025-04-14 | — | 10-Q 2026-09-04 |
| 11 | Borealis Foods Inc. | unclassified | "Section 232 and Section 122 … Canadian counter-tariffs, the outcome of the CUSMA review process" | Not read | — | — | 10-K 2026-06-02 |
"—" in First mention: the Step 3 probe phrase ("imports from Canada") never appeared for that company, which found it on another rung, or the probe was not run.
WATCH
Keyword Sentinel phrases for this set: "Section 338 of the Tariff Act", "imports from Canada", "USMCA-compliant", "Canadian counter-tariffs". Scope it to the eleven names above. The next 10-Q cycle (early November) is when the August 19 duty first shows up in reported costs.
Sample captured 2026-09-25 from live calls on the linked filings. Steps 4–5 ran for Domtar and Kadant only. Kadant's notes carry no tariff language even though its 10-Q says tariffs hurt the business, which is why Step 4 falls back to MD&A.
Actual output will vary with the window and the book; this shows the structure the sweep produces when grounded in MCP.
Related
- Risk-Factor YoY Diff — for one company from the table: exactly what its Item 1A added about tariffs this year.
- Earnings Release Decoder — read the latest 2.02 of a top-ranked name for the guidance effect.
- 8-K Event Triager — watch the surviving names' 8-Ks after the sweep.