Skip to main content
Version: v1.0.0(int)

Tool Reference

The Pharus MCP server exposes 143 tools covering the full data-plane API. This page is generated from the same definitions the server uses, so it always matches the live tool surface.

Legend: ✏️ write · 🔴 destructive (MCP hosts ask for confirmation) · unmarked = read-only. Arguments marked * are required. Every tool also accepts an optional orgId — only relevant for tokens not bound to an organization (today all PATs are org-bound, so you can ignore it).

Locations​

check_location_in_use​

Check whether a location is referenced by POs, WOs, SOs, or inventory ledgers (per-domain counts). Use before attempting delete_location.

Arguments: id* (string)

create_location ✏️​

Create a warehouse/site location. Only name is required (must be unique in the org); address fields are optional. New locations are active by default.

Arguments: name* (string), address (string,null), city (string,null), state (string,null), country (string,null), zipCode (string,null), notes (string,null)

delete_location 🔴​

Permanently delete a location. Fails with 409 in_use if any PO, WO, SO, or inventory ledger references it — call check_location_in_use first, and prefer archiving via update_location { isActive: false } for routine cleanup.

Arguments: id* (string)

list_locations​

List all locations in the organization (bounded, no pagination). Includes inactive (archived) locations — check isActive.

Arguments: none

update_location ✏️​

Update a location's fields. Archiving and reactivating are done here too: pass isActive: false to archive, true to reactivate (there is no separate endpoint).

Arguments: id* (string), name (string), address (string,null), city (string,null), state (string,null), country (string,null), zipCode (string,null), notes (string,null), sortOrder (integer), isActive (boolean)

Vendors​

bulk_import_vendors ✏️​

Create many vendors in one call from an array of rows. Use for initial data loads; returns per-row results so partial failures are visible.

Arguments: rows* (array)

create_vendor ✏️​

Create a vendor (materials supplier). Vendors are referenced by purchase orders.

Arguments: name* (string), address (string,null), city (string,null), state (string,null), country (string,null), zipCode (string,null), term (string,null), qboId (string,null), notes (string,null)

delete_vendor 🔴​

Permanently delete a vendor. Fails with 409 in_use when purchase orders reference it.

Arguments: id* (string)

get_vendor​

Get full detail for one vendor by ID.

Arguments: id* (string)

list_vendors​

List vendors in the organization.

Arguments: isActive (string)

update_vendor ✏️​

Update a vendor's fields (partial update — only send what changes).

Arguments: id* (string), name (string), address (string,null), city (string,null), state (string,null), country (string,null), zipCode (string,null), term (string,null), qboId (string,null), notes (string,null), isActive (boolean)

Materials​

bulk_import_materials ✏️​

Create many materials in one call from an array of rows. Use for initial data loads; returns per-row results so partial failures are visible.

Arguments: rows* (array)

check_material_type_in_use​

Check whether any materials still use this material type (call before delete).

Arguments: id* (string)

create_material ✏️​

Create a raw material. Materials are consumed by work orders (via BOMs) and tracked in the materials inventory ledger.

Arguments: code* (string), name* (string), typeId* (string), notes (string,null)

create_material_type ✏️​

Create a material type (org-defined category used to classify materials).

Arguments: name* (string)

delete_material 🔴​

Permanently delete a material. Fails with 409 in_use when BOMs, POs, or ledger entries reference it.

Arguments: id* (string)

delete_material_type 🔴​

Delete a material type. Fails with 409 in_use while materials still use it — check with check_material_type_in_use first.

Arguments: id* (string)

get_material​

Get full detail for one material by ID.

Arguments: id* (string)

list_material_types​

List the org's material types.

Arguments: none

list_materials​

List materials in the organization, with filtering/pagination via query args.

Arguments: active (string), type (string), q (string)

update_material ✏️​

Update a material's fields (partial update — only send what changes).

Arguments: id* (string), code (string), name (string), typeId (string), notes (string,null), isActive (boolean)

update_material_type ✏️​

Rename/update a material type.

Arguments: id* (string), name (string), sortOrder (integer), isActive (boolean)

