Validate, convert (behavior3 JSON, BehaviorTree.CPP XML) and open behavior trees in a visual editor
Maintained by@alanhoskins(verified)Also a maintainer?
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Convert between behavior3 JSON and BehaviorTree.CPP XML (v4 for ROS 2 Jazzy and Groot2, v3 for ROS 2 Humble), the same way the editor imports and exports. Returns the converted text and any issues (BT.CPP has no equivalent for some behavior3 nodes and vice versa).
Target format: behavior3, btcpp-v4 or btcpp-v3
The tree: behavior3 JSON: {"title": "...", "root": "<id of the first node under the root>", "nodes": {"<id>": {"name": "<node type>", "title": "<optional label>", "children": ["<id>", ...] (composites, in run order) or "child": "<id>" (decorators), "properties": {...}}}, "custom_nodes": [{"name": "IsEnemyVisible", "category": "condition"}]}. Positions ("display") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({"trees": [...], "custom_nodes": [...]}) or BehaviorTree.CPP XML also works.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http behaviortrees https://www.behaviortrees.com/mcp
Tool list last changed Nov 3, 2026.
Convert between behavior3 JSON and BehaviorTree.CPP XML (v4 for ROS 2 Jazzy and Groot2, v3 for ROS 2 Humble), the same way the editor imports and exports. Returns the converted text and any issues (BT.CPP has no equivalent for some behavior3 nodes and vice versa).
| Argument | Type | Description |
|---|---|---|
| to* | string | Target format: behavior3, btcpp-v4 or btcpp-v3 |
| tree* | any | The tree: behavior3 JSON: {"title": "...", "root": "<id of the first node under the root>", "nodes": {"<id>": {"name": "<node type>", "title": "<optional label>", "children": ["<id>", ...] (composites, in run order) or "child": "<id>" (decorators), "properties": {...}}}, "custom_nodes": [{"name": "IsEnemyVisible", "category": "condition"}]}. Positions ("display") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({"trees": [...], "custom_nodes": [...]}) or BehaviorTree.CPP XML also works. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tree",
"to"
],
"properties": {
"to": {
"enum": [
"behavior3",
"btcpp-v4",
"btcpp-v3"
],
"type": "string",
"description": "Target format: behavior3, btcpp-v4 or btcpp-v3"
},
"tree": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
],
"description": "The tree: behavior3 JSON: {\"title\": \"...\", \"root\": \"<id of the first node under the root>\", \"nodes\": {\"<id>\": {\"name\": \"<node type>\", \"title\": \"<optional label>\", \"children\": [\"<id>\", ...] (composites, in run order) or \"child\": \"<id>\" (decorators), \"properties\": {...}}}, \"custom_nodes\": [{\"name\": \"IsEnemyVisible\", \"category\": \"condition\"}]}. Positions (\"display\") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({\"trees\": [...], \"custom_nodes\": [...]}) or BehaviorTree.CPP XML also works."
}
}
}Returns a url that opens the tree in the behaviortrees.com editor in the user's browser, auto-laid-out and editable, with no account needed. The tree travels inside the link (the URL fragment), so nothing is uploaded or stored. Fails with the validation errors if the tree has any.
| Argument | Type | Description |
|---|---|---|
| tree* | any | The tree: behavior3 JSON: {"title": "...", "root": "<id of the first node under the root>", "nodes": {"<id>": {"name": "<node type>", "title": "<optional label>", "children": ["<id>", ...] (composites, in run order) or "child": "<id>" (decorators), "properties": {...}}}, "custom_nodes": [{"name": "IsEnemyVisible", "category": "condition"}]}. Positions ("display") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({"trees": [...], "custom_nodes": [...]}) or BehaviorTree.CPP XML also works. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tree"
],
"properties": {
"tree": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
],
"description": "The tree: behavior3 JSON: {\"title\": \"...\", \"root\": \"<id of the first node under the root>\", \"nodes\": {\"<id>\": {\"name\": \"<node type>\", \"title\": \"<optional label>\", \"children\": [\"<id>\", ...] (composites, in run order) or \"child\": \"<id>\" (decorators), \"properties\": {...}}}, \"custom_nodes\": [{\"name\": \"IsEnemyVisible\", \"category\": \"condition\"}]}. Positions (\"display\") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({\"trees\": [...], \"custom_nodes\": [...]}) or BehaviorTree.CPP XML also works."
}
}
}Complete, working example trees (enemy patrol, cooldown-gated attacks, robot navigation with recovery, and more) to learn the format from or start with. Without an id, lists the examples; with an id, returns that tree as behavior3 JSON.
| Argument | Type | Description |
|---|---|---|
| id | string | Example id from the list; omit to list them |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"type": "string",
"description": "Example id from the list; omit to list them"
}
}
}The built-in behavior3 nodes a tree can use without declaring them: composites (Sequence, Priority = selector/fallback, MemSequence, MemPriority), decorators (Inverter, Repeater, MaxTime, ...) and leaves (Wait, Succeeder, Failer, ...), with descriptions and default properties.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Practical guides from behaviortrees.com/learn as Markdown: what behavior trees are, node types, blackboards, debugging, structuring large trees, and behavior trees in Unity, Unreal, Godot, Python and robotics (BehaviorTree.CPP, ROS 2, Nav2). Without a slug, lists the guides.
| Argument | Type | Description |
|---|---|---|
| slug | string | Guide slug from the list; omit to list them |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"slug": {
"type": "string",
"description": "Guide slug from the list; omit to list them"
}
}
}Checks a behavior tree for errors: missing or dangling children, nodes with two parents, cycles, decorators with more than one child, leaves with children, unknown node names, and BehaviorTree.CPP import problems. Returns valid (true when there are no errors), the trees found, and findings at error, warning or info level.
| Argument | Type | Description |
|---|---|---|
| tree* | any | The tree: behavior3 JSON: {"title": "...", "root": "<id of the first node under the root>", "nodes": {"<id>": {"name": "<node type>", "title": "<optional label>", "children": ["<id>", ...] (composites, in run order) or "child": "<id>" (decorators), "properties": {...}}}, "custom_nodes": [{"name": "IsEnemyVisible", "category": "condition"}]}. Positions ("display") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({"trees": [...], "custom_nodes": [...]}) or BehaviorTree.CPP XML also works. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tree"
],
"properties": {
"tree": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
],
"description": "The tree: behavior3 JSON: {\"title\": \"...\", \"root\": \"<id of the first node under the root>\", \"nodes\": {\"<id>\": {\"name\": \"<node type>\", \"title\": \"<optional label>\", \"children\": [\"<id>\", ...] (composites, in run order) or \"child\": \"<id>\" (decorators), \"properties\": {...}}}, \"custom_nodes\": [{\"name\": \"IsEnemyVisible\", \"category\": \"condition\"}]}. Positions (\"display\") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({\"trees\": [...], \"custom_nodes\": [...]}) or BehaviorTree.CPP XML also works."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 3, 2026.
What changed in this server's tools since we started watching, newest first. Each change is scanned again.
MakeReturns a linkurl that opens the tree in the behaviortrees.com editor in the user's browser, auto-laid-out and editable, with no account needed. The tree travels inside the link (the URL fragment), so nothing is uploaded or stored. The treeFails mustwith validatethe withoutvalidation errors.errors Giveif the user thetree returnedhas url.any.
CheckChecks a behavior tree for errors before using it:errors: missing or dangling children, nodes with two parents, cycles, decorators with more than one child, leaves with children, unknown node names, and BehaviorTree.CPP import problems. Returns valid (true when there are no errors), the trees found, and findings at error, warning or info level.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"slug": {
"type": "string",
"description": "Guide slug from the list; omit to list them"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"slug": {
"type": "string",
"description": "Guide slug from the list; omit to list them"
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"type": "string",
"description": "Example id from the list; omit to list them"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"type": "string",
"description": "Example id from the list; omit to list them"
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tree",
"to"
],
"properties": {
"to": {
"enum": [
"behavior3",
"btcpp-v4",
"btcpp-v3"
],
"type": "string",
"description": "Target format: behavior3, btcpp-v4 or btcpp-v3"
},
"tree": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"additionalProperties": {}
}
],
"description": "The tree: behavior3 JSON: {\"title\": \"...\", \"root\": \"<id of the first node under the root>\", \"nodes\": {\"<id>\": {\"name\": \"<node type>\", \"title\": \"<optional label>\", \"children\": [\"<id>\", ...] (composites, in run order) or \"child\": \"<id>\" (decorators), \"properties\": {...}}}, \"custom_nodes\": [{\"name\": \"IsEnemyVisible\", \"category\": \"condition\"}]}. Positions (\"display\") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({\"trees\": [...], \"custom_nodes\": [...]}) or BehaviorTree.CPP XML also works."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tree",
"to"
],
"properties": {
"to": {
"enum": [
"behavior3",
"btcpp-v4",
"btcpp-v3"
],
"type": "string",
"description": "Target format: behavior3, btcpp-v4 or btcpp-v3"
},
"tree": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
],
"description": "The tree: behavior3 JSON: {\"title\": \"...\", \"root\": \"<id of the first node under the root>\", \"nodes\": {\"<id>\": {\"name\": \"<node type>\", \"title\": \"<optional label>\", \"children\": [\"<id>\", ...] (composites, in run order) or \"child\": \"<id>\" (decorators), \"properties\": {...}}}, \"custom_nodes\": [{\"name\": \"IsEnemyVisible\", \"category\": \"condition\"}]}. Positions (\"display\") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({\"trees\": [...], \"custom_nodes\": [...]}) or BehaviorTree.CPP XML also works."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tree"
],
"properties": {
"tree": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"additionalProperties": {}
}
],
"description": "The tree: behavior3 JSON: {\"title\": \"...\", \"root\": \"<id of the first node under the root>\", \"nodes\": {\"<id>\": {\"name\": \"<node type>\", \"title\": \"<optional label>\", \"children\": [\"<id>\", ...] (composites, in run order) or \"child\": \"<id>\" (decorators), \"properties\": {...}}}, \"custom_nodes\": [{\"name\": \"IsEnemyVisible\", \"category\": \"condition\"}]}. Positions (\"display\") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({\"trees\": [...], \"custom_nodes\": [...]}) or BehaviorTree.CPP XML also works."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tree"
],
"properties": {
"tree": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
],
"description": "The tree: behavior3 JSON: {\"title\": \"...\", \"root\": \"<id of the first node under the root>\", \"nodes\": {\"<id>\": {\"name\": \"<node type>\", \"title\": \"<optional label>\", \"children\": [\"<id>\", ...] (composites, in run order) or \"child\": \"<id>\" (decorators), \"properties\": {...}}}, \"custom_nodes\": [{\"name\": \"IsEnemyVisible\", \"category\": \"condition\"}]}. Positions (\"display\") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({\"trees\": [...], \"custom_nodes\": [...]}) or BehaviorTree.CPP XML also works."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tree"
],
"properties": {
"tree": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"additionalProperties": {}
}
],
"description": "The tree: behavior3 JSON: {\"title\": \"...\", \"root\": \"<id of the first node under the root>\", \"nodes\": {\"<id>\": {\"name\": \"<node type>\", \"title\": \"<optional label>\", \"children\": [\"<id>\", ...] (composites, in run order) or \"child\": \"<id>\" (decorators), \"properties\": {...}}}, \"custom_nodes\": [{\"name\": \"IsEnemyVisible\", \"category\": \"condition\"}]}. Positions (\"display\") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({\"trees\": [...], \"custom_nodes\": [...]}) or BehaviorTree.CPP XML also works."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tree"
],
"properties": {
"tree": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
],
"description": "The tree: behavior3 JSON: {\"title\": \"...\", \"root\": \"<id of the first node under the root>\", \"nodes\": {\"<id>\": {\"name\": \"<node type>\", \"title\": \"<optional label>\", \"children\": [\"<id>\", ...] (composites, in run order) or \"child\": \"<id>\" (decorators), \"properties\": {...}}}, \"custom_nodes\": [{\"name\": \"IsEnemyVisible\", \"category\": \"condition\"}]}. Positions (\"display\") are optional. Any node name that isn't built in (see list_node_types) must be declared in custom_nodes with a category of action, condition, composite or decorator. A whole project ({\"trees\": [...], \"custom_nodes\": [...]}) or BehaviorTree.CPP XML also works."
}
}
}