Skip to main content
Glama
README.md
# pictostl-mcp

Local stdio MCP server for [pictostl.com](https://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

```text
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.

## Get an API key

1. [Sign up](https://pictostl.com)
2. Create a key at [API keys](https://pictostl.com/settings/api-keys)
3. Buy credits on [Pricing](https://pictostl.com/pricing)

By using the API or this MCP server you agree to the [Terms of Service](https://pictostl.com/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

```json
{
  "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

```bash
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_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

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