Fxhoudinimcp MCP Server

fxhoudinimcp PyPI v2.10.0

Published by healkeiser — no publish provenance, so origin is unverified, but the source is public: the repository link below is self-declared yet readable, so you can inspect the code before adopting it.

Comprehensive MCP server for SideFX Houdini with 179 tools covering SOPs, LOPs/USD, DOPs, PDG/TOPs, COPs, HDAs, animation, rendering, VEX, and more

Trust grade
A
93/100
Last scanned get badge →
Trust
A · 93/100
Adoption risk for you: the threat score, then adjusted down for blast radius, publisher verification and how much the scan could see. Deterministic; every point is auditable.
Capability
High
Blast radius if it went rogue — what the server’s tools could reach. Independent of trust.
Coverage
Source
How much the scan could actually inspect. Shallow coverage is stated, never hidden.
Share this Trust Score
𝕏 Share LinkedIn Reddit
A Why this grade threat 100 − adoption risk = 93/100

The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.

1. Threat score — 100 − 0 = 100. What the published surface and source actually contain:

The deterministic scan raised no scored threat in the surface it inspected — the threat score stayed at 100. Capability observations and advisory notes are recorded but never lower it.

2. Client adoption risk — 100 − 7 = 93. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:

PointsAdoption-risk factor
−6 capability blast radius (high) — client exposure if the model is manipulated
−1 publisher verification (public source) — no provenance, but the source is public and inspectable

Capability observations and info notes are shown under Findings but never scored. Open any row's finding below for the file, line and evidence behind a deduction.

Findings 10

high Shell/command execution in server code (python/fxhoudinimcp/install.py)MTC-SRC-002

In the server's implementation (`python/fxhoudinimcp/install.py:255`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: try: result = subprocess.run( ["claude", "mcp", "get", SERVER_NAME], capture_output=True, text=Tru

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server python/fxhoudinimcp/install.py

high Shell/command execution in server code (python/fxhoudinimcp/uninstall.py)MTC-SRC-002

In the server's implementation (`python/fxhoudinimcp/uninstall.py:163`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: ntable}"] result = subprocess.run(argv, capture_output=True, text=True) if result.returncode == 0: retu

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server python/fxhoudinimcp/uninstall.py

low Dynamic code execution in packaging/dev tooling (houdini/scripts/python/fxhoudinimcp_server/handlers/code_handlers.py)MTC-SRC-001

In a packaging/dev/install script (shipped, but not the server runtime) (`houdini/scripts/python/fxhoudinimcp_server/handlers/code_handlers.py:104`): Evaluating strings as code is the most direct RCE primitive; if any tool input reaches it, the server executes attacker-chosen code. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: y: result = eval(return_expression, namespace) # noqa: S307 except Exception: eval_erro

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server houdini/scripts/python/fxhoudinimcp_server/handlers/code_handlers.py

low Dynamic code execution in packaging/dev tooling (tests/test_menu.py)MTC-SRC-001

In a packaging/dev/install script (shipped, but not the server runtime) (`tests/test_menu.py:107`): Evaluating strings as code is the most direct RCE primitive; if any tool input reaches it, the server executes attacker-chosen code. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: tartup try: exec(compile(code, item_id, "exec"), {}) finally: for name, module in saved.items():

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server tests/test_menu.py

low Shell/command execution in packaging/dev tooling (houdini/scripts/python/fxhoudinimcp_server/handlers/code_handlers.py)MTC-SRC-002

