ModelRisk
PYPI · MODELRISK-MCP · SCANNED SEP 20
Read, build, fit, and run Monte Carlo risk models in Excel through Vose Software's ModelRisk.
Available components
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 Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 1 of 35 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency6
- Repository check failed: no source repository is declared. See how to fix → View diagnostics → Fail
- 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 35 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability83
- 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 9507 tokens (~146/item across 65 items; 59 tools + 6 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 Management97
- Stability observed for 29 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage88
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 58% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 59 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 61 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the ModelRisk MCP server?
ModelRisk runs locally as a PyPI package, launched with uvx modelrisk-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · modelrisk-mcp
claude mcp add vosesoftware-modelrisk-mcp -- uvx modelrisk-mcp
{
"mcpServers": {
"vosesoftware-modelrisk-mcp": {
"command": "uvx",
"args": [
"modelrisk-mcp"
]
}
}
} {
"servers": {
"vosesoftware-modelrisk-mcp": {
"command": "uvx",
"args": [
"modelrisk-mcp"
]
}
}
} codex mcp add vosesoftware-modelrisk-mcp -- uvx modelrisk-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"vosesoftware-modelrisk-mcp": {
"type": "local",
"command": [
"uvx",
"modelrisk-mcp"
],
"enabled": true
}
}
} openclaw mcp add vosesoftware-modelrisk-mcp --command uvx --arg modelrisk-mcp
mcp_servers:
vosesoftware-modelrisk-mcp:
command: "uvx"
args: ["modelrisk-mcp"] {
"McpServers": {
"vosesoftware-modelrisk-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"modelrisk-mcp"
]
}
}
} assistant mcp add vosesoftware-modelrisk-mcp -t stdio -c uvx -a modelrisk-mcp
{
"mcpServers": {
"vosesoftware-modelrisk-mcp": {
"command": "uvx",
"args": [
"modelrisk-mcp"
]
}
}
} 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.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 −3
- Stability: pass → 0.80 functional
- 14 Sept 26 −15
- Malware scan: pass → unverified ▼ security
- Stability: 0.97 → pass security
- 13 Sept 26 +16
- Malware scan: unverified → pass ▲ security
- 12 Sept 26 −15
- Malware scan: pass → unverified ▼ security
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
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 20 Sept 2026 · Analysed pypi/modelrisk-mcp@0.4.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 35 packages
| Packages resolved | 35 |
|---|---|
| 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 →
audit_model ~71
ModelRisk: Run the model audit against the workbook. Each rule's detector lives in modelrisk_mcp.audit.rules; the rule set is editable in data/audit_rules.yaml. Returns an AuditReport with severity-tagged findings (error/warning/info) and suggested fixes.
| Name | Type | Req | Description |
|---|---|---|---|
| workbook_name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| findings | array | – | – |
No examples provided.
backtest_output ~196
ModelRisk: Backtest a simulation output against realised actuals — does the model's predicted distribution match what actually happened? Reports the Probability Integral Transform (PIT, ~0.5 mean and uniform if calibrated), the empirical coverage of central prediction intervals (e.g. ~90% of actuals should fall in the 90% interval), and bias. Pass the historical `actuals` you want to validate against. Reads the output's per-iteration samples — run the simulation first.
| Name | Type | Req | Description |
|---|---|---|---|
| actuals | array | yes | Realised historical values. |
| intervals | – | – | Central intervals to check coverage of. Default [0.5,0.8,0.9,0.95]. |
| max_n | integer | – | Max samples to read (default 100 000). |
| output_name | string | yes | VoseOutput name to validate. |
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
| Name | Type | Req | Description |
|---|---|---|---|
| actuals_mean | number | yes | – |
| bias | number | yes | actuals_mean - model_mean. |
| coverage | array | yes | Empirical vs nominal coverage of central prediction intervals. |
| frac_below_median | number | yes | Fraction of actuals below the model median; ~0.5 if calibrated. |
| mean_pit | number | yes | Mean Probability Integral Transform; ~0.5 if calibrated. |
| model_mean | number | yes | – |
| n_actuals | integer | yes | – |
| output_name | string | yes | – |
| pit_uniformity_ks | number | yes | KS distance of the PIT values from Uniform(0,1); 0 = perfectly calibrated. |
| sample_size | integer | yes | – |
| verdict | string | yes | Short calibration verdict. |
No examples provided.
build_drivers_report ~266
ModelRisk: Build a single-sheet drivers report — a sensitivity analysis presented for a decision-maker. Drops onto a new sheet: title band; auto-generated KEY FINDINGS in plain English ('The dominant driver of NPV is widget cost, r = -0.65; higher widget cost lowers NPV'); a prominent tornado chart; a driver-ranking table with correlation + |r| + approximate variance share; a HOW TO READ THIS CHART panel for stakeholders who don't know what Spearman correlation means; and tiered RECOMMENDED ACTIONS (focus / monitor / deprioritise) grouping inputs by strength. Use this when the user asks for an uncertainty-drivers report rather than the broader executive dashboard.
| Name | Type | Req | Description |
|---|---|---|---|
| output_name | string | yes | The output to analyze drivers for (e.g. 'NPV', 'TotalCost'). Each call produces one sheet for one output. Call multiple times for multiple outputs. |
| sheet_name | string | – | Target sheet name. Default 'Drivers_Report'. Replaced if it already exists. |
| subtitle | – | – | Subtitle. Default: 'Sensitivity analysis · N iterations · <date>'. |
| title | – | – | Report title. Default: 'Uncertainty Drivers — <output>'. |
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
Structured output declared, but exposes no named fields.
No examples provided.
build_executive_report ~342
ModelRisk: Build a single-sheet executive report for a decision-maker. Drops a curated dashboard onto a new sheet with: title band, headline numbers (mean / P5 / P50 / P95 / stdev — colored by volatility), histogram + cumulative chart of the primary output, tornado of top N sensitivity drivers, a stats table for the primary plus any secondary outputs, and auto-generated risk callouts framed in plain English ('90% confident X lands between A and B', 'tail risk Y% above mean', 'primary driver is Z'). Idempotent — re-running replaces the sheet. Use this when the user asks for a decision-maker-facing summary rather than raw stats.
| Name | Type | Req | Description |
|---|---|---|---|
| contingency_percentile | number | – | The 'high-side' percentile to highlight in the headline. Default 0.90 (P90). |
| primary_output | string | yes | The single output the report focuses on (e.g. 'NPV', 'TotalCost'). Headline numbers and the histogram + tornado are about this output. |
| secondary_outputs | – | – | Additional outputs to include in the stats table. The primary output is always first; these appear below. |
| sheet_name | string | – | Target sheet name. Default 'Executive_Report'. Replaced if it already exists. |
| subtitle | – | – | Subtitle shown beneath the title. Default: '<N> iterations · <today's date>'. |
| title | – | – | Report title shown in the top band. Default: 'Simulation Report — <primary_output>'. |
| top_drivers | integer | – | How many inputs to show in the tornado mini-chart. |
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
Structured output declared, but exposes no named fields.
No examples provided.
build_model_from_brief ~319
ModelRisk: Turn a deterministic workbook into a simulation-ready Monte Carlo model in one atomic, reversible pass. Given the output cells to track and the uncertain inputs to add (each with a Vose distribution family + parameters you choose from the brief), it wraps the outputs with VoseOutput, replaces the input cells with VoseInput-wrapped distributions, optionally runs a validating simulation, and returns the headline percentiles. Every write goes through the audit-logged safe-write path and is tracked in a change-set: if any step fails, the ENTIRE build is rolled back so the workbook is never left half-converted. Defaults to dry_run=True. This end-to-end build+simulate is exactly what an advisory agent cannot do.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | Preview the planned build without writing. Default True. |
| inputs | array | yes | Uncertain inputs to create, each: {'cell': 'B4', 'input_name': 'Demand', 'function_name': 'VoseModPERT', 'parameters': [{'value': 100}, {'value': 150}, {'value': 250}]}. |
| outputs | – | – | Output cells to wrap: [{'cell': 'B12', 'output_name': 'NPV'}]. Omit if outputs are already wrapped. |
| run | boolean | – | Run a validating simulation after building. Default True. |
| samples | integer | – | – |
| seed | integer | – | – |
| sheet | string | yes | Sheet holding the cells. |
| workbook | string | yes | Workbook file name. |
| Name | Type | Req | Description |
|---|---|---|---|
| change_set_size | integer | yes | Number of cells written (0 if dry_run). |
| correlated | boolean | – | – |
| dry_run | boolean | yes | – |
| headline | object | – | Per-output headline stats (mean/P10/P50/P90) from the validating run. |
| inputs_built | array | – | – |
| note | string | yes | – |
| outputs_wrapped | array | – | – |
| rolled_back | boolean | – | – |
| simulated | boolean | – | – |
| steps | array | yes | Ordered, human-readable log of the build. |
| workbook | string | yes | – |
No examples provided.
close_workbook ~102
ModelRisk: Close an open workbook by file name. By DEFAULT unsaved changes are DISCARDED (save=False) — pass save=True to write them first. Returns the closed name and the workbooks still open. Raises if the named workbook isn't open.
| Name | Type | Req | Description |
|---|---|---|---|
| save | boolean | – | Save before closing. False (default) discards unsaved changes. |
| workbook_name | string | yes | File name of an open workbook, e.g. 'risk.xlsx'. |
Structured output declared, but exposes no named fields.
No examples provided.
compare_distributions ~153
ModelRisk: Compare two simulation outputs head-to-head from their per-iteration samples — mean/stdev/percentile differences, P(A > B), and first- and second-order stochastic dominance (under the convention that larger outcomes are preferred). First-order dominance means one option is better at every probability level; second-order adds risk-aversion. Use it to decide between strategies. Run a simulation that records both outputs first.
| Name | Type | Req | Description |
|---|---|---|---|
| max_n | integer | – | Max samples per output (default 100 000). |
| output_a | string | yes | First output (VoseOutput) name. |
| output_b | string | yes | Second output name. |
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
| Name | Type | Req | Description |
|---|---|---|---|
| first_order_dominance | string | yes | 'A', 'B', or 'none' — first-order stochastic dominance (larger=better). |
| mean_a | number | yes | – |
| mean_b | number | yes | – |
| mean_difference | number | yes | mean(A) - mean(B). |
| output_a | string | yes | – |
| output_b | string | yes | – |
| p_a_greater | – | yes | P(A > B). Paired if samples align, else null. |
| paired | boolean | yes | True if equal-length samples were compared iteration-by-iteration. |
| percentile_deltas | array | yes | A vs B at a percentile ladder. |
| sample_size | integer | yes | – |
| second_order_dominance | string | yes | 'A', 'B', or 'none' — second-order stochastic dominance (risk-averse). |
| stdev_a | number | yes | – |
| stdev_b | number | yes | – |
No examples provided.
compute_correlation_matrix ~171
ModelRisk: Compute the rank-order (Spearman) correlation matrix of a data range via VoseCorrMatrix, and its nearest valid (positive-semidefinite) form via VoseValidCorrmat. Use this to turn historical data into the correlation matrix you feed to create_copula for correlated inputs. Variables are columns by default (set `data_in_rows=True` if each row is a variable). Read-only: runs on a transient scratch sheet that is always deleted.
| Name | Type | Req | Description |
|---|---|---|---|
| data_in_rows | boolean | – | True if each variable is a row. Default: columns. |
| data_range | string | yes | A1-style range of the data, e.g. 'A1:D200'. |
| sheet | string | yes | Sheet holding the data. |
| workbook | string | yes | Workbook file name. |
| Name | Type | Req | Description |
|---|---|---|---|
| data_range | string | yes | – |
| is_valid | boolean | yes | True if the matrix is already a valid (PSD) correlation matrix. |
| matrix | array | yes | Spearman rank-order correlation matrix (VoseCorrMatrix). |
| nearest_valid_matrix | – | – | Nearest valid matrix (VoseValidCorrmat) — null when already valid. |
| variable_count | integer | yes | – |
No examples provided.
compute_distribution ~322
ModelRisk: Analytic distribution calculator — compute a property of a distribution WITHOUT running a simulation. Give a `family` (e.g. 'Normal', 'Lognormal', 'PERT') and its `parameters`, OR point at an `object_cell` that already holds a Vose distribution object (e.g. a fitted distribution). `metric` is one of: 'pdf' (density f(x)), 'cdf' (P(X<=x)), 'exceedance' (P(X>x)), 'quantile' (the x at cumulative probability u), 'mean', 'stdev', 'variance', 'skewness', 'kurtosis', 'cov', or 'summary' (all moments + a percentile ladder in one call). `at` is x for pdf/cdf/exceedance and u (0-1) for quantile. Exact, read-only: nothing is written and no simulation is run.
| Name | Type | Req | Description |
|---|---|---|---|
| at | – | – | x (pdf/cdf/exceedance) or u in (0,1) for quantile. |
| family | – | – | Distribution family, e.g. 'Lognormal'. Omit if using object_cell. |
| metric | string | yes | pdf | cdf | exceedance | quantile | mean | stdev | variance | skewness | kurtosis | cov | summary |
| object_cell | – | – | A1-style cell already holding a Vose distribution object. |
| object_sheet | – | – | Sheet of object_cell, if used. |
| parameters | – | – | Positional parameters for the family, in ModelRisk order. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
create_aggregate ~364
ModelRisk: Build a frequency-severity aggregate using the chosen `method` — 'FFT' (Fast Fourier Transform) or 'Panjer' (Panjer recursion) for the fast analytic methods, or 'MC' for Monte Carlo. frequency_object_cell and severity_object_cell are references to distribution-object cells (built with Vose<Family>Object). FFT and Panjer support `as_object=True`, which writes the ...Object form whose mean and percentiles can be read directly with compute_distribution / get_tail_risk — the aggregate loss distribution WITHOUT running a simulation. Method-specific options: `density` (FFT), `intervals` / `max_p` (Panjer), `min_limit` / `max_limit` / `distribution_shift` (MC). For plain MC sampling, create_aggregate_mc is the dedicated shortcut.
| Name | Type | Req | Description |
|---|---|---|---|
| as_object | boolean | – | Write the analytic ...Object form (FFT/Panjer only) instead of a per-iteration sample. Lets you read the aggregate distribution without simulating. |
| density | – | – | FFT only: density discretisation flag. |
| distribution_shift | – | – | MC only: severity shift. |
| dry_run | boolean | – | – |
| frequency_object_cell | string | yes | – |
| intervals | – | – | Panjer only: number of discretisation intervals. |
| max_limit | – | – | MC only: per-severity upper limit. |
| max_p | – | – | Panjer only: cumulative-probability cap. |
| method | string | – | Aggregation engine: 'FFT', 'Panjer', or 'MC'. |
| min_limit | – | – | MC only: per-severity lower limit. |
| severity_object_cell | string | yes | – |
| sheet | string | yes | – |
| target_cell | string | yes | – |
| workbook | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| cell | – | yes | – |
| formula | string | yes | – |
| previous_formula | – | – | – |
| written | boolean | yes | – |
No examples provided.
create_aggregate_mc ~144
ModelRisk: Build a VoseAggregateMC(n, distribution, ...) formula that simulates the aggregate of a (possibly random) number n of i.i.d. severity draws. n and distribution are cell references — n points at a frequency cell, distribution at a severity object cell (built with a Vose<Family>Object function).
| Name | Type | Req | Description |
|---|---|---|---|
| distribution_shift | – | – | – |
| dry_run | boolean | – | – |
| frequency_object_cell | string | yes | – |
| max_limit | – | – | – |
| min_limit | – | – | – |
| severity_object_cell | string | yes | – |
| sheet | string | yes | – |
| target_cell | string | yes | – |
| workbook | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| cell | – | yes | – |
| formula | string | yes | – |
| previous_formula | – | – | – |
| written | boolean | yes | – |
No examples provided.
create_cdf_chart ~164
ModelRisk: Render the ascending cumulative-probability curve (CDF) of one output's simulation result distribution as a new sheet in the workbook. The sheet has a binned data table plus a native Excel line chart of cumulative probability (0-100%) against the output value — the 'what's the chance the output is below X' view. Requires a completed simulation (reads samples from the active .vmrs). Idempotent — a sheet with the target name is replaced.
| Name | Type | Req | Description |
|---|---|---|---|
| output_name | string | yes | VoseOutput name to chart. |
| sheet_name | – | – | Target sheet name. Default: `CDF_<output_name>` (truncated to Excel's 31-char limit). |
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
Structured output declared, but exposes no named fields.
No examples provided.
create_copula ~98
ModelRisk: Build a copula formula (e.g. VoseCopulaMultiNormal) that produces a correlated u-array for downstream distribution calls. Copula tools are exempt from the bulk-write guard.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | – |
| function_name | string | yes | – |
| parameters | array | yes | – |
| sheet | string | yes | – |
| u_array_target_range | string | yes | – |
| workbook | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| cell | – | yes | – |
| formula | string | yes | – |
| previous_formula | – | – | – |
| written | boolean | yes | – |
No examples provided.
create_histogram_chart ~183
ModelRisk: Render a histogram of one output's simulation result distribution as a new sheet in the workbook. The sheet has a binned data table (bin centre / frequency / cumulative %) plus a native Excel chart: frequency columns with the cumulative-probability curve overlaid on a secondary % axis and the central-80% (P10-P90) band highlighted — the same view as ModelRisk's Results Viewer, persisted into the workbook. Requires a completed simulation (reads samples from the active .vmrs). Idempotent — a sheet with the target name is replaced.
| Name | Type | Req | Description |
|---|---|---|---|
| output_name | string | yes | VoseOutput name to chart. |
| sheet_name | – | – | Target sheet name. Default: `Histogram_<output_name>` (truncated to Excel's 31-char limit). |
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
Structured output declared, but exposes no named fields.
No examples provided.
create_risk_event ~105
ModelRisk: Build a VoseRiskEvent(probability, impact_object) formula. The impact_function_name must be a distribution-object function (category 'object') — typically a Vose<Family>Object variant.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | – |
| impact_function_name | string | yes | – |
| impact_parameters | array | yes | – |
| probability | – | yes | – |
| sheet | string | yes | – |
| target_cell | string | yes | – |
| workbook | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| cell | – | yes | – |
| formula | string | yes | – |
| previous_formula | – | – | – |
| written | boolean | yes | – |
No examples provided.
create_time_series ~125
ModelRisk: Build a time-series formula (VoseTimeGBM, VoseTimeAR1, etc.) and write it into the target_range. Time-series tools are exempt from the >50-cell bulk-write guard because the dimension of the time series is the whole point.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | – |
| function_name | string | yes | – |
| parameters | array | yes | – |
| sheet | string | yes | – |
| target_range | string | yes | A1 range to spill into, e.g. 'D2:D101'. |
| workbook | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| cell | – | yes | – |
| formula | string | yes | – |
| previous_formula | – | – | – |
| written | boolean | yes | – |
No examples provided.
create_tornado_chart ~161
ModelRisk: Render a tornado chart of input sensitivity for a single output as a new sheet in the workbook. The sheet has a sorted data table (Spearman rank correlation + regression coefficient per input) plus a native Excel BarClustered chart with the largest-magnitude input at the top. Idempotent — if a sheet with the target name already exists, it's replaced. Useful when the user wants the visualization persisted in the workbook, not just returned over MCP.
| Name | Type | Req | Description |
|---|---|---|---|
| output_name | string | yes | VoseOutput name to analyze. |
| sheet_name | – | – | Target sheet name. Default: `Tornado_<output_name>` (truncated to Excel's 31-char limit). |
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
Structured output declared, but exposes no named fields.
No examples provided.
decompose_uncertainty ~222
ModelRisk: Split an output's uncertainty into EPISTEMIC (parameter / knowledge uncertainty — reducible with more data) and ALEATORY (natural variability — irreducible), via the law of total variance. ModelRisk has no two-dimensional-simulation worksheet function, so this approximates it from two runs you provide as two outputs: `total_output` from a full run (everything varying), and `conditional_output` from a run with the epistemic/parameter inputs FROZEN at point estimates (only natural variability left). Epistemic variance = total - aleatory. Tells you whether collecting more data (cuts epistemic) or hedging variability (aleatory) is the lever.
| Name | Type | Req | Description |
|---|---|---|---|
| conditional_output | string | yes | Output name from the run with epistemic inputs frozen. |
| max_n | integer | – | Max samples to read (default 100 000). |
| total_output | string | yes | Output name from the full run (all inputs varying). |
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
| Name | Type | Req | Description |
|---|---|---|---|
| aleatory_share | number | yes | Aleatory fraction of total variance (0-1). |
| aleatory_stdev | number | yes | – |
| aleatory_variance | number | yes | Variability remaining when epistemic (parameter) inputs are frozen. |
| conditional_output | string | yes | – |
| epistemic_share | number | yes | Epistemic fraction of total variance (0-1). |
| epistemic_stdev | number | yes | sqrt(max(epistemic_variance, 0)). |
| epistemic_variance | number | yes | total - aleatory; the part driven by parameter uncertainty. |
| interpretation | string | yes | Which uncertainty dominates and what reduces it. |
| total_output | string | yes | – |
| total_stdev | number | yes | – |
| total_variance | number | yes | – |
No examples provided.
diagnose_workbook ~115
ModelRisk: One-call workbook health check. Returns everything an MCP client typically wants at the start of a session: whether Excel is reachable, whether the ModelRisk SDK is activated, the active workbook's name + sheets, counts of inputs / outputs / distributions, whether a sibling `.vmrs` exists and when it was last modified, and the audit-log location. Use this as the first call instead of orchestrating 4-5 individual reading tools.
| Name | Type | Req | Description |
|---|---|---|---|
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
Structured output declared, but exposes no named fields.
No examples provided.
discover_inputs ~78
ModelRisk: Discover candidate input cells — numeric cells referenced by formulas — and rank them by how likely they are to be uncertain model inputs (vs. constants like 12 months per year). The ranking weighs reference count and number magnitude. Pair with propose_distributions_for_inputs.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| workbook_name | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
find_hard_coded_inputs ~63
ModelRisk: Heuristic discovery of cells that look like deterministic numeric inputs — i.e. a plain number, referenced by at least one formula. These are candidates for replacing with a distribution + VoseInput wrapper.
| Name | Type | Req | Description |
|---|---|---|---|
| workbook_name | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
fit_all_data_and_wire ~416
ModelRisk: Fit BOTH the marginal distributions and the copula dependence from a data block, then wire the whole correlated, simulation-ready model into the workbook in one reversible pass. For each variable column it fits+ranks the best marginal (AIC/SIC/HQIC); across the columns it fits the best copula (fit_copula_to_data) and writes the correlated-U block at `copula_anchor`; each marginal is wired to its copula U so the inputs are dependent, not independent — capturing the tail co-movement a single correlation coefficient discards. Optionally runs a validating simulation. Defaults to dry_run=True (returns the exact planned formulas without writing). On any mid-build failure the whole change-set is rolled back. This is the data→model step no advisory agent can perform.
| Name | Type | Req | Description |
|---|---|---|---|
| columns | array | yes | One entry per data column, in column order: {'input_name': 'Demand', 'target_cell': 'F2'}. |
| copula_anchor | – | – | Top cell for the correlated-U block. Omit to skip correlation. |
| criterion | string | – | Fit criterion: 'SIC' (default), 'AIC', or 'HQIC'. |
| data_range | string | yes | Rectangular data block, one column per variable, e.g. 'A2:C500'. |
| dry_run | boolean | – | Preview the planned formulas without writing. Default True. |
| run | boolean | – | Run a validating simulation after wiring. Default False. |
| samples | integer | – | – |
| seed | integer | – | – |
| sheet | string | yes | Sheet holding the data and target cells. |
| target_sheet | – | – | Sheet holding the target cells and the copula block. Defaults to `sheet` (the data sheet) — pass this when the model lives on a different sheet than the data, e.g. data on 'Data', wired inputs on 'Mo… |
| uncertainty | boolean | – | Fit with parameter uncertainty. Default False. |
| workbook | string | yes | Workbook file name. |
| Name | Type | Req | Description |
|---|---|---|---|
| achieved_correlation | – | – | Rank correlation of the wired inputs from the validating run. |
| columns | array | yes | – |
| copula_anchor | – | – | Range where the correlated-U block was written. |
| copula_family | – | – | Best-fit copula family wired across the columns, if any. |
| dry_run | boolean | yes | – |
| note | string | yes | – |
| rolled_back | boolean | – | True if a mid-build failure triggered a full rollback. |
| sheet | string | yes | – |
| simulated | boolean | yes | Whether a validating simulation was run. |
| steps | array | yes | Ordered log of what happened. |
| workbook | string | yes | – |
No examples provided.
fit_and_rank_distributions ~244
ModelRisk: Fit several distribution families to a data range and rank them by goodness of fit. For each family it fits Vose<Family>FitObject and scores it with ModelRisk's information criteria — AIC, SIC (Schwarz/BIC) and HQIC — then ranks ascending (lower = better) by `criterion`. Families with no fit function, or that can't fit the data, are returned under `skipped` with a reason. Use this instead of guessing a single family for fit_distribution_to_data. Runs on a transient scratch sheet that is always deleted; the data is not modified.
| Name | Type | Req | Description |
|---|---|---|---|
| criterion | string | – | Ranking criterion: 'SIC' (default), 'AIC', or 'HQIC'. |
| data_range | string | yes | A1-style range of the data, e.g. 'A1:A200'. |
| families | – | – | Families to try. Omit for a broad continuous default set. |
| sheet | string | yes | Sheet holding the data. |
| uncertainty | boolean | – | Fit with parameter uncertainty (second-order). Default False. |
| workbook | string | yes | Workbook file name, e.g. 'model.xlsx'. |
| Name | Type | Req | Description |
|---|---|---|---|
| best_family | – | – | The top-ranked family, or null if every fit failed. |
| candidates | array | yes | Successfully-fitted families, best first. |
| criterion | string | yes | Criterion the ranking is sorted by (AIC / SIC / HQIC). |
| data_range | string | yes | – |
| sample_size | integer | yes | – |
| skipped | array | – | Families that could not be fitted, with a reason each. |
No examples provided.
fit_copula_to_data ~300
ModelRisk: Fit parametric copulas to a multi-column data range and rank them by goodness of fit — the DEPENDENCE STRUCTURE fitted from data, not merely constructed. Tries Normal, T, Clayton, Frank and Gumbel families (Vose<Family>FitObject), scores each with AIC / SIC / HQIC, and reports the winner plus its tail-dependence character (lower = crash-together, upper = boom-together, both = T, none = Normal/Frank) — the joint-tail risk a single correlation coefficient throws away. Runs on a transient scratch sheet that is always deleted; the data is not modified. Pair with fit_all_data_and_wire to insert the fitted copula into the model.
| Name | Type | Req | Description |
|---|---|---|---|
| criterion | string | – | Ranking criterion: 'SIC' (default), 'AIC', or 'HQIC'. |
| data_in_rows | boolean | – | True if each variable is a ROW, not a column. Default False. |
| data_range | string | yes | A1 range of the multi-column data, e.g. 'A1:C500'. |
| families | – | – | Copula families to try. Omit for the default 5-family set. |
| sheet | string | yes | Sheet holding the data. |
| uncertainty | boolean | – | Fit with parameter uncertainty (second-order). Default False. |
| workbook | string | yes | Workbook file name, e.g. 'model.xlsx'. |
| Name | Type | Req | Description |
|---|---|---|---|
| best_family | – | – | Top-ranked copula family, or null if every fit failed. |
| candidates | array | yes | Successfully-fitted copula families, best first. |
| criterion | string | yes | Criterion the ranking is sorted by (AIC / SIC / HQIC). |
| data_range | string | yes | – |
| n_variables | integer | yes | Number of variables (columns) the copula spans. |
| note | string | yes | Interpretation of the winning family's tail behaviour. |
| sample_size | integer | yes | Number of joint observations (rows). |
| skipped | array | – | Families that could not be fitted, with a reason each. |
No examples provided.
fit_distribution_to_data ~213
ModelRisk: Fit a distribution family to a data range and write the result. 'family' is e.g. 'Normal', 'Lognormal', 'Beta', 'Gamma', 'Weibull' — the tool maps it to the catalogue function (Vose<Family>Fit). Set uncertainty=True (the default) to include parameter uncertainty in the fitted distribution.
| Name | Type | Req | Description |
|---|---|---|---|
| as_object | boolean | – | Write Vose<Family>FitObject(...) instead of the sampling Vose<Family>Fit(...). The OBJECT form is what compute_distribution / VoseMean / VosePercentile need to answer analytic questions about the fit… |
| data_range | string | yes | – |
| dry_run | boolean | – | – |
| family | string | yes | Distribution family, e.g. 'Normal'. |
| sheet | string | yes | – |
| target_cell | string | yes | – |
| uncertainty | boolean | – | – |
| workbook | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| cell | – | yes | – |
| formula | string | yes | – |
| previous_formula | – | – | – |
| written | boolean | yes | – |
No examples provided.
fit_tail ~247
ModelRisk: Fit an extreme-value / Generalised-Pareto tail to data and read its risk. `family` is 'GPD' (peaks-over-threshold, the standard tail model), 'GEV' (block maxima), 'ExtValueMax', or 'ExtValueMin'. For GPD peaks-over-threshold, pass the range of exceedances above your threshold as `data_range`. Writes a Vose<Family>FitObject (dry_run previews) and returns the fitted tail's mean and high percentiles (P95 / P99 / P99.5 / P99.9) computed analytically — the tail risk without a simulation. Feed the written object cell to compute_distribution / get_tail_risk for more.
| Name | Type | Req | Description |
|---|---|---|---|
| data_range | string | yes | A1-style range of the tail data. |
| dry_run | boolean | – | – |
| family | string | – | 'GPD' (default), 'GEV', 'ExtValueMax', or 'ExtValueMin'. |
| sheet | string | yes | – |
| target_cell | string | yes | – |
| uncertainty | boolean | – | Fit with parameter uncertainty. Default True. |
| workbook | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data_range | string | yes | – |
| family | string | yes | Tail family fitted, e.g. 'GPD' or 'GEV'. |
| mean | number | yes | – |
| object_formula | string | yes | The Vose<Family>FitObject formula written (or previewed). |
| percentiles | object | yes | Fitted-tail percentiles, e.g. {'P95': ..., 'P99': ..., 'P99.5': ...}. |
| written | boolean | yes | – |
No examples provided.
fit_time_series ~368
ModelRisk: Fit TIME-SERIES models to a historical data range and rank them by goodness of fit — GBM (plus mean-reverting / jump-diffusion / seasonal variants), AR1/AR2, MA1/MA2, ARMA, ARCH/GARCH/EGARCH. Each family's VoseTime<Family>FitObject is scored with AIC / SIC / HQIC on a transient scratch sheet (nothing in the workbook is modified by the ranking). Optionally pass `target_range` (+ dry_run=False) to write the best model's projection — a VoseTime<Family>Fit(...) ARRAY formula, one period per cell, CSE-entered — so each simulated path carries the fitted dynamics (autocorrelation, volatility clustering) period to period. Note: unlike distribution fitting, parameter uncertainty is not supported here.
| Name | Type | Req | Description |
|---|---|---|---|
| criterion | string | – | Ranking criterion: 'SIC' (default), 'AIC', or 'HQIC'. |
| data_range | string | yes | A1 range of the history, oldest first, e.g. 'B5:B64'. May be sheet-qualified ('Data!B5:B64'). |
| dry_run | boolean | – | Preview the projection formula without writing. Default True. |
| families | – | – | Family stems to try, e.g. ['GBM','AR1','GARCH']. Omit for a broad 12-family default. |
| sheet | string | yes | Sheet holding the historical data. |
| target_range | – | – | Range to CSE-enter the best model's projection into, e.g. 'D5:D16' for a 12-period forecast. Omit to rank only. |
| target_sheet | – | – | Sheet for target_range. Defaults to `sheet`. |
| workbook | string | yes | Workbook file name. |
| Name | Type | Req | Description |
|---|---|---|---|
| best_family | – | – | Top-ranked family, or null if every fit failed. |
| candidates | array | yes | Successfully-fitted families, best first. |
| criterion | string | yes | – |
| data_range | string | yes | – |
| projection_formula | – | – | The VoseTime<Family>Fit(...) array formula for the projection. |
| sample_size | integer | yes | – |
| skipped | array | – | – |
| target_range | – | – | – |
| written | boolean | – | True when the projection was CSE-entered into target_range. |
No examples provided.
generate_executive_summary ~108
ModelRisk: Generate an executive-audience summary of the most recent simulation results for a workbook. Returns markdown ready to paste into a deck/report — covers deterministic vs P50 vs mean comparisons, P80 contingency, and the top sensitivity drivers.
| Name | Type | Req | Description |
|---|---|---|---|
| deterministic_values | – | – | Optional map of output name → its deterministic (unsimulated) value, so the summary can quote the uplift/contingency. If omitted, the summary skips that comparison. |
| workbook_name | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
get_active_workbook ~23
ModelRisk: Get the name and path of the active workbook.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| active_sheet | – | – | – |
| name | string | yes | – |
| path | string | yes | – |
| sheets | array | – | – |
No examples provided.
get_cell ~55
ModelRisk: Read a single cell's formula, value, and number format.
| Name | Type | Req | Description |
|---|---|---|---|
| cell | string | yes | A1-style cell reference like 'B12'. |
| sheet | string | yes | – |
| workbook_name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| cell_type | string | – | – |
| error | – | – | – |
| formula | string | – | – |
| number_format | string | – | – |
| ref | – | yes | – |
| value | – | – | – |
No examples provided.
get_correlation_matrix ~66
ModelRisk: Pearson and Spearman rank correlation between the named simulation inputs and outputs. Computed from the per-iteration samples ModelRisk records. Pass a name list to restrict; otherwise all variables are included.
| Name | Type | Req | Description |
|---|---|---|---|
| name_list | – | – | – |
| workbook_name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| iterations | integer | – | – |
| names | array | – | – |
| pearson | array | – | – |
| source | string | – | – |
| spearman | array | – | – |
No examples provided.
get_samples ~134
ModelRisk: Return raw per-iteration sample values for a single output or input. Useful for custom histograms, arbitrary percentiles, downstream analysis. Caps at 10 000 samples by default to keep the MCP response small; raise `max_n` if you need more (a 100 000-iteration sim returns ~100 KB of JSON at max_n=100000).
| Name | Type | Req | Description |
|---|---|---|---|
| max_n | integer | – | Maximum samples to return (default 10 000). |
| output_name | string | yes | VoseInput or VoseOutput name. |
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
Structured output declared, but exposes no named fields.
No examples provided.
get_sensitivity_ranking ~61
ModelRisk: Tornado / sensitivity ranking for a single output. Returns each input ranked by its Spearman rank correlation with the output, plus the standardised regression coefficient.
| Name | Type | Req | Description |
|---|---|---|---|
| output_name | string | yes | – |
| workbook_name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| entries | array | – | – |
| iterations | integer | – | – |
| output_name | string | yes | – |
| source | string | – | – |
No examples provided.
get_simulation_results ~89
ModelRisk: Read simulation result statistics for the workbook's outputs. Returns per-output mean, stdev, variance, skewness, kurtosis, min, max, and P5/P10/P25/P50/P75/P90/P95 percentiles. Requires a simulation to have been run; pass output_names to filter.
| Name | Type | Req | Description |
|---|---|---|---|
| output_names | – | – | – |
| workbook_name | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
get_tail_risk ~278
ModelRisk: Tail-risk profile of a simulation output from its per-iteration samples — Value-at-Risk (VaR) and Conditional VaR / expected shortfall (CVaR) at each confidence level, plus optional threshold probabilities P(X>t) / P(X<=t). `tail='upper'` (default) treats large values as the loss (e.g. cost, claims); `tail='lower'` treats small values as the loss (e.g. NPV, profit). VaR is the alpha-quantile; CVaR is the mean of the worst (1-alpha) tail beyond it. Reads the samples ModelRisk recorded in the .vmrs — run a simulation first.
| Name | Type | Req | Description |
|---|---|---|---|
| alphas | – | – | Confidence levels for VaR/CVaR. Default [0.95, 0.99]. |
| max_n | integer | – | Max samples to read (default 100 000). |
| output_name | string | yes | VoseOutput (or VoseInput) name. |
| tail | string | – | 'upper' (large = bad, default) or 'lower' (small = bad). |
| thresholds | – | – | Values to compute P(X>t) / P(X<=t) for. Optional. |
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
| Name | Type | Req | Description |
|---|---|---|---|
| maximum | number | yes | – |
| mean | number | yes | – |
| minimum | number | yes | – |
| output_name | string | yes | – |
| sample_size | integer | yes | – |
| stdev | number | yes | – |
| tail | string | yes | 'upper' (large = bad) or 'lower' (small = bad). |
| tail_metrics | array | yes | VaR / CVaR at each requested confidence level. |
| threshold_probabilities | array | – | P(X>t) / P(X<=t) for each requested threshold. |
No examples provided.
get_workbook_summary ~69
ModelRisk: Aggregated summary of a workbook — sheet names plus counts of VoseInput, VoseOutput, distribution, formula, and numeric cells. One-shot alternative to running the individual list tools.
| Name | Type | Req | Description |
|---|---|---|---|
| workbook_name | string | yes | Workbook file name (e.g. 'model.xlsx'). |
| Name | Type | Req | Description |
|---|---|---|---|
| distribution_count | integer | – | – |
| formula_cell_count | integer | – | – |
| input_count | integer | – | – |
| modelrisk_loaded | boolean | – | – |
| numeric_cell_count | integer | – | – |
| output_count | integer | – | – |
| sheets | array | – | – |
| workbook | string | yes | – |
No examples provided.
insert_distribution ~111
ModelRisk: Write a Vose distribution formula (e.g. =VoseModPERT(...)) into a cell. Validates the function name against the ModelRisk catalogue. Defaults to dry_run=True — Claude must explicitly pass dry_run=False to commit.
| Name | Type | Req | Description |
|---|---|---|---|
| cell | string | yes | A1 cell reference like 'B12'. |
| dry_run | boolean | – | – |
| function_name | string | yes | – |
| parameters | array | yes | – |
| sheet | string | yes | – |
| workbook | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| cell | – | yes | – |
| formula | string | yes | – |
| previous_formula | – | – | – |
| written | boolean | yes | – |
No examples provided.
list_distributions ~75
ModelRisk: List every cell containing a Vose distribution / aggregate / copula / time-series / fitting function. Includes flags for whether each cell is also wrapped with VoseInput or VoseOutput. Optional `sheet` restricts the scan to one sheet.
| Name | Type | Req | Description |
|---|---|---|---|
| sheet | – | – | – |
| workbook_name | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
list_modelrisk_inputs ~54
ModelRisk: List every cell wrapped with VoseInput() in the workbook. Returns each cell's reference, the input name, the full formula, and the current calculated value.
| Name | Type | Req | Description |
|---|---|---|---|
| workbook_name | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
list_modelrisk_outputs ~34
ModelRisk: List every cell wrapped with VoseOutput() in the workbook.
| Name | Type | Req | Description |
|---|---|---|---|
| workbook_name | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
list_open_workbooks ~21
ModelRisk: List all Excel workbooks currently open.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
list_vmrs_variables ~98
ModelRisk: List every variable in the active simulation results (`.vmrs`) that's also declared as a VoseInput or VoseOutput in the workbook. Each entry: `{name, kind, var_id, iterations}`. Use this before `get_samples` or `read_vmrs` when you don't already know which outputs / inputs exist in the file.
| Name | Type | Req | Description |
|---|---|---|---|
| workbook_name | – | – | Workbook name. Omit for the active workbook. |
Structured output declared, but exposes no named fields.
No examples provided.
open_workbook ~95
ModelRisk: Open a workbook (.xlsx/.xlsm) from disk in the running Excel so the other tools can act on it. Pass an absolute file path. If a workbook with the same file name is already open, returns that one (Excel won't open two with the same name). Requires Excel running.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the workbook file, e.g. r'C:\models\risk.xlsx'. |
| Name | Type | Req | Description |
|---|---|---|---|
| active_sheet | – | – | – |
| name | string | yes | – |
| path | string | yes | – |
| sheets | array | – | – |
No examples provided.
plan_risk_model ~114
ModelRisk: One-call blueprint for turning a deterministic workbook into a Monte Carlo risk model. Reports what's already there (declared outputs, existing distributions), the ranked hard-coded cells that look like uncertain inputs, and an ordered, state-aware checklist of next actions (wrap outputs, fit/propose distributions, correlate, audit, simulate, interpret). Read-only — it plans, it doesn't modify. Run this first when asked to 'add uncertainty' or 'make this a risk model'.
| Name | Type | Req | Description |
|---|---|---|---|
| workbook_name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| distribution_count | integer | yes | Vose distribution cells already present. |
| input_candidate_count | integer | yes | – |
| input_candidates | array | yes | Ranked hard-coded numeric cells that look like uncertain inputs. |
| output_count | integer | yes | – |
| outputs | array | yes | Names of cells already wrapped with VoseOutput. |
| readiness | string | yes | 'ready', 'needs-outputs', 'needs-inputs', or 'empty'. |
| steps | array | yes | Ordered, state-aware next actions. |
| workbook | string | yes | – |
No examples provided.
propose_distributions_for_inputs ~111
ModelRisk: Propose distribution families for a list of uncertain inputs. Each input gets a ranked list of recommendations from the methodology-grounded selection guide. The tool does NOT write to Excel — it returns suggestions for the LLM to walk through with the user before committing via replace_constant_with_distribution.
| Name | Type | Req | Description |
|---|---|---|---|
| inputs | array | yes | Each entry: {cell_ref?, current_value?, description}. `description` is the natural-language description of the uncertain quantity (e.g. 'unit cost of widget X'). |
Structured output declared, but exposes no named fields.
No examples provided.
read_range ~68
ModelRisk: Read a contiguous range as a 2D array of values and formulas. Use ranges like 'A1:C10'.
| Name | Type | Req | Description |
|---|---|---|---|
| range_ref | string | yes | A1-style range like 'A1:C10'. |
| sheet | string | yes | – |
| workbook_name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| errors | array | – | – |
| formulas | array | – | – |
| range_ref | string | yes | – |
| sheet | string | yes | – |
| values | array | – | – |
| workbook | string | yes | – |
No examples provided.
What is the ModelRisk MCP server?
ModelRisk is an MCP server listed in the public MCP registry as io.github.vosesoftware/modelrisk-mcp. Read, build, fit, and run Monte Carlo risk models in Excel through Vose Software's ModelRisk. This page covers its PyPI package (modelrisk-mcp).
Is the ModelRisk MCP server safe to use?
ModelRisk scores 62 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. 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 ModelRisk MCP server expose?
ModelRisk exposes 59 tools: list_open_workbooks, get_active_workbook, open_workbook, close_workbook, get_workbook_summary, and 54 more. Their descriptions and schemas cost roughly 9,139 tokens of context every time the server is loaded.
Is the ModelRisk MCP server still maintained?
ModelRisk is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.