Koskamo

MCP Packing List

Generates packing slips for shipments, tracking cartons, weights, and shortfalls against the order. It calculates tare, net, gross, volume, and chargeable weight per carton and reports items as short, complete, over-packed, or not on the order. The server keeps no prices and stores no derived data.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

MCP Packing List logo, by theluckystrikeCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-02Published by theluckystrike
MCP endpoint (Streamable HTTP)
https://mcp.zovo.one/mcp/packing-list
Vendor documentation

What you can do with it

  • Create packing slips for shipments with carton details and weights
  • Check for shortfalls between ordered and packed items
  • Calculate chargeable weight for courier booking

Source and maintenance

Community listingRegistry 0.23.0
Maintenance checked

Protocol and capabilities

Server
mcp-packing-list 0.22.8
MCP protocol
2025-06-18
Tools
14 advertised
Resources
2 advertised
Resource templates
0 advertised
Prompts
2 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "prompts": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Packing lists for outgoing shipments. It covers lists opened against an order, the ordered lines, cartons with tare weight and dimensions, packed and unpacked items, gross, volumetric and chargeable weight, shortfalls and over-packing against the order, shipping with carrier and tracking number, and packing slips without prices. Weights are whole grams and dimensions whole centimetres. Records are stored per user account on McpStamp's hosted service. The free tier allows 3 open lists; Pro also returns slips as download files.

Tools

14 advertised

packing_list_create — Open a packing list
Advertised by the server during the last successful anonymous check.

Open a packing list against an order and return its PL-YYYY-NNNN number: the order reference, the consignee, where it ships to and the date. Free tier: 3 open at once; shipping or cancelling frees a slot.

packing_list_create input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "reference",
    "consignee"
  ],
  "properties": {
    "date": {
      "type": "string",
      "maxLength": 10,
      "description": "The day the list was raised, YYYY-MM-DD. Default today"
    },
    "note": {
      "type": "string",
      "maxLength": 2000
    },
    "ship_to": {
      "type": "string",
      "maxLength": 2000,
      "description": "The delivery address, printed on the slip. Omit to leave it off"
    },
    "consignee": {
      "type": "string",
      "maxLength": 200,
      "description": "Who receives the goods, as named on the order"
    },
    "reference": {
      "type": "string",
      "maxLength": 64,
      "description": "The order this ships against, by id, e.g. WO-2026-0001, INV-2026-0007 or PO-4471"
    },
    "duplicate_ok": {
      "type": "boolean",
      "description": "Open it even though an OPEN list already exists on this reference. Default false"
    },
    "reference_kind": {
      "enum": [
        "quote",
        "work_order",
        "invoice",
        "order"
      ],
      "type": "string",
      "description": "What the reference is. Inferred from the id when omitted: WO- work order, INV- invoice, Q- quote, otherwise a plain order"
    }
  },
  "additionalProperties": false
}
packing_list_create annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
packing_expect — Declare what the order says should ship
Advertised by the server during the last successful anonymous check.

Add an ordered line to a packing list so the shortfall is real: a SKU, a description and a quantity. Nothing is read from the quotes, work order or invoice store; what the order says is stated here.

packing_expect input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "packing_list",
    "description",
    "quantity"
  ],
  "properties": {
    "sku": {
      "type": "string",
      "maxLength": 64,
      "description": "Stock code, upper-cased and stripped of spaces. Lines with a SKU are matched on it, lines without on their description"
    },
    "quantity": {
      "type": "integer",
      "maximum": 1000000,
      "minimum": 1,
      "description": "How many units the order says should ship. Whole units"
    },
    "description": {
      "type": "string",
      "maxLength": 2000,
      "description": "The goods as the order names them, e.g. Oak shelf 900mm"
    },
    "packing_list": {
      "type": "string",
      "maxLength": 200,
      "description": "The packing list id, e.g. PL-2026-0001, or the order reference when only one list carries it"
    }
  },
  "additionalProperties": false
}
packing_expect annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
carton_add — Add a carton
Advertised by the server during the last successful anonymous check.

Add a carton to a packing list and return its C01-style id: a label, the empty weight in WHOLE GRAMS, and optionally length, width and height in WHOLE CENTIMETRES. Dimensions are what make a chargeable weight possible.

