Track · Section 02

Insider Activity Interpreter — Read Form 4 Like a Watchlist, Not a Headline

Weekly Form 4/3/5 triage — strips mechanical noise (A/F/M/G + 10b5-1), ranks by role, flags clusters. Surfaces freshness when the pipeline lags.

A weekly workflow for triaging insider transactions across a watchlist. Most Form 4 filings are mechanical equity-comp settlements (grants, withholdings, 10b5-1 schedules) — informative as bookkeeping, useless as signal. The interpreter separates the discretionary slice from the mechanical noise, ranks by role, and flags clusters that should change your view on a name.

Why this works with edgar.tools MCP

Form 4 is unfiltered: every officer / director / 10% holder transaction lands in EDGAR within 2 business days. A vanilla "is there insider activity?" question to an LLM gets back the model's recollection of headline trades from training data (often years stale) and misses the actual cluster from yesterday.

Equally, a raw read of Form 4 traffic is dominated by mechanical events that look meaningful but aren't:

  • A (Award) — RSU vesting tranche, not a discretionary buy.
  • F (Withholding) — shares withheld to cover tax on a vesting, not a sale of conviction.
  • M / X (Exercise/Conversion) — option-to-share conversion, mechanically tied to award timing.
  • G (Gift) — typically charitable, no economic signal.
  • S under 10b5-1 — scheduled sale; the decision was made months ago, not this week.

The interpreter uses MCP to slice the discretionary signal out of the mechanical noise:

  • insider_activity — returns the merged set with role attribution (CEO/CFO/officer/director/10% holder), 10b5-1 flag, `net_value_discretionary` (open-market P + non-10b5-1 S only), and a `cluster` detector when 3+ insiders trade in the same direction within ~7 days.
  • material_events — the 8-K context. A sales cluster the same week as an Item 5.02 (executive departure) reads differently than the same cluster in an event-free window.
  • Freshness signalis_stale, freshness_lag_days, consumer_warning. Insider parquets can lag the SEC by hours; the interpreter must check freshness before drawing conclusions.

How to use

Copy the framework below into your Claude / ChatGPT / Gemini conversation. With edgar.tools MCP connected, the model will pull insider data for each ticker and apply the discretionary filter. Then ask:

Run the Insider Activity Interpreter on [TICKER] for the last 90 days.

Or for a watchlist: "Run the Insider Activity Interpreter on [TICKER1], [TICKER2], [TICKER3] for the last 30 days. Rank by which one I should look at first."

Prompt — paste this into Claude, ChatGPT, or Gemini

The framework (v1.0)

You are a buy-side analyst on Monday morning reading the week's Form 4 traffic across a watchlist. Your job is to separate signal from mechanical noise and produce a one-page brief that names the 1-3 tickers where insider activity should actually change your priors.

Non-negotiables

  • Every claim references a specific transaction (owner, date, code, shares × price).
  • Mechanical activity (A / F / M / X / G codes; S under 10b5-1) is reported but not interpreted as signal.
  • Cluster detection (3+ insiders, same direction, ~7-day window) is the highest-signal pattern; surface it whenever summary.cluster is non-null.
  • If is_stale: true or freshness_lag_days > 3, lead with that and demote confidence accordingly.
  • "Net buying" or "net selling" claims must reference net_value_discretionary (informational), not net_value (includes mechanical).

Workflow (ordered, mandatory)

Step 1 — Pull each ticker

For every ticker in scope, call insider_activity({ company: "[TICKER]", days: <window>, limit: 50 }). Default window is 90 days; tighten to 30 if you're doing a weekly review.

Step 2 — Check freshness first

Before reading any transaction, check the response's data_quality block:

  • is_stale: true or freshness_lag_days > 3report the gap explicitly. Don't pretend the absence of recent transactions means there were none; it may mean the pipeline hasn't refreshed.
  • consumer_warning field present → echo it in your output. The MCP layer pre-formats the disclaimer; surface it rather than rewriting.

If every ticker on the watchlist is stale, stop the interpreter and recommend rerunning later.

Step 3 — Triage each ticker

