pictostl-mcp
This server lets you turn photos/images into 3D models (GLB or STL) using the pictostl.com API from a local MCP client.
List available generation options (quality, texture, views, credit costs)
Upload an image from a local path or HTTPS URL to get an asset ID
Start async image-to-3D generation jobs (single or multi-view, Basic/Pro/Ultra, texture choices)
Poll generation status by task ID, with optional waiting up to 60 seconds
List recent generations for your API key
Check account credits and paid-credit status
Download completed models as original GLB or locally converted binary STL (default 100 mm longest edge, customizable 1–1000 mm)
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pictostl-mcpTurn this photo into a 3D model and save it as an STL"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
pictostl-mcp
Local stdio MCP server for pictostl.com. Generation runs on pictostl.com — this package uploads photos, starts 3D jobs, and writes GLB or STL files on the machine that hosts the MCP server.
Results are AI-reconstructed meshes for visualization and 3D printing experiments. They are not engineering drawings.
This is a local stdio MCP server distributed from its GitHub repository. pictostl.com does not host a remote MCP HTTP endpoint.
Architecture and data flow
MCP client → local pictostl-mcp process → pictostl.com API
← generation status and GLB
MCP client ← local GLB/STL file ←The MCP process runs locally and communicates with https://pictostl.com over HTTPS. Images, generation parameters, and the API key are sent to pictostl.com to upload inputs, create jobs, and retrieve results. GLB-to-STL conversion and final file writing happen locally on the machine running the MCP server.
There is no hosted PicToSTL MCP endpoint. MCP clients start this package locally over stdio; the local process then calls the hosted PicToSTL API.
Related MCP server: Meshy MCP Server
Get an API key
By using the API or this MCP server you agree to the Terms of Service.
Website browser generation is separate from MCP. MCP always uses an API key.
Install from GitHub
Requires Node.js 20 or newer. The command below installs the repository through npm's Git support and runs its committed JavaScript build. It does not require a published npm package or a local TypeScript compiler.
Claude / Cursor config
{
"mcpServers": {
"pictostl": {
"command": "npx",
"args": [
"-y",
"--package=github:qduoduo-hwh/pictostl-mcp",
"pictostl-mcp"
],
"env": {
"PICTOSTL_API_KEY": "ps_live_..."
}
}
}
}Set PICTOSTL_API_KEY to a live key from https://pictostl.com/settings/api-keys.
Optional: PICTOSTL_API_BASE (default https://pictostl.com) for a local website.
Keep the API key in your MCP client's secret or user-level configuration. Do not commit a live key to source control.
For a pinned installation, append a Git tag or commit after the repository name, for example github:qduoduo-hwh/pictostl-mcp#v0.1.0.
Local development
git clone https://github.com/qduoduo-hwh/pictostl-mcp.git
cd pictostl-mcp
corepack enable
pnpm install --frozen-lockfile
pnpm buildThen configure the MCP client to run node with the absolute path to dist/index.js as its first argument.
Tools
Seven MCP tools:
Tool | Purpose |
| Quality, texture, multi-view rules, and credit costs |
| Upload a local file or HTTPS URL; returns |
| Start an async 3D job (sends |
| Fetch a generation by task id; optional |
| List recent generations for this API key |
| Remaining credits and Pro / Ultra paid-credit status |
| Write original GLB, or a local binary STL, to a path |
Typical flow: upload_image → generate_model → get_task (repeat with the same task id if it takes more than 60 seconds) → download_model with that task id.
Do not pass an upload assetId to get_task or download_model.
download_model default is format=stl, longest edge 100 mm, converted locally from the original GLB (not the website preview mesh). STL has geometry only — no color or textures. format=glb writes the original file unchanged.
Reuse clientRequestId from a previous generate_model result when retrying the same job.
Contributing
Improve tool descriptions so agents call the right tool with the right fields. Do not ask for internal fal prompts or provider payloads.
License
MIT
Available Tools
7 toolsdownload_modelA
Download a completed generation to a local path. id is the task id from generate_model/get_task, not an upload assetId. format stl (default) converts the original GLB locally to binary STL with longest edge 100 mm (no color/texture). format glb writes the original file. Parent directory must already exist.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task id from generate_model or get_task | |
| path | Yes | Local destination path | |
| format | No | Default stl | |
| longestEdgeMm | No | STL only; default 100; range 1–1000 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden and does it well: it discloses local STL conversion, default longest edge 100 mm, loss of color/texture, GLB passthrough, and the parent-directory prerequisite. It stops short of describing overwrite behavior, error cases, or return values, but the core side effects are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no wasted words. The most important information—what the tool does, the id source, and format behavior—is front-loaded, and each sentence contributes distinct value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description covers the essential invocation context: source of id, formats, defaults, and a filesystem prerequisite. Minor gaps remain around success/failure behavior and overwrite semantics, but an agent can call this correctly with the provided information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains what each format does, clarifies that id is a task id rather than an assetId, and notes that parent directories must exist. This goes beyond the schema's terse property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Download a completed generation to a local path.' It also disambiguates the id from an upload assetId, which distinguishes this tool from upload_image and other generation-related siblings. The purpose is immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context is given: the tool is for completed generations and requires a local destination path. It explicitly says id comes from generate_model/get_task and is not an upload assetId, providing a useful exclusion. It does not explicitly name alternatives, but the guidance is sufficient for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_modelA
Start an async image-to-3D job on pictostl.com. Requires imageAssetIds from upload_image. If you omit clientRequestId the server call still sends one — reuse that value to retry the same job without a second charge. Poll with get_task using the returned task id.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | ||
| views | No | Required for Pro/Ultra multi-view; must include Front | |
| quality | Yes | ||
| texture | Yes | ||
| imageAssetIds | Yes | Asset IDs returned by upload_image | |
| clientRequestId | No | UUID for idempotent retries; generated when omitted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavioral traits. It does so by stating the job is async, describes idempotency behavior with clientRequestId (reuse to avoid double charge), and mentions the server generates one if omitted. This is valuable context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, about three sentences, and front-loaded with the primary action and requirement. Every sentence adds value: stating async, prerequisite, and idempotency. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an async job with no output schema, the description covers the start flow, prerequisite, and polling behavior. It doesn't explain all parameters, but given the schema and enum constraints, the missing details are not critical for an agent to make a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, so the description partially compensates. It explains the role of imageAssetIds and clientRequestId, but doesn't detail other parameters like mode, quality, texture. However, those have enums which provide some clarity, so the description adds enough value to meet the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool starts an async image-to-3D job on pictostl.com, specifying the input requirement (imageAssetIds) and the output action (poll with get_task). It distinguishes itself from siblings like upload_image and get_task, which are for uploading and status checking respectively.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it requires imageAssetIds from upload_image and directs to poll with get_task. It does not explicitly mention when not to use this tool or alternatives, but the workflow is clear enough for an agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountA
Show remaining credits and whether Pro / Ultra can be paid with non-trial credits.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the tool is a read-only status check (showing credits and payment eligibility), which is useful. However, it doesn't mention whether the tool requires authentication, whether it reflects real-time or cached data, or what happens if the account has no credits. These are minor gaps for a simple status tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the key information. Every word earns its place, and there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only status tool, the description is largely complete. It tells the agent what the tool does and what information it provides. The only minor gap is the lack of explicit authentication or error behavior, but given the simplicity of the tool, this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially complete. The description adds meaning by explaining what the tool returns (remaining credits and Pro/Ultra payment eligibility), which is valuable context beyond the empty schema. Baseline 4 for zero params is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: showing remaining credits and whether Pro/Ultra can be paid with non-trial credits. It uses a specific verb ('Show') and a specific resource ('remaining credits'), and it distinguishes itself from sibling tools like list_generation_options or get_task by focusing on account/credit status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when an agent needs to check remaining credits or payment eligibility for Pro/Ultra. It doesn't explicitly state when not to use it or name alternatives, but the context is clear enough given the sibling tools are about generation, upload, and task status, not account credits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskA
Fetch a generation by task id (not an upload assetId). Optional waitSeconds (max 60) polls until completed or failed. Jobs often take longer than 60 seconds — call again with the same id until it is completed or failed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task id from generate_model | |
| waitSeconds | No | Seconds to poll for a terminal status (max 60) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral disclosure burden. It reveals the polling behavior, the maximum wait time, and the need to re-invoke for long-running jobs. It does not specify error or timeout behavior, but the core polling semantics are clearly disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly worded sentences, each adding distinct information: the action and id constraint, the polling parameter, and the retry recommendation. No filler or redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential invocation details: what identifier to use, how polling works, and what to do if the generation is not done. It does not describe the return payload, but there is no output schema and the retry guidance implies what an agent needs to know. Adequate for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers both parameters at 100%, providing name and description for each. The description adds meaningful context: id is a task id, not an assetId, and waitSeconds controls polling until a terminal state. This goes beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb ('Fetch') and resource ('a generation'), and immediately disambiguates the identifier type ('not an upload assetId'). This makes the tool's purpose clear and distinguishes it from sibling tools that may operate on different resource identifiers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational guidance: waitSeconds is optional, caps at 60, and jobs may require repeated calls with the same id until terminal. It does not explicitly name alternatives or say when to use a sibling tool, but the assetId exclusion plus retry instructions provide solid context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_generation_optionsA
List pictostl.com generation options available to API clients: quality (Basic/Pro/Ultra), texture, single vs multi-view rules, and credit costs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior. It clearly states that the tool lists options, implying a read-only operation without side effects. It does not explicitly confirm non-mutability, but for a 'list' operation this is intuitive. It adds value by detailing the specific categories of options, which helps the agent understand the scope without needing to call the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly worded sentence that front-loads the core action ('List pictostl.com generation options') and then efficiently lists the key categories. Every word contributes value, and there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters and no output schema, the description is complete. It covers all relevant aspects of what the tool returns (quality, texture, rules, credit costs) and clearly indicates the audience (API clients). There is no missing information that an agent would need to call or understand this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description adds no parameter-specific meaning because there are none to document. It successfully describes the tool's output content, which is all that is needed for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: listing pictostl.com generation options. It specifies the verb 'List', the resource (generation options), and enumerates the content (quality, texture, single vs multi-view rules, credit costs). This differentiates it from siblings like generate_model or list_my_generations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage before generating or when checking available options, but it does not explicitly state when to use this tool versus alternatives. It does not mention that this should be called before generate_model or that it provides prerequisite information. The context is implied but not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_generationsB
List recent 3D generations for this API key's user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full behavioral disclosure burden. It does communicate that results are read-only in nature, recent, and scoped to the API key's user. However, it omits details about response shape, pagination, limits, or ordering beyond 'recent'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. Every phrase earns its place: 'List' states the verb, 'recent 3D generations' states the resource, and 'for this API key's user' states the scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool, the call is simple and the description is adequate for basic invocation. However, with no output schema and no annotations, the description does not explain what fields each generation entry contains or how results are ordered/limited, leaving an agent without full context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there are no parameter semantics for the description to clarify. The 100% schema coverage is trivial here, and the zero-parameter context earns a baseline of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List'), a specific resource ('recent 3D generations'), and a clear scope ('for this API key's user'). It is clear and informative, but it does not explicitly distinguish itself from the similarly named sibling list_generation_options.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus list_generation_options, get_task, or download_model. The description implies this is the personal generation history endpoint, but it never states exclusions or directs the agent to an alternative for other needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageA
Upload a local image file or HTTPS URL and return an assetId for generate_model. Do not pass this id to download_model or get_task.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | HTTPS URL of an image | |
| path | No | Local filesystem path to an image file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full disclosure burden. It states the return value and a usage caveat, but it doesn't address side effects (e.g., whether the upload persists, size limits, file type restrictions, idempotency) or clarify that exactly one of url/path should be provided even though the schema marks both optional. The provided warning is useful but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler: the action, output, intended consumer, and an exclusion are all included. The most important information is front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The combination of schema and description covers most essentials: the schema fully documents parameters and the description states the return value and intended workflow. However, the description doesn't resolve the schema's ambiguity around optional parameters—an agent could call it with no arguments, and the description doesn't clarify that url or path is required. For an upload tool, that's a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description simply maps 'HTTPS URL' to url and 'local image file' to path, confirming the correspondence but adding no new semantic depth beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and object: 'Upload a local image file or HTTPS URL and return an assetId for generate_model.' This clearly states what the tool does and differentiates it from siblings by naming the intended downstream consumer and explicitly excluding download_model and get_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear workflow guidance by stating the assetId is meant for generate_model and warning not to pass it to download_model or get_task. This effectively tells an agent when to use the tool, though it doesn't mention alternatives for upload scenarios or when not to use it beyond the negative id pointer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
download_model - First observed
generate_model - First observed
get_account - First observed
get_task - First observed
list_generation_options - First observed
list_my_generations - First observed
upload_image
TDQS
Scored across 7 tools
Each tool maps to a distinct step in the image-to-3D pipeline: options, upload, generate, list, poll, account, download. Even get_task and list_my_generations differ clearly (single fetch by ID vs. list history). No two tools have overlapping purposes.
All tool names follow a consistent snake_case verb_noun pattern (list_, upload_, generate_, get_, download_). The convention is uniform and predictable, making the API easy to navigate.
Seven tools cover the full lifecycle of the service without excess. Each tool serves a necessary function in the workflow, and the count is well within the ideal range.
The tool surface covers the complete flow: discover options, upload, generate, poll, download, list history, and check account. No critical operations are missing for an image-to-3D generation API.
Maintenance
Related MCP Connectors
Turn text or an image into an animation-ready 3D model (GLB): generate, rig, animate, retexture.
- OwlCADOAuthcom.owlcad
Parametric 3D CAD for AI agents: build print-ready parts, check them, export STL, 3MF or STEP.
LLM chat, text tools, image generation, editing, batch image jobs, and asynchronous video generation
Image & PDF tools for AI agents: compress, convert, resize, PDF, AI vision, pipeline.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with the Tripo3D AI API to generate 3D models from text, images, or multiview inputs. It supports advanced features like model animation, stylization, and real-time task status tracking.95 npm5ISC

Meshy MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceEnables AI agents to create, manage, and download 3D models, textures, images, rigged characters, and animations through natural conversation.1,578 npm46MIT- AlicenseNot gradedqualityDmaintenanceEnables generating 3D models (GLB files) from 2D images using Stability AI's Stable Fast 3D API, with customizable parameters and credit balance checking.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to create, manage, and download 3D models, textures, images, rigged characters, and animations through natural conversation using the Meshy AI platform.1,578 npmMIT