HardCopy Labs

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

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
100%
Naming quality
95%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,637Tokens (tool definitions)
~2.7 KBTypical response size
Moderate attention impact (1.28% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "hardcopy": {
      "url": "https://mcp.hardcopylabs.com/mcp"
    }
  }
}

Remote endpoints

https://mcp.hardcopylabs.com/mcpstreamable-http

What it can do

Tool inventory

Tools (4)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢validate_stl(stl_base64, quantity)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "stl_base64": {
      "description": "The model as a base64-encoded STL file (binary or ASCII), in millimeters.",
      "title": "Stl Base64",
      "type": "string"
    },
    "quantity": {
      "default": 1,
      "description": "How many identical copies, 1 to 20. The totals cover all of them.",
      "title": "Quantity",
      "type": "integer"
    }
  },
  "required": [
    "stl_base64"
  ],
  "title": "validate_stlArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "validate_stlOutput"
}
🟡submit_print_job(job_name, material, color, notes, contact_email, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "job_name": {
      "description": "A short name for the item, shown on the order and the receipt, e.g. \"Desk cable clip\".",
      "title": "Job Name",
      "type": "string"
    },
    "material": {
      "default": "pla",
      "description": "Print material: pla or petg.",
      "title": "Material",
      "type": "string"
    },
    "color": {
      "default": "black",
      "description": "Filament color, e.g. black or white.",
      "title": "Color",
      "type": "string"
    },
    "notes": {
      "default": "",
      "description": "Optional notes for the operator, e.g. which face should look best.",
      "title": "Notes",
      "type": "string"
    },
    "contact_email": {
      "default": "",
      "description": "The buyer's email, for the receipt and order updates.",
      "title": "Contact Email",
      "type": "string"
    },
    "ship_to": {
      "default": "",
      "description": "Required. Recipient's full name and US street address, including city, state and ZIP. We ship within the United States only.",
      "title": "Ship To",
      "type": "string"
    },
    "stl_base64": {
      "default": "",
      "description": "The model as a base64-encoded STL file, in millimeters. Give this or openscad_source, not both.",
      "title": "Stl Base64",
      "type": "string"
    },
    "openscad_source": {
      "default": "",
      "description": "OpenSCAD source for the model, in millimeters; rendered on our server. Preferred for models designed in the conversation. Give this or stl_base64, not both.",
      "title": "Openscad Source",
      "type": "string"
    },
    "quantity": {
      "default": 1,
      "description": "How many identical copies, 1 to 20. The totals cover all of them.",
      "title": "Quantity",
      "type": "integer"
    }
  },
  "required": [
    "job_name"
  ],
  "title": "submit_print_jobArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "submit_print_jobOutput"
}
🟢check_job_status(job_id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "description": "The order id, like hc-1a2b3c4d, returned by submit_print_job.",
      "title": "Job Id",
      "type": "string"
    }
  },
  "required": [
    "job_id"
  ],
  "title": "check_job_statusArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "check_job_statusOutput"
}
🟡reorder_print_job(job_id, ship_to, quantity, material, color, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "description": "The id of the earlier order to copy, like hc-1a2b3c4d.",
      "title": "Job Id",
      "type": "string"
    },
    "ship_to": {
      "description": "Recipient's full name and US street address, including city, state and ZIP. Not copied from the earlier order. We ship within the United States only.",
      "title": "Ship To",
      "type": "string"
    },
    "quantity": {
      "default": 1,
      "description": "How many identical copies, 1 to 20. The totals cover all of them.",
      "title": "Quantity",
      "type": "integer"
    },
    "material": {
      "default": "",
      "description": "pla or petg. Leave empty to keep the earlier order's material.",
      "title": "Material",
      "type": "string"
    },
    "color": {
      "default": "",
      "description": "Filament color. Leave empty to keep the earlier order's color.",
      "title": "Color",
      "type": "string"
    },
    "contact_email": {
      "default": "",
      "description": "The buyer's email, for the receipt and order updates. Not copied from the earlier order.",
      "title": "Contact Email",
      "type": "string"
    },
    "notes": {
      "default": "",
      "description": "Optional notes for the operator.",
      "title": "Notes",
      "type": "string"
    }
  },
  "required": [
    "job_id",
    "ship_to"
  ],
  "title": "reorder_print_jobArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "reorder_print_jobOutput"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded4 tools