{"name":"synapse-discovery","tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Company financial data"},"description":"Get financial data for a company. Returns fundamentals, prices, or both. Every fundamentals row carries period_type (\"annual\" | \"quarterly\") plus the as-filed fiscal_period label, so annual and quarterly figures are never inferred from magnitude: one fiscal year-end can return BOTH an FY row and a derived Q4 row (is_derived_q4=true \u2014 FY minus Q1+Q2+Q3; never sum it with its own FY row). A fiscal-Q4 flow an issuer files only inside its 10-K is served DERIVED (value_basis=derived_q4, from the as-filed annual and quarters, derived_q4_available_from = the annual's filing date) or null with derived_q4_unavailable_reason (EPS is never derived: per_share_not_additive). market_cap is the LINE's own price x that line's OWN share-class count (market_cap_share_scope: listed_class | single_class); issuer_market_cap is the whole company (every class at its own price) and is never summed with line caps. On a depositary (ADS) line the share count is converted onto the ADS by the ratio the issuer's own SEC filings state (market_cap_share_basis = ads, market_cap_ads_ratio = ordinary shares per ADS; EPS for pe_ratio likewise, pe_ads_ratio), or withheld as ads_ratio_unavailable with market_cap_ads_ratio_unavailable_detail. A multi-class line the filing does not attribute is null with multi_class_unattributed. A price-derived metric whose price row carries a basis verdict is null with its token: price {value: null, date, unavailable_reason, basis_flag}; market_cap / pe_ratio with *_unavailable_reason and *_basis_flag (sibling_instrument_print = the stored bar is another listed instrument's print, not this line's). Every fundamentals row carries filing_date (when the period first became public), filing_date_basis, restated_through (when the value came from a later filing) and accession_number; as_of returns only what was public on that date.","name":"get_financial_data","parameters":{"properties":{"as_of":{"description":"Point-in-time date (YYYY-MM-DD) for historical queries","type":"string"},"metrics":{"description":"Metrics to retrieve: revenue, net_income, eps, price, pe_ratio, market_cap, etc. pe_ratio = the as-traded close on the valuation date / TRAILING-TWELVE-MONTH diluted EPS (total diluted EPS, the issuer's, from filings public on that date: the latest fiscal year, or that year plus the quarters since minus the same quarters a year earlier, or four consecutive quarters \u2014 eps_ttm_method; the window ends at the newest period held, eps_ttm_period_end). Never negative: a loss is null with earnings_nonpositive and the signed earnings_yield beside it; every null pe_ratio carries pe_ratio_unavailable_reason. An issuer that files diluted EPS only per share class is divided by the line's OWN class figure where that class attribution is applied (eps_ttm_scope, eps_ttm_class_member).","items":{"type":"string"},"type":"array"},"periods":{"default":4,"description":"How much HISTORY: the number of distinct period ends. A year-end that carries both an annual and a quarterly row returns both without spending a second period.","type":"integer"},"ticker":{"description":"Stock ticker symbol (e.g., AAPL, MSFT)","type":"string"}},"required":["ticker"],"type":"object"},"title":"Company financial data"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Compare companies"},"description":"Compare multiple companies on key financial metrics. market_cap is per LISTED LINE (its own class count x its own price, market_cap_share_scope says which); issuer_market_cap is the whole company \u2014 never add two lines of one issuer. Every requested ticker appears under comparison: one we cannot resolve or compute carries error and code (TICKER_NOT_COVERED / COMPUTATION_ERROR) instead of data. At most 20 tickers are computed per call; each one past the twentieth carries code TOO_MANY_TICKERS (ask for it in another call). pe_ratio = the as-traded close on the valuation date / TRAILING-TWELVE-MONTH diluted EPS (total diluted EPS, the issuer's, from filings public on that date: the latest fiscal year, or that year plus the quarters since minus the same quarters a year earlier, or four consecutive quarters \u2014 eps_ttm_method; the window ends at the newest period held, eps_ttm_period_end). Never negative: a loss is null with earnings_nonpositive and the signed earnings_yield beside it; every null pe_ratio carries pe_ratio_unavailable_reason. An issuer that files diluted EPS only per share class is divided by the line's OWN class figure where that class attribution is applied (eps_ttm_scope, eps_ttm_class_member).","name":"compare_companies","parameters":{"properties":{"metrics":{"description":"Metrics to compare on","items":{"type":"string"},"type":"array"},"tickers":{"description":"List of ticker symbols to compare","items":{"type":"string"},"type":"array"}},"required":["tickers"],"type":"object"},"title":"Compare companies"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Find similar companies"},"description":"Find companies similar to a given company based on sector, size, or metrics","name":"find_similar_companies","parameters":{"properties":{"criteria":{"description":"How to find similar: sector, market_cap, revenue_size, growth_rate","type":"string"},"limit":{"default":10,"description":"Maximum number of results","type":"integer"},"ticker":{"description":"Reference company ticker","type":"string"}},"required":["ticker"],"type":"object"},"title":"Find similar companies"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Price history"},"description":"Get historical stock prices. Paged: default 252 rows/call (max 5000); page with offset until has_more=false \u2014 total_available/truncated always disclose when a window is incomplete, and tier_clipped marks a paywalled (not missing) early history. A row on a secondary source's SPLIT-RESTATED basis serves its raw print (labelled basis=\"restated\") and NULL adjusted/total-return values; the window declares them in secondary_basis_withheld_* \u2014 an honest refusal, not missing data. SPIN-OFFS: a spin-off is a distribution in kind, not a split, so the DEFAULT split_adjusted close shows the price drop on its ex-date; total_return carries the distribution and stays continuous. Use adjustment=total_return for any return calculation; the window lists the events in distributions_in_kind. volume_raw (raw mode) is the AS-TRADED share count and volume the split-adjusted one; where the stored count was fetched before a later split they are derived from the as-traded count (volume_basis_restated_*), and where its basis cannot be established both are null with volume_unavailable_reason (volume_basis_withheld_*). A row whose stored bar is ANOTHER listed instrument's print (a common's or unit's bar left on a warrant / unit / note line; quality_flag sibling_print) is served as its DATE with every price and volume null and price_unavailable_reason=sibling_instrument_print, counted in sibling_print_withheld_* \u2014 a refusal on a session that traded, not a missing session. A row BEFORE a share-basis step the line's split record could not be placed on (quality_flag split_unplaced) serves its as-traded raw print but null split-adjusted and total-return values and a null volume (split_unplaced_withheld_*): never compute a return across that step. A fund line's sub-penny placeholder print (placeholder_print) is served as its date with every value null (placeholder_print_withheld_*). A stored bar that is not a price this line traded at (at least 20x below the line's own level around it with no share-count event, and a witness - no trade, a stale quote, the listing, the issuer's SEC filings or a second licensed source - says so; quality_flag junk_print) is served as its date with every value null and price_unavailable_reason=junk_print (junk_print_withheld_*); a new such bar held by the publish guard reads junk_print_pending (junk_print_pending_*). A row of this tool restored from a second licensed source is labelled basis=restored, basis_source=second_source and its values are served. A stored raw price on a scale the line never traded at (it steps by a power of ten into and out of the stretch with no corporate action, and the issuer's SEC filings or the line's own structure say so; quality_flag scale_suspect) is served raw, labelled basis=scale_unverified, with split-adjusted, total return, factors and volume null and every value from it refused as price_scale_unverified (scale_suspect_withheld_*); a bar off the line's level whose volume is missing or not the line's own (quality_flag offlevel_print) is served as its date with every value null (offlevel_print_withheld_*); a new such bar held by the publish guard reads price_scale_pending (scale_pending_*). A row rescaled from such a stretch by an exact factor is labelled basis=rescaled, basis_source=scale correction and its values are served; one whose raw still carries a split record no filing evidences (quality_flag scale_record_basis) serves its split-adjusted and total-return values and refuses raw-price values as price_scale_record_basis. A stored bar the symbol printed AFTER this listing's evidenced end (another listing under a reused or renamed symbol, or a stale quote; quality_flag reused_symbol_print) is served as its date with every value null and price_unavailable_reason=reused_symbol_print (reused_symbol_print_withheld_*); on a delisted listing such a row lies past its last_trading_date and is not returned at all. A stored bar of ANOTHER listed line of the same issuer (an OTC ordinary, a preferred or a note line) left on this listing while it carried that line's symbol (quality_flag other_line_print) is served as its date with every value null and price_unavailable_reason=other_line_print (other_line_print_withheld_*) \u2014 not a close of this listing; never zero-fill or forward-fill it. A raw print of $1 or more after 2001-04-09 that is not a whole cent is a computed value: a stretch the price feed shipped as its own back-adjusted series is either RESTORED to the as-traded print by its exact factor (labelled basis=restored, basis_source=exact-factor restore) or, where the factor is not witnessed enough, served raw and LABELLED (quality_flag raw_restated, basis=restated) with split-adjusted, total return, volume and every value computed from the price withheld (raw_restated_withheld_*; values refuse with restated_basis_price). A mutual fund's exchange-feed price copy can carry the PREVIOUS session's NAV under a date: a corrected session carries the fund's own NAV record value for its date, or, while its correction is pending, is served as its date with every value null (quality_flag nav_copy_lagged, price_unavailable_reason fund_nav_copy_lagged); a session that disagrees with the NAV record in a way no witness decides is null too (nav_copy_unverified / fund_nav_copy_unverified; nav_copy_*_withheld_*); the fund's NAV for the date is on get_fund_nav. MUTUAL FUNDS: total_return is refused (UNSUPPORTED_ADJUSTMENT) \u2014 use get_fund_nav (adjusted) for a fund's total return; raw / split_adjusted serve an exchange-feed copy of the NAV, whose history_note names the full NAV record.","name":"get_price_history","parameters":{"properties":{"adjustment":{"description":"Price adjustment type. split_adjusted (default) adjusts for share-count changes ONLY \u2014 a spin-off shows as a price drop there; total_return reinvests dividends AND spin-off distributions and is the one to use for returns.","enum":["raw","split_adjusted","total_return"],"type":"string"},"end_date":{"description":"End date (YYYY-MM-DD)","type":"string"},"limit":{"default":252,"description":"Rows per call (default 252, max 5000, 0 = 5000). With start_date, limit bounds the EARLIEST N rows in range; without it, the most-recent N.","type":"integer"},"offset":{"default":0,"description":"Pagination offset in the window-anchor direction (forward from start_date when given; otherwise backward from the newest row). Prefer the next_start/next_end date cursors in the response. Rows always return OLDEST-FIRST.","type":"integer"},"start_date":{"description":"Start date (YYYY-MM-DD)","type":"string"},"ticker":{"description":"Stock ticker symbol","type":"string"}},"required":["ticker"],"type":"object"},"title":"Price history"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Fund holdings (SEC N-PORT)"},"description":"Get full point-in-time holdings of an ETF or mutual fund from SEC N-PORT (not capped at top-10). Pass as_of for the portfolio as it was on a past date (funds that have since closed included, 2019+). Large bond funds run to ~12k positions \u2014 page with offset until count reaches total_holdings (has_more=false). Position weight is pct_of_nav, a FRACTION of NAV (0.0573 = 5.73%) per the house convention; the percent-scale percentage field is deprecated. Each position carries issuer_synapse_id (our resolved issuer, or null with issuer_unresolved_reason) and ticker = the symbol on the report date, with ticker_basis: journal (dated by our journal), filer_reported (the fund's own filing) or current_carried_back (today's symbol, nothing showing it came later); where our journal or the issuer's own tape shows today's symbol was assigned after the report date the ticker is null with ticker_unavailable_reason (the issuer_synapse_id is accepted wherever a ticker is). A filed weight that its own filed market value and the filing's net assets contradict is not served as filed: a zero-value long line reads 0 and any other contradiction is null, each with pct_of_nav_note, counted in weights_reconciled / weights_withheld.","name":"get_fund_holdings","parameters":{"properties":{"as_of":{"description":"Point-in-time date YYYY-MM-DD (latest portfolio reported on/before this date). Optional.","type":"string"},"limit":{"default":50,"description":"Holdings per page (default 50, max 500)","type":"integer"},"offset":{"default":0,"description":"Page offset; page until offset+count >= total_holdings. Optional.","type":"integer"},"ticker":{"description":"Fund ticker symbol","type":"string"}},"required":["ticker"],"type":"object"},"title":"Fund holdings (SEC N-PORT)"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Fund profile"},"description":"Get the profile of an ETF or mutual fund: family, category, style, expense ratio / fees, yield, inception, index. Expense ratios AND yield are fractions (0.0045 = 0.45%); yield is null with yield_note where its unit cannot be established. holdings_count is the position count of the latest SEC N-PORT report on file (holdings_count_as_of). Also returns ttm_distribution_yield \u2014 OUR OWN trailing-12-month distribution yield (first-party), a fraction, computed as the distributions our adjusted chain is eligible to apply (amount present and positive, no quality flag) over the 12 months ending at the fund's latest NAV date divided by that latest raw NAV; null with a reason in ttm_distribution_yield_note where we will not stand behind it \u2014 including when the fund's share basis moved inside the window, or when our chain refuses every distribution in it (never a fabricated 0.0). total_assets is SEC-filed net assets; where total_assets_scope is present it is the fund SERIES' figure (series_all_classes: every share class of the series shows the same number - never sum it across classes), with total_assets_as_of, total_assets_source and a total_assets_unavailable_reason beside a null. A fund whose share class the SEC renamed carries former_names: its earlier SEC names of that same share class, newest first, each with the first and last yearly SEC file listing it (absent when none is recorded).","name":"get_fund_profile","parameters":{"properties":{"ticker":{"description":"Fund ticker symbol","type":"string"}},"required":["ticker"],"type":"object"},"title":"Fund profile"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Fund NAV history"},"description":"Get daily NAV / price history for an ETF or mutual fund. Default is total-return (dividend+capgain adjusted) NAV. Rows are oldest-first (ordering date_asc; order=desc for newest-first), windowed like get_price_history: with start, limit bounds the earliest rows in range; has_more and next_start / next_end say when a window is incomplete. Where our adjusted chain does not stand behind a fund the adjusted values come back null and nav_basis / nav_basis_withheld_reason say why \u2014 raw NAV (adjustment=raw) is unaffected; do not read the nulls as \"no data\". income_gap_months names months in the range where this monthly-paying fund has no distribution our chain can use: where one was paid, those months' returns are REAL but INCOME-SHORT (a price return, missing the coupon) \u2014 a warning beside served values, never a reason to zero-fill. income_gap_month_reasons says whether a month may still arrive by itself (pending) or needs a backfill (unresolved), or carries a flagged amount our chain refuses (refused).","name":"get_fund_nav","parameters":{"properties":{"adjustment":{"description":"adjusted = total return on our chain (default; distribution_adjustment says how distributions are applied); raw = NAV; total_return_reinvest = the reinvest-at-ex-NAV index a fund sponsor publishes, built from the same distributions","enum":["adjusted","raw","total_return_reinvest"],"type":"string"},"end":{"description":"End date YYYY-MM-DD","type":"string"},"limit":{"default":250,"description":"Rows per call (default 250, max 5000, 0 = 5000). With start, limit bounds the EARLIEST N rows in range; without it, the most-recent N.","type":"integer"},"offset":{"default":0,"description":"Page offset in the window-anchor direction (forward from start when given; otherwise backward from the newest row). Prefer the next_start / next_end date cursors.","type":"integer"},"order":{"default":"asc","description":"Row order: asc (oldest-first, the default) or desc (newest-first). Presentational only - it never changes which rows are returned.","enum":["asc","desc"],"type":"string"},"start":{"description":"Start date YYYY-MM-DD","type":"string"},"ticker":{"description":"Fund ticker symbol","type":"string"}},"required":["ticker"],"type":"object"},"title":"Fund NAV history"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Fund ratings"},"description":"Get computed performance/risk ratings for a fund: trailing returns, volatility, Sharpe, max drawdown, within-category expense percentile, and a 1-5 synapse_star_rating (within-category Sharpe rank). Computed from NAV history, first-party.","name":"get_fund_ratings","parameters":{"properties":{"ticker":{"description":"Fund ticker symbol","type":"string"}},"required":["ticker"],"type":"object"},"title":"Fund ratings"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Screen funds"},"description":"Screen/list ETFs and mutual funds by category, fund family, asset class, and/or maximum expense ratio. Returns matching funds with their expense ratio, ranked by total_assets (where total_assets_scope is present, the SERIES' latest SEC net assets, shared by every share class of the series).","name":"screen_funds","parameters":{"properties":{"category":{"description":"Category substring match (e.g. \"Large Growth\") on category_effective \u2014 our own synapse_category where we have one, the profile peer group only where we do not (the same rule get_fund_profile serves). Optional.","type":"string"},"fund_family":{"description":"Fund family substring (e.g. \"Vanguard\"). Optional.","type":"string"},"fund_type":{"description":"Restrict to ETFs or mutual funds. Optional.","enum":["etf","mutual_fund"],"type":"string"},"limit":{"default":25,"description":"Max results","type":"integer"},"max_expense_ratio":{"description":"Max expense ratio as a fraction (e.g. 0.005 = 0.5%). Compares the SERVED expense_ratio (gross, or net where no gross was filed) - the value each row shows. Optional.","type":"number"}},"required":[],"type":"object"},"title":"Screen funds"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Fund corporate actions"},"description":"SEC-native fund corporate actions for a fund: reverse/forward splits, liquidations, mergers/reorganizations, name/ticker/fee/manager changes \u2014 captured directly from the SEC prospectus filing family (497/485/424B/486/N-14/N-8F), including interval funds such as LENDX. A split is served only after it is arithmetically verified against the fund's own raw NAV jump. Includes funds that have since liquidated or delisted. Requires a Quant plan key.","name":"get_fund_corporate_actions","parameters":{"properties":{"action_type":{"description":"Optional filter, e.g. reverse_split / liquidation / merger","type":"string"},"limit":{"default":50,"description":"Max results","type":"integer"},"ticker":{"description":"Fund ticker symbol","type":"string"}},"required":["ticker"],"type":"object"},"title":"Fund corporate actions"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Institutional holders (13F)"},"description":"Get the institutional (13F) holders of a stock from our own SEC Form 13F-HR corpus. Each row is one manager's position from its latest 13F filed on or before as_of, with shares, value_usd in whole dollars and value_basis (filed_dollars / filed_thousands_scaled from a per-filing unit decision, interim_row_band where none exists yet; a value whose unit cannot be established is null) and value_unit_witness (the witness that decided the filing's unit from its own lines: price_tape = our close; corpus_price = the price other managers' filings imply where our tape has no close) and value_scale (1000 where the filer wrote whole dollars x 1000 and the filing was decided so: served divided by 1000; a line 1000x its close is withheld until its filing is decided) and shares_basis (filed_thousands_scaled where the filer typed its share column in thousands and the filing was decided so: shares multiplied by 1000, values as filed). A row another security's position was filed under this issuer's CUSIP for is omitted and counted (holder_identity_refused). Coverage: filings from 2013 onward (the SEC XML era), latest period 2026Q3; a period before 2013Q2 appears only where a manager filed it late or by amendment. Point-in-time per holder: as_of filters the EDGAR filing date, never our ingest date.","name":"get_institutional_holders","parameters":{"properties":{"as_of":{"description":"YYYY-MM-DD point-in-time date. Filters on the 13F FILING date (when it reached EDGAR), never on when we ingested it. Defaults to today.","type":"string"},"limit":{"default":20,"description":"Number of top holders","type":"integer"},"ticker":{"description":"Stock ticker symbol","type":"string"}},"required":["ticker"],"type":"object"},"title":"Institutional holders (13F)"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Search companies and funds"},"description":"Find a company, ETF, fund or index by name or ticker. Each result carries ticker, name, security_type, sector and synapse_id; the synapse_id is accepted wherever a tool takes a ticker. Indexes: a query naming an index (S&P, Nasdaq, Dow, equal weight, total return, sector, VIX, ...) also returns matching index series (index_family, index_kind); list_indexes lists every index we hold. A fund also matches on an earlier SEC name of its share class (its row then carries former_names).","name":"search_entities","parameters":{"properties":{"query":{"description":"Search query (name, ticker, or description)","type":"string"},"sector":{"description":"Filter by sector","type":"string"},"security_type":{"description":"Filter by security type (adr = a US-listed depositary line of a foreign issuer, evidenced by the issuer's own SEC filings)","enum":["common_stock","etf","mutual_fund","reit","index","adr"],"type":"string"}},"required":["query"],"type":"object"},"title":"Search companies and funds"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Economic series"},"description":"Get an economic/macro data series (sourced directly from the primary public publishers: US Treasury, Federal Reserve releases, BLS, BEA, EIA, and the Philadelphia Fed Real-Time Data Set for vintages). VOCABULARY: the curated catalog under its familiar legacy spellings (list_economic_series lists it by category), PLUS any raw BLS id in the CES/CEU/LNS/LNU/CUUR/CUSR/JTS/SMU/SMS/PRS/LAU/LAS/CIU/CIS/LEU/WPU/PCU families fetched live (PPI = WPU\u2026/PCU\u2026, weekly earnings = LEU\u2026). Any other code is not found \u2014 call search_economic_series to find a code by name. A raw-BLS-id lookup draws on a shared daily budget (get_quota reports it); a curated code costs nothing. A live lookup fetches about the last 20 years by default \u2014 pass start_date to reach further back, and read history_bounded/history_note in the response, which name the span actually fetched. A series that stopped publishing before that default window is still served in full: we look deeper before ever saying not-found. Ids fetched together in get_economic_series_batch share one upstream request, and a window already fetched \u2014 by any caller, at any limit or offset \u2014 is served from cache until that survey publishes again, and costs nothing. Popular: fed_funds, treasury_10y, treasury_2y, treasury_30y, treasury_3m, cpi, core_cpi, unemployment, gdp, real_gdp, sp500, vix, dollar_index, oil_wti, industrial_production, pce.","name":"get_economic_series","parameters":{"properties":{"aggregation_method":{"description":"How to aggregate when frequency is set. Default avg.","enum":["avg","sum","eop","bop"],"type":"string"},"as_of":{"description":"POINT-IN-TIME date (YYYY-MM-DD): return each observation as it was PUBLIC on this date. Vintages come from the Philadelphia Fed Real-Time Data Set; each snapshot is filtered on the date it became public, never on its period label. Most series are QUARTERLY snapshots (taken on the 15th of the middle month of each quarter), so on a given as_of the newest knowable observation can be up to a quarter old \u2014 the response states the grain, the snapshot's availability date and when the next one landed. Available for: GDP, GDPC1, GDPDEF, PCECC96, PAYEMS, UNRATE, CPIAUCSL, INDPRO, M1SL, M2SL.","examples":["2020-05-15"],"type":"string"},"end_date":{"description":"End date (YYYY-MM-DD)","examples":["2024-12-31"],"type":"string"},"frequency":{"description":"Down-sample to a coarser frequency before transforming.","enum":["weekly","biweekly","monthly","quarterly","semiannual","annual"],"examples":["quarterly","annual"],"type":"string"},"limit":{"default":100,"description":"Observations per call (default 100, max 5000, 0 = the whole window). WITH start_date this is the EARLIEST N in range and the response carries a next_start cursor; WITHOUT it, the most-recent N with next_end. Same anchor rule as get_price_history.","type":"integer"},"offset":{"default":0,"description":"Page offset in the window-anchor direction; prefer the next_start / next_end date cursors.","type":"integer"},"series_id":{"description":"A curated code under its familiar legacy spelling (DGS10, CPIAUCSL, UNRATE, UEMP15T26\u2026; list_economic_series enumerates the catalog), a friendly name (case-insensitive), or a raw BLS id in the passthrough families. Unknown? Use search_economic_series first.","examples":["UNRATE","CPIAUCSL","PAYEMS","fed_funds","DGS10"],"type":"string"},"start_date":{"description":"Start date (YYYY-MM-DD)","examples":["2020-01-01"],"type":"string"},"units":{"description":"Value transform: lin (level), chg (change), ch1 (change from year ago), pch (% change), pc1 (% change from year ago / YoY), pca (compounded annual rate), cch/cca (continuously compounded), log. Default lin.","enum":["lin","chg","ch1","pch","pc1","pca","cch","cca","log"],"examples":["pc1","pch"],"type":"string"}},"required":["series_id"],"type":"object"},"title":"Economic series"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Economic series (batch)"},"description":"Get several economic series in one call (max 50). Pass series_ids as an array of series IDs or friendly names; returns each keyed by the id you passed. limit/offset window every member under the same anchor rule as get_economic_series. Curated codes cost no upstream budget, and the raw-BLS-id members of one call share a single upstream request (one per family window size and cadence), so batching keeps live lookups inside the shared daily budget. A member that could not be checked comes back as a retryable error naming who refused, never as not-found; do not cache those as absent.","name":"get_economic_series_batch","parameters":{"properties":{"as_of":{"description":"Point-in-time date applied to every series: each catalogued series is served as it was PUBLIC on this date (see get_economic_series.as_of for the vintage grain). Live raw-BLS passthrough members are not vintage-backed and say so (point_in_time:false)","type":"string"},"end_date":{"description":"End date (YYYY-MM-DD), applied to every series","type":"string"},"limit":{"default":100,"description":"Observations per call (default 100, max 5000, 0 = the whole window). WITH start_date this is the EARLIEST N in range and the response carries a next_start cursor; WITHOUT it, the most-recent N with next_end. Same anchor rule as get_price_history.","type":"integer"},"offset":{"default":0,"description":"Page offset in the window-anchor direction; prefer the next_start / next_end date cursors.","type":"integer"},"series_ids":{"description":"Array of series IDs or friendly names (max 50), e.g. [\"UNRATE\",\"PAYEMS\",\"ICSA\"]","items":{"type":"string"},"type":"array"},"start_date":{"description":"Start date (YYYY-MM-DD), applied to every series","type":"string"}},"required":["series_ids"],"type":"object"},"title":"Economic series (batch)"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Treasury yield curve"},"description":"Get Treasury yield curve with spreads and inversion status. pit_basis says what basis the curve was read on (market_observed for same-day Treasury prints, mixed when the maturities disagree \u2014 pit_bases lists them); a maturity we will not serve point-in-time is absent, never zero.","name":"get_yield_curve","parameters":{"properties":{"date":{"description":"Date for yield curve (YYYY-MM-DD, default: latest)","type":"string"}},"required":[],"type":"object"},"title":"Treasury yield curve"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Market context"},"description":"Get aggregated market context (Fed Funds, CPI, Unemployment, VIX, etc.) for a date. EVERY indicator declares a pit_basis (vintage | period_end_floor | market_observed | observation_date | withheld | no_coverage). An indicator with value null and pit_basis withheld is a REFUSAL \u2014 we hold point-in-time snapshots of that series and none was public on that date \u2014 not missing data; no_coverage is the coverage hole. withheld_reason says which. available:false means every indicator was withheld.","name":"get_market_context","parameters":{"properties":{"date":{"description":"Date for context (YYYY-MM-DD, default: latest)","type":"string"}},"required":[],"type":"object"},"title":"Market context"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Search economic series"},"description":"Find economic series by NAME / keywords when you do NOT know the series code \u2014 e.g. \"not in labor force want a job now\" finds NILFWJN, \"unemployment rate\" finds UNRATE. Searches our curated macro catalog (200+ series across rates, inflation, GDP, employment, FX). Returns matches with codes + metadata; pass a result's series_id to get_economic_series.","name":"search_economic_series","parameters":{"properties":{"limit":{"description":"Max results (default 20, max 50)","examples":[20],"type":"integer"},"query":{"description":"Keywords to match against series titles/names","examples":["unemployment rate","manufacturing payrolls","average weekly earnings"],"type":"string"}},"required":["query"],"type":"object"},"title":"Search economic series"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Usage quota"},"description":"Report your current usage: tier, daily call limit, calls used today and remaining, the price-history window your tier reads (historical_years), and the shared budget for live upstream series lookups. Free: it does not count against the daily limit.","name":"get_quota","parameters":{"properties":{},"required":[],"type":"object"},"title":"Usage quota"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Insider transactions"},"description":"Insider (Form 3/4/5) transaction history \u2014 by issuer ticker and/or insider CIK/name, filterable by transaction code (S=open-market sale, P=purchase, A=grant, M=exercise) and Rule 10b5-1 plan status. is_10b5_1 is NULL before 2023 (the SEC flag did not exist). Delisted issuers included, 2021-present. Requires a Quant plan key.","name":"get_insider_transactions","parameters":{"properties":{"code":{"description":"Transaction code filter (S/P/A/M/F/G/C)","type":"string"},"end":{"description":"YYYY-MM-DD","type":"string"},"insider":{"description":"Insider CIK or name fragment","type":"string"},"is_10b5_1":{"description":"Filter plan (true) vs unplanned (false) trades","type":"boolean"},"limit":{"default":50,"type":"integer"},"offset":{"default":0,"type":"integer"},"start":{"description":"YYYY-MM-DD","type":"string"},"ticker":{"description":"Issuer ticker (or omit and pass insider)","type":"string"}},"type":"object"},"title":"Insider transactions"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Insider ownership"},"description":"Current beneficial ownership per insider for an issuer \u2014 derived from each person's latest non-superseded Form 3/4/5 (shares owned following transaction). Requires a Quant plan key. One line per security, direct/indirect and nature of ownership (each trust, LLC or spouse its own line), each carrying the insider's total for the issuer (insider_total_shares_owned: the sum of their lines on today's share basis).","name":"get_insider_ownership","parameters":{"properties":{"limit":{"default":100,"type":"integer"},"ticker":{"description":"Issuer ticker","type":"string"}},"required":["ticker"],"type":"object"},"title":"Insider ownership"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Screen insiders"},"description":"Screen SEC Form 3/4/5 insiders by issuer headquarters location (state, or metro as spelled in result rows) and/or an event trigger. Triggers: unplanned_selling (open-market sales in the last 90 days not under a Rule 10b5-1 plan); ma_change_of_control (8-K Item 2.01 or 5.01 in the last 180 days); material_8k (8-K Item 1.01 in the last 180 days); officer_change (8-K Item 5.02; returns the changed officers, most recent first; change_type narrows to departure or appointment); retirement_window (the insider is an executive officer the proxy lists at 62 or older, with the reason per row). Every screen response carries freshness: the newest event it can serve, and whether the name enrichment behind officer_change is lagging. Holdings and position values are on today's share basis (splits after the filing applied). lockup_expiring (IPO lock-up ending within 90 days); itm_options_expiring and retirement_window only where executive-compensation data is enabled. Other results are sorted by the size of the reported holding (shares owned x latest close). Requires a Quant plan key. shares_owned is the insider's total for the issuer: the sum of their holding lines, one per security, direct/indirect and nature of ownership. A screen needs a metro, state or trigger.","name":"screen_insiders","parameters":{"properties":{"change_type":{"description":"officer_change only: which 8-K Item 5.02 events","enum":["departure","appointment","other"],"type":"string"},"individuals_only":{"description":"Drop fund/holdco 10%-owners","type":"boolean"},"limit":{"default":50,"type":"integer"},"metro":{"description":"Issuer headquarters metro area, spelled as result rows serve it in their metro field (a named metro, else \"City, ST\").","type":"string"},"min_position_value":{"description":"Minimum current position $ value","type":"number"},"state":{"description":"Issuer headquarters state, two-letter code","type":"string"},"trigger":{"enum":["unplanned_selling","ma_change_of_control","material_8k","officer_change","lockup_expiring","itm_options_expiring","retirement_window"],"type":"string"}},"type":"object"},"title":"Screen insiders"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Form 144 filings"},"description":"Form 144 notices of proposed sale (INTENT to sell restricted stock) for a company (ticker) and/or a filer (CIK or name), date-filterable \u2014 or, with neither, a date window (start+end, at most 92 days) scoped by relationship (e.g. \"former\", \"retired\"), broker, issuer headquarters state or metro. The forward-looking sell-intent signal that complements Form 4 transactions. Coverage near-complete Apr-2023 onward. Requires a Quant plan key.","name":"get_form144_filings","parameters":{"properties":{"broker":{"description":"broker name, substring","type":"string"},"end":{"description":"YYYY-MM-DD","type":"string"},"insider":{"description":"Filer CIK or name","type":"string"},"limit":{"default":50,"type":"integer"},"metro":{"description":"issuer headquarters metro, as the screen spells it","type":"string"},"offset":{"default":0,"description":"Pagination offset; page until has_more=false","type":"integer"},"relationship":{"description":"filer relationship to the issuer, substring (e.g. former, retired, director)","type":"string"},"start":{"description":"YYYY-MM-DD","type":"string"},"state":{"description":"issuer headquarters state (two letters)","type":"string"},"ticker":{"description":"Issuer ticker","type":"string"}},"type":"object"},"title":"Form 144 filings"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"IPO lock-up expirations"},"description":"IPO lock-up expiry calendar (from S-1/424B prospectuses): upcoming dates when insider shares become sellable. Filter by ticker or expiring_before/expiring_after (YYYY-MM-DD). Requires a Quant plan key.","name":"get_ipo_lockups","parameters":{"properties":{"expiring_after":{"description":"YYYY-MM-DD","type":"string"},"expiring_before":{"description":"YYYY-MM-DD","type":"string"},"limit":{"default":50,"type":"integer"},"ticker":{"type":"string"}},"type":"object"},"title":"IPO lock-up expirations"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Earnings history"},"description":"Reported-quarter EPS: actual vs the consensus estimate AS IT STOOD AT THE REPORT, with surprise %, report_date and timing (BeforeMarket/AfterMarket) \u2014 quarterly, deep history (~2004 for the deep names). Per-share levels are on the as-reported share basis (source history can arrive restated onto today's share basis, a split look-ahead, so each row is checked against the as-filed SEC eps_diluted; eps_restatement labels it and a 'conflict' row serves null levels). row_source names each row's origin: earnings_feed, or sec_filing \u2014 a delisted line's own first-filed SEC EPS (report_date = the filing date, no consensus: eps_estimate null with a reason). Point-in-time: as_of keeps quarters whose report_date <= as_of. Rows OLDEST-FIRST with next_start/next_end cursors. The same rows as an as-of-dated estimate series: get_earnings_estimates(kind=pre_report). Requires a Quant plan key.","name":"get_earnings_history","parameters":{"properties":{"as_of":{"description":"Point-in-time YYYY-MM-DD: only quarters whose report_date <= as_of (the actual/estimate pair is knowable at the report; rows with no report date are withheld under as_of and counted)","type":"string"},"end":{"description":"YYYY-MM-DD \u2014 latest period_end to include","type":"string"},"limit":{"default":200,"description":"Rows per call (default 200, max 2000, 0 = 2000). With start, bounds the EARLIEST N in range; without it, the most-recent N.","type":"integer"},"offset":{"default":0,"description":"Page offset in the window-anchor direction; prefer the next_start/next_end date cursors. Rows always return OLDEST-FIRST.","type":"integer"},"start":{"description":"YYYY-MM-DD \u2014 earliest period_end (fiscal period) to include","type":"string"},"ticker":{"description":"Issuer ticker","type":"string"}},"required":["ticker"],"type":"object"},"title":"Earnings history"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Earnings estimates"},"description":"Earnings ESTIMATES \u2014 two series, two floors, never conflated. kind=snapshot (default): the daily-captured consensus snapshots (EPS/revenue avg/low/high, analyst counts, growth, EPS trend 7/30/60/90 days ago, revisions up/down) \u2014 one row per TARGET fiscal period (estimate_date) per capture day (captured_at, the honest as-of). Consensus snapshots exist from 2026-02-19 ONLY (daily capture began then, and there is no earlier history to backfill \u2014 a real floor, not a gap). kind=pre_report: the consensus AT EACH REPORT from the earnings history \u2014 as_of = report_date, target_period = the reported quarter, eps_estimate + eps_actual (as-reported basis) \u2014 quarterly, one observation per report, history to ~2004; NOT a forward-year snapshot and NOT a daily series. as_of applies to captured_at (snapshot) / report_date (pre_report). Rows OLDEST-FIRST with next_start/next_end cursors; every result's meta states both floors. Requires a Quant plan key.","name":"get_earnings_estimates","parameters":{"properties":{"as_of":{"description":"Point-in-time YYYY-MM-DD on the OBSERVATION date: captured_at (snapshot) or report_date (pre_report)","type":"string"},"end":{"description":"YYYY-MM-DD \u2014 latest observation date","type":"string"},"kind":{"default":"snapshot","description":"snapshot = daily consensus captures (from 2026-02-19); pre_report = consensus at each report (quarterly, ~2004->)","enum":["snapshot","pre_report"],"type":"string"},"limit":{"default":200,"description":"Rows per call (default 200, max 2000, 0 = 2000); with start, the EARLIEST N in range, else the most-recent N. Pages never split an observation date.","type":"integer"},"offset":{"default":0,"description":"Page offset in the window-anchor direction; prefer the date cursors.","type":"integer"},"start":{"description":"YYYY-MM-DD \u2014 earliest observation date","type":"string"},"target_period":{"description":"YYYY-MM-DD \u2014 keep one TARGET fiscal period: estimate_date (snapshot) / target_period (pre_report). The relative period label (0q/+1q/0y/+1y) is relative to the capture day and is not a filter.","type":"string"},"ticker":{"description":"Issuer ticker","type":"string"}},"required":["ticker"],"type":"object"},"title":"Earnings estimates"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Request email verification"},"description":"Self-serve onboarding for an anonymous session: emails a one-time code to the address you pass. A person has to open that inbox and give you the 8-digit code (or click the verify link), then you call confirm_email_verification. On success you receive a durable API key in the result (shown once); save it and reconnect with the X-API-Key header to keep the account across sessions. One mailbox is one account: a \"+tag\" alias (and, on gmail, dots in the local part) resolves to the same account and the same daily code limit.","name":"request_email_verification","parameters":{"properties":{"email":{"description":"Email to receive the verification code","examples":["you@example.com"],"type":"string"}},"required":["email"],"type":"object"},"title":"Request email verification"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Confirm email verification"},"description":"Finish the onboarding request_email_verification(email) started: pass the 8-digit code your human read out of the inbox. The session is taken from your Mcp-Session-Id header, so the code is the only argument you need (a client with no session may pass email as well). On success this session is promoted to the full free tier (100 calls/day) AND you get a durable API key in-band, shown once \u2014 save it and reconnect with the X-API-Key header. The code expires and a few wrong guesses lock the session, so do not guess.","name":"confirm_email_verification","parameters":{"properties":{"code":{"description":"The 8-digit code from the verification email","examples":["12345678"],"type":"string"},"email":{"description":"Only for a client that never received an Mcp-Session-Id (capped at initialize) \u2014 the address the code was sent to.","type":"string"}},"required":["code"],"type":"object"},"title":"Confirm email verification"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"List indexes"},"description":"List every index price series we hold (US headline benchmarks and their total-return twins, US size and style, equal-weight, S&P 500 and Composite 1500 sectors and industries, Dow Jones / Nasdaq / NYSE sectors, strategy, volatility, commodity, bond, rates, currency and non-US equity indices). Each row: ticker, name, family, index_kind (price / total_return / net_total_return) and how it was decided, the total-return counterpart and its depth, first date, rows, staleness. Filter by family, index_kind or q (e.g. q=\"S&P 500 equal weight total return\" -> SPXEWTR). Fetch a series with get_price_history ticker=\"^<TICKER>\".","name":"list_indexes","parameters":{"properties":{"family":{"description":"Index family (meta.families lists the counts)","enum":["us_headline","us_size_style","equal_weight","sp500_sector","sp1500_sector","sp_strategy","dow_jones_us_sector","nasdaq_us_sector","nyse_arca_phlx","cboe_strategy","volatility","commodity","bond","rates_yields","currency","market_breadth","global_equity","other"],"type":"string"},"index_kind":{"description":"The return basis we serve for the series","enum":["price","total_return","net_total_return"],"type":"string"},"limit":{"default":50,"description":"Rows per page (max 500)","type":"integer"},"membership":{"description":"Only indices whose constituents we serve (true) or only those we do not (false)","type":"boolean"},"offset":{"default":0,"type":"integer"},"q":{"description":"Words to match (name, ticker; \"total return\" / \"net\" / \"TR\" rank that kind first)","type":"string"},"stale":{"description":"Only stale (true) or only current (false) tapes","type":"boolean"},"status":{"default":"active","description":"active (default) or all (inactive entities too)","enum":["active","all"],"type":"string"}},"required":[],"type":"object"},"title":"List indexes"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"List economic series"},"description":"List macro series grouped by category. With no category it lists the popular series; pass a category for every series in it. Use search_economic_series to find a series by name.","name":"list_economic_series","parameters":{"properties":{"category":{"description":"Category to list","enum":["commodities","consumer","credit","employment","financial_conditions","fx","growth","housing","industrial","inflation","interest_rates","leading_indicators","markets","money_supply"],"type":"string"}},"required":[],"type":"object"},"title":"List economic series"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Submit feedback"},"description":"Submit feedback/bug reports about the Synapse API so the team can improve it","name":"submit_feedback","parameters":{"properties":{"body":{"description":"Full details of the feedback / bug report.","type":"string"},"category":{"description":"Kind of feedback: bug, dx (developer experience), data_gap, feature request, or other.","enum":["bug","dx","data_gap","feature","other"],"type":"string"},"context":{"description":"Optional structured context, e.g. a request/response sample.","type":"object"},"endpoint":{"description":"Optional \u2014 the endpoint or tool you were calling (e.g. \"get_fund_holdings\").","type":"string"},"severity":{"description":"Optional severity (e.g. low, medium, high, critical).","type":"string"},"title":{"description":"Short one-line summary of the feedback.","type":"string"}},"required":["category","title","body"],"type":"object"},"title":"Submit feedback"}],"version":"2.0.0"}
