pictostl-mcp
# 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
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.