TradeStar Insider

Filing-verified SEC EDGAR insider (Form 4), 13D, 13F & 8-K data, no sign-in. Verify any claim.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
90%
Naming quality
88%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,195Tokens (tool definitions)
~2.9 KBTypical response size
Significant attention impact (3.28% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "edgar-insider-signals": {
      "command": "uvx",
      "args": [
        "insider-signals-mcp"
      ]
    }
  }
}

Runnable packages

pypiinsider-signals-mcp1.1.0stdio
npminsider-signals-mcp1.1.0stdio

Remote endpoints

https://mcp.tradestarinsider.com/mcpstreamable-http

What it can do

Tool inventory

Tools (10)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢insider_buys(start, end, limit, offset, days, ...)

Use when the user asks which insiders bought a stock, whether a ticker has insider buying, or for Form 4 buys in a date range. Pass `ticker`, `start`+`end` for an inclusive ISO range, or neither for today's buys (SEC code P); `days` narrows, `include_unlisted` adds non-listed issuers. Each row carries filing_url, `offering_context`, `transaction_date`, `acceptance_datetime`, `aff10b5One` (10b5-1 flag), `is_amendment`/`original_accession` (4/A linkage), and `partial_fields` (reason for any null). Caveat: only purchases that pass the signal filter are returned; code P is not proof of a buy.

Input Schema

