MCP server by zavora-ai
Inventory & Warehouse MCP Server
Complete inventory and warehouse management for ADK-Rust Enterprise agents. Provides 38 MCP tools covering the full warehouse lifecycle — stock management, serialized tracking, RFID, QR codes, pick/pack/ship, wave planning, putaway, cycle counts, BOM, and space utilization. Zero configuration, no external dependencies.
Architecture
┌─────────────────────────────────────────────────────────────────────────┐
│ mcp-inventory (38 tools) │
├────────────┬────────────┬────────────┬────────────┬─────────────────────┤
│ Catalog │ Stock │ Warehouse │ Serialized │ Identification │
│ & BOM │ Movements │ Ops │ Tracking │ & Labeling │
├────────────┼────────────┼────────────┼────────────┼─────────────────────┤
│ Items │ Receive │ Pick/Pack │ Serial Reg │ Barcode (Code128) │
│ Locations │ Issue │ Ship │ Serial Move│ QR Codes │
│ BOM │ Transfer │ Waves │ Chain of │ RFID (EPC) │
│ Reorder │ Adjust │ Putaway │ Custody │ Batch Labels │
│ │ Reserve │ Cycle Count│ Location │ │
│ │ │ Space Mgmt │ Scan │ │
└────────────┴────────────┴────────────┴────────────┴─────────────────────┘
Key Principles
- Full lifecycle — from goods receipt through storage, picking, packing, shipping, and returns.
- Serialized tracking — individual unit tracking with full chain of custody history.
- RFID-ready — register tags, process bulk reader scans, detect missing inventory.
- QR code generation — encode serial, SKU, location, and shipment data for mobile scanning.
- Space-aware — locations have capacity limits (units, weight, volume) with utilization reporting.
- Wave planning — batch multiple pick orders for efficient warehouse operations.
- Zero configuration — starts immediately with no external dependencies or API keys.
Tools (38)
Item Catalog
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| item_upsert | Add/update item (SKU, name, category, unit, reorder point, cost) | write |
| item_list | List all items in catalog | read-only |
Locations & Space
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| location_create | Create warehouse/zone/aisle/rack/bin with capacity limits | write |
| location_list | List all locations | read-only |
| space_utilization | Capacity vs used report (units, weight, volume) | read-only |
Stock Movements
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| stock_receive | Receive goods into location (from supplier, production, return) | write |
| stock_issue | Issue stock from location (sales, consumption, dispatch) | write |
| stock_transfer | Transfer between locations | write |
| stock_adjust | Adjust quantity (cycle count correction, damage write-off) | write (approval) |
| stock_check | Check stock level (total, reserved, available) | read-only |
| reorder_alerts | Items below reorder point with suggested order quantities | read-only |
| movement_history | Full movement audit trail for a SKU | read-only |
Reservations
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| stock_reserve | Reserve stock for an order (prevents overselling) | write |
| stock_release | Release a reservation (cancel, expiry) | write |
Bill of Materials
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| bom_set | Define components needed to build a parent item | write |
| bom_check | Check if enough components are available to build N units | read-only |
Pick / Pack / Ship
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| pick_create | Create pick order with line items and location allocation | write |
| pick_confirm | Confirm picked quantities (detect shorts) | write |
| pick_ship | Mark as shipped (issues stock from locations) | write |
| pick_list | List all pick orders | read-only |
Wave Planning
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| wave_create | Batch multiple pick orders into a wave | write |
| wave_release | Release wave (moves all picks to "picking" status) | write |
| wave_complete | Mark wave as completed | write |
| wave_list | List all waves | read-only |
Putaway
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| putaway_rule_create | Define preferred location by item category | write |
| putaway_suggest | Suggest optimal bin for an item based on rules and space | read-only |
Cycle Counts
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| cycle_count_schedule | Schedule a count for a location | write |
| cycle_count_complete | Submit actual counts, auto-detects discrepancies | write |
Serialized Warehousing
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| serial_register | Register individual unit (serial number, lot, RFID, auto-QR) | write |
| serial_move | Move serialized item (full chain of custody) | write |
| serial_lookup | Look up serial — full history, location, status | read-only |
| serial_scan_location | List all serialized items at a location | read-only |
RFID
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| rfid_register | Register RFID EPC tag, link to serial/SKU | write |
| rfid_bulk_read | Process reader scan — found, unknown, and missing detection | write |
| rfid_lookup | Look up tag by EPC | read-only |
QR Codes & Labels
| Tool | Description | Annotations |
|------|-------------|:-----------:|
| qr_generate | Generate QR payload for serial/SKU/location/shipment | write |
| label_generate | Generate barcode label (code128, EAN-13, QR, DataMatrix) | write |
| label_batch | Batch generate labels for multiple entities | write |
Installation
From crates.io
cargo install mcp-inventory
Build from source
git clone https://github.com/zavora-ai/mcp-inventory
cd mcp-inventory
cargo build --release
Claude Desktop
{
"mcpServers": {
"inventory": { "command": "mcp-inventory" }
}
}
Kiro
Add to .kiro/settings/mcp.json:
{
"mcpServers": {
"inventory": { "command": "mcp-inventory" }
}
}
Cursor / Windsurf / Codex
{
"mcpServers": {
"inventory": { "command": "mcp-inventory" }
}
}
Quick Start
1. Add items and locations
{"name": "item_upsert", "arguments": {"sku": "LAPTOP-PRO", "name": "Laptop Pro 16\"", "category": "electronics", "unit": "each", "reorder_point": 20, "reorder_qty": 100, "cost": 850, "currency": "USD"}}
{"name": "location_create", "arguments": {"name": "Warehouse A - Bin A3-07", "location_type": "bin", "capacity_units": 50, "capacity_weight_kg": 500}}
2. Receive stock
{"name": "stock_receive", "arguments": {"sku": "LAPTOP-PRO", "quantity": 30, "location_id": "loc_abc123", "actor": "receiving_clerk", "reference": "PO-2026-0142", "lot_number": "LOT-2026Q2"}}
3. Register serialized items with RFID
{"name": "serial_register", "arguments": {"serial_number": "SN-2026-00142", "sku": "LAPTOP-PRO", "location_id": "loc_abc123", "lot_number": "LOT-2026Q2", "rfid_tag": "E200001234567890"}}
Response:
{"status": "registered", "serial_number": "SN-2026-00142", "qr_code": "QR:SN=SN-2026-00142&SKU=LAPTOP-PRO&LOC=loc_abc123"}
4. Create pick order and wave
{"name": "pick_create", "arguments": {"order_reference": "ORD-8821", "items": [{"sku": "LAPTOP-PRO", "quantity": 2, "location_id": "loc_abc123"}], "default_location": "loc_abc123", "assigned_to": "picker_john"}}
{"name": "wave_create", "arguments": {"name": "Morning Wave", "pick_ids": ["pick_abc", "pick_def", "pick_ghi"], "priority": "high"}}
5. RFID bulk scan (detect missing inventory)
{"name": "rfid_bulk_read", "arguments": {"location_id": "loc_abc123", "epcs": ["E200001234567890", "E200009999999999"]}}
Response:
{"location_id": "loc_abc123", "scanned": 2, "found": 1, "unknown": 1, "missing": 0, "found_tags": [{"epc": "E200001234567890", "serial": "SN-2026-00142"}], "unknown_epcs": ["E200009999999999"], "missing_tags": []}
6. Track serialized item movement
{"name": "serial_move", "arguments": {"serial_number": "SN-2026-00142", "to_location": "STAGING-DOCK-1", "actor": "picker_john", "event_type": "picked", "reference": "ORD-8821"}}
7. Generate QR code for shipping label
{"name": "qr_generate", "arguments": {"entity_type": "serial", "entity_id": "SN-2026-00142", "extra_data": {"order": "ORD-8821", "destination": "Customer XYZ"}}}
Location Hierarchy
Warehouse A (warehouse)
├── Zone 1 - Electronics (zone)
│ ├── Aisle A (aisle)
│ │ ├── Rack A1 (rack)
│ │ │ ├── Bin A1-01 (bin) [capacity: 100 units, 200kg]
│ │ │ ├── Bin A1-02 (bin) [capacity: 100 units, 200kg]
│ │ │ └── ...
│ │ └── Rack A2 (rack)
│ └── Aisle B (aisle)
├── Zone 2 - Bulk Storage (zone)
├── Staging Area (staging)
└── Dock 1 (dock)
Serialized Item Lifecycle
serial_register → in_stock
│
├── serial_move (event: "picked") → in_stock (at staging)
│ │
│ ├── serial_move (event: "shipped") → shipped
│ │ │
│ │ └── serial_move (event: "returned") → in_stock
│ │
│ └── serial_move (event: "scrapped") → scrapped
│
└── rfid_bulk_read → detect if missing from expected location
RFID Operations
| Operation | What happens |
|-----------|-------------|
| rfid_register | Link EPC to serial/SKU, set initial location |
| rfid_bulk_read | Reader scans area → server compares against expected tags |
| Found | Tag is at expected location — update last_read_at |
| Unknown | Tag not in system — flag for investigation |
| Missing | Tag expected but not scanned — potential theft/misplacement |
Barcode Formats
| Format | Use Case | Example Value |
|--------|----------|---------------|
| code128 | General purpose, high density | SKU-LAPTOP-PRO |
| ean13 | Retail products | 5901234123457 |
| qr | Mobile scanning, rich data | SN=X&SKU=Y&LOC=Z |
| datamatrix | Small items, PCBs | Compact binary |
| rfid_epc | RFID tags (96-bit) | E200001234567890 |
Stock Movement Types
| Type | From | To | Use Case |
|------|------|-----|----------|
| receive | — | Location | Goods receipt from supplier |
| issue | Location | — | Sales, consumption, dispatch |
| transfer | Location A | Location B | Internal movement |
| adjust | — | — | Cycle count correction, write-off |
Configuration
Environment Variables
| Variable | Required | Purpose |
|----------|:--------:|---------|
| RUST_LOG | No | Log level (default: info) |
No API keys or external services needed. All data is stored in-memory.
MCP Server Manifest
server_id = "mcp_inventory"
display_name = "Inventory"
version = "1.3.0"
domain = "inventory"
risk_level = "medium"
writes_allowed = "gated"
governance_gates = ["stock_movement_audit"]
Use Cases
Manufacturing
bom_set (define components for finished goods)
stock_receive (raw materials from supplier)
bom_check (can we build 100 units?)
stock_issue (consume components)
serial_register (each finished unit gets serial + RFID)
E-Commerce Fulfillment
stock_receive (bulk from supplier)
stock_reserve (customer places order)
pick_create → wave_create → wave_release (batch fulfillment)
pick_confirm → pick_ship (dispatch)
serial_move (event: "shipped", reference: order_id)
Pharmaceutical / Regulated
serial_register (each unit serialized per regulation)
rfid_register (cold chain monitoring)
serial_move (full chain of custody for audit)
cycle_count_schedule → cycle_count_complete (regulatory compliance)
qr_generate (patient-facing verification)
Retail / Multi-Store
location_create (store_1, store_2, warehouse)
stock_transfer (warehouse → store)
reorder_alerts (per-location thresholds)
rfid_bulk_read (daily inventory verification)
space_utilization (optimize shelf allocation)
Error Codes
| Code | Meaning |
|------|---------|
| INSUFFICIENT_STOCK | Not enough available stock for operation |
| SERIAL_NOT_FOUND | Serial number not registered |
| RFID_NOT_FOUND | EPC tag not in system |
| PICK_NOT_FOUND | Pick order ID doesn't exist |
| WAVE_NOT_FOUND | Wave ID doesn't exist |
| BOM_NOT_FOUND | No BOM defined for parent SKU |
| RESERVATION_NOT_FOUND | Reservation ID doesn't exist |
| CYCLE_COUNT_NOT_FOUND | Cycle count ID doesn't exist |
Documentation
| Document | Description | |----------|-------------| | mcp-server.toml | ADK-Rust Enterprise registry manifest | | CHANGELOG.md | Version history | | Rust Docs | Generated API documentation |
Contributing
Contributions welcome. Priority areas:
- Persistent storage backend (PostgreSQL/SQLite)
- Expiry date management (FEFO picking)
- Multi-warehouse transfer orders
- Inventory valuation (FIFO, LIFO, weighted average)
- Integration with mcp-logistics for shipping
- Barcode image generation (SVG/PNG)
Contributors
| 
James Karanja Maina |
|:---:|
License
Apache-2.0 — see LICENSE for details.
Part of the ADK-Rust Enterprise MCP server ecosystem.
Built with ❤️ by Zavora AI
Registry Compliance
This server implements the ADK MCP SDK contract:
- HealthCheck — async health probe for registry monitoring
- mcp-server.toml — manifest declaring tools, risk classes, and credentials
- Structured tracing —
RUST_LOGenv-filter for observability - Audit trail — every stock movement logged with actor, timestamp, and reference