Products (SKUs)​

bulk_import_skus ✏️​

Create many SKUs in one call from an array of rows. Use for initial data loads; returns per-row results so partial failures are visible.

Arguments: rows* (array)

check_sku_type_in_use​

Check whether any SKUs still use this SKU type (call before delete).

Arguments: id* (string)

create_sku ✏️​

Create a SKU (finished-goods product). SKUs are produced by work orders, sold on sales orders, and tracked in the finished-goods inventory ledger.

Arguments: code* (string), name* (string), typeId* (string), itemsPerUnit (integer), ozPerItem (number,null), qboId (string,null), notes (string,null)

create_sku_type ✏️​

Create a SKU type (org-defined category used to classify SKUs).

Arguments: name* (string)

delete_sku 🔴​

Permanently delete a SKU. Fails with 409 in_use when BOMs, orders, or ledger entries reference it.

Arguments: id* (string)

delete_sku_type 🔴​

Delete a SKU type. Fails with 409 in_use while SKUs still use it — check with check_sku_type_in_use first.

Arguments: id* (string)

get_sku​

Get full detail for one SKU by ID.

Arguments: id* (string)

list_sku_types​

List the org's SKU types.

Arguments: none

list_skus​

List SKUs in the organization, with filtering/pagination via query args.

Arguments: active (string), type (string), itemsPerUnitMin (string), itemsPerUnitMax (string), ozPerItemMin (string), ozPerItemMax (string), q (string)

update_sku ✏️​

Update a SKU's fields (partial update — only send what changes).

Arguments: id* (string), code (string), name (string), typeId (string), itemsPerUnit (integer), ozPerItem (number,null), qboId (string,null), notes (string,null), isActive (boolean)

update_sku_type ✏️​

Rename/update a SKU type.

Arguments: id* (string), name (string), sortOrder (integer), isActive (boolean)

Bills of Materials​

create_bom ✏️​

Create the bill of materials for a SKU: the list of input materials (or input SKUs) and quantities needed to produce one unit. A SKU has at most one BOM.

Arguments: outputSkuId* (string), items* (array)

delete_bom 🔴​

Delete a SKU's BOM. Fails with 409 in_use when work orders depend on it.

Arguments: id* (string)

get_sku_bom​

Get the BOM (composition lines) for a SKU. The id argument is the SKU id.

Arguments: id* (string)

list_boms​

List the SKUs that have a BOM defined.

Arguments: q (string)

update_bom ✏️​

Replace a BOM's composition wholesale — the items array you send becomes the entire new composition (this is not a partial merge).

Arguments: id* (string), outputSkuId* (string), items* (array)

Contacts​

add_contact_method ✏️​

Add a contact method (email, phone, etc.) to a contact.

Arguments: id* (string), type* (string), value* (string), label (string,null), isPrimary (boolean)

create_contact ✏️​

Create a standalone contact (person). To attach it to a vendor/customer/broker, link it afterwards with link_contact — or use find_or_create_contact to do both in one step.

Arguments: firstName* (string), lastName (string,null), title (string,null), notes (string,null), displayName (string)

delete_contact 🔴​

Permanently delete a contact, including its links and contact methods.

Arguments: id* (string)

delete_contact_method 🔴​

Delete a contact method. The id is the method id, not the contact id.

Arguments: id* (string)

find_or_create_contact ✏️​

Find an existing contact by identity or create it, and link it to an entity (vendor/customer/broker) in one call. Prefer this over create_contact + link_contact when attaching people to entities.

Arguments: firstName* (string), lastName (string,null), email* (string), entityType* (string), entityId* (string), role (string,null)

get_contact​

Get one contact with its details.

Arguments: id* (string)

Link an existing contact to an entity (vendor/customer/broker) with a role.

Arguments: id* (string), entityType* (string), entityId* (string), role (string,null), notes (string,null), isPrimary (boolean)

list_contact_methods​

List a contact's contact methods.

Arguments: id* (string)

list_contacts​

List contacts in the organization.

Arguments: none

list_contacts_linked_to​

List the contacts linked to a given entity (vendor/customer/broker), specified via query args.