For each ticker's response, evaluate in this exact order:

  1. Cluster check. summary.cluster non-null? If yes, this is the headline:
    • Direction (buy / sell)
    • Size (number of insiders)
    • Date range (compactness — a 6-person sale across 7 days reads stronger than across 30 days)
    • all_under_10b5_1 — if true, demote to "scheduled cluster" (still notable but not opportunistic).
    • Role mix — officer_count + director_count. CEO+CFO in the cluster is the strongest version.
  2. Discretionary net. Read summary.net_value_discretionary (NOT net_value). This is open-market P (buys) + non-10b5-1 S (sells). A discretionary net near zero with a large net_value means the action is mechanical — useful to not misread as conviction.
  3. Most recent open-market buy. summary.most_recent_open_market_buy — a date even outside the lookback window. P-coded purchases are structurally rare (a few per issuer per year max); "last open-market buy was 3 years ago" is itself signal when combined with a current sell cluster.
  4. Role-weighted attention. Walk the transactions[] array. Rank by role weight:
    • CEO / CFO discretionary trade: top tier.
    • Other officer (COO, CRO, GC) discretionary trade: second tier.
    • Director discretionary trade: third tier.
    • 10% holder discretionary trade: noted but often portfolio-driven, not company-specific.
  5. Pct-position-changed. pct_position_changed on each row — a 5% position trim by an officer is meaningfully different from a 50% trim. Officers who sell >25% of their position in one transaction warrant individual mention.

Step 4 — Cross-reference with material events

For any ticker where a cluster or top-role trade fired, call material_events({ company: "[TICKER]", days: 30 }) and check for adjacent 8-Ks. Common pairings:

  • Sale cluster + Item 5.02 (executive departure): the cluster may be the departing officer plus colleagues taking the opportunity.
  • Buy cluster + Item 8.01 (earnings preannounce, new contract): the buy may be a pre-announcement vote of confidence (note: this is the SEC's exact reason for Section 16 — they're betting on it).
  • Sale cluster + recent guidance cut (8-K 8.01 or 2.02): bearish — they're selling the post-cut weakness.
  • Sale cluster with NO adjacent event: portfolio-management or scheduled; lower signal.

Step 5 — Rank the watchlist

Produce a ranked list across the tickers reviewed:

  • Tier 1 — Look at this today. Cluster + top-role + discretionary + no 10b5-1 + paired with material event (or no paired event, which is itself notable for a buy).
  • Tier 2 — Worth a glance this week. Strong individual trades by an officer (>25% position) OR a multi-insider but partially-10b5-1 cluster.
  • Tier 3 — Mechanical/noise. Activity exists but is dominated by A / F / M / G codes, or net_value_discretionary ≈ 0.
  • Tier 4 — No signal. No transactions or all stale.

Required output

Produce a watchlist brief in this exact shape:

INSIDER ACTIVITY INTERPRETER — Watchlist Review
Window: [N] days (YYYY-MM-DD to YYYY-MM-DD)
Tickers reviewed: [N]
Data freshness: [is_stale per ticker, named if any are stale]

TIER 1 — LOOK TODAY ([N] tickers)
  [TICKER] — [Cluster/Officer-event description]
    Trades: [N] insiders, [direction], [size in $ or shares]
    Role mix: [CEO/CFO/officer/director/holder counts]
    Discretionary net: $X (vs reported net $Y)
    Paired event: [8-K item code + date, or "none — proactive"]
    Last open-market buy: [date or "never recorded"]
    Read: [1-2 sentences — what this signals]

TIER 2 — WORTH A GLANCE ([N] tickers)
  [TICKER] — [one-line summary]
    [key numbers]

TIER 3 — MECHANICAL ([N] tickers)
  [TICKER] — Activity dominated by [A/F/M/G/10b5-1]; discretionary net ~$0

TIER 4 — NO SIGNAL ([N] tickers)
  [TICKER1], [TICKER2], ...

CONFIDENCE: High / Medium / Low
  [Caveats — e.g., "ELF data 4d stale; figures reflect pipeline_as_of"]

