AgentStack
MCP verified MIT Self-run

OpenInsider MCP

mcp-btopn-openinsider-mcp · by btopn

MCP server that exposes live insider trading data to any LLM.

No reviews yet
0 installs
8 views
0.0% view→install

Install

$ agentstack add mcp-btopn-openinsider-mcp

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of OpenInsider MCP? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

OpenInsider MCP

[](https://www.npmjs.com/package/openinsider-mcp) [](https://www.npmjs.com/package/openinsider-mcp) [](https://github.com/btopn/OpenInsider-MCP/actions/workflows/ci.yml) [](LICENSE) [](https://buymeacoffee.com/btopn)

An MCP server that exposes 16 free-data investment-research signals to any MCP-compatible LLM client — Form 4 insider trades, SEC corporate-event filings, FINRA / SEC short data, and live Yahoo Finance quotes. Drop it into your MCP client (Cursor, Claude Desktop, VS Code, Claude Code, Codex, etc.) and your LLM can query these signals directly during long research sessions, without burning context on web browsing.

The server exposes 16 tools across four free public data sources: OpenInsider (Form 4 insider trades), SEC EDGAR (8-K material events, late-filing notices, 13D activist filings, S-3 / 424B5 dilution), FINRA / SEC (short interest, daily short volume, failures-to-deliver), and Yahoo Finance (live quote: price, valuation, dividend, earnings calendar).

The server is positioned as a pure data layer: no scoring, no compositing, no editorialization. Each tool returns clean, well-typed observations with citations and gotchas baked into the tool descriptions. The orchestrator LLM decides what is significant.

What it won't do: recommend buys / sells, combine signals into a score, run scheduled jobs, or persist anything between sessions. The MCP gives your LLM raw observations; you and the LLM reason from there.

> Be polite. This scrapes a free public site and uses public SEC / FINRA / Yahoo endpoints. The server identifies itself with a User-Agent (override via OPENINSIDER_MCP_UA env var) and caches every response in memory for 5 minutes (60 seconds for Yahoo Finance quotes, which are time-sensitive). Repeated queries in a research session don't re-fetch.

Install

OpenInsider MCP is a stdio server distributed on npm — pick your client below.

[](cursor://anysphere.cursor-deeplink/mcp/install?name=openinsider&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm9wZW5pbnNpZGVyLW1jcCJdfQ%3D%3D) [](https://insiders.vscode.dev/redirect/mcp/install?name=openinsider&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22openinsider-mcp%22%5D%7D)

Claude Code (CLI)

claude mcp add openinsider -- npx -y openinsider-mcp

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "openinsider": {
      "command": "npx",
      "args": ["-y", "openinsider-mcp"]
    }
  }
}

Restart Claude Desktop after saving.

Codex CLI (OpenAI)

codex mcp add openinsider -- npx -y openinsider-mcp

Or edit ~/.codex/config.toml directly:

[mcp_servers.openinsider]
command = "npx"
args = ["-y", "openinsider-mcp"]

Other MCP clients (Windsurf, Cline, Continue, Zed, …)

Most clients share the same generic stdio config — paste this into your client's MCP config (path varies by client; check their docs):

{
  "mcpServers": {
    "openinsider": {
      "command": "npx",
      "args": ["-y", "openinsider-mcp"]
    }
  }
}

That's it — npx fetches and runs the server on demand.

Quick start. Once installed, ask your LLM something like "What's recent insider activity at NVDA?" — it calls search_by_ticker and returns the last 90 days of Form 4 filings. Follow up with "Why did Mark Stevens sell on March 20?" and your LLM pulls the relevant 8-K via recent_sec_filings. The in-memory cache makes follow-ups instant.

How to talk to it

You don't call these tools directly — your LLM does, based on what you ask. Representative prompts:

Single-source:

  • "What's recent insider activity at NVDA?"search_by_ticker
  • "Are there any notable cluster buys this week?"cluster_buys
  • "What happened with NVDA recently?"recent_sec_filings (8-K item codes)
  • "Is BIOX raising money?"dilution_filings (S-3 / 424B5 takedowns)
  • "How heavily is GME shorted? Is short interest rising?"short_interest (with delta and pctOfFloat)
  • "Is shorting picking up on TICKER lately?"daily_short_volume (daily flow, not standing position)
  • "What's AAPL trading at right now?"get_quote (price + valuation + dividend in one call)

Multi-tool (the LLM composes these automatically):

  • "Is TICKER a short squeeze setup?"short_interest + failures_to_deliver + search_by_ticker
  • "Why did TICKER drop today?"recent_sec_filings + dilution_filings + search_by_ticker
  • "How does TICKER's valuation compare to its insider activity?"get_quote (P/E, market cap) + search_by_ticker (recent insider buys/sells)

The more specific the question, the better the tool selection. See the [Quick reference](#quick-reference-which-tool-answers-what) table below for the full mapping.

Quick reference: which tool answers what?

| Question | Tool | Output type | |---|---|---| | Insider trades for one company | search_by_ticker | Trade[] | | One insider's trades across companies | search_by_insider | Trade[] | | Market-wide insider firehose | latest_trades | Trade[] | | Biggest insider buys/sells per period | top_buys, top_sells | Trade[] | | Multiple insiders buying same name | cluster_buys | Trade[] (with industry, insiderCount) | | Officer buys ≥$25k | officer_buys | Trade[] | | Custom multi-filter screener | screen | Trade[] | | Recent 8-K material events | recent_sec_filings | EdgarFiling[] | | NT-10K / NT-10Q late-filing notices | late_filings | EdgarFiling[] | | Schedule 13D activist filings | activist_filings | EdgarFiling[] | | S-3 / 424B5 dilution / shelf takedowns | dilution_filings | EdgarFiling[] | | Bi-monthly short interest snapshot + delta + % of shares | short_interest | ShortSnapshot[] | | Daily short-sale flow (different from above!) | daily_short_volume | {date, shortVolume, totalVolume, shortRatio}[] | | SEC failures-to-deliver + Reg SHO threshold list | failures_to_deliver | {date, ftdShares, ftdValue, onThresholdList}[] | | Live stock quote (price, valuation, dividend, earnings) | get_quote | Quote |

Tool reference

Each tool returns JSON with a typed payload. OpenInsider tools return { count, trades: Trade[] }; SEC EDGAR tools return { count, filings: EdgarFiling[] }; FINRA / SEC short-data tools return { count, snapshots: ShortSnapshot[] } or { count, rows: ... } depending on cadence; Yahoo Finance returns a single Quote object (no array, no count). See [output types](#trade-object) below for the exact field shapes.

OpenInsider — Form 4 insider trades

search_by_ticker

All insider trades for one company.

| Param | Type | Required | Notes | |---|---|---|---| | ticker | string | yes | Stock symbol, e.g. "NVDA". Case-insensitive. | | daysBack | int | no | Only return trades filed within the last N days. |

Example call:

{ "ticker": "NVDA", "daysBack": 90 }
search_by_insider

All trades by a specific insider across all companies, identified by their SEC CIK.

| Param | Type | Required | Notes | |---|---|---|---| | cik | string | yes | Numeric SEC CIK of the insider. See [Finding a CIK](#finding-a-cik) below. | | daysBack | int | no | Filter by filing date. |

Example call:

{ "cik": "1214156", "daysBack": 365 }
latest_trades

Most recent insider filings across the whole market — the live firehose.

| Param | Type | Notes | |---|---|---| | daysBack | int (optional) | | | transactionType | "all" \| "buys" \| "sells" (optional) | "buys" keeps only P- rows, "sells" keeps S- rows. |

Use when: you want a market-wide pulse. Pair with daysBack: 1 to see what was filed today.

top_buys

Largest insider purchases by dollar value over a fixed window.

| Param | Type | Notes | |---|---|---| | period | "day" \| "week" \| "month" \| "quarter" \| "year" | Required. |

Example call:

{ "period": "week" }
top_sells

Largest insider sales by dollar value over a fixed window. Same period argument as top_buys.

> Note: most large sales are routine 10b5-1 plans or option exercises. The signal in top_sells is usually pattern (multiple insiders, late filings) more than absolute size. cluster_buys has historically been the higher-signal page.

cluster_buys

Companies where multiple insiders bought stock in a short window. The strongest open-market signal on OpenInsider.

| Param | Type | Notes | |---|---|---| | daysBack | int (optional) | |

Trades returned by this tool include two extra fields: industry (SIC industry name) and insiderCount (how many insiders are clustered).

officer_buys

Recent purchases of ≥$25k by company officers (CEO, CFO, COO, etc.). Filters out 10%-owner buys, which are often institutional and lower-signal.

| Param | Type | Notes | |---|---|---| | daysBack | int (optional) | |

screen

Generic OpenInsider screener with flexible filters. Use this when none of the named tools fit.

| Param | Type | Notes | |---|---|---| | ticker | string | Filter to one symbol. | | insiderCik | string | Filter to one insider by CIK. | | daysBack | int | | | transactionTypes | Array | Applied client-side after fetch. See [transaction codes](#transaction-codes). | | minTradeValue / maxTradeValue | number (USD) | Trade value range. | | minPrice / maxPrice | number (USD) | Per-share price range. | | isCeo, isCfo, isDirector, isOfficer, isTenPercentOwner | boolean | Role filters. | | excludeDerivativeRelated | boolean | Hide option-exercise / award-related rows. | | limit | int | Max rows (capped at 1000). |

Example call — CEO open-market buys over $500k in the last 30 days:

{
  "isCeo": true,
  "transactionTypes": ["P"],
  "minTradeValue": 500000,
  "daysBack": 30
}

SEC EDGAR — corporate event filings

These four tools are ticker-scoped and source from the SEC EDGAR submissions API plus filing-body parsing. They return EdgarFiling[].

recent_sec_filings

Recent 8-K material event filings for a ticker, with parsed item codes (e.g. 1.02 contract terminated, 4.02 restatement, 5.02 officer change, 2.06 impairment).

| Param | Type | Notes | |---|---|---| | ticker | string | yes | | daysBack | int (optional) | default 30 | | itemCodes | string[] (optional) | filter to specific 8-K items, e.g. ["4.02", "5.02"] |

late_filings

NT-10K / NT-10Q late filing notices, with parsed reason text and a heuristic category (accounting / corporate / multiple / unspecified). Accounting reasons are the strongest bearish variant.

| Param | Type | Notes | |---|---|---| | ticker | string | yes | | daysBack | int (optional) | default 365 |

activist_filings

Schedule 13D activist filings (initial + amendments). Returns filer name, ownership pct, and Item 4 'Purpose of Transaction' excerpt when parseable.

| Param | Type | Notes | |---|---|---| | ticker | string | yes | | daysBack | int (optional) | default 365 | | includeAmendments | bool (optional) | default true |

dilution_filings

S-3 shelf registrations and 424B5 takedowns, with parsed shelf amount and use-of-proceeds excerpt.

| Param | Type | Notes | |---|---|---| | ticker | string | yes | | daysBack | int (optional) | default 365 |

FINRA / SEC — short interest, volume, FTD

These three tools are ticker-scoped and source from FINRA's CDN plus SEC bi-monthly FTD files.

short_interest

FINRA bi-monthly short interest snapshots with delta vs prior period. Returns ShortSnapshot[].

| Param | Type | Notes | |---|---|---| | ticker | string | yes | | periodsBack | int (optional) | default 6 (~3 months of bi-monthly periods) |

> Bi-monthly cadence: settlement on 15th + last business day, published ~7 business days later — most recent snapshot may lag spot price by 1-2 weeks.

daily_short_volume

FINRA Reg SHO daily short-sale volume — daily flow (not standing position; for that, use short_interest). Aggregated across CNMS, FNRA, FNYX, FNQC venues. Returns {date, shortVolume, totalVolume, shortRatio}[].

| Param | Type | Notes | |---|---|---| | ticker | string | yes | | daysBack | int (optional) | default 30 |

failures_to_deliver

SEC failures-to-deliver per bi-monthly period plus current Reg SHO threshold-list flag (>10K shares + >0.5% of TSO failed for 5 consecutive settlement days). Returns {date, ftdShares, ftdValue, onThresholdList}[].

| Param | Type | Notes | |---|---|---| | ticker | string | yes | | periodsBack | int (optional) | default 4 (~2 months) |

> ETF FTDs are largely market-maker operational; post-T+1 settlement (May 2024) aggregate FTD volumes have decreased. Interpret with caution.

Yahoo Finance — live stock quote

Single tool, single round-trip per ticker. Sourced by scraping the structured JSON Yahoo embeds in its public HTML quote page (the same page your browser loads at finance.yahoo.com/quote//). No api keys, no auth, no third-party brokers — direct fetch from your machine to Yahoo's web frontend.

get_quote

Live stock quote for a ticker — price, previous close, 52-week range, today's volume + 3-month average volume, market cap, beta, trailing/forward P/E, dividend yield, ex-dividend date, next earnings date, currency, exchange, ISO timestamp.

| Param | Type | Required | Notes | |---|---|---|---| | ticker | string | yes | Stock ticker, e.g. "AAPL", "BRK.B" (normalized to "BRK-B"). Case-insensitive. Must match /^[A-Z0-9.\-]{1,10}$/ after normalization; tickers with other characters are rejected. |

Example call:

{ "ticker": "AAPL" }

The tool throws a clean ticker not found error for tickers that don't resolve, and a generic Yahoo Finance: error response for when Yahoo returns an error (Yahoo's verbatim error text is intentionally not passed through, as a prompt-injection defense in an LLM tool surface).

Trade object

OpenInsider tools return { count, trades: Trade[] }. Key fields: filingDate / tradeDate (ISO), ticker, insiderName, insiderCik, title, transactionType (SEC code + label like "P - Purchase"), price, quantity (signed), value (signed), formUrl. cluster_buys adds industry + insiderCount.

Full Trade type definition

{
  filingDate:        string;          // ISO 8601, with time, e.g. "2026-04-24T21:35:59"
  tradeDate:         string;          // ISO 8601 date, e.g. "2026-04-22"
  ticker:            string;
  companyName:       string;
  insiderName:       string;
  insiderCik:        string | null;   // SEC CIK of the insider, when present
  title:             string;          // role(s), e.g. "CEO", "Dir", "10%", "CEO, Pres"
  transactionType:   string;          // SEC code + label, e.g. "P - Purchase", "S - Sale+OE"
  price:             number | null;   // $/share, null on award/grant rows
  quantity:          number;          // signed: positive = acquired, negative = disposed
  sharesOwnedAfter:  number | null;
  ownershipDelta:    number | null;   // % change in stake, signed (e.g. -10 means -10%)
  value:             number;          // signed dollar value (matches quantity sign)
  formUrl:           string | null;   // direct link to the SEC Form 4 XML
  industry?:         string;          // cluster_buys only
  insiderCount?:     number;          // cluster_buys only — how many insiders clustered
}

Transaction codes

The transactionType string is the SEC's two-character code plus its label. Common ones:

| Code | Meaning | Signal | |---|---|---| | P | Open-market purchase | Strongest bullish signal — insider used real cash. | | S | Open-market sale | Sell signal, but often diluted by 10b5-1 plans. | | S - Sale+OE | Sale tied to an opti

Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.