🤖 MCP Tool Reference¶
Every tool listed here is callable over the MCP Streamable HTTP server (POST /mcp with tools/call), and equivalently via bpy.ops.zozo_contact_solver.<tool_name>() inside Blender.
See 🤖 MCP Server for protocol, transport, and security notes.
Categories:
Connection (12)
Group (17)
Object operations (18)
Simulation (9)
Scene (12)
Remote (5)
Console (3)
Debug (8)
Blender (6)
Connection¶
- connect_ssh(host: str, username: str, key_path: str, remote_path: str, port: int = 22, container: str | None = None)¶
Establish SSH connection to remote server for contact solver.
- Parameters:
host – SSH hostname or IP address
username – SSH username
key_path – Path to SSH private key
remote_path – Remote working directory path
port – SSH port
container – Docker container name (optional)
- connect_docker(container: str, path: str)¶
Establish Docker connection for contact solver.
- Parameters:
container – Docker container name
path – Working directory path in container
- connect_local(path: str)¶
Establish local connection for contact solver.
- Parameters:
path – Local working directory path
- connect_win_native(path: str, port: int = DEFAULT_SERVER_PORT)¶
Establish Windows native connection for contact solver.
- Parameters:
path – Path to the Windows native build or distribution directory
port – Port for the solver server
- disconnect()¶
Disconnect from remote server.
- connect()¶
Connect using current connection settings, mimicking the connect button press.
- start_remote_server()¶
Start the remote server process.
- stop_remote_server()¶
Stop the remote server process.
- is_remote_server_running()¶
Check if remote server is running.
- get_remote_status()¶
Get detailed remote server status.
- update_remote_status()¶
Update remote server status.
- get_connection_info()¶
Get detailed connection information.
Group¶
- create_group()¶
Create a new dynamics group.
- delete_group(group_uuid: str)¶
Delete a specific group by UUID.
- Parameters:
group_uuid – UUID of group to delete
- delete_all_groups()¶
Delete all active groups.
- duplicate_group(group_uuid: str)¶
Duplicate a dynamics group (material params only, no objects or pins).
- Parameters:
group_uuid – UUID of the source group to duplicate
- rename_group(group_uuid: str, name: str)¶
Rename a dynamics group.
- Parameters:
group_uuid – UUID of group to rename
name – New display name (empty string falls back to ‘Group N’)
- bake_group_animation(group_uuid: str, object_name: str)¶
Bake simulated animation for one object in a group to Blender keyframes.
The object is removed from the group and keeps its baked animation.
- Parameters:
group_uuid – UUID of group containing the object
object_name – Name of the object to bake
- bake_group_single_frame(group_uuid: str, object_name: str)¶
Bake the current frame as frame 1 for one object and drop it from the group.
- Parameters:
group_uuid – UUID of group containing the object
object_name – Name of the object to bake
- set_object_included(group_uuid: str, object_name: str, included: bool)¶
Toggle whether an assigned object is included in the simulation.
- Parameters:
group_uuid – UUID of the group
object_name – Name of the assigned object
included – True to include, False to mute
- get_active_groups()¶
Get list of all active groups with their properties.
- add_objects_to_group(group_uuid: str, object_names: list[str])¶
Add objects to a dynamics group.
- Parameters:
group_uuid – UUID of target group
object_names – List of object names to add
- remove_object_from_group(group_uuid: str, object_name: str)¶
Remove an object from a dynamics group.
- Parameters:
group_uuid – UUID of group
object_name – Name of object to remove
- remove_all_objects_from_group(group_uuid: str)¶
Remove all objects from a dynamics group.
- Parameters:
group_uuid – UUID of group to clear
- get_group_objects(group_uuid: str)¶
Get objects assigned to a dynamics group.
- Parameters:
group_uuid – UUID of group
- set_group_type(group_uuid: str, type: str)¶
Set the type of a dynamics group.
- Parameters:
group_uuid – UUID of group
type – Group type (SOLID, SHELL, ROD, STATIC)
- add_pin_vertex_group(group_uuid: str, vertex_group_identifier: str)¶
Add a vertex group to the pin list of a dynamics group.
- Parameters:
group_uuid – UUID of group
vertex_group_identifier – Identifier in format “object_name::vertex_group_name”
- remove_pin_vertex_group(group_uuid: str, vertex_group_identifier: str)¶
Remove a vertex group from the pin list of a dynamics group.
- Parameters:
group_uuid – UUID of group
vertex_group_identifier – Identifier in format “object_name::vertex_group_name”
- set_group_material_properties(group_uuid: str, properties: dict)¶
Set material properties for a dynamics group.
- Parameters:
group_uuid – UUID of target group
properties – Dict of property_name -> value mappings
Supported properties by group type:
SHELL: enable_strain_limit, strain_limit, shell_density, shell_young_modulus, shell_poisson_ratio, shell_model, bend, shrink_x, shrink_y, friction, enable_inflate, inflate_pressure, stitch_stiffness
SOLID: solid_density, solid_young_modulus, solid_poisson_ratio, solid_model, shrink, friction, stitch_stiffness
ROD: rod_density, rod_young_modulus, rod_model, friction, bend, enable_strain_limit, strain_limit, stitch_stiffness
STATIC: friction (limited set)
Contact properties (mutually exclusive modes):
Absolute mode: contact_gap, contact_offset (sets use_group_bounding_box_diagonal=False)
Relative mode: contact_gap_rat, contact_offset_rat (sets use_group_bounding_box_diagonal=True)
- Returns:
Dict with success message and properties set
Object operations¶
- set_pin_settings(group_uuid: str, vertex_group_identifier: str, included: bool | None = None, use_pin_duration: bool | None = None, pin_duration: int | None = None, use_pull: bool | None = None, pull_strength: float | None = None)¶
Set per-pin runtime settings (include/duration/pull).
- Parameters:
group_uuid – UUID of group
vertex_group_identifier – Pin id in ‘object::vertex_group’ form
included – Include this pin in the simulation
use_pin_duration – Enable per-pin active duration
pin_duration – Number of frames the pin is active
use_pull – Use pull force instead of hard constraint
pull_strength – Pull force strength
- add_pin_operation(group_uuid: str, vertex_group_identifier: str, op_type: str, frame_start: int | None = None, frame_end: int | None = None, transition: str | None = None, delta: list[float] | None = None, spin_axis: list[float] | None = None, spin_angular_velocity: float | None = None, spin_flip: bool | None = None, spin_center: list[float] | None = None, spin_center_mode: str | None = None, scale_factor: float | None = None, scale_center: list[float] | None = None, scale_center_mode: str | None = None, torque_axis_component: str | None = None, torque_magnitude: float | None = None, torque_flip: bool | None = None)¶
Append an operation to a pin’s operation list.
TORQUE cannot coexist with other op types on the same pin.
- Parameters:
group_uuid – UUID of group
vertex_group_identifier – Pin id in ‘object::vertex_group’ form
op_type – One of MOVE_BY, SPIN, SCALE, TORQUE
frame_start – First frame the op is active
frame_end – Last frame the op is active
transition – LINEAR or SMOOTH
delta – [x, y, z] translation for MOVE_BY (metres)
spin_axis – [x, y, z] rotation axis for SPIN
spin_angular_velocity – Degrees per second (SPIN)
spin_flip – Reverse spin direction
spin_center – [x, y, z] fixed center for SPIN (ABSOLUTE mode only)
spin_center_mode – CENTROID, ABSOLUTE, MAX_TOWARDS, or VERTEX
scale_factor – Scale multiplier for SCALE
scale_center – [x, y, z] fixed center for SCALE (ABSOLUTE mode only)
scale_center_mode – CENTROID, ABSOLUTE, MAX_TOWARDS, or VERTEX
torque_axis_component – PC1, PC2, or PC3 (principal axis)
torque_magnitude – Torque in newton-metres
torque_flip – Reverse torque direction
- remove_pin_operation(group_uuid: str, vertex_group_identifier: str, index: int)¶
Remove a pin operation by index.
- Parameters:
group_uuid – UUID of group
vertex_group_identifier – Pin id in ‘object::vertex_group’ form
index – Zero-based index into the pin’s operations list
- list_pin_operations(group_uuid: str, vertex_group_identifier: str)¶
List operations attached to a pin.
- Parameters:
group_uuid – UUID of group
vertex_group_identifier – Pin id in ‘object::vertex_group’ form
- clear_pin_operations(group_uuid: str, vertex_group_identifier: str)¶
Remove every non-embedded operation from a pin.
- Parameters:
group_uuid – UUID of group
vertex_group_identifier – Pin id in ‘object::vertex_group’ form
- add_static_op(group_uuid: str, object_name: str, op_type: str, frame_start: int | None = None, frame_end: int | None = None, transition: str | None = None, delta: list[float] | None = None, spin_axis: list[float] | None = None, spin_angular_velocity: float | None = None, scale_factor: float | None = None)¶
Add a move/spin/scale op to a static-moving object.
Only valid on groups of type STATIC.
- Parameters:
group_uuid – UUID of STATIC group
object_name – Name of the assigned object
op_type – One of MOVE_BY, SPIN, SCALE
frame_start – First frame the op is active
frame_end – Last frame the op is active
transition – LINEAR or SMOOTH
delta – [x, y, z] translation (MOVE_BY)
spin_axis – [x, y, z] rotation axis (SPIN)
spin_angular_velocity – Degrees per second (SPIN)
scale_factor – Scale multiplier (SCALE)
- remove_static_op(group_uuid: str, object_name: str, index: int)¶
Remove a static op by index.
- Parameters:
group_uuid – UUID of STATIC group
object_name – Name of the assigned object
index – Zero-based index into the object’s static_ops list
- list_static_ops(group_uuid: str, object_name: str)¶
List static ops attached to an assigned object.
- Parameters:
group_uuid – UUID of STATIC group
object_name – Name of the assigned object
- clear_static_ops(group_uuid: str, object_name: str)¶
Remove all static ops from an assigned object.
- Parameters:
group_uuid – UUID of STATIC group
object_name – Name of the assigned object
- add_velocity_keyframe(group_uuid: str, object_name: str, frame: int, direction: list[float], speed: float)¶
Add a velocity keyframe at the given frame for an assigned object.
- Parameters:
group_uuid – UUID of group
object_name – Name of the assigned object
frame – Blender frame number (>= 1)
direction – [x, y, z] direction vector (normalized at runtime)
speed – Velocity magnitude (m/s)
- remove_velocity_keyframe(group_uuid: str, object_name: str, frame: int)¶
Remove the velocity keyframe at the given frame.
- Parameters:
group_uuid – UUID of group
object_name – Name of the assigned object
frame – Frame number of the keyframe to remove
- list_velocity_keyframes(group_uuid: str, object_name: str)¶
List velocity keyframes for an assigned object.
- Parameters:
group_uuid – UUID of group
object_name – Name of the assigned object
- clear_velocity_keyframes(group_uuid: str, object_name: str)¶
Clear all velocity keyframes on an assigned object.
- Parameters:
group_uuid – UUID of group
object_name – Name of the assigned object
- set_use_collision_windows(group_uuid: str, enable: bool)¶
Toggle the per-object collision-window feature for a group.
- Parameters:
group_uuid – UUID of group
enable – True to enable, False to disable
- add_collision_window(group_uuid: str, object_name: str, frame_start: int, frame_end: int)¶
Add a collision-active window on an assigned object.
- Parameters:
group_uuid – UUID of group
object_name – Name of the assigned object
frame_start – First frame of the window
frame_end – Last frame of the window
- remove_collision_window(group_uuid: str, object_name: str, index: int)¶
Remove a collision window by index.
- Parameters:
group_uuid – UUID of group
object_name – Name of the assigned object
index – Zero-based index into the object’s collision_windows list
- list_collision_windows(group_uuid: str, object_name: str)¶
List collision windows on an assigned object.
- Parameters:
group_uuid – UUID of group
object_name – Name of the assigned object
- clear_collision_windows(group_uuid: str, object_name: str)¶
Clear every collision window on an assigned object.
- Parameters:
group_uuid – UUID of group
object_name – Name of the assigned object
Simulation¶
- transfer_data()¶
Transfer data to the solver.
- run_simulation()¶
Start simulation.
- resume_simulation()¶
Resume paused simulation.
- terminate_simulation()¶
Force terminate simulation.
- save_and_quit_simulation()¶
Save and quit simulation gracefully.
- update_params()¶
Update the parameters of the solver.
- delete_remote_data()¶
Delete data on the remote server.
- fetch_animation()¶
Fetch simulation results from server.
- clear_local_animation()¶
Clear local animation data and keyframes.
Scene¶
- add_invisible_wall(position: list[float], normal: list[float])¶
Add an invisible wall collider at a given position and normal.
- Parameters:
position – Wall origin in Blender world space [x, y, z].
normal – Outward-facing normal vector [x, y, z].
- add_invisible_sphere(position: list[float], radius: float, invert: bool = False, hemisphere: bool = False)¶
Add an invisible sphere collider.
- Parameters:
position – Center in Blender world space [x, y, z].
radius – Sphere radius.
invert – If true, acts as an inverted sphere (contact from inside).
hemisphere – If true, only the upper half acts as a collider.
- list_invisible_colliders()¶
Return a list of all invisible colliders currently in the scene.
- remove_invisible_collider(index: int)¶
Remove an invisible collider by its index in the scene list.
- Parameters:
index – Zero-based index as reported by list_invisible_colliders.
- clear_invisible_colliders()¶
Remove every invisible collider from the scene.
- add_merge_pair(object_a: str, object_b: str)¶
Stitch two objects together along their nearest overlapping vertices.
- Parameters:
object_a – Name of the source object.
object_b – Name of the target object.
- remove_merge_pair(object_a: str, object_b: str)¶
Remove a merge pair by the two object names.
- Parameters:
object_a – Name of the source object.
object_b – Name of the target object.
- list_merge_pairs()¶
Return all stored merge pairs with both display names and UUIDs.
- clear_merge_pairs()¶
Remove every merge pair from the scene.
- snap_to_vertices(object_a: str, object_b: str)¶
Move object A so its nearest vertex matches object B’s nearest vertex.
- Parameters:
object_a – Name of the object that will move.
object_b – Name of the target object (stays put).
- bake_all_animation()¶
Bake simulated animation for every dynamic group to Blender keyframes.
- bake_all_single_frame()¶
Bake the current frame as frame 1 for every dynamic group.
Dynamic parameters¶
- add_dynamic_param(param_type: str)¶
Add a dynamic (time-varying) scene parameter.
Creates an initial keyframe at frame 1 seeded from the current static scene value.
- Parameters:
param_type – One of GRAVITY, WIND, AIR_DENSITY, AIR_FRICTION, VERTEX_AIR_DAMP
- remove_dynamic_param(param_type: str)¶
Remove a dynamic scene parameter entry.
- Parameters:
param_type – One of GRAVITY, WIND, AIR_DENSITY, AIR_FRICTION, VERTEX_AIR_DAMP
- list_dynamic_params()¶
List all dynamic scene parameters and their keyframes.
- add_dynamic_param_keyframe(param_type: str, frame: int, gravity: list[float] | None = None, wind_direction: list[float] | None = None, wind_strength: float | None = None, value: float | None = None, use_hold: bool | None = None)¶
Add a keyframe to a dynamic scene parameter.
Supply the field matching the param_type (gravity for GRAVITY; wind_direction + wind_strength for WIND; value for the scalar params).
- Parameters:
param_type – GRAVITY, WIND, AIR_DENSITY, AIR_FRICTION, or VERTEX_AIR_DAMP
frame – Blender frame (>= 1)
gravity – [x, y, z] for GRAVITY param
wind_direction – [x, y, z] for WIND param
wind_strength – Scalar speed (m/s) for WIND param
value – Scalar for AIR_DENSITY, AIR_FRICTION, or VERTEX_AIR_DAMP
use_hold – Hold previous keyframe value (step function)
- remove_dynamic_param_keyframe(param_type: str, frame: int)¶
Remove a keyframe from a dynamic scene parameter.
The initial keyframe (frame 1) cannot be removed.
- Parameters:
param_type – GRAVITY, WIND, AIR_DENSITY, AIR_FRICTION, or VERTEX_AIR_DAMP
frame – Frame number of the keyframe to remove
- set_collider_properties(index: int, name: str | None = None, position: list[float] | None = None, normal: list[float] | None = None, radius: float | None = None, contact_gap: float | None = None, friction: float | None = None, thickness: float | None = None, invert: bool | None = None, hemisphere: bool | None = None, enable_active_duration: bool | None = None, active_duration: int | None = None)¶
Update properties on an invisible collider.
Pass only the fields you want to change. normal is wall-only; radius/invert/hemisphere are sphere-only.
- Parameters:
index – Zero-based collider index as reported by list_invisible_colliders
name – Display name
position – [x, y, z] origin
normal – [x, y, z] outward normal (WALL only)
radius – Sphere radius (SPHERE only)
contact_gap – Contact gap tolerance
friction – Friction coefficient [0, 1]
thickness – Max penetration depth (> 0)
invert – Flip contact direction (SPHERE only)
hemisphere – Restrict to upper half (SPHERE only)
enable_active_duration – Enable per-collider active-until frame
active_duration – First frame the collider is no longer active
- add_collider_keyframe(index: int, frame: int, position: list[float] | None = None, radius: float | None = None, use_hold: bool | None = None)¶
Add a keyframe to an invisible collider.
- Parameters:
index – Zero-based collider index
frame – Blender frame (>= 1)
position – [x, y, z] at this keyframe
radius – Sphere radius at this keyframe (SPHERE only)
use_hold – Hold the previous keyframe value (step function)
- remove_collider_keyframe(index: int, frame: int)¶
Remove a keyframe from an invisible collider.
- Parameters:
index – Zero-based collider index
frame – Frame number of the keyframe to remove
- list_collider_keyframes(index: int)¶
List keyframes on an invisible collider.
- Parameters:
index – Zero-based collider index
Remote¶
- abort_operation()¶
Abort the current in-progress operation.
- install_paramiko()¶
Install the Paramiko library.
- install_docker()¶
Install the Docker library.
- set_scene_parameters(step_size: float | None = None, min_newton_steps: int | None = None, frame_count: int | None = None, frame_rate: int | None = None, gravity: list[float] | None = None, wind_direction: list[float] | None = None, wind_strength: float | None = None, air_density: float | None = None, air_friction: float | None = None, vertex_air_damp: float | None = None, inactive_momentum_frames: int | None = None, contact_nnz: int | None = None, line_search_max_t: float | None = None, constraint_ghat: float | None = None, cg_max_iter: int | None = None, cg_tol: float | None = None, include_face_mass: bool | None = None, disable_contact: bool | None = None, auto_save: bool | None = None, auto_save_interval: int | None = None, use_frame_rate_in_output: bool | None = None, project_name: str | None = None)¶
Set global scene parameters for physics simulation.
- Parameters:
step_size – Simulation step size (seconds)
min_newton_steps – Minimum Newton iterations per step
frame_count – Number of simulation frames
frame_rate – Frame rate for simulation
gravity – Gravity acceleration vector [x, y, z] m/s^2
wind_direction – Wind direction vector [x, y, z]
wind_strength – Wind speed magnitude (m/s)
air_density – Air density (kg/m^3)
air_friction – Tangential/normal air friction ratio
vertex_air_damp – Vertex-level air damping factor
inactive_momentum_frames – Inactive momentum frame count
contact_nnz – Max contact non-zero entries
line_search_max_t – CCD TOI extension factor
constraint_ghat – Boundary constraint gap distance
cg_max_iter – PCG max iterations
cg_tol – PCG relative tolerance
include_face_mass – Include shell face mass for solids’ surface elements
disable_contact – Disable all contact detection
auto_save – Enable auto-save
auto_save_interval – Auto-save interval (frames)
use_frame_rate_in_output – Use frame rate in output
project_name – Project name used for remote session directory
- get_scene_parameters()¶
Get current scene parameters.
Console¶
- get_console_lines()¶
Get current console text lines.
- get_latest_error()¶
Get latest error from both local and remote.
- show_console()¶
Show console window.
Debug¶
- debug_data_send(data_size_mb: int = 1)¶
Send test data to remote server for debugging data transfer.
- Parameters:
data_size_mb – Size of test data in megabytes (default: 1MB)
- debug_data_receive()¶
Receive test data from remote server and verify integrity.
This function should be called after debug_data_send to test the complete round-trip data transfer functionality.
- execute_server_command(server_script: str)¶
Execute a server command/script.
- Parameters:
server_script – Server script command to execute
- execute_shell_command(shell_command: str, use_shell: bool = True)¶
Execute a shell command on remote server.
- Parameters:
shell_command – Shell command to execute
use_shell – Whether to use shell execution
- git_pull_remote()¶
Pull the latest changes from the Git repository on remote server.
- compile_project()¶
Compile the project on remote server.
- delete_log_file(log_file_path: str)¶
Delete the specified log file.
- Parameters:
log_file_path – Path to the log file to delete
- git_pull_local()¶
Pull the latest changes from the local Git repository.
Blender¶
- run_python_script(code: str)¶
Execute arbitrary Python code in Blender with access to bpy, bmesh, and mathutils modules.
- Parameters:
code – Python code to execute in Blender context
- capture_viewport_image(filepath: str, max_size: int = 800)¶
Capture a screenshot of the current 3D viewport and save it to specified file path.
- Parameters:
filepath – File path where to save the screenshot
max_size – Maximum size in pixels for the largest dimension
- get_ui_element_status(element_type: str = 'all', element_name: str | None = None, category: str | None = None)¶
Get status of Blender addon UI elements - poll results for operators, values for properties.
- Parameters:
element_type – Type of elements to check (“operator”, “property”, “all”)
element_name – Specific element name to check (optional)
category – Filter by category (“solver”, “dynamics”, “client”, “debug”)
- get_average_edge_length(object_name: str)¶
Compute the average edge length of a mesh object.
- Parameters:
object_name – Name of the mesh object to analyze
- get_object_bounding_box_diagonal(object_name: str)¶
Compute the bounding box of an object and return the largest diagonal distance.
- Parameters:
object_name – Name of the object to analyze
- refresh_ui()¶
Refresh all UI areas in Blender to reflect recent changes.
This is useful when programmatic changes need to be reflected in the UI, such as after starting/stopping servers or updating addon state.