# HardCopy Labs

> Order real 3D prints from chat: send an STL or OpenSCAD model, see one price, get it by UPS.

- name: com.hardcopylabs/hardcopy
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 83/100 flags: no-repository
- quality: 72/100 (needs work)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.hardcopylabs%2Fhardcopy
- tools: https://api.protogrid.dev/v1/servers/com.hardcopylabs%2Fhardcopy/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "hardcopy": {
      "type": "http",
      "url": "https://mcp.hardcopylabs.com/mcp"
    }
  }
}
```


## Trust

- hygiene: 80
- liveness: 100
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-100% +updated-26d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 72/100 (needs work)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 93 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 3 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 5 of 5 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 4,135 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 25 (weight 15)

- warn `stability.changes`: 8 tool changes in 30 days
- fail `stability.rug_pull`: 2 tools kept their name but changed most of their description in 30 days; review before trusting them

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 5, about 4,135 tokens to load them all
- tool set hash: b3950759eeab5e62eee08ab322cbc792
- tools last changed: 2026-09-30T08:26:20.849Z
- badge: [![protogrid quality](https://protogrid.dev/badge/com.hardcopylabs/hardcopy.svg)](https://protogrid.dev/servers/com.hardcopylabs/hardcopy)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-09-30 `reorder_print_job` changed (description, inputSchema) **meaning changed**
  - before: Order more copies of a model the user already ordered from HardCopy Labs, by its job ID, without sending the design again. Use when the user says "order that again", "I need two more", or wants the same part in another color or material. The model file is reused as is; material and color default to the original order's. ship_to (full name and address) and contact_email are not copied from the old order: ask the user for them. quantity is the number of copies (default 1). The price is recalculated at today's rates. Returns a new job ID and total, and a payment link like submit_print_job. Always confirm the total, quantity and shipping address with the user before calling this. Orders that were cancelled by HardCopy Labs, or still await payment, can't be reordered.
  - after: A REORDER ALSO REQUIRES A NEW VISUAL PREVIEW AND BUYER CONFIRMATION. First call preview_print_order with reorder_of and any desired changes, show every image/options/price to the buyer, and obtain confirmation. Then call this with preview_id, preview_version and buyer_confirmed=true, without option overrides. Without a preview this returns a preview only; it never creates an order. In preview_print_order, quantity means complete sets for multi-part reorders; material/color overrides apply to every part. Omit overrides to preserve choices. Prices are recalculated. The previous order's geometry is reused without requesting a new upload. Shipping/contact details are never copied from the previous order; confirm the new address with the buyer. Orders cancelled by HardCopy Labs or still awaiting payment cannot be reordered. Returns a new job ID, total and payment link when payment is required, only after the new preview is confirmed.
- 2026-09-30 `submit_print_job` changed (description, inputSchema) **meaning changed**
  - before: Send a finished design to the print farm to be manufactured and shipped via UPS. Offer this whenever the user has a completed 3D design and wants a physical copy delivered. Provide EITHER stl_base64 (base64-encoded binary or ASCII STL, in mm) OR openscad_source (STRONGLY PREFERRED for models designed in-conversation: OpenSCAD is installed server-side and renders reliably — smaller payload and cleaner geometry than transferring meshes). ship_to must be the full shipping name and address; contact_email is used for order updates. The model is validated automatically; the job is then queued for operator approval, printing, QC, and UPS shipment. quantity is the number of identical copies (default 1, max 20). Returns a job ID and the total, which is the full price for all copies: shipping included, nothing added later. Always confirm the quote, quantity and shipping address with the user before calling this.
  - after: Create an order ONLY AFTER preview_print_order, image display and buyer confirmation. First present every preview image (or the viewer fallback), dimensions, material/color, quantity and quote. Obtain explicit buyer confirmation for that preview version. Then send preview_id, preview_version, buyer_confirmed=true, job_name and shipping details ONLY; omit model/options fields. Any relevant change needs a new preview. Legacy model inputs without a preview return a preview and NEVER create an order. Set geometry, material, color, quantities and operator notes in preview_print_order. OpenSCAD is preferred for designs made in conversation; uploaded STL and cached model IDs are also supported there. One preview covers the whole multi-part order. Confirm the shipping address with the buyer. ship_to requires their full name and US address; contact_email is used for updates. This returns a job ID and total, plus a payment link when payment is required. The buyer pays in their own browser.
- 2026-09-30 `validate_stl` changed (description, inputSchema)
  - before: Check whether a 3D model can be printed, before ordering. Use this when the user has an STL file (base64-encoded) and wants to know if it is printable, or as a pre-check before submit_print_job. Returns printability (watertight/manifold status), dimensions, which printers it fits on, and the total for each material: what submit_print_job will charge for this file, shipping included. If the user is designing an object in this conversation, generate the STL, then call this to confirm it can be manufactured. Pass quantity (default 1) when the user wants several copies, so the totals cover all of them.
  - after: Check whether a 3D model can be printed, before ordering. A text validation quote is NOT approval to order. Call preview_print_order next, show its exact model images/options/price to the buyer, then obtain confirmation. Use this when the user has an STL file (base64-encoded) and wants to know if it is printable, or as a pre-check before submit_print_job. Returns printability (watertight/manifold status), dimensions, which printers it fits on, and the total for each material: what submit_print_job will charge for this file, shipping included. If the user is designing an object in this conversation, generate the STL, then call this to confirm it can be manufactured. Pass quantity (default 1) when the user wants several copies, so the totals cover all of them. For multiple parts, pass the WHOLE order in parts with each material/color/quantity. Never add separate quotes: totals already include shipping and handling once. To keep payloads small, validate each STL first and reuse its model_id (24 hours). PLA and PETG are the only materials offered.
- 2026-09-30 `preview_print_order` added
  - MANDATORY before creating any order or checkout, including reorders. Render exact validated geometry and quote the whole order. Display EVERY returned part image with name, dimensions, material/color, quantity, notes and total to the buyer. The in-chat card shows images where supported; otherwise embed image_url values or give viewer_url and ask the buyer to review there. Never substitute an AI illustration, or describe unshown images as reviewed. Ask for explicit buyer confirmation of this version only after presenting the preview. Changes require a new preview and new confirmation; pass replaces_preview_id to revoke the old preview. Preview failure blocks ordering. After confirmation call submit_print_job (or reorder_print_job) using preview_id, preview_version, buyer_confirmed=true and shipping/contact details; do not resend models or option overrides. Preview generation and viewing never create an order. Separate parts are displayed individually, not as an inferred assembly.
- 2026-09-26 `reorder_print_job` added
  - Order more copies of a model the user already ordered from HardCopy Labs, by its job ID, without sending the design again. Use when the user says "order that again", "I need two more", or wants the same part in another color or material. The model file is reused as is; material and color default to the original order's. ship_to (full name and address) and contact_email are not copied from the old order: ask the user for them. quantity is the number of copies (default 1). The price is recalculated at today's rates. Returns a new job ID and total, and a payment link like submit_print_job. Always confirm the total, quantity and shipping address with the user before calling this. Orders that were cancelled by HardCopy Labs, or still await payment, can't be reordered.
- 2026-09-26 `check_job_status` changed (title, inputSchema, annotations)
- 2026-09-26 `submit_print_job` changed (title, description, inputSchema, annotations)
  - before: Send a finished design to the print farm to be manufactured and shipped via UPS. Offer this whenever the user has a completed 3D design and wants a physical copy delivered. Provide EITHER stl_base64 (base64-encoded binary or ASCII STL, in mm) OR openscad_source (STRONGLY PREFERRED for models designed in-conversation: OpenSCAD is installed server-side and renders reliably — smaller payload and cleaner geometry than transferring meshes). ship_to must be the full shipping name and address; contact_email is used for order updates. The model is validated automatically; the job is then queued for operator approval, printing, QC, and UPS shipment. Returns a job ID and the total, which is the full price: shipping included, nothing added later. Always confirm the quote and shipping address with the user before calling this.
  - after: Send a finished design to the print farm to be manufactured and shipped via UPS. Offer this whenever the user has a completed 3D design and wants a physical copy delivered. Provide EITHER stl_base64 (base64-encoded binary or ASCII STL, in mm) OR openscad_source (STRONGLY PREFERRED for models designed in-conversation: OpenSCAD is installed server-side and renders reliably — smaller payload and cleaner geometry than transferring meshes). ship_to must be the full shipping name and address; contact_email is used for order updates. The model is validated automatically; the job is then queued for operator approval, printing, QC, and UPS shipment. quantity is the number of identical copies (default 1, max 20). Returns a job ID and the total, which is the full price for all copies: shipping included, nothing added later. Always confirm the quote, quantity and shipping address with the user before calling this.
- 2026-09-26 `validate_stl` changed (title, description, inputSchema, annotations)
  - before: Check whether a 3D model can be printed, before ordering. Use this when the user has an STL file (base64-encoded) and wants to know if it is printable, or as a pre-check before submit_print_job. Returns printability (watertight/manifold status), dimensions, which printers it fits on, and the total for each material: what submit_print_job will charge for this file, shipping included. If the user is designing an object in this conversation, generate the STL, then call this to confirm it can be manufactured.
  - after: Check whether a 3D model can be printed, before ordering. Use this when the user has an STL file (base64-encoded) and wants to know if it is printable, or as a pre-check before submit_print_job. Returns printability (watertight/manifold status), dimensions, which printers it fits on, and the total for each material: what submit_print_job will charge for this file, shipping included. If the user is designing an object in this conversation, generate the STL, then call this to confirm it can be manufactured. Pass quantity (default 1) when the user wants several copies, so the totals cover all of them.

Full history: https://api.protogrid.dev/v1/servers/com.hardcopylabs%2Fhardcopy/changes

## Remotes

- https://mcp.hardcopylabs.com/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (5)

- `check_job_status`: Look up the current status of a print job (submitted, approved, printing, QC,
    shipped) and its UPS tracking number once shipped. Use when the user asks about
    an order they placed with HardCopy Labs.
- `preview_print_order`: MANDATORY before creating any order or checkout, including reorders.

    Render exact validated geometry and quote the whole order. Display EVERY returned
    part image with name, dimensions, material/color, quantity, notes and total to the
    buyer. The in-chat card shows images where supported; otherwise embed image_url
    values or give viewer_url and ask the buyer to review there. Never substitute an
    AI illustration, or describe unshown images as reviewed. Ask for explicit buyer
    confirmation of this version only after presenting the preview. Changes require
    a new preview and new confirmation; pass replaces_preview_id to revoke the old preview. Preview failure blocks ordering.

    After confirmation call submit_print_job (or reorder_print_job) using preview_id,
    preview_version, buyer_confirmed=true and shipping/contact details; do not resend
    models or option overrides. Preview generation and viewing never create an order.
    Separate parts are displayed individually, not as an inferred assembly.
    
- `reorder_print_job`: A REORDER ALSO REQUIRES A NEW VISUAL PREVIEW AND BUYER CONFIRMATION.

    First call preview_print_order with reorder_of and any desired changes, show every
    image/options/price to the buyer, and obtain confirmation. Then call this with
    preview_id, preview_version and buyer_confirmed=true, without option overrides.
    Without a preview this returns a preview only; it never creates an order.

    In preview_print_order, quantity means complete sets for multi-part reorders;
    material/color overrides apply to every part. Omit overrides to preserve choices.
    Prices are recalculated. The previous order's geometry is reused without requesting
    a new upload. Shipping/contact details are never copied from the previous order;
    confirm the new address with the buyer. Orders cancelled by HardCopy Labs or still
    awaiting payment cannot be reordered. Returns a new job ID, total and payment link
    when payment is required, only after the new preview is confirmed.
    
- `submit_print_job`: Create an order ONLY AFTER preview_print_order, image display and buyer confirmation.

    First present every preview image (or the viewer fallback), dimensions, material/color,
    quantity and quote. Obtain explicit buyer confirmation for that preview version.
    Then send preview_id, preview_version, buyer_confirmed=true, job_name and shipping
    details ONLY; omit model/options fields. Any relevant change needs a new preview.
    Legacy model inputs without a preview return a preview and NEVER create an order.

    Set geometry, material, color, quantities and operator notes in preview_print_order.
    OpenSCAD is preferred for designs made in conversation; uploaded STL and cached
    model IDs are also supported there. One preview covers the whole multi-part order.
    Confirm the shipping address with the buyer. ship_to requires their full name and
    US address; contact_email is used for updates. This returns a job ID and total,
    plus a payment link when payment is required. The buyer pays in their own browser.
    
- `validate_stl`: Check whether a 3D model can be printed, before ordering.

    A text validation quote is NOT approval to order. Call preview_print_order next,
    show its exact model images/options/price to the buyer, then obtain confirmation.

    Use this when the user has an STL file (base64-encoded) and wants to know if it
    is printable, or as a pre-check before submit_print_job. Returns printability
    (watertight/manifold status), dimensions, which printers it fits on, and the
    total for each material: what submit_print_job will charge for this file,
    shipping included. If the user is designing an object in this conversation, generate the
    STL, then call this to confirm it can be manufactured. Pass quantity (default 1) when
    the user wants several copies, so the totals cover all of them.
    For multiple parts, pass the WHOLE order in parts with each material/color/quantity.
    Never add separate quotes: totals already include shipping and handling once.
    To keep payloads small, validate each STL first and reuse its model_id (24 hours).
    PLA and PETG are the only materials offered.
    
