Deterministic what-if & scenario simulation for AI agents: projections, sensitivity & break-even.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Solve for the input value required to make an output metric hit a target value (deterministic bisection root-finding). Provide 'template', 'solve_for' (the input to solve), 'target_metric' (defaults to the primary output), and 'target_value'. Optionally pass 'bounds' [low, high] to constrain the search. Returns the required input value, the change from baseline, the achieved metric, and the residual. Assumes the metric is monotonic in the solved input over the range.
Pre-built scenario template id: saas_growth, pricing_change, churn_impact, cost_reduction, hiring_plan, cash_runway, unit_economics, marketing_funnel, compound_growth (aliases like 'saas','pricing','runway','ltv' also resolve). Omit (or use 'custom') to run a free-form 'metrics' projection.
Name of the input variable to solve for.
The value the target_metric should reach.
Optional [low, high] search range for the solved input. Auto-derived + expanded if omitted.
Scenario assumptions as {name: value}. Which keys are valid depends on the template (call list_templates). Unlisted keys fall back to documented defaults; unknown keys are ignored and reported in notes. You may also pass assumptions at the top level.
Number of periods to project forward (1..1200). Default depends on template (usually 12).
Label for each period; also sets annualization (periods/year).
Output metric to hit (defaults to the template's primary output).
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Solve for the input value required to make an output metric hit a target value (deterministic bisection root-finding). Provide 'template', 'solve_for' (the input to solve), 'target_metric' (defaults to the primary output), and 'target_value'. Optionally pass 'bounds' [low, high] to constrain the search. Returns the required input value, the change from baseline, the achieved metric, and the residual. Assumes the metric is monotonic in the solved input over the range.
| Argument | Type | Description |
|---|---|---|
| bounds | array | Optional [low, high] search range for the solved input. Auto-derived + expanded if omitted. |
| inputs | object | Scenario assumptions as {name: value}. Which keys are valid depends on the template (call list_templates). Unlisted keys fall back to documented defaults; unknown keys are ignored and reported in notes. You may also pass assumptions at the top level. |
| horizon | integer | Number of periods to project forward (1..1200). Default depends on template (usually 12). |
| template* | string | Pre-built scenario template id: saas_growth, pricing_change, churn_impact, cost_reduction, hiring_plan, cash_runway, unit_economics, marketing_funnel, compound_growth (aliases like 'saas','pricing','runway','ltv' also resolve). Omit (or use 'custom') to run a free-form 'metrics' projection. |
| solve_for* | string | Name of the input variable to solve for. |
| period_label | string | Label for each period; also sets annualization (periods/year). |
| target_value* | number | The value the target_metric should reach. |
| target_metric | string | Output metric to hit (defaults to the template's primary output). |
{
"type": "object",
"required": [
"template",
"solve_for",
"target_value"
],
"properties": {
"bounds": {
"type": "array",
"items": {
"type": "number"
},
"description": "Optional [low, high] search range for the solved input. Auto-derived + expanded if omitted."
},
"inputs": {
"type": "object",
"description": "Scenario assumptions as {name: value}. Which keys are valid depends on the template (call list_templates). Unlisted keys fall back to documented defaults; unknown keys are ignored and reported in notes. You may also pass assumptions at the top level."
},
"horizon": {
"type": "integer",
"default": 12,
"description": "Number of periods to project forward (1..1200). Default depends on template (usually 12)."
},
"template": {
"type": "string",
"description": "Pre-built scenario template id: saas_growth, pricing_change, churn_impact, cost_reduction, hiring_plan, cash_runway, unit_economics, marketing_funnel, compound_growth (aliases like 'saas','pricing','runway','ltv' also resolve). Omit (or use 'custom') to run a free-form 'metrics' projection."
},
"solve_for": {
"type": "string",
"description": "Name of the input variable to solve for."
},
"period_label": {
"enum": [
"day",
"week",
"month",
"quarter",
"year"
],
"type": "string",
"default": "month",
"description": "Label for each period; also sets annualization (periods/year)."
},
"target_value": {
"type": "number",
"description": "The value the target_metric should reach."
},
"target_metric": {
"type": "string",
"description": "Output metric to hit (defaults to the template's primary output)."
}
}
}Run 2-3 scenarios and compare their key_results side by side, with deltas against the first (baseline) scenario. Provide a 'scenarios' array where each entry is {name?, template, inputs} (each may set its own horizon, or pass a shared top-level 'horizon'). Optionally rank on 'compare_metric' with 'goal' ('max' default | 'min') to pick a winner, and set include_projections:true to also return per-period series.
| Argument | Type | Description |
|---|---|---|
| goal | string | Whether higher (max) or lower (min) is better for compare_metric. |
| horizon | integer | Optional shared horizon applied to scenarios that don't set their own. |
| scenarios* | array | 2-3 scenarios to compare. Each: {name?, template, inputs, horizon?, period_label?} or {name?, metrics:[...]} for a custom model. |
| compare_metric | string | Metric to rank scenarios on (optional). |
| include_projections | boolean | Include each scenario's full per-period projections. |
{
"type": "object",
"required": [
"scenarios"
],
"properties": {
"goal": {
"enum": [
"max",
"min"
],
"type": "string",
"default": "max",
"description": "Whether higher (max) or lower (min) is better for compare_metric."
},
"horizon": {
"type": "integer",
"description": "Optional shared horizon applied to scenarios that don't set their own."
},
"scenarios": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"inputs": {
"type": "object",
"description": "Scenario assumptions as {name: value}. Which keys are valid depends on the template (call list_templates). Unlisted keys fall back to documented defaults; unknown keys are ignored and reported in notes. You may also pass assumptions at the top level."
},
"horizon": {
"type": "integer",
"default": 12,
"description": "Number of periods to project forward (1..1200). Default depends on template (usually 12)."
},
"metrics": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"start"
],
"properties": {
"mode": {
"enum": [
"compound",
"linear"
],
"type": "string",
"default": "compound"
},
"name": {
"type": "string"
},
"start": {
"type": "number"
},
"growth_rate": {
"type": "number"
}
}
},
"description": "For a CUSTOM free-form scenario (template omitted or 'custom'): a list of independently-growing metrics. Each: {name, start, growth_rate (per period, default 0), mode: 'compound' (default) | 'linear'}."
},
"template": {
"type": "string",
"description": "Pre-built scenario template id: saas_growth, pricing_change, churn_impact, cost_reduction, hiring_plan, cash_runway, unit_economics, marketing_funnel, compound_growth (aliases like 'saas','pricing','runway','ltv' also resolve). Omit (or use 'custom') to run a free-form 'metrics' projection."
},
"period_label": {
"enum": [
"day",
"week",
"month",
"quarter",
"year"
],
"type": "string",
"default": "month",
"description": "Label for each period; also sets annualization (periods/year)."
}
}
},
"description": "2-3 scenarios to compare. Each: {name?, template, inputs, horizon?, period_label?} or {name?, metrics:[...]} for a custom model."
},
"compare_metric": {
"type": "string",
"description": "Metric to rank scenarios on (optional)."
},
"include_projections": {
"type": "boolean",
"default": false,
"description": "Include each scenario's full per-period projections."
}
}
}Server health, version, and capabilities (tools, templates, period labels, max horizon). No parameters.
No arguments.
{
"type": "object",
"properties": {}
}Discovery tool: list every pre-built scenario template (id, label, category, description, primary output, documented inputs with defaults/units, and available output metrics), plus how to run a custom free-form scenario and the supported period labels. No required parameters.
No arguments.
{
"type": "object",
"properties": {}
}Main simulation tool. Run a deterministic what-if projection from a pre-built template (saas_growth, pricing_change, churn_impact, cost_reduction, hiring_plan, cash_runway, unit_economics, marketing_funnel, compound_growth) OR a free-form 'metrics' model. Returns period-by-period projections, headline key_results, the exact assumptions used (with defaults filled in), the methodology, notes, and a plain-language explanation. Pass 'template' + 'inputs' (assumptions), plus optional 'horizon' and 'period_label'. 100% deterministic (40-digit decimal math).
| Argument | Type | Description |
|---|---|---|
| inputs | object | Scenario assumptions as {name: value}. Which keys are valid depends on the template (call list_templates). Unlisted keys fall back to documented defaults; unknown keys are ignored and reported in notes. You may also pass assumptions at the top level. |
| horizon | integer | Number of periods to project forward (1..1200). Default depends on template (usually 12). |
| metrics | array | For a CUSTOM free-form scenario (template omitted or 'custom'): a list of independently-growing metrics. Each: {name, start, growth_rate (per period, default 0), mode: 'compound' (default) | 'linear'}. |
| template | string | Pre-built scenario template id: saas_growth, pricing_change, churn_impact, cost_reduction, hiring_plan, cash_runway, unit_economics, marketing_funnel, compound_growth (aliases like 'saas','pricing','runway','ltv' also resolve). Omit (or use 'custom') to run a free-form 'metrics' projection. |
| period_label | string | Label for each period; also sets annualization (periods/year). |
Vary one or more input assumptions and show the impact on a target output metric (one-at-a-time sensitivity). Provide 'template', the input to sweep via 'variable' (or 'variables' array), and 'target_metric' (defaults to the template's primary output). Control the sweep with 'variation' (fractional +/- around the baseline, default 0.2), 'steps' (default 5), or explicit 'values' / 'min'+'max'. Returns per-variable sweeps, an elasticity estimate, the output range, and a ranking of the most influential inputs.
| Argument | Type | Description |
|---|---|---|
| max | number | Sweep upper bound (with 'min'). |
| min | number | Sweep lower bound (with 'max'). |
| steps | integer | Number of sweep points per variable (2-200). |
| inputs | object | Scenario assumptions as {name: value}. Which keys are valid depends on the template (call list_templates). Unlisted keys fall back to documented defaults; unknown keys are ignored and reported in notes. You may also pass assumptions at the top level. |
| values | array | Explicit sweep values for a single 'variable'. |
| horizon | integer | Number of periods to project forward (1..1200). Default depends on template (usually 12). |
| template* | string | Pre-built scenario template id: saas_growth, pricing_change, churn_impact, cost_reduction, hiring_plan, cash_runway, unit_economics, marketing_funnel, compound_growth (aliases like 'saas','pricing','runway','ltv' also resolve). Omit (or use 'custom') to run a free-form 'metrics' projection. |
{
"type": "object",
"properties": {
"inputs": {
"type": "object",
"description": "Scenario assumptions as {name: value}. Which keys are valid depends on the template (call list_templates). Unlisted keys fall back to documented defaults; unknown keys are ignored and reported in notes. You may also pass assumptions at the top level."
},
"horizon": {
"type": "integer",
"default": 12,
"description": "Number of periods to project forward (1..1200). Default depends on template (usually 12)."
},
"metrics": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"start"
],
"properties": {
"mode": {
"enum": [
"compound",
"linear"
],
"type": "string",
"default": "compound"
},
"name": {
"type": "string"
},
"start": {
"type": "number"
},
"growth_rate": {
"type": "number"
}
}
},
"description": "For a CUSTOM free-form scenario (template omitted or 'custom'): a list of independently-growing metrics. Each: {name, start, growth_rate (per period, default 0), mode: 'compound' (default) | 'linear'}."
},
"template": {
"type": "string",
"description": "Pre-built scenario template id: saas_growth, pricing_change, churn_impact, cost_reduction, hiring_plan, cash_runway, unit_economics, marketing_funnel, compound_growth (aliases like 'saas','pricing','runway','ltv' also resolve). Omit (or use 'custom') to run a free-form 'metrics' projection."
},
"period_label": {
"enum": [
"day",
"week",
"month",
"quarter",
"year"
],
"type": "string",
"default": "month",
"description": "Label for each period; also sets annualization (periods/year)."
}
}
}| variable | string | A single input name to sweep. |
| variables | array | Multiple inputs to sweep (one at a time). Each: {name, variation?|values?|min?+max?, steps?}. |
| variation | number | Fractional sweep around the baseline (0<v<=1). 0.2 = +/-20%. |
| period_label | string | Label for each period; also sets annualization (periods/year). |
| target_metric | string | Output metric to track (see a template's 'outputs' via list_templates). Defaults to the template's primary output. |
{
"type": "object",
"required": [
"template"
],
"properties": {
"max": {
"type": "number",
"description": "Sweep upper bound (with 'min')."
},
"min": {
"type": "number",
"description": "Sweep lower bound (with 'max')."
},
"steps": {
"type": "integer",
"default": 5,
"description": "Number of sweep points per variable (2-200)."
},
"inputs": {
"type": "object",
"description": "Scenario assumptions as {name: value}. Which keys are valid depends on the template (call list_templates). Unlisted keys fall back to documented defaults; unknown keys are ignored and reported in notes. You may also pass assumptions at the top level."
},
"values": {
"type": "array",
"items": {
"type": "number"
},
"description": "Explicit sweep values for a single 'variable'."
},
"horizon": {
"type": "integer",
"default": 12,
"description": "Number of periods to project forward (1..1200). Default depends on template (usually 12)."
},
"template": {
"type": "string",
"description": "Pre-built scenario template id: saas_growth, pricing_change, churn_impact, cost_reduction, hiring_plan, cash_runway, unit_economics, marketing_funnel, compound_growth (aliases like 'saas','pricing','runway','ltv' also resolve). Omit (or use 'custom') to run a free-form 'metrics' projection."
},
"variable": {
"type": "string",
"description": "A single input name to sweep."
},
"variables": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"max": {
"type": "number"
},
"min": {
"type": "number"
},
"name": {
"type": "string"
},
"steps": {
"type": "integer"
},
"values": {
"type": "array",
"items": {
"type": "number"
}
},
"variation": {
"type": "number"
}
}
},
"description": "Multiple inputs to sweep (one at a time). Each: {name, variation?|values?|min?+max?, steps?}."
},
"variation": {
"type": "number",
"default": 0.2,
"description": "Fractional sweep around the baseline (0<v<=1). 0.2 = +/-20%."
},
"period_label": {
"enum": [
"day",
"week",
"month",
"quarter",
"year"
],
"type": "string",
"default": "month",
"description": "Label for each period; also sets annualization (periods/year)."
},
"target_metric": {
"type": "string",
"description": "Output metric to track (see a template's 'outputs' via list_templates). Defaults to the template's primary output."
}
}
}