Stopping conditions

  • If every ticker returns is_stale: true and freshness_lag_days > 7, stop. The pipeline is in a degraded state; recommend rerunning later or escalating.
  • If a ticker returns total_transactions: 0 (no insider data ever), it's likely a smaller reporting company without Section 16 filers. Mark Tier 4.
  • If a single ticker returns a >10-person cluster, this is unusual — verify against the SEC EDGAR full-text search for that company before reporting (large clusters can be data artifacts).
Then askRun this on NVDA.

What MCP-grounded interpretation adds

Workflow elementWithout MCPWith MCP
Form 4 traffic for a watchlistHeadlines the model remembers, often staleinsider_activity returns merged Form 3/4/5 with T+1 freshness
Mechanical-vs-discretionary splitThe LLM treats every "sale" as bearishnet_value_discretionary already strips A/F/M/G/10b5-1
Role attributionGeneric "an insider sold"role field per transaction; CEO/CFO/officer/director/holder
Cluster detectionManualsummary.cluster flags 3+ insiders, same direction, ≤7 days
Freshness signalHiddenis_stale + freshness_lag_days + consumer_warning
8-K pairingHand-correlatedmaterial_events returns 30-day item codes for cross-reference

The interpreter is the recipe most worth running on a Monday morning across a watchlist — that's where you have the most names to triage with the least patience for boilerplate.

Sample output structure

A complete interpreter run on NVDA alone (NVIDIA, 90-day window through 2026-05-26) — a megacap with active insider activity including a coordinated officer/director sales cluster — looks like the preview below.

Sample LLM output — what FORGE returnsPreview

Insider Activity Interpreter — NVDA

Window: 90 days (2026-02-26 to 2026-05-26) Tickers reviewed: 1 (NVDA) Data freshness: pipeline_as_of: 2026-05-22 · freshness_lag_days: 4 · is_stale: true — counts may understate the last 48 hours of Form 4 traffic.

Tier 1 — Look today

NVDA — Coordinated sales cluster across CFO + 2 directors + 3 senior officers

  • Trades: 6 insiders, sells, ~$295M aggregate over 2026-03-13 to 2026-03-20
  • Role mix: 3 officers (incl. CFO, Principal Accounting Officer, EVP Worldwide Field Ops) + 3 directors
  • Discretionary net: -$163.7M (vs reported net_value -$294.8M — the gap is the mechanical / 10b5-1 portion)
  • all_under_10b5_1: false — opportunistic, not scheduled
  • Paired event: none in the 30-day window. No 8-K Item 5.02 (departures), no 8-K 8.01 (guidance / negotiated transactions).
  • Last open-market buy: 2020-12-03 — over 5 years ago. NVDA insiders have not bought open-market in the entire AI-cycle run; this is a sustained distribution pattern.
  • Read: A 6-person opportunistic cluster including the CFO, with no paired departure or warning event, against a 5+ year drought of open-market buys. Doesn't change the bull thesis on the company, but the distribution pattern is consistent — the people closest to the numbers prefer cash to stock here.

Tier 2 — Worth a glance

None.

Tier 3 — Mechanical

None this window.

Tier 4 — No signal

None.

Confidence: Medium Data 4 days stale (within the soft threshold). Cluster verified against direct EDGAR for Mark Stevens (director, 2026-03-20 sales totaling 221,682 shares) — counts match. The "last open-market buy 2020-12-03" datapoint is structural; verify with most_recent_open_market_buy returned in summary rather than treating as a research claim.

Actual output varies: a watchlist of 5-10 tickers will typically have 0-1 Tier 1, 1-3 Tier 2, and the bulk in Tier 3 (mechanical) or Tier 4 (no signal). A week with zero Tier 1 names across the watchlist is normal.

  • 8-K Event Triager — pair this with the triager: insider clusters paired with 8-K item 5.02 (departures) is the strongest joint signal.
  • 10-K Speedrun — when a Tier 1 cluster fires on a name you don't know well, do the speedrun before deciding what to do with the signal.
  • F.O.R.G.E. Framework — when sustained insider selling against a "compounder" thesis is the question, run FORGE; the SBC-aware lens often confirms or refutes what the Form 4 stream is telling you.