In a packaging/dev/install script (shipped, but not the server runtime) (`houdini/scripts/python/fxhoudinimcp_server/handlers/code_handlers.py:59`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: e code is executed via `exec()` in a namespace that has `hou` pre-imported. If *return_expression* is given it is e

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server houdini/scripts/python/fxhoudinimcp_server/handlers/code_handlers.py

low Shell/command execution in packaging/dev tooling (houdini/scripts/python/fxhoudinimcp_server/handlers/shelf_handlers.py)MTC-SRC-002

In a packaging/dev/install script (shipped, but not the server runtime) (`houdini/scripts/python/fxhoudinimcp_server/handlers/shelf_handlers.py:215`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: : hou} try: exec(script, namespace) # noqa: S102 - running SideFX's own tool script except AttributeErr

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server houdini/scripts/python/fxhoudinimcp_server/handlers/shelf_handlers.py

low Shell/command execution in packaging/dev tooling (tests/integration/bridge_e2e.py)MTC-SRC-002

In a packaging/dev/install script (shipped, but not the server runtime) (`tests/integration/bridge_e2e.py:103`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: str(port) server = subprocess.Popen( [str(hython), "-c", _SERVER_SNIPPET.format(scripts=scripts)],

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server tests/integration/bridge_e2e.py

low Shell/command execution in packaging/dev tooling (tests/run_integration.py)MTC-SRC-002

In a packaging/dev/install script (shipped, but not the server runtime) (`tests/run_integration.py:183`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: v[1:], ] return subprocess.call(command, env=env, cwd=str(REPO_ROOT)) if __name__ == "__main__": sys.exit(

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server tests/run_integration.py

low Shell/command execution in packaging/dev tooling (tests/test_menu.py)MTC-SRC-002

In a packaging/dev/install script (shipped, but not the server runtime) (`tests/test_menu.py:107`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: tartup try: exec(compile(code, item_id, "exec"), {}) finally: for name, module in saved.items():

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server tests/test_menu.py

low Shell/command execution in packaging/dev tooling (tools/gen_node_versions.py)MTC-SRC-002

In a packaging/dev/install script (shipped, but not the server runtime) (`tools/gen_node_versions.py:124`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: ry: completed = subprocess.run( [str(hython), str(_DUMPER)], capture_output=True,

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server tools/gen_node_versions.py

Tools 188

Each tool and what it can reach — statically extracted from the published source.

  • get_env_variablereads sensitive data
  • get_help_pageingests untrusted input
  • assign_materialno sensitive capability
  • build_networkno sensitive capability
  • build_sop_chainno sensitive capability
  • cancel_top_cookno sensitive capability
  • capture_network_editorno sensitive capability
  • capture_screenshotno sensitive capability
  • clear_cacheno sensitive capability
  • compare_snapshotsno sensitive capability
Show 178 more tools ↓
  • connect_nodesno sensitive capability
  • connect_nodes_batchno sensitive capability
  • cook_frame_rangeno sensitive capability
  • cook_top_nodeno sensitive capability
  • copy_nodeno sensitive capability
  • create_chop_nodeno sensitive capability
  • create_cop_nodeno sensitive capability
  • create_hdano sensitive capability
  • create_lightno sensitive capability
  • create_light_rigno sensitive capability
  • create_lop_nodeno sensitive capability
  • create_materialno sensitive capability
  • create_material_networkno sensitive capability
  • create_nodeno sensitive capability
  • create_render_nodeno sensitive capability
  • create_spare_parameterno sensitive capability
  • create_spare_parametersno sensitive capability
  • create_takeno sensitive capability
  • create_vex_expressionno sensitive capability
  • create_wrangleno sensitive capability
  • delete_keyframeno sensitive capability
  • delete_nodeno sensitive capability
  • dirty_work_itemsno sensitive capability
  • disconnect_nodeno sensitive capability
  • evaluate_expressionno sensitive capability
  • execute_hscriptno sensitive capability
  • execute_pythonno sensitive capability
  • explain_nodeno sensitive capability
  • export_chop_to_parmno sensitive capability
  • export_fileno sensitive capability
  • find_error_nodesno sensitive capability
  • find_expensive_nodesno sensitive capability
  • find_nearest_pointno sensitive capability
  • find_nodesno sensitive capability
  • find_usd_primsno sensitive capability
  • frame_allno sensitive capability
  • frame_selectionno sensitive capability
  • generate_static_itemsno sensitive capability
  • get_attrib_statsno sensitive capability
  • get_attrib_valuesno sensitive capability
  • get_attribute_infono sensitive capability
  • get_bounding_boxno sensitive capability
  • get_cache_statusno sensitive capability
  • get_chop_datano sensitive capability
  • get_context_infono sensitive capability
  • get_cook_chainno sensitive capability
  • get_cook_statusno sensitive capability
  • get_cop_geometryno sensitive capability
  • get_cop_infono sensitive capability
  • get_cop_layerno sensitive capability
  • get_cop_vdbno sensitive capability
  • get_current_takeno sensitive capability
  • get_dop_fieldno sensitive capability
  • get_dop_objectno sensitive capability
  • get_dop_relationshipsno sensitive capability
  • get_expressionno sensitive capability
  • get_frameno sensitive capability
  • get_geometry_infono sensitive capability
  • get_group_membersno sensitive capability
  • get_groupsno sensitive capability
  • get_hda_infono sensitive capability
  • get_hda_section_contentno sensitive capability
  • get_hda_sectionsno sensitive capability
  • get_houdini_connection_statusno sensitive capability
  • get_keyframesno sensitive capability
  • get_last_modified_primsno sensitive capability
  • get_material_infono sensitive capability
  • get_network_overviewno sensitive capability
  • get_node_cardno sensitive capability
  • get_node_errors_detailedno sensitive capability
  • get_node_infono sensitive capability
  • get_parameterno sensitive capability
  • get_parameter_schemano sensitive capability
  • get_parametersno sensitive capability
  • get_pdg_graphno sensitive capability
  • get_pointsno sensitive capability
  • get_prim_intrinsicsno sensitive capability
  • get_primsno sensitive capability
  • get_render_progressno sensitive capability
  • get_render_settingsno sensitive capability
  • get_scene_infono sensitive capability
  • get_scene_summaryno sensitive capability
  • get_selectionno sensitive capability
  • get_shelf_tool_scriptno sensitive capability
  • get_sim_memory_usageno sensitive capability
  • get_simulation_infono sensitive capability
  • get_stage_infono sensitive capability
  • get_top_network_infono sensitive capability
  • get_top_scheduler_infono sensitive capability
  • get_usd_attributeno sensitive capability
  • get_usd_compositionno sensitive capability
  • get_usd_layersno sensitive capability
  • get_usd_materialsno sensitive capability
  • get_usd_primno sensitive capability
  • get_usd_prim_statsno sensitive capability
  • get_usd_variantsno sensitive capability
  • get_viewport_infono sensitive capability
  • get_volume_infono sensitive capability
  • get_work_item_infono sensitive capability
  • get_work_item_statesno sensitive capability
  • get_wrangle_codeno sensitive capability
  • import_fileno sensitive capability
  • inspect_usd_layerno sensitive capability
  • install_hdano sensitive capability
  • layout_childrenno sensitive capability
  • link_parametersno sensitive capability
  • list_cachesno sensitive capability
  • list_childrenno sensitive capability
  • list_chop_channelsno sensitive capability
  • list_cop_node_typesno sensitive capability
  • list_dop_objectsno sensitive capability
  • list_installed_hdasno sensitive capability
  • list_lightsno sensitive capability
  • list_material_typesno sensitive capability
  • list_materialsno sensitive capability
  • list_node_typesno sensitive capability
  • list_panesno sensitive capability
  • list_render_nodesno sensitive capability
  • list_shelf_toolsno sensitive capability
  • list_takesno sensitive capability
  • list_usd_primsno sensitive capability
  • load_sceneno sensitive capability
  • lock_parameterno sensitive capability
  • log_statusno sensitive capability
  • move_nodeno sensitive capability
  • new_sceneno sensitive capability
  • pause_top_cookno sensitive capability
  • playbar_controlno sensitive capability
  • reload_hdano sensitive capability
  • rename_nodeno sensitive capability
  • render_node_networkno sensitive capability
  • render_quad_viewno sensitive capability
  • render_viewportno sensitive capability
  • reorder_inputsno sensitive capability
  • reset_simulationno sensitive capability
  • revert_parameterno sensitive capability
  • run_shelf_toolno sensitive capability
  • sample_geometryno sensitive capability
  • save_sceneno sensitive capability
  • search_helpno sensitive capability
  • set_cop_flagsno sensitive capability
  • set_current_networkno sensitive capability
  • set_current_takeno sensitive capability
  • set_detail_attribno sensitive capability
  • set_expressionno sensitive capability
  • set_frameno sensitive capability
  • set_frame_rangeno sensitive capability
  • set_hda_section_contentno sensitive capability
  • set_keyframeno sensitive capability
  • set_keyframesno sensitive capability
  • set_light_propertiesno sensitive capability
  • set_node_colorno sensitive capability
  • set_node_flagsno sensitive capability
  • set_node_positionno sensitive capability
  • set_parameterno sensitive capability
  • set_parametersno sensitive capability
  • set_playback_rangeno sensitive capability
  • set_render_settingsno sensitive capability
  • set_selectionno sensitive capability
  • set_usd_attributeno sensitive capability
  • set_viewer_contextno sensitive capability
  • set_viewport_camerano sensitive capability
  • set_viewport_directionno sensitive capability
  • set_viewport_displayno sensitive capability
  • set_viewport_rendererno sensitive capability
  • set_wrangle_codeno sensitive capability
  • setup_flip_simno sensitive capability
  • setup_pyro_simno sensitive capability
  • setup_rbd_simno sensitive capability
  • setup_renderno sensitive capability
  • setup_vellum_simno sensitive capability
  • start_renderno sensitive capability
  • step_simulationno sensitive capability
  • uninstall_hdano sensitive capability
  • update_hdano sensitive capability
  • validate_vexno sensitive capability
  • verify_networkno sensitive capability
  • write_cacheno sensitive capability

What this scan could not see

Versions 5

Scan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.

VersionScoreFindingsEngineScanned
v2.10.0 latest A 93/100 10 1.13.0 2026-08-25
v2.6.2 A 93/100 9 1.12.1 2026-07-29
v2.4.0 A 93/100 8 1.12.1 2026-07-28
v2.1.0 A 96/100 5 1.12.1 2026-07-27
v1.3.0 A 96/100 4 1.12.1 2026-07-27

Embed this score

Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.

MCP Trust Score: A · 93/100
Markdown (GitHub README)
[![MCP Trust Score](https://mcptrustchecker.com/registry/fxhoudinimcp/badge.svg)](https://mcptrustchecker.com/registry/fxhoudinimcp)
HTML
<a href="https://mcptrustchecker.com/registry/fxhoudinimcp"><img src="https://mcptrustchecker.com/registry/fxhoudinimcp/badge.svg" alt="MCP Trust Score" height="20"></a>
Prefer shields.io styling? Point it at https://mcptrustchecker.com/registry/fxhoudinimcp/badge.json via https://img.shields.io/endpoint?url=…

Verify this score yourself

The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.

npx mcptrustchecker scan fxhoudinimcp --online --registry pypi

Use the free API → How scoring works

More in Productivity & Workflow