Search a large 3D model library and download converted GLB/FBX/USDZ assets via signed URLs.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
API key as 'Bearer sk_live_...'
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Return a signed download URL for a model zip, valid for 7 days. Consumes one credit. A model the account already owns is free to download again.
The model_id from search_models.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Return a signed download URL for a model zip, valid for 7 days. Consumes one credit. A model the account already owns is free to download again.
| Argument | Type | Description |
|---|---|---|
| model_id* | string | The model_id from search_models. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"model_id"
],
"properties": {
"model_id": {
"type": "string",
"description": "The model_id from search_models."
}
}
}Generate a 3D model (GLB) from one photo of an object. This is asynchronous and usually takes 3-7 minutes: the call returns a task_id immediately and get_generation reports progress. The result is downloadable only by the calling account and does not enter the public library. This tool charges credits, computed server-side and returned as credits_cost, so a call that cannot afford it is refused before any work starts. Supply image_base64 or image_urls to generate now, or omit both to have the user upload an image through their browser.
| Argument | Type | Description |
|---|---|---|
| tier* | string | Output detail, from least to most. 'low' = 1024px texture, maximum 100K faces; 'medium' = 2048px, maximum 200K faces; 'high' = 2048px, maximum 500K faces; 'ultra' = 4096px, maximum 1M faces. Every tier costs the same 6 credits. The reconstruction resolution is the same for every tier, so this only decides how much detail comes back. Each step produces a larger file (4 MB to 40 MB); the price is not proportional to the size because most of the cost is fixed per generation. |
| image_urls | array | A direct URL of the source image. Exactly one: the model reconstructs the object from that photo alone, estimating the camera itself, so a second angle is refused rather than ignored. Ignored when image_base64 is also supplied. |
| image_base64 | string | Base64 of the source image, without the data:image/... prefix. Compress to 1024x1024 JPEG before encoding: a 1024^2 JPEG is about 0.2 MB and roughly 270 KB encoded, which fits in a context window, while a 4 MB phone photo becomes about 5.3 MB of text and will be truncated or corrupted on the way in. Server limit is 10 MB encoded. JPEG or PNG only. Takes precedence over image_urls when both are given. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tier"
],
"properties": {
"tier": {
"enum": [
"low",
"medium",
"high",
"ultra"
],
"type": "string",
"description": "Output detail, from least to most. 'low' = 1024px texture, maximum 100K faces; 'medium' = 2048px, maximum 200K faces; 'high' = 2048px, maximum 500K faces; 'ultra' = 4096px, maximum 1M faces. Every tier costs the same 6 credits. The reconstruction resolution is the same for every tier, so this only decides how much detail comes back. Each step produces a larger file (4 MB to 40 MB); the price is not proportional to the size because most of the cost is fixed per generation."
},
"image_urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "A direct URL of the source image. Exactly one: the model reconstructs the object from that photo alone, estimating the camera itself, so a second angle is refused rather than ignored. Ignored when image_base64 is also supplied."
},
"image_base64": {
"type": "string",
"description": "Base64 of the source image, without the data:image/... prefix. Compress to 1024x1024 JPEG before encoding: a 1024^2 JPEG is about 0.2 MB and roughly 270 KB encoded, which fits in a context window, while a 4 MB phone photo becomes about 5.3 MB of text and will be truncated or corrupted on the way in. Server limit is 10 MB encoded. JPEG or PNG only. Takes precedence over image_urls when both are given."
}
}
}Report the status of a generate_model task. While it is pending or running, wait before polling again. When status is 'done' the response carries a download URL for the GLB, valid for 7 days. When status is 'failed' the pre-deducted credits have already been refunded automatically and the error field explains why, so no manual refund is needed.
| Argument | Type | Description |
|---|---|---|
| task_id* | string | The task_id returned by generate_model. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"task_id"
],
"properties": {
"task_id": {
"type": "string",
"description": "The task_id returned by generate_model."
}
}
}Return full metadata for one model, including whether it is downloadable and the source platform's thumbnail URL. That URL is hosted by the source platform and is missing for some models; use get_model_preview to see the model's own preview image instead.
| Argument | Type | Description |
|---|---|---|
| model_id* | string | The model_id from search_models. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"model_id"
],
"properties": {
"model_id": {
"type": "string",
"description": "The model_id from search_models."
}
}
}Return the preview image of one model as an image, so it can be shown to the user or judged before downloading. Use this to check that a model from search_models is the one the user means before spending a credit on it. Spends one of the same reads search_models draws on, and counts against the same per-minute limit.
| Argument | Type | Description |
|---|---|---|
| model_id* | string | The model_id from search_models. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"model_id"
],
"properties": {
"model_id": {
"type": "string",
"description": "The model_id from search_models."
}
}
}Report past generate_model tasks created by the calling account, newest first. When status is 'done' the entry carries a download URL for the GLB, valid for 7 days. Use this to find 3D models generated earlier when the task_id was lost.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of tasks to return, up to 50. Defaults to 20. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Maximum number of tasks to return, up to 50. Defaults to 20."
}
}
}Search the Sketchlib library by keyword, optionally narrowed by category, tag, or face-count range. Returns paginated metadata and a preview image URL. has_more reports whether a further page exists; raise offset by limit to fetch it.
| Argument | Type | Description |
|---|---|---|
| tag | string | Filter by tag. |
| limit | integer | Results per page, 1-50. Defaults to 20. |
| offset | integer | Pagination offset. |
| keyword* | string | Search terms, at least 3 characters. Matched against title, slug, tags, categories and description. |
| category | string | Filter by category. |
| max_faces | integer | Maximum face count. |
| min_faces | integer | Minimum face count. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"keyword"
],
"properties": {
"tag": {
"type": "string",
"description": "Filter by tag."
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Results per page, 1-50. Defaults to 20."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Pagination offset."
},
"keyword": {
"type": "string",
"minLength": 3,
"description": "Search terms, at least 3 characters. Matched against title, slug, tags, categories and description."
},
"category": {
"type": "string",
"description": "Filter by category."
},
"max_faces": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Maximum face count."
},
"min_faces": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Minimum face count."
}
}
}