{
  "data": {
    "tool": {
      "category": "",
      "endpoint": "https://mcp.signal8.ai/mcp",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/signal8-mcp.json",
      "kind": "mcp",
      "listed": "indexed",
      "liveUrl": "https://www.anchorterminal.com/api/v1/live/signal8-mcp.json",
      "markdownUrl": "https://www.anchorterminal.com/tools/signal8-mcp.md",
      "mcpTools": {
        "check": {
          "checker": "anchor-check/1.0",
          "totalTokens": 39911,
          "counts": {
            "error": 0,
            "note": 0,
            "warn": 13
          },
          "findings": [
            {
              "rule": "TC07",
              "severity": "warn",
              "tool": "get_baby_shelf_capacity",
              "message": "the description is about 674 tokens",
              "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
            },
            {
              "rule": "TC07",
              "severity": "warn",
              "tool": "get_dilution_instruments",
              "message": "the description is about 676 tokens",
              "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
            },
            {
              "rule": "TC07",
              "severity": "warn",
              "tool": "get_dilution_risk",
              "message": "the description is about 620 tokens",
              "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
            },
            {
              "rule": "TC07",
              "severity": "warn",
              "tool": "get_dilution_snapshot",
              "message": "the description is about 632 tokens",
              "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
            },
            {
              "rule": "TC07",
              "severity": "warn",
              "tool": "get_float",
              "message": "the description is about 1,679 tokens",
              "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
            },
            {
              "rule": "TC07",
              "severity": "warn",
              "tool": "get_premarket_scan_history",
              "message": "the description is about 534 tokens",
              "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
            },
            {
              "rule": "TC07",
              "severity": "warn",
              "tool": "get_premarket_scanner",
              "message": "the description is about 524 tokens",
              "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
            },
            {
              "rule": "TC07",
              "severity": "warn",
              "tool": "get_recent_uplistings",
              "message": "the description is about 528 tokens",
              "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
            },
            {
              "rule": "TC14",
              "severity": "warn",
              "tool": "get_policy_events",
              "message": "allowed values are in the description, not an enum: sector",
              "fix": "Move them into enum."
            },
            {
              "rule": "TC20",
              "severity": "warn",
              "tool": "search_companies",
              "message": "the description steers the model",
              "fix": "Say what the tool is good at and let the model choose."
            },
            {
              "rule": "TC22",
              "severity": "warn",
              "tool": "get_float",
              "message": "the definition is about 1,850 tokens",
              "fix": "Trim the description and parameter docs, or split the tool."
            },
            {
              "rule": "TC22",
              "severity": "warn",
              "tool": "get_premarket_scan_history",
              "message": "the definition is about 2,200 tokens",
              "fix": "Trim the description and parameter docs, or split the tool."
            },
            {
              "rule": "TC23",
              "severity": "warn",
              "message": "102 tools, about 38,986 tokens of definitions",
              "fix": "Split the server by job, or offer a smaller default toolset (a read-only set, or a search-then-call pattern)."
            }
          ]
        },
        "checkedAt": "2026-10-04T22:20:40Z",
        "count": 102,
        "schemaTokens": 39911,
        "status": "ok",
        "tools": [
          {
            "name": "search_companies",
            "title": "Search Companies",
            "description": "Search for companies by name or ticker symbol in the Signal8 database. Returns matching companies with their ticker, name, CIK, and exchange. Use this as the first step to find a company before calling other tools.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 10, max: 50)",
                  "maximum": 50,
                  "minimum": 1,
                  "type": "number"
                },
                "query": {
                  "description": "Search query - company name or ticker symbol (e.g., \"Tesla\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_company_profile",
            "title": "Get Company Profile",
            "description": "Get an enriched company profile by ticker symbol. Returns CIK, exchange, sector, industry, market cap, employee count, description, and other fundamental data. This is a lightweight lookup (1 credit) -- use this when you only need basic company info rather than the full bundle. Always includes halted/haltCode/haltedAt trading-halt status (false/null when trading normally); a halted-but-listed ticker reports delisted:false.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., AAPL, TSLA)",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_quote",
            "title": "Get Stock Quote",
            "description": "Get the current stock quote for a company including price, volume, change, market cap, and other real-time market data. Use this when a user asks about a stock's current price or trading activity. Always includes halted/haltCode/haltReason/haltedAt/resumptionAt trading-halt fields (false/null when trading normally); a halted ticker returns the last-known quote instead of an error, or currentPrice:null + halted:true when nothing is recoverable. marketCap is the live price × the SEC-derived share count; when that count is unavailable it is null with marketCapWithheldReason set — NOT MEASURED, never \"no market cap\" and never $0.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_market_metrics",
            "title": "Get Market Metrics",
            "description": "Get computed market metrics for a company including volume averages, volatility, SMAs, and trend direction. Use when analyzing trading patterns or technical indicators beyond the basic quote.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_short_interest",
            "title": "Get Short Interest",
            "description": "Get short interest data for a company including short volume, short ratio, days to cover, and short percent of float. Use when analyzing bearish sentiment or potential short squeeze setups. 🔴 \"shortInterestPercent\" null ALWAYS carries \"shortInterestPercentReason\" (since 2026-10-04): \"float_not_point\" = the float on record is a snapshot BOUND or ESTIMATE (\u003c= / \u003e= / ~), and a percent-of-float is never struck off a bound — do NOT divide \"shortInterest\" by a ceiling, floor or estimate from get_float yourself; \"float_unavailable\" = no float of any kind on record; \"short_pct_of_float_unreconciled\" = a point float existed but the ratio was implausible or the split basis could not be resolved. A null percent is NOT MEASURED, never 0%.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_float",
            "title": "Get Float Data",
            "description": "Get float data for a company: floatShares, floatDefinition, as-of date, and — when the headline float is WITHHELD — the bounds and labelled stand-ins that replace it. Use when analyzing share supply. CARDINAL RULE: null / absent / withheld means NOT MEASURED — never \"no float\", never \"no restricted shares\", never zero. A numeric 0 is a MEASURED zero and passes a null check, so decide from the reason/marker field (\"floatWithheldReason\", \"restrictedBlockCount\", \"provenance\", \"direction\"), never from the value alone. IMPORTANT: check \"floatDefinition\" to know which float you are reading — \"tradeable\" (shares outstanding minus affiliates minus restricted/unregistered blocks: what can actually reach the tape; used on filing-derived dilution-snapshot tickers), \"non_affiliate\" (the SEC I.B.6 figure, which INCLUDES restricted shares held by non-affiliates — not what a trader means by float), \"non_affiliate_estimate\" (approximated from ownership filings), or \"free_float\" (vendor methodology). TODAY \"floatDefinition\" and \"source\" are only present on dilution-snapshot results: a vendor-sourced float arrives with neither (just floatShares, asOfDate, floatEstimated) because vendors are not named — read an ABSENT floatDefinition as \"not a filing-derived tradeable float\" and do not assume it is tradeable. On snapshot tickers \"nonAffiliateFloatShares\" carries the SEC I.B.6 figure separately — it is the ONLY correct input to baby-shelf / I.B.6 shelf-capacity math; never use the tradeable float there, and never present the non-affiliate figure as tradeable supply. floatShares:null with \"floatWithheldReason\" set (\"restricted_blocks_unnetted\" | \"stated_figure_impossible\" | \"affiliate_basis_stale\" | \"affiliate_figure_declined\" | \"affiliate_unreconciled\" | \"share_count_unavailable\" | \"split_post_dates_basis\" | \"snapshot_float_unconfirmed\" | \"refusal_evaluation_failed\") means the figure was deliberately WITHHELD by the snapshot AND no lower tier could answer — do not substitute a vendor float of your own. Since 2026-09-29 a snapshot that withheld its float FALLS THROUGH: when a lower tier can answer, \"source\" names that tier (computed / sec-10k / polygon / fmp), \"floatShares\" is ITS figure under ITS definition, and \"snapshotFloatWithheldReason\" carries the snapshot's reason as context (\"the filing-derived snapshot could not state a float; showing \u003csource\u003e\"). Read that field as provenance, never as a second refusal. 🔴 SINCE 2026-10-03 THE SNAPSHOT FIGURE ALWAYS HEADLINES: when the snapshot carries ANY figure — \"floatEstimate\" (~ point / \u003c= ceiling / \u003e= floor), \"tradeableFloatCeiling\", or an \"affiliateBasis\" range — \"floatShares\" stays null and THAT figure is the answer, with its label; a lower tier that also answered and passed the guard rides \"otherSourceFloat\" {floatShares, source, provenance:\"other_source\", floatDefinition, asOfDate} as a SECONDARY \"other source\" line — never the float, never arithmetic. A lower tier fills \"floatShares\" ONLY when the snapshot carries no figure at all. 🔴 SINCE 2026-10-04 A TRIVIAL CEILING IS NOT A FIGURE: a snapshot ceiling (\"tradeableFloatCeiling\", a \"floatEstimate\" with bound \"ceiling\", or an upper-only \"affiliateBasis\" range) at or above 99% of the share count says only \"the float is at most every issued share\" and is STRIPPED from the response (null), so the lower tier may headline under its own \"source\" with \"snapshotFloatWithheldReason\" as context (GELS: Polygon 5.12M, not \"\u003c= 11.18M\" on 11.18M shares). Floors and point estimates are never stripped. Since 2026-10-01 that fall-through is GUARDED: a lower-tier figure dated before a split the snapshot names, or outside the snapshot's own floor / ceiling / point estimate, is REFUSED and the withheld envelope is served with \"fallbackRefusal\" {reason: \"fallback_predates_split\" | \"fallback_outside_snapshot_bounds\", refusedSource, detail} beside the snapshot's \"floatWithheldReason\". The refused figure is NOT in the response and must not be fetched from a vendor to fill the gap — the detail says why no lower tier is shown either. A snapshot that stated a float never carries it. A withheld result may carry up to four stand-ins, each labelled IN the object; NONE is a float and NONE may be fed to a market cap, a percent-of-float, a short-interest ratio, a screen, a sort or a comparison: (1) \"tradeableFloatCeiling\" is an UPPER BOUND — the tradeable float is AT MOST this; render it with \"\u003c=\" and nothing else (null = no bound stateable, never 0). (2) \"affiliateBasis.floatLowerBound\" / \"floatUpperBound\" are a RANGE the float lies in — \"between X and Y\"; each end is null independently when not measurable, so state the ends that exist as inequalities. This object also appears on PUBLISHED floats with both ends equal to floatShares — it is a bound only when floatShares is null. (3) \"floatEstimate\" is a BADGED ESTIMATE {shares, basis, direction, confidence}: \"basis\" is the itemised working (quote it), \"direction\" says which way it errs (\"overstates\" = the true float is at most shares; \"understates\" = at least; \"unknown\"), \"confidence\" describes the estimate, not a float. Since 2026-09-29 it is the SNAPSHOT FLOAT LADDER figure on any withheld snapshot ticker and may also carry \"rung\" (\"non_affiliate_estimate\" | \"shares_outstanding_ceiling\" | \"rolled_forward_lower_bound\"), \"bound\" (\"point\" = about X, render \"~X\"; \"ceiling\" = AT MOST X, render \"\u003c= X\"; \"floor\" = AT LEAST X, render \"\u003e= X\") and \"asOf\"; a floor or ceiling is a BOUND, never a point value. null means no figure could be derived from the snapshot's structured fields. An estimate never becomes floatShares — present shares WITH basis and direction, never alone. Unrelated to the boolean \"floatEstimated\", which flags a published floatShares back-derived from a USD public-float disclosure. (4) \"vendorFallback\" is a third-party free-float figure {floatShares, provenance:\"vendor\", floatDefinition:\"free_float\", asOfDate, splitAdjusted} offered beside the withhold — NOT our number, NOT on the tradeable definition, already refused when our filings refute it. Present it as the vendor free float as of its own date, never in the \"Float\" slot. \"restrictedShares\":null means NOT MEASURED (a block exists whose size the filings do not state), NEVER zero; \"restrictedBlockCount\":0 is an answer, not an absence. \"affiliateBasisStale\" (with basisSpanDays/affiliateAnchorDate) labels a float whose affiliate table is materially older than its share count — the number itself is unchanged. \"tradeableBasis\":\"convention_conservative\" means the filings did not answer and a published convention resolved it — see \"tradeableConvention\" and do not present the figure as exact.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_float_history",
            "title": "Get Float History",
            "description": "Get the POINT-IN-TIME float history for a company — one sample per trade date (float shares, shares outstanding, and the source the float came from). Use to answer \"what was the float on date X\" or to see float expand across a dilution event, which the latest-only get_float cannot show. IMPORTANT: this series is FORWARD-ONLY — it began accumulating in mid-2026 and is NOT backfilled, so early/absent history is expected and an empty rows array is a normal result, not an error or a delisted company. Each row carries \"source\" (\"polygon\" | \"computed\" | \"sec_10k\" | \"fmp\") because float quality varies by provider — weigh rows accordingly rather than treating all sources as equal. Charged per your API tier.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "days": {
                  "description": "Lookback window in trade dates. Default 90, clamped to 1-730.",
                  "type": "integer"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_historical_prices",
            "title": "Get Historical Stock Prices",
            "description": "Get historical OHLCV price candles for a stock. Supports daily, weekly, and monthly resolutions. Use period shorthand (1M, 3M, 6M, 1Y, 5Y, ALL) or explicit from/to UNIX timestamps. Default is 1 year of daily candles. Use this to compute price returns, chart price history, or analyze volume trends over time.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "from": {
                  "description": "Start date as UNIX timestamp (overrides period)",
                  "type": "integer"
                },
                "period": {
                  "description": "Lookback period shorthand (default: \"1Y\"). Ignored if from/to are provided.",
                  "enum": [
                    "1M",
                    "3M",
                    "6M",
                    "1Y",
                    "5Y",
                    "ALL"
                  ],
                  "type": "string"
                },
                "resolution": {
                  "description": "Candle resolution: \"D\" (daily, default), \"W\" (weekly), \"M\" (monthly)",
                  "enum": [
                    "D",
                    "W",
                    "M"
                  ],
                  "type": "string"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                },
                "to": {
                  "description": "End date as UNIX timestamp (overrides period)",
                  "type": "integer"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_stock_price_change",
            "title": "Get Stock Price Change",
            "description": "Get percentage price changes for a stock across multiple timeframes: 1D, 5D, 1M, 3M, 6M, YTD, 1Y, 3Y, 5Y, 10Y, and MAX. Use this for quick \"how much is it up/down\" answers without fetching full candle data.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_financials",
            "title": "Get Financial Statements",
            "description": "Get income statement, balance sheet, and cash flow data for a company. Supports annual, quarterly, and trailing-twelve-month views. Use when analyzing revenue, profitability, debt, or cash position.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum number of periods to return (1-40). Defaults to 8.",
                  "maximum": 40,
                  "minimum": 1,
                  "type": "integer"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                },
                "type": {
                  "description": "Financial period type: \"annual\", \"quarter\", or \"ttm\" (trailing twelve months). Defaults to annual.",
                  "enum": [
                    "annual",
                    "quarter",
                    "ttm"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_earnings",
            "title": "Get Earnings History",
            "description": "Get historical earnings data for a company including EPS actual vs estimate, revenue actual vs estimate, and surprise percentages. Use when analyzing earnings beats/misses or upcoming earnings expectations.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum number of earnings periods to return (1-40). Defaults to 8.",
                  "maximum": 40,
                  "minimum": 1,
                  "type": "integer"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_executives",
            "title": "Get Company Executives",
            "description": "Get key executives and officers of a company including name, title, compensation, and tenure. Use when researching company leadership or management quality.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_news",
            "title": "Get Company News",
            "description": "Get recent news articles and press releases for a company. Use when researching recent developments, catalysts, or sentiment drivers. Set pressReleasesOnly to return only official company press releases.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum number of articles to return (1-20). Defaults to 10.",
                  "maximum": 20,
                  "minimum": 1,
                  "type": "integer"
                },
                "pressReleasesOnly": {
                  "description": "When true, return only official company press releases (exclude third-party news).",
                  "type": "boolean"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_analyst_consensus",
            "title": "Get Analyst Consensus",
            "description": "Get analyst ratings consensus for a company including average target price, number of analysts, buy/hold/sell breakdown, and consensus recommendation. Use when evaluating Wall Street sentiment or price targets.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_analyst_estimates",
            "title": "Get Analyst Estimates",
            "description": "Get forward analyst estimates for a company including EPS, revenue, EBITDA, and net income (low/high/avg) with analyst counts. Supports annual and quarterly periods. Use when analyzing forward earnings expectations or revenue forecasts.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum number of estimate periods to return (1-40). Defaults to 8.",
                  "maximum": 40,
                  "minimum": 1,
                  "type": "integer"
                },
                "period": {
                  "description": "Estimate period: \"annual\" (default) or \"quarter\".",
                  "enum": [
                    "annual",
                    "quarter"
                  ],
                  "type": "string"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_clinical_trials",
            "title": "Get Clinical Trials",
            "description": "Get clinical trial data for a biotech/pharma company including trial phase, status, conditions, and interventions. Use when analyzing a biotech company's pipeline or upcoming catalyst events.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum number of clinical trials to return (1-50). Defaults to 10.",
                  "maximum": 50,
                  "minimum": 1,
                  "type": "integer"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"MRNA\", \"PFE\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "search_clinical_trials",
            "title": "Search Clinical Trials",
            "description": "Search clinical trials market-wide (cross-company). Distinct from get_clinical_trials, which is scoped to a single ticker. Filter by phase, indication, sponsor, status, and date window; sort and paginate the results.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "dateField": {
                  "description": "Date field to filter/sort on",
                  "type": "string"
                },
                "from": {
                  "description": "Start date (YYYY-MM-DD)",
                  "type": "string"
                },
                "indication": {
                  "description": "Condition / indication filter",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (1-100, default: 50)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "order": {
                  "description": "Sort direction",
                  "enum": [
                    "asc",
                    "desc"
                  ],
                  "type": "string"
                },
                "phase": {
                  "description": "Trial phase filter (e.g., \"Phase 3\")",
                  "type": "string"
                },
                "sort": {
                  "description": "Sort field",
                  "type": "string"
                },
                "sponsor": {
                  "description": "Sponsor name filter",
                  "type": "string"
                },
                "status": {
                  "description": "Trial status filter",
                  "type": "string"
                },
                "to": {
                  "description": "End date (YYYY-MM-DD)",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_top_movers",
            "title": "Get Top Market Movers",
            "description": "Top stock movers — gainers (largest % up), losers (largest % down), or active (highest volume). Optional session window (premarket / regular / afterhours; regular default; not supported for active). Optional date (YYYY-MM-DD) returns a PAST trade date's gainers/losers on a historical daily close-to-close basis (computed from split-adjusted daily bars, NOT intraday) — session is rejected when date is set, date is not supported for direction=active, and a non-trade date (weekend/holiday) returns an empty list (not an error). Penny-stock artifacts are filtered by default — set includePennyStocks to include sub-$1 movers.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "date": {
                  "description": "Optional past trade date (YYYY-MM-DD). When set, returns that day's top gainers/losers computed on a historical daily close-to-close basis from split-adjusted daily bars (NOT intraday, NOT session-specific). Rejected with 400 when combined with a non-regular session or with direction=\"active\"; a future or malformed date is also 400. A weekend/holiday date returns an empty list, not an error.",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                },
                "direction": {
                  "description": "Mover direction: gainers, losers, or active (volume)",
                  "enum": [
                    "gainers",
                    "losers",
                    "active"
                  ],
                  "type": "string"
                },
                "includePennyStocks": {
                  "description": "Loosen penny-stock artifact guards. Default false enforces prev_close \u003e= $1 and a $1M dollar-volume floor. Set true to allow sub-$1 movers (prev_close \u003e= $0.10, no dollar-volume floor). The ABS(change_pct) \u003c= 500 cap applies in both modes.",
                  "type": "boolean"
                },
                "limit": {
                  "description": "Optional max rows (1–100). Backend default applied when omitted.",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "integer"
                },
                "session": {
                  "default": "regular",
                  "description": "Session window: premarket (4:00–9:30 AM ET), regular (RTH close-to-close, default), afterhours (4:00–8:00 PM ET). Live-only — rejected (400) when combined with date.",
                  "enum": [
                    "premarket",
                    "regular",
                    "afterhours"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "direction"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_market_news",
            "title": "Get Market News (Top Stories)",
            "description": "Get the latest market-wide news across ALL tickers, most recent first. Every item is significance-classified at ingest (critical | major | standard); the default filter of critical,major is the \"top stories\" view. Use for \"what is happening in the market right now\" — for news about one company, use get_news with a ticker instead. Requires the /news/latest public endpoint (added 2026-07-29; 404 until that backend deploy).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum items to return (1-50). Defaults to 10.",
                  "maximum": 50,
                  "minimum": 1,
                  "type": "integer"
                },
                "significance": {
                  "description": "CSV of levels to include, e.g. \"critical,major\" (default) or \"critical,major,standard\".",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_market_breadth",
            "title": "Get Market Breadth",
            "description": "Get market breadth aggregates (advance/decline counts and ratio, percent of constituents above their 50DMA and 200DMA, and counts of new 52-week highs/lows) for a chosen universe (sp500, ndx, or all). Use to add market-state context to commentary, tweets, or daily summaries.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "universe": {
                  "default": "sp500",
                  "description": "Universe to aggregate over: sp500, ndx, or all (default sp500)",
                  "enum": [
                    "sp500",
                    "ndx",
                    "all"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_trading_halts",
            "title": "Get Active Trading Halts",
            "description": "List currently-active trading halts across NASDAQ/NYSE/AMEX (from the consolidated Nasdaq Trader halt feed). Each halt includes ticker, market, haltCode (T1/T2/T12/LUDP/H10/...), human-readable reason, haltedAt, and the scheduled resumptionAt when one is set. An EMPTY list is a normal state (no active halts right now), not an error. Halts are tradeable catalysts — use this to discover halted names, then get_quote for the frozen last price.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {},
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_earnings_calendar",
            "title": "Get Earnings Calendar",
            "description": "Get upcoming and recent earnings releases between two dates. Optionally restrict to a list of tickers. Returns ticker, date, time (BMO/AMC), EPS estimate, and revenue estimate when available. Supports market cap filtering to focus on large-cap or small-cap earnings only.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "from": {
                  "description": "Start date inclusive (YYYY-MM-DD)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                },
                "maxMarketCap": {
                  "description": "Maximum market cap in USD (e.g., 2000000000 for under $2B)",
                  "type": "number"
                },
                "minMarketCap": {
                  "description": "Minimum market cap in USD (e.g., 10000000000 for $10B+)",
                  "type": "number"
                },
                "tickers": {
                  "description": "Optional ticker filter, e.g. [\"AAPL\",\"NVDA\"]",
                  "items": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": "array"
                },
                "to": {
                  "description": "End date inclusive (YYYY-MM-DD)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                }
              },
              "required": [
                "from",
                "to"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_economic_calendar",
            "title": "Get Economic Calendar",
            "description": "Get scheduled macro/economic events (CPI, FOMC, jobs reports, GDP, etc.) between two dates. Optionally filter to a single country (ISO-3166 alpha-2, e.g. \"US\"). Defaults to US when omitted.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "country": {
                  "description": "Optional ISO-3166 alpha-2 country code (e.g. \"US\", \"GB\", \"JP\")",
                  "maxLength": 2,
                  "minLength": 2,
                  "type": "string"
                },
                "from": {
                  "description": "Start date inclusive (YYYY-MM-DD)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                },
                "to": {
                  "description": "End date inclusive (YYYY-MM-DD)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                }
              },
              "required": [
                "from",
                "to"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_filing_calendar",
            "title": "Get SEC Filing Calendar",
            "description": "Get the forward-looking 10-K / 10-Q SEC filing-deadline calendar within a date window. Optionally restrict to a universe (sp500/ndx/dji/all) and/or a list of form types (default both 10-K and 10-Q).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "formTypes": {
                  "description": "Optional SEC form types subset, e.g. [\"10-Q\"]",
                  "items": {
                    "enum": [
                      "10-K",
                      "10-Q"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "from": {
                  "description": "Start date inclusive (YYYY-MM-DD, default today)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                },
                "to": {
                  "description": "End date inclusive (YYYY-MM-DD, default today + 45d)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                },
                "universe": {
                  "description": "Optional index-universe filter (default \"all\")",
                  "enum": [
                    "sp500",
                    "ndx",
                    "dji",
                    "all"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_post_earnings_movers",
            "title": "Get Post-Earnings Movers",
            "description": "Get stocks that moved significantly after earnings reports on a given date. Returns pre-computed price changes with earnings surprise data in a single call — no need to chain get_earnings_calendar + get_historical_prices + get_quote per ticker. Includes preEarningsClose, currentPrice, changePct, EPS/revenue actuals vs estimates, and surprise percentages. Filter by minimum absolute % change threshold.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "date": {
                  "description": "Earnings date to check (YYYY-MM-DD)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                },
                "limit": {
                  "default": 25,
                  "description": "Maximum results to return (default 25, max 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "integer"
                },
                "minChangePct": {
                  "default": 5,
                  "description": "Minimum absolute % price change to include (default 5). Set to 0 for all.",
                  "maximum": 100,
                  "minimum": 0,
                  "type": "number"
                }
              },
              "required": [
                "date"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_recent_material_filings",
            "title": "Get Recent Material Filings",
            "description": "Recent material 8-K filings (last 7 days) for the constituents of an index universe. By default returns the high-signal 8-K item codes (material agreements, M\u0026A, executive changes, restructurings, etc.); pass `items` to filter to specific 8-K item codes. Choose the universe with `universe`.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "items": {
                  "description": "Optional 8-K item codes (e.g. [\"1.01\",\"2.01\"])",
                  "items": {
                    "pattern": "^\\d+\\.\\d+$",
                    "type": "string"
                  },
                  "type": "array"
                },
                "limit": {
                  "description": "Optional max rows (1–100, default 50)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "integer"
                },
                "universe": {
                  "description": "Index universe to scan (sp500, ndx, or dji).",
                  "enum": [
                    "sp500",
                    "ndx",
                    "dji"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "screen_sec_filings",
            "title": "Screen SEC Filings",
            "description": "Screen SEC filings across all companies with company-level filters (sector, industry, market cap, exchange) combined with filing-level filters (form type, date range). Returns filings enriched with company metadata: ticker, sector, industry, exchange, market cap, and price. Use this to answer questions like \"find all S-1 filings from biotech companies under $500M market cap\" or \"show me recent 8-K filings from Technology sector companies\". This is the most powerful filing DISCOVERY tool for filings — use search_sec_filings only when you already know the specific CIK. This tool returns FILINGS, not a company universe: to enumerate or COUNT companies by market cap / price / float (e.g. \"find all companies under $300M market cap\"), use screen_companies instead — it supports minMarketCapComputed / maxMarketCapComputed and returns a real total COUNT.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "dateFrom": {
                  "description": "Start date filter (YYYY-MM-DD)",
                  "type": "string"
                },
                "dateTo": {
                  "description": "End date filter (YYYY-MM-DD)",
                  "type": "string"
                },
                "exchange": {
                  "description": "Filter by exchange (e.g., \"NASDAQ\", \"NYSE\", \"AMEX\")",
                  "type": "string"
                },
                "formTypes": {
                  "description": "Comma-separated form types (e.g., \"S-1\", \"10-K,10-Q\", \"8-K\", \"S-3,424B5\")",
                  "type": "string"
                },
                "industry": {
                  "description": "Filter by industry (e.g., \"Biotechnology\", \"Software - Application\", \"Oil \u0026 Gas E\u0026P\")",
                  "type": "string"
                },
                "maxMarketCap": {
                  "description": "Maximum market cap in USD (e.g., 500000000 for $500M)",
                  "type": "number"
                },
                "minMarketCap": {
                  "description": "Minimum market cap in USD (e.g., 1000000000 for $1B)",
                  "type": "number"
                },
                "page": {
                  "description": "Page number (1-indexed, default: 1)",
                  "minimum": 1,
                  "type": "number"
                },
                "pageSize": {
                  "description": "Results per page (default: 25, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "sector": {
                  "description": "Filter by sector (e.g., \"Healthcare\", \"Technology\", \"Financial Services\", \"Energy\")",
                  "type": "string"
                },
                "sortBy": {
                  "description": "Sort results by field (default: filing_date). Ties are broken by filing id, so a given page is stable and reproducible for a fixed corpus.",
                  "enum": [
                    "filing_date",
                    "form_type",
                    "company_name"
                  ],
                  "type": "string"
                },
                "sortOrder": {
                  "description": "Sort direction (default: desc). Note that paging is offset-based over a corpus that is continuously ingesting new filings, so when walking many pages of a broad date range, newly-arrived filings can shift rows between pages; page on a closed dateFrom/dateTo window if you need an exhaustive, non-overlapping traversal.",
                  "enum": [
                    "asc",
                    "desc"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "search_sec_filings",
            "title": "Search SEC Filings",
            "description": "Search and list SEC filings with filtering by company (CIK), form type, date range, 8-K item codes and excluded forms, optionally with a full-text query over the filing bodies. Returns filing metadata (form type, filing date, company name, accession number, acceptance time, primary document, 8-K items) plus `pagination` with `total`, `totalRelation` (\"gte\" when the count was cut at 10,000) and `nextCursor`. With `q`, rows also carry a ranked `snippet`. Use this to find filings before reading their content with get_filing_document or get_filing_exhibits. The `ciks` filter matches the filing's primary CIK: an insider Form 4 filed under the reporting owner's CIK is NOT returned for the issuer's CIK.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ciks": {
                  "description": "Comma-separated CIK numbers to filter by (e.g., \"0000320193,0001018724\")",
                  "type": "string"
                },
                "cursor": {
                  "description": "Opaque keyset cursor from a previous response's pagination.nextCursor. Prefer it over page for deep paging — it is stable while new filings arrive.",
                  "type": "string"
                },
                "dateFrom": {
                  "description": "Start date filter (YYYY-MM-DD)",
                  "type": "string"
                },
                "dateTo": {
                  "description": "End date filter (YYYY-MM-DD)",
                  "type": "string"
                },
                "excludeForms": {
                  "description": "Comma-separated form types to EXCLUDE (e.g., \"4,13F-HR\"). Exact match.",
                  "type": "string"
                },
                "formTypes": {
                  "description": "Comma-separated form types (e.g., \"10-K,10-Q,8-K,S-1,S-3,424B5\"). Exact match — list amendments (e.g. \"10-K/A\") explicitly.",
                  "type": "string"
                },
                "items": {
                  "description": "Comma-separated 8-K item codes, ALL required (e.g., \"2.02,9.01\" = results + financial statements; \"5.02\" = officer/director changes; \"1.01\" = material agreements).",
                  "type": "string"
                },
                "page": {
                  "description": "Page number (1-indexed, default: 1). Ignored when cursor is set.",
                  "minimum": 1,
                  "type": "number"
                },
                "pageSize": {
                  "description": "Results per page (default: 25, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "q": {
                  "description": "Full-text query over filing bodies, websearch syntax: \"quoted phrase\", OR, -exclude. Quote multi-word phrases — unquoted words match anywhere in the filing.",
                  "maxLength": 500,
                  "type": "string"
                },
                "sort": {
                  "description": "newest (by acceptance time, default) or relevance (requires q; ranks the newest 1,000 matches)",
                  "enum": [
                    "newest",
                    "relevance"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_filing_document",
            "title": "Get Filing Document",
            "description": "Get the full raw text/HTML content of an SEC filing by its internal filing ID. Returns the complete filing document which can be very large (10-K filings can be 1MB+). Use the maxLength parameter to truncate content for previews. The response includes company_name, form_type, filing_date, cik, and accession_number alongside the content. Find filing IDs using search_sec_filings first.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "filingId": {
                  "description": "Internal filing ID (numeric). Find via search_sec_filings.",
                  "type": "string"
                },
                "maxLength": {
                  "description": "Truncate content to this many characters. Useful for previewing large filings. Response includes a \"truncated\" boolean when truncation is applied.",
                  "minimum": 100,
                  "type": "number"
                }
              },
              "required": [
                "filingId"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_filing_exhibits",
            "title": "Get Filing Exhibits",
            "description": "List all exhibits (individual documents) within an SEC filing. Returns exhibit metadata including exhibit type, description, and content size. Use this to identify which exhibits to read with get_exhibit_content. Excludes XML/XBRL exhibits.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "filingId": {
                  "description": "Internal filing ID (numeric). Find via search_sec_filings.",
                  "type": "string"
                }
              },
              "required": [
                "filingId"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_exhibit_content",
            "title": "Get Exhibit Content",
            "description": "Get the full text/HTML content of a single exhibit from an SEC filing. Returns the exhibit text along with exhibit_type, description, company_name, accession_number, and form_type. Use the maxLength parameter to truncate large exhibits. Find exhibit IDs using get_filing_exhibits first.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "id": {
                  "description": "Exhibit ID (numeric). Find via get_filing_exhibits.",
                  "type": "string"
                },
                "maxLength": {
                  "description": "Truncate content to this many characters. Response includes a \"truncated\" boolean.",
                  "minimum": 100,
                  "type": "number"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "search_filing_text",
            "title": "Search Filing Text",
            "description": "Full-text search across SEC filing content, websearch syntax (\"quoted phrase\", OR, -exclude), ranked, one match per filing. Quote multi-word phrases — unquoted words match anywhere in the filing. Returns matching snippets with context around each match. Powerful for finding specific clauses like \"change of control\", \"anti-dilution\", \"right of first refusal\", or any specific language across filings. Optionally filter by company (CIK), filing, accession number, or form type.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "accessionNumber": {
                  "description": "Filter to a specific filing by SEC accession number",
                  "type": "string"
                },
                "cik": {
                  "description": "Filter to a specific company by CIK number",
                  "type": "string"
                },
                "filingId": {
                  "description": "Filter to a specific filing by internal ID",
                  "type": "string"
                },
                "formType": {
                  "description": "Filter by form type (e.g., \"10-K\", \"S-1\")",
                  "type": "string"
                },
                "limit": {
                  "description": "Max results (default: 20, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "pattern": {
                  "description": "Search query (minimum 2 characters), websearch syntax: \"exact phrase\", OR, -exclude. A CIK/filing-scoped search whose text is not indexed yet falls back to a literal case-insensitive substring match (response engine: \"substring\").",
                  "minLength": 2,
                  "type": "string"
                },
                "snippetLength": {
                  "description": "Characters of context around each match (default: 200)",
                  "maximum": 1000,
                  "minimum": 50,
                  "type": "number"
                }
              },
              "required": [
                "pattern"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "lookup_accession_number",
            "title": "Lookup Accession Number",
            "description": "Look up a filing or exhibit by its SEC accession number. Supports both dashed format (e.g., \"0001193125-22-010026\") and compact 18-digit format. Returns filing metadata including company name, form type, filing date, and exhibit count. If the filing is in the local database, returns full metadata; if only found on SEC EDGAR, returns basic metadata with an isInDatabase: false flag.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "accessionNumber": {
                  "description": "SEC accession number in dashed (e.g., \"0001193125-22-010026\") or compact 18-digit format",
                  "type": "string"
                }
              },
              "required": [
                "accessionNumber"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "screen_sec_filings_performance",
            "title": "Screen SEC Filings Performance",
            "description": "Analyze stock price performance after SEC filings. Returns individual filing records with pre-computed price returns at +1 day, +3 days, +7 days, and +30 days after the filing date, plus aggregate statistics (average, median, % negative, best, worst) across all matching filings. Combine company-level filters (sector, industry, market cap, exchange) with filing filters (form type, date range). Use this to answer questions like \"how do biotech stocks perform after S-1 filings?\" or \"what is the average 7-day return after 8-K filings from companies under $500M market cap?\".",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "dateFrom": {
                  "description": "Start date filter (YYYY-MM-DD)",
                  "type": "string"
                },
                "dateTo": {
                  "description": "End date filter (YYYY-MM-DD)",
                  "type": "string"
                },
                "exchange": {
                  "description": "Filter by exchange (e.g., \"NASDAQ\", \"NYSE\", \"AMEX\")",
                  "type": "string"
                },
                "formTypes": {
                  "description": "Comma-separated form types (e.g., \"S-1\", \"10-K,10-Q\", \"8-K\", \"S-3,424B5\")",
                  "type": "string"
                },
                "industry": {
                  "description": "Filter by industry (e.g., \"Biotechnology\", \"Software - Application\")",
                  "type": "string"
                },
                "maxMarketCap": {
                  "description": "Maximum market cap in USD",
                  "type": "number"
                },
                "minMarketCap": {
                  "description": "Minimum market cap in USD",
                  "type": "number"
                },
                "page": {
                  "description": "Page number (1-indexed, default: 1)",
                  "minimum": 1,
                  "type": "number"
                },
                "pageSize": {
                  "description": "Results per page (default: 25, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "sector": {
                  "description": "Filter by sector (e.g., \"Healthcare\", \"Technology\", \"Financial Services\")",
                  "type": "string"
                },
                "sortBy": {
                  "description": "Sort results by field (default: filing_date)",
                  "enum": [
                    "filing_date",
                    "return_1d",
                    "return_3d",
                    "return_7d",
                    "return_30d",
                    "price_at_filing",
                    "market_cap"
                  ],
                  "type": "string"
                },
                "sortOrder": {
                  "description": "Sort direction (default: desc)",
                  "enum": [
                    "asc",
                    "desc"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_insiders",
            "title": "Get Insider Trading Intelligence",
            "description": "Get insider trading discovery data for a company. Includes cluster buying detection, entity-centric insider model, and Form 4 cross-referencing. Shows insider transactions with buying/selling patterns that may signal upcoming corporate actions. Each insider includes a transactionBreakdown by SEC code (P=Purchase, S=Sale, F=Tax withholding, M=Exercise, G=Gift, A=Award), netSharesSold12m (code S only, excludes tax withholding), and isPrimarilyTaxWithholding flag to distinguish routine RSU vesting from discretionary selling. Supports pagination with limit/offset.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 20, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "integer"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "integer"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., AAPL, TSLA)",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_ownership",
            "title": "Get Comprehensive Ownership",
            "description": "Get unified ownership breakdown for a company combining Form 4 insider holdings, 13F institutional holdings, and 13D/13G activist positions. All entities are resolved across the three SEC form types into a single view with counterparty resolution. The allHolders array is paginated via limit/offset (default 100). Aggregate stats (institutional/insider/beneficial totals and percentages, plus the `retail` residual) are always included in full. `retail` is the UNATTRIBUTED residual: shares no filing accounts for, which includes recent offering buyers and acquisition holders who have not filed as well as retail investors — an upper bound on retail, never a retail count. When `retail.reason` is `filed_exceeds_outstanding` the residual is withheld (null) because the counted filings exceed the shares outstanding.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum holders to return in allHolders (default: 100, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "integer"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "integer"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., AAPL, TSLA)",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_institutions",
            "title": "Get Institutional Holders",
            "description": "Get institutional holders (13F filers) for a company. Returns institutions that hold positions in this stock based on SEC 13F filings, including shares held, portfolio weight, and filing dates. Useful for understanding institutional ownership concentration.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 20, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., AAPL, TSLA)",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_institution_detail",
            "title": "Get Institution Detail",
            "description": "Get detailed information about a specific institutional investor by their SEC CIK number. Returns the institution name, total AUM, number of holdings, and filing history. Use get_institutions first to find the CIK for an institution.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "cik": {
                  "description": "SEC CIK number of the institution (e.g., \"0001067983\" for Berkshire Hathaway)",
                  "type": "string"
                }
              },
              "required": [
                "cik"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_institution_holdings",
            "title": "Get Institution Holdings",
            "description": "Get the full portfolio holdings for a specific institution by CIK. Returns all positions from their latest 13F filing with shares, value, and portfolio weight. Supports pagination for institutions with large portfolios.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "cik": {
                  "description": "SEC CIK number of the institution",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 20, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                }
              },
              "required": [
                "cik"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_institution_position_changes",
            "title": "Get Institution Position Changes",
            "description": "Diff two quarterly 13F snapshots for an institution. Compares the latest filing against the prior quarter and returns per-position changes: new positions, increased, decreased, and exited. Sorted by |changePercent| descending so the biggest moves surface first. Much more efficient than calling get_institution_holdings twice and diffing client-side — the server computes everything in a single SQL query.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "cik": {
                  "description": "SEC CIK number of the institution (e.g., \"0001067983\" for Berkshire Hathaway)",
                  "type": "string"
                },
                "limit": {
                  "default": 50,
                  "description": "Maximum results to return (default: 50, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "integer"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "integer"
                }
              },
              "required": [
                "cik"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_institution_activity",
            "title": "Get Institution Activity",
            "description": "Get an institution's position changes over recent 13F periods by CIK. Reads the number of trailing periods to include.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "cik": {
                  "description": "SEC CIK number of the institution",
                  "type": "string"
                },
                "periods": {
                  "description": "Number of trailing quarters to include (default: 4, max: 12)",
                  "maximum": 12,
                  "minimum": 1,
                  "type": "number"
                }
              },
              "required": [
                "cik"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_institution_filings",
            "title": "Get Institution Filings",
            "description": "Get the list of 13F filings for an institution by CIK, with pagination.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "cik": {
                  "description": "SEC CIK number of the institution",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 20, max: 50)",
                  "maximum": 50,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                }
              },
              "required": [
                "cik"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_institution_derivatives",
            "title": "Get Institution Derivatives",
            "description": "Get an institution's reported PUT/CALL derivative positions by CIK (13F options), with pagination and sorting.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "cik": {
                  "description": "SEC CIK number of the institution",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 20)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "period": {
                  "description": "Filing period to filter (e.g., \"2025-Q1\")",
                  "type": "string"
                },
                "sortBy": {
                  "description": "Column to sort by",
                  "type": "string"
                },
                "sortOrder": {
                  "description": "Sort direction",
                  "enum": [
                    "asc",
                    "desc"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "cik"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_institution_portfolio_analytics",
            "title": "Get Institution Portfolio Analytics",
            "description": "Get sector allocation and top holdings analytics for an institution's portfolio by CIK.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "cik": {
                  "description": "SEC CIK number of the institution",
                  "type": "string"
                }
              },
              "required": [
                "cik"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_institutions_leaderboards",
            "title": "Get Institution Leaderboards",
            "description": "Two market-wide institution leaderboards in one call: topByAum (largest holders by assets under management, name-deduped) and mostActive (highest 13F position-change volume). No CIK required. For the full paginated AUM list use get_institution_top_aum.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results per section (default: 10, max: 50)",
                  "maximum": 50,
                  "minimum": 1,
                  "type": "number"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_insider_transactions",
            "title": "Get Insider Transactions",
            "description": "Get detailed insider transaction history for a company from Form 4 filings. Returns individual buy/sell transactions with insider name, title, shares, price, and transaction codes. Supports pagination for companies with extensive insider activity. Filter by year/month to narrow results, or use transactionCode to find only purchases (P), sales (S), etc. Useful for identifying \"first insider buy since X\" patterns.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 20, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "month": {
                  "description": "Filter by transaction month (1-12, requires year)",
                  "maximum": 12,
                  "minimum": 1,
                  "type": "integer"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., AAPL, TSLA)",
                  "type": "string"
                },
                "transactionCode": {
                  "description": "Filter by SEC transaction code: P=Purchase, S=Sale, A=Grant/Award, M=Exercise/Conversion, F=Tax withholding, G=Gift, C=Conversion, W=Will, D=Disposition to issuer, etc.",
                  "maxLength": 1,
                  "minLength": 1,
                  "pattern": "^[A-Z]$",
                  "type": "string"
                },
                "year": {
                  "description": "Filter by transaction year (e.g., 2025)",
                  "maximum": 2100,
                  "minimum": 2000,
                  "type": "integer"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_insider_cluster_buys",
            "title": "Get Insider Cluster Buys",
            "description": "Detect cluster buying patterns for a company. Identifies periods where 3+ distinct insiders purchased shares within a 14-day window -- a strong bullish signal that often precedes positive corporate announcements or price appreciation.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., AAPL, TSLA)",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_institution_top_aum",
            "title": "Get Top Institutions by AUM",
            "description": "Discover top institutional holders across the entire company universe ranked by assets under management (AUM). Unlike get_ownership which shows institutions for a single company, this tool searches across all companies to find the largest institutional players. Optionally set a minimum AUM. Useful for identifying smart money flows and major institutional positioning trends.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 25, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "minAum": {
                  "description": "Minimum AUM in USD to filter institutions (e.g., 1000000000 for $1B+)",
                  "type": "number"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "search_institutions",
            "title": "Search Institutions by Name",
            "description": "Search institutional investors (13F filers) by name. Returns matching institutions with CIK, name, AUM, holdings count, and latest filing period. Use this to find a specific fund or investment manager when you know part of their name (e.g., \"Vanguard\", \"BlackRock\", \"Citadel\"). Results are ranked by AUM descending.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 25, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "q": {
                  "description": "Search term (min 2 characters, e.g., \"Vanguard\", \"BlackRock\")",
                  "minLength": 2,
                  "type": "string"
                }
              },
              "required": [
                "q"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_insider_cross_company",
            "title": "Get Cross-Company Insider Trading",
            "description": "Discover insider trading patterns across multiple companies. Unlike get_insiders which shows insider activity for a single ticker, this tool searches the entire universe to find insiders active across multiple companies, cluster buying patterns, and large transactions. Filter by insider name, transaction type, or date range. Useful for detecting coordinated insider activity, cross-company insider networks, and market-wide buying/selling trends.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "endDate": {
                  "description": "End date for transaction range in ISO format (e.g., \"2025-12-31\")",
                  "type": "string"
                },
                "insiderName": {
                  "description": "Filter by insider name (partial match, e.g., \"Musk\" or \"Cohen\")",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 10, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "startDate": {
                  "description": "Start date for transaction range in ISO format (e.g., \"2025-01-01\")",
                  "type": "string"
                },
                "transactionType": {
                  "description": "Filter by transaction type: \"P\" (purchase), \"S\" (sale), \"A\" (grant/award), \"M\" (conversion)",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_compliance",
            "title": "Get Compliance Evaluation",
            "description": "Get full compliance rules evaluation for a company. Runs Nasdaq/NYSE deficiency detection, bid price tracking, and delinquent filing detection. Returns a comprehensive compliance picture combining SEC filing data, market data, and exchange rules. This is the most thorough compliance check available (25 credits).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., AAPL, TSLA)",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "screen_companies",
            "title": "Screen Companies",
            "description": "Since 2026-10-03 the float column ALWAYS carries the dilution snapshot's own figure when the snapshot has one: \"float\" is the measured POINT float (null on a withheld snapshot row), and such a row then carries \"floatEstimate\" (shares) + \"floatEstimateBound\" (\"point\" ~ / \"ceiling\" \u003c= / \"floor\" \u003e=) + \"floatEstimateBasis\" (the working) — present it as the number with its marker, e.g. \"\u003c= 7,953,957\". minFloat / maxFloat and the computed_float sort compare the figure's VALUE (COALESCE of the two), so a bounded row is kept; a row with neither is NOT MEASURED, never 0. 🔴 Never feed floatEstimate into a market cap, a percent-of-float or a short-interest ratio — a bound is not a point. Screen companies by price range, volume, cash runway, float, shares outstanding, market cap, industry, listing exchange (NASDAQ/NYSE/AMEX), and float data source. Sort results by any sortable column. Returns matching companies with key metrics and pagination. Each row carries live trading-halt status (halted/haltCode/haltedAt; false/null when trading normally); pass excludeHalted=true to drop currently-halted tickers from the results.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "country": {
                  "description": "Company universe by issuer domicile: \"US\" (default), \"CA\" (Canadian companies via their US-OTC/US cross-listings), or \"all\"",
                  "enum": [
                    "US",
                    "CA",
                    "all"
                  ],
                  "type": "string"
                },
                "exchange": {
                  "description": "Filter by listing exchange (exact match): NASDAQ, NYSE, or AMEX",
                  "type": "string"
                },
                "excludeHalted": {
                  "description": "When true, exclude tickers with a currently-active trading halt (regulatory or volatility) from the results. Default false — halted rows are included and carry halted/haltCode/haltedAt fields.",
                  "type": "boolean"
                },
                "floatSource": {
                  "description": "Filter by float data source",
                  "enum": [
                    "computed",
                    "sec_10k",
                    "external"
                  ],
                  "type": "string"
                },
                "industry": {
                  "description": "Filter by company industry (exact match, e.g. \"Biotechnology\", \"Software\")",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results per page (default: 25, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "maxCashRunway": {
                  "description": "Maximum estimated months of cash remaining",
                  "type": "number"
                },
                "maxFloat": {
                  "description": "Maximum computed public float (shares)",
                  "type": "number"
                },
                "maxMarketCapComputed": {
                  "description": "Maximum market cap in USD (price * shares outstanding)",
                  "type": "number"
                },
                "maxPrice": {
                  "description": "Maximum latest price in USD",
                  "type": "number"
                },
                "maxSharesOutstanding": {
                  "description": "Maximum shares outstanding from SEC EDGAR",
                  "type": "number"
                },
                "maxVolume": {
                  "description": "Maximum daily trading volume",
                  "type": "number"
                },
                "minCashRunway": {
                  "description": "Minimum estimated months of cash remaining",
                  "type": "number"
                },
                "minFloat": {
                  "description": "Minimum computed public float (shares)",
                  "type": "number"
                },
                "minMarketCapComputed": {
                  "description": "Minimum market cap in USD (price * shares outstanding)",
                  "type": "number"
                },
                "minPrice": {
                  "description": "Minimum latest price in USD",
                  "type": "number"
                },
                "minSharesOutstanding": {
                  "description": "Minimum shares outstanding from SEC EDGAR",
                  "type": "number"
                },
                "minVolume": {
                  "description": "Minimum daily trading volume",
                  "type": "number"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "sortBy": {
                  "description": "Column to sort results by (default: volume)",
                  "enum": [
                    "ticker",
                    "price",
                    "change_percent",
                    "volume",
                    "industry",
                    "cash_runway_months",
                    "shares_outstanding",
                    "computed_float",
                    "market_cap_computed",
                    "updated_at"
                  ],
                  "type": "string"
                },
                "sortOrder": {
                  "description": "Sort direction (default: desc)",
                  "enum": [
                    "asc",
                    "desc"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_premarket_scan_history",
            "title": "Get Premarket Scan History",
            "description": "Historical MARKET-WIDE premarket scan for a single PAST trade date. For the requested ET date, returns every ticker with that day's premarket (default) session volume and its relative volume (RVOL) vs the trailing 30-day same-session baseline — the SAME RVOL math as get_rvol_history, but across the whole market for one date instead of one ticker across many dates. Filter by RVOL, market cap, price, and float to backtest screens like \"sub-$500M tickers with premarket RVOL \u003e 5 on 2026-07-20\" in one call. Rows are ranked by RVOL descending. A future or non-trading date returns an empty list with an explanatory reason (not an error). Every row also reports \"baselineState\" (why its RVOL is or is not null), \"advRatio\" (volume ÷ trailing 30-session average FULL-DAY volume) and \"advDays\"; set includeNoHistory=true to surface high-volume tickers that have no computable RVOL at all, such as first-session new listings. Each row ALSO publishes the RVOL denominator itself as \"baselineVolume\" (shares) plus a \"baselineThin\" flag (true when that denominator is under 200 shares): a 90x RVOL off a 1-share baseline is arithmetically correct and analytically worthless. That is almost entirely an asOfTime-basis effect (0.1% of full-session rows vs ~38% at the 04:30 cutoff, falling to ~9% by 09:15) and it skews to LIQUID LARGE CAPS that simply do not trade early, NOT to microcaps. Screen it out with minBaselineVolume and/or minSessionVolume. The response \"meta\" also reports asOfApplied / asOfIgnored / asOfIgnoredReason, so a time-of-day request that could not be honoured is visible instead of quietly returning full-session numbers. A price / market-cap / float filter can only be applied to a ticker company_screener_data holds a value for, so a just-renamed or just-listed symbol cannot be rated against it. Those rows are NEVER silently dropped: \"meta.unscreened\" always reports their count, the filter families involved and the tickers, and includeUnscreened=true returns them in \"rows\" tagged with \"unscreenedFilters\". Treat that tag as NOT MEASURED — the value is unknown, not out of range. Charged per your API tier.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "asOfTime": {
                  "description": "Optional TRUE time-of-day premarket basis. Any HH:MM ET premarket time; snapped to the nearest 15-minute grid cutoff (04:00–09:15, ties resolve to the earlier cutoff). When set, RVOL is cumulative premarket volume known BY that cutoff ÷ the trailing baselineDays (default 30) average of the SAME cutoff — a real time-of-day comparison, not the full 04:00–09:30 session. Each returned row carries a \"basis\" field: \"asof-0700\" (the snapped cutoff actually used) when a precomputed row exists, else \"full-session\" (automatic per-row fallback — the as-of series is forward-looking and may be sparse). Only applies to a premarket scan. Omit for full-session premarket volume. CHECK \"meta.asOfApplied\" (the SNAPPED cutoff actually used, or null) and \"meta.asOfIgnored\" / \"meta.asOfIgnoredReason\" (\"date-not-covered\" — the as-of grid has not been computed for this date, so the numbers are full-session; \"non-premarket-session\" — asOfTime only applies to a premarket scan; \"unparseable\"). Coverage is a set with HOLES that grows as the backfill runs, so do NOT assume any cutover date — read the meta per request. An unhonoured asOfTime is never an error, so this is the only reliable check. ALSO NOTE: this basis is where near-zero RVOL baselines come from — pair it with minBaselineVolume (see \"baselineThin\").",
                  "pattern": "^\\d{2}:\\d{2}$",
                  "type": "string"
                },
                "baselineDays": {
                  "description": "Rolling RVOL baseline window, in trading rows (same-session days). Default 30; values outside 20-250 are clamped. This is the DENOMINATOR window: every RVOL in the response is that period's volume divided by the average of the trailing N same-session (or same-cutoff) days, excluding the day itself. A SHORTER window tracks recent regime changes faster and is noisier; a LONGER one is smoother and slower to react. The warm-up lookback scales with it automatically, so a wide window is never under-filled into an inflated ratio; the minimum-warm-days gate (20 prior sessions) does NOT scale down, so at the 30-row default a ticker needs 20 of its last 30 sessions populated before rvol is non-null. Omit for the standard 30-day baseline; pass 90 for the pre-2026-09 window.",
                  "maximum": 250,
                  "minimum": 20,
                  "type": "integer"
                },
                "date": {
                  "description": "REQUIRED past ET trade date to scan (YYYY-MM-DD). Future/non-trade dates return an empty list.",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                },
                "includeNoHistory": {
                  "description": "Also return the cohort minRvol structurally hides: tickers with NO computable RVOL. Two kinds, told apart by each row's \"baselineState\" — \"no-history\" (a new listing with no prior trading history at all, so RVOL is meaningless rather than merely missing; e.g. a stock that printed 20M shares on its first-ever session) and \"no-cutoff-history\" (an established ticker that simply never traded at this cutoff before — a genuine wake-up). Both come back with rvol=null and are ALWAYS ranked BELOW every real-RVOL row, ordered among themselves by \"advRatio\". Use \"advRatio\" (volume ÷ trailing 30-session average FULL-DAY volume, null when no full-day denominator exists) and \"advDays\" (its sample size) to size them — it is NOT an RVOL and is not comparable to one. Inert unless minRvol is set. Default false.",
                  "type": "boolean"
                },
                "includeUnscreened": {
                  "description": "Also return rows that could not be RATED against the price / market-cap / float bounds above, because company_screener_data holds no value for them — typically a symbol renamed or listed within the last day (the source is an FMP screener that lags a rename by ~a day). Each such row carries \"unscreenedFilters\" naming the families that could not be applied, and the matching value field is null. READ THAT AS NOT MEASURED — never as \"matched\" or \"did not match\". Default false, in which case those rows are excluded from \"rows\" but are STILL reported in meta.unscreened (count / columns / tickers), so they are never silently dropped. Inert unless a price, market-cap or float filter is supplied.",
                  "type": "boolean"
                },
                "limit": {
                  "description": "Max rows to return (1–200, default 50). Rows are ranked by RVOL desc.",
                  "maximum": 200,
                  "minimum": 1,
                  "type": "integer"
                },
                "maxFloat": {
                  "description": "Maximum public float (shares).",
                  "type": "number"
                },
                "maxMarketCap": {
                  "description": "Maximum market cap in USD (e.g. 500000000 for sub-$500M).",
                  "type": "number"
                },
                "maxPrice": {
                  "description": "Maximum latest price in USD.",
                  "type": "number"
                },
                "minBaselineVolume": {
                  "description": "Minimum RVOL DENOMINATOR in shares. Drops rows whose \"baselineVolume\" is below it, plus every row that has no baseline at all. This is the direct fix for a huge RVOL computed against a near-zero baseline (e.g. 102 shares ÷ a 1.2-share baseline = 87x on a $10B company that just does not trade at 04:30). Try 200 to match the \"baselineThin\" flag, or higher for a stricter screen. Does NOT change any RVOL — it only removes rows. Note it also excludes the includeNoHistory cohort, which by definition has no denominator.",
                  "type": "number"
                },
                "minFloat": {
                  "description": "Minimum public float (shares).",
                  "type": "number"
                },
                "minMarketCap": {
                  "description": "Minimum market cap in USD (market_cap_computed = price × shares outstanding).",
                  "type": "number"
                },
                "minPrice": {
                  "description": "Minimum latest price in USD.",
                  "type": "number"
                },
                "minRvol": {
                  "description": "Minimum RVOL (day session volume ÷ trailing 30-day baseline). Drops rows whose baseline is not yet warm.",
                  "type": "number"
                },
                "minSessionVolume": {
                  "description": "Minimum RVOL NUMERATOR in shares — the scanned session's own volume. Answers \"did enough actually trade to be worth acting on?\", where minBaselineVolume answers \"is the comparison meaningful at all?\". USE BOTH IF YOU MEAN BOTH: neither subsumes the other (a 1,000-share floor here cuts thin-baseline rows from ~26% to ~3%, yet a name with an 860-share baseline and 11.8M shares traded passes this and fails a baseline floor).",
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default 0).",
                  "minimum": 0,
                  "type": "integer"
                },
                "session": {
                  "description": "Session bucket to scan (default premarket). \"all\" = full extended day.",
                  "enum": [
                    "premarket",
                    "regular",
                    "afterhours",
                    "all"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "date"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_split_history",
            "title": "Get Stock Split History",
            "description": "Get stock split history for a company including forward and reverse splits with dates, ratios, type classification, and cumulative 2-year reverse split ratio. Relevant for NASDAQ/NYSE minimum bid-price compliance (1:250 cumulative reverse-split cap). IMPORTANT: `cumulativeReverseSplitRatio2yr` is null when it CANNOT BE STATED, which is NOT the same as no reverse splits — read `cumulativeWithheldReason` to tell them apart. `unconfirmed_splits_in_window` means at least one in-window reverse split is evidenced by only one source, so no cumulative is defensible: the confirmed splits alone would understate it, and understating a cumulative can put an issuer that breaches the 1:250 cap under it. Each row also carries `confirmed`; a `confirmed: false` split appears only in the announcement calendar, which retains every announcement and retracts none, so it is usually an amended or superseded announcement and occasionally a real split the effected-splits ledger missed. Both are returned. `ratioDisplay` and `type` are likewise null for a ratio whose exact factor cannot be determined.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., AAPL, TSLA)",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_etf_bundle",
            "title": "Get ETF Bundle",
            "description": "Get aggregated ETF data in a single call. Combines multiple data sources (profile, holdings, sector weightings, country exposure, performance, news, analyst coverage, and comparables) into one response. Each data type is cached independently. Specify which types to include or omit to get above-the-fold defaults (profile, stock-summary, holdings, sectors).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "include": {
                  "description": "Comma-separated list of data types to include. Available: profile,holdings,sectors,countries,stock-summary,performance,news,analyst,comparables. Default (when omitted): profile,stock-summary,holdings,sectors",
                  "type": "string"
                },
                "ticker": {
                  "description": "ETF ticker symbol (e.g., SPY, QQQ, IWM)",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politicians",
            "title": "Get Politicians",
            "description": "List and search congressional politicians who have STOCK Act trading disclosures. Filter by party (D/R/I), state, or search by name. Returns paginated results with trade counts, last trade date, and net buy/sell direction over the trailing 12 months.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 10, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "party": {
                  "description": "Filter by party: 'D' (Democrat), 'R' (Republican), 'I' (Independent)",
                  "enum": [
                    "D",
                    "R",
                    "I"
                  ],
                  "type": "string"
                },
                "search": {
                  "description": "Search by politician name (partial match)",
                  "type": "string"
                },
                "sortBy": {
                  "description": "Sort field (default: 'last_trade')",
                  "enum": [
                    "name",
                    "last_trade",
                    "total_trades"
                  ],
                  "type": "string"
                },
                "sortOrder": {
                  "description": "Sort direction (default: 'desc')",
                  "enum": [
                    "asc",
                    "desc"
                  ],
                  "type": "string"
                },
                "state": {
                  "description": "Filter by US state (2-letter code, e.g. \"CA\", \"TX\")",
                  "maxLength": 2,
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_detail",
            "title": "Get Politician Detail",
            "description": "Get the full profile for a politician including party, state, chamber, trade statistics, filing delay metrics, most traded sector, and their 10 most recent transactions. Use get_politicians first to find the slug (e.g. \"sen-nancy-pelosi\").",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "slug": {
                  "description": "Politician URL slug (e.g., \"sen-nancy-pelosi\", \"sen-tommy-tuberville\")",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_transactions",
            "title": "Get Politician Transactions",
            "description": "Get paginated trade history for a specific politician. Returns individual STOCK Act disclosures with ticker, transaction type, amount range, filing delay, and late filing flag. Includes a summary with total buys/sells and net value.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 50, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "slug": {
                  "description": "Politician URL slug (e.g., \"sen-nancy-pelosi\")",
                  "type": "string"
                },
                "sortBy": {
                  "description": "Sort field (default: 'date')",
                  "enum": [
                    "date",
                    "amount"
                  ],
                  "type": "string"
                },
                "sortOrder": {
                  "description": "Sort direction (default: 'desc')",
                  "enum": [
                    "asc",
                    "desc"
                  ],
                  "type": "string"
                },
                "type": {
                  "description": "Filter by transaction type: 'Purchase' or 'Sale'",
                  "enum": [
                    "Purchase",
                    "Sale"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_activity",
            "title": "Get Politician Activity",
            "description": "Get activity metrics for a politician broken down by period (30d, 90d, 1y, all-time). Includes buy/sell counts and values per period, most traded tickers (top 10), and transaction type breakdown. Useful for analyzing trading patterns over time.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "slug": {
                  "description": "Politician URL slug (e.g., \"sen-nancy-pelosi\")",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politicians_most_active",
            "title": "Get Most Active Politicians",
            "description": "Discover the most active congressional traders ranked by trade count within a lookback period. Returns each politician with trade count, tickers traded, buy/sell values, and top tickers. Useful for identifying the most prolific political traders.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 10, max: 50)",
                  "maximum": 50,
                  "minimum": 1,
                  "type": "number"
                },
                "period": {
                  "description": "Lookback period (default: '90d')",
                  "enum": [
                    "30d",
                    "90d",
                    "1y",
                    "all"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_recent_trades",
            "title": "Get Recent Politician Trades",
            "description": "Get recent STOCK Act trades across all politicians. Each trade includes the senator info, ticker, transaction type, amount, and filing delay. Filter by direction (buy/sell) and lookback period. Useful for monitoring current congressional trading activity.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "days": {
                  "description": "Lookback period in days (default: 30, max: 365)",
                  "maximum": 365,
                  "minimum": 1,
                  "type": "number"
                },
                "direction": {
                  "description": "Filter by direction: 'buy' or 'sell'",
                  "enum": [
                    "buy",
                    "sell"
                  ],
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 50, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_disclosures",
            "title": "Get Politician Disclosures (Feed)",
            "description": "Per-DISCLOSURE feed of politician trades: one item per congressional STOCK Act periodic transaction report (PTR) or executive-branch OGE Form 278-T that contains at least one trade whose bracket LOWER bound is \u003e= minAmount. Each item carries the politician, filing link, filing delay, and ALL trades of the report sorted largest bracket first, with qualifyingTradeCount for how many clear the threshold. Built for polling: pass the returned nextCursor back as `since` and each disclosure is returned exactly once (for the same minAmount and kinds); keep nextCursor even when items is empty, and call again at once when hasMore is true. Without `since` only disclosures that became complete in the last 48h are returned. A report is emitted only after no new row of it has arrived for a settle window (~8h), so items lag the filing by hours. Render amountRange (the filed bracket); amountMin null means the bracket was not parsed (never $0), amountMax null means \"Over $50,000,000\" or unparsed, ticker null means a non-equity asset.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "kinds": {
                  "description": "Which disclosure kinds to include (default: both). 'congressional' = STOCK Act PTRs (Senate + House), 'executive' = OGE 278-T (Cabinet-level officials).",
                  "items": {
                    "enum": [
                      "congressional",
                      "executive"
                    ],
                    "type": "string"
                  },
                  "minItems": 1,
                  "type": "array"
                },
                "limit": {
                  "description": "Maximum disclosures to return (default: 50, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "integer"
                },
                "minAmount": {
                  "description": "USD threshold compared to each trade's bracket lower bound (default: 50001). A disclosure qualifies when ANY of its trades meets it.",
                  "minimum": 1,
                  "type": "integer"
                },
                "since": {
                  "description": "Opaque cursor: the nextCursor from a previous call, verbatim. Omit only on the first call.",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_late_filers",
            "title": "Get Politician Late Filers",
            "description": "Get STOCK Act late filing violations -- trades where the disclosure was filed more than 45 days after the transaction (a legal violation). Sorted by filing delay descending. Useful for identifying politicians with poor disclosure compliance.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "days": {
                  "description": "Lookback period in days (default: 180, max: 730)",
                  "maximum": 730,
                  "minimum": 1,
                  "type": "number"
                },
                "limit": {
                  "description": "Maximum results to return (default: 10, max: 50)",
                  "maximum": 50,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_committees",
            "title": "Get Politician Committees",
            "description": "Get committee assignments for a politician including committee name, chamber, role (Chair, Ranking Member, etc.), and subcommittee memberships. Use to correlate trading activity with committee oversight areas. Requires a politician slug (e.g. \"sen-nancy-pelosi\") -- use get_politicians first to find the slug.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "slug": {
                  "description": "Politician URL slug (e.g., \"sen-nancy-pelosi\", \"rep-nancy-pelosi\")",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_votes",
            "title": "Get Politician Votes",
            "description": "Get voting records for a politician by slug. Returns congressional votes with bill info, position (Yea/Nay/Not Voting), and result. Useful for assessing alignment between a politician's votes and their trading positions. Requires Bioguide ID resolution.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 10, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "slug": {
                  "description": "Politician URL slug (e.g., \"sen-nancy-pelosi\")",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_pnl",
            "title": "Get Politician P\u0026L",
            "description": "Get estimated realized + unrealized profit \u0026 loss for a politician. Methodology: each disclosed trade amount range is converted to an estimated share count using the stock's historical market price on the transaction date, then FIFO-matched on SHARES (realized = (sellPrice − buyPrice) × matched shares); open positions are marked to the current price for unrealized P\u0026L. Works for Congress (sen-/rep-) AND executive branch (exec-) officials. Response includes a `totals` object (estimatedRealizedPnl, estimatedUnrealizedPnl, winRate, realizedTrades, tickersTraded) and a `byTicker[]` breakdown (estimatedShares, avgCostBasis, currentPrice, realizedPnl, unrealizedPnl, unrealizedPnlPercent) — byTicker open positions double as the estimated holdings. All figures are ESTIMATES (±25-40% from disclosure bracket width). Use get_politicians first to find the slug.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "slug": {
                  "description": "Politician URL slug — congressional (\"sen-nancy-pelosi\", \"rep-...\") or executive (\"exec-trump-donald-j\")",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politicians_pnl_leaderboard",
            "title": "Get Politicians P\u0026L Leaderboard",
            "description": "Rank politicians (Congress + executive branch) by estimated trading P\u0026L across the universe. Sort by total P\u0026L, win rate, or traded volume. P\u0026L uses price-adjusted share estimation: disclosed amount ranges → estimated shares via historical price → FIFO on shares → open positions marked to current price. Figures are ESTIMATES (±25-40% from disclosure bracket width).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 25, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "sortBy": {
                  "description": "Sort field (default: 'pnl')",
                  "enum": [
                    "pnl",
                    "winRate",
                    "volume"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_roles",
            "title": "Get Politician Roles",
            "description": "Get committee leadership roles (Chair, Ranking Member, etc.) for a politician. Use get_politicians first to find the slug.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "slug": {
                  "description": "Politician URL slug (e.g., \"sen-nancy-pelosi\")",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_recent_congressional_votes",
            "title": "Get Recent Congressional Votes",
            "description": "Get recent congressional roll-call votes across all members, sourced from GovTrack (both chambers as available — currently Senate-heavy). Each vote includes member, bill info, position, and result.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 50, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_recently_sponsored_bills",
            "title": "Get Recently Sponsored Bills (Cross-Politician)",
            "description": "Get the most recently introduced bills across all congressional sponsors. Each bill includes the sponsor block (bioguideId, fullName, party, state, politicianSlug) so persona agents can link directly to the sponsor detail page. politicianSlug is null when the sponsor is no longer in the active roster (typically ex-members). Requires CONGRESS_API_KEY on the backend.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "congress": {
                  "description": "Congress number to filter (default: 119 for current session)",
                  "type": "number"
                },
                "limit": {
                  "description": "Maximum bills to return (default: 10, max: 50)",
                  "maximum": 50,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_political_sector_rotation",
            "title": "Get Political Sector Rotation",
            "description": "Which market SECTORS politicians have been trading in over a trailing window. Aggregates congressional + executive trades by sector and returns, per sector: trade count, total dollar volume, number of distinct politicians, and the top tickers. Use it to see where political trading activity is concentrating (e.g. \"politicians piled into Energy this month\"). Sort by count or dollar volume.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "chamber": {
                  "description": "Optional chamber filter (default: all chambers merged)",
                  "enum": [
                    "senate",
                    "house",
                    "executive"
                  ],
                  "type": "string"
                },
                "limit": {
                  "description": "Top-N sectors to return (default: 15, max: 30)",
                  "maximum": 30,
                  "minimum": 1,
                  "type": "number"
                },
                "sortBy": {
                  "description": "Rank sectors by trade count or summed dollar volume (default: count)",
                  "enum": [
                    "count",
                    "volume"
                  ],
                  "type": "string"
                },
                "windowDays": {
                  "description": "Lookback window in days (default: 30, max: 90)",
                  "maximum": 90,
                  "minimum": 1,
                  "type": "number"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_senate_trades_by_ticker",
            "title": "Get Senate Trades by Ticker",
            "description": "Reverse lookup — find which politicians recently traded a given TICKER. Returns recent STOCK Act disclosures for that symbol with politician info, transaction type, and amount.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 50, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"NVDA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_cash_position",
            "title": "Get AI Cash Position",
            "description": "Get the Signal8 cash position model for a company, derived from the dilution snapshot pipeline: anchor cash and anchor date, monthly burn, post-anchor capital raises (with SEC filing citations), known outflows, estimated current cash and runway months. Use when analyzing a company's current cash situation, runway, or capital raise activity. ALWAYS RETURNS 200 — read `available` and `reason`, never the HTTP status: coverage is partial, so `available: false` with reason `snapshot_not_generated` means THIS COMPANY HAS NOT BEEN ANALYSED YET, which is different from it having no cash data and different from an outage (an outage is a 5xx). Never report a company as having no cash or no runway on the strength of an unavailable response. The `scenarios` envelope is preserved for compatibility but only `scenarios.closed` is populated: `pending` and `announced` are null with reason `scenario_not_modelled` because the extraction records only REALIZED cash-raising events and never models speculative raises. Do not infer them from shelf or ATM capacity. Included in Signal8 Pro (403 FEATURE_NOT_AVAILABLE, requiredTier \"pro\", without it). That is a tier upgrade, not an add-on purchase — the add-on is no longer sold.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_cash_history",
            "title": "Get 10-Year Cash History",
            "description": "Get up to 10 years of quarterly cash position history from SEC XBRL filings (data.sec.gov company-facts). Returns an array of {periodEnd, usd, formType, isAnnual} sorted chronologically. Deduped by period with annual filings preferred over quarterly. Not feature-gated — works for any company with SEC filings.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "screen_must_raise",
            "title": "Screen Companies That Must Raise Capital",
            "description": "Find companies with imminent capital raise needs based on estimated cash runway. Defaults to companies with less than 6 months of cash remaining, sorted by urgency (lowest runway first). Useful for identifying distressed companies, imminent dilution situations, or potential financing catalysts. Runway is estimated from current burn rate.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "industry": {
                  "description": "Filter by company industry (exact match, e.g. \"Biotechnology\", \"Software\")",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 25, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "maxMonths": {
                  "description": "Maximum months of cash runway to filter by (default: 6)",
                  "maximum": 120,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_cash_runway_calendar",
            "title": "Get Cash Runway Depletion Calendar",
            "description": "Find companies projected to run out of cash within a date window. Similar to lockup expiration calendars but for cash depletion events. Returns companies sorted by urgency (lowest runway first). Runway is an estimate based on current burn rate — actual depletion depends on future capital raises and operational changes. Default window is today to 90 days out.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "from": {
                  "description": "Start date (YYYY-MM-DD, default: today)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                },
                "industry": {
                  "description": "Filter by company industry (exact match, e.g. \"Biotechnology\")",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 25, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Offset for pagination (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "to": {
                  "description": "End date (YYYY-MM-DD, default: today + 90 days)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_dilution_coverage",
            "title": "Get Dilution Coverage Status",
            "description": "Cheap pre-check (1 credit) for whether Signal8 holds a dilution analysis for a company: coverage status (verified / stale / not_covered), extraction state (never_extracted / running / failed / timeout / complete), last attempt and last success timestamps, the coverage tier, and whether the ticker is out of scope. CALL THIS FIRST before the expensive dilution tools — it answers \"is there anything to fetch\" for a fraction of the cost. ALWAYS RETURNS 200 — read `available` and `reason`, never the HTTP status. Coverage is partial: `not_covered` means THIS COMPANY HAS NOT BEEN ANALYSED YET, which is different from it having no dilution and different from an outage (an outage is a 5xx). Never report a company as having no dilution on the strength of an unavailable response. An `outOfScope` ticker is a statement about the PRODUCT (dilution analysis covers small-cap issuers only) and says NOTHING about that company's dilution — do not report a large-cap as having no dilution because it is out of scope. A `stale` status means the analysis is real but predates recent filings. NULL, absent or withheld means NOT MEASURED — it NEVER means \"no dilution\", \"no warrants\", \"no shelf\" or zero. A numeric 0 is a MEASURED zero and defeats a null check, so decide from the accompanying availability/withheld/reason field, never from the value itself. If a figure is absent, say it was not measured; do not describe the company as having none of that instrument. Included in Signal8 Pro — without it the call returns 403 with code FEATURE_NOT_AVAILABLE and `requiredTier: \"pro\"`. That is a subscription-tier upgrade, not an add-on purchase; there is no separate add-on to buy.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"MNTS\", \"VNRX\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_dilution_risk",
            "title": "Get Dilution Pressure Score and Risk Levels",
            "description": "Get the dilution pressure score (5 credits): a 0-100 score with its seven-component breakdown (shelf capacity, ATM/equity-line capacity, warrants in the money, convertible proximity, cash burn urgency, historical dilution, toxic financing), plus four risk levels — overall, offering ability, overhead supply, cash need. 🔴 THE SCORE IS MEANINGLESS WITHOUT `scoreMaxMeasured` AND `scoreWithheldReason`: components whose inputs could not be measured are DROPPED FROM THE DENOMINATOR, so a score of 58 may be 58 out of 85, not out of 100. Always report it as `score`/`scoreMaxMeasured` and name the excluded components from `scoreUnmeasuredComponents`; NEVER rescale it to /100, and never treat a low numerator as a low-risk finding. A non-null `scoreWithheldReason` (e.g. `unmeasured_score_components`, `unquantified_live_instruments`, `no_dilution_snapshot`) means there is NO score — not a score of zero. 🔴 WHEN `levelsAreLowerBound` IS TRUE THE LEVELS ARE FLOORS, NOT MEASUREMENTS: a \"medium\" then means AT LEAST medium, because instruments that could not be quantified were excluded from the sum. State it as a lower bound; presenting a floor as a measurement understates the risk of a named issuer. ALWAYS RETURNS 200 — read `available` and `reason`, never the HTTP status. Coverage is partial: `not_covered` means THIS COMPANY HAS NOT BEEN ANALYSED YET, which is different from it having no dilution and different from an outage (an outage is a 5xx). Never report a company as having no dilution on the strength of an unavailable response. NULL, absent or withheld means NOT MEASURED — it NEVER means \"no dilution\", \"no warrants\", \"no shelf\" or zero. A numeric 0 is a MEASURED zero and defeats a null check, so decide from the accompanying availability/withheld/reason field, never from the value itself. If a figure is absent, say it was not measured; do not describe the company as having none of that instrument. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` — a stale as-of date means the answer predates anything filed since, not that nothing has happened. Share counts are rebased onto a single split basis; a row that cannot be rebased is omitted and counted rather than published on a mixed basis. Included in Signal8 Pro — without it the call returns 403 with code FEATURE_NOT_AVAILABLE and `requiredTier: \"pro\"`. That is a subscription-tier upgrade, not an add-on purchase; there is no separate add-on to buy.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"MNTS\", \"VNRX\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_dilution_snapshot",
            "title": "Get Dilution Snapshot Summary",
            "description": "Get the dilution snapshot header (25 credits — the most expensive tool here): summary totals (potential new shares and their percentage of shares outstanding, per-family share totals), the cash position (anchor cash, monthly burn, estimated current cash, runway months), the float block, and `meta` provenance. DOES NOT INCLUDE INSTRUMENT ROWS — call get_dilution_instruments per family for those, and call get_dilution_coverage first to avoid paying 25 credits for an uncovered ticker. 🔴 FLOAT: a declined float block (`available: false`) carries the read tier's `reason` and, when the extraction recorded a veto, a `refusal` object whose `withheldReason` is the exact value get_float serves — read that, not the bare reason, when reconciling the two. 🔴 FLOAT: when `floatWithheldReason` is non-null the tradeable float was NOT MEASURED and must not be stated as a number. `tradeableFloatCeiling` is an UPPER BOUND (\"at most X\"), NOT a float — never feed it to a market capitalisation, a percent-of-float, a short-interest ratio or a comparison; render it with a ≤ and say it is a bound. 🔴 RUNWAY: a runway figure beside `goingConcern: true` is a contradiction the issuer's own auditors have flagged — report both, never the runway alone. ALWAYS RETURNS 200 — read `available` and `reason`, never the HTTP status. Coverage is partial: `not_covered` means THIS COMPANY HAS NOT BEEN ANALYSED YET, which is different from it having no dilution and different from an outage (an outage is a 5xx). Never report a company as having no dilution on the strength of an unavailable response. NULL, absent or withheld means NOT MEASURED — it NEVER means \"no dilution\", \"no warrants\", \"no shelf\" or zero. A numeric 0 is a MEASURED zero and defeats a null check, so decide from the accompanying availability/withheld/reason field, never from the value itself. If a figure is absent, say it was not measured; do not describe the company as having none of that instrument. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` — a stale as-of date means the answer predates anything filed since, not that nothing has happened. Share counts are rebased onto a single split basis; a row that cannot be rebased is omitted and counted rather than published on a mixed basis. Included in Signal8 Pro — without it the call returns 403 with code FEATURE_NOT_AVAILABLE and `requiredTier: \"pro\"`. That is a subscription-tier upgrade, not an add-on purchase; there is no separate add-on to buy.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"MNTS\", \"VNRX\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_dilution_instruments",
            "title": "Get Dilution Instrument Rows by Family",
            "description": "Get ONE instrument family's rows (10 credits) with per-field SEC citations — each figure carries the accession number, filing date and the verbatim quoted sentence it was read from, so every number can be traced to a filing. Families: warrants, convertibles, preferred, shelfs, atms, elocs, s1_offerings, equity_plans, exchangeables, recent_offerings. One family per call — request the families you actually need rather than sweeping all ten. 🔴 ROW-LEVEL WITHHOLDING: `withheldRows` / `withheldRowCount` mean specific rows could NOT be verified and were blanked, so every family total in the response is a LOWER BOUND, not a complete figure. Say so — presenting a holed total as complete understates a named issuer's dilution. An empty rows array on a covered company is a measured \"none found in the filings read\"; an unavailable response is not. 🔴 ON `shelfs` ROWS `babyShelfCurrentCapacityDollars` IS A STORED, DATED FIGURE, NOT TODAY'S HEADROOM: it was struck at extraction time from a float value that may be the issuer's own cover recital months old, less a takedown pool anchored to the corpus window. Always report it WITH its `babyShelfCapacityAsOf` date (`babyShelfCapacityBasis` says which float it rests on); a null date means undated, never current. For the raisable-now figure recomputed from the live float and 60-day-high price call `get_baby_shelf_capacity` — never present the stored figure as current. ALWAYS RETURNS 200 — read `available` and `reason`, never the HTTP status. Coverage is partial: `not_covered` means THIS COMPANY HAS NOT BEEN ANALYSED YET, which is different from it having no dilution and different from an outage (an outage is a 5xx). Never report a company as having no dilution on the strength of an unavailable response. NULL, absent or withheld means NOT MEASURED — it NEVER means \"no dilution\", \"no warrants\", \"no shelf\" or zero. A numeric 0 is a MEASURED zero and defeats a null check, so decide from the accompanying availability/withheld/reason field, never from the value itself. If a figure is absent, say it was not measured; do not describe the company as having none of that instrument. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` — a stale as-of date means the answer predates anything filed since, not that nothing has happened. Share counts are rebased onto a single split basis; a row that cannot be rebased is omitted and counted rather than published on a mixed basis. Included in Signal8 Pro — without it the call returns 403 with code FEATURE_NOT_AVAILABLE and `requiredTier: \"pro\"`. That is a subscription-tier upgrade, not an add-on purchase; there is no separate add-on to buy.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "family": {
                  "description": "Instrument family to return. One of: warrants, convertibles, preferred, shelfs, atms, elocs, s1_offerings, equity_plans, exchangeables, recent_offerings.",
                  "enum": [
                    "warrants",
                    "convertibles",
                    "preferred",
                    "shelfs",
                    "atms",
                    "elocs",
                    "s1_offerings",
                    "equity_plans",
                    "exchangeables",
                    "recent_offerings"
                  ],
                  "type": "string"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"MNTS\", \"VNRX\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker",
                "family"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_baby_shelf_capacity",
            "title": "Get Baby-Shelf (S-3 I.B.6) Raisable Capacity",
            "description": "Get the SEC Form S-3 General Instruction I.B.6 \"baby shelf\" capacity (10 credits): how much the issuer may raise off an effective shelf right now, given the one-third-of-public-float cap that applies below a $75M non-affiliate float, less the trailing-twelve-month takedowns already used. Returns the public float basis, the cap, takedowns counted and the remaining raisable amount. 🔴 `constraintApplies: false` means the cap does NOT bind (float at or above $75M, so primary offerings are unlimited under I.B.1) — it is NOT \"no capacity\" and NOT a favourable finding. 🔴 `constraintApplies: null` means the float value was NOT MEASURED (`suppressedReason: \"float_unmeasured\"`): neither the $75M test nor the cap could be answered — report it as not measured, NEVER as \"the cap does not bind\" and NEVER as unlimited. 🔴 A `suppressed` response means the figure is WITHHELD (for example an issuer that has been delisted to OTC and cannot run an S-3 primary at all) — report it as not stateable, NEVER as $0 raisable, which is a claim. 🔴 `suppressedReason: \"ib6_pool_unattributed\"` means the cap DOES apply but the trailing sales that would exhaust it could not all be attributed to an I.B.6 registration, so the derived $0 is a lower BOUND, not a measurement — `remainingCapacity` is null and `capacityUpperBoundDollars` is \"at most\", never a figure. A null remaining capacity is likewise not measured, not zero. ALWAYS RETURNS 200 — read `available` and `reason`, never the HTTP status. Coverage is partial: `not_covered` means THIS COMPANY HAS NOT BEEN ANALYSED YET, which is different from it having no dilution and different from an outage (an outage is a 5xx). Never report a company as having no dilution on the strength of an unavailable response. NULL, absent or withheld means NOT MEASURED — it NEVER means \"no dilution\", \"no warrants\", \"no shelf\" or zero. A numeric 0 is a MEASURED zero and defeats a null check, so decide from the accompanying availability/withheld/reason field, never from the value itself. If a figure is absent, say it was not measured; do not describe the company as having none of that instrument. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` — a stale as-of date means the answer predates anything filed since, not that nothing has happened. Share counts are rebased onto a single split basis; a row that cannot be rebased is omitted and counted rather than published on a mixed basis. Included in Signal8 Pro — without it the call returns 403 with code FEATURE_NOT_AVAILABLE and `requiredTier: \"pro\"`. That is a subscription-tier upgrade, not an add-on purchase; there is no separate add-on to buy.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"MNTS\", \"VNRX\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_dilution_performance",
            "title": "Get Post-Offering Price Performance",
            "description": "Get post-offering price performance (10 credits): for each recorded offering, how the stock traded after it priced or closed. Use when assessing how the market has absorbed this issuer's past financings. 🔴 THIS IS HISTORY, NOT A FORECAST — it describes what happened after prior offerings and must never be phrased as an expectation, a price target or a prediction about a named company. An empty or unavailable series means no offering performance was measured, NOT that offerings had no effect and NOT that there were no offerings. ALWAYS RETURNS 200 — read `available` and `reason`, never the HTTP status. Coverage is partial: `not_covered` means THIS COMPANY HAS NOT BEEN ANALYSED YET, which is different from it having no dilution and different from an outage (an outage is a 5xx). Never report a company as having no dilution on the strength of an unavailable response. NULL, absent or withheld means NOT MEASURED — it NEVER means \"no dilution\", \"no warrants\", \"no shelf\" or zero. A numeric 0 is a MEASURED zero and defeats a null check, so decide from the accompanying availability/withheld/reason field, never from the value itself. If a figure is absent, say it was not measured; do not describe the company as having none of that instrument. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` — a stale as-of date means the answer predates anything filed since, not that nothing has happened. Share counts are rebased onto a single split basis; a row that cannot be rebased is omitted and counted rather than published on a mixed basis. Included in Signal8 Pro — without it the call returns 403 with code FEATURE_NOT_AVAILABLE and `requiredTier: \"pro\"`. That is a subscription-tier upgrade, not an add-on purchase; there is no separate add-on to buy.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"MNTS\", \"VNRX\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_dilution_history",
            "title": "Get Shares-Outstanding and Cash History",
            "description": "Get the historical shares-outstanding and cash series (10 credits) from SEC XBRL filings, with offering and material-cash-event overlays so an issuance or a raise can be lined up against the share count and cash balance around it. Use for share count growth over time and for the cash trajectory between financings. 🔴 THE HISTORICAL SHARE COUNTS ARE AS FILED — each point is on the split basis in force when it was reported and is NOT rebased to today, so a reverse split shows as a step and points either side of one are not directly comparable. Do not compute a growth rate across a split boundary from these raw points. A gap in the series means no filing supplied that period, not that the share count was unchanged. ALWAYS RETURNS 200 — read `available` and `reason`, never the HTTP status. Coverage is partial: `not_covered` means THIS COMPANY HAS NOT BEEN ANALYSED YET, which is different from it having no dilution and different from an outage (an outage is a 5xx). Never report a company as having no dilution on the strength of an unavailable response. NULL, absent or withheld means NOT MEASURED — it NEVER means \"no dilution\", \"no warrants\", \"no shelf\" or zero. A numeric 0 is a MEASURED zero and defeats a null check, so decide from the accompanying availability/withheld/reason field, never from the value itself. If a figure is absent, say it was not measured; do not describe the company as having none of that instrument. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` — a stale as-of date means the answer predates anything filed since, not that nothing has happened. Share counts are rebased onto a single split basis; a row that cannot be rebased is omitted and counted rather than published on a mixed basis. Included in Signal8 Pro — without it the call returns 403 with code FEATURE_NOT_AVAILABLE and `requiredTier: \"pro\"`. That is a subscription-tier upgrade, not an add-on purchase; there is no separate add-on to buy.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"MNTS\", \"VNRX\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_intraday_bars",
            "title": "Get Intraday Price Bars",
            "description": "Get intraday OHLCV candles at 1, 5, 15, 30, or 60-minute resolution. Use for intraday price action analysis, volume patterns, and short-term technical analysis. Returns open, high, low, close, and volume for each bar. Set extended=true (1-minute resolution only) to include premarket (04:00–09:30 ET) and after-hours (16:00–20:00 ET) bars.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "extended": {
                  "description": "Include extended-hours bars (premarket 04:00–09:30 ET and after-hours 16:00–20:00 ET). Only supported with resolution \"1\".",
                  "type": "boolean"
                },
                "from": {
                  "description": "Start time as UNIX timestamp",
                  "type": "integer"
                },
                "resolution": {
                  "description": "Bar resolution in minutes",
                  "enum": [
                    "1",
                    "5",
                    "15",
                    "30",
                    "60"
                  ],
                  "type": "string"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                },
                "to": {
                  "description": "End time as UNIX timestamp",
                  "type": "integer"
                }
              },
              "required": [
                "ticker",
                "resolution",
                "from",
                "to"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_volume_profile",
            "title": "Get Volume Profile",
            "description": "Get volume distribution across price levels for a single trading day. Returns price buckets with volume, Point of Control (highest volume level), and Value Area (price range containing 70% of volume). Use for identifying support/resistance and high-volume price nodes.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "bucketSize": {
                  "default": 1,
                  "description": "Price bucket width in dollars (default $1.00)",
                  "maximum": 100,
                  "minimum": 0.01,
                  "type": "number"
                },
                "date": {
                  "description": "Trading day (YYYY-MM-DD)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker",
                "date"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_accumulation_snapshot",
            "title": "Get Accumulation Snapshot",
            "description": "Get intraday accumulation/distribution metrics for the current or most recent trading session. Returns session VWAP, volume above/below VWAP, estimated buy vs sell volume (tick rule), volume by time period (morning/midday/afternoon), and comparison to average volume. Use for assessing real-time buying/selling pressure.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_insider_positions",
            "title": "Get Insider Positions",
            "description": "Get current open insider positions for a CIK (either an insider or an issuer). If an issuer (company) CIK is supplied, returns all insiders' positions for that company. If an insider (reporting-person) CIK is supplied, returns that insider's open positions across all issuers they have filed Form 4 for. The response includes a `lookupMode` field (`\"issuer\"` or `\"insider\"`) indicating which interpretation matched. Derived from Form 4 filings.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "cik": {
                  "description": "SEC CIK number of the insider OR the issuer (company). Tried as issuer first, then falls back to insider.",
                  "type": "string"
                }
              },
              "required": [
                "cik"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_insider_positions_by_ticker",
            "title": "Get Insider Positions by Ticker",
            "description": "Get per-insider position aggregates for a given ticker — which insiders hold positions in the stock and their aggregate cost/value. Derived from Form 4 filings. NOT LIFETIME: every figure covers only the Form 4 history Signal8 holds, which starts at the response's `coverageStart` date (also repeated on each row) — say \"since \u003ccoverageStart\u003e\", never \"lifetime\" or \"all-time\". Each row carries `costBasisStatus`: `complete` (every share the history knows was bought inside coverage), `partial` (the holding predates coverage, so `weightedAvgCost` averages only in-coverage priced buys and is NOT the cost of the position), or `unknown` (the first in-coverage event was a sale, or there was no priced buy — `weightedAvgCost`/`costBasisTotal` are null, which means NOT MEASURED, never zero cost).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_analyst_grades",
            "title": "Get Analyst Grades",
            "description": "Get recent analyst grade actions (upgrades, downgrades, initiations) for a ticker, including the grading firm and previous/new grade.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results to return (default: 10, max: 50)",
                  "maximum": 50,
                  "minimum": 1,
                  "type": "number"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_price_target",
            "title": "Get Price Target",
            "description": "Get analyst price target data for a ticker. By default returns the consensus / split-adjusted average price target. Set list=true to return the full per-analyst list of individual price targets instead.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Maximum results when list=true (default: 50, max: 100). Ignored for consensus.",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "list": {
                  "description": "false/omitted = consensus price target; true = per-analyst price-target list",
                  "type": "boolean"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_analyst_coverage",
            "title": "Get Analyst Coverage",
            "description": "Get aggregated analyst coverage for a ticker — consolidated view of grades, targets, and coverage breadth across covering firms.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_donors",
            "title": "Get Politician Donors",
            "description": "Get the paginated list of campaign donors (individuals and PACs) for a single politician across one election cycle. Returns donor name, amount, type, employer/occupation (individuals), and committee details (PACs). Use this when a user asks \"who donated to \u003cpolitician\u003e\" or wants the full donor list. For a quick top-10 + cycle totals overview, use get_politician_donor_summary instead.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "cycle": {
                  "description": "Election cycle as 4-digit year (e.g. \"2024\"). Defaults to most recent cycle.",
                  "pattern": "^\\d{4}$",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 50, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "minAmount": {
                  "description": "Minimum contribution amount in USD (filters out small donors)",
                  "minimum": 0,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "slug": {
                  "description": "Politician URL slug (e.g., \"sen-nancy-pelosi\")",
                  "type": "string"
                },
                "sortBy": {
                  "description": "Sort field: 'amount' (default), 'date', or 'name'",
                  "enum": [
                    "amount",
                    "date",
                    "name"
                  ],
                  "type": "string"
                },
                "sortOrder": {
                  "description": "Sort direction (default: 'desc')",
                  "enum": [
                    "asc",
                    "desc"
                  ],
                  "type": "string"
                },
                "type": {
                  "description": "Filter by donor type: 'individual', 'pac', or 'all' (default: 'all')",
                  "enum": [
                    "individual",
                    "pac",
                    "all"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_politician_donor_summary",
            "title": "Get Politician Donor Summary",
            "description": "Get a bundled donor summary for a single politician: cycle totals (raised, spent, cash-on-hand, debts), donor count, top 10 individual donors, and top 10 PAC donors — all in one response. This is the right tool for \"who funds \u003cpolitician\u003e\" or \"biggest donors to \u003cpolitician\u003e\" style questions. For the full paginated list, use get_politician_donors.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "cycle": {
                  "description": "Election cycle as 4-digit year (e.g. \"2024\"). Defaults to most recent cycle.",
                  "pattern": "^\\d{4}$",
                  "type": "string"
                },
                "slug": {
                  "description": "Politician URL slug (e.g., \"sen-nancy-pelosi\")",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_donor_aggregates",
            "title": "Get Donor Aggregates",
            "description": "Get market-wide campaign-finance rollups across ALL tracked politicians for a cycle: total raised, top 10 individual donors, top 10 PACs, party/chamber/cycle splits, and a most-funded politician leaderboard. Use for \"who are the biggest donors in 2024?\" or \"which party raised more?\" type questions. For a single politician, use get_politician_donor_summary.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "chamber": {
                  "description": "Filter by chamber: 'senate' or 'house'",
                  "enum": [
                    "senate",
                    "house"
                  ],
                  "type": "string"
                },
                "cycle": {
                  "description": "Election cycle as 4-digit year (e.g. \"2024\"). Defaults to most recent cycle.",
                  "pattern": "^\\d{4}$",
                  "type": "string"
                },
                "party": {
                  "description": "Filter by party: 'D', 'R', or 'I'",
                  "enum": [
                    "D",
                    "R",
                    "I"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_policy_events",
            "title": "Get Policy Events",
            "description": "List mirrored executive orders (policy events) from the Federal Register feed. Filter by signing-date range, affected sector, or free-text title query. Each event includes its Federal Register document number (externalId), title, signing date (eventDate), normalized affected sectors, full-text URL, and flaggedTradeCount — the number of official trades that occurred in an affected sector near the signing date. IMPORTANT: matches are sector-level co-occurrence — the official traded a stock in a sector the executive order affects, within a window of its signing date. Sector matches are broad and many trades will coincide with policy activity by chance; a match is a starting point for research, not evidence of foreknowledge. The matchBasis field describes match strength only ('sector' = broad sector match), never culpability, and matchCount shows how many EOs matched in the window (a noise indicator).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "from": {
                  "description": "Earliest signing date inclusive (YYYY-MM-DD)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 25, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "q": {
                  "description": "Free-text search over event titles",
                  "type": "string"
                },
                "sector": {
                  "description": "Filter by canonical affected sector (one of the 11 canonical sector strings, e.g. \"Healthcare\", \"Financial Services\", \"Energy\")",
                  "type": "string"
                },
                "to": {
                  "description": "Latest signing date inclusive (YYYY-MM-DD)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_policy_trade_overlap",
            "title": "Get Policy-Trade Overlap",
            "description": "For a single politician, list trades that occurred within a window of days before or after the signing of an executive order affecting the traded sector. Each row contains the trade, the nearestEvent, daysDelta (negative = traded N days before EO signing, positive = traded N days after), matchBasis, and matchCount, plus a summary (totalFlags, totalEstimatedUsd, topSector). Defaults to trades 1-14 days BEFORE signing; same-day trades are always excluded (intraday ordering is unknowable). Unlike get_donor_trade_overlap, executive-branch (exec-) slugs return REAL data here: both congressional and executive trade sources feed the overlap computation. IMPORTANT: matches are sector-level co-occurrence — the official traded a stock in a sector the executive order affects, within a window of its signing date. Sector matches are broad and many trades will coincide with policy activity by chance; a match is a starting point for research, not evidence of foreknowledge. The matchBasis field describes match strength only ('sector' = broad sector match), never culpability, and matchCount shows how many EOs matched in the window (a noise indicator).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "direction": {
                  "description": "Which side of the signing date to include: 'before' (default), 'after', or 'both'",
                  "enum": [
                    "before",
                    "after",
                    "both"
                  ],
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 50, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "slug": {
                  "description": "Politician URL slug — congressional (\"sen-nancy-pelosi\", \"rep-...\") or executive branch (\"exec-...\")",
                  "type": "string"
                },
                "window": {
                  "description": "Match window in days around the EO signing date (default: 14, max: 30)",
                  "maximum": 30,
                  "minimum": 1,
                  "type": "number"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_policy_trade_leaderboard",
            "title": "Get Policy-Trade Leaderboard",
            "description": "Rank politicians (Congress + executive branch) by trades that occurred near executive-order signings in sectors the orders affect. Each row includes the politician, flaggedTradeCount, totalEstimatedUsd, topSector, and an exampleEvent. Use for \"who trades most around policy activity\" style questions. Defaults to the same \"traded 1-14 days before signing\" lens as get_policy_trade_overlap; same-day trades are always excluded. IMPORTANT: matches are sector-level co-occurrence — the official traded a stock in a sector the executive order affects, within a window of its signing date. Sector matches are broad and many trades will coincide with policy activity by chance; a match is a starting point for research, not evidence of foreknowledge. The matchBasis field describes match strength only ('sector' = broad sector match), never culpability, and matchCount shows how many EOs matched in the window (a noise indicator).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "direction": {
                  "description": "Which side of the signing date to include: 'before' (default), 'after', or 'both'",
                  "enum": [
                    "before",
                    "after",
                    "both"
                  ],
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 50, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "sort": {
                  "description": "Ranking order: 'usd' (default — estimated USD value) or 'count' (flagged-trade count)",
                  "enum": [
                    "usd",
                    "count"
                  ],
                  "type": "string"
                },
                "window": {
                  "description": "Match window in days around the EO signing date (default: 14, max: 30)",
                  "maximum": 30,
                  "minimum": 1,
                  "type": "number"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_legislative_calendar",
            "title": "Get Legislative Calendar",
            "description": "Forward-looking legislative catalyst calendar: upcoming House/Senate floor votes (bills and Senate cloture motions) filtered to items that can move tickers. Each item includes the predicted vote window (start/end/granularity/confidence/provenance), marketRelevance (low/medium/high), significance (1-5), affected sectors with direction + mechanism, verified affected tickers with evidence quotes, pass outlook, considerationProcedure (suspension-calendar bills pass ~98% of the time), a conflictBadge when the sponsor traded a verified affected ticker, and tweet/plain summaries. An EMPTY calendar is a normal state — it means nothing market-relevant is scheduled in the window, not an error. Defaults: from=today, to=+14 days, minRelevance=low. IMPORTANT: affectedTickers contains VERIFIED rows only — every ticker carries a verbatim evidenceQuote substring-verified against the actual bill text (no hallucinated tickers). sponsorTradeFacts are restatements of public STOCK Act disclosures with verbatim amount brackets and BOTH transactionDate AND disclosureDate — always cite both dates together (disclosures lag trades by up to 45 days), and never present a fact as evidence of wrongdoing. Vote windows are predictions: check window.provenance for trust level ('uc_explicit' is exact; 'rule_xxii_computed' is a medium-confidence estimate) and window.granularity for how precise the window is (exact time vs day vs week).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "from": {
                  "description": "Earliest vote-window date inclusive (YYYY-MM-DD, default: today)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results to return (default: 25, max: 100)",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "number"
                },
                "minRelevance": {
                  "description": "Minimum market relevance: 'low' (default), 'medium', 'high', or 'none' (explicit opt-in to the full audit trail incl. non-market items — rarely useful)",
                  "enum": [
                    "none",
                    "low",
                    "medium",
                    "high"
                  ],
                  "type": "string"
                },
                "offset": {
                  "description": "Pagination offset (default: 0)",
                  "minimum": 0,
                  "type": "number"
                },
                "to": {
                  "description": "Latest vote-window date inclusive (YYYY-MM-DD, default: today + 14 days)",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_rvol_history",
            "title": "Get RVOL History",
            "description": "Get the per-day relative-volume (RVOL) time series for a ticker, bucketed by trading session (premarket 04:00–09:30 ET, regular 09:30–16:00, afterhours 16:00–20:00, or all four). Each day's RVOL compares that session's volume to a trailing same-session baseline (30 trading days by default — configurable via \"baselineDays\"), so premarket volume is judged against premarket history (not a stale full-day figure). Use for spotting unusual premarket / session volume surges over the last N days. Each point also carries \"baselineState\" — \"ready\" (rvol is populated), \"warming\" (baseline not yet warm), \"no-cutoff-history\" (established ticker that never traded at this session/cutoff before) or \"no-history\" (new listing, no prior trading history at all) — so a null rvol is explained rather than silent. Points additionally carry \"advRatio\" (that day's volume ÷ the trailing 30-session average FULL-DAY volume, null when no full-day denominator exists) and \"advDays\" (its sample size), which give a magnitude to points RVOL cannot rate. advRatio is NOT an RVOL — it compares a partial session to a whole day, so it is typically well under 1 and must not be compared to rvol. Charged per your API tier.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "asOfTime": {
                  "description": "Optional TRUE time-of-day premarket basis. Any HH:MM ET premarket time; snapped to the nearest 15-minute grid cutoff (04:00–09:15, ties resolve to the earlier cutoff). When set, the series is the PREMARKET as-of RVOL: cumulative volume known BY that cutoff ÷ the trailing baselineDays (default 30) average of the SAME cutoff (not the full 04:00–09:30 session). Forces the premarket session — any \"session\" argument is ignored. Each point carries a \"basis\" field: the snapped cutoff actually used (\"asof-0700\"), or \"full-session\" for dates with no precomputed as-of row. Omit for the standard full-session series.",
                  "pattern": "^\\d{2}:\\d{2}$",
                  "type": "string"
                },
                "baselineDays": {
                  "description": "Rolling RVOL baseline window, in trading rows (same-session days). Default 30; values outside 20-250 are clamped. This is the DENOMINATOR window: every RVOL in the response is that period's volume divided by the average of the trailing N same-session (or same-cutoff) days, excluding the day itself. A SHORTER window tracks recent regime changes faster and is noisier; a LONGER one is smoother and slower to react. The warm-up lookback scales with it automatically, so a wide window is never under-filled into an inflated ratio; the minimum-warm-days gate (20 prior sessions) does NOT scale down, so at the 30-row default a ticker needs 20 of its last 30 sessions populated before rvol is non-null. Omit for the standard 30-day baseline; pass 90 for the pre-2026-09 window.",
                  "maximum": 250,
                  "minimum": 20,
                  "type": "integer"
                },
                "days": {
                  "description": "Number of trailing calendar days of history (1–90, default 30).",
                  "maximum": 90,
                  "minimum": 1,
                  "type": "integer"
                },
                "session": {
                  "description": "Restrict to one session bucket; omit to return all four sessions.",
                  "enum": [
                    "premarket",
                    "regular",
                    "afterhours",
                    "all"
                  ],
                  "type": "string"
                },
                "ticker": {
                  "description": "Stock ticker symbol (e.g., \"AAPL\", \"TSLA\")",
                  "type": "string"
                }
              },
              "required": [
                "ticker"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_premarket_scanner",
            "title": "Get Premarket Scanner",
            "description": "Get the live premarket scanner board — the top premarket gainers and losers by absolute gap %, each row enriched with rvol, marketCap, floatShares (the measured POINT float, null on a withheld dilution-snapshot row — such a row then carries \"floatEstimate\" {shares, bound: \"point\" ~ | \"ceiling\" \u003c= | \"floor\" \u003e=, basis}, the snapshot's own labelled figure: present it as the number with its marker, never as a point, never in arithmetic; neither present = not measured, never 0. The low-float board admits on that figure's VALUE: a \u003c= 8M ceiling is in, a \u003e= 26M floor or a ~27M estimate is out), short interest, dilution, and news/catalyst flags. Off-hours it falls back to the last session. Use for premarket small-cap runner discovery. Set includePennyStocks=true to include sub-$1 names (separate cache slot). During the 04:00–09:30 ET premarket window rows also carry two LIVE volume metrics off the same live cumulative-volume numerator — they are DIFFERENT quantities and must not be substituted for each other or for \"rvol\": \"liveRvol\" = live cumulative premarket volume ÷ the trailing 30-session average cumulative volume AT THE SAME TIME OF MORNING (answers \"is it busy for 08:00?\"), with \"liveRvolAsOf\" giving the 15-minute ET grid cutoff that baseline came from — compare it to meta.asOf (when the live volume was sampled) to judge the small numerator/denominator time skew; and \"premarketPaceRatio\" = the same live volume ÷ the trailing 30-session average FULL premarket session (answers \"what fraction of a typical entire premarket has it already done?\", \u003e1.0 = it already beat a normal premarket before the open). Both are null outside the premarket window or until the baseline is warm — never a fabricated ratio. Set universe=\"lowfloat\" for the separate LOW-FLOAT board (float under 10M shares, no top-100 slice) instead of the default movers-derived board; that board is served from the aggregator snapshot and returns an empty rows array with a meta.reason when no snapshot is currently published (a normal off-hours state, not an error). Charged per your API tier.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "includePennyStocks": {
                  "description": "Include sub-$1 (penny) stocks in the results. Default false.",
                  "type": "boolean"
                },
                "sort": {
                  "description": "Sort key for the low-float board: \"gap\" (default) or \"rvol\". Ignored for universe=\"default\", which is always gap-ranked.",
                  "enum": [
                    "gap",
                    "rvol"
                  ],
                  "type": "string"
                },
                "universe": {
                  "description": "Which board to return. \"default\" (the default) is the movers-derived top-100 board. \"lowfloat\" is the low-float board (float \u003c 10M shares, no top-100 slice).",
                  "enum": [
                    "default",
                    "lowfloat"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_upcoming_reverse_splits",
            "title": "Get Upcoming Reverse Splits",
            "description": "Get reverse stock splits SCHEDULED to take effect within a day-offset window of the current US market day, for companies under a market-cap ceiling. Offsets are days from today on the US market calendar: fromOffset=1, toOffset=1 is tomorrow; fromOffset=1, toOffset=7 is the week ahead. Each row carries the ticker, company name, the exact vendor integers (splitFrom/splitTo), a pre-rendered ratio (\"1-for-20\"), the effective date, market cap, float in SHARES, and price. WHAT THIS IS: rows are splits scheduled AS OF NOW — not a guarantee that every split effective in the window is already known. The underlying stock_splits table has NO created_at column, so there is no way to measure when a row first appeared, and a split announced later will simply be missing. Describe results as \"scheduled as of now\", NEVER as \"all of\" or \"every\" reverse split. A scheduled split can also be postponed or cancelled after it is announced. 🔴 capUnknownCount IS A WITHHOLDING COUNT, NOT A ZERO. It counts rows that passed every other filter and were DELIBERATELY EXCLUDED because Signal8 has no measured market cap for them — typically real OTC microcaps. It does NOT mean those companies have no dilution, no split, or no cap; it means the cap was not measured, so they cannot be asserted to sit under the stated ceiling. If you publish a \"under $Xm\" framing and capUnknownCount is above zero, say that N further companies were withheld for unmeasured market cap — do not present the list as complete and do not describe the withheld rows at all. Funds, ETFs and sub-1.5x fractional ratio adjustments are already removed server-side; do not re-filter or re-derive the ratio. AN EMPTY splits ARRAY IS A NORMAL, COMMON RESULT — most single weekdays have no sub-cap reverse split scheduled at all. It is NOT an error, NOT a failure, and NOT evidence that reverse-split activity has stopped. Publish nothing rather than publishing an empty-list framing.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "fromOffset": {
                  "default": 1,
                  "description": "Window start as a day offset from the US market day (default 1 = tomorrow). Must be \u003c= toOffset; an inverted window is rejected rather than silently returning an empty list.",
                  "maximum": 30,
                  "minimum": -30,
                  "type": "integer"
                },
                "maxMarketCap": {
                  "default": 300000000,
                  "description": "Exclusive market-cap ceiling in USD (default 300000000). Rows with NO measured market cap are excluded and counted in capUnknownCount, never assumed to be under the ceiling.",
                  "exclusiveMinimum": 0,
                  "type": "number"
                },
                "toOffset": {
                  "default": 1,
                  "description": "Window end, inclusive, as a day offset from the US market day (default 1). Use 7 with fromOffset 1 for the week ahead.",
                  "maximum": 30,
                  "minimum": -30,
                  "type": "integer"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          },
          {
            "name": "get_recent_uplistings",
            "title": "Get Recent Uplistings",
            "description": "Get OTC-to-exchange uplistings that FINRA recorded on a given US market day, for companies under a market-cap ceiling. Each row carries the old OTC symbol, the resolved new exchange symbol (or null), a confirmed flag, the destination venue (NASDAQ / NYSE / NYSE American / ARCA), company name, effective date, market cap and float in SHARES. 🔴 THIS IS A SAME-DAY READ AND THERE IS NO FORWARD-LOOKING VERSION. FINRA records an uplisting at roughly 01:45 ET ON the day it becomes effective, and the source table has no scheduled/announced column at all. So there is nothing to publish the night before, and dayOffset exists for catch-up reads of past days, NOT for forecasting — a positive offset returns nothing. Never frame these as upcoming, tomorrow, or expected; they have already happened. 🔴 newSymbol: null IS A FIRST-CLASS PUBLISHED STATE, NOT A MISSING FIELD. FINRA's row names only the OLD OTC symbol; the new ticker is resolved by company-name match against Nasdaq SymDir and sometimes cannot be resolved. A guessed or wrong ticker would name a company that did not uplist, so an unresolved row is published naming the OLD symbol and saying the new one was not resolved. DO NOT infer, guess, look up, or fill in a null newSymbol, and do not drop the row. confirmed: false means the symbol resolution is PROVISIONAL — render it as provisional, keep it out of any headline, and do not assert the new ticker as fact. Only confirmed: true is a confirmed resolution. 🔴 capUnknownCount IS A WITHHOLDING COUNT, NOT A ZERO — rows that cleared every other filter but have NO measured market cap, so they cannot be asserted to sit under the stated ceiling. It does not mean those companies have no cap. Disclose the count if you publish a cap-bracketed framing. AN EMPTY uplistings ARRAY IS THE NORMAL, EXPECTED RESULT ON MOST DAYS — uplistings run roughly 6.6 per month across ALL market caps, so the large majority of days genuinely have none. It is NOT an error, NOT an outage, and NOT evidence that uplisting activity has stopped. Publish nothing rather than publishing an empty-list framing.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "dayOffset": {
                  "default": 0,
                  "description": "Day offset from the US market day (default 0 = today). Negative values read past days. A positive value returns nothing — there is no forward-looking uplisting data.",
                  "maximum": 30,
                  "minimum": -30,
                  "type": "integer"
                },
                "maxMarketCap": {
                  "default": 300000000,
                  "description": "Exclusive market-cap ceiling in USD (default 300000000). Rows with NO measured market cap are excluded and counted in capUnknownCount, never assumed to be under the ceiling.",
                  "exclusiveMinimum": 0,
                  "type": "number"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "data": {}
              },
              "type": "object"
            },
            "annotations": {
              "readOnlyHint": true
            }
          }
        ]
      },
      "name": "Signal8",
      "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
      "packages": [
        {
          "registryType": "npm",
          "identifier": "@signal8ai/mcp",
          "version": "0.16.1",
          "transport": "stdio"
        }
      ],
      "pageJsonUrl": "https://www.anchorterminal.com/tools/signal8-mcp.json",
      "popularity": {
        "githubStars": 1,
        "npmWeekly": 429
      },
      "registryName": "ai.signal8/mcp",
      "remotes": [
        {
          "type": "streamable-http",
          "url": "https://mcp.signal8.ai/mcp"
        }
      ],
      "repository": "https://github.com/signal8ai/signal8-mcp",
      "reviewed": false,
      "slug": "signal8-mcp",
      "source": "the official MCP registry",
      "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=ai.signal8/mcp",
      "summary": "SEC filings, dilution, insider \u0026 institutional ownership, and political-trade data for AI agents.",
      "updatedAt": "2026-09-23T15:41:12Z",
      "url": "https://www.anchorterminal.com/tools/signal8-mcp",
      "vendor": "signal8.ai",
      "vendorUrl": "https://signal8.ai/mcp",
      "version": "0.16.1",
      "websiteUrl": "https://signal8.ai/mcp",
      "where": "both",
      "why": [
        "vendor"
      ]
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/signal8-mcp",
    "json": "https://www.anchorterminal.com/tools/signal8-mcp.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/signal8-mcp.md",
    "slim": "https://www.anchorterminal.com/tools/signal8-mcp.min.md"
  },
  "markdown": "# Signal8\n\n\u003e Indexed, not reviewed: facts from the official MCP registry and our own checks. No score, grade or rank, and not in the rankings until the panel reviews it. How the index works: https://www.anchorterminal.com/indexed/\n\n- Kind: MCP server, by signal8.ai (https://signal8.ai/mcp)\n- Listed because: It's published in the registry under signal8.ai, a namespace the registry only gives to whoever proves they control that domain.\n- What the official MCP registry says: SEC filings, dilution, insider \u0026 institutional ownership, and political-trade data for AI agents.\n\n## Facts\n\n- MCP registry: `ai.signal8/mcp` 0.16.1\n- Endpoint: https://mcp.signal8.ai/mcp (streamable HTTP)\n- Package: npm `@signal8ai/mcp` (stdio)\n- Source: https://github.com/signal8ai/signal8-mcp\n- Website: https://signal8.ai/mcp\n- npm downloads a week: 429\n- GitHub stars: 1\n- Registry entry updated: 2026-09-23\n\n## Tools\n\n- Tools it lists (102, about 39,911 tokens of context, `tools/list` without credentials over MCP 2025-11-25, checked 2026-10-04 22:20 UTC):\n  - `search_companies` (read-only): Search for companies by name or ticker symbol in the Signal8 database. Returns matching companies with their ticker, name, CIK, and exchange. Use this as the…\n  - `get_company_profile` (read-only): Get an enriched company profile by ticker symbol. Returns CIK, exchange, sector, industry, market cap, employee count, description, and other fundamental data.…\n  - `get_quote` (read-only): Get the current stock quote for a company including price, volume, change, market cap, and other real-time market data. Use this when a user asks about a…\n  - `get_market_metrics` (read-only): Get computed market metrics for a company including volume averages, volatility, SMAs, and trend direction. Use when analyzing trading patterns or technical…\n  - `get_short_interest` (read-only): Get short interest data for a company including short volume, short ratio, days to cover, and short percent of float. Use when analyzing bearish sentiment or…\n  - `get_float` (read-only): Get float data for a company: floatShares, floatDefinition, as-of date, and — when the headline float is WITHHELD — the bounds and labelled stand-ins that…\n  - `get_float_history` (read-only): Get the POINT-IN-TIME float history for a company — one sample per trade date (float shares, shares outstanding, and the source the float came from). Use to…\n  - `get_historical_prices` (read-only): Get historical OHLCV price candles for a stock. Supports daily, weekly, and monthly resolutions. Use period shorthand (1M, 3M, 6M, 1Y, 5Y, ALL) or explicit…\n  - `get_stock_price_change` (read-only): Get percentage price changes for a stock across multiple timeframes: 1D, 5D, 1M, 3M, 6M, YTD, 1Y, 3Y, 5Y, 10Y, and MAX. Use this for quick \"how much is it…\n  - `get_financials` (read-only): Get income statement, balance sheet, and cash flow data for a company. Supports annual, quarterly, and trailing-twelve-month views. Use when analyzing revenue,…\n  - `get_earnings` (read-only): Get historical earnings data for a company including EPS actual vs estimate, revenue actual vs estimate, and surprise percentages. Use when analyzing earnings…\n  - `get_executives` (read-only): Get key executives and officers of a company including name, title, compensation, and tenure. Use when researching company leadership or management quality.\n  - `get_news` (read-only): Get recent news articles and press releases for a company. Use when researching recent developments, catalysts, or sentiment drivers. Set pressReleasesOnly to…\n  - `get_analyst_consensus` (read-only): Get analyst ratings consensus for a company including average target price, number of analysts, buy/hold/sell breakdown, and consensus recommendation. Use when…\n  - `get_analyst_estimates` (read-only): Get forward analyst estimates for a company including EPS, revenue, EBITDA, and net income (low/high/avg) with analyst counts. Supports annual and quarterly…\n  - `get_clinical_trials` (read-only): Get clinical trial data for a biotech/pharma company including trial phase, status, conditions, and interventions. Use when analyzing a biotech company's…\n  - `search_clinical_trials` (read-only): Search clinical trials market-wide (cross-company). Distinct from get_clinical_trials, which is scoped to a single ticker. Filter by phase, indication,…\n  - `get_top_movers` (read-only): Top stock movers — gainers (largest % up), losers (largest % down), or active (highest volume). Optional session window (premarket / regular / afterhours;…\n  - `get_market_news` (read-only): Get the latest market-wide news across ALL tickers, most recent first. Every item is significance-classified at ingest (critical | major | standard); the…\n  - `get_market_breadth` (read-only): Get market breadth aggregates (advance/decline counts and ratio, percent of constituents above their 50DMA and 200DMA, and counts of new 52-week highs/lows)…\n  - `get_trading_halts` (read-only): List currently-active trading halts across NASDAQ/NYSE/AMEX (from the consolidated Nasdaq Trader halt feed). Each halt includes ticker, market, haltCode…\n  - `get_earnings_calendar` (read-only): Get upcoming and recent earnings releases between two dates. Optionally restrict to a list of tickers. Returns ticker, date, time (BMO/AMC), EPS estimate, and…\n  - `get_economic_calendar` (read-only): Get scheduled macro/economic events (CPI, FOMC, jobs reports, GDP, etc.) between two dates. Optionally filter to a single country (ISO-3166 alpha-2, e.g.…\n  - `get_filing_calendar` (read-only): Get the forward-looking 10-K / 10-Q SEC filing-deadline calendar within a date window. Optionally restrict to a universe (sp500/ndx/dji/all) and/or a list of…\n  - `get_post_earnings_movers` (read-only): Get stocks that moved significantly after earnings reports on a given date. Returns pre-computed price changes with earnings surprise data in a single call —…\n  - `get_recent_material_filings` (read-only): Recent material 8-K filings (last 7 days) for the constituents of an index universe. By default returns the high-signal 8-K item codes (material agreements,…\n  - `screen_sec_filings` (read-only): Screen SEC filings across all companies with company-level filters (sector, industry, market cap, exchange) combined with filing-level filters (form type, date…\n  - `search_sec_filings` (read-only): Search and list SEC filings with filtering by company (CIK), form type, date range, 8-K item codes and excluded forms, optionally with a full-text query over…\n  - `get_filing_document` (read-only): Get the full raw text/HTML content of an SEC filing by its internal filing ID. Returns the complete filing document which can be very large (10-K filings can…\n  - `get_filing_exhibits` (read-only): List all exhibits (individual documents) within an SEC filing. Returns exhibit metadata including exhibit type, description, and content size. Use this to…\n  - `get_exhibit_content` (read-only): Get the full text/HTML content of a single exhibit from an SEC filing. Returns the exhibit text along with exhibit_type, description, company_name,…\n  - `search_filing_text` (read-only): Full-text search across SEC filing content, websearch syntax (\"quoted phrase\", OR, -exclude), ranked, one match per filing. Quote multi-word phrases — unquoted…\n  - `lookup_accession_number` (read-only): Look up a filing or exhibit by its SEC accession number. Supports both dashed format (e.g., \"0001193125-22-010026\") and compact 18-digit format. Returns filing…\n  - `screen_sec_filings_performance` (read-only): Analyze stock price performance after SEC filings. Returns individual filing records with pre-computed price returns at +1 day, +3 days, +7 days, and +30 days…\n  - `get_insiders` (read-only): Get insider trading discovery data for a company. Includes cluster buying detection, entity-centric insider model, and Form 4 cross-referencing. Shows insider…\n  - `get_ownership` (read-only): Get unified ownership breakdown for a company combining Form 4 insider holdings, 13F institutional holdings, and 13D/13G activist positions. All entities are…\n  - `get_institutions` (read-only): Get institutional holders (13F filers) for a company. Returns institutions that hold positions in this stock based on SEC 13F filings, including shares held,…\n  - `get_institution_detail` (read-only): Get detailed information about a specific institutional investor by their SEC CIK number. Returns the institution name, total AUM, number of holdings, and…\n  - `get_institution_holdings` (read-only): Get the full portfolio holdings for a specific institution by CIK. Returns all positions from their latest 13F filing with shares, value, and portfolio weight.…\n  - `get_institution_position_changes` (read-only): Diff two quarterly 13F snapshots for an institution. Compares the latest filing against the prior quarter and returns per-position changes: new positions,…\n  - `get_institution_activity` (read-only): Get an institution's position changes over recent 13F periods by CIK. Reads the number of trailing periods to include.\n  - `get_institution_filings` (read-only): Get the list of 13F filings for an institution by CIK, with pagination.\n  - `get_institution_derivatives` (read-only): Get an institution's reported PUT/CALL derivative positions by CIK (13F options), with pagination and sorting.\n  - `get_institution_portfolio_analytics` (read-only): Get sector allocation and top holdings analytics for an institution's portfolio by CIK.\n  - `get_institutions_leaderboards` (read-only): Two market-wide institution leaderboards in one call: topByAum (largest holders by assets under management, name-deduped) and mostActive (highest 13F…\n  - `get_insider_transactions` (read-only): Get detailed insider transaction history for a company from Form 4 filings. Returns individual buy/sell transactions with insider name, title, shares, price,…\n  - `get_insider_cluster_buys` (read-only): Detect cluster buying patterns for a company. Identifies periods where 3+ distinct insiders purchased shares within a 14-day window -- a strong bullish signal…\n  - `get_institution_top_aum` (read-only): Discover top institutional holders across the entire company universe ranked by assets under management (AUM). Unlike get_ownership which shows institutions…\n  - `search_institutions` (read-only): Search institutional investors (13F filers) by name. Returns matching institutions with CIK, name, AUM, holdings count, and latest filing period. Use this to…\n  - `get_insider_cross_company` (read-only): Discover insider trading patterns across multiple companies. Unlike get_insiders which shows insider activity for a single ticker, this tool searches the…\n  - `get_compliance` (read-only): Get full compliance rules evaluation for a company. Runs Nasdaq/NYSE deficiency detection, bid price tracking, and delinquent filing detection. Returns a…\n  - `screen_companies` (read-only): Since 2026-10-03 the float column ALWAYS carries the dilution snapshot's own figure when the snapshot has one: \"float\" is the measured POINT float (null on a…\n  - `get_premarket_scan_history` (read-only): Historical MARKET-WIDE premarket scan for a single PAST trade date. For the requested ET date, returns every ticker with that day's premarket (default) session…\n  - `get_split_history` (read-only): Get stock split history for a company including forward and reverse splits with dates, ratios, type classification, and cumulative 2-year reverse split ratio.…\n  - `get_etf_bundle` (read-only): Get aggregated ETF data in a single call. Combines multiple data sources (profile, holdings, sector weightings, country exposure, performance, news, analyst…\n  - `get_politicians` (read-only): List and search congressional politicians who have STOCK Act trading disclosures. Filter by party (D/R/I), state, or search by name. Returns paginated results…\n  - `get_politician_detail` (read-only): Get the full profile for a politician including party, state, chamber, trade statistics, filing delay metrics, most traded sector, and their 10 most recent…\n  - `get_politician_transactions` (read-only): Get paginated trade history for a specific politician. Returns individual STOCK Act disclosures with ticker, transaction type, amount range, filing delay, and…\n  - `get_politician_activity` (read-only): Get activity metrics for a politician broken down by period (30d, 90d, 1y, all-time). Includes buy/sell counts and values per period, most traded tickers (top…\n  - `get_politicians_most_active` (read-only): Discover the most active congressional traders ranked by trade count within a lookback period. Returns each politician with trade count, tickers traded,…\n  - `get_politician_recent_trades` (read-only): Get recent STOCK Act trades across all politicians. Each trade includes the senator info, ticker, transaction type, amount, and filing delay. Filter by…\n  - `get_politician_disclosures` (read-only): Per-DISCLOSURE feed of politician trades: one item per congressional STOCK Act periodic transaction report (PTR) or executive-branch OGE Form 278-T that…\n  - `get_politician_late_filers` (read-only): Get STOCK Act late filing violations -- trades where the disclosure was filed more than 45 days after the transaction (a legal violation). Sorted by filing…\n  - `get_politician_committees` (read-only): Get committee assignments for a politician including committee name, chamber, role (Chair, Ranking Member, etc.), and subcommittee memberships. Use to…\n  - `get_politician_votes` (read-only): Get voting records for a politician by slug. Returns congressional votes with bill info, position (Yea/Nay/Not Voting), and result. Useful for assessing…\n  - `get_politician_pnl` (read-only): Get estimated realized + unrealized profit \u0026 loss for a politician. Methodology: each disclosed trade amount range is converted to an estimated share count…\n  - `get_politicians_pnl_leaderboard` (read-only): Rank politicians (Congress + executive branch) by estimated trading P\u0026L across the universe. Sort by total P\u0026L, win rate, or traded volume. P\u0026L uses…\n  - `get_politician_roles` (read-only): Get committee leadership roles (Chair, Ranking Member, etc.) for a politician. Use get_politicians first to find the slug.\n  - `get_recent_congressional_votes` (read-only): Get recent congressional roll-call votes across all members, sourced from GovTrack (both chambers as available — currently Senate-heavy). Each vote includes…\n  - `get_recently_sponsored_bills` (read-only): Get the most recently introduced bills across all congressional sponsors. Each bill includes the sponsor block (bioguideId, fullName, party, state,…\n  - `get_political_sector_rotation` (read-only): Which market SECTORS politicians have been trading in over a trailing window. Aggregates congressional + executive trades by sector and returns, per sector:…\n  - `get_senate_trades_by_ticker` (read-only): Reverse lookup — find which politicians recently traded a given TICKER. Returns recent STOCK Act disclosures for that symbol with politician info, transaction…\n  - `get_cash_position` (read-only): Get the Signal8 cash position model for a company, derived from the dilution snapshot pipeline: anchor cash and anchor date, monthly burn, post-anchor capital…\n  - `get_cash_history` (read-only): Get up to 10 years of quarterly cash position history from SEC XBRL filings (data.sec.gov company-facts). Returns an array of {periodEnd, usd, formType,…\n  - `screen_must_raise` (read-only): Find companies with imminent capital raise needs based on estimated cash runway. Defaults to companies with less than 6 months of cash remaining, sorted by…\n  - `get_cash_runway_calendar` (read-only): Find companies projected to run out of cash within a date window. Similar to lockup expiration calendars but for cash depletion events. Returns companies…\n  - `get_dilution_coverage` (read-only): Cheap pre-check (1 credit) for whether Signal8 holds a dilution analysis for a company: coverage status (verified / stale / not_covered), extraction state…\n  - `get_dilution_risk` (read-only): Get the dilution pressure score (5 credits): a 0-100 score with its seven-component breakdown (shelf capacity, ATM/equity-line capacity, warrants in the money,…\n  - `get_dilution_snapshot` (read-only): Get the dilution snapshot header (25 credits — the most expensive tool here): summary totals (potential new shares and their percentage of shares outstanding,…\n  - `get_dilution_instruments` (read-only): Get ONE instrument family's rows (10 credits) with per-field SEC citations — each figure carries the accession number, filing date and the verbatim quoted…\n  - `get_baby_shelf_capacity` (read-only): Get the SEC Form S-3 General Instruction I.B.6 \"baby shelf\" capacity (10 credits): how much the issuer may raise off an effective shelf right now, given the…\n  - `get_dilution_performance` (read-only): Get post-offering price performance (10 credits): for each recorded offering, how the stock traded after it priced or closed. Use when assessing how the market…\n  - `get_dilution_history` (read-only): Get the historical shares-outstanding and cash series (10 credits) from SEC XBRL filings, with offering and material-cash-event overlays so an issuance or a…\n  - `get_intraday_bars` (read-only): Get intraday OHLCV candles at 1, 5, 15, 30, or 60-minute resolution. Use for intraday price action analysis, volume patterns, and short-term technical…\n  - `get_volume_profile` (read-only): Get volume distribution across price levels for a single trading day. Returns price buckets with volume, Point of Control (highest volume level), and Value…\n  - `get_accumulation_snapshot` (read-only): Get intraday accumulation/distribution metrics for the current or most recent trading session. Returns session VWAP, volume above/below VWAP, estimated buy vs…\n  - `get_insider_positions` (read-only): Get current open insider positions for a CIK (either an insider or an issuer). If an issuer (company) CIK is supplied, returns all insiders' positions for that…\n  - `get_insider_positions_by_ticker` (read-only): Get per-insider position aggregates for a given ticker — which insiders hold positions in the stock and their aggregate cost/value. Derived from Form 4…\n  - `get_analyst_grades` (read-only): Get recent analyst grade actions (upgrades, downgrades, initiations) for a ticker, including the grading firm and previous/new grade.\n  - `get_price_target` (read-only): Get analyst price target data for a ticker. By default returns the consensus / split-adjusted average price target. Set list=true to return the full…\n  - `get_analyst_coverage` (read-only): Get aggregated analyst coverage for a ticker — consolidated view of grades, targets, and coverage breadth across covering firms.\n  - `get_politician_donors` (read-only): Get the paginated list of campaign donors (individuals and PACs) for a single politician across one election cycle. Returns donor name, amount, type,…\n  - `get_politician_donor_summary` (read-only): Get a bundled donor summary for a single politician: cycle totals (raised, spent, cash-on-hand, debts), donor count, top 10 individual donors, and top 10 PAC…\n  - `get_donor_aggregates` (read-only): Get market-wide campaign-finance rollups across ALL tracked politicians for a cycle: total raised, top 10 individual donors, top 10 PACs, party/chamber/cycle…\n  - `get_policy_events` (read-only): List mirrored executive orders (policy events) from the Federal Register feed. Filter by signing-date range, affected sector, or free-text title query. Each…\n  - `get_policy_trade_overlap` (read-only): For a single politician, list trades that occurred within a window of days before or after the signing of an executive order affecting the traded sector. Each…\n  - `get_policy_trade_leaderboard` (read-only): Rank politicians (Congress + executive branch) by trades that occurred near executive-order signings in sectors the orders affect. Each row includes the…\n  - `get_legislative_calendar` (read-only): Forward-looking legislative catalyst calendar: upcoming House/Senate floor votes (bills and Senate cloture motions) filtered to items that can move tickers.…\n  - `get_rvol_history` (read-only): Get the per-day relative-volume (RVOL) time series for a ticker, bucketed by trading session (premarket 04:00–09:30 ET, regular 09:30–16:00, afterhours…\n  - `get_premarket_scanner` (read-only): Get the live premarket scanner board — the top premarket gainers and losers by absolute gap %, each row enriched with rvol, marketCap, floatShares (the…\n  - `get_upcoming_reverse_splits` (read-only): Get reverse stock splits SCHEDULED to take effect within a day-offset window of the current US market day, for companies under a market-cap ceiling. Offsets…\n  - `get_recent_uplistings` (read-only): Get OTC-to-exchange uplistings that FINRA recorded on a given US market day, for companies under a market-cap ceiling. Each row carries the old OTC symbol, the…\n- How its tools read to an agent (0 errors, 13 warnings, 0 notes, about 39,911 tokens; rules at https://www.anchorterminal.com/check.md; not part of the score):\n  - warn TC07 get_baby_shelf_capacity: the description is about 674 tokens\n  - warn TC07 get_dilution_instruments: the description is about 676 tokens\n  - warn TC07 get_dilution_risk: the description is about 620 tokens\n  - warn TC07 get_dilution_snapshot: the description is about 632 tokens\n  - warn TC07 get_float: the description is about 1,679 tokens\n  - warn TC07 get_premarket_scan_history: the description is about 534 tokens\n  - warn TC07 get_premarket_scanner: the description is about 524 tokens\n  - warn TC07 get_recent_uplistings: the description is about 528 tokens\n  - warn TC14 get_policy_events: allowed values are in the description, not an enum: sector\n  - warn TC20 search_companies: the description steers the model\n  - warn TC22 get_float: the definition is about 1,850 tokens\n  - warn TC22 get_premarket_scan_history: the definition is about 2,200 tokens\n  - warn TC23 server: 102 tools, about 38,986 tokens of definitions\n\n- JSON: https://www.anchorterminal.com/api/v1/tools/signal8-mcp.json\n- Being indexed says nothing about quality, and nobody can pay for it. Ask for a review: https://www.anchorterminal.com/builders/#claiming\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-04",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Indexed",
        "url": "https://www.anchorterminal.com/indexed/"
      },
      {
        "name": "Signal8",
        "url": ""
      }
    ],
    "description": "Signal8, an MCP server by signal8.ai, listed from the official MCP registry. Indexed, not reviewed: facts and our own checks, no score or ranking. SEC filings, dilution, insider \u0026 institutional ownership, and political-trade data for AI agents.",
    "facts": [
      "not reviewed",
      "not ranked",
      "facts only"
    ],
    "h1": "Signal8",
    "image": "https://www.anchorterminal.com/assets/og/indexed.png",
    "path": "/tools/signal8-mcp",
    "published": "",
    "section": "indexed",
    "title": "Signal8: MCP server, indexed from the official MCP registry",
    "toc": null,
    "updated": "2026-10-04",
    "url": "https://www.anchorterminal.com/tools/signal8-mcp"
  },
  "tokens": {
    "markdown": 5800,
    "slim": 5730
  },
  "version": 1
}
