Skip to content
MCPBytes
DocsInspect a 3D model

Tool reference · 3D Models

Inspect a 3D model

Check geometry, dimensions, materials and topology before splitting a model.

MCP tool
inspect_3d_model
MCP endpoint
/mcp/3d
REST
POST /v1/tools/inspect_3d_model/jobs
Price
From 10 credits

Overview

Inspect a model's counts, bounds, units, materials and texture references. Compare stored topology with an analysis copy that merges exactly coincident vertices. Get a short summary and a detailed JSON report, without changing or segmenting the model.

Formats
.glb .gltf .obj .ply .stl .off .blend
Outputs
inspection.json and summary.txt
Dimensions
World-space bounds; units unknown when unspecified
Topology
Components, boundary edges, non-manifold edges, degenerate faces and watertightness
Blender
Evaluated meshes; pack resources into the file

Quickstart

Send the file as the request body with the options in the query string, or refer to it in a JSON body (upload_id or url) with an options object. The response is the new job; poll it until its status is final, then download the files in result.files.

Start a jobinspect.sh
curl "https://api.mcpbytes.com/v1/tools/inspect_3d_model/jobs?filename=cube.glb" \
  -H "Authorization: Bearer $MCPBYTES_API_KEY" \
  --data-binary @cube.glb
Response202 Accepted · trimmed
{
  "tool": "inspect_3d_model",
  "status": "queued",
  "options": {},
  "result": null
}
Get the resultread.sh
# JOB_ID is the id from the create response
curl "https://api.mcpbytes.com/v1/jobs/$JOB_ID" \
  -H "Authorization: Bearer $MCPBYTES_API_KEY"

# Once status is succeeded, read the report
curl "https://api.mcpbytes.com/v1/jobs/$JOB_ID/files/inspection.json" \
  -H "Authorization: Bearer $MCPBYTES_API_KEY"
Response200 OK · trimmed
{
  "tool": "inspect_3d_model",
  "status": "succeeded",
  "result": {
    "schema_version": 1,
    "object_count": 1,
    "mesh_instance_count": 1,
    "vertex_count": 8,
    "face_count": 12,
    "details_truncated": false,
    "notes": []
  }
}

A job can be canceled while it is queued: POST /v1/jobs/{id}/cancel.

More on statuses, downloads and retention in Jobs & files.

Input

One file per job, in one of these ways. The formats it accepts are listed in the overview.

Input sources
File body
REST only: the file itself as the request body, with ?filename= and the options in the query string.
upload_id
Create an upload URL (POST /v1/uploads, or create_upload over MCP), PUT the file to it, then pass the upload_id. Upload URLs expire after an hour.
url, filename
A public https URL. Add filename when the URL does not end in the file's extension.
# 1. Create an upload URL (valid for one hour)
curl https://api.mcpbytes.com/v1/uploads \
  -H "Authorization: Bearer $MCPBYTES_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filename": "cube.glb"}'

# 2. PUT the file to the "url" from the response
curl -X PUT --data-binary @cube.glb "$UPLOAD_URL"

# 3. Start the job with the "upload_id"
curl https://api.mcpbytes.com/v1/tools/inspect_3d_model/jobs \
  -H "Authorization: Bearer $MCPBYTES_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"upload_id\": \"$UPLOAD_ID\"
  }"

To retry safely, send an Idempotency-Key header (or idempotency_key in a JSON body): a repeated key returns the original job instead of starting a new one.

Options

This tool has no options: the input is all it needs.

Outputs

A succeeded job lists its files in result.files, each with a download url.

Output files
summary.txt
Readable counts, dimensions, topology checks and up to ten warnings.
inspection.json
Versioned report with per-instance geometry, units, resources and warnings.

Read either file with read_job_file or download it from result.files. Stored and merged topology are reported separately, without cross-instance welding. Watertightness is not a printability or self-intersection test. Reports over 10 MiB omit detailed arrays and set details_truncated.

Result summary

Next to files, the job's result has a summary you can check without downloading anything:

result
object_count
Objects in the scene.
mesh_instance_count
Mesh instances; a mesh used twice counts twice.
vertex_count, face_count
Vertices and triangles over every mesh instance.
details_truncated
true when the report exceeded 10 MiB and its detailed arrays were left out.
schema_version
Version of the inspection.json format.
notes
Up to ten warnings.

Tips

  • Over MCP, summary.txt comes back with the result. Read inspection.json with read_job_file, or GET /v1/jobs/{id}/files/inspection.json.
  • Topology is reported twice: as stored, and with exactly coincident vertices merged on an analysis copy. Compare them to tell vertex seams from real open boundaries.
  • Watertight is a topology check. It does not detect self-intersections or certify printability.
  • External resources are never fetched: pack textures into the file. Missing optional textures produce warnings; missing geometry fails the job.
  • Inspect, then split with the same upload_id while the upload lasts. Each is its own job.