Arguments: entityType* (string), entityId* (string)

Remove a contact-entity link (the contact itself is kept). The id is the link id, not the contact id.

Arguments: id* (string)

update_contact ✏️​

Update a contact's fields (partial update).

Arguments: id* (string), firstName (string), lastName (string,null), title (string,null), notes (string,null), displayName (string), isActive (boolean)

Update a contact-entity link (e.g. change the role). The id is the link id.

Arguments: id* (string), role (string,null), notes (string,null), isPrimary (boolean), isActive (boolean)

update_contact_method ✏️​

Update a contact method. The id is the method id, not the contact id.

Arguments: id* (string), type (string), value (string), label (string,null), isPrimary (boolean), isActive (boolean)

Customers​

bulk_import_customers ✏️​

Create many customers in one call from an array of rows. Use for initial data loads; returns per-row results so partial failures are visible.

Arguments: rows* (array)

check_broker_in_use​

Check whether any customers still reference this broker (call before delete).

Arguments: id* (string)

check_customer_segment_in_use​

Check whether any customers still use this segment (call before delete).

Arguments: id* (string)

check_customer_type_in_use​

Check whether any customers still use this type (call before delete).

Arguments: id* (string)

create_broker ✏️​

Create a broker (sales intermediary that can be attached to customers).

Arguments: name* (string)

create_customer ✏️​

Create a customer. Customers are referenced by sales orders and can carry a segment, type, and broker.

Arguments: name* (string), typeId* (string), segmentId (string,null), brokerId (string,null), brokerFeePercent (number,null), address (string,null), city (string,null), state (string,null), country (string,null), zipCode (string,null), parentId (string,null), qboId (string,null), notes (string,null)

create_customer_segment ✏️​

Create a customer segment (org-defined grouping, e.g. retail/wholesale).

Arguments: name* (string)

create_customer_type ✏️​

Create a customer type (org-defined classification).

Arguments: name* (string)

delete_broker 🔴​

Delete a broker. Fails with 409 in_use while customers reference it — check with check_broker_in_use first.

Arguments: id* (string)

delete_customer 🔴​

Permanently delete a customer. Fails with 409 in_use when sales orders reference it.

Arguments: id* (string)

delete_customer_segment 🔴​

Delete a customer segment. Fails with 409 in_use while customers use it — check with check_customer_segment_in_use first.

Arguments: id* (string)

delete_customer_type 🔴​

Delete a customer type. Fails with 409 in_use while customers use it — check with check_customer_type_in_use first.

Arguments: id* (string)

get_customer​

Get full detail for one customer by ID.

Arguments: id* (string)

list_brokers​

List the org's brokers.

Arguments: none

list_customer_segments​

List the org's customer segments.

Arguments: none

list_customer_types​

List the org's customer types.

Arguments: none

list_customers​

List customers, with filtering/pagination via query args.

Arguments: active (string), type (string), segment (string), broker (string), parentCustomer (string), q (string)

update_broker ✏️​

Update a broker's fields.

Arguments: id* (string), name (string), sortOrder (integer), isActive (boolean)

update_customer ✏️​

Update a customer's fields (partial update — only send what changes).

Arguments: id* (string), name (string), typeId (string), segmentId (string,null), brokerId (string,null), brokerFeePercent (number,null), address (string,null), city (string,null), state (string,null), country (string,null), zipCode (string,null), parentId (string,null), qboId (string,null), notes (string,null), isActive (boolean)

update_customer_segment ✏️​

Rename/update a customer segment.

Arguments: id* (string), name (string), sortOrder (integer), isActive (boolean)

update_customer_type ✏️​

Rename/update a customer type.

Arguments: id* (string), name (string), sortOrder (integer), isActive (boolean)

Materials Inventory​

adjust_materials_inventory ✏️​

Record a manual stock adjustment (count correction, shrinkage, found stock) for a material at a location. Use transfers for moves and disposals for write-offs — not adjustments.

Arguments: materialId* (string), locationId* (string), quantity* (number), notes (string,null), eventDate (string)

complete_materials_transfer ✏️​

