{"name":"neumann","description":"Monte Carlo ranges for uncertain plans: project cost, budget, timeline, capacity, NPV/IRR/payback.","version":"0.2.56","transport":{"streamable-http":{"url":"https://neumann.kromatic.com/mcp","status":"live","note":"Official MCP Streamable-HTTP transport (stateless). Connect with the mcp Python SDK or any MCP client. Authenticate by sending your raw signup api_key, or an opaque nmn_oat_/nmn_pat_ token (mint via POST /api/v1/tokens), as Authorization: Bearer; never as a tool argument. POST /mcp (no trailing slash) is the canonical URL and is answered directly, with no redirect; POST /mcp/ also works."},"http":{"url":"https://neumann.kromatic.com/mcp/tools","call_url":"https://neumann.kromatic.com/mcp/tools/run_monte_carlo_simulation","note":"Plain-REST mirror of the MCP tools for non-MCP clients. GET /mcp/tools to list; POST /mcp/tools/<name> to call. Authenticate via the X-API-Key header or Authorization: Bearer <key>."}},"auth":{"type":"api_key","header":"X-API-Key","bearer_token_prefixes":["nmn_oat_","nmn_pat_"],"bearer_token_mint_url":"https://neumann.kromatic.com/api/v1/tokens","bearer_token_mint_method":"POST","signup_url":"https://neumann.kromatic.com/api/v1/accounts","signup_method":"POST","note":"POST /api/v1/accounts with no body to create an account and receive a raw api_key plus starter credits. Send it as Authorization: Bearer <key> on MCP (an opaque nmn_oat_/nmn_pat_ token from POST /api/v1/tokens works too) or the X-API-Key header on REST — never as a tool argument. Anonymous (no credential) access is allowed and free, but unaccounted and bounded: 3 runs per UTC calendar day, at most 1,000 trials over at most 20 nodes per run. Larger or more frequent use needs an account."},"tools":[{"name":"run_monte_carlo_simulation","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 a summary: for each output node (the nodes nothing else depends on, or the ones you list in run_params.output_request.nodes) the mean, the 10th, 50th and 90th percentiles (the value that share of trials fall below), the minimum and maximum in the last time period, and the same per period; plus any metrics you asked for, such as NPV, IRR, payback or the chance of beating a target or budget; and a run_id. Pass that run_id to get_simulation_results for other nodes, periods or percentiles. A run that takes longer than about 40 seconds keeps running in the background: you get status running and a run_id, and get_simulation_results gives you progress and then the result. Cost: without an account, 1 of your 3 free runs per UTC day, for a model up to 1,000 trials and 20 nodes; that daily allowance is counted per network address and client, so on a shared platform such as Claude.ai or ChatGPT you may find today's free runs already spent by someone else. Signed in with a free Kromatic account, 1 of 10 free runs per UTC day, for a small model up to 10,000 trials and 50 nodes, spent before any credits. Beyond that -- a larger model, or a day whose free runs are used up -- 1 credit for a small run or 5 for a large one, currently $0.50 per credit; buy_credits tops up. A model that is invalid, or over the limits of the tier you are in, is rejected before running and costs nothing. If it fails mid-run, it depends on the tier: without an account the free run is still used up and not given back; signed in on a free run, the free run is given back; on credits, you are not charged. That last rule is this tool's own: rank_inputs_by_impact is different, because it charges credits when its analysis starts and keeps them if it fails."},{"name":"rank_inputs_by_impact","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. Inputs whose distribution produces a list of values are skipped. It always returns a run_id. It runs the model once per input per value tried, so on a big model it can take minutes: if it is not done in about 40 seconds you get status running, and get_simulation_results gives you progress and then the ranking. Cost: one run's worth per call, even though the analysis runs the model many times. Without an account, 1 of your 3 free runs per UTC day, for a model up to 1,000 trials and 20 nodes; that daily allowance is counted per network address and client, so on a shared platform such as Claude.ai or ChatGPT you may find today's free runs already spent by someone else. Signed in with a free Kromatic account, 1 of 10 free runs per UTC day, for a small model up to 10,000 trials and 50 nodes, spent before any credits. Beyond that, 1 credit for a small model or 5 for a large one, currently $0.50 per credit; buy_credits tops up. A model that is invalid, or over the limits of the tier you are in, is rejected before running and costs nothing. If it fails mid-run, it depends on the tier: without an account the free run is still used up and not given back; signed in on a free run, the free run is given back; on credits, you are already charged, because this tool charges when the analysis starts."},{"name":"summarize_outcome_scenarios","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. Those labels assume higher is better. For a cost or a duration, where lower is better, swap them when you tell the user: the scenario labelled worst is the cheapest or fastest case, which is the good outcome, and the one labelled best is the most expensive or slowest. 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 -- and use that one, not this, when the user asks for a realistic total or range rather than for named worst, typical and best cases. 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 also returns a run_id; a long run comes back as status running, and get_simulation_results gives you progress and then the result. Cost: without an account, 1 of your 3 free runs per UTC day, for a model up to 1,000 trials and 20 nodes; that daily allowance is counted per network address and client, so on a shared platform such as Claude.ai or ChatGPT you may find today's free runs already spent by someone else. Signed in with a free Kromatic account, 1 of 10 free runs per UTC day, for a small model up to 10,000 trials and 50 nodes, spent before any credits. Beyond that -- a larger model, or a day whose free runs are used up -- 1 credit for a small run or 5 for a large one, currently $0.50 per credit; buy_credits tops up. A model that is invalid, or over the limits of the tier you are in, is rejected before running and costs nothing. If it fails mid-run, it depends on the tier: without an account the free run is still used up and not given back; signed in on a free run, the free run is given back; on credits, you are not charged. That last rule is this tool's own: rank_inputs_by_impact is different, because it charges credits when its analysis starts and keeps them if it fails."},{"name":"check_simulation_model","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, with or without an account -- it debits no credits and spends none of your free daily runs. Without an account, a model over 1,000 trials or 20 nodes is rejected, also at no cost."},{"name":"estimate_simulation_size_and_cost","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), the credit cost for an account, and a rough run time in seconds for run_monte_carlo_simulation and for rank_inputs_by_impact (which runs the model many times). Runs over about 40 seconds continue in the background and are collected with get_simulation_results. 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, with or without an account -- it debits no credits and spends none of your free daily runs. Without an account, a model over 1,000 trials or 20 nodes is rejected, also at no cost."},{"name":"convert_range_to_distribution","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. You do not need it for a three-point low / most likely / high estimate: that goes straight into the model as a triangle input (min_val, mode_val, max_val), so call run_monte_carlo_simulation directly. 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, with or without an account -- it debits no credits and spends none of your free daily runs."},{"name":"convert_distribution_to_range","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, with or without an account -- it debits no credits and spends none of your free daily runs."},{"name":"get_simulation_results","description":"Checks on, and reads, a run you started with run_monte_carlo_simulation, rank_inputs_by_impact or summarize_outcome_scenarios, using its run_id. Use this when a run tool returned status running or queued: it waits up to 30 seconds for the run to finish, then returns its status and percent done, or the finished result, so call it again until status is completed. Use it also to get specific numbers from a finished simulation without running it again (a finished run keeps every node's and edge's statistics for every period): pass nodes (node, edge or metric ids), periods, percentiles such as 0.05 or 0.95, a threshold to get the chance a value is at least or at most some number, or histogram for the distribution's shape. Without those it returns the summary (or the ranking, or the scenarios). A failed run returns its error and is not charged. Only the caller who started the run can read it, and only with the run_id, which is returned to that caller alone. A run started without an account can be read for 24 hours and only from the same connection, because a caller without an account is recognized by network address and client; sign in with a free Kromatic account for runs that are not tied to one connection. Credentials go in the Authorization header as a Bearer credential; no Neumann tool takes an api_key argument. Cost: free, with or without an account -- it debits no credits and spends none of your free daily runs."},{"name":"check_account_and_credits","description":"Shows who Neumann thinks you are and what you can still do: your free runs left today and when they reset, and your credit balance if you have an account. Use this when you need to know, before or after a run, whether the next call will be free or spend credits, how much is left, or whether you are signed in -- and when a run was refused for want of runs or credits, so you can tell the user which it was. There are three tiers. Without an account you get 3 free runs per UTC day; you are recognized by network address and client, so on a hosted platform such as Claude.ai or ChatGPT many callers share one identity and today's free runs may already be spent by someone else. Signed in with a free Kromatic account you get your own 10 free runs per UTC day, spent before any credits. After those, runs cost credits. An account created with POST https://neumann.kromatic.com/api/v1/accounts authenticates you and starts with 5 free credits, but it carries no free daily runs -- only signing in with a Kromatic account does. 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 size limits that apply to you, the price of one credit in US dollars, and your last 10 credit transactions. Credentials go in the Authorization header as a Bearer credential and nowhere else; no Neumann tool takes an api_key argument, and a credential that is not recognized returns an unauthorized error. This tool itself needs no account -- it is how a caller without one finds that out. Setup docs: https://kromatic.com/mcp/neumann. Cost: free, with or without an account -- it debits no credits and spends none of your free daily runs."},{"name":"send_feedback","description":"Sends a short report about Neumann to the team that builds it. They read every report and use it to fix problems and decide what to build, so honest feedback, good or bad, is useful. Use this when:\n- a Neumann tool returned an error (send it right away), behaved unexpectedly or gave a result that looks wrong;\n- the user needs something no Neumann tool can do, or an option that is missing;\n- a description, output or error message was confusing;\n- a session in which you used Neumann is ending: send one short report even if everything worked. Knowing which tools did the job for which kind of task is useful data, not noise.\nDo not send one after a routine successful call mid-session. Put several points in one report: a signed-in account may send 5 per hour and 20 per day, and callers without an account share 60 per hour and 300 per day. Only message is required. Fill in the other fields that apply so the team can act without guessing. Write in your own words. Never include personal data (names, email addresses, company names), the user's own numbers (inputs or results), secrets or keys, or the conversation transcript; describe the task and any wrong result in general terms instead. Tell the user you are sending it. Add sender_email only if the user wants a reply. If you are signed in, your account id is included. No account is needed. It returns status \"sent\". Cost: free, with or without an account -- it debits no credits and spends none of your free daily runs."},{"name":"buy_credits","description":"Buys Neumann credits by charging the payment card already saved on your account. Credits pay for runs once the free runs for the day are used up, or for a model too large to run free. Use this when an account is low on credits and the user has agreed to the purchase; to see the balance and the live price first, call check_account_and_credits. No saved card is needed to call it: if none is saved yet, it buys nothing and charges nothing: it returns payment_status checkout_required and a checkout_url, which the user opens in a browser to save a card before 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. It needs a Neumann account: send your key, or your signed-in token, in the Authorization header as a Bearer credential. No Neumann tool takes an api_key argument. Buying credits needs the neumann:billing scope when you are signed in rather than using a key. Cost: charges the payment card saved on your account for each credit, currently $0.50 per credit (check_account_and_credits shows the live price). It needs an account, and credits are what a run costs once your free runs for the day are gone -- 1 credit for a small run or 5 for a large one."},{"name":"create_result_share_link","description":"Creates a public web link to one of your results, so you can hand the numbers to someone who has no Neumann account. Use this when the user wants to send, publish or show a result to another person; to put the numbers in the conversation instead, call get_simulation_results. It works for any run you own: a run from run_monte_carlo_simulation, rank_inputs_by_impact or summarize_outcome_scenarios, and a run of a graph you saved. There is one share tool for every kind of run -- do not look for a separate one. Pass the run_id the run tool returned when the run was made, earlier in the conversation; no tool lists runs, and you do not need a graph_id. That holds for a run of a saved model too: when the user asks to share the run of a saved graph, call this tool directly with that run's run_id -- list_graphs and get_graph return graph_ids, not run_ids, so they are not a step here. Calling it again for the same run returns the same link rather than a second one. Anyone who has the link can open the result without signing in, so ask the user before you create one. delete_run deletes the stored result, which also stops its share link working. There is no way to turn off a link and keep the result. A run made without an account takes two calls, and the run_id is what carries it from one to the other. First call: the caller has no account, so call this tool with the run_id anyway; nothing is shared, and it returns a message asking the user to sign in with a free Kromatic account -- tell the user that. Second call: once the user has signed in, call this tool again with the SAME run_id. Only that second call shares the run and keeps it on the account; signing in alone shares nothing, and a different run_id, or a new run, does not carry the claim. Do it within 24 hours, because a run made without an account is deleted after that. When you tell the user what happens next, say both steps: sign in, then you will share it using the same run. It returns the share_url. It needs a Neumann account: send your key, or your signed-in token, in the Authorization header as a Bearer credential. No Neumann tool takes an api_key argument. Cost: free -- it debits no credits and spends none of your free daily runs -- but it needs an account; an anonymous caller gets authentication_required."},{"name":"save_graph","description":"Saves a model to your Neumann account so you can come back to it instead of describing it again. A saved model is called a graph: its uncertain inputs, the formulas that combine them, and the links between them. Use this when the user will revisit this model -- a budget, a plan, a business case they will update -- or when you want to re-analyse it later without resending it; for a one-off question, pass the model inline to run_monte_carlo_simulation and save nothing. Omit graph_id to save a new graph. Pass the graph_id of a graph you saved before to replace that same graph with this version; the earlier versions are kept, so replacing is not losing anything. It returns the graph_id to use later, the version_id of the version it just stored, the name, and when it was last updated. Use that graph_id with get_graph to read the model back, with rank_inputs_by_impact or summarize_outcome_scenarios in place of an inline graph, and with delete_graph to remove it. run_monte_carlo_simulation does not take a graph_id: read the graph with get_graph and pass it inline. It needs a Neumann account: send your key, or your signed-in token, in the Authorization header as a Bearer credential. No Neumann tool takes an api_key argument. Cost: free -- it debits no credits and spends none of your free daily runs -- but it needs an account; an anonymous caller gets authentication_required."},{"name":"list_graphs","description":"Lists the graphs saved on your Neumann account, the most recently updated first. Use this when the user refers to a model they saved earlier and you do not know its graph_id; it is how you find the id that get_graph, rank_inputs_by_impact, summarize_outcome_scenarios and delete_graph need. It does not list runs or results -- it lists the models themselves. It returns one entry per graph with its graph_id, name, when it was last updated and how many input and formula nodes it has, plus next_offset when there are more to page through. It needs a Neumann account: send your key, or your signed-in token, in the Authorization header as a Bearer credential. No Neumann tool takes an api_key argument. Cost: free -- it debits no credits and spends none of your free daily runs -- but it needs an account; an anonymous caller gets authentication_required."},{"name":"get_graph","description":"Reads one graph you saved earlier, by its graph_id, and returns the whole model in the same shape the run tools accept. Use this when you want to show the user what is in a saved model, edit it before running it again, or run it with run_monte_carlo_simulation, which takes the model inline and not a graph_id. To find a graph_id first, call list_graphs. It returns the graph_id, the name, when it was last updated, and the graph itself: its uncertain inputs with their distributions, the formula nodes, the links between them and the run settings. It reads the model, not any result of running it. It needs a Neumann account: send your key, or your signed-in token, in the Authorization header as a Bearer credential. No Neumann tool takes an api_key argument. Cost: free -- it debits no credits and spends none of your free daily runs -- but it needs an account; an anonymous caller gets authentication_required."},{"name":"delete_graph","description":"Deletes one graph you saved, together with the runs of it. Use this when the user has explicitly asked for that model to be removed, and not otherwise. Confirm which one first with list_graphs or get_graph, because the graph_id is the only thing that says which model goes. Neumann purges it for good after 30 days, and until then nothing on this connector can restore it -- no tool here can put it back -- so treat it as final and do not tell the user it can be recovered. Deleting the same graph twice changes nothing and does not extend the 30 days. To stop using a graph without removing it, just leave it saved and do not pass its graph_id. It returns the graph_id, what kind of thing was deleted, the time it was deleted and the date it is purged for good. It needs a Neumann account: send your key, or your signed-in token, in the Authorization header as a Bearer credential. No Neumann tool takes an api_key argument. Cost: free -- it debits no credits and spends none of your free daily runs -- but it needs an account; an anonymous caller gets authentication_required."},{"name":"delete_run","description":"Deletes one of your own runs -- one result -- and its share link, leaving the model it came from alone. It works on any run_id you can read, whether the run came from a model you passed inline or from one you saved; afterwards get_simulation_results can no longer read it. Use this when the user has explicitly asked for that result to be removed, and not otherwise. To remove a saved model and all of its runs at once, use delete_graph. Neumann purges it for good after 30 days, and until then nothing on this connector can restore it -- no tool here can put it back -- so treat it as final and do not tell the user it can be recovered. Deleting the same run twice changes nothing and does not extend the 30 days. It returns the run_id, what kind of thing was deleted, the time it was deleted and the date it is purged for good. It needs a Neumann account: send your key, or your signed-in token, in the Authorization header as a Bearer credential. No Neumann tool takes an api_key argument. Cost: free -- it debits no credits and spends none of your free daily runs -- but it needs an account; an anonymous caller gets authentication_required."}],"docs":{"quickstart":"https://neumann.kromatic.com/llms.txt","full":"https://neumann.kromatic.com/agents.md","contract":"https://neumann.kromatic.com/api/v1/contract","openapi":"https://neumann.kromatic.com/openapi.json","swagger":"https://neumann.kromatic.com/docs"}}