{"name":"synapse-discovery","tools":[{"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).","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, etc.","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"}},{"description":"Compare multiple companies on key financial metrics","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"}},{"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"}},{"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.","name":"get_price_history","parameters":{"properties":{"adjustment":{"description":"Price adjustment type","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"}},{"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 (survivorship-free, 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.","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"}},{"description":"Get the profile of an ETF or mutual fund: family, category, style, expense ratio / fees, yield, inception, index. Expense ratios are fractions (0.0045 = 0.45%). 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).","name":"get_fund_profile","parameters":{"properties":{"ticker":{"description":"Fund ticker symbol","type":"string"}},"required":["ticker"],"type":"object"}},{"description":"Get daily NAV / price history for an ETF or mutual fund. Default is total-return (dividend+capgain adjusted) NAV. 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 (default); raw = NAV","enum":["adjusted","raw"],"type":"string"},"end":{"description":"End date YYYY-MM-DD","type":"string"},"limit":{"default":250,"description":"Max rows","type":"integer"},"start":{"description":"Start date YYYY-MM-DD","type":"string"},"ticker":{"description":"Fund ticker symbol","type":"string"}},"required":["ticker"],"type":"object"}},{"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"}},{"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.","name":"screen_funds","parameters":{"properties":{"category":{"description":"Category substring match (e.g. \"Large Growth\"). 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%). Optional.","type":"number"}},"required":[],"type":"object"}},{"description":"SEC-native fund corporate actions for a fund: reverse/forward splits, liquidations, mergers/reorganizations, name/ticker/fee/manager changes \u2014 extracted from the prospectus family (497/485/424B/486/N-14/N-8F). Catches fund reverse-splits vendors miss (e.g. interval funds like LENDX). Survivorship-free. QUANT TIER.","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"}},{"description":"Get institutional (13F) holders of a stock from our own SEC Form 13F-HR corpus (point-in-time per holder; pass as_of) \u2014 NOT currently populated \u2014 the endpoint exists but the 13F dataset is still in build; it returns honest empties until it ships (/meta reports the same measured answer).","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"}},{"description":"Search for companies, ETFs, or funds","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","enum":["common_stock","etf","mutual_fund","reit"],"type":"string"}},"required":["query"],"type":"object"}},{"description":"Get an economic/macro data series (primary-sourced from US Treasury, the Federal Reserve, BLS, BEA \u2014 not the FRED API). VOCABULARY: the curated catalog under its familiar legacy spellings (list_economic_series enumerates it \u2014 that list is the authority), 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). Anything else 404s honestly \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, cpi, unemployment, vix, sp500, gdp","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 KNOWN on this date (latest vintage <= as_of, from the Philly-Fed RTDSM vintage store). Prevents look-ahead from later revisions. Available for the major revised series (GDP, CPI, payrolls\u2026).","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"}},{"description":"Get MULTIPLE economic series in ONE call \u2014 ideal when a chart needs many series at once (avoids one-call-per-series polling). Pass series_ids as an array of series IDs or friendly names; returns each keyed by the id you passed. Max 50 per call. limit/offset window every member under the same anchor rule as get_economic_series. CHEAPER THAN LOOPING: curated codes cost no upstream budget at all, and the raw-BLS-id members of one call share a single upstream request (one per family window size and cadence), so batching is how you stay inside the shared daily budget rather than a convenience over it. A member that could not be checked comes back as a retryable error naming who refused \u2014 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 (see get_economic_series.as_of)","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"}},{"description":"Get Treasury yield curve with spreads and inversion status","name":"get_yield_curve","parameters":{"properties":{"date":{"description":"Date for yield curve (YYYY-MM-DD, default: latest)","type":"string"}},"required":[],"type":"object"}},{"description":"Get aggregated market context (Fed Funds, CPI, Unemployment, VIX, etc.) for a date","name":"get_market_context","parameters":{"properties":{"date":{"description":"Date for context (YYYY-MM-DD, default: latest)","type":"string"}},"required":[],"type":"object"}},{"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"}},{"description":"Check your current rate-limit budget \u2014 tier, daily limit, calls used today, and remaining \u2014 so you can self-throttle before hitting a wall.","name":"get_quota","parameters":{"properties":{},"required":[],"type":"object"}},{"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). Survivorship-free, 2021-present. QUANT TIER.","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"}},{"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). QUANT TIER.","name":"get_insider_ownership","parameters":{"properties":{"limit":{"default":100,"type":"integer"},"ticker":{"description":"Issuer ticker","type":"string"}},"required":["ticker"],"type":"object"}},{"description":"Prospecting screener over insiders. Filter by company HQ metro (e.g. \"Houston\") or state; the trigger is OPTIONAL \u2014 metro/state alone returns all insiders there, ranked by position value. Triggers: unplanned_selling (open-market sales NOT under a 10b5-1 plan); ma_change_of_control (genuine deal 8-Ks: Item 2.01 completed acquisition + 5.01 change-in-control); material_8k (broad Item 1.01 material agreement); officer_change (Item 5.02); lockup_expiring (IPO lock-up <=90d); itm_options_expiring; retirement_window. Returns people ranked by position VALUE. QUANT TIER.","name":"screen_insiders","parameters":{"properties":{"individuals_only":{"description":"Drop fund/holdco 10%-owners","type":"boolean"},"limit":{"default":50,"type":"integer"},"metro":{"description":"HQ metro, e.g. \"Houston\"","type":"string"},"min_position_value":{"description":"Minimum current position $ value","type":"number"},"state":{"description":"Two-letter state, e.g. TX","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"}},{"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. The forward-looking sell-intent signal that complements Form 4 transactions. Coverage near-complete Apr-2023 onward. QUANT TIER.","name":"get_form144_filings","parameters":{"properties":{"end":{"description":"YYYY-MM-DD","type":"string"},"insider":{"description":"Filer CIK or name","type":"string"},"limit":{"default":50,"type":"integer"},"offset":{"default":0,"description":"Pagination offset; page until has_more=false","type":"integer"},"start":{"description":"YYYY-MM-DD","type":"string"},"ticker":{"description":"Issuer ticker","type":"string"}},"type":"object"}},{"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). QUANT TIER.","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"}},{"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 (#132: the vendor restates history onto today's share basis, a split look-ahead \u2014 each row is decided against the as-filed SEC eps_diluted; eps_restatement labels it and a 'conflict' row serves null levels). 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). QUANT TIER.","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"}},{"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; no licensed vendor sells historical snapshots \u2014 a real ceiling, 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. QUANT TIER.","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"}},{"description":"Self-serve onboarding for the anonymous tier: emails a one-time code to the address you pass. IMPORTANT \u2014 this is the ONE human-in-the-loop step: a HUMAN must open that inbox and give you the 8-digit code (or click the verify link). Plan for that handoff. On success you receive a durable API key IN-BAND (shown once) \u2014 save it and reconnect with the X-API-Key header to keep the account across sessions. ONE MAILBOX = ONE ACCOUNT: a \"+tag\" alias (and, on gmail, dots in the local part) resolves to the same account and the same daily code limit \u2014 it is not a way to get a second one.","name":"request_email_verification","parameters":{"properties":{"email":{"description":"Email to receive the verification code","examples":["you@example.com"],"type":"string"}},"required":["email"],"type":"object"}},{"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"}},{"description":"List available economic data series by category","name":"list_economic_series","parameters":{"properties":{"category":{"description":"Category to list","enum":["interest_rates","inflation","employment","growth","market","commodities","housing","consumer","industrial"],"type":"string"}},"required":[],"type":"object"}},{"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"}}],"version":"1.0.0"}
