parameters
parameters
¶
MCP tools for Houdini parameter operations.
Exposes 14 tools covering parameter get/set, expressions, channel references, locking, schema inspection, and spare parameter creation.
Functions:
| Name | Description |
|---|---|
create_spare_parameter |
Add a spare parameter to a node. |
create_spare_parameters |
Batch-create multiple spare parameters in one call, optionally in a folder tab. |
get_expression |
Get the expression on a parameter. |
get_parameter |
Get the value and metadata of a parameter. |
get_parameter_schema |
Get the template schema for parameter(s) on a node. |
get_parameters |
Read many parameter values at once, matched by name or label substring. |
get_parm_references |
Who references a parameter, and what it references — in one call. |
get_parm_template_tree |
The whole parameter interface as a tree, the way Type Properties shows |
link_parameters |
Create a channel reference from one parameter to another. |
lock_parameter |
Lock or unlock a parameter. |
promote_vop_parameters |
Promote VOP inputs to parameters, as the network editor's Promote Parameter does. |
revert_parameter |
Revert a parameter to its default value. |
set_expression |
Set an expression on a parameter. |
set_parameter |
Set a parameter value. |
set_parameters |
Batch-set multiple parameters on a node, in the order given. |
Functions:¶
create_spare_parameter
async
¶
create_spare_parameter(
ctx: Context,
node_path: str,
parm_name: str,
parm_type: str,
label: str,
default_value: Value | None = None,
min_val: float | None = None,
max_val: float | None = None,
menu_items: list[str | list[str]] | None = None,
) -> dict
Add a spare parameter to a node.
A menu needs its items: a menu without any is refused, not created with
Houdini's "none" placeholder. The reply reads the menu back from the node
(menu_items as [value, label] pairs, default_value as a value).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
str
|
Node path. |
required |
|
str
|
Internal parameter name. |
required |
|
str
|
"float", "int", "string", "toggle", or "menu". |
required |
|
str
|
UI label. |
required |
|
Value | None
|
Default value. For a menu, the default item by value or index. |
None
|
|
float | None
|
Minimum value (float/int only). |
None
|
|
float | None
|
Maximum value (float/int only). |
None
|
|
list[str | list[str]] | None
|
A menu's items, as set_hda_interface takes them: plain strings, or [value, label] pairs such as [["0", "Uniform"], ["1", "By Attribute"]]. |
None
|
create_spare_parameters
async
¶
create_spare_parameters(
ctx: Context,
node_path: str,
parameters: list[dict[str, Any]],
folder_name: str | None = None,
folder_type: str = "Tabs",
) -> dict
Batch-create multiple spare parameters in one call, optionally in a folder tab.
A name that already exists as a spare parameter is updated in place (label, default, range); its current value and keyframes are kept. A type change on an existing parameter is refused.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
str
|
Node path. |
required |
|
list[dict[str, Any]]
|
List of parameter specs. Each dict has keys: parm_name (str), parm_type (str: "float"/"int"/"string"/"toggle"/"menu"), label (str), default_value (optional), min_val (optional), max_val (optional), menu_items (a menu's items: strings or [value, label] pairs, as in create_spare_parameter; default_value then picks one). |
required |
|
str | None
|
If provided, wraps all parameters in a named folder tab. |
None
|
|
str
|
Folder style: "Tabs", "Collapsible", or "Simple". |
'Tabs'
|
get_expression
async
¶
get_parameter
async
¶
get_parameter_schema
async
¶
get_parameter_schema(
ctx: Context,
node_path: str,
parm_name: str | None = None,
filter: str | None = None,
) -> dict
Get the template schema for parameter(s) on a node.
Most nodes have dozens of parameters; many have 100+. Always use
parm_name or filter unless you genuinely need the full list.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
str
|
Node path. |
required |
|
str | None
|
Exact parameter name for a single-parameter lookup. |
None
|
|
str | None
|
Substring to match against parameter name or label (case-insensitive). Use instead of dumping all params. |
None
|
get_parameters
async
¶
get_parameters(
ctx: Context,
node_path: str | None = None,
patterns: list[str] | None = None,
include_defaults: bool = False,
inside: str | None = None,
recursive: bool = False,
node_type: str | None = None,
include_locked_assets: bool = False,
value_contains: str | None = None,
non_default_only: bool = False,
) -> dict
Read many parameter values at once, matched by name or label substring.
The batch counterpart of set_parameters. Several unrelated groups of settings ("flame", "wind", "buoy") come back in one call instead of one call each, and unlike get_node_card these are the live values on this node rather than the defaults for its type.
Pass inside instead of node_path to read the same patterns across a
whole network in one call: "every file parm of this material library,
unexpanded" comes back as rows of {node, parm, value, raw_value}, up to
2000 rows. raw_value is the unexpanded text ($JOB/...), shown when it
differs from the value, exactly as for a single node.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
str | None
|
Node to read. |
None
|
|
list[str] | None
|
Substrings matched against parameter name and label. Omit for
everything, up to the cap. Required with |
None
|
|
bool
|
Also report whether each value is still the default,
and, where it differs, the default ( |
False
|
|
str | None
|
Network to read instead of a single node. |
None
|
|
bool
|
With |
False
|
|
str | None
|
With |
None
|
|
bool
|
With |
False
|
|
str | None
|
Only parameters whose raw text or expression holds this substring (case-insensitive), e.g. inside="/", recursive=True, value_contains="/obj/X": every parameter that still names that node by its absolute path, a deleted one included. A relative "../X" is not "/obj/X": search "X" to catch those. No patterns needed. |
None
|
|
bool
|
Only parameters changed from their defaults, each
with its default: "what was changed on every node of this network"
in one call (with |
False
|
get_parm_references
async
¶
get_parm_references(
ctx: Context,
node_path: str,
parm_name: str | None = None,
direction: str = "both",
limit: int = 200,
include_node_level: bool | None = None,
) -> dict
Who references a parameter, and what it references — in one call.
incoming: for each parameter of the node (or just parm_name), the
parameters elsewhere whose expressions read it — what breaks if this
control is renamed. outgoing: what this node's expressions and
backtick strings read, resolved to parameter paths (pure ch() links and
richer expressions alike; unresolved names a written target that no
longer exists). node_dependents / node_references give the
node-level view for this node only; include_node_level in the reply
says whether they were included.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
str
|
Node to inspect. |
required |
|
str | None
|
One parameter instead of all of them. |
None
|
|
str
|
"both", "incoming" or "outgoing". |
'both'
|
|
int
|
Cap on reported entries. |
200
|
|
bool | None
|
Include node_dependents / node_references. Default: on for a whole-node query, off when parm_name names one parameter; on an asset with hundreds of children those lists run to about 100 KB and answer a question about the node, not the parameter. |
None
|
get_parm_template_tree
async
¶
get_parm_template_tree(
ctx: Context,
node_path: str | None = None,
type_name: str | None = None,
context: str = "Sop",
folder: str | list[str] | None = None,
max_entries: int = 150,
include_tags: bool = False,
) -> dict
The whole parameter interface as a tree, the way Type Properties shows
it: folders (with folder_type — tabs, collapsible, multiparm), every
parameter in order with defaults, default expressions, ranges, menu
items, Hide/Disable When conditionals, callbacks, naming scheme; a
multiparm's default_instances. Each entry uses get_parameter_schema's
keys (default_value, is_hidden, menu_items...).
get_hda_info shows only the top folders and get_parameter_schema flattens the structure away; read this before editing an interface. Give node_path for a node (its instance interface, spares included) or type_name + context for a type.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
str | None
|
Node whose interface to read. |
None
|
|
str | None
|
Node type instead (with context). |
None
|
|
str
|
Category of type_name — "Sop", "Object", "Lop", ... |
'Sop'
|
|
str | list[str] | None
|
Narrow to one folder by label, or a list of nested labels. |
None
|
|
int
|
Cap on entries (depth-first); the reply says when it cut. |
150
|
|
bool
|
Also return each template's tags (needed to preserve them when editing an interface; about a quarter of the size). |
False
|
link_parameters
async
¶
link_parameters(
ctx: Context,
source_path: str,
source_parm: str,
dest_path: str,
dest_parm: str,
replace_existing: bool = False,
) -> dict
Create a channel reference from one parameter to another.
The destination gets an HScript expression that reads the source as its own type: chs() for a String parameter, ch() for numbers, toggles and menus. The path is relative to the destination node (chs("../CTRL/mat")), so the link survives moving the pair, collapsing into a subnet or instancing an HDA. The reply carries the expression, the function used and the destination's evaluated value.
Two ramps (or two multiparms) are linked entry by entry as well, now and
whenever the source gains or loses keys: the opmultiparm links Promote
Parameter makes. The reply lists multiparm_links and follows_source.
Inside an asset, update_hda afterwards to keep the link in its contents.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
str
|
Source node path. |
required |
|
str
|
Source parameter name. |
required |
|
str
|
Destination node path. |
required |
|
str
|
Destination parameter name. |
required |
|
bool
|
Overwrite a destination that already has keyframes or an expression. Refused otherwise, so animation is never lost by accident. A link whose source already reads the destination through ch() is refused as a cycle in every case. |
False
|
lock_parameter
async
¶
promote_vop_parameters
async
¶
Promote VOP inputs to parameters, as the network editor's Promote Parameter does.
Each input gets a Parameter VOP wired in, and its parm appears on the VOP network that owns it (POP VOP, Attribute VOP, ...): the owner is compiled once for the whole batch, and the reply names, per input, the parm and the node it landed on, with its value. Nothing is promoted if any item is wrong; an input that is already wired is refused, not rewired.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
list[dict[str, Any]]
|
One dict per input: node_path (the VOP node), input (its input name, e.g. "input2", "destmin"), and optionally name (the parm name; default the input's), label, kind ("parameter", "constant" or "subnet_input"; default "parameter") and use_input_value (start from the input's current value; default True). |
required |
revert_parameter
async
¶
Revert a parameter to its default value.
A default that is itself an expression comes back, named in
default_expression with its default_expression_language;
expression_error says when it does not evaluate.
A locked parameter cannot be reverted; the error names what sets the lock.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
str
|
Node path. |
required |
|
str
|
Parameter name. |
required |
set_expression
async
¶
set_parameter
async
¶
set_parameter(
ctx: Context,
node_path: str,
parm_name: str,
value: Value,
override_expression: bool = False,
run_callbacks: bool = False,
) -> dict
Set a parameter value.
A parameter that holds an expression does NOT take a literal: Houdini
writes the value into a slot the expression keeps overriding. The reply
then carries expression_kept: true with the surviving expression and
what you requested (plus same_as_evaluated when the expression happens
to evaluate to that value right now) — read those before calling the write
done. Pass override_expression=True to clear the expression first.
A parameter holding a BARE ch() reference is the opposite trap: Houdini
writes THROUGH it into the parameter it reads, so the value lands on
another node. The reply names that parameter in written_through.
Inside a DOP network a write does not reset frames already simulated:
simulation_cache names the network to pass to reset_simulation.
A String parameter echoes raw_value (the unexpanded text, $JOB/...)
next to the expanded new_value.
A list with {"expr": ...} components ("t": [{"expr": "$F"}, 0, 0]) and
a whole ramp ({"keys", "values", "basis"}) go through set_parameters:
this tool's value takes plain values only.
A LOCKED parameter (karmarendersettings resolutiony under res_mode autoheight) takes nothing at all; the error names the menu whose callback sets the lock. Houdini runs such callbacks only from the UI: set that menu with run_callbacks=True first, then the locked parameter.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
str
|
Node path. |
required |
|
str
|
Parameter name. |
required |
|
Value
|
New value (int, float, string, bool, or list). |
required |
|
bool
|
Remove an expression standing in the way, instead of reporting that the write did not take. |
False
|
|
bool
|
Run the parameter's callback script after the write,
as editing it in the UI does ( |
False
|
set_parameters
async
¶
set_parameters(
ctx: Context,
node_path: str,
params: dict[str, Any],
override_expression: bool = False,
run_callbacks: bool = False,
) -> dict
Batch-set multiple parameters on a node, in the order given.
Expressions go in the same call: {"tx": {"expr": "ch('../size')"}} sets an expression, so no set_expression per parameter is needed.
Inside a DOP network a write does not reset frames already simulated:
simulation_cache names the network to pass to reset_simulation.
Parameters that held an expression and therefore ignored the literal are
listed in expressions_kept, with a top-level warning: a batch whose
errors is empty can still contain a write that did not take. Values that
landed on ANOTHER node, because the parameter is a bare ch() reference
Houdini writes through, are in written_through. Each entry in set
carries the same keys as set_parameter's reply. Pass
override_expression=True to clear those expressions and links instead.
Locked parameters are in errors with locked: true and listed in
locked_parms; the error names the menu whose callback sets the lock.
With run_callbacks=True each parameter's callback runs after its write, so
{"res_mode": "manual", "resolutiony": 1080} unlocks and then writes; a
callback that raised is listed in callbacks_not_run.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
str
|
Node path. |
required |
|
dict[str, Any]
|
Mapping of parameter names to values, written in this order.
A value written {"expr": "...", "language": "hscript" | "python"}
is set as an expression, as in build_network, also as one
component of a list ("t": [{"expr": "$F"}, 0, 0]). A ramp takes the
whole ramp at once: {"keys": [0, 1], "values": [[1, 0, 0],
[0, 0, 1]], "basis": "linear"} (one basis or one per key; a
float ramp takes numbers), the shape get_parameter reads it in.
A ramp's |
required |
|
bool
|
Remove expressions standing in the way. |
False
|
|
bool
|
Run each parameter's callback script after its write, as the UI does. |
False
|