skill / adom-inventory
!

Not installable via adompkg

This skill has no published release. adompkg install kyle/adom-inventory will not work until a maintainer publishes a tarball with install.sh and uninstall.sh.

See the publishing docs for the package.json schema and tarball layout required to ship this skill.


name: adom-inventory
user-invocable: true
description: Query Adom's in-house parts inventory — stock levels, pricing, order history, and availability for 210+ electronic components (resistors, capacitors, inductors, LEDs, ferrites, MLCCs, connectors). Use when any agent needs to check what parts Adom has on hand, get our internal pricing/price breaks, look up a component by MPN or description, check if a BOM can be built from stock, or answer "do we have X in inventory?". Trigger words — inventory, in stock, on hand, do we have, parts inventory, check stock, our parts, basic parts, Adom parts, what's in inventory, available parts, inventory lookup, part availability, how many do we have, unit cost, our price, price break.

Adom Parts Inventory

Query Adom's in-house electronic component inventory. This is our physical stock — reels, trays, and cut tape sitting in the shop. 210+ parts (137 basic/commodity, 73 extended), live Mouser/DigiKey/LCSC vendor stock cache, order history, and computed Adom pricing with markup.

The inventory service runs at https://inventory-2w8z8d9ojzzl.adom.cloud (port 8892). All endpoints return JSON, no auth required (org-boundary trust).

Setup — set $INV once

To keep examples readable, set this shell var at the start of any session that uses the inventory:

export INV=https://inventory-2w8z8d9ojzzl.adom.cloud

Every curl below assumes $INV is set. If you skip the export, substitute the full URL inline.

Quick answers via curl

Most agent queries fall into one of these patterns:

"Do we have part X?"

# By manufacturer part number or Mouser PN — smart match with tag/synonym fallback
curl -s "$INV/parts/lookup?q=IN-S42ATA" | jq .

# Response when found:
# { "found": true, "part": { "id": 123, "value": "amber", "package": "0402", "qty_on_hand": 5000, ... }, "match_type": "exact" }

# Response with close match (e.g. "yellow LED" finds amber):
# { "found": false, "candidates": [{ "part": {...}, "match_type": "close", "score": 0.82, "reasons": ["yellow -> amber", "tag: led"] }] }

"How many X do we have?"

curl -s "$INV/api/inventory/check?mpn=IN-S42ATA&qty=100" | jq '{status, have, need, remainder_to_order}'
# { "status": "in-stock", "have": 5000, "need": 100, "remainder_to_order": 0 }

"What's our price for part X at qty Y?"

curl -s "$INV/api/pricing/quote?part_id=123&qty=100" | jq '{our_price: .our_price.unit_price, breaks: [.our_price.breaks[] | {qty_from, unit_price}]}'

"Can we build this BOM from stock?"

curl -s -X POST "$INV/api/inventory/bulk-check" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"mpn":"IN-S42ATA","qty":100},{"mpn":"RC0402FR-07100KL","qty":500}]}' | jq '.summary'
# { "covered_pct": 100, "by_status": { "in-stock": 2 }, "total_lines": 2 }

"Give me a summary of what we have"

curl -s "$INV/api/inventory/stats" | jq .
# { "parts_total": 210, "basic_parts": 137, "total_units_on_hand": 94998, "last_updated_at": 1778877608, "server_version": "1.0.0" }

"List all parts" (full dump)

curl -s "$INV/parts" | jq '.[0]'   # inspect first part
curl -s "$INV/parts" | jq 'length' # count
curl -s "$INV/parts" | jq '[.[] | select(.type == "Resistor")] | length'  # count resistors

Endpoint reference

GET /parts/lookup?q=QUERY

Smart match. Tries exact mouserPN/mfrPN first, then falls back to tag + synonym overlap. Use this when you have a part number or description but aren't sure of the exact match.

Response (found):

{ "found": true, "part": { <full part object> }, "match_type": "exact" }

Response (candidates):

{ "found": false, "candidates": [{ "part": {...}, "match_type": "close", "score": 0.82, "reasons": ["yellow -> amber", "tag: led"] }] }

GET /api/inventory/check?mpn=X&qty=N

Single-line availability + pricing check.

Field Type Description
status string in-stock, partial, out-of-stock, no-match
have number qty on hand
need number qty requested
remainder_to_order number max(0, need - have)
part_id number matched inventory ID
match_type string exact, close, none
pricing.our_unit_price number Adom sell price at requested qty
pricing.our_breaks array [{qty_from, unit_price}] — price ladder

POST /api/inventory/bulk-check

Batch availability check. Send {"items": [{mpn, qty, manufacturer?, value?, package?}]}. Returns {items: [...], summary: {covered_pct, by_status, total_lines}}. Each item includes status, have/need/remainder, match info, and pricing (unit price + breaks).

GET /api/pricing/quote?part_id=N&qty=Q

Returns Adom's pricing for a part at a given quantity, including price breaks.

Field Type Description
our_price.unit_price number Adom sell price at requested qty
our_price.breaks array [{qty_from, unit_price}] — price ladder
our_price.extended number qty * unit_price

GET /parts/:id/cost-history

Last 50 orders with unit_cost > 0. Returns [{id, ordered_at, supplier, quantity, unit_cost}].

GET /parts/:id/tags

Returns {user: ["tag1", ...], auto: ["led", "amber", "0402", ...]}.

GET /api/inventory/stats

Lightweight health check. Returns {parts_total, basic_parts, total_units_on_hand, last_updated_at, server_version}.

GET /parts

Full part list. Each part includes: id, type, value, package, tolerance, material, manufacturer, description, mouserPN, mfrPN, reel_qty, reel_price, qty_on_hand, location, is_basic, low_stock, last_order, cached_stock, effective_stock.

GET /parts/:id

Single part with full detail (same shape as items in GET /parts).

Part types in inventory

Type Count Examples
Resistor ~104 0402/0603/0805, 1R to 10M, 1% and 5%
MLCC (capacitor) ~47 0402/0603/0805, 1pF to 100uF, X5R/X7R/C0G
LED ~12 Amber/blue/green/red/white, 0402/0603
Inductor ~7 100nH to 10uH, chip inductors
Ferrite ~2 0402 ferrites at 100 MHz
Other ~38 Connectors, ICs, transistors, diodes, specialty

What "basic parts" means

Parts with is_basic = 1 (137 of 210) are commodity components Adom stocks in volume — standard resistor/capacitor/LED values purchased on reels from Mouser. These are always on hand and priced via the markup engine. Non-basic parts are project-specific or specialty.

Notes

  • All timestamps are Unix epoch (seconds)
  • Stock counts are live — updated on receive, consume, and manual adjustment
  • Vendor stock cache refreshes hourly from Mouser (primary), DigiKey, LCSC
  • The smart match in /parts/lookup understands color synonyms (yellow=amber), package aliases (0603=1608), and value tolerance (99k matches 100k)
  • This service is separate from the Mouser/DigiKey/JLCPCB search tools — those search vendor catalogs; this queries what Adom physically has on shelves