Skill
Skill murphy977/3d-eyes/skill
👁️ Give your coding agent eyes for 3D — MCP server that renders, inspects, and diagnoses meshes & Gaussian splats. Zero GPU/OpenGL dependency.
npx -y skills add murphy977/3d-eyes --skill skillAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 22 days oldThe repository was created 22 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when the user reports a 3D model or scene looking wrong (black/invisible/gigantic/untextured model, holes, weird shading), asks to check or QA a 3D file (GLB, GLTF, OBJ, PLY, STL, .splat), works with Gaussian splats, or generates 3D assets with AI and wants them verified. Requires the 3d-eyes MCP server.
SKILL.md
3.7 KB, 864 tokens by cl100k_base, as published. Nobody here has run it
Debugging 3D files with 3d-eyes
You have eyes for 3D. The 3d-eyes MCP server renders any mesh or Gaussian
splat file so you can look at it instead of guessing from code. Trust what
you see in the render plus the JSON report over any assumption.
Workflow
- Always start with
inspect_scene(path). Look at the contact sheet (6 orthographic views + perspective) and read the findings before theorizing. - Need a closer look?
render_views(path, cameras=[{"azimuth": ..., "elevation": ..., "distance": 1.2}])- small distance zooms in,ortho: truefor exact silhouettes. - Fix the problem by editing the user's file or code (trimesh one-liners below).
- Verify with
diff_renders(before, after)and show the user the comparison image. Never claim a fix worked without looking at it.
Symptom → cause table
| What you see (or the user reports) | Likely cause | First check | Typical fix |
|---|---|---|---|
| Model renders black / dark in their engine | Flipped normals | Red faces in contact sheet (highlight_backfaces) | mesh.invert() or trimesh.repair.fix_normals(mesh) |
| Red patches on some sides only | Partially flipped faces | flipped_normals finding says "inconsistent winding" | trimesh.repair.fix_normals(mesh) |
| Model invisible or microscopic | Scale unit mismatch (mm vs m) | scale_anomaly finding; extents in stats | Scale by 1000 or 0.001 on export |
| Model gigantic, camera inside it | Same, opposite direction | extents > 1000 | Scale by 0.001 |
| Gray/white/magenta untextured surface | Broken texture paths | missing_textures finding lists the files | Fix relative paths or re-export as GLB (embeds textures) |
| Seams, shading artifacts along an edge | Non-manifold fins | nonmanifold finding | Delete/split extra faces on the offending edges |
| Raycasts/physics/boolean ops fail on a fine-looking model | Degenerate faces | degenerate_faces finding | mesh.update_faces(mesh.nondegenerate_faces()) |
| Splat scene has blobs floating in mid-air / haze | Training floaters | floaters in the splat report + white specks in renders | Crop by bounding box, prune by opacity, or retrain |
| File "won't load" anywhere | Corrupt/mislabeled file | inspect_scene returns a parse error report | Follow the error's fix field |
Interpreting the contact sheet
- Red triangles (default
highlight_backfaces=true) = faces whose winding normal points away from the camera. A closed, correct mesh shows almost no red. Red everywhere = fully inverted; red patches = inconsistent winding. - Views that look empty at standard distance while stats show geometry =
scale or offset problem; check
boundsin the report. - For splats: isolated bright specks away from the subject are floaters; the
report's
floaters.examplesgives their world coordinates for cropping.
Rules of thumb
- Inspect before and after every fix; attach the diff image in your reply.
- The report's
symptomfields are written to match what renders show - use them to connect findings to pixels. - AI-generated assets (Meshy, Tripo, Hunyuan3D, TRELLIS outputs): run
inspect_sceneas QA before the user ships them - flipped normals and missing textures are the two most common generator defects. - When the user's engine (Three.js, Unity, Blender) shows a problem that the contact sheet does NOT show, the bug is in their engine setup (lighting, camera, material assignment), not the asset - say so.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most debug triage skills give in 864 tokens
Counted across 839 of the 1,149 authors here whose files we hold, read 2026-08-07
- Investigate root cause before proposing any fixin 102 of 839, across 67 files
- Read error messages completelyin 89 of 839, across 49 files
- Create a failing test case before fixingin 84 of 839, across 46 files
- Reproduce the issue consistentlyin 82 of 839, across 41 files
- Change one variable at a timein 82 of 839, across 42 files
- Check recent changesin 74 of 839, across 36 files
- Write the regression test before fixingin 74 of 839, across 40 files
- Fix the root cause not the symptomin 60 of 839, across 45 files
- Implement a single fix at a timein 59 of 839, across 20 files
- Trace data flow backward to the sourcein 50 of 839, across 20 files
- Remove all debug instrumentationin 49 of 839, across 13 files
- Form a single hypothesisin 48 of 839, across 18 files
Said here and by no other author read
- Inspect the 3D file before theorizing
- Read the JSON report before theorizing
- Trust the render and report over assumptions
- Render specific camera views for closer inspection
- Verify fixes using a render diff
- Attach the diff image to your reply
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.