Zovo Decision Tree MCP
Solves and draws decision trees for business choices from user-provided numbers, computing expected values using fractions to avoid floating-point drift. It accepts indented outlines or JSON, checks probability sums, identifies optimal options, and exports results as PDF, SVG, or CSV.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://decision-tree.zovo.one/mcpWhat its tools do
2 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (2)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Compute expected values for business decision trees
- Draw decision trees as vector PDF or SVG
- Validate that chance node probabilities sum to 1
- Export tree data and risk profiles to CSV
Source and maintenance
Protocol and capabilities
- Server
- decision-tree 1.0.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 2 advertised
- Resources
- 1 advertised
- Resource templates
- 1 advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
},
"resources": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
2 advertised
make_decision_tree — Make decision tree
Use this when the user wants a decision tree drawn or solved: options of a decision, chance events with probabilities, and payoffs, for example "which option has the higher expected value" or "draw a decision tree for launching this product". Takes the tree as an indented outline or a JSON node list, the objective (max or min), a unit, decimals, a page size and a title. Rolls the tree back with fractions: the expected value of each node, the chosen option at each decision (ties listed), branch costs applied by a stated rule, and the risk profile of the chosen strategy. Refuses a tree whose chance probabilities do not add up to 1, naming the node and the sum, and end nodes without a payoff. Returns a summary, an interactive drawing, and PDF, SVG and CSV downloads. Up to 300 nodes. Does not estimate probabilities or give advice. Download links of large trees expire after about 1 hour.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"unit": {
"type": "string",
"maxLength": 40,
"description": "Unit or currency shown with values, up to 12 characters, e.g. \"$\", \"EUR\" or \"hours\"."
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"p": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "number"
}
],
"description": "Probability of this branch when the parent is a chance node, e.g. 0.6, \"1/3\" or \"35%\"."
},
"id": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "number"
}
],
"description": "Unique id of the node, e.g. \"n1\"."
},
"cost": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "number"
}
],
"description": "Amount paid on this branch, e.g. 200."
},
"type": {
"type": "string",
"maxLength": 20,
"description": "decision, chance or end. Optional: inferred from the branches as in the outline."
},
"label": {
"type": "string",
"maxLength": 400,
"description": "Short name of the node or of the branch into it, e.g. \"Strong demand\"."
},
"parent": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "number"
}
],
"description": "Id of the parent node; leave out for the root only, e.g. \"n1\"."
},
"payoff": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "number"
}
],
"description": "Value at an end node, e.g. 1000 or -300."
}
},
"additionalProperties": {}
},
"maxItems": 2000,
"description": "The tree as a JSON list instead of outline: each node has id, parent (not for the root), label, and p, cost or payoff as needed, e.g. [{\"id\":\"r\",\"label\":\"Launch?\"},{\"id\":\"a\",\"parent\":\"r\",\"label\":\"Do not launch\",\"payoff\":0}]."
},
"title": {
"type": "string",
"maxLength": 400,
"description": "Title printed on the drawing and used in file names, up to 80 characters, e.g. \"Product launch\"."
},
"outline": {
"type": "string",
"maxLength": 400000,
"description": "The tree as indented text, one node per line, children indented under their parent (spaces or tabs, \"- \" bullets allowed). The first line is the root. Fields after the label: p=<probability> on branches of a chance node, cost=<amount> on any branch, payoff=<amount> on end nodes; separate them with spaces or \"|\". A node whose branches have p is a chance node, a node with branches and no p is a decision, a node with no branches is an end node; \"Decision:\", \"Chance:\" or \"End:\" before a label states the type. Numbers: decimals (0.35, -1,200.50, $300), fractions (1/3), and percents for p (35%). Up to 300 nodes. Example: \"Launch? | decision\\n Launch | cost=200\\n Strong demand | p=0.6 | payoff=1000\\n Weak demand | p=0.4 | payoff=-300\\n Do not launch | payoff=0\"."
},
"decimals": {
"type": "integer",
"maximum": 6,
"minimum": 0,
"description": "Decimals shown in the drawing and summary, 0 to 6 (default 2), e.g. 2. The CSV also has the fraction."
},
"objective": {
"enum": [
"max",
"min"
],
"type": "string",
"description": "max (default): choose the option with the highest expected value, for profit or gain. min: choose the lowest, when payoffs are costs, losses or time. Example: max."
},
"page_size": {
"enum": [
"letter",
"a4"
],
"type": "string",
"description": "PDF page: letter (default) or a4. Landscape unless portrait needs fewer pages."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"title",
"objective",
"unit",
"decimals",
"counts",
"root",
"strategy",
"ties",
"risk_profile",
"nodes",
"issues",
"checks",
"pdf",
"rules",
"warnings",
"downloads"
],
"properties": {
"pdf": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"root": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"ties": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"unit": {
"type": "string"
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"rules": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"shown": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"title": {
"type": "string"
},
"checks": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"counts": {
"type": "object",
"required": [
"nodes",
"decision_nodes",
"chance_nodes",
"end_nodes",
"depth",
"errors",
"warnings"
],
"properties": {
"depth": {
"type": "number"
},
"nodes": {
"type": "number"
},
"errors": {
"type": "number"
},
"warnings": {
"type": "number"
},
"end_nodes": {
"type": "number"
},
"chance_nodes": {
"type": "number"
},
"decision_nodes": {
"type": "number"
}
},
"additionalProperties": false
},
"issues": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"decimals": {
"type": "number"
},
"strategy": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"downloads": {
"type": "object",
"properties": {
"csv": {
"type": "string"
},
"pdf": {
"type": "string"
},
"svg": {
"type": "string"
}
},
"additionalProperties": false
},
"objective": {
"type": "string"
},
"risk_profile": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
}
},
"additionalProperties": false
}{
"title": "Make decision tree",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}check_tree — Check decision tree
Use this when the user wants a decision tree checked without a drawing, for example "do my probabilities add up to 1" or "is anything missing in this tree". Takes the same outline or node list and objective as make_decision_tree. Returns, for each chance node, the sum of its branch probabilities as a fraction and whether it is 1; end nodes without a payoff; probabilities on decision options; payoffs on nodes that have branches; single-option decisions; duplicate branch names; and the depth and node counts against the limits. When nothing is wrong it also gives the root expected value. Refuses a tree it is unable to read (unknown parent, a loop, two roots, over the limits), naming the line or id. Does not draw the tree or make files. Do not use it to estimate probabilities.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"p": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "number"
}
],
"description": "Probability of this branch when the parent is a chance node, e.g. 0.6, \"1/3\" or \"35%\"."
},
"id": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "number"
}
],
"description": "Unique id of the node, e.g. \"n1\"."
},
"cost": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "number"
}
],
"description": "Amount paid on this branch, e.g. 200."
},
"type": {
"type": "string",
"maxLength": 20,
"description": "decision, chance or end. Optional: inferred from the branches as in the outline."
},
"label": {
"type": "string",
"maxLength": 400,
"description": "Short name of the node or of the branch into it, e.g. \"Strong demand\"."
},
"parent": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "number"
}
],
"description": "Id of the parent node; leave out for the root only, e.g. \"n1\"."
},
"payoff": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "number"
}
],
"description": "Value at an end node, e.g. 1000 or -300."
}
},
"additionalProperties": {}
},
"maxItems": 2000,
"description": "The tree as a JSON list instead of outline: each node has id, parent (not for the root), label, and p, cost or payoff as needed, e.g. [{\"id\":\"r\",\"label\":\"Launch?\"},{\"id\":\"a\",\"parent\":\"r\",\"label\":\"Do not launch\",\"payoff\":0}]."
},
"outline": {
"type": "string",
"maxLength": 400000,
"description": "The tree as indented text, one node per line, children indented under their parent (spaces or tabs, \"- \" bullets allowed). The first line is the root. Fields after the label: p=<probability> on branches of a chance node, cost=<amount> on any branch, payoff=<amount> on end nodes; separate them with spaces or \"|\". A node whose branches have p is a chance node, a node with branches and no p is a decision, a node with no branches is an end node; \"Decision:\", \"Chance:\" or \"End:\" before a label states the type. Numbers: decimals (0.35, -1,200.50, $300), fractions (1/3), and percents for p (35%). Up to 300 nodes. Example: \"Launch? | decision\\n Launch | cost=200\\n Strong demand | p=0.6 | payoff=1000\\n Weak demand | p=0.4 | payoff=-300\\n Do not launch | payoff=0\"."
},
"objective": {
"enum": [
"max",
"min"
],
"type": "string",
"description": "max (default): choose the option with the highest expected value, for profit or gain. min: choose the lowest, when payoffs are costs, losses or time. Example: max."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ready",
"objective",
"counts",
"chance_nodes",
"issues",
"limits"
],
"properties": {
"root": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"ready": {
"type": "boolean"
},
"shown": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"counts": {
"type": "object",
"required": [
"nodes",
"decision_nodes",
"chance_nodes",
"end_nodes",
"depth",
"errors",
"warnings"
],
"properties": {
"depth": {
"type": "number"
},
"nodes": {
"type": "number"
},
"errors": {
"type": "number"
},
"warnings": {
"type": "number"
},
"end_nodes": {
"type": "number"
},
"chance_nodes": {
"type": "number"
},
"decision_nodes": {
"type": "number"
}
},
"additionalProperties": false
},
"issues": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"limits": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"objective": {
"type": "string"
},
"chance_nodes": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
}
},
"additionalProperties": false
}{
"title": "Check decision tree",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
1 advertised
decision-tree-widget — Zovo Decision Tree view
Interactive view for Zovo Decision Tree.
ui://widget/decision-tree-v1-1.0.0-cffc69e91395158c65c3fa7520d385c901b529cbd493c0c4a7416ea52170731a.htmldecision-tree-widget-legacy — Zovo Decision Tree view (previous versions)
ui://widget/decision-tree-{version}.html30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 915 ms
- 95th percentile latency
- 915 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 915 ms · metadata changed · 2 tool(s), 1 resource(s), 1 resource template(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http zovo-decision-tree-mcp https://decision-tree.zovo.one/mcpCodex
codex mcp add zovo-decision-tree-mcp --url https://decision-tree.zovo.one/mcpCursor
{
"mcpServers": {
"zovo-decision-tree-mcp": {
"url": "https://decision-tree.zovo.one/mcp"
}
}
}Cline
{
"mcpServers": {
"zovo-decision-tree-mcp": {
"type": "streamableHttp",
"url": "https://decision-tree.zovo.one/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"zovo-decision-tree-mcp": {
"type": "http",
"url": "https://decision-tree.zovo.one/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http zovo-decision-tree-mcp https://decision-tree.zovo.one/mcpClaude Desktop
https://decision-tree.zovo.one/mcpWindsurf
{
"mcpServers": {
"zovo-decision-tree-mcp": {
"serverUrl": "https://decision-tree.zovo.one/mcp"
}
}
}Let your agent find its tools
Find servers like Zovo Decision Tree MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.