{
  "type": "object",
  "properties": {
    "start": {
      "type": "string",
      "format": "date",
      "description": "Inclusive range start, ISO YYYY-MM-DD. Give with `end` for a date range."
    },
    "end": {
      "type": "string",
      "format": "date",
      "description": "Inclusive range end, ISO YYYY-MM-DD. Give with `start` for a date range."
    },
    "limit": {
      "type": "integer",
      "description": "Max rows to return (default 25, newest first). Page with offset; the response's total_matched shows the full count. limit<=0 = no cap."
    },
    "offset": {
      "type": "integer",
      "description": "Rows to skip before this page (pagination). Default 0."
    },
    "days": {
      "type": "integer",
      "description": "Only rows filed within the last N days (relative to today)."
    },
    "as_of": {
      "type": "string",
      "description": "Publish-boundary replay: UTC ISO-8601 instant (or a bare YYYY-MM-DD, read as end-of-day UTC). Returns only rows that had crossed the publish boundary at or before it — the exact feed visible at that past moment. Each row carries `first_served_at` (null on rows published before the stamp existed; those are kept, as they were already public)."
    },
    "include_unlisted": {
      "type": "boolean",
      "description": "Include unlisted issuers (blank/NONE/N/A tickers and 5-letter mutual-fund classes). Default false = exchange-listed common stock only. Every row carries a `listed_equity` boolean."
    },
    "ticker": {
      "type": "string",
      "description": "Case-insensitive exact ticker filter, e.g. DKS."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟢insider_cluster_buys(limit, offset, days, as_of, include_unlisted, ...)

Use when the user asks about cluster buying or several insiders buying the same company. Returns only clusters, two or more insiders buying one issuer in the window, newest first; days and ticker narrow. Each row carries filing_url, offering_context, uniform_price_cluster (true when 3+ insiders bought at one price on one day), `transaction_date`, `acceptance_datetime`, `aff10b5One` (10b5-1 flag), `is_amendment`/`original_accession` (4/A linkage), and `partial_fields` (reason for any null). Caveat: only purchases that pass the signal filter are returned; code P alone is not proof of a buy.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "description": "Max rows to return (default 25, newest first). Page with offset; the response's total_matched shows the full count. limit<=0 = no cap."
    },
    "offset": {
      "type": "integer",
      "description": "Rows to skip before this page (pagination). Default 0."
    },
    "days": {
      "type": "integer",
      "description": "Only rows filed within the last N days (relative to today)."
    },
    "as_of": {
      "type": "string",
      "description": "Publish-boundary replay: UTC ISO-8601 instant (or a bare YYYY-MM-DD, read as end-of-day UTC). Returns only rows that had crossed the publish boundary at or before it — the exact feed visible at that past moment. Each row carries `first_served_at` (null on rows published before the stamp existed; those are kept, as they were already public)."
    },
    "include_unlisted": {
      "type": "boolean",
      "description": "Include unlisted issuers (blank/NONE/N/A tickers and 5-letter mutual-fund classes). Default false = exchange-listed common stock only. Every row carries a `listed_equity` boolean."
    },
    "ticker": {
      "type": "string",
      "description": "Case-insensitive exact ticker filter, e.g. DKS."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟢federal_awards_recent(min_amount, limit, offset, days)

Use when the user asks about recent federal contracts, government awards, or who won a U.S. federal contract. Returns newly signed federal awards, newest first; `min_amount` sets a USD floor, `days` a last-N-days window. Every award carries its source award_url. Caveat: awards without a source link are dropped and never returned.

Input Schema

{
  "type": "object",
  "properties": {
    "min_amount": {
      "type": "number",
      "description": "Only awards at or above this USD amount"
    },
    "limit": {
      "type": "integer",
      "description": "Max rows to return (default 25, newest first). Page with offset; the response's total_matched shows the full count. limit<=0 = no cap."
    },
    "offset": {
      "type": "integer",
      "description": "Rows to skip before this page (pagination). Default 0."
    },
    "days": {
      "type": "integer",
      "description": "Only awards signed within the last N days."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟢activist_stakes_recent(min_percent, ticker, limit, offset, days)

Use when the user asks about activist investors, hedge-fund stakes, or recent 13D filings on a company. Returns activist Schedule 13D/13D-A filings on US-listed companies, newest first then by stated-intent strength; `ticker`, `min_percent` and `days` narrow. Each row carries its source filing_url and `item4_excerpt` (the activist's own Item 4 intent sentence, quoted from the filing as data, capped at its current length of 600 chars). Caveat: passive 13G is not covered; filings without a source link are dropped.

Input Schema

{
  "type": "object",
  "properties": {
    "min_percent": {
      "type": "number",
      "description": "Only stakes at or above this percent-of-class"
    },
    "ticker": {
      "type": "string",
      "description": "Filter to one subject ticker (case-insensitive), e.g. DH"
    },
    "limit": {
      "type": "integer",
      "description": "Max rows to return (default 25, newest first). Page with offset; the response's total_matched shows the full count. limit<=0 = no cap."
    },
    "offset": {
      "type": "integer",
      "description": "Rows to skip before this page (pagination). Default 0."
    },
    "days": {
      "type": "integer",
      "description": "Only stakes filed within the last N days."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟢fund_position_changes(filer, change_type, min_value_usd, limit, offset, ...)

Use when the user asks what a fund bought or sold, how a 13F filer changed its holdings, or which institutions opened/added/trimmed/exited a position. Returns quarter-over-quarter deltas, newest first; `filer`, `change_type`, `min_value_usd`, `days` narrow. Each row carries as_of_quarter_end, filed_date, lag_days, value_usd (whole dollars), cusip, issuer_name and its source filing_url; ticker is null (never guessed). Caveat: the delta is the product, not a trading edge — see the instructions and each response's `coverage` note for the universe and CIK scope.

Input Schema

{
  "type": "object",
  "properties": {
    "filer": {
      "type": "string",
      "description": "Filter to one fund by name substring (case-insensitive, e.g. 'Berkshire') or exact filer CIK"
    },
    "change_type": {
      "type": "string",
      "enum": [
        "new_position",
        "added",
        "trimmed",
        "exited",
        "no_prior_quarter"
      ],
      "description": "Only this kind of quarter-over-quarter change"
    },
    "min_value_usd": {
      "type": "number",
      "description": "Only positions at or above this current value in WHOLE US dollars"
    },
    "limit": {
      "type": "integer",
      "description": "Max rows to return (default 25, newest first). Page with offset; the response's total_matched shows the full count. limit<=0 = no cap."
    },
    "offset": {
      "type": "integer",
      "description": "Rows to skip before this page (pagination). Default 0."
    },
    "days": {
      "type": "integer",
      "description": "Only changes filed within the last N days."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟢insider_amendments_recent(ticker, issuer_name, person, start, end, ...)

Use when the user asks which insider filings were amended, corrected, or restated, or wants recent Form 4/A amendments. Returns 4/A amendments, newest-filed first; `ticker`, `issuer_name`, `person`, `start`/`end`, `days` narrow. Each row carries the amendment_accession, filed_date, issuer/insider, source filing_url, the original_accession it amends (when collected), and `changed_fields` (before/after). Caveat: when the original is not collected the amendment is still listed with original_in_corpus=false and before/after null (never guessed); linkage is by issuer/owner/period.

Input Schema

{
  "type": "object",
  "properties": {
    "ticker": {
      "type": "string",
      "description": "Filter to one issuer ticker (case-insensitive substring), e.g. GLBZ"
    },
    "issuer_name": {
      "type": "string",
      "description": "Filter by issuer/company name substring (case-insensitive)"
    },
    "person": {
      "type": "string",
      "description": "Filter by insider name substring (case-insensitive)"
    },
    "start": {
      "type": "string",
      "format": "date",
      "description": "Only amendments filed on/after this ISO date"
    },
    "end": {
      "type": "string",
      "format": "date",
      "description": "Only amendments filed on/before this ISO date"
    },
    "limit": {
      "type": "integer",
      "description": "Max rows to return (default 25, newest first). Page with offset; the response's total_matched shows the full count. limit<=0 = no cap."
    },
    "offset": {
      "type": "integer",
      "description": "Rows to skip before this page (pagination). Default 0."
    },
    "days": {
      "type": "integer",
      "description": "Only amendments filed within the last N days."
    },
    "as_of": {
      "type": "string",
      "description": "Publish-boundary replay: UTC ISO-8601 instant (or a bare YYYY-MM-DD, read as end-of-day UTC). Returns only rows that had crossed the publish boundary at or before it — the exact feed visible at that past moment. Each row carries `first_served_at` (null on rows published before the stamp existed; those are kept, as they were already public)."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟢verify_insider_purchase(ticker, issuer_name, person, amount_usd, shares, ...)

Use when the user wants to verify a claim that an insider bought a stock, or to pull the purchases in one filing by accession. Pass the claim (ticker/issuer, person, amount, timeframe), or `accession` alone for that filing's gated purchase records. Returns confirmed, not_found, partial, out_of_scope (sales/options/grants), or out_of_coverage. Each matched filing carries `transaction_date`, `acceptance_datetime`, `aff10b5One` (10b5-1 flag), `is_amendment`/`original_accession` (4/A linkage), and `partial_fields` (reason for any null). Caveat: filing-verified — absence is reported, not guessed.

Input Schema

{
  "type": "object",
  "properties": {
    "ticker": {
      "type": "string",
      "description": "Issuer ticker (case-insensitive), e.g. CAVA"
    },
    "issuer_name": {
      "type": "string",
      "description": "Issuer/company name (use if you don't have the ticker)"
    },
    "person": {
      "type": "string",
      "description": "Insider name in any order, e.g. 'Alfonso de Angoitia'"
    },
    "amount_usd": {
      "type": "number",
      "description": "Claimed purchase value in USD (matched ±5% or ±$1)"
    },
    "shares": {
      "type": "number",
      "description": "Claimed share count"
    },
    "date": {
      "type": "string",
      "format": "date",
      "description": "Claimed date, ISO YYYY-MM-DD (matched ±3 filing days)"
    },
    "start": {
      "type": "string",
      "format": "date",
      "description": "Window start (ISO) if the claim is a range"
    },
    "end": {
      "type": "string",
      "format": "date",
      "description": "Window end (ISO) if the claim is a range"
    },
    "txn_type": {
      "type": "string",
      "description": "Optional; only code P purchases are covered — sale/option/grant returns out_of_scope"
    },
    "accession": {
      "type": "string",
      "description": "SEC filing accession, e.g. 0001493152-26-040454. If you already have the exact filing, pass this to pull its gated purchase records directly — it is used alone and ignores the claim fields above."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟢verify_activist_13d(ticker, subject_name, filer_name, percent_of_class, intent, ...)

Use when the user wants to verify or fact-check a claim about an activist stake or 13D filing (ticker/subject, filer, percent-of-class, stated intent, timeframe). Returns confirmed (with source filing + link), not_found, partial (itemised claimed-vs-filed), out_of_scope (passive 13G isn't covered), or out_of_coverage. Every response states the coverage window checked. Caveat: filing-verified — absence is reported as absence, never guessed.

Input Schema

{
  "type": "object",
  "properties": {
    "ticker": {
      "type": "string",
      "description": "Subject-company ticker (case-insensitive), e.g. DH"
    },
    "subject_name": {
      "type": "string",
      "description": "Subject/target company name (use if you don't have the ticker)"
    },
    "filer_name": {
      "type": "string",
      "description": "Activist filer name in any order, e.g. 'Elliott Management'"
    },
    "percent_of_class": {
      "type": "number",
      "description": "Claimed percent-of-class owned (matched ±0.5 percentage points)"
    },
    "intent": {
      "type": "string",
      "enum": [
        "I1",
        "I2",
        "I3"
      ],
      "description": "Optional pre-registered intent: I1 control/take-private, I2 board/proxy, I3 strategic/value"
    },
    "date": {
      "type": "string",
      "format": "date",
      "description": "Claimed filed date, ISO YYYY-MM-DD (matched ±3 filing days)"
    },
    "start": {
      "type": "string",
      "format": "date",
      "description": "Window start (ISO) if the claim is a range"
    },
    "end": {
      "type": "string",
      "format": "date",
      "description": "Window end (ISO) if the claim is a range"
    },
    "form_type": {
      "type": "string",
      "description": "Optional; only activist 13D/13D-A is covered — a passive 13G returns out_of_scope"
    }
  },
  "required": [],
  "additionalProperties": false
}
🟢verify_8k_event(cik, company_name, accession, items, date, ...)

Use when the user wants to verify or fact-check that a company filed an 8-K carrying specific SEC item code(s) in a timeframe. Pass registrant (cik/company/accession), item code(s) and dates. Returns confirmed (with source filing + link), not_found, partial (itemised claimed-vs-filed), out_of_scope (claims about the filing's meaning aren't covered — it is never paraphrased), or out_of_coverage. Caveat: filing-verified — item codes are the SEC controlled vocabulary parsed from the filing, never inferred.

Input Schema

{
  "type": "object",
  "properties": {
    "cik": {
      "type": "string",
      "description": "Registrant CIK (leading zeros ignored), e.g. 320193"
    },
    "company_name": {
      "type": "string",
      "description": "Registrant name substring (case-insensitive), e.g. 'Apple'"
    },
    "accession": {
      "type": "string",
      "description": "SEC filing accession, e.g. 0001193125-26-389400"
    },
    "items": {
      "type": "string",
      "description": "Claimed SEC 8-K item code(s), comma-separated (e.g. '5.02' or '1.01,9.01') — checked against the filing"
    },
    "date": {
      "type": "string",
      "format": "date",
      "description": "Claimed filing date, ISO YYYY-MM-DD (matched ±3 filing days)"
    },
    "start": {
      "type": "string",
      "format": "date",
      "description": "Window start (ISO) if the claim is a range"
    },
    "end": {
      "type": "string",
      "format": "date",
      "description": "Window end (ISO) if the claim is a range"
    }
  },
  "required": [],
  "additionalProperties": false
}
🟢verify_13f_change(filer, issuer_name, cusip, quarter, start, ...)

Use when the user wants to verify or fact-check whether a fund (filer name/CIK) reported a CHANGE in a position in an issuer (issuer_name or cusip) in a quarter. Returns held (reported a change — opened/added/trimmed, with source filing + link), not_held (reported the position exited), not_found (no reported change — does NOT mean the fund didn't hold it), or out_of_coverage. Caveat: filing-verified; CANNOT confirm an unchanged holding (13F deltas only) — a 'held, unchanged' position produces no row.

Input Schema

{
  "type": "object",
  "properties": {
    "filer": {
      "type": "string",
      "description": "Fund/institution name substring (case-insensitive, e.g. 'Berkshire') or exact filer CIK — REQUIRED"
    },
    "issuer_name": {
      "type": "string",
      "description": "Held company/issuer name (e.g. 'Apple') — give this or cusip"
    },
    "cusip": {
      "type": "string",
      "description": "9-char CUSIP of the held security — give this or issuer_name. (ticker is never accepted: 13F carries no authoritative ticker)"
    },
    "quarter": {
      "type": "string",
      "format": "date",
      "description": "As-of quarter-end the claim is about, ISO YYYY-MM-DD (e.g. '2026-06-30')"
    },
    "start": {
      "type": "string",
      "format": "date",
      "description": "Quarter-window start (ISO) if the claim spans quarters"
    },
    "end": {
      "type": "string",
      "format": "date",
      "description": "Quarter-window end (ISO) if the claim spans quarters"
    }
  },
  "required": [],
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded10 tools
verifiedversion not recorded10 tools
verifiedversion not recorded9 tools
verifiedversion not recorded13 tools
verifiedversion not recorded12 tools
verifiedversion not recorded11 tools