3D Visualizer
This server lets AI agents load, inspect, visualize, compare, and export 3D data locally, with camera, selection, measurement, alignment, and presentation controls.
Open local 3D files (point clouds, meshes, splats, animated models) from configured roots, or remote direct HTTP(S) URLs, with optional appending to an existing scene.
Project depth/disparity images into point clouds using explicit calibration or COLMAP models, with optional RGB, confidence, and mask inputs.
Visualize or update up to 20,000 XYZ points with colors, targets, and vector overlays directly from tool arguments.
Inspect scene geometry, camera state, coordinate conventions, object transforms, projection info, selection criteria, and rendered revision.
Control the camera: navigate by preset/orbit/pan/zoom/fit, set position/target/up/FOV, and pick surface points.
Capture actual PNGs of the rendered view and generate labeled multi-angle previews.
Adjust scene appearance: background color, exposure/brightness, gamma, grid, axes, legend, and UI theme.
Modify object presentation: visibility, opacity, point size, mesh/points mode, and coloring modes.
Transform objects with translation/rotation/scaling/quaternion/matrix ops, including undo/reset/invert and pivot control.
Add/list/clear measurements and path measurements in scene units.
Save, restore, delete named views and complete scene states, and export/import scene state JSON or export visible models as GLB.
Select points by object, scalar values, box, plane, or all, with isolate/focus/highlight and named-selection boolean operations.
Export active/named selections to new binary PLY files, preserving attributes, indices, and provenance where available.
Align clouds with auto/ICP/correspondences or multi-cloud align-all strategies, with up-axis and undo support.
Compare clouds side-by-side with nearest/paired distance coloring and recompute distances.
Control camera keyframes and model animation clips (play, list, update, loop, goto, stop).
3D Visualizer MCP server
Give AI agents tools to inspect, compare and export 3D data. The server runs locally and accesses files inside directories you explicitly allow.
Install and connect
Install uv, then add this configuration to your MCP client. Replace the root with your data folder:
{
"mcpServers": {
"3d-visualizer": {
"command": "uvx",
"args": [
"--from",
"3d-visualizer[mcp]==0.4.2",
"3d-visualizer-mcp",
"--root",
"/absolute/path/to/data"
]
}
}
}No API key is required. The client starts the server and discovers its tools over stdio. Version 0.4.2 is the published release described here.
Related MCP server: 3d-eyes
What agents can do
Open point clouds and meshes from allowed local files or remote URLs.
Project depth and disparity images using supplied calibration and optional aligned RGB images, including COLMAP depth workflows.
Inspect coordinates, attributes and presentation state; move the camera, focus a selection, set viewpoints and capture PNG previews.
Select labeled regions, isolate geometry, measure distances and export subsets with attributes and point provenance where supported.
Transform objects, adjust visibility, point size, coloring and opacity; compare predictions and references with distance coloring.
Save and restore scene states and named views; control supported model animations and camera keyframes.
Visualize NumPy arrays and PyTorch tensors through the companion Python API.
Rendering requirements
Interactive views and PNG captures in release 0.4.2 require a compatible MCP Apps client with WebGL and widget-to-server calls. Plain stdio tool discovery works without a browser, GPU or dataset; it does not prove that a client can render the inline viewer. The server is local software, not a public hosted endpoint. Remote URLs are inputs to the viewer.
Example requests
"Open this PCD, list its labels, isolate label 20 and frame it."
"Show this depth image as a cloud using the calibration beside it."
"Compare these prediction and reference clouds, then capture the result."
"Export the selected object with its labels and original point indices."
For file conventions, client configuration and detailed workflows, see the MCP reference and Python documentation.
Optional agent skill
The 3D inspection skill helps agents choose inspection workflows and translate calibration from nearby files. Install the whole folder, including its depth reference, in your client's skill directory. MCP tool descriptions and workflow resources remain available without the skill; installing it does not configure the MCP connection.
Available Tools
27 toolsalign_3d_cloudsA
Start a registration job, then poll action=status until job.state is completed/failed; submitted is not aligned. Reuses the viewer's Rust solvers. auto: level/up-axis yaw sweep then ICP; icp: refine an already close pair; correspondences: fit >=3 non-collinear paired world XYZ landmarks. source_index moves, target_index stays fixed. align_all/refine_all hold target fixed; strategies anchor (each to anchor), nested (grow aligned union), complex (grow with extra hypotheses). For auto/icp, against_all_others matches the moving cloud to the union of all other clouds. No scale/nonrigid estimation. up_axis describes the DATA, not the camera (default y); use z for Z-up scans. Clear temporary selections first. Undo restores transforms from the last accepted agent job. Inspection/capture remain available; geometry refresh waits for alignment. Partial align-all failures are reported per object.
Inputs: action (required), scene_id (required), detail, up_axis, +6 more. Returns: object
capture_3d_viewARead-only
Return an actual PNG of the rendered 3D canvas (maximum 1024 pixels per side) so the agent can visually inspect the result. Requires an active inline viewer or explicit browser fallback.
Inputs: scene_id (required).
close_3d_sceneA
Release a viewer's local server and temporary data. Does not delete the user's source files. Any active viewer disconnects.
Inputs: scene_id (required). Returns: object
compare_3d_cloudsA
Enable linked side-by-side WebGL views with the same camera (EDL off in split mode); disable restores ordinary rendering. Distance colors left by world-space distance to right: nearest within max_distance, unmatched=NaN; paired uses corresponding decoded order and requires equal counts. Distance limit: one million combined points. Changes mark distances stale; recompute with action=recompute,left= reuses recorded settings. Restored distance fields require an explicit distance computation. No alignment is run.
Inputs: action (required), scene_id (required), left, right, +3 more. Returns: object
control_3d_videoA
Control camera keyframes, or model animation when object_index is supplied. Model: list clips, update(index/speed), play, stop (pause), loop(enabled), goto(time in seconds, pauses). GLB/GLTF/FBX/DAE retain supported embedded animation; 3DS is static. With no object_index, manage camera keyframes: Add captures current camera. Update sets segment duration/dwell in seconds. Loop requires enabled; play needs two keyframes; stop restores camera. Returns reusable keyframe poses.
Inputs: action (required), scene_id (required), time, dwell, +6 more. Returns: object
export_3d_selectionA
Write the active or named subset to a NEW binary .ply under configured roots (maximum 256 MiB). Preserve decoded RGB, normals, scalar attributes, decoded indices, and original source_row when available (depth raster: pixel_v*width+pixel_u). Coordinates are object-local; header stores local_to_world and source origin. Returns a path, never point data/base64. No overwrite; not a lossless copy of the original file's numeric types.
Inputs: path (required), scene_id (required), name. Returns: object
inspect_3d_sceneARead-only
Inspect loaded geometry and build IDs (Python package/server and actual renderer; renderer_matches_bundle detects an old widget). Read coordinate conventions/units, camera position/direction/rotation center, projection and viewport, object transforms, opacity/color, exposure/background, selection criteria, geometry counts and bounds from the active inline viewer or explicit browser fallback. Times out if no renderer responds. Compare rendered_revision with the submitted revision.
Inputs: scene_id (required), detail. Returns: object
list_3d_scenesARead-only
List scenes owned by this MCP process and their local viewer URLs.
Inputs: no named parameters. Returns: result
manage_3d_scene_statesA
Save/restore complete camera, transforms, selection/named subsets, visibility, color, opacity and presentation. Export/import a .json under configured roots to persist after restarting. Reopen identical geometry in the same order before import; import stores a state; restore=True imports and applies it in one call. Existing files are never overwritten. Maximum 20 states, 4 MiB each. JSON does not embed geometry or playback. action=export_models writes all visible models as a new .glb (no name required), including supported native animation clips. GLB excludes Gaussian splats, grid/UI, source-row attributes and point-size settings; use subset PLY for analysis attributes. Export limit 256 MiB.
Inputs: action (required), scene_id (required), name, path, +2 more. Returns: object
manage_3d_selectionsA
Name the active selection; retain up to 20 independent subsets. Toggle each name's visibility or activate/focus it. Union/intersection/subtract combine two names from the same source into a new active selection; save it to retain it. Defaults isolate=False and focus=False preserve existing visibility and camera. Empty set results return status=empty, clear the active selection, and cannot export the previous result. Geometry updates expire selections; scene-state export persists them.
Inputs: action (required), scene_id (required), name, focus, +4 more. Returns: object
manage_3d_viewsA
Save/restore named camera views for this renderer session; undo the last agent camera change (up to 50). Names are not persisted after closing/reloading the widget. Does not restore geometry or filters.
Inputs: action (required), scene_id (required), name, detail. Returns: object
measure_3d_sceneA
Add/list/clear visible measurements in scene units. Distance uses start/end XYZ; path_point appends end to the active path; undo removes its last point; close_path toggles closure.
Inputs: action (required), scene_id (required), end, start, +1 more. Returns: object
open_3d_filesA
Open local point clouds/meshes/splats/animated models together. Pass scene_id to append while preserving camera and existing objects. Include explicit supporting .bin/textures for GLTF/DAE/FBX; no implicit disk or network reads. Paths must be under configured roots. Returns a persistent scene_id and local URL; inspect to verify loading.
Inputs: paths (required), scene_id, open_browser. Returns: object
open_3d_urlA
Download one URL or a list of direct HTTP(S) 3D files into one scene; pass scene_id to append. Self-contained models recommended; external resources are not fetched implicitly. Download each file on the local MCP server and open it inline. This makes a network request to the supplied URL and redirects; no browser CORS is needed. Supports the same formats as local files plus gzip. Supply filename for extensionless/signed URLs. Defaults to a 256 MiB transfer/decompressed limit, at most 1 GiB; 30-second socket and 120-second transfer limits. No login/cookies or webpage extraction. Temporary files are deleted when the scene closes.
Inputs: url (required), filename, scene_id, max_bytes. Returns: object
open_depth_imageA
Project a depth/disparity raster inline using explicit calibration from surrounding files/context. Read viewer://depth-calibration for coefficient ordering and encoding. Calibration dimensions must match the raster; no parameter guessing. Supports NPY/NPZ, TIFF, PNG8/16, EXR, PFM and COLMAP dense .bin. Optional aligned RGB (HxWx3, 0..255), confidence and mask files. Pass scene_id to append without moving the camera. For a COLMAP dense workspace, set path=workspace and colmap_image=exact image name; calibration comes from its undistorted sparse model. Inspect after loading for pixel counts, provenance and projection diagnostics; picks/exports retain original pixel coordinates and raw values.
Inputs: path (required), rgb, mask, scene_id, +4 more. Returns: object
pick_3d_pointARead-only
Pick normalized canvas XY without moving the camera. Returns hit/miss, world XYZ, object and decoded point indices and scalar attributes. Mesh/splat picks may have null indices; never infer object identity from those.
Inputs: screen (required), scene_id (required), detail. Returns: object
preview_3d_viewsARead-only
Return one labeled multi-view PNG to choose a useful angle, preserving the original camera. Disable split comparison first. Includes enabled grid, legend and selection summary.
Inputs: scene_id (required), presets.
read_viewer_dataDRead-only
App-only transport: session metadata, pending commands or bounded geometry chunks.
Inputs: resource (required), scene_id (required), offset, renderer_id. Returns: object
select_3d_regionA
One-step select/isolate/focus with PNG preview. Select all points in an object, or intersect scalar field values, world box [minX,minY,minZ,maxX,maxY,maxZ], and plane halfspace ax+by+cz+d>=0. Creates a reversible highlighted point subset; clear restores prior visibility. Label IDs are numeric, not semantic object names: inspect attributes/pick first. No automatic segmentation; point clouds only. Replaces the previous selection. Disable highlight to preserve original colors. Moving the plane requires another select call.
Inputs: scene_id (required), field, focus, plane, +8 more.
set_3d_appearanceA
Set exposure stops, background #RRGGBB, persistent pivot axes, coordinate grid, object/color legend and UI theme. gamma_correction matches the UI toggle: true treats source RGB as linear (extra gamma appearance); false decodes sRGB before shading. Enabled grid/legend are also included in agent PNG captures. Axes may briefly appear during interaction when persistent axes are off.
Inputs: scene_id (required), axes, grid, theme, +5 more. Returns: object
set_3d_cameraA
Partially update camera position, target (rotation center), up or vertical FOV in degrees. Rotation is absolute XYZ Euler degrees; it moves target along camera -Z at the previous pivot distance. Rotation cannot combine with target/up. Fit frames visible geometry, optionally at the new FOV. Returns applied view state.
Inputs: scene_id (required), up, fit, fov, +4 more. Returns: object
set_3d_objectA
Set overlay opacity (0..1), visibility, world-unit point size (or point_size_mode=adaptive for a camera-dependent 2/4/8 pixel target; point_size_pixels=1..64 explicitly sets that target and enables adaptive sizing), points/mesh representation, fixed RGB color or original/intensity/scalar coloring. Get object_index, scalar_fields and available_color_modes from inspection; these include palette indices and projected colors when available. Mesh requires faces. Fixed color and color_mode are mutually exclusive.
Inputs: scene_id (required), object_index (required), mode, color, +7 more. Returns: object
submit_viewer_replyC
App-only transport: acknowledge a rendered command result.
Inputs: reply (required), scene_id (required). Returns: object
transform_3d_objectA
Transform one cloud/mesh without changing source files or camera. Translate/scale use vector XYZ; rotate uses vector axis plus angle degrees (90 for quarter turns); quaternion uses XYZW, normalized. Matrix is affine 4x4 COLUMN-MAJOR, matching inspection (transpose row-major UI input). Default composes currentdelta in local space; world uses deltacurrent. pivot=center rotates/scales around the current bounding-box center; explicit XYZ pivot uses the chosen space; omitted pivot is the coordinate origin. Undo restores the last of up to 50 agent edits per object. replace=True sets an absolute transform. Invert/reset act on the current matrix. Inspect local_to_world to verify. Visibility, point size and coloring use set_3d_object.
Inputs: action (required), scene_id (required), object_index (required), angle, +7 more. Returns: object
update_3d_sceneC
Replace the existing scene's geometry while preserving its camera. Omitted overlays/vectors are removed. Reuses the active inline viewer or explicit browser fallback.
Inputs: points (required), scene_id (required), colors, target, +2 more. Returns: object
visualize_pointsA
Visualize up to 20,000 XYZ points, optional RGB (integer 0..255), target overlay, or anchored vector arrows. Use files for larger data; coordinates are not automatically normalized.
Inputs: points (required), colors, target, vectors, +2 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 27 tools
Several tools occupy near-adjacent roles: set_3d_camera vs navigate_3d_view for camera control, capture_3d_view vs preview_3d_views for image inspection, and manage_3d_views vs manage_3d_scene_states for saved state. The long descriptions help, but an agent must carefully compare multiple tools before selection. The app-only transport tools (submit_viewer_reply, read_viewer_data) also blur the boundary between domain actions and internal communication.
The naming is generally very consistent: snake_case verb-first names such as open_3d_files, set_3d_camera, and manage_3d_scene_states create a clear pattern. Minor divergences like open_depth_image, visualize_points, submit_viewer_reply, and read_viewer_data do not use the same 3d marker, but the overall verb_noun convention remains predictable.
With 27 tools, the surface is too large; only a handful of related verbs are needed for the core workflows. Many tools could be grouped or filtered into a smaller, more focused set. The breadth may be useful, but the agent-facing tool count creates too much decision overhead.
The domain is broadly covered: opening local, remote, and depth data; inspecting, updating, closing, transforming, aligning, measuring, selecting, exporting, comparing, and animating scenes. Minor gaps include lack of explicit per-object deletion and a couple of internal app-only transport tools that do not fit the domain surface.
Maintenance
Related MCP Connectors
Generate, edit, and deploy immersive 3D/WebGL web projects from any MCP assistant.
Geometry and CAD file metadata extraction for STL, OBJ, PLY, PCD, LAS/LAZ, glTF/GLB.
Build editable 3D scenes, direct characters and cameras, and export AI video references with MCP.
Create, edit, render, save, and export voxel models with interactive 3D previews.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables scientific data introspection and visualization of VTK datasets with format-adaptive metadata extraction and interactive 3D visualization through MCP tools.1MIT
- AlicenseNot gradedqualityDmaintenanceEnables coding agents to visually inspect and diagnose 3D files (meshes and Gaussian splats) for defects like flipped normals or floaters, without GPU dependencies.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to procedurally generate, transform, inspect, and export 3D meshes and scenes through MCP tools.1MIT
- AlicenseAqualityBmaintenanceEnables MCP clients to inspect and measure native B-rep geometry, create and edit CAD models, export results, and optionally review models or prepare print jobs locally.11MIT