MCPサーバー

Kubova — 3D Container Loading

com.kubova/container-loading
ビジネス・業務 公開・接続可能 MCP 2025-11-25

このMCPでできること

Computes three-dimensional cargo placements in shipping containers and on pallets, with capacity estimates and rendered reports.

estimate_capacity
How many complete SETS of one product fit in a single container? A product is 1+ carton types with qtyPerSet each (e.g. a table shipping as 2 cartons: top + legs). All cartons of a set ride in the SAME container. Uses real 3D packing (not just volume math) and reports the binding limit (dimension / weight / volume) per container. Omit `containers` to evaluate the standard 20' DC, 40' DC and 40' HC.
読み取り専用
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['product'], 'properties': {'product': {'type': 'object', 'required': ['cartons'], 'properties': {'name': {'type': 'string', 'maxLength': 200}, 'cartons': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'lengthCm', 'widthCm', 'heightCm', 'weightKg'], 'properties': {'name': {'type': 'string', 'maxLength': 200}, 'widthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'heightCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'lengthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'weightKg': {'type': 'number', 'maximum': 1000000, 'minimum': 0}, 'qtyPerSet': {'type': 'integer', 'default': 1, 'maximum': 1000000, 'description': 'How many of THIS carton make up one set/product. Default 1.', 'exclusiveMinimum': 0}, 'allowRotation': {'type': 'boolean', 'default': True}, 'allowStacking': {'type': 'boolean', 'default': True}}, 'additionalProperties': False}, 'maxItems': 500, 'minItems': 1}}, 'additionalProperties': False}, 'containers': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'innerLengthCm', 'innerWidthCm', 'innerHeightCm', 'doorWidthCm', 'doorHeightCm', 'maxPayloadKg'], 'properties': {'id': {'type': 'string', 'maxLength': 200}, 'name': {'type': 'string', 'maxLength': 200}, 'doorWidthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'doorHeightCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'innerWidthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'maxPayloadKg': {'type': 'number', 'maximum': 1000000000, 'exclusiveMinimum': 0}, 'innerHeightCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'innerLengthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}}, 'additionalProperties': False}, 'maxItems': 20, 'description': "Containers to evaluate. Omit to use the standard catalogue (20' DC, 40' DC, 40' HC)."}}, 'additionalProperties': False}
generate_report
Generate a CAD-style PDF + 3D PNG report for a packing job. IMPORTANT: to keep the report consistent with a plan you already produced, pass the `result` object from your previous pack_containers call — the report then renders that exact plan instead of recomputing. Returns base64-encoded PDF + PNG per container.
読み取り専用
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['cargos'], 'properties': {'cargos': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'lengthCm', 'widthCm', 'heightCm', 'quantity', 'weightKg'], 'properties': {'id': {'type': 'string', 'maxLength': 200}, 'name': {'type': 'string', 'maxLength': 200}, 'color': {'type': 'string', 'default': '#3b82f6'}, 'shape': {'enum': ['box', 'cylinder'], 'type': 'string', 'default': 'box'}, 'widthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'heightCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'lengthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'quantity': {'type': 'integer', 'maximum': 1000000, 'description': 'Number of identical pieces of this SKU.', 'exclusiveMinimum': 0}, 'weightKg': {'type': 'number', 'minimum': 0, 'description': 'Weight of ONE piece in kg â\x80\x94 NOT the row total. If a packing list shows both "weight/piece" and "weight total", use weight/piece (total = quantity Ã\x97 weightKg).'}, 'diameterCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'noOverstack': {'type': 'boolean', 'description': 'Nothing may rest on top of this SKU.'}, 'loadingOrder': {'enum': ['optimized', 'rear', 'door'], 'type': 'string', 'description': 'Placement priority: rear = deepest (unloaded last), door = closest to the door (unloaded first).'}, 'noUnderstack': {'type': 'boolean', 'description': 'Floor only â\x80\x94 this SKU may not sit on other pieces.'}, 'orientations': {'type': 'array', 'items': {'enum': ['standard-0', 'standard-90', 'turnup-0', 'turnup-90', 'turnside-0', 'turnside-90'], 'type': 'string'}, 'description': 'Explicit allowed-pose subset; overrides allowRotation when set. standard = upright, turnup/turnside = tipped onto a face; 0/90 = yaw.'}, 'allowRotation': {'type': 'boolean', 'default': True}, 'allowStacking': {'type': 'boolean', 'default': True}, 'includeInLoading': {'type': 'boolean', 'default': True}}, 'additionalProperties': False}, 'maxItems': 500, 'minItems': 1}, 'pallet': {'type': 'object', 'required': ['id', 'name', 'lengthCm', 'widthCm', 'baseHeightCm', 'maxStackHeightCm', 'maxPayloadKg', 'tareWeightKg'], 'properties': {'id': {'type': 'string', 'maxLength': 200}, 'name': {'type': 'string', 'maxLength': 200}, 'widthCm': {'type': 'number', 'maximum': 5000, 'description': 'Pallet footprint width (cm).', 'exclusiveMinimum': 0}, 'lengthCm': {'type': 'number', 'maximum': 5000, 'description': 'Pallet footprint length (cm).', 'exclusiveMinimum': 0}, 'baseHeightCm': {'type': 'number', 'maximum': 5000, 'minimum': 0, 'description': 'Pallet base self-height (cm), added below the cargo stack.'}, 'maxPayloadKg': {'type': 'number', 'maximum': 1000000, 'description': 'Max cargo weight per pallet (kg).', 'exclusiveMinimum': 0}, 'tareWeightKg': {'type': 'number', 'maximum': 1000000, 'minimum': 0, 'description': 'Pallet self-weight (kg), added to container payload.'}, 'maxStackHeightCm': {'type': 'number', 'maximum': 5000, 'description': 'Max cargo stack height ON the pallet (cm), excluding the base.', 'exclusiveMinimum': 0}}, 'description': 'The pallet to stack onto. Required when loadingMode is "pallet".', 'additionalProperties': False}, 'result': {'type': 'object', 'description': 'OPTIONAL but strongly recommended: the exact `result` object returned by a prior pack_containers call, so the report renders THAT plan instead of repacking.', 'additionalProperties': {}}, 'options': {'type': 'object', 'properties': {'deepOptimize': {'type': 'boolean', 'description': 'Pallet mode only: run the exact optimizer for a tighter pallet plan (slower; Pro/Team plans).'}, 'maxContainers': {'type': 'integer', 'maximum': 1000, 'exclusiveMinimum': 0}, 'loadingDirection': {'enum': ['floor-to-top', 'right-to-left'], 'type': 'string'}}, 'additionalProperties': False}, 'container': {'type': 'object', 'required': ['id', 'name', 'innerLengthCm', 'innerWidthCm', 'innerHeightCm', 'doorWidthCm', 'doorHeightCm', 'maxPayloadKg'], 'properties': {'id': {'type': 'string', 'maxLength': 200}, 'name': {'type': 'string', 'maxLength': 200}, 'doorWidthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'doorHeightCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'innerWidthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'maxPayloadKg': {'type': 'number', 'maximum': 1000000000, 'exclusiveMinimum': 0}, 'innerHeightCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'innerLengthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}}, 'additionalProperties': False}, 'containers': {'type': 'array', 'items': {'$ref': '#/properties/container'}, 'maxItems': 20}, 'loadingMode': {'enum': ['bulk', 'pallet'], 'type': 'string', 'description': "'bulk' (default) loads cartons straight into the container. 'pallet' first stacks cartons onto pallets, then loads the pallets â\x80\x94 requires the `pallet` field."}}, 'additionalProperties': False}
pack_containers
Pack a list of cargo SKUs into one or more shipping containers using the Kubova solver. Supports bulk loading (cartons straight into the container) and pallet loading (loadingMode:"pallet" + a pallet — cartons are stacked onto pallets first, then the pallets loaded). Per-SKU you can set allowed orientations, no-overstack/no-understack, and loading order. Returns per-container placements with x,y,z coordinates in cm, volume utilization, weight, a weightBalance object (centre of gravity + front/back & left/right weight split, flags an unbalanced load) for bulk loads, and any unplaced pieces.
読み取り専用
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['cargos'], 'properties': {'cargos': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'lengthCm', 'widthCm', 'heightCm', 'quantity', 'weightKg'], 'properties': {'id': {'type': 'string', 'maxLength': 200}, 'name': {'type': 'string', 'maxLength': 200}, 'color': {'type': 'string', 'default': '#3b82f6'}, 'shape': {'enum': ['box', 'cylinder'], 'type': 'string', 'default': 'box'}, 'widthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'heightCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'lengthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'quantity': {'type': 'integer', 'maximum': 1000000, 'description': 'Number of identical pieces of this SKU.', 'exclusiveMinimum': 0}, 'weightKg': {'type': 'number', 'minimum': 0, 'description': 'Weight of ONE piece in kg â\x80\x94 NOT the row total. If a packing list shows both "weight/piece" and "weight total", use weight/piece (total = quantity Ã\x97 weightKg).'}, 'diameterCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'noOverstack': {'type': 'boolean', 'description': 'Nothing may rest on top of this SKU.'}, 'loadingOrder': {'enum': ['optimized', 'rear', 'door'], 'type': 'string', 'description': 'Placement priority: rear = deepest (unloaded last), door = closest to the door (unloaded first).'}, 'noUnderstack': {'type': 'boolean', 'description': 'Floor only â\x80\x94 this SKU may not sit on other pieces.'}, 'orientations': {'type': 'array', 'items': {'enum': ['standard-0', 'standard-90', 'turnup-0', 'turnup-90', 'turnside-0', 'turnside-90'], 'type': 'string'}, 'description': 'Explicit allowed-pose subset; overrides allowRotation when set. standard = upright, turnup/turnside = tipped onto a face; 0/90 = yaw.'}, 'allowRotation': {'type': 'boolean', 'default': True}, 'allowStacking': {'type': 'boolean', 'default': True}, 'includeInLoading': {'type': 'boolean', 'default': True}}, 'additionalProperties': False}, 'maxItems': 500, 'minItems': 1}, 'pallet': {'type': 'object', 'required': ['id', 'name', 'lengthCm', 'widthCm', 'baseHeightCm', 'maxStackHeightCm', 'maxPayloadKg', 'tareWeightKg'], 'properties': {'id': {'type': 'string', 'maxLength': 200}, 'name': {'type': 'string', 'maxLength': 200}, 'widthCm': {'type': 'number', 'maximum': 5000, 'description': 'Pallet footprint width (cm).', 'exclusiveMinimum': 0}, 'lengthCm': {'type': 'number', 'maximum': 5000, 'description': 'Pallet footprint length (cm).', 'exclusiveMinimum': 0}, 'baseHeightCm': {'type': 'number', 'maximum': 5000, 'minimum': 0, 'description': 'Pallet base self-height (cm), added below the cargo stack.'}, 'maxPayloadKg': {'type': 'number', 'maximum': 1000000, 'description': 'Max cargo weight per pallet (kg).', 'exclusiveMinimum': 0}, 'tareWeightKg': {'type': 'number', 'maximum': 1000000, 'minimum': 0, 'description': 'Pallet self-weight (kg), added to container payload.'}, 'maxStackHeightCm': {'type': 'number', 'maximum': 5000, 'description': 'Max cargo stack height ON the pallet (cm), excluding the base.', 'exclusiveMinimum': 0}}, 'description': 'The pallet to stack onto. Required when loadingMode is "pallet".', 'additionalProperties': False}, 'options': {'type': 'object', 'properties': {'deepOptimize': {'type': 'boolean', 'description': 'Pallet mode only: run the exact optimizer for a tighter pallet plan (slower; Pro/Team plans).'}, 'maxContainers': {'type': 'integer', 'maximum': 1000, 'exclusiveMinimum': 0}, 'loadingDirection': {'enum': ['floor-to-top', 'right-to-left'], 'type': 'string'}}, 'additionalProperties': False}, 'container': {'type': 'object', 'required': ['id', 'name', 'innerLengthCm', 'innerWidthCm', 'innerHeightCm', 'doorWidthCm', 'doorHeightCm', 'maxPayloadKg'], 'properties': {'id': {'type': 'string', 'maxLength': 200}, 'name': {'type': 'string', 'maxLength': 200}, 'doorWidthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'doorHeightCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'innerWidthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'maxPayloadKg': {'type': 'number', 'maximum': 1000000000, 'exclusiveMinimum': 0}, 'innerHeightCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}, 'innerLengthCm': {'type': 'number', 'maximum': 5000, 'exclusiveMinimum': 0}}, 'additionalProperties': False}, 'containers': {'type': 'array', 'items': {'$ref': '#/properties/container'}, 'maxItems': 20}, 'loadingMode': {'enum': ['bulk', 'pallet'], 'type': 'string', 'description': "'bulk' (default) loads cartons straight into the container. 'pallet' first stacks cartons onto pallets, then loads the pallets â\x80\x94 requires the `pallet` field."}}, 'additionalProperties': False}
verify_key
Verify the connection. Returns the authenticated account identity and plan.
読み取り専用
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
追加
verify_key
2026年9月17日12:35
追加
estimate_capacity
2026年9月17日12:35
追加
generate_report
2026年9月17日12:35
追加
pack_containers
2026年9月17日12:35