MCP

Your agent calls inspect_3d_model. Connect it to https://api.mcpbytes.com/mcp/3d for this tool and the rest of its family (Create a 3D model, Create a 3D model from an image, Optimize a 3D model, Simplify a 3D model, Split a 3D model into parts), or to https://api.mcpbytes.com/mcp for every tool.

Claude Code

The first form signs in through the browser when you run /mcp. In .mcp.json (project root), ${MCPBYTES_API_KEY} is read from the environment when Claude Code connects. Claude Code docs

claude mcp add --transport http mcpbytes \
  https://api.mcpbytes.com/mcp/3d
Codex (CLI, IDE extension, ChatGPT desktop)

Codex reads the key from the environment variable each time it connects. The same table can go in ~/.codex/config.toml by hand; codex mcp add has no --header flag. Codex docs

codex mcp add mcpbytes --url https://api.mcpbytes.com/mcp/3d \
  --bearer-token-env-var MCPBYTES_API_KEY
Cursor

~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project). Remote servers take no "type". Without the header, the client signs you in with GitHub or an email link (OAuth). Cursor docs

~/.cursor/mcp.json
{
  "mcpServers": {
    "mcpbytes": {
      "url": "https://api.mcpbytes.com/mcp/3d",
      "headers": {
        "Authorization": "Bearer ${env:MCPBYTES_API_KEY}"
      }
    }
  }
}
11 more clients in the docs →

Arguments

The tool's options are flat arguments. Besides them:

inspect_3d_model arguments
upload_id
From create_upload, after the agent has PUT the file.
url, filename
A public https URL, and the file name when the URL does not end in the extension.
wait_seconds
0–45, default 20How long the call waits for the result. If the job is still running, the agent calls get_job.
max_length
16–100,000, default 20,000Bytes of summary.txt returned with the result; read the rest with read_job_file.
idempotency_key
OptionalReuse it with the same arguments when retrying after a network error.

What the agent sees

MCP tools
inspect_3d_model
Inspects a 3D model without segmentation or repair. Returns counts, bounds, units, resources and topology checks in inspection.json, with summary.txt inline. Compares stored topology with exactly coincident vertices merged per mesh. Supports .glb .gltf .obj .ply .stl .off .blend. Give upload_id or a public https url. Waits up to wait_seconds for the result. Costs 10 credits up to 50,000 faces, 25 credits up to 200,000 faces.
create_upload
Returns a one-hour URL to PUT a local file to; then call the tool with the upload_id.
get_job
Status and results of a job; waits up to wait_seconds for it to finish.
cancel_job
Cancel a queued job or a workflow whose can_cancel is true; repeated calls never delete results.
list_jobs
Your most recent jobs, newest first.
read_job_file
Reads a text output (.txt .json .md .csv) of a succeeded job in chunks.

Setup for every client, and how agents upload files and read results: Connect over MCP.

Agent skill

The MCPBytes skill teaches agents this tool, in references/inspect_3d_model.md. Agents without MCP run it through the REST API with the skill's script, which reads your key from MCPBYTES_API_KEY:

mcpbytes.py
python scripts/mcpbytes.py run inspect_3d_model model.glb --out inspection/
python scripts/mcpbytes.py read j_... inspection.json

Pricing

From 10 credits. The price follows the input's size and is charged once the input has been measured; starting a job needs at least the smallest price. A job that fails costs nothing: its charge is refunded.

Up to 50,000 faces
10 credits
Up to 200,000 faces
25 credits

One credit balance pays for every tool, and a new account starts with free credits. See Credits & prices or buy credits.

Limits

Limits
Inspection geometry
Up to 200,000 faces per model
At a time
1 job
Uploads
Up to 50 MB
Results
24 hours by default

GET /v1/me returns your limits and current usage; Limits & errors explains what happens when one is reached.

Errors

A failed job comes back with error.code, error.message and often error.hint. Codes are stable. Inputs that fail with a validation error will fail again unchanged.

Job errors
invalid_mesh
Invalid geometry, missing geometry data, or no triangle meshes.
unsupported_feature
Compressed geometry or unsupported external Blender data; export a self-contained GLB.
limit_exceeded
The model exceeds the face limit.
unsupported_format
The tool does not take this file type.
insufficient_credits
The job costs more than the balance, which is known once the input has been measured. Nothing was charged.
timeout
The job did not finish within its time limit.
out_of_memory
The file needs more memory than a job has.

Requests can also fail before a job starts, with an HTTP status: see HTTP errors.