carton_add input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "packing_list",
    "label",
    "tare_grams"
  ],
  "properties": {
    "note": {
      "type": "string",
      "maxLength": 2000
    },
    "label": {
      "type": "string",
      "maxLength": 200,
      "description": "What is written on the box, e.g. Box 1 of 3 or Pallet A"
    },
    "width_cm": {
      "type": "integer",
      "maximum": 2000,
      "minimum": 1,
      "description": "Outer width in whole centimetres"
    },
    "height_cm": {
      "type": "integer",
      "maximum": 2000,
      "minimum": 1,
      "description": "Outer height in whole centimetres"
    },
    "length_cm": {
      "type": "integer",
      "maximum": 2000,
      "minimum": 1,
      "description": "Outer length in whole centimetres. All three dimensions or none"
    },
    "tare_grams": {
      "type": "integer",
      "maximum": 100000000,
      "minimum": 0,
      "description": "The EMPTY carton with its packaging, in whole grams. 0 when it is not known"
    },
    "packing_list": {
      "type": "string",
      "maxLength": 200,
      "description": "The packing list id, e.g. PL-2026-0001, or the order reference when only one list carries it"
    }
  },
  "additionalProperties": false
}
carton_add annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
pack_item — Pack goods into a carton
Advertised by the server during the last successful anonymous check.

Put a quantity of one item into a named carton: a description, how many, and the per-unit weight in WHOLE GRAMS. Leave unit_grams out when it was not weighed and the carton gross comes back as a lower bound.

pack_item input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "packing_list",
    "carton",
    "description",
    "quantity"
  ],
  "properties": {
    "sku": {
      "type": "string",
      "maxLength": 64,
      "description": "Stock code, upper-cased and stripped of spaces. Lines with a SKU are matched on it, lines without on their description"
    },
    "note": {
      "type": "string",
      "maxLength": 2000
    },
    "carton": {
      "type": "string",
      "maxLength": 16,
      "description": "The carton id, e.g. C01, or its exact label"
    },
    "quantity": {
      "type": "integer",
      "maximum": 1000000,
      "minimum": 1,
      "description": "How many units go into THIS carton. Split across cartons with one call each"
    },
    "unit_grams": {
      "type": "integer",
      "maximum": 100000000,
      "minimum": 0,
      "description": "Weight of ONE unit in whole grams. Omit when not weighed; the carton is then a lower bound"
    },
    "description": {
      "type": "string",
      "maxLength": 2000,
      "description": "The goods going in, e.g. Oak shelf 900mm"
    },
    "packing_list": {
      "type": "string",
      "maxLength": 200,
      "description": "The packing list id, e.g. PL-2026-0001, or the order reference when only one list carries it"
    }
  },
  "additionalProperties": false
}
pack_item annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
unpack_item — Take a packed line back out
Advertised by the server during the last successful anonymous check.

Remove one packed line from a packing list by its L01-style id and return the carton it came out of. The line is deleted, not zeroed, so the slip does not print an item nobody packed.

unpack_item input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "packing_list",
    "line"
  ],
  "properties": {
    "line": {
      "type": "string",
      "maxLength": 16,
      "description": "The packed line id, e.g. L03, as shown by packing_list_show or carton_report"
    },
    "packing_list": {
      "type": "string",
      "maxLength": 200,
      "description": "The packing list id, e.g. PL-2026-0001, or the order reference when only one list carries it"
    }
  },
  "additionalProperties": false
}
unpack_item annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
packing_list_show — Show one packing list
Advertised by the server during the last successful anonymous check.
Advertised read-only

The whole packing list: its cartons with contents and derived weights, the ordered lines, the shortfall, whether it is ready to ship and why not, and its status history. Nothing here is stored; it is computed.

packing_list_show input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "packing_list"
  ],
  "properties": {
    "divisor": {
      "type": "integer",
      "description": "Volumetric divisor in cm3 per kg: 5000 courier air (default), 6000 IATA air, 4000 some road tariffs"
    },
    "packing_list": {
      "type": "string",
      "maxLength": 200,
      "description": "The packing list id, e.g. PL-2026-0001, or the order reference when only one list carries it"
    }
  },
  "additionalProperties": false
}
packing_list_show annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
packing_list_list — List packing lists
Advertised by the server during the last successful anonymous check.
Advertised read-only

