Authenticate via OAuth 2.0 and discover available BOM entities: GET <base>/data/$metadata — search for 'BOM' in the metadata to find entity set names such as BOMHeaders and BOMLines.
Read a BOM header: GET <base>/data/BOMHeaders?$filter=BOMId eq '<id>' and DataAreaId eq 'USMF' — note that DataAreaId is required in all BOM entity queries as BOM data is company-scoped.
Read BOM lines: GET <base>/data/BOMLines?$filter=BOMId eq '<id>' and BOMVersion eq '<ver>' — key fields include ItemNumber, BOMQty, UnitSymbol, and LineType.
Create a new BOM line via POST <base>/data/BOMLines with a JSON body containing BOMId, BOMVersion, ItemNumber, BOMQty, and the required company context fields.
Activate a BOM version by updating the BOMVersionApproved and BOMVersionActive fields on the BOMHeaderV2 entity or by triggering the activation through a custom OData action if standard field writes are blocked by validation.
Use $batch for creating multiple BOM lines in a single round-trip to reduce latency when importing large BOMs.
Known gotchas
BOM entity names and set names vary slightly between D365 F&O versions; always verify via $metadata rather than hard-coding entity set names, as upgrades may rename or replace entities.
The BOMLineEntity does not expose the component item's description — only ItemNumber; a separate OData call to the ReleasedProductsV2 entity is required to fetch descriptions, which increases API call count significantly.
Activating a BOM version via OData field write may be blocked by D365 F&O business logic that requires a separate approval step; in those cases, use the DMF import with the BOMVersionActivation entity or trigger an X++ business operation via a custom service.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp