Skip to main content
Glama

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

  1. Sign up

  2. Create a key at API keys

  3. Buy credits on Pricing

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 build

Then 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

list_generation_options

Quality, texture, multi-view rules, and credit costs

upload_image

Upload a local file or HTTPS URL; returns assetId

generate_model

Start an async 3D job (sends clientRequestId even if you omit it)

get_task

Fetch a generation by task id; optional waitSeconds (max 60)

list_my_generations

List recent generations for this API key

get_account

Remaining credits and Pro / Ultra paid-credit status

download_model

Write original GLB, or a local binary STL, to a path

Typical flow: upload_imagegenerate_modelget_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 tools
download_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTask id from generate_model or get_task
pathYesLocal destination path
formatNoDefault stl
longestEdgeMmNoSTL only; default 100; range 1–1000

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYes
viewsNoRequired for Pro/Ultra multi-view; must include Front
qualityYes
textureYes
imageAssetIdsYesAsset IDs returned by upload_image
clientRequestIdNoUUID for idempotent retries; generated when omitted

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTask id from generate_model
waitSecondsNoSeconds to poll for a terminal status (max 60)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoHTTPS URL of an image
pathNoLocal filesystem path to an image file

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 7 tool updatesv0.1.0
    • First observeddownload_model
    • First observedgenerate_model
    • First observedget_account
    • First observedget_task
    • First observedlist_generation_options
    • First observedlist_my_generations
    • First observedupload_image

TDQS

A4.2/5.0

Scored across 7 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers