Houdini MCP
PYPI · HOUDINI-MCP-SERVER
Connect agents to SideFX Houdini: edit the scene, cook, render, see the viewport, read the docs.
Available components
Last scanned (6 hours ago)
Scores higher than 70% of PyPI servers
Category Design and Media
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 29 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to JTCHE/houdini-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 8 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability57
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 17165 tokens (~858/item across 20 items; 20 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management63
- Stability observed for 19 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (90% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 21 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 21 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.
- 19 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Oct 26 0
- Tool safety: pass → unverified ▼ security
- Stability: 0.33 → unverified ▼ security
- Schema quality: 730 → 858 ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- Package version: 0.7.7 → 0.8.0 functional
- 14 Oct 26 +5
- Stability: unverified → 0.33 ▲ functional
- 12 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- 4 Oct 26 78
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 23 Oct 2026 · Analysed pypi/houdini-mcp-server@0.8.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | JTCHE/houdini-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/JTCHE/houdini-mcp/.github/workflows/release.yml@refs/tags/v0.8.0 |
| Rekor log index | 3262197111 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:3c7b0636d796eb3796446125d60fa54f68754a44834331eb34303ad80b45e2f1 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 29 packages
| Packages resolved | 29 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
batch ~314
Run several Houdini tools in one call. Use it to build a network: many nodes, their wires and their parameters go in one round trip and one undo group, and a person can undo the whole thing with one keystroke. Do not use it when a later step needs to read what an earlier step made. The list runs without you in the middle, so nothing can branch on a result. A failed batch changes nothing. Every step is checked before any step runs, and a step with a wrong argument stops the batch. A step that fails as it runs stops the list, and the steps before it are undone. A step whose item failed is a failed step, and so is a parameter write that did not apply. The error names the index of the step and its error. Returns JSON with one result for each operation, in the order of the operations, and the picture of every capture step. A batch that works cooks the display node of each SOP network that it touched: `check` gives its point and primitive counts, and the touched nodes that have errors. Read it before you build on the result. A capture step with no `output` writes to a file of its own, so one batch can hold several captures.
| Name | Type | Req | Description |
|---|---|---|---|
| operations | array | yes | The steps, in order. Each is {"tool": "<tool name>", "params": {...}}, with the arguments that the tool takes on its own. Any tool of this server except batch. |
No output schema declared.
No examples provided.
capture ~1,732
Make a picture of the scene, or of the network editor, and look at it. Modes: viewport, quad, camera, flipbook, sheet, movie, network. Use it to confirm your own work: numbers in a node do not tell you that the result looks wrong. Use it before you report that a task is done. Do not use it for a final picture: render does that through a ROP. The view goes back to where the user left it when the picture is written. Nothing here changes the scene for good. mode: "viewport" — the viewport as it is now. "quad" — four pictures: top, front, right and perspective. "camera" — through the camera node at `camera`. "flipbook" — a sequence over `frame_range` [start, end]. Returns the path of the files, not a picture. "sheet" — `node` at many frames on one picture, a tile for each frame with its number, all from one camera that does not move. Frames: `frames`, or `count` frames from `start` (the current frame) at `step` (1). A step over 2 hides movement and gives a warning: look at a short range at step 1. `reference` is a picture to put first, to compare. `columns`, `tile_width` set the grid. The frames cook in order, forward, and the result gives the cook seconds of each one. `azimuths` (a list of angles) draws each frame from each angle: one frame and 8 angles is a turntable. `bounds` [xmin, ymin, zmin, xmax, ymax, zmax] is the box to frame, for example the hands only. "movie" — `node` over `frames` or `frame_range` (the playbar range) as an MP4 at `fps`, `resolution` [width] wide. Returns the path; open it in a player. "network" — the network editor as the user sees it: names, wires, dots, comments. `node` is the network to show, `paths` the ite…
| Name | Type | Req | Description |
|---|---|---|---|
| azimuth | number | – | Degrees around the up axis, around what the view frames. 0 looks from the front. Nothing is added to the scene. |
| azimuths | array | – | sheet: a list of angles; each frame is drawn from each angle. |
| background | integer | – | sheet and movie: the grey of the background, 0-255. Smoke reads best on mid grey. |
| bounds | array | – | sheet: [xmin, ymin, zmin, xmax, ymax, zmax], the box to frame. |
| camera | string | – | camera mode: the camera node to look through. On a LOP network with `renderer`, a USD camera prim. |
| color_by | string | – | sheet and movie: colour the points by this attribute, blue at the low end of color_range and red at the high end. A vector uses its length. |
| color_range | array | – | [low, high] for color_by. Without it, [0, 1]. |
| columns | integer | – | sheet: tiles in each row. |
| contour | number | – | sheet: a step. Colour by the fraction of the value over the step, so the lines of equal value show, for example the shells of a distance field. |
| count | integer | – | sheet: how many tiles, when frames is not given. |
| direction | string | – | The view axis: "top", "front", "left", "right", "back", "bottom" or "persp". |
| elevation | number | – | Degrees above the ground, with azimuth. 30 with azimuth 45 is a three-quarter view. |
| fill | number | – | How much of the picture the framed thing takes: 0.9 leaves air around it, 1.0 fills it. |
| fps | number | – | movie: frames per second. |
| frame | string | – | What to frame the view on: "selection", "all", or a node path (the box of what that node cooked). |
| frame_range | array | – | flipbook and movie: [start, end]. |
| frames | – | – | One frame, a list, or {"start": 1, "end": 10, "step": 2}: one picture for each. sheet: the frames of the tiles. The playbar goes back after. A picture that holds only the background is an error. |
| look_from | array | – | [x, y, z]: the point that the view looks from. |
| mode | string | – | One of "viewport", "quad", "camera", "flipbook", "sheet", "movie", "network". |
| node | string | – | The node to look at. It gets the display flag for the picture, and the flag goes back after. The viewer shows its network, and goes back after. Without `frame`, the view also frames it. |
| output | string | – | The file to write. Without it, a temporary file. |
| paths | array | – | network: the items to frame in the network editor. |
| radius | number | – | The distance between target and look_from. |
| reference | string | – | sheet: a picture file to put in the first tile, to compare. |
| renderer | string | – | The Hydra renderer of a viewer on a LOP network, for example "Karma CPU". An unknown name lists the ones available. |
| resolution | array | – | [width, height] in pixels. The height follows the shape of the viewport, so the picture is not stretched. |
| settle | number | – | Seconds that a renderer such as Karma draws before each picture. Karma starts from noise: 20 to 30 gives a clean frame. With frames or in flipbook mode it renders a sequence through the viewport, wit… |
| shading | string | – | One of "smooth", "smooth_wire", "flat", "wireframe". |
| slab | array | – | [axis, thickness], for example ["z", 0.1]: draw only the points in a thin cut through the middle, so the inside of a solid cloud shows. |
| start | number | – | sheet: the first frame. Without it, the current frame. |
| step | number | – | sheet: the frames between tiles. Over 2 hides movement and gives a warning. |
| target | array | – | [x, y, z]: the point that the view turns around. |
| tile_width | integer | – | sheet: the width of each tile in pixels. |
| vectors | number | – | sheet: a scale. Draw a line along the color_by vector from up to about 3000 points. An empty result is an error. |
No output schema declared.
No examples provided.
connect ~491
Change how nodes feed each other. Modes: connect, disconnect, reorder. Use it after node_edit made the nodes. A list of wires goes in one undo group and one round trip. Do not use it to wire a node that you make now: node_edit mode "create" takes `input_path` and wires it in the same call. Do not use it to read the wires: scene_overview mode "network" lists them. mode: "connect" — src_path feeds dst_path. dst_input_index chooses the input, src_output_index the output. Both count from 0. A wire into an input that has one replaces it. Either end can be a network dot. "disconnect" — path loses the wire on input_index. "reorder" — path takes its inputs in the order input_indices. For several wires, give `items`: for "connect", each item has src_path and dst_path, and can have dst_input_index and src_output_index; for "disconnect", each item has path, and can have input_index. Returns JSON, one line for each wire, with the paths that Houdini used. An input index that the node does not have is reported, not dropped.
| Name | Type | Req | Description |
|---|---|---|---|
| dst_input_index | integer | – | connect: the input of dst_path, from 0. |
| dst_path | string | – | connect: the node or network dot whose input takes the wire. |
| input_index | integer | – | disconnect: the input that loses its wire, from 0. |
| input_indices | array | – | reorder: the old input indices in their new order, for example [1, 0]. |
| items | – | – | A list of wires for "connect" or "disconnect", each a dictionary with the keys of one wire, for example {"src_path": "/obj/geo1/grid1", "dst_path": "/obj/geo1/mountain1"}. An argument outside items i… |
| mode | string | – | One of "connect", "disconnect", "reorder". |
| path | string | – | disconnect and reorder: the node whose inputs change. |
| src_output_index | integer | – | connect: the output of src_path, from 0. |
| src_path | string | – | connect: the node or network dot whose output feeds the wire. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
console ~271
Read the Houdini log and the node errors. Use it when something did not do what you expected. A cook error often hides behind an empty result: the geometry has no points, and the reason is here. Do not use it for the errors of nodes that you cook now: cook returns them, with the nodes upstream that failed. scene_overview mode "errors" lists every node with a cook error, without the log. Each call takes the log entries away, so a call returns only what is new since the call before it. Returns JSON.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | How many log entries come back, the newest ones. |
| node_errors | boolean | – | Also report the nodes under root_path that hold an error or a warning. False gives the log alone. |
| node_limit | integer | – | How many nodes with an error or a warning come back. Errors come first, and the report says how many it left out. |
| root_path | string | – | The network that node_errors walks, for example /obj or /stage. |
| severity | string | – | Keep one level only: "message", "important", "warning", "error" or "fatal". |
| source | string | – | Keep the entries whose source holds this text, for example "Python". |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
cook ~834
Force work to happen, and report what the work said and what it cost. Modes: cook, cache_write, cache_clear, sim_step, sim_reset, recook. Use it to run a test: write a few parameters, cook a range of frames, and read the seconds for each frame. That is one call, and it is the loop that every look iteration needs. Do not use it to read the result: geometry_inspect does that, and it cooks the node as well. mode: "cook" — cook the nodes and return the errors, the warnings and the time. `frames` or `frame_range` cooks over more than one frame; the playbar goes back to where it was. "cache_write" — write the file cache of the node. frame_range is [start, end]; without it the node writes its own range. "cache_clear" — remove the cached files of the node. "sim_step" — step a DOP network num_steps frames. "sim_reset" — clear the cache of a simulation, so that the next cook runs it again. It accepts a DOP network and a solver SOP such as a Pyro, FLIP, Vellum or RBD solver. After you change anything inside a solver, reset it: the node gives its old result back with no error and no warning. On a solver SOP it cooks the sources first, cooks the start frame after the reset, and reports the primitives there. It fails when the result is empty while the sources are not: that simulation stays empty on every frame. "recook" — cook again each node at or under `paths` that holds an error or a warning, the deepest first, and say which messages were stale (gone) and which are current. Use it when an error names a cause that the network does not have, such as "Infinite recursion" with no cycle. Cook frames he…
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | – | Cook even when Houdini thinks the node is up to date. |
| frame_range | array | – | [start, end]: every frame between. For cook and cache_write. |
| frames | – | – | One frame, a list of frames, or {"start": 1001, "end": 1010, "step": 2}. For cook. The playbar goes back after. |
| mode | string | – | One of "cook", "cache_write", "cache_clear", "sim_step", "sim_reset", "recook". The description says what each one does. |
| num_steps | integer | – | How many frames sim_step steps the DOP network. |
| parameters | object | – | Values to write before the cook, as {"/obj/geo1/pyro": {"divsize": 0.05}}. The result says which writes changed nothing. |
| paths | – | yes | The node to cook, or a list of nodes. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
docs ~478
Read the official Houdini documentation. This is the authority on every node, parameter, VEX function and HOM call. Read the page before you use an API that you have not confirmed in this session: names and enum members change between Houdini releases, and a wrong one often fails without a message. Do not answer from memory, and do not read sidefx.com yourself. The pages come from the Houdini install on this machine, so they match the build exactly. The first search on a build indexes it once, which takes a few seconds; the index stays on disk. A page read never waits for it. Give exactly one of `query` (search), `page` (read a page from a hit) or `node` (the page of a node type). A node path is the only input that needs Houdini. Returns markdown for a page, JSON for a search.
| Name | Type | Req | Description |
|---|---|---|---|
| build | string | – | The Houdini build to read, for example "21.0.829". Default: the build of the attached session, then $HFS, then the newest build on this machine. |
| category | string | – | query: keep the search inside one folder, for example "nodes/sop", "vex/functions" or "hom/hou". node with a type name: the context, for example "sop" or "lop". |
| limit | integer | – | query: how many hits come back. |
| node | string | – | A node path in the scene, for example "/obj/geo1/attribwrangle1", or a node type name, for example "mountain". Returns the page of that node type. |
| page | string | – | A page path from a hit, for example "nodes/sop/copytopoints". A loose name or a sidefx.com address also works. |
| part | integer | – | A long page comes in parts of about 20,000 characters: 2, 3 and so on read the next ones. |
| query | string | – | Words to search, for example "copy to points". Returns the hits with their page paths. |
| section | string | – | Read only the part of a page under one heading, for example "Quick renders and flipbooks". A long page lists its headings. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
execute ~801
Run code in Houdini, with the full `hou` module and no guard. Modes: python, hscript, expression, vex_check, env, job. Use it for what no other tool covers, and to confirm an API in the live session, for example `print(dir(hou.Node))`. The code runs with the rights of the Houdini process: it can write files, delete nodes and quit Houdini. Do not use it to build a network: one batch of node_edit create, connect and parm_set is also one round trip, and each step reports its errors. `hou.Node.inputs()` skips network dots and gives the node behind them; use `inputConnections()` and `inputItem()` for the real wiring before you rewire or delete. Prefer a named tool when one exists. A write in code to a parameter that holds an expression, that is disabled or hidden, or whose range clamps the value changes nothing, and a write to a channel reference changes another node. The answer lists each such write in `write_warnings`; read it. If you write the same script twice, the named tool for it is missing: say so in the feedback at the end of the session. mode: "python" — run `source` as Python. Returns stdout and stderr, and keeps them when the script raises. Print what you want to see: the value of the last line does not come back. "hscript" — run `source` as an HScript command. "expression" — evaluate `source` as an expression. `language` is "hscript" or "python". "vex_check" — compile `source` as VEX and report the errors. Nothing runs. "env" — read the Houdini variable `name`, for example "HIP". "job" — the state of the background job `job`: running, with what it printed so far, or done, with its result. `wait` waits for the end, up to that many seconds. Use `file` for a script that you run again with other values. Houdini answers nothing while a script runs: for long work, such as a sweep, use `background` wi…
| Name | Type | Req | Description |
|---|---|---|---|
| args | array | – | file: the values of sys.argv[1:]. |
| background | boolean | – | python: return at once with a job id and let the script run. Read it with mode job. Until it ends, other calls are refused. |
| file | string | – | A Python file to run instead of source, as from a shell: __file__ is its path, __name__ is "__main__", args are in sys.argv[1:]. The text travels once. |
| globals | object | – | Names that exist before the script runs, for example {"radius": 2.0}. |
| job | string | – | job: the job id that background returned. |
| language | string | – | expression: "hscript" or "python". |
| mode | string | – | One of "python", "hscript", "expression", "vex_check", "env", "job". |
| name | string | – | env: the Houdini variable to read, for example "HIP". |
| source | string | – | The code: Python, HScript, an expression or VEX, as mode says. |
| timeout | number | – | The seconds the script may run. Past it, the script stops where it is, the answer says where, and what it changed stays. |
| wait | number | – | job: the most seconds to wait for the job to end. The answer comes when it ends or when the wait is over, with what it printed so far. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
geometry_inspect ~2,286
Read the geometry that a node produces. This cooks the node. Modes: summary, points, prims, attrib, groups, group_members, bbox, intrinsics, nearest, skeleton, compare, try, volume_stats, volume_voxels, volume_sample, volume_compare, image, volume, export, fingerprint, stretch, inside, crossings. Use it to confirm that a node made what you expected: the point count, an attribute that a wrangle wrote, the shape of a volume, the size of the bounding box. Do not use it to read parameters: node_inspect does that. mode: "summary" — counts, attributes, groups, volumes, bounds. Start here. An empty result carries the errors and the warnings of the node, which is where the reason is. "points" — `count` points from `start`, with `attribs`. "prims" — `count` primitives from `start`. "attrib" — the values of `attrib_name` on `attrib_class` ("point", "prim", "vertex", "detail"): min, max and mean of each component over every element, and `limit` (10) values from `start`. A vector attribute keeps its shape. unique=True returns each value that occurs and how many elements carry it, which is how you find the pieces in a geometry. "groups" — the groups of `group_type`. "group_members" — the members of `group_name`. "bbox" — the bounding box. "intrinsics" — the intrinsic values of primitive `prim_index`. "nearest" — the point nearest to `position`, for example [0,1,0]. "skeleton" — a KineFX skeleton: each joint with its name, its parent and its transform. `pattern` keeps the names that match ("|" between alternatives, * as a wildcard). A KineFX import holds the skeletons on output 1 and 2: give `outpu…
| Name | Type | Req | Description |
|---|---|---|---|
| against | string | – | compare: the node to compare with. volume_compare: the field whose bands hold the field `name`. fingerprint: the name of a saved fingerprint to compare with. stretch: the rest mesh. inside: the close… |
| attrib_class | string | – | attrib, try: "point", "prim", "vertex" or "detail". |
| attrib_name | string | – | attrib, try: the attribute to read. try reads it on the result. |
| attribs | array | – | points: the attributes to return, for example ["P", "Cd"]. |
| bins | – | – | volume_stats, volume_sample, volume_compare: a count of equal bands, or a list of band edges, for example [-1, 0, 0.05, 0.15, 0.25]. |
| count | integer | – | points, prims: how many elements. Keep it small: a large read is slow. |
| file | string | – | export: the file path to write. |
| format | string | – | export: the file type, for example "obj" or "bgeo". |
| frames | – | – | Read at other frames, without moving the playbar: one frame, a list, or {"start": 1001, "end": 1010, "step": 2}. One answer for each frame. |
| from_node | string | – | volume_sample: read at the points of this node. volume_compare: the node that holds `against`, such as a collider SDF. |
| group_name | string | – | group_members: the group to read. |
| group_type | string | – | groups, group_members: "point", "prim", "vertex" or "edge". |
| limit | integer | – | attrib: how many values (10). volume_voxels: how many numbers before the array is thinned. volume_sample: return the values when there are at most this many (1000). stretch: how many of the worst edg… |
| match_attrib | string | – | compare: the attribute that pairs the points of the two nodes, not their order. |
| mode | string | – | One of "summary", "points", "prims", "attrib", "groups", "group_members", "bbox", "intrinsics", "nearest", "skeleton", "compare", "try", "volume_stats", "volume_voxels", "volume_sample", "volume_comp… |
| name | string | – | volume_stats: one volume to read. volume_voxels, volume_compare: the field. fingerprint: save the result under this name. |
| names | array | – | volume_sample: the fields to read. |
| output | – | – | The output of the node to read, 0 by default. A KineFX import has the mesh on 0, the rest skeleton on 1, the animated skeleton on 2. |
| path | – | yes | The SOP or COP node to read, or a list. A list keeps going after a node that fails, and each result names its path. |
| pattern | string | – | skeleton: keep the joints whose name matches. |
| plane_name | string | – | image: the COP plane to read, for example "C". |
| position | array | – | nearest: [x, y, z]. |
| positions | array | – | volume_sample: the [x, y, z] points to read at. |
| prim_index | integer | – | intrinsics: the primitive to read. |
| reduce | string | – | volume_voxels: one answer instead of the array: "sum", "mean", "max", "min", "project_x", "project_y" or "project_z". |
| renamed | object | – | fingerprint: {"old path": "new path"} for the nodes that a refactor renamed or moved. |
| split_by | string | – | crossings: a prim attribute, such as "name", whose values are the parts that the count pairs. |
| start | integer | – | points, prims, attrib: the first element. Page with it. |
| steps | array | – | try: a list of {"node_type": ..., "parameters": {...}} to run on the geometry. A menu takes its token or its index. Nothing changes in the scene. |
| threshold | number | – | volume_stats, volume_sample: count the voxels below and above it. volume_stats also gives the world box of the voxels above it. stretch: the growth to count, 0.1 (10 %) by default. inside: count the… |
| unique | boolean | – | attrib: return each value that occurs and how many elements carry it. That is how you find the pieces in a geometry. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
hda ~573
Read and change Houdini digital assets. Modes: list, get, install, uninstall, reload, update, create, sections, section_get, section_set. Use it when a node type comes from a .hda file: to find the file, to load a new one, or to read the scripts and the help inside it. Do not use it for the parameters of one node in the scene: node_inspect does that. mode: "list" — the installed assets. `category` filters, for example "Sop". "get" — the definition of `node_type`: the file, the version and the tools. "install" — load the .hda file at `file_path` into the session. "uninstall" — unload the .hda file at `file_path`. "reload" — read the .hda file at `file_path` again, after an edit on disk. "update" — save the node at `node_path` back into its asset. "create" — make an asset from the subnet at `node_path`, with `name`, `label` and `file_path`. "sections" — the section names inside `node_type`. "section_get" — the text of `section_name`, for example "PythonModule". "section_set" — write `content` into `section_name`. Returns JSON. "install" and "uninstall" change every node of that type in the session.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | list: keep one node category, for example "Sop". |
| content | string | – | section_set: the text to write into the section. |
| file_path | string | – | install, uninstall, reload: the .hda file. create: the file to write. |
| label | string | – | create: the name that the TAB menu shows. |
| mode | string | – | One of "list", "get", "install", "uninstall", "reload", "update", "create", "sections", "section_get", "section_set". |
| name | string | – | create: the type name of the new asset. |
| node_path | string | – | update: the node to save into its asset. create: the subnet to make an asset from. |
| node_type | string | – | get, sections, section_get, section_set: the asset type, as list names it, for example "labs::edge_damage::1.0", or with its category, "Sop/labs::edge_damage::1.0". |
| section_name | string | – | section_get, section_set: the section, for example "PythonModule". |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
node_edit ~1,819
Change the nodes in a network. One item, or a list in one undo group. Modes: create, delete, copy, move, rename, flags, color, layout, insert, place_chain, wrangle, material, assign_material, take, current_network, note, box, split. Use it to build a network. Then use parm_set for the values, and connect for the wires. Do not compute positions: create with input_path, insert and place_chain place the nodes the way the user lays out a graph, move a node of the user only down to make room, and return every node that moved with its old and new position. Each returns the layout faults it sees. Do not use it to set parameters: parm_set does that, and it reports a write that had no effect. mode, and the arguments that each mode reads: "create" — node_type, parent_path, name, position, parameters, input_path. context selects the network kind: "sop" (default), "cop", "chop", "lop", "material_network". "delete" — path or paths: nodes, dots, sticky notes or network boxes. A node that still feeds a node outside paths is refused, with the list of its readers, unless force=true. "copy" — paths (or path), destination_path, suffix, names. Copies a set of nodes with the wires between them; a wire from outside the set goes to the same node. suffix is added to each name, or names maps a source path or name to a new name. Returns `copies`, each source path with the path of its copy: use that map, never the order of a list. Without destination_path the copies go to the right of the sources. "move" — path with destination_path to put it in another networ…
| Name | Type | Req | Description |
|---|---|---|---|
| bypass | boolean | – | flags: the bypass flag. |
| code | string | – | wrangle: the VEX snippet. |
| code_file | string | – | wrangle: read the VEX from this file, so a long snippet travels once. |
| color | array | – | color, note, box: [r, g, b] from 0 to 1. |
| context | string | – | create: the network kind, "sop" (default), "cop", "chop", "lop" or "material_network". |
| destination_path | string | – | copy, move: the network to put the nodes in. |
| display | boolean | – | flags: the display flag. |
| force | boolean | – | delete: delete a node that still feeds a node that stays. |
| input_index | integer | – | place_chain: the input of reader that the chain feeds. |
| input_path | string | – | create: the node that feeds the new node. It saves a connect call and places the node under its input. insert: the node whose output wires get the new node. |
| items | – | – | A list of items for a repeated action, each a dictionary with the keys of one call. An argument outside items is the default for each one. |
| material_path | string | – | assign_material: the material node. |
| material_type | string | – | material: the shader type, for example "principledshader". |
| mode | string | – | One of "create", "delete", "copy", "move", "rename", "flags", "color", "layout", "insert", "place_chain", "wrangle", "material", "assign_material", "take", "current_network", "note", "box", "split". |
| name | string | – | create, material: the name of the new node. take: the name of a new take. |
| names | object | – | copy: a new name for each source, by source path or name. |
| new_name | string | – | rename: the new name. |
| node_type | string | – | create: the node type, for example "box" or "attribwrangle". |
| parameters | object | – | create, material: values to set on the new node, by parameter name. |
| parent_path | string | – | create, wrangle, note: the network that gets the new node. |
| path | string | – | The node to change. layout: the network. delete: a node, a sticky note or a network box. |
| paths | array | – | copy: the nodes to copy. delete: the nodes to delete together. layout: place only these nodes. place_chain: the chain, in order. box: the nodes to put in the box. |
| position | array | – | create, move, note: [x, y] on the canvas. |
| reader | string | – | insert: only the wires into this node. place_chain: the node that the chain feeds. |
| render | boolean | – | flags: the render flag, which is not the display flag. |
| replace | array | – | wrangle: edit the snippet in place, a list of {"old": ..., "new": ...}. Each old must appear exactly once. |
| stages | object | – | split: {"stage name": ["node", ...]}, the nodes of `path` for each subnet. |
| suffix | string | – | copy: text added to the name of each copy. |
| take_name | string | – | take: the take to make current. |
| text | string | – | note: the text of the note. box: the comment of the box. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
node_inspect ~1,054
Read one node, or a list of nodes, without changing anything. Modes: info, parms, schema, changed, names, expression, keyframes, code, cook_chain, explain, material, image, channels, simulation, render_settings, cache, time_dependency, validate, layout, readers. Use it before you write: to confirm a parameter name, to see whether a parameter carries an expression, and to read what a node reports after a cook. Do not use it to list a network: scene_overview does that. mode: "info" — type, inputs, outputs, flags, changed parameters. "parms" — every parameter, or one parameter when you give `parm`. The result says whether the value comes from an expression. "schema" — the parameter templates: types, ranges, menus. Read this before you write a menu parameter. "changed" — only the parameters that a person set: not at the default, or with an expression or keys. Folders, labels, buttons and hidden fields are left out, and a ramp is one entry with its keys. "names" — the names of the parameters, and nothing else. Read this first when you do not know the name to write. "expression" — the expression on `parm`, and its language. "keyframes" — the keys on `parm`. "code" — the VEX snippet in a wrangle node. "cook_chain" — what this node cooks from, upstream. "explain" — a short account of what the node does here. "material" — the shader parameters of a material node. "image" — the COP node: resolution, planes, data type. "channels" — CHOP channels. `channel`, `start` and `end` read the samples of one channel. "simulation" — the DOP network. `object_name` reads one object, with `field_name` one fie…
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | – | channels: the CHOP channel whose samples to read. |
| end | number | – | channels: the last sample frame. |
| field_name | string | – | simulation: the field of object_name to read. |
| fields | array | – | parms, changed: keep only these keys of each parameter, for example ["value", "expression"]. The name is always kept. |
| frames | – | – | Read at another frame, or at several: one frame, a list, or {"start": 1, "end": 10, "step": 2}. With time_dependency, time each node. The playbar goes back after. |
| has_expression | boolean | – | parms: keep only the parameters that carry an expression. |
| include_all_parms | boolean | – | info: list every parameter, not only the ones that changed. |
| mode | string | – | One of "info", "parms", "schema", "changed", "names", "expression", "keyframes", "code", "cook_chain", "explain", "material", "image", "channels", "simulation", "render_settings", "cache", "time_depe… |
| object_name | string | – | simulation: the DOP object to read. |
| parm | string | – | parms, expression, keyframes, readers: the parameter name. |
| paths | – | yes | One node path, or a list. A list keeps going after a node that fails, and each result names its path. |
| pattern | string | – | parms, changed: keep the parameters whose name or label holds this text or matches it as a glob. "|" separates alternatives: "time|step|cfl". |
| start | number | – | channels: the first sample frame. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
parm_set ~1,385
Write parameter values, or press a button. One write, or a list in one undo group. Modes: value, press, expression, keyframe, keyframes, delete_keyframe, revert, lock, link, spare, render_settings, chop_export, snapshot, restore, diff. Use it after node_inspect has confirmed the parameter name and the type. A write can be accepted and change nothing, and Houdini says nothing. This tool looks for all six causes and names the one it found: - the parameter carries an expression, which still decides the value; - the parameter is animated, so the value became a new key; - the parameter is locked; - another parameter disables or hides it, so the cook does not read it; - a strict range clamped the value; - the parameter reads another node through a channel reference, so the write would change that other node. It is refused; give `follow_reference=true` to write the node at the other end. Read `warnings` and `not_applied` in the result before you report success. mode, and the arguments that each mode reads: "value" — path, parm, value. Or path and parameters, a dictionary of several names and values. A menu takes its token, for example "custom". A bit-field menu takes a token or a list of them. "press" — path, parm: press a button, for example Save to Disk on a File Cache, Reload on a File SOP, or Resimulate on a solver. The result holds the errors and the warnings of the node after the press, because work that a button starts fails later and in silence. "expression" — path, parm, expression, language ("hscript" or "python"). "keyframe" — path, parm, frame, value. "keyframes" — path, parm, keyframes: a list of {frame, value}. "delete_keyframe" — path, parm, frame. "revert"…
| Name | Type | Req | Description |
|---|---|---|---|
| channel_name | string | – | chop_export: the channel that drives the parameter. |
| chop_path | string | – | chop_export: the CHOP node. |
| default | – | – | spare: the default of one control. |
| expression | string | – | expression: the expression text. |
| follow_reference | boolean | – | Write the node at the other end of a channel reference. Without it, a write through a reference is refused. |
| frame | number | – | keyframe, delete_keyframe: the frame of the key. |
| items | – | – | A list of writes, each a dictionary with the keys of one call. An argument outside items is the default for each one. |
| keyframes | array | – | keyframes: a list of {frame, value}. |
| label | string | – | spare: the label of one control. |
| language | string | – | expression: "hscript" or "python". |
| locked | boolean | – | lock: true locks the parameter, false unlocks it. |
| mode | string | – | One of "value", "press", "expression", "keyframe", "keyframes", "delete_keyframe", "revert", "lock", "link", "spare", "render_settings", "chop_export", "snapshot", "restore", "diff". |
| name | string | – | spare: the name of one control. snapshot, restore, diff: the record on disk. |
| parameters | – | – | value: several names and values in one write, as a dictionary. spare: the list of controls to add. |
| parm | string | – | The parameter name, for example "tx" or "divsize". |
| parm_type | string | – | spare: the type of one control, for example "float" or "toggle". |
| path | string | – | The node that holds the parameter. |
| paths | array | – | snapshot: the nodes to save; "/obj/geo1/*" names every node in a network. restore: put back only these nodes. |
| settings | object | – | render_settings: the ROP parameters to write, by name. |
| src_parm | string | – | link: the parameter to follow. |
| src_path | string | – | link: the node to follow. |
| value | – | – | value, keyframe: the value to write. A menu takes its token. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
pdg ~299
Cook a TOP network, and read what its work items did. Modes: status, workitems, cook, dirty, cancel. Use it for a TOP network only. A TOP node does not cook like a SOP: it makes work items, and each item runs on its own. For a SOP or a DOP, use cook. For a ROP, use render. mode: "status" — the counts for each state, and whether a cook runs now. "workitems" — the items. `state` filters, for example "failed". "cook" — start the cook. The call comes back at once; read "status" after it to follow the work. "dirty" — mark the node dirty. `dirty_all` also removes the outputs on disk. "cancel" — stop the cook that runs now. Returns JSON. A failed item holds the command and the log path: read those before you change the network.
| Name | Type | Req | Description |
|---|---|---|---|
| dirty_all | boolean | – | dirty: also remove the outputs of the node on disk. |
| mode | string | – | One of "status", "workitems", "cook", "dirty", "cancel". |
| path | string | yes | The TOP network or the TOP node. |
| state | string | – | workitems: keep the items in this state, for example "failed" or "cooked". |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
playbar ~328
Read or set the time of the session. Modes: get, frame, range, playback, play. Use it before you read geometry that changes over time: a SOP cooks at the current frame, so the frame decides what you see. Do not use it only to read another frame: geometry_inspect, node_inspect and stage_inspect take `frames` and put the playbar back after. A frame that you set here stays for the person and for every later call, and "range" also changes what a flipbook covers, and a ROP whose range follows $FSTART and $FEND. mode: "get" — the current frame and time. "frame" — go to `frame`. "range" — set the scene frame range to `start` and `end`. "playback" — set the playback range inside the scene range. "play" — `action` is "play", "stop", "next", "previous", "start" or "end". Playback needs a GUI. Returns JSON.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | play: "play", "stop", "next", "previous", "start" or "end". |
| end | number | – | range and playback: the last frame. |
| frame | number | – | frame: the frame to go to. |
| mode | string | – | One of "get", "frame", "range", "playback", "play". |
| start | number | – | range and playback: the first frame. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
render ~842
Start a render, read its settings, or watch it run. Modes: start, progress, settings, create, watch, stats, compare. Use it for a final picture through a ROP node. For a fast look at the viewport, use capture instead: it is much quicker. mode: "start" — render the ROP at `path`. `frame_range` is [start, end]; without it the node renders its own range. `output_path` and `res_scale` hold for this render only: the ROP keeps the output and the size of the user. Use them for test renders. `wait=true` returns when every image is complete (husk ended; up to about 28 minutes), with the render stats of the last one. Without wait, husk can go on after the call. "progress" — what the ROP reports about the render. "settings" — the output file, the camera, the resolution and the range of the ROP; the render delegate that really runs (`engine` cpu or xpu, and `engine_from`: the ROP renderer, else husk:default_delegate on the render settings prim); a warning when a Karma settings node says another engine; and the changed Karma settings, split into the ones that engine reads and the ones it ignores, with the reason. Karma XPU shows the CPU Quality controls and ignores them; its Limits tab counts. parm_set and execute warn on a write that the engine of the node ignores. "create" — make a ROP of `render_type` ("opengl", "karma", "mantra", "ifd", …) named `name` under `parent_path`. "watch" — count the husk and mantra processes on this machine, and say whether the file at `output_path` is there and how big it is. This mode does not need Houdini, so it also works while Houdini is busy with the render.…
| Name | Type | Req | Description |
|---|---|---|---|
| frame_range | array | – | start: [start, end] or [start, end, step]. Without it the ROP renders its own range. |
| mode | string | – | One of "start", "progress", "settings", "create", "watch", "stats", "compare". |
| name | string | – | create: the name of the new ROP. |
| output_path | string | – | start: the image file for this render only (put $F4 in it for a range). watch, stats, compare: the image file. |
| parent_path | string | – | create: the network that gets the ROP. |
| path | string | – | start, progress, settings: the ROP node. |
| reference | string | – | compare: the image to compare `output_path` with. |
| render_type | string | – | create: the ROP kind, for example "opengl", "karma", "mantra" or "ifd". |
| res_scale | number | – | start: a fraction of the resolution for this render only, 0.5 is half. |
| wait | boolean | – | start: return when every image is complete, with its render stats. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
scene_file ~294
Read, save or load the scene file, or step its undo history. Modes: info, save, load, undo, redo. Use "save" before a change that is hard to undo, and use "info" to learn whether the session holds work that is not saved. mode: "info" — the file name, the frame range, the counts, and whether the session has changes that are not saved. "save" — save to `path`, or over the open file when `path` is empty. "load" — open the .hip file at `path`. Everything in the session goes away, and the undo history with it. "undo" — undo `count` steps. Each call of a tool that changes the scene is one step. A batch is one step, except a batch with a step that waits (capture, render): there each step is one. Returns the labels it undid and the next ones. "redo" — redo `count` steps. Returns JSON.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | undo and redo: how many steps. |
| mode | string | – | One of "info", "save", "load", "undo", "redo". |
| path | string | – | save: the file to write; empty saves over the open file. load: the .hip file to open. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
scene_overview ~727
List what the scene holds. Start here, before you touch a node. Modes: scene, network, children, search, node_types, errors, materials, lights, takes, caches, render_nodes, viewports, changes. Use it to find a node path, to see the shape of a network, or to learn which node types this Houdini has. Do not use it to read one node in detail: node_inspect does that. Do not use it to read geometry: geometry_inspect does that. mode: "scene" — file, frame range, counts, and the top of the tree. "network" — the children of one network by name, with their wires, flags and dots. Each input names the dot it comes through, then the node behind the dot. `pattern` and `node_type` keep some nodes; compact=True gives only the wires. "children" — the children of `path`. recursive=True walks down. "search" — nodes whose name matches `pattern`, under `path`. node_type filters by type name. "node_types" — the node types this Houdini has, for one `category` such as "Sop", "Object", "Lop", "Driver". `pattern` keeps the names or labels that match. "errors" — every node under `path` that has a cook error. "materials" — the materials in `path` (default /mat) and the types. "lights" — the lights on the USD stage of the LOP node `path`. "takes" — the takes, and which take is current. "caches" — file caches under `path` and their state on disk. "render_nodes" — the ROP nodes in /out. "viewports" — the panes, and what the scene viewer shows. "changes" — what the user changed in the network `path` since your last call: nodes added, deleted, renamed or moved, wires, flags and parameter values. Your own changes are not listed. The first call starts to watc…
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | node_types: the context, for example "Sop", "Object", "Lop" or "Driver". |
| compact | boolean | – | network: return only the wires, one line each. |
| mode | string | – | One of "scene", "network", "children", "search", "node_types", "errors", "materials", "lights", "takes", "caches", "render_nodes", "viewports", "changes". |
| node_type | string | – | search, network: keep the nodes of this type, for example "null". |
| path | string | – | A node path such as "/obj" or "/obj/geo1": the network to list or to search. |
| pattern | string | – | search: the name to match, with * and ? as wildcards. network, node_types: keep the names that match; "|" separates alternatives, for example "*retarget*|*ik*". |
| recursive | boolean | – | children: also list the children of the children. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
select ~142
Read the node selection, or set it. Use it to see what the person works on before you change the scene, and to show them your result when you are done. Do not use it to find nodes: scene_overview mode "search" does that. A path is the full path of a node, for example "/obj/geo1/mountain1". A path that is not a node stops the call with an error, and the selection stays as it was. Returns JSON with the selected paths.
| Name | Type | Req | Description |
|---|---|---|---|
| paths | – | – | Leave it out to read the selection. One path or a list of paths replaces it. An empty list clears it. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
session ~719
Report the Houdini sessions, choose one, or start, stop or interrupt one. Actions: status, list, attach, detach, interrupt, start, start_gui, stop. Use it first when a tool says that Houdini is not reachable, and use it to learn the Houdini version before you use an API that changed between releases. Several Houdini sessions can listen at the same time: the graphical one that holds the work of the user, and a headless one for your own tests. Every tool result names the session that answered, in `_session`. Read that line when a scene looks empty or wrong: an empty scene is usually the wrong session, not a lost scene. Do not use it to read the scene: scene_overview does that. action: "status" — the session that the bridge talks to now, the other sessions, and the port. Starts nothing, and always answers. "list" — every Houdini that runs, with its version, its process id, its .hip file, whether it has a window and whether it answers; and the Houdini versions installed. "attach" — send every later command to the Houdini on `port`. Use it when "list" shows more than one. "detach" — forget the attached port and let the bridge choose again. "interrupt" — stop the call that runs now in the attached Houdini, or in the one on `port`: a script past its budget, a loop that will not end. Houdini answers again after it. A single long cook does not return to Python; then, in a Houdini with a window on Windows, it sends Escape to the window, as the user would. A stopped simulation keeps a partial cache. "start" — start a headless Houdini (hython) and attach to it. `version` chooses the release, for example "21.0" or "21.0.829"; without it, the version of the Houdini window that runs. A…
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | One of "status", "list", "attach", "detach", "interrupt", "start", "start_gui", "stop". |
| hip | string | – | start_gui: the .hip file to open. |
| port | integer | – | attach: the port of the Houdini to talk to, from list. interrupt: the Houdini to interrupt, when not the attached one. |
| version | string | – | start and start_gui: the Houdini release, for example "21.0" or "21.0.829". |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
stage_inspect ~687
Read the USD stage at a LOP node. This cooks the node. Modes: stage, prims, prim, search, layer, attribute, composition, variants, stats, modified, lights, transform. Use it in a Solaris (LOP) network to see the prims, the layers and the composition that a node produces. Do not use it for SOP geometry: geometry_inspect does that. mode: "stage" — the stage: prim count, layers, the default prim. "prims" — the prim tree from `root_prim`, `max_depth` deep. "prim" — one prim at `prim_path`. include_attrs=True adds its attributes. "search" — prims whose path matches `pattern`, filtered by `type_name` such as "Mesh" or "SphereLight". "layer" — the layer stack, and the layer at `layer_index`. "attribute" — the value of `attr_name` on `prim_path`. "composition" — where the opinions on `prim_path` come from: each layer of its prim stack, strongest first, with the node that wrote it (the SOP behind an op: layer) and its references and payloads. "variants" — the variant sets on `prim_path` and the selection. "stats" — counts under `prim_path`. "modified" — the last `count` prims that this node changed. Use it to see what one LOP did. "lights" — the lights on the stage. "transform" — where `prim_path` is in the world: translate, rotate and scale composed through every parent. With `frames`, the path of a moving prim. Returns JSON.
| Name | Type | Req | Description |
|---|---|---|---|
| attr_name | string | – | attribute: the attribute to read, for example "points". |
| count | integer | – | modified: how many prims come back. |
| frames | – | – | Read at another frame, or at several: one frame, a list, or {"start": 1, "end": 10, "step": 2}. The playbar goes back after. |
| include_attrs | boolean | – | prim: also return the attributes of the prim. |
| layer_index | integer | – | layer: which layer of the stack, from 0 (the strongest). |
| max_depth | integer | – | prims: how many levels of the tree come back. |
| mode | string | – | One of "stage", "prims", "prim", "search", "layer", "attribute", "composition", "variants", "stats", "modified", "lights", "transform". |
| path | string | yes | The LOP node whose stage to read. |
| pattern | string | – | search: the prim path to match, with * as a wildcard. |
| prim_path | string | – | prim, attribute, composition, variants, stats, transform: the prim, for example "/world/geo/rock". |
| root_prim | string | – | prims: the prim where the tree starts. |
| type_name | string | – | search: keep the prims of this type, for example "Mesh" or "SphereLight". |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
How do I install the Houdini MCP server?
Houdini MCP runs locally as a PyPI package, launched with uvx houdini-mcp-server. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · houdini-mcp-server
claude mcp add jtche-houdini-mcp -- uvx houdini-mcp-server
What is the Houdini MCP server?
Houdini MCP is listed in the public MCP registry as io.github.JTCHE/houdini-mcp. Connect agents to SideFX Houdini: edit the scene, cook, render, see the viewport, read the docs. This page covers its PyPI package (houdini-mcp-server).
Is the Houdini MCP server safe to use?
Houdini MCP scores 71 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 23 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Houdini MCP server expose?
Houdini MCP exposes 20 tools: batch, capture, connect, console, cook, and 15 more. Their descriptions and schemas cost roughly 16,076 tokens of context every time the server is loaded.
Is the Houdini MCP server still maintained?
Houdini MCP is still listed as active in the MCP registry. We last reached this channel on 23 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Houdini MCP server under?
Houdini MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.