Mark an in-transit materials transfer as received at the destination. ref is the TFR-MI-xxx code returned by create_materials_transfer.

Arguments: ref* (string), eventDate (string), notes (string,null)

create_materials_transfer ✏️​

Start moving material stock between locations. Creates an in-transit TRANSFER entry and returns an auto-generated ref code (TFR-MI-xxx) — keep it: completing the transfer requires that ref.

Arguments: materialId* (string), sourceLocationId* (string), destinationLocationId* (string), quantity* (number), eventDate (string), notes (string,null)

dispose_materials_inventory 🔴​

Write off material stock (damage, expiry, loss). This permanently removes quantity from stock via a DISPOSE ledger entry.

Arguments: materialId* (string), locationId* (string), quantity* (number), notes (string,null), eventDate (string)

get_materials_inventory_summary​

Current materials stock by material and location, derived from the ledger. This is the go-to tool for 'how much of X do we have (and where)'.

Arguments: materialId (string), locationId (string)

get_materials_ledger_entry​

Get one materials ledger entry by ID.

Arguments: id* (string)

list_materials_ledger_entries​

List materials inventory ledger entries (append-only event log: RECEIVE, ORDER, TRANSFER, ADJUST, DISPOSE). ref holds the PO number for PO events and the TFR-MI-xxx code for transfers.

Arguments: materialId (string), locationId (string), eventType (string), ref (string), dateFrom (string), dateTo (string)

Finished-Goods Inventory​

adjust_finished_goods_inventory ✏️​

Record a manual stock adjustment (count correction, shrinkage, found stock) for a SKU at a location. Use transfers for moves and disposals for write-offs — not adjustments.

Arguments: skuId* (string), locationId* (string), quantity* (number), notes (string,null), eventDate (string)

complete_finished_goods_transfer ✏️​

Mark an in-transit finished-goods transfer as received at the destination. ref is the TFR-FG-xxx code returned by create_finished_goods_transfer.

Arguments: ref* (string), eventDate (string), notes (string,null)

create_finished_goods_transfer ✏️​

Start moving SKU stock between locations. Creates an in-transit TRANSFER entry and returns an auto-generated ref code (TFR-FG-xxx) — keep it: completing the transfer requires that ref.

Arguments: skuId* (string), sourceLocationId* (string), destinationLocationId* (string), quantity* (number), eventDate (string), notes (string,null)

dispose_finished_goods_inventory 🔴​

Write off finished-goods stock (damage, expiry, loss). This permanently removes quantity from stock via a DISPOSE ledger entry.

Arguments: skuId* (string), locationId* (string), quantity* (number), notes (string,null), eventDate (string)

get_finished_goods_inventory_summary​

Current finished-goods stock by SKU and location, derived from the ledger. This is the go-to tool for 'how many units of SKU X do we have (and where)'.

Arguments: skuId (string), locationId (string)

get_finished_goods_ledger_entry​

Get one finished-goods ledger entry by ID.

Arguments: id* (string)

list_finished_goods_ledger_entries​

List finished-goods inventory ledger entries (append-only event log: RECEIVE, TRANSFER, ADJUST, DISPOSE). ref holds the TFR-FG-xxx code for transfers.

Arguments: skuId (string), locationId (string), eventType (string), ref (string), dateFrom (string), dateTo (string)

Purchase Orders​

add_purchase_order_item ✏️​

Add a line item (material + quantity + price) to an existing PO.

Arguments: id* (string), materialId (string,null), skuId (string,null), quantity* (number), unitCost (number)

bulk_import_purchase_orders ✏️​

Create many POs in one call from an array of rows. Use for initial data loads; returns per-row results so partial failures are visible.

Arguments: rows* (array)

create_purchase_order ✏️​

Create a purchase order against a vendor. Items can be included or added afterwards with add_purchase_order_item. Ordering writes ORDER entries to the materials ledger (ref = PO number).

Arguments: vendorId* (string), targetType* (string), status* (string), shipToLocationId (string,null), placedAt (string), shipDate (string,null), expectedDeliveryDate (string,null), shippingCosts (number), setupCosts (number), otherCosts (number), notes (string,null), items* (array)

