RiskModels
NPM · @RISKMODELS/MCP · 2 COMPONENTS
Dividend-adjusted US equity total returns, risk decomposition, attribution & ETF hedge ratios
Available components
Last scanned (4 hours ago)
Scores higher than 35% of npm servers
Category Finance and Payments
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security81
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known high-severity CVE affects zod 3.25.76, a direct dependency. A fixed version is available. View diagnostics → Fail
- No install/post-install scripts declared.Pass
- 31 of 94 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency32
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 20 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability82
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 7619 tokens (~155/item across 49 items; 24 tools + 25 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management34
- Stability check failed: the tool surface changed between 1.0.6 and 2.0.1: 19 tool removals, 0 breaking changes, 14 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 24 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 26 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 30 Oct 26 0
- Security disclosure: unverified → fail ▼ functional
- 29 Oct 26 0
- Security disclosure: fail → unverified ▼ functional
- 24 Oct 26 −5
- CVE-2023-54404 affects this package: high ▼ security
- Known CVEs: pass → fail ▼ security
- 19 Oct 26 0
- Security disclosure: unverified → fail ▼ functional
- 18 Oct 26 +1
- Security disclosure: fail → unverified ▼ functional
- 16 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 15 Oct 26 +21
- Stability: unverified → fail ▼ security
- Malware scan: pass → unverified ▼ security
- Injection markers: unverified → pass ▲ security
- Schema quality: 76 → 96 ▼ functional
- Schema quality: pass → fail ▼ functional
- MCP protocol: unverified → pass ▲ functional
- Schema quality: unverified → 100 ▲ functional
- Tool coverage: unverified → 100 ▲ functional
- Schema quality: good → excellent functional
- Package version: 1.0.12 → 2.0.1 functional
- Package version: 1.0.6 → 1.0.12 functional
- 14 Oct 26 0
- Stability: unverified → fail ▼ security
- Injection markers: unverified → pass ▲ security
- Schema quality: pass → fail ▼ functional
- Tool coverage: unverified → 100 ▲ functional
- Schema quality: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- Package version: 1.0.11 → 1.0.12 functional
- Package version: 1.0.6 → 1.0.11 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/@riskmodels/mcp@2.0.1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 1 finding
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-mrhx-c7xc-m3w5 | CVE-2023-54404 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 94 packages
| Packages resolved | 94 |
|---|---|
| Stale | 30 |
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
riskmodels_analyze_portfolio RiskModels Portfolio Hedge Levels and ETF Hedge ~296
Use when you have a long-only book of up to 100 names and want its holdings-weighted L1, L2 and L3 hedge ratios, or the ETF hedge notionals for dollar positions. Not for books with shorts or more than 100 names (use riskmodels_portfolio_exposure) or a variance decomposition with return attribution (use riskmodels_get_portfolio_risk_snapshot). Returns, from POST /batch/analyze, portfolio hedge levels at L1, L2 and L3 with per-ticker detail. Only when every position is given in dollars does it also return the ETF hedge notionals at hedge_level (set by level, default L3), by ticker and summed by ETF; with weights, level is ignored. End-of-day data, refreshed after each US market close. Price: $0.015 per position, minimum $0.03 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| level | string | – | Hedge depth for the ETF notionals, used only when every position is in dollars, e.g. L2 (default L3) |
| positions | array | yes | Long positions, each with weight or dollars, combined per ticker, e.g. [{"ticker":"AAPL","dollars":25000},{"ticker":"NVDA","dollars":15000}] |
| years | integer | – | Lookback window in years, integer 1-30, e.g. 2 (default 1) |
No output schema declared.
No examples provided.
riskmodels_compare RiskModels Multi-Ticker Comparison ~137
Use when you want 2-100 stocks side by side on market, sector, subsector and residual risk. Not for one stock (use riskmodels_decompose) or a weighted portfolio (use riskmodels_analyze_portfolio). Returns, from POST /batch/analyze, each ticker's explained-risk shares and hedge ratios by layer, with chart-ready data. End-of-day data, refreshed after each US market close. Price: $0.015 per ticker, minimum $0.03 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| tickers | array | yes | 2-100 US stock ticker symbols, e.g. ["AAPL","NVDA"] |
No output schema declared.
No examples provided.
riskmodels_decompose RiskModels Single-Stock Decomposition ~188
Use when you want one stock's risk split into market, sector, subsector and residual layers, or the ETF hedge legs for a dollar position in it. Not for several stocks (use riskmodels_compare) or a portfolio (use riskmodels_analyze_portfolio). Returns, from POST /decompose, each layer's explained-risk share, hedge ratio and hedge ETF, chart-ready data and a one-line summary; with dollars it returns the ETF hedge notionals for that position at each level (hedge ratio times dollars). End-of-day data, refreshed after each US market close. Price: $0.005 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| dollars | number | – | Position size in US dollars, a positive number, e.g. 10000. Omit for the decomposition alone |
| ticker | string | yes | US stock ticker symbol, case-insensitive, e.g. NVDA |
No output schema declared.
No examples provided.
riskmodels_decompose_selection_vs_drift RiskModels Selection vs Drift ~312
Use when you want a book's realized residual return over a date window attributed to stock selection versus drift. Not for current risk or hedges (use riskmodels_portfolio_exposure). Returns, from POST /cohorts/pnl-decomposition, selection (from holding names that beat their cohort's average residual) and drift (from net exposure to the cohort average), which sum exactly to the total; weights are held constant over the window and not normalized, a short is a negative weight, and positions that cannot be mapped to a cohort are listed in coverage.dropped. Historical attribution on end-of-day data. Price: $0.25 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| end_date | string | – | Window end, format YYYY-MM-DD, e.g. 2026-06-30 |
| include_series | boolean | – | true adds the daily selection and drift series (large), e.g. true (default false) |
| level | string | – | Cohort level, e.g. market (default sector) |
| min_names | integer | – | Ignore cohort means on days the cohort had fewer members, integer, e.g. 20 |
| positions | array | yes | The book to attribute, 1-500 positions, e.g. [{"ticker":"MSFT","weight":0.1},{"ticker":"INTC","weight":-0.05}] |
| start_date | string | – | Window start, format YYYY-MM-DD, e.g. 2026-01-02 |
No output schema declared.
No examples provided.
riskmodels_get_benchmark_fit RiskModels Benchmark Fit (active weights) ~337
Use when you want to compare a fund, 13F filer or ETF portfolio with a benchmark: active share and the largest active weights. Not for the subject's own holdings (use riskmodels_get_fund, riskmodels_get_filer or riskmodels_get_etf). Returns, from GET /data/benchmark-fit, active share, active-weight RMS (a coarse tracking-error proxy), overlap, and the largest over- and underweights at a common date. Benchmarks: ff_own (free-float-cap weights of the subject's own holdings), the large and small style cells (cell_large-value, cell_large-blend, cell_large-growth, cell_small-value, cell_small-blend, cell_small-growth), or all (every available benchmark for the subject). Holdings dates follow the latest filings; weights use end-of-day prices. Price: $0.02 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | – | Upper bound on the subject's holdings date; the benchmark is taken at its latest date on or before it, format YYYY-MM-DD, e.g. 2026-03-31 |
| benchmark | string | yes | ff_own, a large or small style cell, or all, e.g. cell_large-growth |
| subject | string | yes | BW-* portfolio id (BW-FUND-…, BW-FILER-…, BW-ETF-…) or an ETF ticker, e.g. BW-FUND-S000019457 or SPY |
| top | integer | – | Number of over- and underweights, integer 1-100, e.g. 20 (default 10) |
No output schema declared.
No examples provided.
riskmodels_get_cohorts RiskModels Cohort Statistics ~450
Use when you want cross-sectional residual statistics for SPY and the 11 GICS sector SPDR cohorts, on one date or as a time series. Not for one stock's peers (use riskmodels_get_peers) or one stock's rank (use riskmodels_get_rankings). Returns, from GET /cohorts (one date) or GET /cohorts/series (series=true), residual_mean, residual_sd, mean_pairwise_corr, n_names and n_effective by default, more on request. ERM3 residuals are fitted without an intercept, so residual_mean is not zero; link_fit_resid_sd is the residual standard deviation of the 252-day link regression, a fit-quality measure rather than a standard error. Subsector cohorts are not available. End-of-day data, refreshed after each US market close. Price: $0.04 for one date, $0.15 for a series.
| Name | Type | Req | Description |
|---|---|---|---|
| cohorts | string | – | Comma-separated cohort tickers from SPY, XLE, XLB, XLI, XLY, XLP, XLV, XLF, XLK, XLC, XLU, XLRE, e.g. "SPY,XLK" (default all) |
| end_date | string | – | Series end, series=true only, format YYYY-MM-DD, e.g. 2026-06-30 |
| min_names | integer | – | Drop cohorts or days with fewer members, integer, e.g. 20 |
| series | boolean | – | true returns a time series over start_date..end_date, e.g. true (default false: one date) |
| start_date | string | – | Series start, series=true only, format YYYY-MM-DD, e.g. 2025-01-02 |
| teo | string | – | Observation date for the one-date view (default latest), format YYYY-MM-DD, e.g. 2026-06-30 |
| variables | string | – | Comma-separated variables, e.g. "residual_sd,n_names" (default residual_mean, residual_sd, mean_pairwise_corr, n_names, n_effective) |
No output schema declared.
No examples provided.
riskmodels_get_etf RiskModels ETF ~166
Use when you want one ETF's registry metadata and portfolio surface, and optionally its largest holdings. Not for finding an ETF ticker (use riskmodels_search) or the ETF's daily returns (use riskmodels_get_returns). Returns { snapshot, holdings }: snapshot from GET /data/etf/{ticker}; holdings, only when holdings_top is set, from GET /data/etf/{ticker}/holdings. Holdings follow the latest published holdings file; registry refreshed end-of-day. Free (no per-call charge).
| Name | Type | Req | Description |
|---|---|---|---|
| holdings_top | integer | – | Also return the largest N holdings, integer 1-200, e.g. 25 (default: no holdings) |
| ticker | string | yes | ETF ticker symbol, case-insensitive, e.g. SMH |
No output schema declared.
No examples provided.
riskmodels_get_factor_returns RiskModels Macro and Sector ETF Factor Returns ~477
Use when you need macro factor return series (inflation, term spread, short rates, credit, oil, gold, the dollar, volatility, bitcoin, VIX) or the trailing returns of SPY and the 11 GICS sector SPDR ETFs. Not for a stock's correlation with those factors (use riskmodels_get_macro_correlation) or one ETF's daily return series (use riskmodels_get_returns). kind macro returns daily total returns over a date range (GET /macro-factors); kind sector_etf returns closing price and trailing 1, 21, 63 and 252-day total returns on one date (GET /etf/factor-returns). End-of-day data, refreshed after each US market close. Price: $0.005 per call (macro) or $0.02 per call (sector_etf).
| Name | Type | Req | Description |
|---|---|---|---|
| end | string | – | kind macro only: last date, inclusive (default today), format YYYY-MM-DD, e.g. 2026-06-30 |
| factors | string | – | kind macro only: comma-separated keys from inflation, term_spread, short_rates, credit, oil, gold, usd, volatility, bitcoin, vix_spot, e.g. "oil,gold,usd" (default all ten) |
| kind | string | yes | macro: daily macro factor returns over a range; sector_etf: SPY and sector SPDR returns on one date, e.g. macro |
| sleeve | string | – | kind sector_etf only: market (SPY), sector (11 sector SPDRs) or all, e.g. sector (default all) |
| start | string | – | kind macro only: first date, inclusive (default five years before end), format YYYY-MM-DD, e.g. 2021-01-04 |
| teo | string | – | kind sector_etf only: observation date (default latest), format YYYY-MM-DD, e.g. 2026-06-30 |
| tickers | string | – | kind sector_etf only: comma-separated subset of SPY, XLE, XLB, XLI, XLY, XLP, XLV, XLF, XLK, XLC, XLU, XLRE, e.g. "XLK,XLF" |
No output schema declared.
No examples provided.
riskmodels_get_filer RiskModels 13F Filer ~280
Use when you want a 13F filer's profile, latest metrics and concentration, and optionally its largest holdings. Not for finding the bw_filer_id (use riskmodels_search) or comparing the book with a benchmark (use riskmodels_get_benchmark_fit). Returns { snapshot, holdings }: snapshot from GET /13f/filers/{bw_filer_id}/snapshot (registry details, latest metrics, concentration); holdings, only when holdings_top is set, from GET /13f/filers/{bw_filer_id}/holdings with the source filing's accession_number, filing_type (13F-HR, 13F-HR/A, 13F-NT) and amendment_type (ORIGINAL, RESTATEMENT, NEW_HOLDINGS or UNKNOWN; null on panels published before filing vintages were stored). Holdings follow the latest 13F filing; metrics use end-of-day prices. Price: $0.05, plus $0.02 when holdings are requested.
| Name | Type | Req | Description |
|---|---|---|---|
| bw_filer_id | string | yes | bw_filer_id, e.g. BW-FILER-CIK0001067983, or a composite entity id BW-SYNTH-… |
| holdings_top | integer | – | Also return the largest N holdings, integer 1-200, e.g. 25 (default: no holdings) |
No output schema declared.
No examples provided.
riskmodels_get_fund RiskModels Mutual Fund ~281
Use when you want a US mutual fund's profile, return decomposition, hedge ratios and style-box ranks, and optionally its full holdings. Not for finding the bw_fund_id (use riskmodels_search) or comparing the fund with a benchmark (use riskmodels_get_benchmark_fit). Returns { snapshot, holdings }: snapshot from GET /funds/snapshot/{bw_fund_id} (registry details, latest return decomposition and diagnostics, top 25 holdings, L1/L2/L3 ETF hedge ratios, a 12-month portfolio time series and the fund's rank within its style box on each ranked metric); holdings, only when holdings_limit is set, from GET /funds/{bw_fund_id}/holdings (latest filed SEC N-PORT report, ranked by absolute market value, signed weights, long/short/net/gross totals and ticker coverage). Holdings follow the latest N-PORT filing; metrics use end-of-day prices. Price: $0.05, plus $0.02 when holdings are requested.
| Name | Type | Req | Description |
|---|---|---|---|
| bw_fund_id | string | yes | Fund id, e.g. BW-FUND-S000019457 |
| holdings_limit | integer | – | Also return up to N holdings, integer 1-5000, e.g. 100; 5000 returns the whole book (default: no holdings) |
No output schema declared.
No examples provided.
riskmodels_get_fundamentals RiskModels PIT Quarterly Fundamentals ~541
Use when you need point-in-time quarterly fundamentals or CAPM cost of capital for one stock. Not for risk or hedge numbers (use riskmodels_get_stock_snapshot). Returns, from GET /fundamentals/{ticker}: TTM profitability and capital-return ratios, leverage, ERM3 valuation betas, cost_of_debt and wacc from reported data, separately labelled cost_of_debt_imputed and wacc_imputed from a market proxy (10-year Treasury plus a high-quality corporate spread, not issuer-specific), economic profit, an equity-bridge decomposition and SEC line items (sec_facts). A quarter is included only if it was filed on or before as_of. grid=true adds an ERP x Treasury-tenor table of cost of equity, wacc, wacc_imputed and economic profit for the latest period. Realized history only, no forecasts; filings are picked up end-of-day. Price: $0.02 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | – | Point-in-time date; only quarters filed on or before it are returned (default today), format YYYY-MM-DD, e.g. 2025-12-31 |
| erp | number | – | Equity risk premium as a decimal, e.g. 0.055 for 5.5% (default 0.05) |
| erp_grid | string | – | Comma-separated ERP decimals for the grid, e.g. "0.03,0.04,0.05,0.06,0.07"; used only when grid=true |
| grid | boolean | – | true adds sensitivity_grid (cost_of_equity, wacc, wacc_imputed, economic_profit) across erp_grid x rf_tenor_grid for the latest period, e.g. true (default false) |
| periods | integer | – | Quarterly rows returned, most recent last, integer 1-40, e.g. 12 (default 8) |
| rf_tenor | string | – | Treasury constant-maturity tenor for the risk-free rate, e.g. 10y (default 10y); pair a short tenor with a bill-basis ERP |
| rf_tenor_grid | string | – | Comma-separated tenors for the grid, e.g. "1y,10y,30y"; used only when grid=true |
| tax_rate | number | – | Tax rate for the WACC debt shield as a decimal, e.g. 0.25 (default 0.21) |
| ticker | string | yes | US stock ticker symbol, case-insensitive, e.g. AAPL |
No output schema declared.
No examples provided.
riskmodels_get_macro_correlation RiskModels Macro Factor Correlation ~236
Use when you want to know how one stock's returns co-move with macro factors such as rates, credit, oil, the dollar or volatility. Not for the macro factor return series themselves (use riskmodels_get_factor_returns). Returns, from POST /correlation, Pearson or Spearman correlations over a trailing window, using the L3 residual return by default. End-of-day data, refreshed after each US market close. Price: $0.01 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| factors | array | – | Macro factor keys, e.g. ["oil","usd","term_spread"] (default: the standard set) |
| method | string | – | "pearson" or "spearman", e.g. "spearman" (default "pearson") |
| return_type | string | – | Return series to correlate, e.g. "gross" (default "l3_residual") |
| ticker | string | yes | US stock ticker symbol, case-insensitive, e.g. NVDA |
| window_days | integer | – | Trailing window in trading days, integer, e.g. 126 (default 252) |
No output schema declared.
No examples provided.
riskmodels_get_my_positions RiskModels linked brokerage positions ~163
Use when the request concerns the caller's own linked brokerage book. Not for a book typed into the conversation (use riskmodels_analyze_portfolio or riskmodels_portfolio_exposure). Returns the caller's positions from their default riskmodels.net portfolio (Alpaca Connect, Connect Trade or Plaid): ticker, quantity, market value and weight of each position, has_shorts, and the same book in three shapes: for_analysis (positive weights), for_hedge (positive dollar values) and for_exposure (signed dollars, short < 0). Returns an empty book when no brokerage is linked. Read-only; it does not place orders. Positions are as of the portal's last brokerage sync. Free (no REST charge). No inputs.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
riskmodels_get_peers RiskModels Peer Group ~156
Use when you want the stocks that share a stock's subsector ETF or sector ETF. Not for cohort-level residual statistics (use riskmodels_get_cohorts). Returns, from GET /peers, the peer list ordered by market cap with each peer's market cap. End-of-day data, refreshed after each US market close. Price: $0.005 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| group_by | string | – | Peer grouping, e.g. sector_etf (default subsector_etf) |
| limit | integer | – | Maximum peers, integer 1-200, e.g. 20 (default 50) |
| ticker | string | yes | US stock ticker symbol, case-insensitive, e.g. NVDA |
No output schema declared.
No examples provided.
riskmodels_get_portfolio_risk_snapshot RiskModels Portfolio Risk Snapshot ~272
Use when you want a long-only portfolio's risk decomposed into market, sector, subsector and residual variance, with diversification analytics and return attribution. Not for long/short books (use riskmodels_portfolio_exposure) or ETF hedge notionals (use riskmodels_analyze_portfolio). Returns, from POST /snapshot (the canonical portfolio snapshot), the L3 variance decomposition, per-position L3 hedge ratios, diversification analytics with sector and subsector ETF correlations, frozen-weight daily return attribution, cumulative return and drawdown over lookback_days, and a risk summary with dominant drivers and concentration flags. End-of-day data, refreshed after each US market close. Price: $1.25 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| benchmark | string | – | Benchmark ticker, e.g. SPY |
| lookback_days | integer | – | Trading days of history for returns, attribution and the diversification window, integer 20-2000, e.g. 504 (default 252) |
| positions | array | yes | Long positions, each with one of weight, dollars or shares (shares on every position or none), e.g. [{"ticker":"AAPL","weight":0.4},{"ticker":"NVDA","weight":0.35},{"ticker":"CRWD","weight":0.25}] |
No output schema declared.
No examples provided.
riskmodels_get_rankings RiskModels Cross-Sectional Rankings ~262
Use when you want one stock's percentile rank within the universe, its sector or its subsector on a risk or return metric. Not for screening the whole universe (use riskmodels_screen_rankings). Returns, from GET /rankings/{ticker}, the stock's rank and percentile for the metric and window. Metrics: subsector_residual, sector_residual, gross_return, mkt_cap, er_l1, er_l2 or er_l3. Windows: 1d, 21d, 63d, 252d. End-of-day data, refreshed after each US market close. Price: $0.005 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| cohort | string | – | Cohort: universe, sector or subsector, e.g. sector |
| metric | string | – | Metric: subsector_residual, sector_residual, gross_return, mkt_cap, er_l1, er_l2 or er_l3, e.g. subsector_residual |
| ticker | string | yes | US stock ticker symbol, case-insensitive, e.g. NVDA |
| window | string | – | Window in trading days: 1d, 21d, 63d or 252d, e.g. 63d |
No output schema declared.
No examples provided.
riskmodels_get_residual_returns RiskModels Residual Returns and Recommended Hedge Depth ~344
Use when you need daily residual (stock-specific) returns and the recommended hedge depth (L1 market, L2 sector or L3 subsector) for 1-100 stocks. Not for the full factor split of each day's return (use riskmodels_get_return_attribution) or a mean-reversion signal on a basket (use riskmodels_get_residual_signal). Returns, per ticker, the recommended depth by date, the hedge ratios at that depth and the daily residual return series. One ticker is served by GET /lstar; 2-100 tickers by POST /batch/lstar. Without threshold the depth is the one ERM3 publishes; with threshold it is the simplest depth whose marginal explained risk exceeds the threshold. End-of-day data, refreshed after each US market close. Price: one ticker $0.02 plus $0.01 per year beyond the first; 2-100 tickers $0.015 per ticker plus $0.0075 per ticker per year beyond the first, minimum $0.03 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| market_factor_etf | string | – | ETF ticker used as the market factor, e.g. QQQ (default SPY) |
| threshold | number | – | Marginal explained-risk threshold, a fraction, e.g. 0.01. Omit for the depth ERM3 publishes |
| tickers | array | yes | 1-100 US stock ticker symbols, e.g. ["NVDA"] or ["AAPL","MSFT"] |
| years | integer | – | Calendar years of daily history, integer 1-15, e.g. 3 (default 1) |
No output schema declared.
No examples provided.
riskmodels_get_residual_signal RiskModels Residual Mean-Reversion Signal ~210
Use when you want the L3 residual mean-reversion signal aggregated over a basket of 1-100 stocks. Not for the residual return series themselves (use riskmodels_get_residual_returns). Returns, from POST /signals/residual-reversion/basket, the basket-aggregated signal, with optional weights and a minimum signal-quality quintile; it describes recent residual moves and is not a forecast. End-of-day data, refreshed after each US market close. Price: $0.02 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| signal_quality_min_quintile | integer | – | Drop names below this signal-quality quintile, integer 1-5, e.g. 3 |
| tickers | array | yes | 1-100 basket ticker symbols, e.g. ["AAPL","MSFT","NVDA"] |
| weights | array | – | Weights aligned to tickers, decimals, e.g. [0.5,0.3,0.2] (default equal weight) |
No output schema declared.
No examples provided.
riskmodels_get_return_attribution RiskModels Return Attribution (factor vs residual) ~272
Use when you need each day's return of one stock split into market, sector and subsector factor returns and the residual (stock-specific) return. Not for raw total returns (use riskmodels_get_returns) or residual returns for many stocks (use riskmodels_get_residual_returns). Returns, from GET /returns-decomposition, the daily gross return and its additive components (decimal returns); include_lstar adds the residual series at each day's recommended hedge depth. End-of-day data, refreshed after each US market close. Price: $0.04 per call plus $0.01 per year of history beyond the first.
| Name | Type | Req | Description |
|---|---|---|---|
| include_lstar | boolean | – | true adds the lstar level and lstar_residual_return arrays, e.g. true (default false) |
| market_factor_etf | string | – | ETF ticker used as the market factor, e.g. QQQ (default SPY) |
| threshold | number | – | Marginal explained-risk threshold for the hedge-depth rule, a fraction, e.g. 0.01 (default 0.01) |
| ticker | string | yes | US stock ticker symbol, case-insensitive, e.g. AAPL |
| years | integer | – | Calendar years of daily history, integer, e.g. 2 (default 1) |
No output schema declared.
No examples provided.
riskmodels_get_returns RiskModels Stock Total Returns ~198
Use when you need the daily dividend-adjusted total returns of one US stock or ETF over 1-15 years. Not for returns split into factor and residual parts (use riskmodels_get_return_attribution) or residual returns at the recommended hedge depth (use riskmodels_get_residual_returns). Returns, from GET /ticker-returns, the daily return series (decimal, 0.01 = 1%) with each day's L3 market, sector and subsector hedge ratios and explained-risk shares; history is point-in-time. End-of-day data, refreshed after each US market close. Price: $0.02 per call plus $0.01 per year of history beyond the first.
| Name | Type | Req | Description |
|---|---|---|---|
| ticker | string | yes | US stock ticker symbol, case-insensitive, e.g. AAPL |
| years | integer | – | Years of daily history, integer 1-15, e.g. 3 (default 1) |
No output schema declared.
No examples provided.
riskmodels_get_stock_snapshot RiskModels Stock Risk Snapshot ~170
Use when you need one US stock's latest risk numbers: hedge ratios to SPY and to its sector and subsector ETFs, explained-risk shares by layer, volatility, closing price and market cap. Not for a layer-by-layer decomposition or the ETF hedge of a dollar position (use riskmodels_decompose), several stocks at once (use riskmodels_compare) or daily history (use riskmodels_get_returns). Returns the latest row of GET /metrics/{ticker}, including the hedge_levels block with hedge ratios, explained risk and hedge ETFs at L1, L2 and L3. End-of-day data, refreshed after each US market close. Price: $0.005 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| ticker | string | yes | US stock ticker symbol, case-insensitive, e.g. NVDA |
No output schema declared.
No examples provided.
riskmodels_portfolio_exposure RiskModels Long/Short Portfolio Exposure ~346
Use when a book has short positions or more than 100 names, or when you want its beta-dollars and the ETF trades that neutralise it. Not for long-only books of up to 100 names given as weights (use riskmodels_analyze_portfolio). Returns, from POST /portfolio/exposure, beta-dollars by sector, the ETF trades that neutralise the book at L1, L2 and L3, systematic and residual dollar risk at hedge_level (default lstar: each name at its own recommended depth), coverage (positions not modelled, with reasons) and warnings. Positions are netted by security and not rescaled. End-of-day data, refreshed after each US market close. Price: $0.25 per call up to 25 modelled names, $1.00 above.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | – | Past model date, 2011-12-07 or later; before 2013-01-01 lstar uses L3 (default latest), format YYYY-MM-DD, e.g. 2024-12-31 |
| hedge_level | string | – | lstar: each name at its own recommended depth; l1/l2/l3: one depth for every name, e.g. l3 (default lstar) |
| lookback_days | integer | – | Trading days in the ETF covariance window, integer 60-756, e.g. 126 (default 252) |
| positions | array | yes | Signed book of 1-1000 positions, e.g. [{"ticker":"AAPL","value":100000},{"ticker":"TSLA","value":-50000}] |
No output schema declared.
No examples provided.
riskmodels_screen_rankings RiskModels Rankings Screen ~327
Use when you want the names in the universe that rank highest or lowest on one metric, with optional percentile, decile and sector filters. Not for one stock's rank (use riskmodels_get_rankings). Returns, from POST /rankings/screen, the ranked rows that pass the filters; metrics, cohorts and windows are the same as for one stock's rank. End-of-day data, refreshed after each US market close. Price: $0.25 per call.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | – | Ranking date (default latest), format YYYY-MM-DD, e.g. 2026-06-30 |
| cohort | string | yes | Cohort: universe, sector or subsector, e.g. universe |
| decile | integer | – | Restrict to one decile, integer 1-10, e.g. 10 |
| limit | integer | – | Maximum rows, integer, e.g. 25 (default 100) |
| metric | string | yes | Metric: subsector_residual, sector_residual, gross_return, mkt_cap, er_l1, er_l2 or er_l3, e.g. er_l3 |
| min_percentile | number | – | Minimum percentile, 0-100, e.g. 90 |
| sector_filter | string | – | Restrict to one sector, by sector ETF ticker, e.g. XLK |
| window | string | yes | Window in trading days: 1d, 21d, 63d or 252d, e.g. 21d |
No output schema declared.
No examples provided.
riskmodels_search RiskModels Search ~419
Use when you need to resolve a name or fragment to an identifier: a stock ticker, an ETF ticker, a mutual fund's bw_fund_id or a 13F filer's bw_filer_id. Not for data about the match (use riskmodels_get_stock_snapshot, riskmodels_get_etf, riskmodels_get_fund or riskmodels_get_filer). Returns matches from GET /tickers (type stock), GET /data/etf/search (etf), GET /funds/search (fund: bw_fund_id, ticker, name, style box, asset class, total assets) or GET /13f/filers/search (filer: bw_filer_id). Registry refreshed end-of-day. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| equity_style_9box | string | – | type fund only: style box slug or name, e.g. "large-growth" or "Large Growth" |
| include_etfs | boolean | – | type fund only: false drops funds flagged as ETFs, e.g. false (default true) |
| include_inactive | boolean | – | type fund only: true also returns funds without a recent holdings report, e.g. true (default false) |
| include_metadata | boolean | – | type stock only: true adds sector and company metadata per match, e.g. true |
| limit | integer | – | Maximum matches, integer, e.g. 10 (default 25 for etf and filer, 50 for fund; max 100, fund 500; ignored for stock) |
| mag7 | boolean | – | type stock only: true returns the seven largest US technology names, e.g. true |
| primary | boolean | – | type fund only: true returns share-class primaries only, e.g. true |
| q | string | – | Symbol or name fragment, e.g. "nvidia", "SMH", "contrafund" or "berkshire"; required for type filer |
| type | string | – | What to search for, e.g. filer (default stock) |
No output schema declared.
No examples provided.
How do I install the RiskModels MCP server?
RiskModels runs locally as an npm package, launched with npx -y @riskmodels/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @riskmodels/mcp
claude mcp add bluewatercorp-riskmodels -- npx -y @riskmodels/mcp
What is the RiskModels MCP server?
RiskModels is an MCP server listed in the public MCP registry as io.github.BlueWaterCorp/riskmodels. Dividend-adjusted US equity total returns, risk decomposition, attribution & ETF hedge ratios. This page covers its npm package (@riskmodels/mcp).
Is the RiskModels MCP server safe to use?
RiskModels scores 68 out of 100 on VerifyMCP. We recorded 1 known advisory against it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the RiskModels MCP server expose?
RiskModels exposes 24 tools: riskmodels_get_stock_snapshot, riskmodels_decompose, riskmodels_compare, riskmodels_get_returns, riskmodels_get_return_attribution, and 19 more. Their descriptions and schemas cost roughly 6,840 tokens of context every time the server is loaded.
Is the RiskModels MCP server still maintained?
RiskModels is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.