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
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:
| Points | Adoption-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.
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
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
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
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
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
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
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
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
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
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
Each tool and what it can reach — statically extracted from the published source.
get_env_variablereads sensitive dataget_help_pageingests untrusted inputassign_materialno sensitive capabilitybuild_networkno sensitive capabilitybuild_sop_chainno sensitive capabilitycancel_top_cookno sensitive capabilitycapture_network_editorno sensitive capabilitycapture_screenshotno sensitive capabilityclear_cacheno sensitive capabilitycompare_snapshotsno sensitive capabilityconnect_nodesno sensitive capabilityconnect_nodes_batchno sensitive capabilitycook_frame_rangeno sensitive capabilitycook_top_nodeno sensitive capabilitycopy_nodeno sensitive capabilitycreate_chop_nodeno sensitive capabilitycreate_cop_nodeno sensitive capabilitycreate_hdano sensitive capabilitycreate_lightno sensitive capabilitycreate_light_rigno sensitive capabilitycreate_lop_nodeno sensitive capabilitycreate_materialno sensitive capabilitycreate_material_networkno sensitive capabilitycreate_nodeno sensitive capabilitycreate_render_nodeno sensitive capabilitycreate_spare_parameterno sensitive capabilitycreate_spare_parametersno sensitive capabilitycreate_takeno sensitive capabilitycreate_vex_expressionno sensitive capabilitycreate_wrangleno sensitive capabilitydelete_keyframeno sensitive capabilitydelete_nodeno sensitive capabilitydirty_work_itemsno sensitive capabilitydisconnect_nodeno sensitive capabilityevaluate_expressionno sensitive capabilityexecute_hscriptno sensitive capabilityexecute_pythonno sensitive capabilityexplain_nodeno sensitive capabilityexport_chop_to_parmno sensitive capabilityexport_fileno sensitive capabilityfind_error_nodesno sensitive capabilityfind_expensive_nodesno sensitive capabilityfind_nearest_pointno sensitive capabilityfind_nodesno sensitive capabilityfind_usd_primsno sensitive capabilityframe_allno sensitive capabilityframe_selectionno sensitive capabilitygenerate_static_itemsno sensitive capabilityget_attrib_statsno sensitive capabilityget_attrib_valuesno sensitive capabilityget_attribute_infono sensitive capabilityget_bounding_boxno sensitive capabilityget_cache_statusno sensitive capabilityget_chop_datano sensitive capabilityget_context_infono sensitive capabilityget_cook_chainno sensitive capabilityget_cook_statusno sensitive capabilityget_cop_geometryno sensitive capabilityget_cop_infono sensitive capabilityget_cop_layerno sensitive capabilityget_cop_vdbno sensitive capabilityget_current_takeno sensitive capabilityget_dop_fieldno sensitive capabilityget_dop_objectno sensitive capabilityget_dop_relationshipsno sensitive capabilityget_expressionno sensitive capabilityget_frameno sensitive capabilityget_geometry_infono sensitive capabilityget_group_membersno sensitive capabilityget_groupsno sensitive capabilityget_hda_infono sensitive capabilityget_hda_section_contentno sensitive capabilityget_hda_sectionsno sensitive capabilityget_houdini_connection_statusno sensitive capabilityget_keyframesno sensitive capabilityget_last_modified_primsno sensitive capabilityget_material_infono sensitive capabilityget_network_overviewno sensitive capabilityget_node_cardno sensitive capabilityget_node_errors_detailedno sensitive capabilityget_node_infono sensitive capabilityget_parameterno sensitive capabilityget_parameter_schemano sensitive capabilityget_parametersno sensitive capabilityget_pdg_graphno sensitive capabilityget_pointsno sensitive capabilityget_prim_intrinsicsno sensitive capabilityget_primsno sensitive capabilityget_render_progressno sensitive capabilityget_render_settingsno sensitive capabilityget_scene_infono sensitive capabilityget_scene_summaryno sensitive capabilityget_selectionno sensitive capabilityget_shelf_tool_scriptno sensitive capabilityget_sim_memory_usageno sensitive capabilityget_simulation_infono sensitive capabilityget_stage_infono sensitive capabilityget_top_network_infono sensitive capabilityget_top_scheduler_infono sensitive capabilityget_usd_attributeno sensitive capabilityget_usd_compositionno sensitive capabilityget_usd_layersno sensitive capabilityget_usd_materialsno sensitive capabilityget_usd_primno sensitive capabilityget_usd_prim_statsno sensitive capabilityget_usd_variantsno sensitive capabilityget_viewport_infono sensitive capabilityget_volume_infono sensitive capabilityget_work_item_infono sensitive capabilityget_work_item_statesno sensitive capabilityget_wrangle_codeno sensitive capabilityimport_fileno sensitive capabilityinspect_usd_layerno sensitive capabilityinstall_hdano sensitive capabilitylayout_childrenno sensitive capabilitylink_parametersno sensitive capabilitylist_cachesno sensitive capabilitylist_childrenno sensitive capabilitylist_chop_channelsno sensitive capabilitylist_cop_node_typesno sensitive capabilitylist_dop_objectsno sensitive capabilitylist_installed_hdasno sensitive capabilitylist_lightsno sensitive capabilitylist_material_typesno sensitive capabilitylist_materialsno sensitive capabilitylist_node_typesno sensitive capabilitylist_panesno sensitive capabilitylist_render_nodesno sensitive capabilitylist_shelf_toolsno sensitive capabilitylist_takesno sensitive capabilitylist_usd_primsno sensitive capabilityload_sceneno sensitive capabilitylock_parameterno sensitive capabilitylog_statusno sensitive capabilitymove_nodeno sensitive capabilitynew_sceneno sensitive capabilitypause_top_cookno sensitive capabilityplaybar_controlno sensitive capabilityreload_hdano sensitive capabilityrename_nodeno sensitive capabilityrender_node_networkno sensitive capabilityrender_quad_viewno sensitive capabilityrender_viewportno sensitive capabilityreorder_inputsno sensitive capabilityreset_simulationno sensitive capabilityrevert_parameterno sensitive capabilityrun_shelf_toolno sensitive capabilitysample_geometryno sensitive capabilitysave_sceneno sensitive capabilitysearch_helpno sensitive capabilityset_cop_flagsno sensitive capabilityset_current_networkno sensitive capabilityset_current_takeno sensitive capabilityset_detail_attribno sensitive capabilityset_expressionno sensitive capabilityset_frameno sensitive capabilityset_frame_rangeno sensitive capabilityset_hda_section_contentno sensitive capabilityset_keyframeno sensitive capabilityset_keyframesno sensitive capabilityset_light_propertiesno sensitive capabilityset_node_colorno sensitive capabilityset_node_flagsno sensitive capabilityset_node_positionno sensitive capabilityset_parameterno sensitive capabilityset_parametersno sensitive capabilityset_playback_rangeno sensitive capabilityset_render_settingsno sensitive capabilityset_selectionno sensitive capabilityset_usd_attributeno sensitive capabilityset_viewer_contextno sensitive capabilityset_viewport_camerano sensitive capabilityset_viewport_directionno sensitive capabilityset_viewport_displayno sensitive capabilityset_viewport_rendererno sensitive capabilityset_wrangle_codeno sensitive capabilitysetup_flip_simno sensitive capabilitysetup_pyro_simno sensitive capabilitysetup_rbd_simno sensitive capabilitysetup_renderno sensitive capabilitysetup_vellum_simno sensitive capabilitystart_renderno sensitive capabilitystep_simulationno sensitive capabilityuninstall_hdano sensitive capabilityupdate_hdano sensitive capabilityvalidate_vexno sensitive capabilityverify_networkno sensitive capabilitywrite_cacheno sensitive capabilityScan 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.
| Version | Score | Findings | Engine | Scanned |
|---|---|---|---|---|
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 |
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.
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
MCP AgentChat - 让 AI Agent 通过 Telegram 与用户实时交互:发送消息、图片,等待用户回复
A Model Context Protocol (MCP) server for Airthings Air Quality Monitor devices.
MCP server for Anki
TypeScript package for reading and searching Apple Notes on macOS via direct SQLite access. Includes markdown conversion, attachment support, and offers a local MCP server!
Verified biotech catalyst calendar (PDUFA/AdComm/trial readouts) anchored to official sources.
Appointment booking platform letting agents check provider availability and create bookings.