{"serverInfo":{"name":"VecViz","title":"VecViz","version":"1.27.0"},"description":"**Interrogate a quantitative equity model -- do not just read its output.**\n\nVecViz publishes daily model output for 788 US tickers: VNA target prices, probability-weighted price bands, a six-horizon V-Score, VecEvents, channel geometry, correlation, risk history, model portfolios and option fair value.\n\n**Start with `vecviz_read`** -- one ticker, self-sufficient: target, channels, VecEvents, V-Score and which price-probability bands exist. `vecviz_catalog` (free) lists what is covered.\n\n### What makes it different\n\nMost finance MCP servers wrap quotes and fundamentals. This one exposes the model itself, so an agent can audit a number instead of quoting it:\n\n* **Why a target is what it is** -- `vecevent_matrix` returns each VecEvent's contribution to the VNA target, per Vector Set.\n* **What it is built on** -- `vector_set_anchors` returns the historical tops and bottoms each channel is drawn over.\n* **What it becomes if you disagree** -- `vna_scenario` re-prices the target under a changed or added VecEvent. `vecevent_matrix_reviewed` composes several changes at once and reports whether the blend ties out to the sum of the parts.\n* **Whether a price is reachable** -- `price_likelihood` answers \"could NVDA reach 250\" from five angles: the forecast bands and when each reaches it, which Vector Sets already imply it, how many new VecEvents it would take, what the implied option is worth, and whether the V-Score agrees.\n\n### Bring your own information\n\nThe VNA target reflects the VecEvent characterisations **as published at the model date**. If you know something the model date does not -- an earnings print, guidance, a filing, a changed narrative -- do not assume the baseline carries it, and do not lean on your own training data, which may be months out of date. Apply it explicitly: `vna_scenario` for one change, `vecevent_matrix_reviewed` to compose several. You supply the judgement; every number comes back computed, so render them rather than recomputing.\n\n### Correlation, risk and portfolios\n\n* `correlate` -- pairwise correlation across 2-40 tickers by three methods: Pearson (trailing 252-day returns), VecEvent (response to the same event backdrop) and Fingerprint (VecViz shape). Two tickers with no method named returns all three, which is the honest way to see them disagree.\n* `diversifiers` -- what would most diversify an exposure, ranked on expected upside per unit of downside rather than low correlation alone, which regularly selects the worst name in the universe.\n* `portfolio` -- VecViz model portfolios by strategy, max weight and target volatility, or analysis of weights you supply. Omit the strategy and four variants come back deliberately: they are different readings of the same universe, and one alone reads as \"the answer\".\n* `risk_history` -- how a ticker's upside and downside bounds have moved, and where today sits in its own range, so you can say \"90th percentile of its own history\" instead of quoting a bare number.\n* `model_review` (free) -- the published track record: realised bound breaks by ticker, breakage rates, return by cohort, per-variant portfolio performance. The only place \"has VecViz been right about this name lately\" can be answered.\n\n### Also here\n\nScreen 788 tickers or 98 industries on one metric (`vecviz_universe`); chart how any metric has moved and get a PNG URL back (`metric_history`); price an option off the model's own band structure (`option_fair_value`, which cannot say cheap or rich -- there is no market IV source here); and read the method behind any of it (`methodology`).\n\nCalls are priced per request, so cost is knowable before you spend it. `vecviz_catalog`, `methodology` and `model_review` are free.\n\nOutputs are quantitative research, not forecasts or investment advice.\n\n### Auth\n\nAn API key starting with `vv_`.\n\n* **Free** -- ten tickers, one click at https://agents-vecviz.fly.dev/try, no card.\n* **Full access** -- the whole 788-ticker universe, $39/month, cancel anytime: https://vecviz.com/signup/","websiteUrl":"https://vecviz.com","documentationUrl":"https://agents-vecviz.fly.dev/agents","iconUrl":"https://app.vecviz.com/assets/vecviz_icon_v.png","authentication":{"required":true,"schemes":["bearer"],"description":"Send Authorization: Bearer <VecViz API key>, or put the bare key in X-VecViz-Key if your gateway forwards header values verbatim and cannot add the scheme. A free key covering ten tickers is one click at https://agents-vecviz.fly.dev/try, no card; full access to all 788 tickers is $39/month at https://vecviz.com/signup/."},"tools":[{"name":"vecviz_read","title":"Read a ticker","description":"Everything known about ONE ticker: VNA target price, channels, VecEvents, V-Score, and a digest of which price-probability bands exist. START HERE for any single-ticker question -- it is self-sufficient. 'v_score' carries its own scale (-12..+12); a null means not published for this ticker, not neutral. Costs 1 unit. For SEVERAL tickers use vecviz_universe.","inputSchema":{"properties":{"ticker":{"description":"Stock ticker symbol, e.g. NVDA. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker","type":"string"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["ticker"],"title":"vecviz_readArguments","type":"object"},"annotations":{"title":"Read a ticker","readOnlyHint":true,"destructiveHint":false}},{"name":"vecviz_universe","title":"Screen the universe","description":"Screen or batch-read the whole universe at the latest model date. TWO uses. (1) DISCOVERY: rank every ticker on one metric to find candidates. (2) BATCH READ: pass a comma-separated 'tickers' list to get the same fields vecviz_read returns, for up to 1000 named tickers in one call. Costs 1 unit per ticker named -- the SAME rate as vecviz_read, so batching saves round trips, not quota -- or a flat 10 for a whole sector or industry -- so asking for a sector is far cheaper than naming its members. Sorting by 'var' puts the worst downside first; every other key sorts best-first.","inputSchema":{"properties":{"sort_by":{"default":"v_score","description":"Metric to rank on: v_score | vna_upside | oar | var | eq_liq | trailing_return. Every row carries every field regardless, so when batch-reading a named list this only sets the order. 'v_score' is the aggregate V-Score, a whole number from -12 to +12 summing six single-horizon scores of -2 to +2 each; call methodology('v_score') before interpreting a value.","title":"Sort By","type":"string"},"top_n":{"default":25,"description":"Rows to return, capped at 100. The default of 25 is a discovery default: when reading a named `tickers` list, set this to the length of that list or the response is truncated to 25 rows.","title":"Top N","type":"integer"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Exact sector name; vecviz_catalog lists valid values. Costs a flat 10 however many names the sector holds.","title":"Sector"},"min_eq_liq":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Minimum equity-liquidity decile, 1-10. A RANK, not a market cap in dollars.","title":"Min Eq Liq"},"tickers":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated tickers to restrict to, e.g. 'AAPL,MSFT,NVDA'. This is the BATCH READ path: one call returns every field -- V-Score, VNA upside, VaR/OaR bounds, liquidity, trailing return -- for up to 1000 named tickers. Charged 1 unit per ticker, the SAME rate as vecviz_read, so batching saves round trips and per-minute limiter headroom rather than quota; for a real discount ask by sector or industry (flat 10). Use vecviz_read for DEPTH on one name -- it adds VecEvents, channels and the PPF digest, which this tool does not return. For more than 1000 tickers, split into consecutive calls. Tickers with no value in the sort_by column are excluded and counted in meta.warnings, so compare the returned tickers against what you asked for rather than assuming a 1:1 result.","title":"Tickers"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response.","title":"As Of"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Exact industry name (98 of them; vecviz_catalog lists them). Costs the same flat 10 as a sector, so a sector is the cheaper cut per name.","title":"Industry"},"fields":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"compact | full. Large results compact automatically; a full-width whole-universe response is ~85,000 tokens and will not fit most context windows.","title":"Fields"},"skip_unknown":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True drops tickers outside coverage instead of refusing the request. Only ever lowers the charge.","title":"Skip Unknown"}},"title":"vecviz_universeArguments","type":"object"},"annotations":{"title":"Screen the universe","readOnlyHint":true,"destructiveHint":false}},{"name":"diversifiers","title":"Find diversifiers","description":"Top-ranked tickers that would most DIVERSIFY an exposure to a given one -- the call for 'what should I own alongside NVDA'. Two stages: it correlates the subject against every covered ticker on all three published methods and takes a WEIGHTED average -- 40% VecEvent, 40% Pearson, 20% Fingerprint, because Fingerprint's dispersion is 3-5x the others and an equal mean would select on it alone -- then keeps the lowest quintile; then ranks that pool on expected upside per unit of downside, tilted by the V-Score. A high rank therefore means least correlated AND well positioned, not least correlated alone, which is regularly the worst name in the universe. Each row carries sector, industry, EUB, trailing 252-day return and the EqLiq liquidity decile. At least half the list is held at EqLiq 5+, displacing the LOWEST-scoring illiquid names first; the score itself still ignores liquidity. Costs 10 units, priced as a universe screen.","inputSchema":{"properties":{"ticker":{"description":"The ticker whose exposure you want to diversify. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker","type":"string"},"top_n":{"default":20,"description":"How many ranked names to return, 1-100. Default 20.","title":"Top N","type":"integer"},"quintile":{"default":0.2,"description":"Fraction of the average-correlation distribution to keep as candidates before ranking. 0.2 is the lowest quintile and is the default; raise it to widen the pool.","title":"Quintile","type":"number"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["ticker"],"title":"diversifiersArguments","type":"object"},"annotations":{"title":"Find diversifiers","readOnlyHint":true,"destructiveHint":false}},{"name":"metric_history","title":"Chart a metric's history","description":"How one VV-Data-Table metric has MOVED OVER TIME -- the call for 'chart SPY's V-Score', 'has NVDA's upside bound been widening', 'show me semis vs the rest on V-Score since January'. Every other tool here answers at the latest model date only; this one returns the whole published series, its summary statistics (mean, extremes with their dates, where the latest reading sits in its OWN history, longest positive and negative runs) and a signed PNG chart URL you can embed directly in markdown. Name a second entity to add the per-date RATIO of A to B -- a ticker, a sector, or 'rest' for the whole universe except A. Levels are raw; the ratio is computed on shifted values so it cannot go negative, so on V-Score and VNA_PctUpside ratio is deliberately NOT a/b and 'ratio_basis' says which applies. Costs 1 unit per NAMED TICKER (so 1 for a single name, 2 for a pair), or a flat 10 when either side is a sector or 'rest', because that scans the whole file.","inputSchema":{"properties":{"entity_a":{"description":"The ticker or sector whose history you want. A single name ('NVDA'), a sector grouping ('semis', 'mag7', 'tech', 'banks', 'real estate'), or the sector key.","title":"Entity A","type":"string"},"entity_b":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional comparator. Same options as entity_a, plus 'rest' (every single name except A). Supplying it adds a per-date RATIO alongside both levels; omitting it returns A's level series alone and costs less.","title":"Entity B"},"metric":{"default":"V-Score","description":"VV-Data-Table column: V-Score (default), EUB_Ret, EDB_Ret, 95U_Ret, 99U_Ret, 95D_Ret, 99D_Ret, Sigma_95U_Ret, VNA_PctUpside, RangeUp, LevelUpPctR, 99U_Sratio, WtdAvg Angle, DaysSinceLastTop, DaysSinceLastBottom. Common aliases are accepted.","title":"Metric","type":"string"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO or MM/DD/YYYY. Default: the full published history.","title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO or MM/DD/YYYY. Default: the latest model date.","title":"End Date"},"rolling_window":{"default":21,"description":"Trailing-mean window in model dates, 2-252. Default 21.","title":"Rolling Window","type":"integer"},"theme":{"default":"light","description":"Chart theme for the returned PNG: 'light' or 'dark'.","title":"Theme","type":"string"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["entity_a"],"title":"metric_historyArguments","type":"object"},"annotations":{"title":"Chart a metric's history","readOnlyHint":true,"destructiveHint":false}},{"name":"price_likelihood","title":"Assess a price","description":"What VecViz says about the likelihood of a PRICE for a ticker -- the one call for 'could NVDA reach 250' or 'what would take SPY to 600'. Five readings: the forecast bands and the date each reaches the price; which Vector Sets already imply it -- BOTH the per-set VNA basis price, which comes from the centre line alone, AND the full nine-line channel with each VecLevel's model-date and forward-projected price, so a price no basis reaches but every channel contains is reported as such; the tops and bottoms each set is anchored on, and its own forward horizon; how many brand-new VecEvents it would take and of what bias and trend, plus which existing ones would have to be re-characterised and the fewest changes that close the gap; the model-implied value of the put or call the direction implies, struck on the price itself; and whether the V-Score agrees, and at which horizons most emphatically. Composes existing tools rather than adding a model, so it cannot disagree with them. Costs 1 unit. Use 'sections' to skip work -- 'vecevents' is the expensive one.","inputSchema":{"properties":{"ticker":{"description":"Stock ticker symbol, e.g. SPY. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker","type":"string"},"price":{"description":"The price being asked about, in dollars. Direction is taken from this against the model date price, and every section reads it: below is a downside question and prices a put, above is an upside question and prices a call.","title":"Price","type":"number"},"expiry_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Adds the option's fair value at this expiry, interpolated between the two bracketing published horizons rather than snapped to one.","title":"Expiry Days"},"sections":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated subset of ppf, vector_sets, vecevents, option, v_score. Omit for all five. 'vecevents' is by far the most expensive to compute; drop it when the question is only about the bands.","title":"Sections"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["ticker","price"],"title":"price_likelihoodArguments","type":"object"},"annotations":{"title":"Assess a price","readOnlyHint":true,"destructiveHint":false}},{"name":"metric_context","title":"Explain a metric in context","description":"WHY a ticker's number is what it is -- the call for 'how could NVDA's 99D be -45%' or 'why is SPY's EUB so narrow'. Resolves the metric, horizon and value at the latest model date (checking any figure the reader quoted, sign forgiven), then positions it eight ways: its percentile in the ticker's OWN history; percentile rank, z-score and extremes within its SECTOR, its INDUSTRY and the whole universe; the Sigma model's reading of the same bound with the ratio, the difference and why the two models differ; the thirteen V-Score criteria beside their bullish and bearish historical analogues, plus the raw chart-shape columns against peers; both V-Score scales; whether the VNA target corresponds, which Vector Set channel is centred on the price the return implies, its anchoring tops and bottoms, its standalone target and the VecEvents that carry it; the VecEvent catalogue against the universe; and trailing return and liquidity. Note 95D/99D name the 95th/99th-percentile DOWNSIDE return, never a number of days. Composes existing tools rather than adding a model, so it cannot disagree with them. Costs 1 unit; 'sections' narrows the work and 'vna' is the expensive one.","inputSchema":{"properties":{"ticker":{"description":"Stock ticker symbol, e.g. NVDA. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker","type":"string"},"metric":{"default":"99D_Ret","description":"The metric being asked about: a VV Data Table column (99D_Ret, 95U_Ret, EUB_Ret, EDB_Ret, V-Score, VNA_PctUpside, Sigma_95U_Ret, 99U_Sratio, RangeUp, WtdAvg Angle, LevelUpPctR, DaysSinceLastTop, DaysSinceLastBottom, EqLiq, TrailPxRet_252d) or one of the thirteen V-Score criteria by its spider name (Top Top Prox, Bot Bot Prox, Last Top Age, Avg Up Angle, Avg Down Angle, Wgt Up Angles, Up Skew ...). Aliases such as '99% downside' are accepted. 95D/99D name the 95th/99th-percentile DOWNSIDE bound, not a number of days.","title":"Metric","type":"string"},"horizon_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Forecast horizon in trading days: 1, 10, 21, 63, 126 or 252. Default 21. Only the six band returns and the V-Score criteria are published beyond 21; every other column is 21-day only.","title":"Horizon Days"},"quoted_value":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"The number the reader quoted, if any: -45 or -0.45 for a return (percent or fraction both work; the sign is forgiven on a directional metric). The response says whether it matches what is published and, if not, names the nearest published figure.","title":"Quoted Value"},"sections":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated subset of history, peers, sigma, shape, v_score, vna, vecevents, realized. Omit for all eight. 'vna' walks every Vector Set channel and is the expensive one; drop it when the question is only about peers or Sigma.","title":"Sections"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["ticker"],"title":"metric_contextArguments","type":"object"},"annotations":{"title":"Explain a metric in context","readOnlyHint":true,"destructiveHint":false}},{"name":"vector_set_anchors","title":"Show Vector Set anchors","description":"The historical tops and bottoms each Vector Set is drawn over: date, price, and whether each was a top or a bottom, in chronological order. This is what a channel is BUILT ON, which is the missing half of any answer about where a Vector Set's target came from. Read-only and recomputes nothing. Costs 1 unit.","inputSchema":{"properties":{"ticker":{"description":"Stock ticker symbol, e.g. SPY. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker","type":"string"},"vector_sets":{"default":"all","description":"'all', or a comma-separated list like 'vs1,vs11'. Names the ticker does not carry are reported in 'missing' rather than dropped.","title":"Vector Sets","type":"string"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["ticker"],"title":"vector_set_anchorsArguments","type":"object"},"annotations":{"title":"Show Vector Set anchors","readOnlyHint":true,"destructiveHint":false}},{"name":"vecviz_catalog","title":"List coverage","description":"What you can ask about: tickers, sectors, industries, per-dataset coverage, and the precomputed portfolio variants. FREE. Call this before naming tickers -- an unknown symbol is refused rather than silently dropped, and names are added and removed between refreshes.","inputSchema":{"properties":{"sections":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated subset of tickers,sectors,industries,coverage,portfolios. Omit for all of them.","title":"Sections"}},"title":"vecviz_catalogArguments","type":"object"},"annotations":{"title":"List coverage","readOnlyHint":true,"destructiveHint":false}},{"name":"vecevent_matrix","title":"Explain a target price","description":"WHY a ticker's VNA target price is what it is: the contribution of each VecEvent across each Vector Set. Read-only and recomputes nothing. Costs 1 unit.","inputSchema":{"properties":{"ticker":{"description":"Stock ticker symbol, e.g. NVDA. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker","type":"string"},"vector_sets":{"default":"all","description":"'all', or a comma-separated list like 'vs1,vs11' to restrict the columns.","title":"Vector Sets","type":"string"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["ticker"],"title":"vecevent_matrixArguments","type":"object"},"annotations":{"title":"Explain a target price","readOnlyHint":true,"destructiveHint":false}},{"name":"vecevent_matrix_reviewed","title":"Compose VecEvent changes","description":"COMPOSE several VecEvent changes at once and get the whole reviewed picture back. vna_scenario prices ONE change against the untouched baseline and does not compose, so summing its results by hand is unverified arithmetic; this applies every override and new event together and returns the reviewed contribution matrix, the featured Vector Sets, the per-channel geometry, the post-review target, and a tie_out saying whether the blend matches the sum of the individual impacts. You supply the judgement; every number is computed here -- render them verbatim rather than recomputing a target, a contribution or a core width. Costs 1 unit.","inputSchema":{"properties":{"ticker":{"description":"Stock ticker symbol, e.g. NVDA. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker","type":"string"},"overrides":{"default":null,"description":"Existing VecEvents whose characterisation you are changing. A JSON list of objects, each with 'vecevent' (the EXACT name from vecviz_read), 'new_bias' (Bullish|Bearish|Neutral) and 'new_bias_trend' (Intensifying|Steady|Waning; 'Stable' is accepted for Steady). Send ONLY events that actually change -- an unchanged one has no effect and obscures the attribution.","title":"Overrides"},"new_events":{"default":null,"description":"VecEvents the ticker does not yet carry. Same object shape as 'overrides'; each mirrors the footprint of the event starting closest to a year ago, and the response names which one.","title":"New Events"},"vector_sets":{"default":"auto","description":"'auto' selects the three featured Vector Sets on the REVIEWED basis (strongest strength-based weighting, plus the greatest and smallest weighting x core width x reviewed raw upside). Or a comma-separated list like 'vs1,vs11' to fix the columns yourself.","title":"Vector Sets","type":"string"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["ticker"],"title":"vecevent_matrix_reviewedArguments","type":"object"},"annotations":{"title":"Compose VecEvent changes","readOnlyHint":true,"destructiveHint":false}},{"name":"vna_scenario","title":"Re-price under one change","description":"What a ticker's VNA target price becomes under a different VecEvent picture -- either RE-CHARACTERISE an event it already has (a new bias: Bullish/Bearish/Neutral, and/or a new trend: Intensifying/Steady/Waning -- the trend alone can move the target materially) or ADD an event it does not yet carry. Name an event the ticker already has and it is CHANGED; name one it does not and the event is ADDED, mirroring the footprint of the event starting closest to a year ago. You do not choose -- the response reports which happened under 'mode'. Event names must be EXACT; take them from vecviz_read. Costs 1 unit.","inputSchema":{"properties":{"ticker":{"description":"Stock ticker symbol, e.g. NVDA. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker","type":"string"},"vecevent":{"description":"EXACT VecEvent name. Take it from vecviz_read's 'vecevents' -- substring matching is deliberately disabled because it resolved to the wrong event. A name the ticker already has changes that event's bias; a new name adds an event.","title":"Vecevent","type":"string"},"new_bias":{"description":"Bullish | Bearish | Neutral.","title":"New Bias","type":"string"},"new_bias_trend":{"default":"Steady","description":"Intensifying | Steady | Waning. Ignored when new_bias is Neutral. Together with new_bias this selects the during/post VecLevel pair, so the pair must be a valid combination or the call is refused with the valid list.","title":"New Bias Trend","type":"string"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["ticker","vecevent","new_bias"],"title":"vna_scenarioArguments","type":"object"},"annotations":{"title":"Re-price under one change","readOnlyHint":true,"destructiveHint":false}},{"name":"vecviz_report","title":"Places metrics in cross-ticker and single-ticker historical context","description":"Is a value unusual -- for THIS name, or for the market? Eight VV Data Table metrics (V-Score, VNA Ret, EUB/95U/99U, EDB/95D/99D), each with its current value AND a z-score saying how unusual it is. Name a ticker for its own history plus a cross-sectional z-score against every other name today; omit the ticker for the All Ticker Average across the universe. Returns a ready-formatted `table` alongside the structured metrics -- show the table rather than summarising a few rows. NOT the daily performance report -- that is model_review. Costs 1 unit.","inputSchema":{"properties":{"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Stock ticker symbol, e.g. NVDA. OMIT for the All Ticker Average, a cross-sectional mean across every name. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"title":"vecviz_reportArguments","type":"object"},"annotations":{"title":"Places metrics in cross-ticker and single-ticker historical context","readOnlyHint":true,"destructiveHint":false}},{"name":"vecviz_filter","title":"Screen on several criteria at once","description":"Which names clear SEVERAL thresholds AT ONCE -- the call for 'run the bullish screen'. Not the same question as vecviz_universe, which ranks the universe on ONE metric: the top of a V-Score sort says nothing about whether those names also cleared an upside test. Say the screen EITHER by naming a fixed `mode` -- 'bullish' is EUB_Ret > 0.044 AND 99U_Sratio > 1.44 AND V-Score > 0, and a named mode means the same thing on every call -- OR by passing explicit floors (v_score_min, vna_upside_min, eub_ret_min, edb_ret_min, d99_ret_min, sratio_99u_min). Passing both is refused rather than resolved. The negative floors read as 'no worse than': edb_ret_min=-0.06 keeps names whose expected downside is above -6%. sector, industry, exclude_sector, exclude_industry and min_eq_liq are scope rather than criteria and combine with either form. Survivors are ranked by `rank_score` = 99D_Ret / EqLiq, DESCENDING: liquidity-adjusted tail risk, and the score is negative, so descending puts the mildest tail first. The criteria select on upside and the ranking orders on downside, so the top of the list is the safest way to take the trade rather than the biggest one. 35 rows by default, each carrying the score, the two fields it is built from, and EUB_Ret / EDB_Ret beside them. The response states the thresholds it applied and how many rows each one left standing, so an empty screen says which criterion emptied it. Costs 10 units, priced as a universe screen, whatever the mode.","inputSchema":{"properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Named screen. 'bullish' requires EUB_Ret > 0.044 AND 99U_Sratio > 1.44 AND V-Score > 0, all three at once. OMIT it and pass explicit thresholds below for a custom screen; passing BOTH is refused rather than resolved. Omitting both gives 'bullish'. The response lists every mode with its criteria.","title":"Mode"},"v_score_min":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Custom screen: keep names with V-Score ABOVE this. The aggregate -12..+12 score.","title":"V Score Min"},"vna_upside_min":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Custom screen: floor on VNA_PctUpside, a FRACTION -- 0.10 is 10% implied upside.","title":"Vna Upside Min"},"eub_ret_min":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Custom screen: floor on EUB_Ret, the 21-day expected upper bound as a fraction.","title":"Eub Ret Min"},"edb_ret_min":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Custom screen: floor on EDB_Ret, which is NEGATIVE. -0.06 means 'expected downside no worse than -6%'.","title":"Edb Ret Min"},"d99_ret_min":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Custom screen: floor on 99D_Ret, which is NEGATIVE. -0.40 means '99% downside tail no worse than -40%'.","title":"D99 Ret Min"},"sratio_99u_min":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Custom screen: floor on 99U_Sratio, the 99% upside band against the name's own sigma.","title":"Sratio 99U Min"},"min_eq_liq":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Keep names at this EqLiq decile or better, 1-10 (10 = most liquid). A RANK, not a market capitalisation. Scope, not a criterion -- combines with a named mode.","title":"Min Eq Liq"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Restrict to one sector; vecviz_catalog lists valid values. Does not change the price.","title":"Sector"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Restrict to one industry; vecviz_catalog lists them.","title":"Industry"},"exclude_sector":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Drop one sector -- the 'not in' form.","title":"Exclude Sector"},"exclude_industry":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Drop one industry.","title":"Exclude Industry"},"top_n":{"default":35,"description":"Rows to return, capped at 1000. Defaults to 35; `matched` says how many names actually passed, so raise this if it exceeds what came back.","title":"Top N","type":"integer"},"fields":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"compact | full. Large results compact automatically.","title":"Fields"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"title":"vecviz_filterArguments","type":"object"},"annotations":{"title":"Screen on several criteria at once","readOnlyHint":true,"destructiveHint":false}},{"name":"ppf","title":"Read forecast bands","description":"Price-probability forecast bands by horizon, and optionally the date each band reaches a target price. Ten bands at six horizons. Pass target_price to answer 'when could X reach Y'. Costs 1 unit.","inputSchema":{"properties":{"ticker":{"description":"Stock ticker symbol, e.g. NVDA. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker","type":"string"},"horizons":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated subset of 1D,10D,21D,63D,126D,252D. Omit for all six.","title":"Horizons"},"bands":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated subset of 99U,95U,EUB,EDB,95D,99D and their Sigma_ counterparts. Omit for all ten. Coverage is ragged -- a few tickers publish only the sigma bands or only the rest, and absent bands are named rather than returned as nulls.","title":"Bands"},"target_price":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Absolute price. Adds the date each band's path first reaches it -- 'when could X get to Y'. A band that does not reach it within 252D has no crossing rather than a distant one.","title":"Target Price"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["ticker"],"title":"ppfArguments","type":"object"},"annotations":{"title":"Read forecast bands","readOnlyHint":true,"destructiveHint":false}},{"name":"risk_history","title":"Read risk history","description":"How a ticker's downside and upside bounds have moved over time, plus where the current value sits in its own history -- so you can say 'this is the 90th percentile of its own range', not a bare number. Costs 1 unit.","inputSchema":{"properties":{"ticker":{"description":"Stock ticker symbol, e.g. NVDA. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker","type":"string"},"metric":{"default":"both","description":"var (downside bounds) | oar (upside bounds) | both.","title":"Metric","type":"string"},"lookback_days":{"default":252,"description":"Calendar days back, capped at 756. Available history is shorter than that maximum; a longer request returns everything there is and says how much that was.","title":"Lookback Days","type":"integer"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["ticker"],"title":"risk_historyArguments","type":"object"},"annotations":{"title":"Read risk history","readOnlyHint":true,"destructiveHint":false}},{"name":"correlate","title":"Correlate tickers","description":"Pairwise correlations among 2-40 tickers. 'pearson' is ordinary trailing 252-day return correlation and is what most callers mean; 'vecevent' compares response to the same event backdrop; 'fingerprint' compares VecViz shape. With exactly two tickers and no method, all three come back together. Costs 1 unit per ticker.","inputSchema":{"properties":{"tickers":{"description":"Comma-separated, 2 to 40 symbols. Costs 1 unit per ticker named.","title":"Tickers","type":"string"},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"pearson (trailing 252-day return correlation, what most callers mean) | vecevent (response to a shared event backdrop) | fingerprint (VecViz shape, scale-invariant). Omit with exactly two tickers to get all three.","title":"Method"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["tickers"],"title":"correlateArguments","type":"object"},"annotations":{"title":"Correlate tickers","readOnlyHint":true,"destructiveHint":false}},{"name":"portfolio","title":"Analyse a portfolio","description":"Analyse a portfolio you supply, or look up VecViz model portfolios by strategy, max weight and target volatility. 'optimize' is a LOOKUP over precomputed variants, not an optimiser -- 'is_optimisation' is false. OMIT strategy and FOUR portfolios come back (MVO_VVVe, MVO_VVVf, MVO_VVT and MVO_TTT), which is usually what you want: they are different readings of the same universe, and one alone reads as 'the answer'. A target_vol between the published 10%/15%/20% grid points is INTERPOLATED between the two nearest, below 10% is blended with cash, and above 20% is refused -- anything interpolated sets 'interpolated': true and says so, because a blend of two optimal portfolios is not itself optimal. Costs 25 units per portfolio returned, so the four-portfolio default is 100; for your own weights, 1 per holding with a floor of 25.","inputSchema":{"properties":{"mode":{"default":"analyze","description":"'recommend' when asked how to IMPROVE a portfolio: it measures what you hold, matches VecViz model portfolios to that portfolio's OWN volatility and concentration rather than to defaults, averages three correlation methods, and returns a position-by-position delta saying what to add, trim or exit. 'risk_profile' for the VecViz risk read on a portfolio YOU supply -- weighted-average V-Score and VNA upside, plus the 21-day 95% downside built through a covariance matrix six ways: the per-ticker volatility from either the Vector Model or the Sigma model, crossed with three correlation methods. Each construct names its model in 'volatility_input', so a spread can be read as the two models disagreeing rather than as noise. 'analyze' for the simpler undiversified read. 'optimize' to look up VecViz model portfolios by strategy / max_weight / target_vol.","title":"Mode","type":"string"},"weights":{"default":null,"description":"analyze mode only. Either an object {\"NVDA\": 0.4, \"MSFT\": 0.6} or a string \"NVDA:0.4,MSFT:0.6\". Weights are fractions, not percents; they need not sum to 1 and the response reports what they did sum to.","title":"Weights"},"strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"optimize mode. OMIT THIS unless the caller asked for a specific methodology: four portfolios then come back (MVO_VVVe, MVO_VVVf, MVO_VVT, MVO_TTT) for 25 units each. Naming one returns just it, for 25. The code is MVO_<returns><volatility><correlation>, each letter the INPUT SOURCE: T = trailing 252-day realised, V = VecViz; the correlation slot takes T (Pearson), Ve (VecEvent) or Vf (Fingerprint). Twelve exist; vecviz_catalog lists them.","title":"Strategy"},"max_weight":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"optimize mode. Maximum single-position weight as a FRACTION: 0.03, 0.06 or 0.10. SNAPS to the nearest rather than interpolating -- it is a hard limit on one position, and a blend of two caps honours neither. Omitting BOTH this and target_vol asks for the risk-parity default (HRP), which is not yet published.","title":"Max Weight"},"target_vol":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"optimize mode. Target annualised volatility as a FRACTION. Published grid points are 0.10, 0.15 and 0.20. A value BETWEEN them is interpolated from the two nearest (0.12 gives 60% of the 0.10 portfolio and 40% of the 0.15); BELOW 0.10 the 0.10 portfolio is held partly in cash (0.05 gives 50% invested, 50% cash); ABOVE 0.20 the request is refused, since reaching it would need leverage the published weights do not support. Interpolated results are flagged and carry a caveat -- report it, because they will not match a portfolio optimized directly at that target.","title":"Target Vol"},"top_n":{"default":25,"description":"optimize mode. How many holdings to return, largest weight first. The response reports holdings_total and weight_shown so a truncated view is never mistaken for the whole portfolio.","title":"Top N","type":"integer"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response.","title":"As Of"}},"title":"portfolioArguments","type":"object"},"annotations":{"title":"Analyse a portfolio","readOnlyHint":true,"destructiveHint":false}},{"name":"option_fair_value","title":"Value an option","description":"What VecViz thinks an option is worth, from the PPF band structure. There is no market implied-volatility source here, so it CANNOT say whether an option is cheap or rich -- only what the model implies. Costs 1 unit.","inputSchema":{"properties":{"ticker":{"description":"Stock ticker symbol, e.g. NVDA. Must be in coverage -- an unknown symbol is refused rather than silently dropped; vecviz_catalog lists what is current.","title":"Ticker","type":"string"},"expiry_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Snapped to the nearest of 1, 10, 21, 63, 126, 252; 'resolved' reports what was actually used.","title":"Expiry Days"},"strike":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Absolute strike price. Snaps to the nearest of 36 published grid points.","title":"Strike"},"strike_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Strike as a FRACTION from spot instead of an absolute price: 0.10 is +10%.","title":"Strike Pct"},"option_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"call | put. Positive strike offsets are calls and negative are puts.","title":"Option Type"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"required":["ticker"],"title":"option_fair_valueArguments","type":"object"},"annotations":{"title":"Value an option","readOnlyHint":true,"destructiveHint":false}},{"name":"model_review","title":"Read the track record","description":"How VecViz actually performed -- the published track record, one section at a time. Realized 99% bound breaks by ticker, breakage rates, average return by cohort, top and bottom movers, per-variant portfolio performance, and the current outlook. FREE. This is the only place track-record questions -- 'has VecViz been right about this name lately' -- can be answered. Pass section='list' for the contents; 'full' is ~17,500 tokens.","inputSchema":{"properties":{"section":{"default":"headline","description":"Section key from model_review_index, e.g. 'section_2' for realized 99% bound breaks, or 'full' for the whole ~17,500-token document.","title":"Section","type":"string"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Dataset version token from a prior response, to detect a refresh between calls.","title":"As Of"}},"title":"model_reviewArguments","type":"object"},"annotations":{"title":"Read the track record","readOnlyHint":true,"destructiveHint":false}},{"name":"methodology","title":"Explain the methodology","description":"What a VecViz number means and how it is derived. FREE. Read this before presenting a figure to a user; 'citation' is a one-line attribution safe to quote verbatim. Omit topic to list all topics.","inputSchema":{"properties":{"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"vna | vecevents | whatif | v_score | ppf | correlations | var_oar | portfolio | option_fair_value | track_record. Omit to list every topic.","title":"Topic"}},"title":"methodologyArguments","type":"object"},"annotations":{"title":"Explain the methodology","readOnlyHint":true,"destructiveHint":false}},{"name":"usage","title":"Check quota usage","description":"The caller's tier, quota consumed, quota remaining, period reset, and the published rate card. FREE.","inputSchema":{"properties":{},"title":"usageArguments","type":"object"},"annotations":{"title":"Check quota usage","readOnlyHint":true,"destructiveHint":false}},{"name":"report_feedback","title":"Send feedback","description":"Report a wrong number, a confusing response, or a missing capability. FREE. Use this when a VecViz answer looks incorrect rather than silently working around it.","inputSchema":{"properties":{"message":{"description":"What looked wrong, in plain words.","title":"Message","type":"string"},"tool":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Which tool produced it, if known.","title":"Tool"},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Which ticker it concerned, if any.","title":"Ticker"}},"required":["message"],"title":"report_feedbackArguments","type":"object"},"annotations":{"title":"Send feedback","readOnlyHint":false,"destructiveHint":false}}],"resources":[],"prompts":[]}