HardCopy Labs
What this MCP does
Validates 3D models, estimates print pricing and submits physical 3D-print orders for shipment, with status and reorder support.
Tools
Input schema
{'type': 'object', 'title': 'check_job_statusArguments', 'required': ['job_id'], 'properties': {'job_id': {'type': 'string', 'title': 'Job Id', 'description': 'The order id, like hc-1a2b3c4d, returned by submit_print_job.'}}}
Output schema
{'type': 'object', 'title': 'check_job_statusOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Input schema
{'type': 'object', '$defs': {'OrderPart': {'type': 'object', 'title': 'OrderPart', 'required': ['name'], 'properties': {'name': {'type': 'string', 'title': 'Name', 'maxLength': 120, 'minLength': 1, 'description': 'Short part name, shown on the card and receipt.'}, 'color': {'type': 'string', 'title': 'Color', 'default': 'black', 'maxLength': 40, 'description': 'Filament color for this part.'}, 'material': {'type': 'string', 'title': 'Material', 'default': 'pla', 'maxLength': 20, 'description': 'PLA or PETG only.'}, 'model_id': {'type': 'string', 'title': 'Model Id', 'default': '', 'maxLength': 64, 'description': 'Reusable id from validate_stl; valid for 24 hours.'}, 'quantity': {'type': 'integer', 'title': 'Quantity', 'default': 1, 'maximum': 500, 'minimum': 1, 'description': "Copies of THIS part. Capped by how long this part takes to print, not a flat number -- checked once its geometry is known; a rejected order reports the real cap for this part's size."}, 'stl_base64': {'type': 'string', 'title': 'Stl Base64', 'default': '', 'maxLength': 25000000, 'description': 'STL in millimeters; give exactly one model source.'}, 'openscad_source': {'type': 'string', 'title': 'Openscad Source', 'default': '', 'maxLength': 50000, 'description': 'OpenSCAD in millimeters; give exactly one model source.'}}, 'additionalProperties': False}}, 'title': 'preview_print_orderArguments', 'properties': {'color': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Color', 'default': None, 'description': 'Selected filament color. Default black for new models; omit to retain reorder colors.'}, 'notes': {'type': 'string', 'title': 'Notes', 'default': '', 'description': 'Operator instructions to show and bind to this preview; changes require a new preview.'}, 'parts': {'anyOf': [{'type': 'array', 'items': {'$ref': '#/$defs/OrderPart'}, 'maxItems': 20}, {'type': 'null'}], 'title': 'Parts', 'default': None, 'description': "The WHOLE order, one entry per part. Use a model_id from earlier validation, an STL, or OpenSCAD. Each entry has its own name, material, color and quantity. Each part's quantity is capped by its own print time, not a flat count. Shipping and handling are charged once; never add independent quote totals."}, 'job_name': {'type': 'string', 'title': 'Job Name', 'default': '', 'description': 'Short order name shown with the preview.'}, 'material': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Material', 'default': None, 'description': 'PLA or PETG. Default PLA for new models; omit to retain reorder materials.'}, 'quantity': {'type': 'integer', 'title': 'Quantity', 'default': 1, 'description': 'How many identical copies. The totals cover all of them. Capped by how long the part takes to print, not a flat number -- a quick part allows many copies, a very large or slow one may allow as few as 1; submit_print_job reports the real cap if this is too many.'}, 'reorder_of': {'type': 'string', 'title': 'Reorder Of', 'default': '', 'description': 'Existing order ID to preview for reorder; omit new model inputs when using this.'}, 'stl_base64': {'type': 'string', 'title': 'Stl Base64', 'default': '', 'description': 'The model as a base64-encoded STL file (binary or ASCII), in millimeters.'}, 'openscad_source': {'type': 'string', 'title': 'Openscad Source', 'default': '', 'description': 'OpenSCAD source in millimeters. Rendered and validated before preview; never an illustrative AI image.'}, 'replaces_preview_id': {'type': 'string', 'title': 'Replaces Preview Id', 'default': '', 'description': 'When revising an unplaced order, pass its previous preview id. It is invalidated even if the new render fails.'}}}
Output schema
{'type': 'object', 'title': 'preview_print_orderOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Input schema
{'type': 'object', 'title': 'reorder_print_jobArguments', 'required': ['job_id', 'ship_to'], 'properties': {'color': {'type': 'string', 'title': 'Color', 'default': '', 'description': "Filament color. Leave empty to keep the earlier order's color."}, 'notes': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Notes', 'default': None, 'description': 'Optional notes for the operator.'}, 'job_id': {'type': 'string', 'title': 'Job Id', 'description': 'The id of the earlier order to copy, like hc-1a2b3c4d.'}, 'ship_to': {'type': 'string', 'title': '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."}, 'material': {'type': 'string', 'title': 'Material', 'default': '', 'description': "pla or petg. Leave empty to keep the earlier order's material."}, 'quantity': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Quantity', 'default': None, 'description': 'How many identical copies. Capped by print time, not a flat number; the totals cover all of them.'}, 'preview_id': {'type': 'string', 'title': 'Preview Id', 'default': '', 'description': 'The id returned by preview_print_order for the images shown to the buyer.'}, 'contact_email': {'type': 'string', 'title': 'Contact Email', 'default': '', 'description': "The buyer's email, for the receipt and order updates. Not copied from the earlier order."}, 'buyer_confirmed': {'type': 'boolean', 'title': 'Buyer Confirmed', 'default': False, 'description': 'True ONLY after showing every preview image/options/price and receiving explicit buyer confirmation. Not proof of human viewing.'}, 'preview_version': {'type': 'string', 'title': 'Preview Version', 'default': '', 'description': 'The exact preview version the buyer confirmed; changes require a new preview.'}}}
Output schema
{'type': 'object', 'title': 'reorder_print_jobOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Input schema
{'type': 'object', '$defs': {'OrderPart': {'type': 'object', 'title': 'OrderPart', 'required': ['name'], 'properties': {'name': {'type': 'string', 'title': 'Name', 'maxLength': 120, 'minLength': 1, 'description': 'Short part name, shown on the card and receipt.'}, 'color': {'type': 'string', 'title': 'Color', 'default': 'black', 'maxLength': 40, 'description': 'Filament color for this part.'}, 'material': {'type': 'string', 'title': 'Material', 'default': 'pla', 'maxLength': 20, 'description': 'PLA or PETG only.'}, 'model_id': {'type': 'string', 'title': 'Model Id', 'default': '', 'maxLength': 64, 'description': 'Reusable id from validate_stl; valid for 24 hours.'}, 'quantity': {'type': 'integer', 'title': 'Quantity', 'default': 1, 'maximum': 500, 'minimum': 1, 'description': "Copies of THIS part. Capped by how long this part takes to print, not a flat number -- checked once its geometry is known; a rejected order reports the real cap for this part's size."}, 'stl_base64': {'type': 'string', 'title': 'Stl Base64', 'default': '', 'maxLength': 25000000, 'description': 'STL in millimeters; give exactly one model source.'}, 'openscad_source': {'type': 'string', 'title': 'Openscad Source', 'default': '', 'maxLength': 50000, 'description': 'OpenSCAD in millimeters; give exactly one model source.'}}, 'additionalProperties': False}}, 'title': 'submit_print_jobArguments', 'required': ['job_name'], 'properties': {'color': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Color', 'default': None, 'description': 'Filament color, e.g. black or white.'}, 'notes': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Notes', 'default': None, 'description': 'Optional notes for the operator, e.g. which face should look best.'}, 'parts': {'anyOf': [{'type': 'array', 'items': {'$ref': '#/$defs/OrderPart'}, 'maxItems': 20}, {'type': 'null'}], 'title': 'Parts', 'default': None, 'description': "The WHOLE order, one entry per part. Use a model_id from earlier validation, an STL, or OpenSCAD. Each entry has its own name, material, color and quantity. Each part's quantity is capped by its own print time, not a flat count. Shipping and handling are charged once; never add independent quote totals."}, 'ship_to': {'type': 'string', 'title': '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."}, 'job_name': {'type': 'string', 'title': 'Job Name', 'description': 'A short name for the item, shown on the order and the receipt, e.g. "Desk cable clip".'}, 'material': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Material', 'default': None, 'description': 'Print material: pla or petg.'}, 'quantity': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Quantity', 'default': None, 'description': 'How many identical copies. Capped by print time, not a flat number; the totals cover all of them.'}, 'preview_id': {'type': 'string', 'title': 'Preview Id', 'default': '', 'description': 'The id returned by preview_print_order for the images shown to the buyer.'}, 'stl_base64': {'type': 'string', 'title': 'Stl Base64', 'default': '', 'description': 'The model as a base64-encoded STL file, in millimeters. Give this or openscad_source, not both.'}, 'contact_email': {'type': 'string', 'title': 'Contact Email', 'default': '', 'description': "The buyer's email, for the receipt and order updates."}, 'buyer_confirmed': {'type': 'boolean', 'title': 'Buyer Confirmed', 'default': False, 'description': 'True ONLY after showing every preview image/options/price and receiving explicit buyer confirmation. Not proof of human viewing.'}, 'openscad_source': {'type': 'string', 'title': '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.'}, 'preview_version': {'type': 'string', 'title': 'Preview Version', 'default': '', 'description': 'The exact preview version the buyer confirmed; changes require a new preview.'}}}
Output schema
{'type': 'object', 'title': 'submit_print_jobOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Input schema
{'type': 'object', '$defs': {'OrderPart': {'type': 'object', 'title': 'OrderPart', 'required': ['name'], 'properties': {'name': {'type': 'string', 'title': 'Name', 'maxLength': 120, 'minLength': 1, 'description': 'Short part name, shown on the card and receipt.'}, 'color': {'type': 'string', 'title': 'Color', 'default': 'black', 'maxLength': 40, 'description': 'Filament color for this part.'}, 'material': {'type': 'string', 'title': 'Material', 'default': 'pla', 'maxLength': 20, 'description': 'PLA or PETG only.'}, 'model_id': {'type': 'string', 'title': 'Model Id', 'default': '', 'maxLength': 64, 'description': 'Reusable id from validate_stl; valid for 24 hours.'}, 'quantity': {'type': 'integer', 'title': 'Quantity', 'default': 1, 'maximum': 500, 'minimum': 1, 'description': "Copies of THIS part. Capped by how long this part takes to print, not a flat number -- checked once its geometry is known; a rejected order reports the real cap for this part's size."}, 'stl_base64': {'type': 'string', 'title': 'Stl Base64', 'default': '', 'maxLength': 25000000, 'description': 'STL in millimeters; give exactly one model source.'}, 'openscad_source': {'type': 'string', 'title': 'Openscad Source', 'default': '', 'maxLength': 50000, 'description': 'OpenSCAD in millimeters; give exactly one model source.'}}, 'additionalProperties': False}}, 'title': 'validate_stlArguments', 'properties': {'parts': {'anyOf': [{'type': 'array', 'items': {'$ref': '#/$defs/OrderPart'}, 'maxItems': 20}, {'type': 'null'}], 'title': 'Parts', 'default': None, 'description': "The WHOLE order, one entry per part. Use a model_id from earlier validation, an STL, or OpenSCAD. Each entry has its own name, material, color and quantity. Each part's quantity is capped by its own print time, not a flat count. Shipping and handling are charged once; never add independent quote totals."}, 'quantity': {'type': 'integer', 'title': 'Quantity', 'default': 1, 'description': 'How many identical copies. The totals cover all of them. Capped by how long the part takes to print, not a flat number -- a quick part allows many copies, a very large or slow one may allow as few as 1; submit_print_job reports the real cap if this is too many.'}, 'stl_base64': {'type': 'string', 'title': 'Stl Base64', 'default': '', 'description': 'The model as a base64-encoded STL file (binary or ASCII), in millimeters.'}}}
Output schema
{'type': 'object', 'title': 'validate_stlOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Recent tool changes
Similar MCP servers
roastify-mcp
Supports a coffee commerce workflow with product and blend catalogs, inventory, coupons, packaging design editing, artwork genera…
YouCam for Beauty & Personal Care
Offers image-based beauty and personal-care analysis and virtual try-on tools for makeup, hair, facial features, body reshaping, …
agentee
Searches and purchases all-over print apparel, manages carts, promotions, shipping, checkout, orders, and user-submitted designs.
mu
Supports AI-assisted print-on-demand product design, storefronts, manufacturing quotes, orders, fulfillment, shipping, sales, and…
studiomcphub
Provides image enhancement, background removal, vectorization, color and print preparation, artwork search and analysis, product …
Capucine
Provides sourced personal styling guidance, weather-aware outfit recommendations, apparel shopping criteria, and links to verifie…
YouCam for Fashion & Retail
Provides image-based virtual try-on experiences for clothing, accessories, jewelry, watches, makeup, fabric, hats, scarves, and s…
R3PLICA AI Connector
Searches and presents premium design-brand products, collections, finishes, specifications, comparisons, images, and catalog link…