addrbookFor publishers
← The evidence ledger

Evidence row 1241017

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 278214a0-1e9d-4f76-9d11-401752e2e2fc
Recorded
Previous row
#1054878
Body SHA-256
f77cb424ce72d163c55b07641cc3de3e199616a304ecedeb018802053a18b246
Leaf
0x41c2e141427c6dffa0cdb51b406088db06bd64854eb0dfae15b19228279f98ec

What was observed

{
  "count": 11,
  "tools": [
    {
      "description": "Buys Neumann credits by charging the payment card already saved on your account. Credits pay for simulations run with an account. Use this when an account is low on credits and the user has agreed to the purchase. If no card is saved yet, it buys nothing and charges nothing. Instead it returns payment_status checkout_required and a checkout_url: the user opens that link in a browser to save a card, then you call this tool again. It returns the credits bought, the new balance, the payment status and, when a card is needed, the checkout_url. Cost: charges your saved card for each credit, currently $0.50 per credit (check_account_and_credits shows the live price); needs an account.",
      "inputSchema": {
        "properties": {
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Your Neumann API key. Required unless your connection is signed in with billing permission (the neumann:billing scope). Get one by creating an account (POST https://neumann.kromatic.com/api/v1/accounts, which returns the key once); setup docs: https://kromatic.com/mcp/neumann.",
            "title": "Api Key"
          },
          "credits": {
            "description": "How many credits to buy. At least 1.",
            "examples": [
              100
            ],
            "minimum": 1,
            "title": "Credits",
            "type": "integer"
          }
        },
        "required": [
          "credits"
        ],
        "title": "BuyCreditsInput",
        "type": "object"
      },
      "name": "buy_credits"
    },
    {
      "description": "Shows who Neumann thinks you are and what you can still do: your credit balance if you have an account, or your free runs left today and when they reset if you do not. Use this when you need to know, before or after a run, whether a call will use credits or a free run, how much is left, or whether you are signed in. An api_key that is not recognized returns an unauthorized error. It returns whether you are anonymous or an account, your account id and status, credit balance, free runs left today with the reset time and the no-account size limits, the price of one credit in US dollars, and your last 10 credit transactions. To get an account and API key, call POST https://neumann.kromatic.com/api/v1/accounts; setup docs are at https://kromatic.com/mcp/neumann. Cost: free; uses no credits and no free runs.",
      "inputSchema": {
        "properties": {
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Your Neumann API key. Optional. Leave it out to ask about your current connection, signed in or not. Get one by creating an account (POST https://neumann.kromatic.com/api/v1/accounts, which returns the key once); setup docs: https://kromatic.com/mcp/neumann.",
            "title": "Api Key"
          }
        },
        "title": "CheckAccountAndCreditsInput",
        "type": "object"
      },
      "name": "check_account_and_credits"
    },
    {
      "description": "Checks a model for mistakes before you run it and lists every problem it finds. It looks for loops with no delay, nodes that are not connected, unknown distributions, missing or invalid distribution parameters, and broken formulas. A loop, including an edge from a node to itself, is allowed and is not an error when at least one edge in it has delay 1 or more. Use this when you have built or edited a model and want to fix it without spending a run. To see what a run will cost, use estimate_simulation_size_and_cost instead. It returns is_valid and a list of issues. Each issue gives the rule broken, a severity (error, warning or info, where info is only a note), a message, and the node and edge ids involved. If an edge points at a node that does not exist, you get an error message instead of the list. Cost: free; uses no credits and no free runs. Without an account, a model over 1,000 trials or 20 nodes is rejected, also at no cost.",
      "inputSchema": {
        "$defs": {
          "AggregationRequest": {
            "additionalProperties": false,
            "description": "A financial metric over one node's whole series (npv, irr, cumsum, prob and others). See run_monte_carlo_simulation for full details and recipes.",
            "properties": {
              "function": {
                "description": "npv, irr, mirr, payback, discounted_payback, cagr, cumsum, terminal_value or prob.",
                "type": "string"
              },
              "id": {
                "description": "Name for this metric in the result. Must be unique.",
                "type": "string"
              },
              "params": {
                "additionalProperties": true,
                "description": "The metric's settings, for example {\"rate\": 0.1} for npv. The rate is per period, so monthly periods need a monthly rate.",
                "type": "object"
              },
              "target_aggregation_id": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "For prob only: id of an earlier metric to test."
              },
              "target_node_id": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Node the metric reads."
              }
            },
            "required": [
              "id",
              "function"
            ],
            "type": "object"
          },
          "CalcNode": {
            "additionalProperties": false,
            "description": "A formula node. See run_monte_carlo_simulation for the formula language.",
            "properties": {
              "formula": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Expression over incoming edge ids, for example '{e1} * {e2}'. See run_monte_carlo_simulation for full syntax."
              },
              "id": {
                "description": "Unique id for this node within the model.",
                "type": "string"
              },
              "name": {
                "default": "",
                "description": "Readable label.",
                "type": "string"
              }
            },
            "required": [
              "id"
            ],
            "type": "object"
          },
          "Edge": {
            "additionalProperties": false,
            "description": "A link that carries a value from one node (source) to another (target).",
            "properties": {
              "delay": {
                "default": 0,
                "description": "How many periods later the value arrives. Default 0. A loop of edges, including an edge from a node to itself, is allowed only when at least one edge in it has delay 1 or more; that is how a running total carries last period's value forward.",
                "minimum": 0,
                "type": "integer"
              },
              "id": {
                "description": "Unique id for this edge. Formulas refer to it in braces, like {e1}.",
                "type": "string"
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Optional readable label."
              },
              "source": {
                "description": "Id of the node the value comes from.",
                "type": "string"
              },
              "target": {
                "description": "Id of the node the value goes to.",
                "type": "string"
              }
            },
            "required": [
              "id",
              "source",
              "target"
            ],
            "type": "object"
          },
          "OutputRequest": {
            "additionalProperties": false,
            "description": "Result filter and financial metrics. See run_monte_carlo_simulation for full details.",
            "properties": {
              "aggregations": {
                "description": "Financial metrics such as npv, irr, cumsum or prob.",
                "items": {
                  "$ref": "#/$defs/AggregationRequest"
                },
                "type": "array"
              },
              "edges": {
                "description": "Edge ids to include. Empty means all edges.",
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "nodes": {
                "description": "Node ids to include. Empty means all nodes.",
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "time_periods": {
                "description": "Period indices to include, counting from 0. Empty means all.",
                "items": {
                  "type": "integer"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "PublicGraph": {
            "additionalProperties": false,
            "description": "A complete model. See run_monte_carlo_simulation for full details.",
            "properties": {
              "calc_nodes": {
                "description": "The formula nodes that combine values.",
                "items": {
                  "$ref": "#/$defs/CalcNode"
                },
                "type": "array"
              },
              "contract_version": {
                "const": "1.0",
                "default": "1.0",
                "description": "Version of the model format. Always \"1.0\"; you can leave it out.",
                "type": "string"
              },
              "edges": {
                "description": "The links between nodes.",
                "items": {
                  "$ref": "#/$defs/Edge"
                },
                "type": "array"
              },
              "root_nodes": {
                "description": "The uncertain inputs.",
                "items": {
                  "$ref": "#/$defs/RootNode"
                },
                "type": "array"
              },
              "run_params": {
                "$ref": "#/$defs/RunParams"
              }
            },
            "required": [
              "run_params"
            ],
            "type": "object"
          },
          "RootNode": {
            "additionalProperties": false,
            "description": "An uncertain input that draws from a distribution each trial. See run_monte_carlo_simulation for full details.",
            "oneOf": [
              {
                "description": "A constant value that never changes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "value": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "value"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "constant"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Normal (Gaussian) distribution",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mean": {
                        "type": "number"
                      },
                      "std": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mean",
                      "std"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Uniform distribution between low and high values",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "high": {
                        "type": "number"
                      },
                      "low": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "low",
                      "high"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "uniform"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Beta distribution for modeling probabilities and proportions",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "alpha": {
                        "type": "number"
                      },
                      "beta": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "alpha",
                      "beta"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "beta"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Gamma distribution for modeling waiting times",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      },
                      "shape": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "shape",
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "gamma"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Exponential distribution with scale parameter",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "exponential"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Poisson distribution for modeling count data",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "lambda_val": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "lambda_val"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "poisson"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Bernoulli distribution for binary outcomes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "p": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "p"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "bernoulli"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Triangle distribution with minimum, maximum, and mode parameters",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "max_val": {
                        "type": "number"
                      },
                      "min_val": {
                        "type": "number"
                      },
                      "mode_val": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "min_val",
                      "max_val",
                      "mode_val"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "triangle"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Log-normal distribution for modeling skewed, positive-valued data",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mu": {
                        "type": "number"
                      },
                      "sigma": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mu",
                      "sigma"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "log_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete log-normal: sample log-normal then round to nearest integer (zero allowed)",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mu": {
                        "type": "number"
                      },
                      "sigma": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mu",
                      "sigma"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_lognormal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Categorical distribution for discrete outcomes with custom probabilities",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "probabilities": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      },
                      "values": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "values",
                      "probabilities"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "categorical"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete gamma: sample gamma then round to nearest integer (zero allowed)",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      },
                      "shape": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "shape",
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_gamma"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Binomial distribution: the number of successes in n independent attempts",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "n": {
                        "type": "integer"
                      },
                      "p": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "n",
                      "p"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "binomial"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Dirichlet distribution for modeling correlated probabilities that sum to 1",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "alpha": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "alpha"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "dirichlet"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "A fixed list of values that never changes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "values": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "values"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "constant_array"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete normal distribution for integer-valued data with normal characteristics",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mean": {
                        "type": "number"
                      },
                      "std": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mean",
                      "std"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Multivariate normal (correlated inputs): draws a vector of correlated values per trial from a mean vector + correlation matrix + per-component standard deviations. Array-valued — feed multiple downstream calc nodes by INDEXing component k (1-based): INDEX({edge}, k).",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "correlation": {
                        "items": {
                          "items": {
                            "type": "number"
                          },
                          "type": "array"
                        },
                        "type": "array"
                      },
                      "mean": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      },
                      "stds": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "mean",
                      "stds",
                      "correlation"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "multivariate_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              }
            ],
            "properties": {
              "delay": {
                "default": 0,
                "description": "How many periods to wait before the first draw. Default 0.",
                "minimum": 0,
                "type": "integer"
              },
              "distribution_params": {
                "additionalProperties": true,
                "description": "Parameters for distribution_type, as listed in this schema's oneOf.",
                "type": "object"
              },
              "distribution_type": {
                "description": "Distribution name; allowed types and their parameters are in this schema's oneOf. See run_monte_carlo_simulation for which to pick.",
                "type": "string"
              },
              "id": {
                "description": "Unique id for this node within the model.",
                "type": "string"
              },
              "interval": {
                "default": 1,
                "description": "Draw a new value every N periods; in the periods between, this input is 0 (the value is not carried forward). 1 (the default) means every period. 0 means draw once, in the first period after any delay, and 0 afterwards. To keep one value in every period, use sampling_frequency once instead.",
                "minimum": 0,
                "type": "integer"
              },
              "name": {
                "default": "",
                "description": "Readable label.",
                "type": "string"
              },
              "sampling_frequency": {
                "default": "per_period",
                "description": "per_period (the default) draws a new value each period. once draws one value per trial and reuses it in every period.",
                "enum": [
                  "per_period",
                  "once"
                ],
                "type": "string"
              }
            },
            "required": [
              "id",
              "distribution_type",
              "distribution_params"
            ],
            "type": "object"
          },
          "RunParams": {
            "additionalProperties": false,
            "description": "How to run the model.",
            "properties": {
              "output_request": {
                "$ref": "#/$defs/OutputRequest",
                "description": "Optional result filter and financial metrics. See run_monte_carlo_simulation."
              },
              "time_periods": {
                "description": "Number of time periods (a count).",
                "exclusiveMinimum": 0,
                "type": "integer"
              },
              "trials": {
                "description": "Number of trials (random samples).",
                "exclusiveMinimum": 0,
                "type": "integer"
              }
            },
            "required": [
              "trials",
              "time_periods"
            ],
            "type": "object"
          }
        },
        "properties": {
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Your Neumann API key. Optional: this tool is free either way. Pass it so the billing block in the result shows your account, and so the no-account limits of 1,000 trials and 20 nodes do not apply. Get one by creating an account (POST https://neumann.kromatic.com/api/v1/accounts, which returns the key once); setup docs: https://kromatic.com/mcp/neumann.",
            "title": "Api Key"
          },
          "graph": {
            "$ref": "#/$defs/PublicGraph",
            "description": "The model: root_nodes (uncertain inputs), calc_nodes (formulas), edges (links; formulas refer to them like {e1}) and run_params (trials and time periods). Same format as run_monte_carlo_simulation's graph, which documents formulas, periods, distributions and financial metrics in full.",
            "examples": [
              {
                "calc_nodes": [
                  {
                    "formula": "{e1} * {e2}",
                    "id": "revenue",
                    "name": "Monthly revenue"
                  }
                ],
                "edges": [
                  {
                    "id": "e1",
                    "source": "customers",
                    "target": "revenue"
                  },
                  {
                    "id": "e2",
                    "source": "price",
                    "target": "revenue"
                  }
                ],
                "root_nodes": [
                  {
                    "distribution_params": {
                      "mean": 1000,
                      "std": 200
                    },
                    "distribution_type": "normal",
                    "id": "customers",
                    "name": "Customers per month"
                  },
                  {
                    "distribution_params": {
                      "max_val": 15,
                      "min_val": 8,
                      "mode_val": 10
                    },
                    "distribution_type": "triangle",
                    "id": "price",
                    "name": "Price (USD)"
                  }
                ],
                "run_params": {
                  "time_periods": 12,
                  "trials": 1000
                }
              }
            ],
            "type": "object"
          }
        },
        "required": [
          "graph"
        ],
        "title": "CheckSimulationModelInput",
        "type": "object"
      },
      "name": "check_simulation_model"
    },
    {
      "description": "Turns a distribution's parameters into the low and high ends of the range that holds a chosen share of outcomes, by default the middle 90%. It also gives the mean, median, mode, standard deviation and any percentiles you ask for. If you give a threshold, it gives the chance of landing below and above it. Use this when you have distribution parameters, from a model or from fermi (a companion forecasting server from Kromatic, the company behind Neumann, whose estimates carry next_steps.simulate.root_node), and want to know what they mean in plain numbers. Its reverse is convert_range_to_distribution, and the range it returns can be passed straight back to it. Values that do not apply, such as a uniform distribution's mode, come back as null with a note explaining why. Cost: free; uses no credits and no free runs.",
      "inputSchema": {
        "properties": {
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Your Neumann API key. Optional: this tool is free either way. Pass it so the billing block in the result shows your account. Get one by creating an account (POST https://neumann.kromatic.com/api/v1/accounts, which returns the key once); setup docs: https://kromatic.com/mcp/neumann.",
            "title": "Api Key"
          },
          "distribution_params": {
            "additionalProperties": true,
            "description": "The distribution's parameters, in the same form a model input uses, for example {\"mean\": 100, \"std\": 15} for normal or {\"mu\": 9.2, \"sigma\": 0.6} for log_normal.",
            "examples": [
              {
                "mu": 9.2,
                "sigma": 0.6
              },
              {
                "mean": 100,
                "std": 15
              }
            ],
            "title": "Distribution Params",
            "type": "object"
          },
          "distribution_type": {
            "description": "The distribution's name. Accepts every type a model input accepts: normal, log_normal, uniform, triangle, beta (values are fractions from 0 to 1), gamma, exponential, poisson, bernoulli, binomial, categorical, constant, discrete_normal, discrete_lognormal and discrete_gamma. categorical returns no range. dirichlet, multivariate_normal and constant_array produce lists of values, so every number comes back null. This is wider than convert_range_to_distribution, which cannot fit poisson or categorical.",
            "examples": [
              "log_normal"
            ],
            "title": "Distribution Type",
            "type": "string"
          },
          "percentile_range": {
            "default": 0.9,
            "description": "A single fraction: the share of outcomes the returned range should hold, centred on the median. The default 0.9 means the middle 90%, so the range runs from the 5th to the 95th percentile.",
            "exclusiveMaximum": 1,
            "exclusiveMinimum": 0,
            "title": "Percentile Range",
            "type": "number"
          },
          "quantiles": {
            "anyOf": [
              {
                "items": {
                  "maximum": 1,
                  "minimum": 0,
                  "type": "number"
                },
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "A list of percentiles to report. Each is a fraction from 0 to 1: 0.05 is the 5th percentile, the value 5% of outcomes fall below. No repeats. Default [0.05, 0.1, 0.5, 0.9, 0.95], returned under keys p5, p10, p50, p90 and p95.",
            "examples": [
              [
                0.25,
                0.5,
                0.75
              ]
            ],
            "title": "Quantiles"
          },
          "threshold": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional value to compare against. The result gives the chance of being at or below it and the chance of being above it. For whole-number distributions it gives the chance of being below and above it, and notes the chance of landing exactly on it.",
            "examples": [
              15000
            ],
            "title": "Threshold"
          }
        },
        "required": [
          "distribution_type",
          "distribution_params"
        ],
        "title": "ConvertDistributionToRangeInput",
        "type": "object"
      },
      "name": "convert_distribution_to_range"
    },
    {
      "description": "Turns a low-to-high guess, such as \"between 80 and 120, 90% sure\", into the exact parameters a model input needs. A distribution is the shape of the uncertainty, for example normal (a bell curve), log_normal (skewed and never negative), triangle or uniform. The low and high values are the edges of the range you are that sure of, not hard limits. Use this when you have a rough estimate and need distribution parameters instead of guessing them. Its reverse is convert_distribution_to_range. It returns the distribution type and its parameters, ready to use as a model input's distribution_params. The distribution_type parameter explains which type fits which kind of quantity. Supported types: normal, log_normal, uniform, triangle, beta, gamma, exponential, binomial, discrete_normal, discrete_lognormal, discrete_gamma, constant and bernoulli. Not supported: poisson, categorical, dirichlet, multivariate_normal and constant_array. For beta, give low and high as fractions (2% is 0.02). Cost: free; uses no credits and no free runs.",
      "inputSchema": {
        "properties": {
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Your Neumann API key. Optional: this tool is free either way. Pass it so the billing block in the result shows your account. Get one by creating an account (POST https://neumann.kromatic.com/api/v1/accounts, which returns the key once); setup docs: https://kromatic.com/mcp/neumann.",
            "title": "Api Key"
          },
          "distribution_type": {
            "description": "The distribution to fit. Which to pick: a rate or proportion between 0 and 1 (conversion, churn) → beta, with low and high given as fractions (2% is 0.02). A positive amount that can run high (revenue, price, deal size) → log_normal. A quantity equally likely to land above or below its middle → normal. A value with hard limits you know → uniform (flat) or triangle (most likely value in between). A whole-number count (customers, units) → discrete_normal, discrete_lognormal or discrete_gamma, or binomial for successes out of a fixed number of attempts. Not supported here: poisson, categorical, dirichlet, multivariate_normal and constant_array.",
            "examples": [
              "normal",
              "log_normal"
            ],
            "title": "Distribution Type",
            "type": "string"
          },
          "max_estimate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "The high end of your range. Required for every type except constant and bernoulli.",
            "title": "Max Estimate"
          },
          "min_estimate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "The low end of your range. Required for every type except constant and bernoulli. Exponential ignores it, but a value must still be sent (any number works).",
            "title": "Min Estimate"
          },
          "mode_estimate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "The most likely value. Required for constant (the fixed value), bernoulli (the chance of success, from 0 to 1) and binomial. For triangle it sets the peak; it must lie strictly between low and high, and defaults to their midpoint. For beta it is used as the peak when a fit allows, but the low and high ends take priority. Ignored by other types.",
            "title": "Mode Estimate"
          },
          "percentile_range": {
            "default": 0.9,
            "description": "A single fraction: the share of outcomes that should fall between the low and high ends, which is how sure you are. The default 0.9 means the middle 90%: a 5% chance of being below the low end and 5% above the high end. Mapping hedged words: \"very sure\" or \"almost certainly\" is about 0.9; \"probably\" is about 0.8; if unsure, ask the user. \"Could be higher\" means pick a right-skewed type such as log_normal, not a wider range.",
            "exclusiveMaximum": 1,
            "exclusiveMinimum": 0,
            "title": "Percentile Range",
            "type": "number"
          }
        },
        "required": [
          "distribution_type"
        ],
        "title": "ConvertRangeToDistributionInput",
        "type": "object"
      },
      "name": "convert_range_to_distribution"
    },
    {
      "description": "Predicts how large a run of a model will be and how many credits it will cost, without running it. Use this before running a large or unfamiliar model, or to check that an account can afford it. It does not look for mistakes; use check_simulation_model for that. It returns the number of trials, time periods, nodes and edges, the estimated peak memory in MB, a complexity score, the size tier (small or large) and the credit cost for an account. A run is small when trials × nodes × time periods is at most 100,000, and large otherwise. Accounts have no fixed trial or node limit. That cost is what run_monte_carlo_simulation, summarize_outcome_scenarios and rank_inputs_by_impact each charge for this model. A model with mistakes returns an error instead of an estimate. Cost: free; uses no credits and no free runs. Without an account, a model over 1,000 trials or 20 nodes is rejected, also at no cost.",
      "inputSchema": {
        "$defs": {
          "AggregationRequest": {
            "additionalProperties": false,
            "description": "A financial metric over one node's whole series (npv, irr, cumsum, prob and others). See run_monte_carlo_simulation for full details and recipes.",
            "properties": {
              "function": {
                "description": "npv, irr, mirr, payback, discounted_payback, cagr, cumsum, terminal_value or prob.",
                "type": "string"
              },
              "id": {
                "description": "Name for this metric in the result. Must be unique.",
                "type": "string"
              },
              "params": {
                "additionalProperties": true,
                "description": "The metric's settings, for example {\"rate\": 0.1} for npv. The rate is per period, so monthly periods need a monthly rate.",
                "type": "object"
              },
              "target_aggregation_id": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "For prob only: id of an earlier metric to test."
              },
              "target_node_id": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Node the metric reads."
              }
            },
            "required": [
              "id",
              "function"
            ],
            "type": "object"
          },
          "CalcNode": {
            "additionalProperties": false,
            "description": "A formula node. See run_monte_carlo_simulation for the formula language.",
            "properties": {
              "formula": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Expression over incoming edge ids, for example '{e1} * {e2}'. See run_monte_carlo_simulation for full syntax."
              },
              "id": {
                "description": "Unique id for this node within the model.",
                "type": "string"
              },
              "name": {
                "default": "",
                "description": "Readable label.",
                "type": "string"
              }
            },
            "required": [
              "id"
            ],
            "type": "object"
          },
          "Edge": {
            "additionalProperties": false,
            "description": "A link that carries a value from one node (source) to another (target).",
            "properties": {
              "delay": {
                "default": 0,
                "description": "How many periods later the value arrives. Default 0. A loop of edges, including an edge from a node to itself, is allowed only when at least one edge in it has delay 1 or more; that is how a running total carries last period's value forward.",
                "minimum": 0,
                "type": "integer"
              },
              "id": {
                "description": "Unique id for this edge. Formulas refer to it in braces, like {e1}.",
                "type": "string"
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Optional readable label."
              },
              "source": {
                "description": "Id of the node the value comes from.",
                "type": "string"
              },
              "target": {
                "description": "Id of the node the value goes to.",
                "type": "string"
              }
            },
            "required": [
              "id",
              "source",
              "target"
            ],
            "type": "object"
          },
          "OutputRequest": {
            "additionalProperties": false,
            "description": "Result filter and financial metrics. See run_monte_carlo_simulation for full details.",
            "properties": {
              "aggregations": {
                "description": "Financial metrics such as npv, irr, cumsum or prob.",
                "items": {
                  "$ref": "#/$defs/AggregationRequest"
                },
                "type": "array"
              },
              "edges": {
                "description": "Edge ids to include. Empty means all edges.",
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "nodes": {
                "description": "Node ids to include. Empty means all nodes.",
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "time_periods": {
                "description": "Period indices to include, counting from 0. Empty means all.",
                "items": {
                  "type": "integer"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "PublicGraph": {
            "additionalProperties": false,
            "description": "A complete model. See run_monte_carlo_simulation for full details.",
            "properties": {
              "calc_nodes": {
                "description": "The formula nodes that combine values.",
                "items": {
                  "$ref": "#/$defs/CalcNode"
                },
                "type": "array"
              },
              "contract_version": {
                "const": "1.0",
                "default": "1.0",
                "description": "Version of the model format. Always \"1.0\"; you can leave it out.",
                "type": "string"
              },
              "edges": {
                "description": "The links between nodes.",
                "items": {
                  "$ref": "#/$defs/Edge"
                },
                "type": "array"
              },
              "root_nodes": {
                "description": "The uncertain inputs.",
                "items": {
                  "$ref": "#/$defs/RootNode"
                },
                "type": "array"
              },
              "run_params": {
                "$ref": "#/$defs/RunParams"
              }
            },
            "required": [
              "run_params"
            ],
            "type": "object"
          },
          "RootNode": {
            "additionalProperties": false,
            "description": "An uncertain input that draws from a distribution each trial. See run_monte_carlo_simulation for full details.",
            "oneOf": [
              {
                "description": "A constant value that never changes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "value": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "value"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "constant"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Normal (Gaussian) distribution",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mean": {
                        "type": "number"
                      },
                      "std": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mean",
                      "std"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Uniform distribution between low and high values",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "high": {
                        "type": "number"
                      },
                      "low": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "low",
                      "high"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "uniform"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Beta distribution for modeling probabilities and proportions",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "alpha": {
                        "type": "number"
                      },
                      "beta": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "alpha",
                      "beta"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "beta"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Gamma distribution for modeling waiting times",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      },
                      "shape": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "shape",
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "gamma"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Exponential distribution with scale parameter",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "exponential"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Poisson distribution for modeling count data",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "lambda_val": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "lambda_val"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "poisson"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Bernoulli distribution for binary outcomes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "p": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "p"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "bernoulli"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Triangle distribution with minimum, maximum, and mode parameters",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "max_val": {
                        "type": "number"
                      },
                      "min_val": {
                        "type": "number"
                      },
                      "mode_val": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "min_val",
                      "max_val",
                      "mode_val"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "triangle"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Log-normal distribution for modeling skewed, positive-valued data",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mu": {
                        "type": "number"
                      },
                      "sigma": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mu",
                      "sigma"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "log_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete log-normal: sample log-normal then round to nearest integer (zero allowed)",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mu": {
                        "type": "number"
                      },
                      "sigma": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mu",
                      "sigma"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_lognormal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Categorical distribution for discrete outcomes with custom probabilities",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "probabilities": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      },
                      "values": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "values",
                      "probabilities"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "categorical"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete gamma: sample gamma then round to nearest integer (zero allowed)",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      },
                      "shape": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "shape",
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_gamma"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Binomial distribution: the number of successes in n independent attempts",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "n": {
                        "type": "integer"
                      },
                      "p": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "n",
                      "p"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "binomial"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Dirichlet distribution for modeling correlated probabilities that sum to 1",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "alpha": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "alpha"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "dirichlet"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "A fixed list of values that never changes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "values": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "values"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "constant_array"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete normal distribution for integer-valued data with normal characteristics",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mean": {
                        "type": "number"
                      },
                      "std": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mean",
                      "std"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Multivariate normal (correlated inputs): draws a vector of correlated values per trial from a mean vector + correlation matrix + per-component standard deviations. Array-valued — feed multiple downstream calc nodes by INDEXing component k (1-based): INDEX({edge}, k).",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "correlation": {
                        "items": {
                          "items": {
                            "type": "number"
                          },
                          "type": "array"
                        },
                        "type": "array"
                      },
                      "mean": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      },
                      "stds": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "mean",
                      "stds",
                      "correlation"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "multivariate_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              }
            ],
            "properties": {
              "delay": {
                "default": 0,
                "description": "How many periods to wait before the first draw. Default 0.",
                "minimum": 0,
                "type": "integer"
              },
              "distribution_params": {
                "additionalProperties": true,
                "description": "Parameters for distribution_type, as listed in this schema's oneOf.",
                "type": "object"
              },
              "distribution_type": {
                "description": "Distribution name; allowed types and their parameters are in this schema's oneOf. See run_monte_carlo_simulation for which to pick.",
                "type": "string"
              },
              "id": {
                "description": "Unique id for this node within the model.",
                "type": "string"
              },
              "interval": {
                "default": 1,
                "description": "Draw a new value every N periods; in the periods between, this input is 0 (the value is not carried forward). 1 (the default) means every period. 0 means draw once, in the first period after any delay, and 0 afterwards. To keep one value in every period, use sampling_frequency once instead.",
                "minimum": 0,
                "type": "integer"
              },
              "name": {
                "default": "",
                "description": "Readable label.",
                "type": "string"
              },
              "sampling_frequency": {
                "default": "per_period",
                "description": "per_period (the default) draws a new value each period. once draws one value per trial and reuses it in every period.",
                "enum": [
                  "per_period",
                  "once"
                ],
                "type": "string"
              }
            },
            "required": [
              "id",
              "distribution_type",
              "distribution_params"
            ],
            "type": "object"
          },
          "RunParams": {
            "additionalProperties": false,
            "description": "How to run the model.",
            "properties": {
              "output_request": {
                "$ref": "#/$defs/OutputRequest",
                "description": "Optional result filter and financial metrics. See run_monte_carlo_simulation."
              },
              "time_periods": {
                "description": "Number of time periods (a count).",
                "exclusiveMinimum": 0,
                "type": "integer"
              },
              "trials": {
                "description": "Number of trials (random samples).",
                "exclusiveMinimum": 0,
                "type": "integer"
              }
            },
            "required": [
              "trials",
              "time_periods"
            ],
            "type": "object"
          }
        },
        "properties": {
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Your Neumann API key. Optional: this tool is free either way. Pass it so the billing block in the result shows your account, and so the no-account limits of 1,000 trials and 20 nodes do not apply. Get one by creating an account (POST https://neumann.kromatic.com/api/v1/accounts, which returns the key once); setup docs: https://kromatic.com/mcp/neumann.",
            "title": "Api Key"
          },
          "graph": {
            "$ref": "#/$defs/PublicGraph",
            "description": "The model: root_nodes (uncertain inputs), calc_nodes (formulas), edges (links; formulas refer to them like {e1}) and run_params (trials and time periods). Same format as run_monte_carlo_simulation's graph, which documents formulas, periods, distributions and financial metrics in full.",
            "examples": [
              {
                "calc_nodes": [
                  {
                    "formula": "{e1} * {e2}",
                    "id": "revenue",
                    "name": "Monthly revenue"
                  }
                ],
                "edges": [
                  {
                    "id": "e1",
                    "source": "customers",
                    "target": "revenue"
                  },
                  {
                    "id": "e2",
                    "source": "price",
                    "target": "revenue"
                  }
                ],
                "root_nodes": [
                  {
                    "distribution_params": {
                      "mean": 1000,
                      "std": 200
                    },
                    "distribution_type": "normal",
                    "id": "customers",
                    "name": "Customers per month"
                  },
                  {
                    "distribution_params": {
                      "max_val": 15,
                      "min_val": 8,
                      "mode_val": 10
                    },
                    "distribution_type": "triangle",
                    "id": "price",
                    "name": "Price (USD)"
                  }
                ],
                "run_params": {
                  "time_periods": 12,
                  "trials": 1000
                }
              }
            ],
            "type": "object"
          }
        },
        "required": [
          "graph"
        ],
        "title": "EstimateSimulationSizeAndCostInput",
        "type": "object"
      },
      "name": "estimate_simulation_size_and_cost"
    },
    {
      "description": "Gets the saved status and summary of a simulation you already ran, using its run_id. Use this when you need an earlier result again, for example in a later turn, without running the model again. You never need it to wait for a run: run_monte_carlo_simulation returns its full result when it finishes. Only run_monte_carlo_simulation gives out a run_id. It returns the run's status, size tier, trial counts and start time, and a summary of each node's statistics (mean, standard deviation, minimum, maximum, percentiles and histogram), or the error if the run failed. Only the caller who started the run can read it. Runs started without an account can be read for 24 hours, and only from the same connection, since a caller without an account is recognized by network address and client. Cost: free; uses no credits and no free runs.",
      "inputSchema": {
        "properties": {
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "The same API key used for the original run. Leave it out if your connection is signed in as that account, or if the run was made without an account. A different caller gets \"not found\".",
            "title": "Api Key"
          },
          "run_id": {
            "description": "The run_id returned by run_monte_carlo_simulation.",
            "title": "Run Id",
            "type": "string"
          }
        },
        "required": [
          "run_id"
        ],
        "title": "GetSimulationResultsInput",
        "type": "object"
      },
      "name": "get_simulation_results"
    },
    {
      "description": "Ranks a model's uncertain inputs by how much each one moves a chosen outcome, and returns the data for a tornado chart. A tornado chart is a bar chart with one horizontal bar per input, sorted with the biggest swing at the top. This is a one-at-a-time (OAT) sensitivity analysis. Every input is held at its median while one input at a time is set to low, middle and high values from its own distribution (by default its 5th, 50th and 95th percentiles). The tool records how the outcome's average changes. Use this when you need to know which assumption matters most, so you know what to research or de-risk first. It returns one entry per input, ranked so rank 1 has the biggest impact. Each entry lists the input values tried, the outcome at each, and an elasticity score. Elasticity means how strongly the outcome reacts: roughly, how many percent the outcome moves when the input moves 1 percent. It returns numbers, not an image, and no run_id, so get_simulation_results cannot fetch it later. Inputs whose distribution produces a list of values are skipped. Cost: without an account, 1 of your 3 free runs per UTC day for each call, even though the analysis runs the model many times (models up to 1,000 trials and 20 nodes); with an account, 1 credit for a small model or 5 for a large one, currently $0.50 per credit. A model that is invalid or over the no-account limits is rejected before running and costs nothing. If it fails mid-run: anonymous, the free run is used; account, already charged, because this tool charges when the analysis starts.",
      "inputSchema": {
        "$defs": {
          "AggregationRequest": {
            "additionalProperties": false,
            "description": "A financial metric over one node's whole series (npv, irr, cumsum, prob and others). See run_monte_carlo_simulation for full details and recipes.",
            "properties": {
              "function": {
                "description": "npv, irr, mirr, payback, discounted_payback, cagr, cumsum, terminal_value or prob.",
                "type": "string"
              },
              "id": {
                "description": "Name for this metric in the result. Must be unique.",
                "type": "string"
              },
              "params": {
                "additionalProperties": true,
                "description": "The metric's settings, for example {\"rate\": 0.1} for npv. The rate is per period, so monthly periods need a monthly rate.",
                "type": "object"
              },
              "target_aggregation_id": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "For prob only: id of an earlier metric to test."
              },
              "target_node_id": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Node the metric reads."
              }
            },
            "required": [
              "id",
              "function"
            ],
            "type": "object"
          },
          "CalcNode": {
            "additionalProperties": false,
            "description": "A formula node. See run_monte_carlo_simulation for the formula language.",
            "properties": {
              "formula": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Expression over incoming edge ids, for example '{e1} * {e2}'. See run_monte_carlo_simulation for full syntax."
              },
              "id": {
                "description": "Unique id for this node within the model.",
                "type": "string"
              },
              "name": {
                "default": "",
                "description": "Readable label.",
                "type": "string"
              }
            },
            "required": [
              "id"
            ],
            "type": "object"
          },
          "Edge": {
            "additionalProperties": false,
            "description": "A link that carries a value from one node (source) to another (target).",
            "properties": {
              "delay": {
                "default": 0,
                "description": "How many periods later the value arrives. Default 0. A loop of edges, including an edge from a node to itself, is allowed only when at least one edge in it has delay 1 or more; that is how a running total carries last period's value forward.",
                "minimum": 0,
                "type": "integer"
              },
              "id": {
                "description": "Unique id for this edge. Formulas refer to it in braces, like {e1}.",
                "type": "string"
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Optional readable label."
              },
              "source": {
                "description": "Id of the node the value comes from.",
                "type": "string"
              },
              "target": {
                "description": "Id of the node the value goes to.",
                "type": "string"
              }
            },
            "required": [
              "id",
              "source",
              "target"
            ],
            "type": "object"
          },
          "OutputRequest": {
            "additionalProperties": false,
            "description": "Result filter and financial metrics. See run_monte_carlo_simulation for full details.",
            "properties": {
              "aggregations": {
                "description": "Financial metrics such as npv, irr, cumsum or prob.",
                "items": {
                  "$ref": "#/$defs/AggregationRequest"
                },
                "type": "array"
              },
              "edges": {
                "description": "Edge ids to include. Empty means all edges.",
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "nodes": {
                "description": "Node ids to include. Empty means all nodes.",
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "time_periods": {
                "description": "Period indices to include, counting from 0. Empty means all.",
                "items": {
                  "type": "integer"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "PublicGraph": {
            "additionalProperties": false,
            "description": "A complete model. See run_monte_carlo_simulation for full details.",
            "properties": {
              "calc_nodes": {
                "description": "The formula nodes that combine values.",
                "items": {
                  "$ref": "#/$defs/CalcNode"
                },
                "type": "array"
              },
              "contract_version": {
                "const": "1.0",
                "default": "1.0",
                "description": "Version of the model format. Always \"1.0\"; you can leave it out.",
                "type": "string"
              },
              "edges": {
                "description": "The links between nodes.",
                "items": {
                  "$ref": "#/$defs/Edge"
                },
                "type": "array"
              },
              "root_nodes": {
                "description": "The uncertain inputs.",
                "items": {
                  "$ref": "#/$defs/RootNode"
                },
                "type": "array"
              },
              "run_params": {
                "$ref": "#/$defs/RunParams"
              }
            },
            "required": [
              "run_params"
            ],
            "type": "object"
          },
          "RootNode": {
            "additionalProperties": false,
            "description": "An uncertain input that draws from a distribution each trial. See run_monte_carlo_simulation for full details.",
            "oneOf": [
              {
                "description": "A constant value that never changes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "value": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "value"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "constant"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Normal (Gaussian) distribution",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mean": {
                        "type": "number"
                      },
                      "std": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mean",
                      "std"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Uniform distribution between low and high values",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "high": {
                        "type": "number"
                      },
                      "low": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "low",
                      "high"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "uniform"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Beta distribution for modeling probabilities and proportions",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "alpha": {
                        "type": "number"
                      },
                      "beta": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "alpha",
                      "beta"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "beta"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Gamma distribution for modeling waiting times",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      },
                      "shape": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "shape",
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "gamma"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Exponential distribution with scale parameter",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "exponential"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Poisson distribution for modeling count data",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "lambda_val": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "lambda_val"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "poisson"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Bernoulli distribution for binary outcomes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "p": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "p"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "bernoulli"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Triangle distribution with minimum, maximum, and mode parameters",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "max_val": {
                        "type": "number"
                      },
                      "min_val": {
                        "type": "number"
                      },
                      "mode_val": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "min_val",
                      "max_val",
                      "mode_val"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "triangle"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Log-normal distribution for modeling skewed, positive-valued data",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mu": {
                        "type": "number"
                      },
                      "sigma": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mu",
                      "sigma"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "log_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete log-normal: sample log-normal then round to nearest integer (zero allowed)",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mu": {
                        "type": "number"
                      },
                      "sigma": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mu",
                      "sigma"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_lognormal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Categorical distribution for discrete outcomes with custom probabilities",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "probabilities": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      },
                      "values": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "values",
                      "probabilities"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "categorical"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete gamma: sample gamma then round to nearest integer (zero allowed)",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      },
                      "shape": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "shape",
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_gamma"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Binomial distribution: the number of successes in n independent attempts",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "n": {
                        "type": "integer"
                      },
                      "p": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "n",
                      "p"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "binomial"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Dirichlet distribution for modeling correlated probabilities that sum to 1",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "alpha": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "alpha"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "dirichlet"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "A fixed list of values that never changes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "values": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "values"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "constant_array"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete normal distribution for integer-valued data with normal characteristics",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mean": {
                        "type": "number"
                      },
                      "std": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mean",
                      "std"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Multivariate normal (correlated inputs): draws a vector of correlated values per trial from a mean vector + correlation matrix + per-component standard deviations. Array-valued — feed multiple downstream calc nodes by INDEXing component k (1-based): INDEX({edge}, k).",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "correlation": {
                        "items": {
                          "items": {
                            "type": "number"
                          },
                          "type": "array"
                        },
                        "type": "array"
                      },
                      "mean": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      },
                      "stds": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "mean",
                      "stds",
                      "correlation"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "multivariate_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              }
            ],
            "properties": {
              "delay": {
                "default": 0,
                "description": "How many periods to wait before the first draw. Default 0.",
                "minimum": 0,
                "type": "integer"
              },
              "distribution_params": {
                "additionalProperties": true,
                "description": "Parameters for distribution_type, as listed in this schema's oneOf.",
                "type": "object"
              },
              "distribution_type": {
                "description": "Distribution name; allowed types and their parameters are in this schema's oneOf. See run_monte_carlo_simulation for which to pick.",
                "type": "string"
              },
              "id": {
                "description": "Unique id for this node within the model.",
                "type": "string"
              },
              "interval": {
                "default": 1,
                "description": "Draw a new value every N periods; in the periods between, this input is 0 (the value is not carried forward). 1 (the default) means every period. 0 means draw once, in the first period after any delay, and 0 afterwards. To keep one value in every period, use sampling_frequency once instead.",
                "minimum": 0,
                "type": "integer"
              },
              "name": {
                "default": "",
                "description": "Readable label.",
                "type": "string"
              },
              "sampling_frequency": {
                "default": "per_period",
                "description": "per_period (the default) draws a new value each period. once draws one value per trial and reuses it in every period.",
                "enum": [
                  "per_period",
                  "once"
                ],
                "type": "string"
              }
            },
            "required": [
              "id",
              "distribution_type",
              "distribution_params"
            ],
            "type": "object"
          },
          "RunParams": {
            "additionalProperties": false,
            "description": "How to run the model.",
            "properties": {
              "output_request": {
                "$ref": "#/$defs/OutputRequest",
                "description": "Optional result filter and financial metrics. See run_monte_carlo_simulation."
              },
              "time_periods": {
                "description": "Number of time periods (a count).",
                "exclusiveMinimum": 0,
                "type": "integer"
              },
              "trials": {
                "description": "Number of trials (random samples).",
                "exclusiveMinimum": 0,
                "type": "integer"
              }
            },
            "required": [
              "trials",
              "time_periods"
            ],
            "type": "object"
          }
        },
        "properties": {
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Your Neumann API key. Get one by creating an account (POST https://neumann.kromatic.com/api/v1/accounts, which returns the key once); setup docs: https://kromatic.com/mcp/neumann. Leave it out if your connection is already signed in, or to use the free no-account tier.",
            "title": "Api Key"
          },
          "graph": {
            "$ref": "#/$defs/PublicGraph",
            "description": "The model: root_nodes (uncertain inputs), calc_nodes (formulas), edges (links; formulas refer to them like {e1}) and run_params (trials and time periods). Same format as run_monte_carlo_simulation's graph, which documents formulas, periods, distributions and financial metrics in full.",
            "examples": [
              {
                "calc_nodes": [
                  {
                    "formula": "{e1} * {e2}",
                    "id": "revenue",
                    "name": "Monthly revenue"
                  }
                ],
                "edges": [
                  {
                    "id": "e1",
                    "source": "customers",
                    "target": "revenue"
                  },
                  {
                    "id": "e2",
                    "source": "price",
                    "target": "revenue"
                  }
                ],
                "root_nodes": [
                  {
                    "distribution_params": {
                      "mean": 1000,
                      "std": 200
                    },
                    "distribution_type": "normal",
                    "id": "customers",
                    "name": "Customers per month"
                  },
                  {
                    "distribution_params": {
                      "max_val": 15,
                      "min_val": 8,
                      "mode_val": 10
                    },
                    "distribution_type": "triangle",
                    "id": "price",
                    "name": "Price (USD)"
                  }
                ],
                "run_params": {
                  "time_periods": 12,
                  "trials": 1000
                }
              }
            ],
            "type": "object"
          },
          "num_quantiles": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Instead of quantiles: how many points to try, an even whole number from 2 to 10. That many percentiles are spread evenly between the 5th and 95th, and the median (0.5) is added. 2 gives [0.05, 0.5, 0.95]; 4 gives [0.05, 0.275, 0.5, 0.725, 0.95].",
            "title": "Num Quantiles"
          },
          "quantiles": {
            "anyOf": [
              {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "A list of points in each input's own distribution to try. Each point is a fraction from 0 to 1 naming a percentile: 0.05 is the 5th percentile, the value 5% of outcomes fall below. Default [0.05, 0.5, 0.95]. Give this or num_quantiles, not both.",
            "examples": [
              [
                0.1,
                0.5,
                0.9
              ]
            ],
            "title": "Quantiles"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional whole number that fixes the random draws, so repeating the call gives the same result. Exact repeats are guaranteed only for small runs, where trials × nodes × time periods is at most 100,000.",
            "title": "Seed"
          },
          "target_node_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "The id of the outcome node to measure. Defaults to the last calc node in the model, which is usually the final outcome.",
            "examples": [
              "revenue"
            ],
            "title": "Target Node Id"
          },
          "time_period": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Index of the time period to measure, counting from 0: with 12 monthly periods, 11 is month 12. Defaults to the last period. This measures the node's value in that one period, not a total. For a cumulative figure such as year-one profit, add a running-total calc node with formula {e1} + {e2}, where e1 brings in the per-period value and e2 is an edge from the running-total node to itself with delay 1. Then target that node at index 11. This delayed self-edge is allowed; only loops with no delay are errors. In run_monte_carlo_simulation, use a cumsum metric instead.",
            "title": "Time Period"
          }
        },
        "required": [
          "graph"
        ],
        "title": "RankInputsByImpactInput",
        "type": "object"
      },
      "name": "rank_inputs_by_impact"
    },
    {
      "description": "Runs a Monte Carlo simulation of a model and returns the full range of possible outcomes, not one guessed number. A model is a set of uncertain inputs, the formulas that combine them, and the links between them. The simulation draws random values for every input many times; each draw is a trial, and one call is one run. Use this when you need to know how likely different outcomes are for a plan built on uncertain inputs: a project's total cost or budget (for example from low / most likely / high estimates per line item), a schedule or delivery date, capacity, revenue, or an investment's NPV, IRR or payback. It returns, for every node and time period, the mean, standard deviation, minimum, maximum, 10th to 90th percentiles (the value a given share of trials fall below) and a histogram. It also returns any metrics you asked for, such as NPV, IRR, payback or the chance of beating a target or budget, and a run_id. The run finishes within this call, so there is nothing to poll. Cost: without an account, 1 of your 3 free runs per UTC day (models up to 1,000 trials and 20 nodes); with an account, 1 credit for a small run or 5 for a large one, currently $0.50 per credit. A model that is invalid or over the no-account limits is rejected before running and costs nothing. If it fails mid-run: anonymous, the free run is used; account, not charged.",
      "inputSchema": {
        "$defs": {
          "AggregationRequest": {
            "additionalProperties": false,
            "description": "A financial metric computed over one node's whole time series in every trial, then summarized as a distribution. Available: npv (net present value), irr (internal rate of return), mirr (modified IRR), payback and discounted_payback (periods until cumulative cash turns positive), cagr (compound annual growth rate), cumsum (running total), terminal_value, and prob (the chance a value passes a threshold). Discounting counts periods from 0: the first period is not discounted. Model an up-front investment as a negative value in period 0. Do not also discount inside the node's formula with PV() or DISCOUNT(), which count from 1, or the first period is discounted twice. cumsum gives one number per trial: the total of the node's values over every simulated period. output_request.time_periods does not shorten it. prob can target any earlier metric, including npv and cumsum. Its mean in the result is the probability, the share of trials that pass. A prob that targets a node directly only tests the node's final-period value. Recipe for the chance that a cumulative total over the first N periods beats X: add {id: total, function: cumsum, target_node_id: <node>}, then {id: p, function: prob, target_aggregation_id: total, params: {op: '>', value: X}}, and read aggregations.p.basic_stats.mean. This works directly when the model has exactly N periods. If it has more, point cumsum at a calc node with formula IF({time_period} <= N, {e1}, 0). {time_period} counts from 1. Use cumsum and prob for totals and probabilities here. A running-total node is needed only for rank_inputs_by_impact and summarize_outcome_scenarios, which measure one node in one period.",
            "properties": {
              "function": {
                "description": "One of npv, irr, mirr, payback, discounted_payback, cagr, cumsum, terminal_value, prob. npv needs rate, a decimal per period (0.01 is 1%), so a model with monthly periods needs a monthly rate (10% a year is about 0.008 a month); or rates, a list of per-period decimals with at least one entry per period; the first entry is ignored because period 0 is not discounted. discounted_payback needs rate. terminal_value needs g (growth) and rate. mirr needs finance_rate and reinvest_rate. prob needs op (>, >=, <, <=, ==) and value.",
                "title": "Function",
                "type": "string"
              },
              "id": {
                "description": "Name for this metric in the result. Must be unique.",
                "title": "Id",
                "type": "string"
              },
              "params": {
                "additionalProperties": true,
                "description": "The metric's settings, for example {\"rate\": 0.1} for npv, {\"op\": \">\", \"value\": 0} for prob, {\"g\": 0.02, \"rate\": 0.1} for terminal_value.",
                "title": "Params",
                "type": "object"
              },
              "target_aggregation_id": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Only for prob: the id of a metric listed earlier in this request (for example an npv or cumsum) whose per-trial values are tested against the threshold.",
                "title": "Target Aggregation Id"
              },
              "target_node_id": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "The node whose time series the metric uses. Needed for every metric except a prob that uses target_aggregation_id. A prob sets exactly one of the two.",
                "title": "Target Node Id"
              }
            },
            "required": [
              "id",
              "function"
            ],
            "title": "AggregationRequest",
            "type": "object"
          },
          "CalcNode": {
            "additionalProperties": false,
            "description": "A formula node. Its formula combines the values on its incoming edges. There is no automatic sum: write {e1}+{e2} to add two edges, or {e1} to pass one through. A node with no formula is always 0, and check_simulation_model reports that as a warning.",
            "properties": {
              "formula": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Expression over incoming edge ids in braces, for example '{e1} * 0.5 + {e2}'. Leave it out only if the node should always be 0. Operators: + - * / ^ (power) and parentheses; dividing by zero gives 0. Comparisons == != < <= > >= work inside IF. Functions (any case): MIN, MAX, ROUND, ABS, POW, SQRT, LOG, LN, EXP, FLOOR, CEIL, SUM, PRODUCT, AVERAGE, MEAN, IF(condition, then, else), AND, OR, NOT, PV(rate, value, period), DISCOUNT(rate, period), BINOMIAL, INDEX(edge, k) for the k-th item (from 1) of a list value, LENGTH. Special values: {time_period} is the current period counted from 1 (unlike the 0-based time_period arguments), {is_first} and {is_last} are 1 on the first or last period and 0 otherwise.",
                "title": "Formula"
              },
              "id": {
                "description": "Unique id for this node within the model.",
                "title": "Id",
                "type": "string"
              },
              "name": {
                "default": "",
                "description": "Readable label.",
                "title": "Name",
                "type": "string"
              }
            },
            "required": [
              "id"
            ],
            "title": "CalcNode",
            "type": "object"
          },
          "Edge": {
            "additionalProperties": false,
            "description": "A link that carries a value from one node (source) to another (target).",
            "properties": {
              "delay": {
                "default": 0,
                "description": "How many periods later the value arrives. Default 0. A loop of edges, including an edge from a node to itself, is allowed only when at least one edge in it has delay 1 or more; that is how a running total carries last period's value forward.",
                "minimum": 0,
                "title": "Delay",
                "type": "integer"
              },
              "id": {
                "description": "Unique id for this edge. Formulas refer to it in braces, like {e1}.",
                "title": "Id",
                "type": "string"
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Optional readable label.",
                "title": "Name"
              },
              "source": {
                "description": "Id of the node the value comes from.",
                "title": "Source",
                "type": "string"
              },
              "target": {
                "description": "Id of the node the value goes to.",
                "title": "Target",
                "type": "string"
              }
            },
            "required": [
              "id",
              "source",
              "target"
            ],
            "title": "Edge",
            "type": "object"
          },
          "OutputRequest": {
            "additionalProperties": false,
            "description": "Which nodes, edges and periods to include in the result, plus optional financial metrics. An empty list means all.",
            "properties": {
              "aggregations": {
                "description": "Financial metrics to compute over a node's whole time series, such as NPV or IRR.",
                "items": {
                  "$ref": "#/$defs/AggregationRequest"
                },
                "title": "Aggregations",
                "type": "array"
              },
              "edges": {
                "description": "Edge ids to include. Empty means all edges.",
                "items": {
                  "type": "string"
                },
                "title": "Edges",
                "type": "array"
              },
              "nodes": {
                "description": "Node ids to include. Empty means all nodes.",
                "items": {
                  "type": "string"
                },
                "title": "Nodes",
                "type": "array"
              },
              "time_periods": {
                "description": "Indices of the periods to include, counting from 0 (with 12 monthly periods, 11 is month 12). Empty means all periods.",
                "items": {
                  "type": "integer"
                },
                "title": "Time Periods",
                "type": "array"
              }
            },
            "title": "OutputRequest",
            "type": "object"
          },
          "PublicGraph": {
            "additionalProperties": false,
            "description": "A complete model: its inputs, formulas, links and run settings.",
            "properties": {
              "calc_nodes": {
                "description": "The formula nodes that combine values.",
                "items": {
                  "$ref": "#/$defs/CalcNode"
                },
                "title": "Calc Nodes",
                "type": "array"
              },
              "contract_version": {
                "const": "1.0",
                "default": "1.0",
                "description": "Version of the model format. Always \"1.0\"; you can leave it out.",
                "title": "Contract Version",
                "type": "string"
              },
              "edges": {
                "description": "The links between nodes.",
                "items": {
                  "$ref": "#/$defs/Edge"
                },
                "title": "Edges",
                "type": "array"
              },
              "root_nodes": {
                "description": "The uncertain inputs.",
                "items": {
                  "$ref": "#/$defs/RootNode"
                },
                "title": "Root Nodes",
                "type": "array"
              },
              "run_params": {
                "$ref": "#/$defs/RunParams"
              }
            },
            "required": [
              "run_params"
            ],
            "title": "PublicGraph",
            "type": "object"
          },
          "RootNode": {
            "additionalProperties": false,
            "description": "An uncertain input. In every trial it draws a value from the probability distribution named in distribution_type, using distribution_params.",
            "oneOf": [
              {
                "description": "A constant value that never changes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "value": {
                        "description": "The constant value to return",
                        "type": "number"
                      }
                    },
                    "required": [
                      "value"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "constant"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "constant"
              },
              {
                "description": "Normal (Gaussian) distribution",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mean": {
                        "description": "The mean (average) of the distribution",
                        "type": "number"
                      },
                      "std": {
                        "description": "The standard deviation (spread) of the distribution (positive)",
                        "type": "number"
                      }
                    },
                    "required": [
                      "mean",
                      "std"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "normal"
              },
              {
                "description": "Uniform distribution between low and high values",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "high": {
                        "description": "Upper bound of the distribution",
                        "type": "number"
                      },
                      "low": {
                        "description": "Lower bound of the distribution",
                        "type": "number"
                      }
                    },
                    "required": [
                      "low",
                      "high"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "uniform"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "uniform"
              },
              {
                "description": "Beta distribution for modeling probabilities and proportions",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "alpha": {
                        "description": "The alpha shape parameter (α) (positive)",
                        "type": "number"
                      },
                      "beta": {
                        "description": "The beta shape parameter (β) (positive)",
                        "type": "number"
                      }
                    },
                    "required": [
                      "alpha",
                      "beta"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "beta"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "beta"
              },
              {
                "description": "Gamma distribution for modeling waiting times",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "description": "The scale parameter (θ) (positive)",
                        "type": "number"
                      },
                      "shape": {
                        "description": "The shape parameter (k) (positive)",
                        "type": "number"
                      }
                    },
                    "required": [
                      "shape",
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "gamma"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "gamma"
              },
              {
                "description": "Exponential distribution with scale parameter",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "description": "Scale parameter (mean) of the distribution (positive)",
                        "type": "number"
                      }
                    },
                    "required": [
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "exponential"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "exponential"
              },
              {
                "description": "Poisson distribution for modeling count data",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "lambda_val": {
                        "description": "The rate parameter (λ) (positive)",
                        "type": "number"
                      }
                    },
                    "required": [
                      "lambda_val"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "poisson"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "poisson"
              },
              {
                "description": "Bernoulli distribution for binary outcomes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "p": {
                        "description": "The probability of success (between 0 and 1)",
                        "type": "number"
                      }
                    },
                    "required": [
                      "p"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "bernoulli"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "bernoulli"
              },
              {
                "description": "Triangle distribution with minimum, maximum, and mode parameters",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "max_val": {
                        "description": "The maximum value of the distribution",
                        "type": "number"
                      },
                      "min_val": {
                        "description": "The minimum value of the distribution",
                        "type": "number"
                      },
                      "mode_val": {
                        "description": "The mode (peak) of the distribution",
                        "type": "number"
                      }
                    },
                    "required": [
                      "min_val",
                      "max_val",
                      "mode_val"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "triangle"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "triangle"
              },
              {
                "description": "Log-normal distribution for modeling skewed, positive-valued data",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mu": {
                        "description": "Mean of the underlying normal distribution (log-scale)",
                        "type": "number"
                      },
                      "sigma": {
                        "description": "Standard deviation of the underlying normal distribution (log-scale) (positive)",
                        "type": "number"
                      }
                    },
                    "required": [
                      "mu",
                      "sigma"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "log_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "log_normal"
              },
              {
                "description": "Discrete log-normal: sample log-normal then round to nearest integer (zero allowed)",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mu": {
                        "description": "Mean of the underlying normal distribution (log-scale)",
                        "type": "number"
                      },
                      "sigma": {
                        "description": "Standard deviation of the underlying normal distribution (log-scale) (positive)",
                        "type": "number"
                      }
                    },
                    "required": [
                      "mu",
                      "sigma"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_lognormal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "discrete_lognormal"
              },
              {
                "description": "Categorical distribution for discrete outcomes with custom probabilities",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "probabilities": {
                        "description": "List of probabilities for each value (must sum to 1) (sum to 1)",
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      },
                      "values": {
                        "description": "List of possible values to sample from",
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "values",
                      "probabilities"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "categorical"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "categorical"
              },
              {
                "description": "Discrete gamma: sample gamma then round to nearest integer (zero allowed)",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "description": "The scale parameter (θ) (positive)",
                        "type": "number"
                      },
                      "shape": {
                        "description": "The shape parameter (k) (positive)",
                        "type": "number"
                      }
                    },
                    "required": [
                      "shape",
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_gamma"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "discrete_gamma"
              },
              {
                "description": "Binomial distribution: the number of successes in n independent attempts",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "n": {
                        "description": "Number of attempts (positive whole number)",
                        "type": "integer"
                      },
                      "p": {
                        "description": "Chance of success on each attempt (between 0 and 1)",
                        "type": "number"
                      }
                    },
                    "required": [
                      "n",
                      "p"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "binomial"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "binomial"
              },
              {
                "description": "Dirichlet distribution for modeling correlated probabilities that sum to 1",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "alpha": {
                        "description": "Concentration parameters for each category (all positive)",
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "alpha"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "dirichlet"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "dirichlet"
              },
              {
                "description": "A fixed list of values that never changes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "values": {
                        "description": "Array of constant values to return",
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "values"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "constant_array"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "constant_array"
              },
              {
                "description": "Discrete normal distribution for integer-valued data with normal characteristics",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mean": {
                        "description": "The mean (average) of the distribution",
                        "type": "number"
                      },
                      "std": {
                        "description": "The standard deviation (spread) of the distribution (positive)",
                        "type": "number"
                      }
                    },
                    "required": [
                      "mean",
                      "std"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "discrete_normal"
              },
              {
                "description": "Multivariate normal (correlated inputs): draws a vector of correlated values per trial from a mean vector + correlation matrix + per-component standard deviations. Array-valued — feed multiple downstream calc nodes by INDEXing component k (1-based): INDEX({edge}, k).",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "correlation": {
                        "description": "Square correlation matrix (NxN for N components); diagonal 1.0, symmetric, entries in [-1, 1]",
                        "items": {
                          "items": {
                            "type": "number"
                          },
                          "type": "array"
                        },
                        "type": "array"
                      },
                      "mean": {
                        "description": "Mean vector (one entry per correlated component)",
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      },
                      "stds": {
                        "description": "Per-component standard deviations (same length as mean) (all positive)",
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "mean",
                      "stds",
                      "correlation"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "multivariate_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ],
                "title": "multivariate_normal"
              }
            ],
            "properties": {
              "delay": {
                "default": 0,
                "description": "How many periods to wait before the first draw. Default 0.",
                "minimum": 0,
                "title": "Delay",
                "type": "integer"
              },
              "distribution_params": {
                "additionalProperties": true,
                "description": "The distribution's parameters. Which keys are needed depends on distribution_type: normal{mean,std}, log_normal{mu,sigma}, uniform{low,high}, triangle{min_val,max_val,mode_val}, beta{alpha,beta}, poisson{lambda_val}, bernoulli{p}. Other types are listed in this schema's oneOf.",
                "title": "Distribution Params",
                "type": "object"
              },
              "distribution_type": {
                "description": "The distribution's name. Which to pick: beta for a rate or proportion (its values lie between 0 and 1, so 2% is 0.02); log_normal for a positive amount that can run high; normal for a symmetric quantity; uniform or triangle when you know hard limits; gamma or exponential for waiting times; poisson, binomial, discrete_normal, discrete_lognormal or discrete_gamma for whole-number counts; bernoulli for yes or no (1 or 0); categorical for a fixed list of possible values; constant for a known value. dirichlet, multivariate_normal and constant_array produce a list of values per trial; read one item with INDEX({edge}, k). Each type's parameters are in this schema's oneOf.",
                "title": "Distribution Type",
                "type": "string"
              },
              "id": {
                "description": "Unique id for this node within the model.",
                "title": "Id",
                "type": "string"
              },
              "interval": {
                "default": 1,
                "description": "Draw a new value every N periods; in the periods between, this input is 0 (the value is not carried forward). 1 (the default) means every period. 0 means draw once, in the first period after any delay, and 0 afterwards. To keep one value in every period, use sampling_frequency once instead.",
                "minimum": 0,
                "title": "Interval",
                "type": "integer"
              },
              "name": {
                "default": "",
                "description": "Readable label.",
                "title": "Name",
                "type": "string"
              },
              "sampling_frequency": {
                "default": "per_period",
                "description": "per_period (the default) draws a new value each period. once draws one value per trial and reuses it in every period.",
                "enum": [
                  "per_period",
                  "once"
                ],
                "title": "Sampling Frequency",
                "type": "string"
              }
            },
            "required": [
              "id",
              "distribution_type",
              "distribution_params"
            ],
            "title": "RootNode",
            "type": "object"
          },
          "RunParams": {
            "additionalProperties": false,
            "description": "How to run the model.",
            "properties": {
              "output_request": {
                "$ref": "#/$defs/OutputRequest",
                "description": "Optional. Limits what the result includes and adds financial metrics such as NPV."
              },
              "time_periods": {
                "description": "How many time periods to simulate in each trial (a count, not an index). A period is whatever unit you choose: month, quarter or year.",
                "exclusiveMinimum": 0,
                "title": "Time Periods",
                "type": "integer"
              },
              "trials": {
                "description": "How many trials to run. A trial is one random sample of every input and the outcomes that follow from it. More trials give smoother results.",
                "exclusiveMinimum": 0,
                "title": "Trials",
                "type": "integer"
              }
            },
            "required": [
              "trials",
              "time_periods"
            ],
            "title": "RunParams",
            "type": "object"
          }
        },
        "properties": {
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Your Neumann API key. Get one by creating an account (POST https://neumann.kromatic.com/api/v1/accounts, which returns the key once); setup docs: https://kromatic.com/mcp/neumann. Leave it out if your connection is already signed in, or to use the free no-account tier.",
            "title": "Api Key"
          },
          "graph": {
            "$ref": "#/$defs/PublicGraph",
            "description": "The model. A model has four parts. root_nodes are the uncertain inputs; each one draws a value from a probability distribution in every trial. calc_nodes are formulas that combine values. edges are links that carry a value from one node to another; a formula refers to its incoming edges by id, like {e1} * {e2}. run_params sets how many trials (random samples) and time periods to simulate. A time period is whatever unit the model's author chooses, such as a month, quarter or year. run_params.time_periods is a count, while time_period arguments and output_request.time_periods are indices counted from 0: with 12 monthly periods, index 11 is month 12. Formula syntax is described on calc_nodes[].formula. Common distributions and their parameters: normal{mean,std}, log_normal{mu,sigma}, uniform{low,high}, triangle{min_val,max_val,mode_val}, beta{alpha,beta}, poisson{lambda_val}, bernoulli{p}.",
            "examples": [
              {
                "calc_nodes": [
                  {
                    "formula": "{e1}",
                    "id": "out"
                  }
                ],
                "edges": [
                  {
                    "id": "e1",
                    "source": "sales",
                    "target": "out"
                  }
                ],
                "root_nodes": [
                  {
                    "distribution_params": {
                      "mean": 100,
                      "std": 15
                    },
                    "distribution_type": "normal",
                    "id": "sales"
                  }
                ],
                "run_params": {
                  "time_periods": 1,
                  "trials": 1000
                }
              },
              {
                "calc_nodes": [
                  {
                    "formula": "{e1} * {e2}",
                    "id": "revenue",
                    "name": "Monthly revenue"
                  }
                ],
                "edges": [
                  {
                    "id": "e1",
                    "source": "customers",
                    "target": "revenue"
                  },
                  {
                    "id": "e2",
                    "source": "price",
                    "target": "revenue"
                  }
                ],
                "root_nodes": [
                  {
                    "distribution_params": {
                      "mean": 1000,
                      "std": 200
                    },
                    "distribution_type": "normal",
                    "id": "customers",
                    "name": "Customers per month"
                  },
                  {
                    "distribution_params": {
                      "max_val": 15,
                      "min_val": 8,
                      "mode_val": 10
                    },
                    "distribution_type": "triangle",
                    "id": "price",
                    "name": "Price (USD)"
                  }
                ],
                "run_params": {
                  "time_periods": 12,
                  "trials": 1000
                }
              },
              {
                "calc_nodes": [
                  {
                    "formula": "{e1} * {e2}",
                    "id": "revenue",
                    "name": "Monthly revenue"
                  }
                ],
                "edges": [
                  {
                    "id": "e1",
                    "source": "customers",
                    "target": "revenue"
                  },
                  {
                    "id": "e2",
                    "source": "price",
                    "target": "revenue"
                  }
                ],
                "root_nodes": [
                  {
                    "distribution_params": {
                      "mean": 1000,
                      "std": 200
                    },
                    "distribution_type": "normal",
                    "id": "customers",
                    "name": "Customers per month"
                  },
                  {
                    "distribution_params": {
                      "max_val": 15,
                      "min_val": 8,
                      "mode_val": 10
                    },
                    "distribution_type": "triangle",
                    "id": "price",
                    "name": "Price (USD)"
                  }
                ],
                "run_params": {
                  "output_request": {
                    "aggregations": [
                      {
                        "function": "cumsum",
                        "id": "year_one_revenue",
                        "target_node_id": "revenue"
                      },
                      {
                        "function": "prob",
                        "id": "p_year_one_over_150k",
                        "params": {
                          "op": ">",
                          "value": 150000
                        },
                        "target_aggregation_id": "year_one_revenue"
                      }
                    ]
                  },
                  "time_periods": 12,
                  "trials": 1000
                }
              },
              {
                "calc_nodes": [
                  {
                    "formula": "{e1} * {e2}",
                    "id": "revenue",
                    "name": "Monthly revenue"
                  }
                ],
                "edges": [
                  {
                    "id": "e1",
                    "source": "customers",
                    "target": "revenue"
                  },
                  {
                    "id": "e2",
                    "source": "price",
                    "target": "revenue"
                  }
                ],
                "root_nodes": [
                  {
                    "distribution_params": {
                      "mean": 1000,
                      "std": 200
                    },
                    "distribution_type": "normal",
                    "id": "customers",
                    "name": "Customers per month"
                  },
                  {
                    "distribution_params": {
                      "max_val": 15,
                      "min_val": 8,
                      "mode_val": 10
                    },
                    "distribution_type": "triangle",
                    "id": "price",
                    "name": "Price (USD)"
                  }
                ],
                "run_params": {
                  "output_request": {
                    "aggregations": [
                      {
                        "function": "npv",
                        "id": "npv",
                        "params": {
                          "rate": 0.01
                        },
                        "target_node_id": "revenue"
                      },
                      {
                        "function": "prob",
                        "id": "p_npv_over_100k",
                        "params": {
                          "op": ">",
                          "value": 100000
                        },
                        "target_aggregation_id": "npv"
                      }
                    ]
                  },
                  "time_periods": 12,
                  "trials": 1000
                }
              }
            ],
            "type": "object"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional whole number that fixes the random draws, so repeating the call gives the same result. Exact repeats are guaranteed only for small runs, where trials × nodes × time periods is at most 100,000.",
            "title": "Seed"
          }
        },
        "required": [
          "graph"
        ],
        "title": "RunMonteCarloSimulationInput",
        "type": "object"
      },
      "name": "run_monte_carlo_simulation"
    },
    {
      "description": "Emails your feedback, feature request or bug report to the Neumann team, with a copy to the email address you give. Use this when something in Neumann is wrong, missing or confusing and a person should see it. Check with the user first, because it sends a real email and shares their address. It returns status \"sent\" and a confirmation message. No account is needed. If you pass an api_key, your account id is included in the email. Cost: free; uses no credits and no free runs.",
      "inputSchema": {
        "properties": {
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Your Neumann API key. Optional. If given, your account id is added to the email.",
            "title": "Api Key"
          },
          "feedback_type": {
            "description": "feedback for general comments, feature_request for something new, or bug for something broken.",
            "enum": [
              "feedback",
              "feature_request",
              "bug"
            ],
            "title": "Feedback Type",
            "type": "string"
          },
          "message": {
            "description": "What to tell the team, 10 to 5,000 characters. Be specific: what you tried, what happened and what you expected.",
            "examples": [
              "rank_inputs_by_impact returned an empty list for a model with two inputs."
            ],
            "maxLength": 5000,
            "minLength": 10,
            "title": "Message",
            "type": "string"
          },
          "sender_email": {
            "description": "Email address to send a copy to, so there is a record.",
            "format": "email",
            "title": "Sender Email",
            "type": "string"
          },
          "sender_name": {
            "anyOf": [
              {
                "maxLength": 200,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional name, up to 200 characters.",
            "title": "Sender Name"
          }
        },
        "required": [
          "feedback_type",
          "message",
          "sender_email"
        ],
        "title": "SendFeedbackInput",
        "type": "object"
      },
      "name": "send_feedback"
    },
    {
      "description": "Runs a model once and reports one outcome's worst, median and best values. By default, worst is the lowest value in any trial, median is the middle value, and best is the highest value. Worst always means lowest, so for a cost the worst case is the cheapest one. You can ask for other percentiles instead, such as the 10th and 90th. Use this when you want a short worst, typical and best case story rather than the full distribution. For the full distribution, use run_monte_carlo_simulation. To find which input matters most, use rank_inputs_by_impact. It returns each scenario's outcome value and every input's own value at the same percentile. Those input values are an estimate, not the exact inputs of that trial. It returns no run_id, so get_simulation_results cannot fetch it later. Cost: without an account, 1 of your 3 free runs per UTC day (models up to 1,000 trials and 20 nodes); with an account, 1 credit for a small run or 5 for a large one, currently $0.50 per credit. A model that is invalid or over the no-account limits is rejected before running and costs nothing. If it fails mid-run: anonymous, the free run is used; account, not charged.",
      "inputSchema": {
        "$defs": {
          "AggregationRequest": {
            "additionalProperties": false,
            "description": "A financial metric over one node's whole series (npv, irr, cumsum, prob and others). See run_monte_carlo_simulation for full details and recipes.",
            "properties": {
              "function": {
                "description": "npv, irr, mirr, payback, discounted_payback, cagr, cumsum, terminal_value or prob.",
                "type": "string"
              },
              "id": {
                "description": "Name for this metric in the result. Must be unique.",
                "type": "string"
              },
              "params": {
                "additionalProperties": true,
                "description": "The metric's settings, for example {\"rate\": 0.1} for npv. The rate is per period, so monthly periods need a monthly rate.",
                "type": "object"
              },
              "target_aggregation_id": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "For prob only: id of an earlier metric to test."
              },
              "target_node_id": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Node the metric reads."
              }
            },
            "required": [
              "id",
              "function"
            ],
            "type": "object"
          },
          "CalcNode": {
            "additionalProperties": false,
            "description": "A formula node. See run_monte_carlo_simulation for the formula language.",
            "properties": {
              "formula": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Expression over incoming edge ids, for example '{e1} * {e2}'. See run_monte_carlo_simulation for full syntax."
              },
              "id": {
                "description": "Unique id for this node within the model.",
                "type": "string"
              },
              "name": {
                "default": "",
                "description": "Readable label.",
                "type": "string"
              }
            },
            "required": [
              "id"
            ],
            "type": "object"
          },
          "Edge": {
            "additionalProperties": false,
            "description": "A link that carries a value from one node (source) to another (target).",
            "properties": {
              "delay": {
                "default": 0,
                "description": "How many periods later the value arrives. Default 0. A loop of edges, including an edge from a node to itself, is allowed only when at least one edge in it has delay 1 or more; that is how a running total carries last period's value forward.",
                "minimum": 0,
                "type": "integer"
              },
              "id": {
                "description": "Unique id for this edge. Formulas refer to it in braces, like {e1}.",
                "type": "string"
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Optional readable label."
              },
              "source": {
                "description": "Id of the node the value comes from.",
                "type": "string"
              },
              "target": {
                "description": "Id of the node the value goes to.",
                "type": "string"
              }
            },
            "required": [
              "id",
              "source",
              "target"
            ],
            "type": "object"
          },
          "OutputRequest": {
            "additionalProperties": false,
            "description": "Result filter and financial metrics. See run_monte_carlo_simulation for full details.",
            "properties": {
              "aggregations": {
                "description": "Financial metrics such as npv, irr, cumsum or prob.",
                "items": {
                  "$ref": "#/$defs/AggregationRequest"
                },
                "type": "array"
              },
              "edges": {
                "description": "Edge ids to include. Empty means all edges.",
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "nodes": {
                "description": "Node ids to include. Empty means all nodes.",
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "time_periods": {
                "description": "Period indices to include, counting from 0. Empty means all.",
                "items": {
                  "type": "integer"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "PublicGraph": {
            "additionalProperties": false,
            "description": "A complete model. See run_monte_carlo_simulation for full details.",
            "properties": {
              "calc_nodes": {
                "description": "The formula nodes that combine values.",
                "items": {
                  "$ref": "#/$defs/CalcNode"
                },
                "type": "array"
              },
              "contract_version": {
                "const": "1.0",
                "default": "1.0",
                "description": "Version of the model format. Always \"1.0\"; you can leave it out.",
                "type": "string"
              },
              "edges": {
                "description": "The links between nodes.",
                "items": {
                  "$ref": "#/$defs/Edge"
                },
                "type": "array"
              },
              "root_nodes": {
                "description": "The uncertain inputs.",
                "items": {
                  "$ref": "#/$defs/RootNode"
                },
                "type": "array"
              },
              "run_params": {
                "$ref": "#/$defs/RunParams"
              }
            },
            "required": [
              "run_params"
            ],
            "type": "object"
          },
          "RootNode": {
            "additionalProperties": false,
            "description": "An uncertain input that draws from a distribution each trial. See run_monte_carlo_simulation for full details.",
            "oneOf": [
              {
                "description": "A constant value that never changes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "value": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "value"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "constant"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Normal (Gaussian) distribution",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mean": {
                        "type": "number"
                      },
                      "std": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mean",
                      "std"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Uniform distribution between low and high values",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "high": {
                        "type": "number"
                      },
                      "low": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "low",
                      "high"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "uniform"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Beta distribution for modeling probabilities and proportions",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "alpha": {
                        "type": "number"
                      },
                      "beta": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "alpha",
                      "beta"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "beta"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Gamma distribution for modeling waiting times",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      },
                      "shape": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "shape",
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "gamma"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Exponential distribution with scale parameter",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "exponential"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Poisson distribution for modeling count data",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "lambda_val": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "lambda_val"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "poisson"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Bernoulli distribution for binary outcomes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "p": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "p"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "bernoulli"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Triangle distribution with minimum, maximum, and mode parameters",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "max_val": {
                        "type": "number"
                      },
                      "min_val": {
                        "type": "number"
                      },
                      "mode_val": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "min_val",
                      "max_val",
                      "mode_val"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "triangle"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Log-normal distribution for modeling skewed, positive-valued data",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mu": {
                        "type": "number"
                      },
                      "sigma": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mu",
                      "sigma"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "log_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete log-normal: sample log-normal then round to nearest integer (zero allowed)",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mu": {
                        "type": "number"
                      },
                      "sigma": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mu",
                      "sigma"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_lognormal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Categorical distribution for discrete outcomes with custom probabilities",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "probabilities": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      },
                      "values": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "values",
                      "probabilities"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "categorical"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete gamma: sample gamma then round to nearest integer (zero allowed)",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "scale": {
                        "type": "number"
                      },
                      "shape": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "shape",
                      "scale"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_gamma"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Binomial distribution: the number of successes in n independent attempts",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "n": {
                        "type": "integer"
                      },
                      "p": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "n",
                      "p"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "binomial"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Dirichlet distribution for modeling correlated probabilities that sum to 1",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "alpha": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "alpha"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "dirichlet"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "A fixed list of values that never changes",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "values": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "values"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "constant_array"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Discrete normal distribution for integer-valued data with normal characteristics",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "mean": {
                        "type": "number"
                      },
                      "std": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "mean",
                      "std"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "discrete_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              },
              {
                "description": "Multivariate normal (correlated inputs): draws a vector of correlated values per trial from a mean vector + correlation matrix + per-component standard deviations. Array-valued — feed multiple downstream calc nodes by INDEXing component k (1-based): INDEX({edge}, k).",
                "properties": {
                  "distribution_params": {
                    "properties": {
                      "correlation": {
                        "items": {
                          "items": {
                            "type": "number"
                          },
                          "type": "array"
                        },
                        "type": "array"
                      },
                      "mean": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      },
                      "stds": {
                        "items": {
                          "type": "number"
                        },
                        "type": "array"
                      }
                    },
                    "required": [
                      "mean",
                      "stds",
                      "correlation"
                    ],
                    "type": "object"
                  },
                  "distribution_type": {
                    "const": "multivariate_normal"
                  }
                },
                "required": [
                  "distribution_type",
                  "distribution_params"
                ]
              }
            ],
            "properties": {
              "delay": {
                "default": 0,
                "description": "How many periods to wait before the first draw. Default 0.",
                "minimum": 0,
                "type": "integer"
              },
              "distribution_params": {
                "additionalProperties": true,
                "description": "Parameters for distribution_type, as listed in this schema's oneOf.",
                "type": "object"
              },
              "distribution_type": {
                "description": "Distribution name; allowed types and their parameters are in this schema's oneOf. See run_monte_carlo_simulation for which to pick.",
                "type": "string"
              },
              "id": {
                "description": "Unique id for this node within the model.",
                "type": "string"
              },
              "interval": {
                "default": 1,
                "description": "Draw a new value every N periods; in the periods between, this input is 0 (the value is not carried forward). 1 (the default) means every period. 0 means draw once, in the first period after any delay, and 0 afterwards. To keep one value in every period, use sampling_frequency once instead.",
                "minimum": 0,
                "type": "integer"
              },
              "name": {
                "default": "",
                "description": "Readable label.",
                "type": "string"
              },
              "sampling_frequency": {
                "default": "per_period",
                "description": "per_period (the default) draws a new value each period. once draws one value per trial and reuses it in every period.",
                "enum": [
                  "per_period",
                  "once"
                ],
                "type": "string"
              }
            },
            "required": [
              "id",
              "distribution_type",
              "distribution_params"
            ],
            "type": "object"
          },
          "RunParams": {
            "additionalProperties": false,
            "description": "How to run the model.",
            "properties": {
              "output_request": {
                "$ref": "#/$defs/OutputRequest",
                "description": "Optional result filter and financial metrics. See run_monte_carlo_simulation."
              },
              "time_periods": {
                "description": "Number of time periods (a count).",
                "exclusiveMinimum": 0,
                "type": "integer"
              },
              "trials": {
                "description": "Number of trials (random samples).",
                "exclusiveMinimum": 0,
                "type": "integer"
              }
            },
            "required": [
              "trials",
              "time_periods"
            ],
            "type": "object"
          }
        },
        "properties": {
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Your Neumann API key. Get one by creating an account (POST https://neumann.kromatic.com/api/v1/accounts, which returns the key once); setup docs: https://kromatic.com/mcp/neumann. Leave it out if your connection is already signed in, or to use the free no-account tier.",
            "title": "Api Key"
          },
          "graph": {
            "$ref": "#/$defs/PublicGraph",
            "description": "The model: root_nodes (uncertain inputs), calc_nodes (formulas), edges (links; formulas refer to them like {e1}) and run_params (trials and time periods). Same format as run_monte_carlo_simulation's graph, which documents formulas, periods, distributions and financial metrics in full.",
            "examples": [
              {
                "calc_nodes": [
                  {
                    "formula": "{e1} * {e2}",
                    "id": "revenue",
                    "name": "Monthly revenue"
                  }
                ],
                "edges": [
                  {
                    "id": "e1",
                    "source": "customers",
                    "target": "revenue"
                  },
                  {
                    "id": "e2",
                    "source": "price",
                    "target": "revenue"
                  }
                ],
                "root_nodes": [
                  {
                    "distribution_params": {
                      "mean": 1000,
                      "std": 200
                    },
                    "distribution_type": "normal",
                    "id": "customers",
                    "name": "Customers per month"
                  },
                  {
                    "distribution_params": {
                      "max_val": 15,
                      "min_val": 8,
                      "mode_val": 10
                    },
                    "distribution_type": "triangle",
                    "id": "price",
                    "name": "Price (USD)"
                  }
                ],
                "run_params": {
                  "time_periods": 12,
                  "trials": 1000
                }
              }
            ],
            "type": "object"
          },
          "percentiles": {
            "anyOf": [
              {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "A list of percentiles of the outcome to report. Each is a fraction from 0 to 1: 0.1 is the 10th percentile, the value 10% of trials fall below. Default [0, 0.5, 1]: 0 is the lowest trial (labelled worst), 0.5 the median, and 1 the highest trial (labelled best). Other values are labelled like p10 (10th percentile). Values between 0 and 1 are estimated from a histogram. The labels assume higher is better: for a cost or a duration, 'worst' is the lowest (cheapest or fastest) trial, so ask for percentiles such as 0.1 and 0.9 and read them as low and high.",
            "examples": [
              [
                0.1,
                0.5,
                0.9
              ]
            ],
            "title": "Percentiles"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional whole number that fixes the random draws, so repeating the call gives the same result. Exact repeats are guaranteed only for small runs, where trials × nodes × time periods is at most 100,000.",
            "title": "Seed"
          },
          "target_node_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "The id of the outcome node to measure. Defaults to the last calc node in the model, which is usually the final outcome.",
            "examples": [
              "revenue"
            ],
            "title": "Target Node Id"
          },
          "time_period": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Index of the time period to measure, counting from 0: with 12 monthly periods, 11 is month 12. Defaults to the last period. This measures the node's value in that one period, not a total. For a cumulative figure such as year-one profit, add a running-total calc node with formula {e1} + {e2}, where e1 brings in the per-period value and e2 is an edge from the running-total node to itself with delay 1. Then target that node at index 11. This delayed self-edge is allowed; only loops with no delay are errors. In run_monte_carlo_simulation, use a cumsum metric instead.",
            "title": "Time Period"
          }
        },
        "required": [
          "graph"
        ],
        "title": "SummarizeOutcomeScenariosInput",
        "type": "object"
      },
      "name": "summarize_outcome_scenarios"
    }
  ]
}

What the leaf hashes

{"body":"f77cb424ce72d163c55b07641cc3de3e199616a304ecedeb018802053a18b246","id":1241017,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793355948742361,"prev":1054878,"subject":"278214a0-1e9d-4f76-9d11-401752e2e2fc","subject_kind":"endpoint"}

Proof

Its day has not closed yet. A day closes ten minutes after midnight UTC; the proof appears here then.

How to check it · This row as JSON