dev.glbforge/glbforge
NPM · @GLBFORGE/MCP · SCANNED OCT 4
Make AI-generated 3D assets web-ready: budgets, SSIM-verified optimization, STL/USDZ export.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security99
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 37 of 143 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to glbforge/glbforge). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 22 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability76
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 6332 tokens (~234/item across 27 items; 27 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management87
- Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage95
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 82% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 27 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 27 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the dev.glbforge/glbforge MCP server?
dev.glbforge/glbforge runs locally as an npm package, launched with npx -y @glbforge/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @glbforge/mcp
claude mcp add dev-glbforge-glbforge -- npx -y @glbforge/mcp
{
"mcpServers": {
"dev-glbforge-glbforge": {
"command": "npx",
"args": [
"-y",
"@glbforge/mcp"
]
}
}
} {
"servers": {
"dev-glbforge-glbforge": {
"command": "npx",
"args": [
"-y",
"@glbforge/mcp"
]
}
}
} codex mcp add dev-glbforge-glbforge -- npx -y @glbforge/mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"dev-glbforge-glbforge": {
"type": "local",
"command": [
"npx",
"-y",
"@glbforge/mcp"
],
"enabled": true
}
}
} openclaw mcp add dev-glbforge-glbforge --command npx --arg -y --arg @glbforge/mcp
mcp_servers:
dev-glbforge-glbforge:
command: "npx"
args: ["-y", "@glbforge/mcp"] {
"McpServers": {
"dev-glbforge-glbforge": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"@glbforge/mcp"
]
}
}
} assistant mcp add dev-glbforge-glbforge -t stdio -c npx -a -y @glbforge/mcp
{
"mcpServers": {
"dev-glbforge-glbforge": {
"command": "npx",
"args": [
"-y",
"@glbforge/mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Oct 26 −1
- Stability: pass → 0.87 functional
- 3 Oct 26 0
- Stability: 0.97 → pass security
- 2 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 29 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 27 Sept 26 −2
- Stability: pass → 0.80 functional
- 26 Sept 26 0
- Stability: 0.97 → pass security
- 25 Sept 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 7 Oct 2026 · Analysed npm/@glbforge/mcp@0.8.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | glbforge/glbforge |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/glbforge/glbforge/.github/workflows/release.yml@refs/tags/v0.8.0 |
| Rekor log index | 2799006367 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:13116b69b79eb01a692b7f91d9422cf2939f0bd178bc50daba3c0492c07dd2b56df76da8eb4bb9503f9a8b7a55e463b238b589dea1944dd1979986f91 |
Background: How many MCP packages publish verified provenance →
Dependencies 143 packages
| Packages resolved | 143 |
|---|---|
| Stale | 37 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
analyze_glb ~232
Analyze a GLB/glTF against a web performance budget. Returns a compact report card (score, pass/fail, key numbers, every error + top findings, nextActions) plus a rendered thumbnail; errors[] carries every finding with a code and prim_path. Call inspect_report for full findings/textures/topology, inspect_all for the format-agnostic view. Run before and after any optimization.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .glb file |
| preview | string | – | Rendered PNG of the asset returned with the result: thumbnail (one 3/4 view) | turntable (4 angles tiled 2x2) | none |
| profile | string | – | Budget profile: mobile-hero | desktop-hero | product-configurator; pin a version with name@N (e.g. mobile-hero@1) |
| render | boolean | – | Checkpoint render: true = attach a thumbnail even if preview=none, false = no image (overrides preview) |
| topology | boolean | – | Run the (slower) weld/edge topology pass |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
analyze_performance ~240
Totals and estimates (triangles, vertices, draw calls, file size, GPU memory, prim count, scene depth, animation seconds), instancing_candidates, and a budget_check against a profile (ios_ar | visionos | web, a budget profile like mobile-hero, or custom_limits) — each overage names the metric, value, limit and worst_offender_prim_path. Use it to pick targetTriangles for optimize_glb.
| Name | Type | Req | Description |
|---|---|---|---|
| custom_limits | object | – | Custom limits (override / replace the named profile): max_triangles, max_vertices, max_draw_calls, max_materials, max_textures, max_file_bytes, max_gpu_memory_mb, max_texture_size, max_texture_bytes,… |
| path | string | yes | Absolute path to a .glb, .gltf, .usdz, .usda, .usdc or .usd file |
| profile | string | – | Performance profile: ios_ar | visionos | web (documented in docs/performance-profiles.md), or a budget profile mobile-hero | desktop-hero | product-configurator[@N] |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
audit_directory ~106
Analyze every GLB in a directory against a budget profile in one call. Returns a per-file score table plus the failing list — then call optimize_glb on each failure (or ask before bulk-optimizing).
| Name | Type | Req | Description |
|---|---|---|---|
| dir | string | yes | Absolute directory path |
| profile | string | – | Budget profile: mobile-hero | desktop-hero | product-configurator; pin a version with name@N (e.g. mobile-hero@1) |
| recursive | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
capabilities ~97
What this GLBForge install can do right now: versions, which generation providers have keys (FAL_KEY → generate_image_to_3d; MESHY_API_KEY → meshy_*), whether a KTX2 encoder is installed (textureFormat=ktx2), profiles, and the working directory .env is read from. Call it before planning a generation or KTX2 route so you never hit a missing-key error mid-plan.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
compare_glb ~261
Measure how faithfully a candidate GLB matches a reference: visual SSIM over four fixed cameras (gated on the profile floor) plus geometric alignment (point-to-surface chamfer, F-scores, proportion IoU). Returns a reference | candidate | change-heatmap sheet for the weakest view. Use it to judge any optimization, a regenerated asset against the original, or two generators against each other.
| Name | Type | Req | Description |
|---|---|---|---|
| candidate | string | yes | Absolute path to the candidate .glb (e.g. the optimized file) |
| geometry | boolean | – | Also run the geometric alignment score (chamfer, F-scores, IoU). Costs seconds on 100k-tri meshes and up to a minute on multi-million-tri inputs; the visual score alone takes ~5s |
| minSsim | number | – | Override the SSIM floor |
| profile | string | – | Budget profile: mobile-hero | desktop-hero | product-configurator; pin a version with name@N (e.g. mobile-hero@1) |
| reference | string | yes | Absolute path to the reference .glb (e.g. the original) |
| size | integer | – | – |
| textures | boolean | – | Include base-color textures in the renders |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
diff ~338
What changed between two versions of an asset — including what the edit BROKE by accident. Call it after an edit, with the file you started from and the file you produced, before deciding whether to keep the change. Reports per-part size deltas ("'legs' is 30% narrower along X"), triangle and shell deltas, topology regressions (was watertight, now has 3 open loops), origin drift relative to the geometry, node transform changes, meshes added or removed, and with visual=true a front / side / top / iso render delta (SSIM per view, cameras fixed to the before framing so a size change reads as a change). Read `summary` first; it is written as a change note with regressions first. Findings are diff@1 rules (regressions at warning, neutral changes at info) with causes and fixes, mirrored into errors[]. For a single file, call inspect.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | yes | Absolute path to the later version |
| before | string | yes | Absolute path to the earlier version |
| lineage | string | – | Optional id naming the asset across renames, for the local opt-in usage counter (never sent anywhere) |
| profile | string | – | Rule profile for severities: authoring or a budget profile |
| size | integer | – | Pixels per view for visual=true |
| topology | boolean | – | Welded topology pass on both files (shells, watertight, open loops, non-manifold deltas) |
| visual | boolean | – | Render four canonical views of both and score SSIM per view (~150 ms per file at 128 px) |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
export_stl ~223
Export a GLB as binary STL for 3D printing — scaled to millimeters, rotated z-up (both reported as AXIS_CONVERTED / SCALE_CONVERTED). Reports watertightness (glbforge-extruded assets are watertight by construction; simplified AI meshes usually are too). Returns a thumbnail of the exported geometry. dry_run=true writes nothing.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | Compute everything in memory and return the diff it would apply; write nothing |
| out | string | yes | Absolute output path for the .stl |
| path | string | yes | Absolute path to the .glb |
| preview | string | – | Rendered PNG of the exported geometry returned with the result: thumbnail (one 3/4 view) | turntable (4 angles tiled 2x2) | none |
| render | boolean | – | Checkpoint render: true = attach a thumbnail even if preview=none, false = no image (overrides preview) |
| sizeMm | number | – | Largest printed dimension in millimeters |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
export_usdz ~311
Export a GLB as USDZ for iOS AR Quick Look: binary usdc layer, UsdPreviewSurface materials, PNG/JPEG textures (WebP is transcoded; KTX2 is rejected), store-only 64-byte-aligned zip. Skinned assets get a UsdSkel skeleton with the first clip sampled at 30 fps; morph targets become UsdSkel blend shapes. Use on the optimized .web.glb. Returns the packed files, diff, post_validation (validate of the written usdz: packaging + AR Quick Look compatibility), every export-time change as a coded entry in errors[], and a thumbnail. dry_run=true writes nothing.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | Compute everything in memory and return the diff it would apply; write nothing |
| format | string | – | Layer encoding: binary crate (default, small) or ASCII usda (debugging) |
| jpeg | boolean | – | Encode opaque color textures as JPEG (smaller) instead of PNG |
| out | string | yes | Absolute output path for the .usdz |
| path | string | yes | Absolute path to the .glb |
| preview | string | – | Rendered PNG of the exported asset returned with the result: thumbnail (one 3/4 view) | turntable (4 angles tiled 2x2) | none |
| render | boolean | – | Checkpoint render: true = attach a thumbnail even if preview=none, false = no image (overrides preview) |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
extrude_image ~492
Deterministic 2D graphic -> extruded 3D GLB (no AI, no credits, instant). Traces the image silhouette and projects the source image back on as texture. USE THIS instead of generation for flat artwork: logos, wordmarks, icons, stickers. Use generation for photographic or dimensional subjects. Supports a signage-style bevel on the rims. Returns the mesh stats, diff (the prims created), post_validation, and a thumbnail of the forged piece. dry_run=true writes nothing.
| Name | Type | Req | Description |
|---|---|---|---|
| bevel | number | – | Bevel radius in meters (signage look; try depth*0.25) |
| bevelSegments | integer | – | – |
| color | string | – | Hex color when texture=false, e.g. "#ff2266" |
| depth | number | – | Extrusion depth in meters (default width*0.08) |
| dry_run | boolean | – | Compute everything in memory and return the diff it would apply; write nothing |
| emboss | number | – | Luminance micro-relief in meters — bright artwork rises (try depth*0.15) |
| layers | integer | – | Layered color extrusion: quantize into N color layers at stepped depths (the "layered acrylic" look) |
| metallic | number | – | – |
| mode | string | – | Solid-pixel test: alpha (transparent bg) | luma (white bg). Auto-detected. |
| out | string | yes | Absolute output path for the .glb |
| path | string | yes | Absolute path to a PNG/JPEG/WebP with transparent or white background |
| pillow | number | – | Puffy-sticker dome height in meters (e.g. 0.04); supersedes bevel |
| preset | string | – | Material preset for the forged piece |
| preview | string | – | Rendered PNG of the forged piece returned with the result: thumbnail (one 3/4 view) | turntable (4 angles tiled 2x2) | none |
| render | boolean | – | Checkpoint render: true = attach a thumbnail even if preview=none, false = no image (overrides preview) |
| roughness | number | – | – |
| simplify | number | – | Contour tolerance in trace pixels |
| texture | boolean | – | Project source image as baseColor |
| threshold | integer | – | – |
| width | number | – | World width in meters |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
generate_image_to_3d ~123
True volumetric 3D from a single image via open models on fal.ai GPU inference (needs FAL_KEY — check capabilities first): hunyuan (Hunyuan3D-2, highest quality), trellis (balanced), triposr (fastest). Cheaper than Meshy for most subjects; use Meshy for the richest PBR texturing. Returns a request id — poll generation_status, then download.
| Name | Type | Req | Description |
|---|---|---|---|
| image | string | yes | Local path or http(s) URL of the source image |
| model | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
generation_status ~192
Check an open-model generation (from generate_image_to_3d); when COMPLETED, pass download=true with an out path to save the GLB — the result then includes post_validation and a thumbnail of what was generated. dry_run=true skips writing.
| Name | Type | Req | Description |
|---|---|---|---|
| download | boolean | – | – |
| dry_run | boolean | – | Compute everything in memory and return the diff it would apply; write nothing |
| model | string | yes | – |
| out | string | – | Absolute output path for the .glb when downloading |
| preview | string | – | Rendered PNG of the downloaded model returned with the result: thumbnail (one 3/4 view) | turntable (4 angles tiled 2x2) | none |
| render | boolean | – | Checkpoint render: true = attach a thumbnail even if preview=none, false = no image (overrides preview) |
| requestId | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
inspect ~586
Call this after EVERY edit to a mesh — each bpy script, boolean, join, export — before deciding what to do next. In one sub-second call it answers what is easy to get wrong blind: is it one connected shell or several floating pieces; is it a closed solid (watertight) or are there holes / overlapping faces; how big it is in real metres; which way is up; where the origin sits (base centre, centre, or floating off the object); whether node transforms are applied or mirrored. Read `summary` first. Every finding names a versioned rule (e.g. topo/open-edges from core-geometry@1), says whether it was measured, and carries a likely cause with its confidence plus a concrete fix; the same findings appear in errors[] with alias codes. `front` is always unknown (no honest heuristic exists) unless you declare it. Pass `expect` with what you meant to make ("chair, Z-up, meters, single-shell, 0.4-1.2m tall, front -Y, watertight, origin base") and it is checked as a contract: shell count, watertight, size range, origin are measured and fail as errors; a bare category gives a plausibility warning from a size table with a confidence. profile decides severities: authoring (default: topology problems are warnings, because they are most likely the last edit's doing) or a web budget such as mobile-hero (topology is informational). For per-mesh detail behind a finding use inspect_geometry; for materials, animation and budgets use inspect_all.
| Name | Type | Req | Description |
|---|---|---|---|
| expect | – | – | What you meant to make, free text ("chair, Z-up, single-shell, 0.4-1.2m tall, front -Y") or structured. Adds the intent@1 pack; unparsed tokens are reported |
| lineage | string | – | Optional id naming the asset across renames, for the local opt-in usage counter (never sent anywhere) |
| packs | array | – | Rule packs to run instead of the profile's: core-geometry | core-scene | intent (pin with @N) |
| params | object | – | Pack param overrides, e.g. { "core-geometry": { "fragmentFraction": 0.02 } } |
| path | string | yes | Absolute path to a .glb, .gltf, .usdz, .usda, .usdc or .usd file |
| profile | string | – | Rule profile: authoring or a budget profile mobile-hero | desktop-hero | product-configurator (pin with @N) |
| topology | boolean | – | Welded-space topology pass (shells, watertight, non-manifold). ~70 ms per 150k triangles; when false the topology rules are listed in `skipped` |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
inspect_all ~228
Everything at once for an UNFAMILIAR asset you did not author: validate + inspect_geometry + inspect_animation + inspect_materials + analyze_performance merged into one response, errors deduplicated. Call it once when a file arrives (a download, a generation result). While editing a mesh, call `inspect` instead after each change — it is the fast, rule-based read.
| Name | Type | Req | Description |
|---|---|---|---|
| custom_limits | object | – | Custom limits (override / replace the named profile): max_triangles, max_vertices, max_draw_calls, max_materials, max_textures, max_file_bytes, max_gpu_memory_mb, max_texture_size, max_texture_bytes,… |
| path | string | yes | Absolute path to a .glb, .gltf, .usdz, .usda, .usdc or .usd file |
| profile | string | – | Performance profile: ios_ar | visionos | web (documented in docs/performance-profiles.md), or a budget profile mobile-hero | desktop-hero | product-configurator[@N] |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
inspect_animation ~147
Does anything actually move? Clips with time range / fps / duration, animated prims and which properties animate, skeletons (joint_count, bound_meshes, max_influences_per_vertex, unbound_vertex_count), blend shapes with is_driven, root motion. Codes: SKELETON_UNBOUND, MESH_NOT_DEFORMING, BLENDSHAPE_UNDRIVEN, ANIMATION_ZERO_LENGTH, ANIMATION_NO_MOTION. Call it before render_animation_strip or export_usdz on any rigged asset.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to a .glb, .gltf, .usdz, .usda, .usdc or .usd file |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
inspect_geometry ~220
Per-mesh drill-down behind an `inspect` finding (for the edit loop itself call `inspect`: faster, semantic, named rules). Keyed by prim_path: vertex/face/triangle counts, is_manifold, degenerate faces, normals authored|missing and inverted-normal count, UV sets with out-of-range flags, world bounding box in metres; scene-level bounds, pivot position (pivot_at_base for AR placement) and scale warnings (largest dimension < small_scale or > large_scale). Use it to decide whether an asset needs normals, rescaling or re-pivoting before export.
| Name | Type | Req | Description |
|---|---|---|---|
| large_scale | number | – | Metres; SCALE_TOO_LARGE above this |
| path | string | yes | Absolute path to a .glb, .gltf, .usdz, .usda, .usdc or .usd file |
| small_scale | number | – | Metres; SCALE_TOO_SMALL below this |
| topology | boolean | – | Run the manifold / degenerate edge pass (O(n); skip for speed on huge meshes) |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
inspect_materials ~160
Materials with shader_type and bound_meshes, unbound_meshes, every texture (resolved, resolution, format, size_bytes, channel, color_space, used_by material+input, memory estimate), missing_textures, texture_memory_estimate_mb, non_power_of_two and oversized (threshold configurable). Codes: TEXTURE_UNRESOLVED, MATERIAL_UNBOUND, MESH_NO_MATERIAL, TEXTURE_OVERSIZED, TEXTURE_NPOT, TEXTURE_FORMAT_UNSUPPORTED.
| Name | Type | Req | Description |
|---|---|---|---|
| oversized_threshold | integer | – | Pixels; TEXTURE_OVERSIZED above this on either axis |
| path | string | yes | Absolute path to a .glb, .gltf, .usdz, .usda, .usdc or .usd file |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
inspect_report ~162
Drill into an analysis: full findings (with fix suggestions and rule data), per-texture stats, materials, welded-space topology, geometry per primitive, scene/generator facts, or the whole report. Re-analyzes deterministically, so it works on any file at any time.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .glb file |
| profile | string | – | Budget profile: mobile-hero | desktop-hero | product-configurator; pin a version with name@N (e.g. mobile-hero@1) |
| ruleId | string | – | findings only: exact rule id or prefix, e.g. "tex" or "perf/file-size" |
| section | string | – | – |
| severity | string | – | findings only |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
list_profiles ~91
List the web performance budget profiles: triangle/draw-call/texture/file-size/GPU-memory caps, the minimum visual-fidelity SSIM an optimization must keep, the profile version to pin in CI, and (with rationale=true) why each cap is what it is. (AR targets — ios_ar, visionos — live in analyze_performance.)
| Name | Type | Req | Description |
|---|---|---|---|
| rationale | boolean | – | Include the per-cap methodology text |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
meshy_create_task ~226
Start a Meshy generation task (needs MESHY_API_KEY — check capabilities first). kind "image-to-3d" takes a local image path or URL; kind "text-to-3d" takes a prompt (geometry preview stage — pass refine_from to texture a finished preview). Returns a task id immediately; poll meshy_task_status (generation takes minutes).
| Name | Type | Req | Description |
|---|---|---|---|
| enable_pbr | boolean | – | – |
| image | string | – | image-to-3d: local path or http(s) URL |
| input_task_id | string | – | remesh/retexture: the SUCCEEDED task to operate on |
| kind | string | yes | – |
| prompt | string | – | text-to-3d: what to generate; retexture: the style prompt |
| refine_from | string | – | text-to-3d: preview task id to refine (texture stage) |
| should_texture | boolean | – | image-to-3d: run the texture stage |
| target_polycount | integer | – | – |
| topology | string | – | remesh: output topology |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
meshy_download ~163
Download a finished Meshy task's GLB to a local path; returns post_validation and a thumbnail of the model. dry_run=true skips writing.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | Compute everything in memory and return the diff it would apply; write nothing |
| kind | string | yes | – |
| out | string | yes | Absolute output path for the .glb |
| preview | string | – | Rendered PNG of the downloaded model returned with the result: thumbnail (one 3/4 view) | turntable (4 angles tiled 2x2) | none |
| render | boolean | – | Checkpoint render: true = attach a thumbnail even if preview=none, false = no image (overrides preview) |
| taskId | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
meshy_task_status ~43
Check a Meshy task: status, progress %, and (when finished) model URLs.
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | yes | – |
| taskId | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
optimize_glb ~439
Optimize a GLB for web delivery: weld, simplify to the profile triangle budget (bone-aware for skinned/morphing meshes), fill smooth normals, resize/re-encode textures to WebP, meshopt-compress. Writes the optimized file and returns a before/after diff (prims added/removed, properties changed), the measured visual-fidelity SSIM, the compact report, post_validation of the output, a sha256, and a thumbnail — or a reference | result | change sheet when SSIM fails. Every change the pipeline makes on its own (joined prims, generated normals, re-encoded textures) is listed in errors[] with a code. dry_run=true computes everything and writes nothing. Typically 90%+ smaller.
| Name | Type | Req | Description |
|---|---|---|---|
| compress | boolean | – | – |
| dry_run | boolean | – | Compute everything in memory and return the diff it would apply; write nothing |
| lods | array | – | Extra LOD triangle targets, e.g. [40000, 10000] |
| out | string | – | Output path (default: <input>.web.glb) |
| path | string | yes | Absolute path to the input .glb |
| preview | string | – | thumbnail | turntable | compare (reference | result | change heatmap of the weakest view) | none. A failing SSIM always returns the comparison sheet. |
| profile | string | – | Budget profile: mobile-hero | desktop-hero | product-configurator; pin a version with name@N (e.g. mobile-hero@1) |
| render | boolean | – | Checkpoint render: true = attach a thumbnail even if preview=none, false = no image (overrides preview) |
| targetTriangles | integer | – | – |
| textureFormat | string | – | webp = smallest file; ktx2 = GPU-resident compression, ~8x less video memory (needs basisu/toktx installed) |
| textures | boolean | – | – |
| verify | boolean | – | Perceptual verification: SSIM of fixed-camera renders before vs after, gated on the profile floor; a failing SSIM fails the report |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
render ~306
Deterministic software render (no GPU) of any GLB / USDZ / USD: view=front (one straight-on view), thumbnail (one 3/4 view), turntable (N angles tiled into one contact sheet, default 8), or custom (explicit camera position/target/fov). Pass time (seconds) or frame (index at fps) to pose an animated asset. Returns the PNG plus the camera(s) used so you know what you are looking at. Optionally saves the PNG.
| Name | Type | Req | Description |
|---|---|---|---|
| angles | integer | – | turntable: number of azimuths |
| animation | integer | – | Clip index when the asset has several |
| camera | object | – | custom: eye position (world metres), look-at target (default scene centre), vertical fov in degrees (default 40) |
| fps | number | – | Frame rate used to convert frame → time (USD files use their own timeCodesPerSecond) |
| frame | integer | – | Animation frame index at fps (alternative to time) |
| out | string | – | Absolute path to also save the PNG |
| path | string | yes | Absolute path to a .glb, .gltf, .usdz, .usda, .usdc or .usd file |
| size | integer | – | Pixels per view/tile |
| textures | boolean | – | Sample base-color textures |
| time | number | – | Animation time in seconds (posed render) |
| view | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
render_animation_strip ~269
Contact sheet of an animated asset at the requested frames (stills, labelled with frame and time) so you can verify that it moves the way it should. frames are indices at fps (or pass times in seconds). include_clip=true also writes an animated GIF next to the sheet for human reviewers. Run inspect_animation first to learn the clip range.
| Name | Type | Req | Description |
|---|---|---|---|
| animation | integer | – | Clip index |
| camera | object | – | – |
| columns | integer | – | – |
| fps | number | – | Frame rate for frame → time (USD files use their own timeCodesPerSecond) |
| frames | array | – | Frame indices at fps, e.g. [0, 10, 20, 30]. Default: 8 evenly spaced frames over the clip |
| include_clip | boolean | – | Also write an animated GIF (<out or path>.strip.gif) |
| out | string | – | Absolute path to save the contact sheet PNG |
| path | string | yes | Absolute path to a .glb, .gltf, .usdz, .usda, .usdc or .usd file |
| size | integer | – | Pixels per tile |
| textures | boolean | – | – |
| times | array | – | Times in seconds (alternative to frames) |
| view | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
render_preview ~124
Render a GLB with the deterministic software rasterizer (no GPU): one thumbnail or a 2x2 turntable of four angles. Use it to look at an asset before deciding, or to verify a result. Optionally saves the PNG. (For front / N-angle / custom cameras, animation frames, and USD inputs use `render`.)
| Name | Type | Req | Description |
|---|---|---|---|
| out | string | – | Absolute path to also save the PNG |
| path | string | yes | Absolute path to the .glb |
| size | integer | – | Pixels per view |
| view | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
ship_asset ~367
One call from anything to web-ready. A .glb is optimized to the budget and gated. An image is routed: flat artwork forges instantly (free); photographic input returns a routing instruction to call generate_image_to_3d (then optimize_glb the result). Returns the compact report, a geometric fidelity bound, the measured visual-fidelity SSIM (fixed-camera renders before vs after), a sha256 of the output, diff + post_validation, and a thumbnail — or a reference | result | change sheet when SSIM fails. dry_run=true returns the diff without writing.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | Compute everything in memory and return the diff it would apply; write nothing |
| input | string | yes | Absolute path: .glb or image (png/jpg/webp/svg) |
| lods | array | – | Extra geometry-only LOD files, e.g. [40000, 10000] |
| out | string | – | Output path (default: <input>.web.glb) |
| preview | string | – | Rendered PNG of the shipped asset returned with the result: thumbnail (one 3/4 view) | turntable (4 angles tiled 2x2) | none |
| profile | string | – | Budget profile: mobile-hero | desktop-hero | product-configurator; pin a version with name@N (e.g. mobile-hero@1) |
| render | boolean | – | Checkpoint render: true = attach a thumbnail even if preview=none, false = no image (overrides preview) |
| targetTriangles | integer | – | Override the profile triangle target |
| textureFormat | string | – | – |
| verify | boolean | – | Perceptual (SSIM) verification; a failing SSIM fails the report |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
validate ~186
Does the asset open, and is it well-formed for its target? Returns format, USDZ packaging compliance (stored entries, 64-byte alignment, allowed file types), layer metadata (default_prim, up_axis, meters_per_unit, layer_stack), schema errors, and AR Quick Look compatibility with arkit_issues — every issue with a stable code and prim_path. mode=quick (default) runs no renders and finishes well under a second; mode=full adds analyze_performance and a front render. Call it first on any file, and after every mutation.
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | – | – |
| path | string | yes | Absolute path to a .glb, .gltf, .usdz, .usda, .usdc or .usd file |
| profile | string | – | mode=full only: performance profile for the budget check (default ios_ar) |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | yes | – |
| duration_ms | integer | yes | – |
| errors | array | yes | Every diagnostic (error, warning, info), errors first |
| ok | boolean | yes | false only when the tool could not run; an asset with errors in it is still ok:true |
| summary | string | yes | One line, human-readable |
No examples provided.
What is the dev.glbforge/glbforge MCP server?
dev.glbforge/glbforge is an MCP server listed in the public MCP registry as dev.glbforge/glbforge. Make AI-generated 3D assets web-ready: budgets, SSIM-verified optimization, STL/USDZ export. This page covers its npm package (@glbforge/mcp).
Is the dev.glbforge/glbforge MCP server safe to use?
dev.glbforge/glbforge scores 93 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 October 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the dev.glbforge/glbforge MCP server expose?
dev.glbforge/glbforge exposes 27 tools: inspect, diff, validate, inspect_geometry, inspect_animation, and 22 more. Their descriptions and schemas cost roughly 6,332 tokens of context every time the server is loaded.
Is the dev.glbforge/glbforge MCP server still maintained?
dev.glbforge/glbforge is still listed as active in the MCP registry. We last reached this channel on 4 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the dev.glbforge/glbforge MCP server under?
dev.glbforge/glbforge declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.