AI3D Studio
REMOTE · AI3D.STUDIO
Generate 3D models from images or text with AI, then retexture or convert them to STL, 3MF or OBJ.
Available components
Last scanned (20 hours ago)
Scores higher than 96% of remote servers
Reachable. Last reached 4 Nov 2026.
Category Design and Media
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security97
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server supports Client ID Metadata Documents, the current MCP client-registration mechanism. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability66
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 2486 tokens (~191/item across 13 items; 13 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 Management73
- Stability check failed: schema churn in the 26 days we've observed: 2 tool removals, 0 breaking changes, 0 auth/transport breaks, 0 additions. See how to fix → Fail
Tool Coverage91
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 67% 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 13 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
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.
- 3 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 66 to 69.
- 1 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 59 to 63.
- 30 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 52 to 56.
- 28 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 46 to 49.
- 26 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 39 to 43.
- 23 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 29 to 33.
- 21 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 22 to 26.
- 20 Oct 26 +3
- Authorization: fail → pass ▲ security
- First check of Authorization: pass security
- The server rewrote its instructions, which are the text every model session reads security
- The server changed its declared name: aiapps-agent-mcp → studio.ai3d/ai3d security
- “generate” added an optional parameter “expectedCredits” cosmetic
- “generate_3d” added an optional parameter “expected_credits” cosmetic
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 4 Nov 2026 · Probed https://ai3d.studio/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=ai3d.studio | CN=WE1,O=Google Trust Services,C=US | 26 Sept 2026 | 26 Dec 2026 | ECDSA 256 | ECDSA-SHA256 | 851d2b9954e8fa5b13fff27e4881217e |
| SANs: ai3d.studio, *.ai3d.studio | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of ai3d.studio. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| studio. | present | 1354 | 8 | Verified |
| ai3d.studio. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer resource_metadata="https://ai3d.studio/.well-known/oauth-protected-resource/mcp", scope="read generate"
Bearer resource_metadata="https://ai3d.studio/.well-known/oauth-protected-resource/mcp", scope="read generate" | Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains |
| content-security-policy | frame-ancestors 'self' |
| x-content-type-options | nosniff |
| x-frame-options | SAMEORIGIN |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(), microphone=(self), geolocation=(), browsing-topics=() |
Protected resource metadata
| Document | https://ai3d.studio/.well-known/oauth-protected-resource/mcp |
|---|---|
| Retrieved | Yes |
| Resource | https://ai3d.studio/mcp |
| Authorisation server | https://ai3d.studio/api/auth |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://ai3d.studio/mcp | Verified | 200 | |
| http (plaintext) | http://ai3d.studio/mcp | HTTPS enforced | 301 | https://ai3d.studio/mcp |
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 →
convert_model Convert, compress or repair a Library model ~427
Convert one of the account’s Library 3D models (a GLB) to GLB, STL, 3MF, OBJ or PLY on the server, optionally simplifying it, compressing its geometry, scaling it to a real-world size, moving its origin or repairing it for printing (holes, flipped faces, debris; STL, 3MF, OBJ or PLY), and file the result in the Library as a new creation made from it. Free (no credits) and answered at once. STL and 3MF are millimetres and Z-up for slicers; OBJ and PLY are geometry only, in metres; GLB keeps materials and textures and can be meshopt-compressed. Take asset_id from get_job or search_library (a file of a finished 3D job). Models over 50 MB or 2,000,000 triangles, and Draco-compressed GLBs, are refused. The same conversion run twice returns the same creation.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_id | string | yes | A GLB file of one of your Library models. |
| compression | string | – | GLB only: meshopt (default, smallest) or none. |
| format | string | – | The file to make; glb when omitted. |
| name | string | – | – |
| origin | string | – | Move the origin to the bottom centre (default when resizing) or the centre. |
| project_id | string | – | – |
| repair | boolean | – | Repair for printing first: weld, drop broken and duplicate faces and loose debris, fix flipped faces, fill holes. stl, 3mf, obj, ply only; up to 200,000 triangles (simplify first for more). |
| resize_height | number | – | Scale the model to this height, in metres. |
| resize_longest_side | number | – | Scale the model so its longest side is this long, in metres. Not with resize_height. |
| simplify | – | – | Share of triangles to keep: 1 (default), 0.75, 0.5 or 0.25. |
| Name | Type | Req | Description |
|---|---|---|---|
| asset_id | string | yes | Its file, for another convert_model. |
| content_type | string | yes | – |
| created | boolean | yes | False when the same conversion was already in the Library: that creation is returned. |
| format | string | yes | – |
| job_id | string | yes | The new Library creation: pass to get_job like any job. |
| repair | object | – | What repair found and fixed, when repair was asked for. |
| size_bytes | integer | yes | – |
| triangles_after | integer | yes | – |
| triangles_before | integer | yes | – |
| url | string | yes | Public https download URL of the file. |
No examples provided.
estimate_cost Estimate credit cost ~141
Price a generation before starting it: the credits this model would charge for these options, and whether the current balance covers it. Uses the same validation and price calculation as generate_3d and generate, so for a valid request the figure is exactly what is charged. Omit scene to price every scene of the model. Nothing is charged and nothing is started.
| Name | Type | Req | Description |
|---|---|---|---|
| model | string | yes | A model id from list_models. |
| options | object | – | The options you intend to pass; they change the price. |
| prompt | string | – | – |
| scene | string | – | A scene id from list_models, e.g. 'image-to-3d'. |
| Name | Type | Req | Description |
|---|---|---|---|
| available | boolean | yes | – |
| balance | number | yes | Credits the account holds now. |
| media_type | string | yes | – |
| model | string | yes | – |
| quotes | array | yes | – |
No examples provided.
generate Start a generation ~328
Start an async AI generation of any media type and return its job id. The input shape depends on the model (see list_models); for 3D prefer generate_3d. To run an image preset (list_models returns them: figurine, style, pose, convert), send mediaType "image", scene "image-to-image", options.image (the picture, or the subject then a reference), options.preset (its id) and optionally options.preset_addons and options.preset_background; the server composes the prompt, and prompt is then only your extra instructions. Bills credits: check the price with estimate_cost first. Pass a stable idempotencyKey when retrying — a retry with the same key replays the original job instead of billing twice. Then call get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| expectedCredits | integer | – | The credits estimate_cost answered for this request. If the price has moved since, nothing is started or charged and the error (price_changed) gives the new price. |
| idempotencyKey | string | – | – |
| mediaType | string | yes | Generation family, e.g. 'image' | 'video' | '3d' | 'music' — see list_models. |
| model | string | yes | – |
| options | object | – | Model-specific options; derive from list_models (include_inputs). For an image preset: preset (its id), preset_addons, preset_background. |
| prompt | string | – | The prompt; with options.preset, only your additional instructions. |
| scene | string | – | – |
| workflowType | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| credits_charged | number | yes | Credits taken from the balance. |
| deduped | boolean | yes | True when an earlier call with the same idempotency key already started this job: nothing was charged again. |
| job_id | string | yes | Pass to get_job to follow progress. |
| media_type | string | yes | – |
| model | string | yes | – |
| outputs | integer | yes | How many results this job makes. |
| scene | string|null | yes | – |
| status | string | yes | pending and processing are running; success, partial, failed and canceled are final. 'partial' means some outputs finished and the rest were refunded. |
No examples provided.
generate_3d Generate a 3D model ~246
Start a 3D generation and return its job id at once. mode picks the input: text (prompt), image (options with the image URL), multiview (several view images), sketch, or model (edit an existing 3D model). Take the model id and its option names from list_models, and check the price with estimate_cost first: this spends credits. Pass a stable idempotency_key when retrying so a retry replays the same job instead of billing twice. Then call get_job to follow it.
| Name | Type | Req | Description |
|---|---|---|---|
| expected_credits | integer | – | The credits estimate_cost answered for this request. If the price has moved since, nothing is started or charged and the error (price_changed) gives the new price. |
| idempotency_key | string | – | Reuse the same value when retrying this exact request. |
| mode | string | yes | Which input the model is given. |
| model | string | yes | A 3D model id from list_models. |
| options | object | – | Model-specific options; take the field names from list_models with include_inputs, and price them with estimate_cost first. |
| prompt | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| credits_charged | number | yes | Credits taken from the balance. |
| deduped | boolean | yes | True when an earlier call with the same idempotency key already started this job: nothing was charged again. |
| job_id | string | yes | Pass to get_job to follow progress. |
| media_type | string | yes | – |
| model | string | yes | – |
| outputs | integer | yes | How many results this job makes. |
| scene | string|null | yes | – |
| status | string | yes | pending and processing are running; success, partial, failed and canceled are final. 'partial' means some outputs finished and the rest were refunded. |
No examples provided.
get_balance Check credit balance ~74
Get the credits this account can spend now (and how many of them come from the subscription or are permanent), the plan name when there is one, and — when you are connected with an API key that has a monthly credit limit — that limit, what the key has used this month, and when it resets. Read-only.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account | object | yes | – |
| api_key_limit | – | yes | Only for an API key with a monthly credit limit. |
| credits | object | yes | – |
| plan | string|null | yes | The active subscription plan; null on pay-as-you-go. |
No examples provided.
get_batch Get a batch’s progress ~71
The state of a batch and of each picture in it: queued, running, done, failed or cancelled, the job_id of its run once started (get_job gives the files), credits charged, and whether retry_batch can run it again.
| Name | Type | Req | Description |
|---|---|---|---|
| batch_id | string | yes | The batch id start_batch returned. |
| Name | Type | Req | Description |
|---|---|---|---|
| batch_id | string | yes | – |
| charged_credits | number | yes | What its runs were charged so far. |
| counts | object | yes | – |
| created_at | string | yes | – |
| item_count | integer | yes | – |
| items | array | yes | – |
| model | string | yes | – |
| per_item_credits | number | yes | – |
| quoted_credits | number | yes | What the batch costs if every picture runs. |
| scene | string | yes | – |
| settled_at | string|null | yes | – |
| status | string | yes | – |
No examples provided.
get_job Get job status and results ~96
Get a job started by generate_3d or generate: its status, progress, credits charged and refunded, and — when it has finished — the result files with their public download URLs, including other formats where the model returned them. Poll about every 5–10 seconds while status is pending or processing; stop when is_terminal is true.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | string | yes | The job id returned by generate_3d or generate. |
| Name | Type | Req | Description |
|---|---|---|---|
| completed_at | string|null | yes | – |
| created_at | string|null | yes | – |
| credits | object | yes | – |
| error | – | yes | – |
| files | array | yes | Result files with public download URLs; empty until ready. |
| is_terminal | boolean | yes | True once the job is final and will not change again. |
| job_id | string | yes | – |
| media_type | string | yes | – |
| model | string | yes | – |
| outputs | object | yes | – |
| progress | number | yes | 0 to 1: finished outputs over expected outputs. |
| scene | string|null | yes | – |
| status | string | yes | pending and processing are running; success, partial, failed and canceled are final. 'partial' means some outputs finished and the rest were refunded. |
No examples provided.
list_batches List recent batches ~68
The account’s batches of one scene from the last 24 hours, newest first, with each picture’s progress — and how many pictures its plan lets one batch hold (allowance; 0 means the plan includes no batches).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| scene | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| allowance | integer | yes | – |
| batches | array | yes | – |
No examples provided.
list_job_files List job download formats ~144
List the files a finished job already has, one per format: the main result plus any alternate formats the model returned (for 3D models, for example glb with fbx or usdz), each with a public download URL. Pass format to find one format. This does not convert: if the format asked for is not there, available_formats says what is, and a model can be exported to other formats from the web app model viewer.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | A file format to look for, e.g. 'glb' or 'stl'. |
| job_id | string | yes | The job id returned by generate_3d or generate. |
| Name | Type | Req | Description |
|---|---|---|---|
| available_formats | array | yes | – |
| files | array | yes | – |
| job_id | string | yes | – |
| note | string|null | yes | – |
| requested_format | string|null | yes | – |
| status | string | yes | pending and processing are running; success, partial, failed and canceled are final. 'partial' means some outputs finished and the rest were refunded. |
No examples provided.
list_models List models and prices ~221
List the models this account can generate with, grouped by what they make (3D, image, …): each with its id, the scenes (input modes such as text-to-3d or image-to-3d) it supports, and the credits it costs at default options. Call this first to choose a model id, then estimate_cost for an exact price. Set include_inputs to also get the option fields of each scene (names, allowed values, ranges). An account whose app has Image Maker also gets presets: ready-made picture conversions (figurine, style, pose, …) to run with generate by passing options.preset. batches lists the scenes start_batch can run over several Library pictures at once, with the models each may use.
| Name | Type | Req | Description |
|---|---|---|---|
| available_only | boolean | – | Leave out models that are listed but cannot be started. |
| include_inputs | boolean | – | Include the option fields of every scene (larger result). |
| media_type | string | – | Only models of this kind, e.g. '3d' or 'image'. |
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | – |
| batches | array | yes | Scenes start_batch can run over several pictures; empty when the app offers none. |
| count | integer | yes | – |
| models | array | yes | – |
| presets | array | yes | Image presets this app offers; empty when it has none or media_type is not image. |
No examples provided.
retry_batch Retry a batch’s failed pictures ~85
Queue the batch’s failed pictures (and any stopped for want of credits) again as new runs, or only the item_ids given. Charged as each starts, like a new batch of that many pictures: the balance must cover them and they count against a monthly limit.
| Name | Type | Req | Description |
|---|---|---|---|
| batch_id | string | yes | The batch id start_batch returned. |
| item_ids | array | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| batch_id | string | yes | – |
| charged_credits | number | yes | What its runs were charged so far. |
| counts | object | yes | – |
| created_at | string | yes | – |
| item_count | integer | yes | – |
| items | array | yes | – |
| model | string | yes | – |
| per_item_credits | number | yes | – |
| quoted_credits | number | yes | What the batch costs if every picture runs. |
| requeued | integer | yes | Pictures queued again. |
| scene | string | yes | – |
| settled_at | string|null | yes | – |
| status | string | yes | – |
No examples provided.
search_library Search my library ~154
Search the Library of past generations kept by this account, newest first: filter by words in the prompt or title and by kind (3d, image, …). Returns the job id, model, status and result file URLs of each run. Use next_cursor to page. Only runs of this account are ever searched. For the full detail of one run call get_job.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | The next_cursor of the previous result. |
| limit | integer | – | How many to return, 1 to 50. |
| media_type | string | – | Only runs of this kind, e.g. '3d' or 'image'. |
| query | string | – | Words to look for in the prompt or title. |
| Name | Type | Req | Description |
|---|---|---|---|
| items | array | yes | – |
| next_cursor | string|null | yes | Pass as cursor for the next page; null at the end. |
| total | integer | yes | How many runs match in all. |
No examples provided.
start_batch Start a batch over Library pictures ~281
Run the same model, scene and options once for each of several pictures in the account’s Library — for example image to 3D for twelve product photos. Take the scenes and models from list_models (`batches`), and each picture’s asset_id from get_job or search_library on a finished image job. Nothing is charged now: each run is charged as it starts and refunded if it fails, but the balance must cover the whole quote, and for a key or connection with a monthly limit the whole quote is held against it until each picture runs (then its real cost counts) or is cancelled, refused or refunded (then nothing does). Returns a batch id at once; follow it with get_batch. Pass idempotency_key on retries so a repeat returns the same batch instead of queueing another.
| Name | Type | Req | Description |
|---|---|---|---|
| expected_credits | integer | – | The quote you showed the person; a different price queues nothing. |
| idempotency_key | string | – | – |
| items | array | yes | One entry per picture: a Library image’s asset_id. |
| model | string | yes | – |
| notify_by_email | boolean | – | – |
| options | object | – | Options every run shares, as for generate; the picture field is filled per item. |
| project_id | string | – | – |
| prompt | string | – | – |
| scene | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| balance | number | yes | Credits available when it was accepted. |
| batch_id | string | yes | – |
| charged_credits | number | yes | What its runs were charged so far. |
| counts | object | yes | – |
| created_at | string | yes | – |
| item_count | integer | yes | – |
| items | array | yes | – |
| model | string | yes | – |
| per_item_credits | number | yes | – |
| quoted_credits | number | yes | What the batch costs if every picture runs. |
| reused | boolean | yes | An earlier call with this idempotency_key started it. |
| scene | string | yes | – |
| settled_at | string|null | yes | – |
| status | string | yes | – |
No examples provided.
How do I install the AI3D Studio MCP server?
AI3D Studio is a hosted endpoint at https://ai3d.studio/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · ai3d.studio
claude mcp add --transport http studio-ai3d-ai3d-studio 'https://ai3d.studio/mcp'
What is the AI3D Studio MCP server?
AI3D Studio is an MCP server listed in the public MCP registry as studio.ai3d/ai3d-studio. Generate 3D models from images or text with AI, then retexture or convert them to STL, 3MF or OBJ. This page covers its hosted endpoint (https://ai3d.studio/mcp).
Is the AI3D Studio MCP server safe to use?
AI3D Studio scores 88 out of 100 on VerifyMCP. 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 AI3D Studio MCP server expose?
AI3D Studio exposes 13 tools: list_models, estimate_cost, get_balance, generate_3d, generate, and 8 more. Their descriptions and schemas cost roughly 2,336 tokens of context every time the server is loaded.
Does the AI3D Studio MCP server require authentication?
Yes. AI3D Studio asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the AI3D Studio MCP server still maintained?
AI3D Studio is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.