create_purchase_order_receipt ✏️​

Record goods received against a PO (full or partial). Writes RECEIVE entries to the materials inventory ledger with ref = the PO number, increasing stock at the receiving location.

Arguments: id* (string), receiptDate (string), notes (string,null), items* (array)

delete_purchase_order 🔴​

Permanently delete a purchase order and its items/receipts.

Arguments: id* (string)

delete_purchase_order_receipt 🔴​

Delete a PO receipt, reversing its inventory effect. The id is the receipt id.

Arguments: id* (string)

get_purchase_order​

Get one purchase order with header fields and totals.

Arguments: id* (string)

get_purchase_order_receipt​

Get one PO receipt by its own id (not the PO id).

Arguments: id* (string)

list_items_across_purchase_orders​

List PO line items across all POs (filterable via query args) — useful for questions like 'all open lines for material X'.

Arguments: none

list_purchase_order_items​

List the line items of one PO.

Arguments: id* (string)

list_purchase_order_receipts​

List the receipts recorded against one PO.

Arguments: id* (string)

list_purchase_order_status_types​

List the org's valid PO status values (use before setting a PO status).

Arguments: none

list_purchase_orders​

List purchase orders, with filtering/pagination via query args.

Arguments: none

remove_purchase_order_item 🔴​

Remove a line item from a PO. The id is the item id, not the PO id.

Arguments: id* (string)

update_purchase_order ✏️​

Update a PO's header fields, including its status. Use list_purchase_order_status_types for valid status values.

Arguments: id* (string), vendorId (string), targetType (string), status (string), shipToLocationId (string,null), placedAt (string), shipDate (string,null), expectedDeliveryDate (string,null), shippingCosts (number), setupCosts (number), otherCosts (number), notes (string,null)

update_purchase_order_item ✏️​

Update a PO line item. The id is the item id, not the PO id.

Arguments: id* (string), materialId (string,null), skuId (string,null), quantity (number), unitCost (number)

update_purchase_order_receipt ✏️​

Update a PO receipt. The id is the receipt id, not the PO id.

Arguments: id* (string), receiptDate (string)

Work Orders​

add_work_order_item ✏️​

Add a line item (SKU + quantity to produce) to an existing WO.

Arguments: id* (string), skuId* (string), quantity* (integer), conversionCost (number)

bulk_import_work_orders ✏️​

Create many WOs in one call from an array of rows. Use for initial data loads; returns per-row results so partial failures are visible.

Arguments: rows* (array)

create_work_order ✏️​

Create a work order (production run). Items specify which SKUs and quantities to produce; materials are consumed per each SKU's BOM.

Arguments: status* (string), workSiteLocationId* (string), orderDate (string), expectedDeliveryDate (string,null), notes (string,null), items* (array)

create_work_order_receipt ✏️​

Record production output against a WO (full or partial): adds the produced SKUs to finished-goods inventory and consumes BOM materials.

Arguments: id* (string), receiptDate (string), notes (string,null), items* (array)

delete_work_order 🔴​

Permanently delete a work order and its items/receipts.

Arguments: id* (string)

delete_work_order_receipt 🔴​

Delete a WO receipt, reversing its inventory effect. The id is the receipt id.

Arguments: id* (string)

get_work_order​

Get one work order with header fields and items.

Arguments: id* (string)

get_work_order_receipt​

Get one WO receipt by its own id (not the WO id).

Arguments: id* (string)

list_work_order_receipts​

List the receipts recorded against one WO.

Arguments: id* (string)

list_work_order_status_types​

List the org's valid WO status values (use before setting a WO status).

Arguments: none

list_work_orders​

List work orders, with filtering/pagination via query args.

Arguments: none

remove_work_order_item 🔴​

Remove a line item from a WO. The id is the item id, not the WO id.

Arguments: id* (string)

update_work_order ✏️​

Update a WO's header fields, including its status. Use list_work_order_status_types for valid status values.

Arguments: id* (string), status (string), workSiteLocationId (string), orderDate (string), expectedDeliveryDate (string,null), notes (string,null)