Packing lists newest first, with cartons, units, gross weight and how many ordered lines are still short. Filter by status, by order reference or by consignee. Returns at most 500 rows.

packing_list_list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "status": {
      "enum": [
        "draft",
        "packed",
        "shipped",
        "cancelled"
      ],
      "type": "string",
      "description": "Only lists in this status"
    },
    "divisor": {
      "type": "integer",
      "description": "Volumetric divisor in cm3 per kg: 5000 courier air (default), 6000 IATA air, 4000 some road tariffs"
    },
    "consignee": {
      "type": "string",
      "maxLength": 200,
      "description": "Only lists whose consignee contains this text"
    },
    "open_only": {
      "type": "boolean",
      "description": "Only draft and packed lists, the ones that count against the free tier. Default false"
    },
    "reference": {
      "type": "string",
      "maxLength": 64,
      "description": "Only lists against this order reference, matched case-insensitively"
    }
  },
  "additionalProperties": false
}
packing_list_list annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
carton_report — Weigh the cartons
Advertised by the server during the last successful anonymous check.
Advertised read-only

Per carton and for the shipment: tare, net, gross, volume, volumetric weight and the chargeable weight, the greater of gross and volumetric. A carton with no dimensions makes the chargeable total null, never a guess.

carton_report input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "packing_list"
  ],
  "properties": {
    "divisor": {
      "type": "integer",
      "description": "Volumetric divisor in cm3 per kg: 5000 courier air (default), 6000 IATA air, 4000 some road tariffs"
    },
    "packing_list": {
      "type": "string",
      "maxLength": 200,
      "description": "The packing list id, e.g. PL-2026-0001, or the order reference when only one list carries it"
    }
  },
  "additionalProperties": false
}
carton_report annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
packing_shortfall — What is still to pack
Advertised by the server during the last successful anonymous check.

Ordered against packed, line by line: what is still short, what was over-packed, and what was packed that is not on the order at all. A packed line with no ordered line is reported, never dropped.

packing_shortfall input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "packing_list"
  ],
  "properties": {
    "packing_list": {
      "type": "string",
      "maxLength": 200,
      "description": "The packing list id, e.g. PL-2026-0001, or the order reference when only one list carries it"
    }
  },
  "additionalProperties": false
}
packing_shortfall annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
packing_list_status — Move a packing list on
Advertised by the server during the last successful anonymous check.
Advertised read-only

Move a packing list draft to packed to shipped, or cancel it. Shipping records the carrier, the tracking number and the date, and freezes the list. A shipped list cannot be reopened or edited.

packing_list_status input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "packing_list",
    "status"
  ],
  "properties": {
    "date": {
      "type": "string",
      "maxLength": 10,
      "description": "The day the step happened, YYYY-MM-DD. Default today"
    },
    "note": {
      "type": "string",
      "maxLength": 2000
    },
    "force": {
      "type": "boolean",
      "description": "Ship even though lines are short, over-packed or not on the order. Default false, and the reasons come back either way"
    },
    "status": {
      "enum": [
        "draft",
        "packed",
        "shipped",
        "cancelled"
      ],
      "type": "string",
      "description": "The status to move to. draft to packed to shipped, or cancelled from either open status"
    },
    "carrier": {
      "type": "string",
      "maxLength": 200,
      "description": "Who is carrying it, recorded when moving to shipped"
    },
    "tracking": {
      "type": "string",
      "maxLength": 200,
      "description": "The carrier's consignment or tracking number, recorded when moving to shipped"
    },
    "packing_list": {
      "type": "string",
      "maxLength": 200,
      "description": "The packing list id, e.g. PL-2026-0001, or the order reference when only one list carries it"
    }
  },
  "additionalProperties": false
}
packing_list_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
packing_slip — Produce the packing slip
Advertised by the server during the last successful anonymous check.

The packing slip as plain text on every tier: cartons, contents, weights and a signature line, and no prices anywhere. Pro also gets it back as a .txt download link valid for one hour, named by out_path; an existing name is refused unless told to overwrite.

