Moltline Shipping Maths
Dimensional weight, parcel fit, landed cost and freight class. 4 of 6 tools free.
使うべきか
品質と安全性
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"shipping": {
"url": "https://mcp.moltlinestudio.com/shipping"
}
}
}リモートエンドポイント
https://mcp.moltlinestudio.com/shippingstreamable-httpできること
ツール一覧
ツール(6)
🟢dim_weight(length, width, height, actual_weight, divisor, ...)
Work out whether a parcel bills on its size or its weight. FREE. Carriers charge the greater of actual weight and dimensional weight, so a light bulky box costs more than the scale suggests. Typical input {"length": 18, "width": 12, "height": 10, "actual_weight": 6} returns {"cubic": 2160.0, "dim_weight": 15.54, "actual_weight": 6.0, "billable_weight": 15.54, "billed_on": "dimensional", "overage": 9.54, "divisor_used": 139.0, "note": "..."}. Use when deciding whether a smaller box is worth the packing effort, or why an invoice exceeded the scale weight. Not for choosing a box from a list of candidates — that is parcel_fit. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "custom_divisor must be greater than 0 when divisor is 'custom'"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
入力スキーマ
{
"type": "object",
"properties": {
"length": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Longest side of the packed parcel, in inches (or centimetres\nwhen using a metric divisor). Must be greater than 0."
},
"width": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Second side, same unit as length. Must be greater than 0."
},
"height": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Third side, same unit as length. Must be greater than 0."
},
"actual_weight": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Scale weight in pounds (or kilograms with a metric\ndivisor). Must be greater than 0."
},
"divisor": {
"default": "ups_daily",
"enum": [
"ups_daily",
"ups_retail",
"fedex",
"usps",
"metric_5000",
"metric_6000",
"custom"
],
"type": "string",
"description": "Which published divisor to apply. \"ups_daily\" is 139 and\n\"ups_retail\" is 166 cubic inches per pound, as UPS states them;\n\"usps\" is 166; the metric options are cubic centimetres per\nkilogram. Use \"custom\" to supply a contracted divisor."
},
"custom_divisor": {
"default": 0,
"type": "number",
"description": "Your contracted divisor, used only when divisor is\n\"custom\". Must be greater than 0 in that case."
}
},
"required": [
"length",
"width",
"height",
"actual_weight"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"additionalProperties": true
}🟢parcel_fit(item_length, item_width, item_height, box_options, padding)
Pick the smallest box an item actually fits in, allowing for padding. FREE. Tries every rotation of the item against every box, so an item that only fits diagonally-oriented is still found. Typical input {"item_length": 10, "item_width": 6, "item_height": 4, "box_options": [[12, 9, 4], [14, 10, 6]]} returns {"fits": [{"box": [14, 10, 6], "cubic": 840.0, "slack": [2, 2, 0]}], "best": [14, 10, 6], "rejected": [...]}. Use when choosing packaging from stock. Not for what the carrier will bill once a box is chosen — that is dim_weight. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "box_options must contain at least one [l, w, h] box"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
入力スキーマ
{
"type": "object",
"properties": {
"item_length": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Item's longest side, in inches. Must be greater than 0."
},
"item_width": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Item's second side, same unit. Must be greater than 0."
},
"item_height": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Item's third side, same unit. Must be greater than 0."
},
"box_options": {
"items": {
"items": {
"type": "number"
},
"type": "array"
},
"type": "array",
"description": "Candidate inner box dimensions, each a list of exactly\nthree positive numbers, e.g. [[12, 9, 4], [14, 10, 6]]."
},
"padding": {
"default": 1,
"minimum": 0,
"type": "number",
"description": "Cushioning allowance added to every item side before the\ncomparison, in the same unit. Default 1.0; use 0 for a bare fit."
}
},
"required": [
"item_length",
"item_width",
"item_height",
"box_options"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"additionalProperties": true
}🟢landed_cost(unit_cost, quantity, freight_total, duty_pct, tax_pct, ...)
Total what a unit really costs once freight, duty and fees are in. FREE. Duty is applied to goods value, tax to goods plus duty plus freight — the common import treatment — and the order is spelled out in the response so you can check it against your own broker's method. Typical input {"unit_cost": 8.5, "quantity": 200, "freight_total": 640, "duty_pct": 6.5, "tax_pct": 0} returns {"goods": 1700.0, "duty": 110.5, "freight": 640.0, "tax": 0.0, "total_landed": 2450.5, "landed_unit_cost": 12.25, ...}. Use before setting a price on imported stock. Not for the margin that price leaves you — that is the dropship server's margin_check. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"}. Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
入力スキーマ
{
"type": "object",
"properties": {
"unit_cost": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Ex-works cost of one unit in your currency. Must be\ngreater than 0."
},
"quantity": {
"default": 1,
"minimum": 1,
"type": "integer",
"description": "Units in the shipment. Must be at least 1. Default 1."
},
"freight_total": {
"default": 0,
"minimum": 0,
"type": "number",
"description": "Total freight and insurance for the whole shipment,\nnot per unit. Default 0."
},
"duty_pct": {
"default": 0,
"minimum": 0,
"type": "number",
"description": "Import duty as a percentage of goods value, e.g. 6.5.\nDefault 0."
},
"tax_pct": {
"default": 0,
"minimum": 0,
"type": "number",
"description": "Import VAT or GST as a percentage of goods plus duty plus\nfreight, e.g. 20. Default 0."
},
"other_fees": {
"default": 0,
"minimum": 0,
"type": "number",
"description": "Brokerage, port and handling charges for the shipment.\nDefault 0."
}
},
"required": [
"unit_cost"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"additionalProperties": true
}🟢freight_class(length, width, height, weight, units)
Derive a US LTL freight class from density. FREE. Density in pounds per cubic foot maps to a class on the published NMFC density scale. Typical input {"length": 48, "width": 40, "height": 36, "weight": 400} returns {"cubic_feet": 40.0, "density_pcf": 10.0, "density_class": "100", "caveat": "..."}. Use for a first estimate before a carrier quote. Not as a final classification: NMFC also weighs stowability, handling and liability, so a carrier can and does reclassify. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "dimensions produce zero volume"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
入力スキーマ
{
"type": "object",
"properties": {
"length": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Longest side of the palletised freight. Must be greater than 0."
},
"width": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Second side. Must be greater than 0."
},
"height": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Third side, including the pallet. Must be greater than 0."
},
"weight": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Gross weight including the pallet. Must be greater than 0."
},
"units": {
"default": "in_lb",
"enum": [
"in_lb",
"cm_kg"
],
"type": "string",
"description": "\"in_lb\" for inches and pounds, or \"cm_kg\" for centimetres and\nkilograms. Default \"in_lb\"."
}
},
"required": [
"length",
"width",
"height",
"weight"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"additionalProperties": true
}🟢rate_card(base_cost, cost_per_lb, bands_lb, margin_pct, round_to)
Turn a cost model into a customer-facing weight-banded price table. PREMIUM (license). Prices each band at its upper bound so you never under-charge inside a band, then rounds up to a tidy increment. Typical input {"base_cost": 4.2, "cost_per_lb": 0.65, "bands_lb": [1, 2, 5, 10], "margin_pct": 25} returns {"bands": [{"up_to_lb": 1, "cost": 4.85, "price": 6.5}, ...], "over_top_band": "quote individually"}. Use when publishing shipping prices customers pay. Not for the cut-off at which shipping becomes free — that is free_shipping_threshold. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "bands_lb must contain at least one upper bound"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
入力スキーマ
{
"type": "object",
"properties": {
"base_cost": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Fixed cost per shipment before weight, e.g. pick, pack and\nlabel. Must be greater than 0."
},
"cost_per_lb": {
"minimum": 0,
"type": "number",
"description": "Marginal cost per pound. Use 0 for a flat rate card."
},
"bands_lb": {
"items": {
"type": "number"
},
"type": "array",
"description": "Upper weight bound of each band in ascending order, e.g.\n[1, 2, 5, 10]. At least one band, each greater than 0."
},
"margin_pct": {
"default": 0,
"minimum": 0,
"type": "number",
"description": "Margin added on top of cost, e.g. 25 for 25%. Default 0."
},
"round_to": {
"default": 0.5,
"exclusiveMinimum": 0,
"type": "number",
"description": "Increment to round each published price up to, e.g. 0.5 or\n1. Default 0.5."
}
},
"required": [
"base_cost",
"cost_per_lb",
"bands_lb"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"additionalProperties": true
}🟢free_shipping_threshold(gross_margin_pct, ship_cost, current_aov, target_uplift_pct)
Find the order value at which free shipping stops costing you money. PREMIUM (license). Break-even is where the gross margin on the order covers the shipping you absorb. Typical input {"gross_margin_pct": 45, "ship_cost": 7.5, "current_aov": 38, "target_uplift_pct": 15} returns {"break_even": 16.67, "suggested_threshold": 43.7, "above_current_aov_by": 5.7, "rationale": "..."}. Use when setting or defending a free-shipping bar. Not for what shipping should cost when it is not free — that is rate_card. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"}. Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
入力スキーマ
{
"type": "object",
"properties": {
"gross_margin_pct": {
"exclusiveMinimum": 0,
"maximum": 100,
"type": "number",
"description": "Gross margin on a typical order, e.g. 45 for 45%.\nMust be above 0 and at most 100."
},
"ship_cost": {
"exclusiveMinimum": 0,
"type": "number",
"description": "What one shipment actually costs you to send."
},
"current_aov": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Your current average order value."
},
"target_uplift_pct": {
"default": 0,
"minimum": 0,
"type": "number",
"description": "How far above current AOV you want the threshold\nset, to pull baskets up. Default 0, which returns break-even."
}
},
"required": [
"gross_margin_pct",
"ship_cost",
"current_aov"
],
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"additionalProperties": true
}コミュニティ
エビデンス