update_work_order_item ✏️​

Update a WO line item. The id is the item id, not the WO id.

Arguments: id* (string), quantity (integer), conversionCost (number)

update_work_order_receipt ✏️​

Update a WO receipt. The id is the receipt id, not the WO id.

Arguments: id* (string), receiptDate (string)

Sales Orders​

add_sales_order_item ✏️​

Add a line item (SKU + quantity + price) to an existing sales order.

Arguments: id* (string), skuId* (string), quantity* (integer), unitPrice (number)

add_sales_order_timeline_note ✏️​

Append a free-text note to a sales order's timeline (audit trail of human/agent commentary and events).

Arguments: id* (string), body* (string), statusAtTime (string)

bulk_import_sales_orders ✏️​

Create many SOs in one call from an array of rows. Use for initial data loads; returns per-row results so partial failures are visible.

Arguments: rows* (array)

check_order_channel_in_use​

Check whether any sales orders still use this channel (call before delete).

Arguments: id* (string)

create_order_channel ✏️​

Create an order channel (where SOs originate, e.g. Shopify, wholesale, direct).

Arguments: name* (string)

create_sales_order ✏️​

Create a sales order for a customer. Items can be included or added afterwards with add_sales_order_item.

Arguments: customerId* (string), channelId* (string), status* (string), fulfillmentStatus* (string), fulfillmentLocationId (string,null), brokerId (string,null), brokerFeePercent (number,null), brokerFees (number), fulfillmentCosts (number), freightCosts (number), promoCosts (number), otherCosts (number), mabd* (string), notes (string,null), qboId (string,null), items* (array)

delete_order_channel 🔴​

Delete an order channel. Fails with 409 in_use while SOs reference it — check with check_order_channel_in_use first.

Arguments: id* (string)

delete_sales_order 🔴​

Permanently delete a sales order and its items/notes.

Arguments: id* (string)

delete_sales_order_timeline_note 🔴​

Delete a timeline note. The id is the note id, not the SO id.

Arguments: id* (string)

get_sales_order​

Get one sales order with header fields and totals.

Arguments: id* (string)

list_fulfillment_status_types​

List the org's valid fulfillment status values.

Arguments: none

list_order_channels​

List the org's order channels (including inactive ones).

Arguments: none

list_order_status_types​

List the org's valid sales-order status values.

Arguments: none

list_sales_order_items​

List the line items of one sales order.

Arguments: id* (string)

list_sales_order_timeline_notes​

List the timeline notes of one sales order.

Arguments: id* (string)

list_sales_orders​

List sales orders, with filtering/pagination via query args.

Arguments: none

reactivate_order_channel ✏️​

Reactivate a previously deactivated order channel.

Arguments: id* (string)

remove_sales_order_item 🔴​

Remove a line item from a sales order. The id is the item id, not the SO id.

Arguments: id* (string)

update_order_channel ✏️​

Rename/update an order channel; deactivation happens here too.

Arguments: id* (string), name (string), sortOrder (integer), isActive (boolean)

update_sales_order ✏️​

Update an SO's header fields, including order/fulfillment status. Use list_order_status_types and list_fulfillment_status_types for valid values.

Arguments: id* (string), customerId (string), channelId (string), status (string), fulfillmentStatus (string), fulfillmentLocationId (string,null), brokerId (string,null), brokerFeePercent (number,null), brokerFees (number), fulfillmentCosts (number), freightCosts (number), promoCosts (number), otherCosts (number), mabd (string), notes (string,null), qboId (string,null)

update_sales_order_item ✏️​

Update an SO line item. The id is the item id, not the SO id.

Arguments: id* (string), skuId (string), quantity (integer), unitPrice (number)

Documents​

delete_document 🔴​

Permanently delete a document and its stored file.

Arguments: id* (string)

get_document​

Get one document's metadata plus a time-limited signed download URL for its content.

Arguments: id* (string)

list_documents​

List the documents attached to an entity (PO, SO, WO, etc.), specified via query args.

Arguments: entityType* (string), entityId* (string)