packing_slip input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "packing_list"
  ],
  "properties": {
    "divisor": {
      "type": "integer",
      "description": "Volumetric divisor in cm3 per kg: 5000 courier air (default), 6000 IATA air, 4000 some road tariffs"
    },
    "out_path": {
      "type": "string",
      "maxLength": 1000,
      "description": "Name for the downloaded .txt file, e.g. order-4471-slip. Pro only. Omit to get the slip back as text, which every tier can do; the file comes back as a download link valid for one hour"
    },
    "overwrite": {
      "type": "boolean",
      "description": "Replace out_path if a file is already there. Default false, and an existing file is refused with nothing written"
    },
    "packing_list": {
      "type": "string",
      "maxLength": 200,
      "description": "The packing list id, e.g. PL-2026-0001, or the order reference when only one list carries it"
    }
  },
  "additionalProperties": false
}
packing_slip annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
packing_list_delete — Delete a packing list
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a packing list for good, with its cartons and packed lines. A shipped list is refused: it is the record of what left the building. Cancel a list you no longer want instead of deleting a real shipment.

packing_list_delete input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "packing_list",
    "confirm"
  ],
  "properties": {
    "confirm": {
      "type": "boolean",
      "const": true,
      "description": "Must be true. There is no undo and nothing is copied anywhere first"
    },
    "packing_list": {
      "type": "string",
      "maxLength": 200,
      "description": "The packing list id, e.g. PL-2026-0001, or the order reference when only one list carries it"
    }
  },
  "additionalProperties": false
}
packing_list_delete annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
license_status — License status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.

license_status input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
license_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
license_activate — Activate license
Advertised by the server during the last successful anonymous check.

Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.

license_activate input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "key"
  ],
  "properties": {
    "key": {
      "type": "string",
      "description": "License key from checkout, MCPL1.<payload>.<signature>"
    }
  },
  "additionalProperties": false
}
license_activate annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

2 advertised

pack_the_shipment — Pack an order into cartons and produce the slip

Advertised by the server during the last successful anonymous check.

Declare what the order says should ship, pack it into cartons with weights, check nothing is short, and produce the packing slip.

reference
The order this ships against, e.g. WO-2026-0044 or PO-4471 (required)
upgrade_to_pro — Explain the upgrade

Advertised by the server during the last successful anonymous check.

Explain what Pro on the packing-list server costs and exactly what the user has to do, without leaving the conversation.

feature
The capped feature that prompted this, if there was one

Resources

2 advertised

contract — The status machine, the weight basis, the free tier and where this server writes

Advertised by the server during the last successful anonymous check.

The four statuses and the legal moves, how a gross and a chargeable weight are built, what a shortfall state means, the free-tier limits and the one document this server writes.

contract URI
packinglist://contract

MIME type: application/json

pricing — Pricing and upgrade

Advertised by the server during the last successful anonymous check.

What packing-list costs, what Pro unlocks, the checkout link that carries this connection's token, and the one step a person has to take. Machine-readable; read it before telling a user how to lift a free-tier cap.

pricing URI
pricing://packing-list

MIME type: application/json

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
457 ms
95th percentile latency
457 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 457 ms · metadata changed · 14 tool(s), 2 resource(s), 0 resource template(s), 2 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http mcp-packing-list https://mcp.zovo.one/mcp/packing-list

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add mcp-packing-list --url https://mcp.zovo.one/mcp/packing-list

Cursor

Merge this server into .cursor/mcp.json in your project, then enable mcp-packing-list in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "mcp-packing-list": {
      "url": "https://mcp.zovo.one/mcp/packing-list"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "mcp-packing-list": {
      "type": "streamableHttp",
      "url": "https://mcp.zovo.one/mcp/packing-list",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start mcp-packing-list and inspect its tools.
VS Code configuration
{
  "servers": {
    "mcp-packing-list": {
      "type": "http",
      "url": "https://mcp.zovo.one/mcp/packing-list"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http mcp-packing-list https://mcp.zovo.one/mcp/packing-list

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "mcp-packing-list": {
      "url": "https://mcp.zovo.one/mcp/packing-list"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "mcp-packing-list": {
      "serverUrl": "https://mcp.zovo.one/mcp/packing-list"
    }
  }
}

Let your agent find its tools

Find servers like MCP Packing List from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.