The project is called APEX. It is a TypeScript MCP server with seven tools, exposing Dynamics 365 Finance and Operations data through OData APIs.
It runs on Azure Container Apps in West Europe, authenticated via Azure Entra ID OAuth2 with two separate service principals - one for reading, one for writing - and it connects to Claude Desktop.
The seven tools cover the operations a finance or supply chain team would actually use: searching vendors, querying open purchase orders, checking inventory levels by site, pulling a financial summary from general ledger journals, surfacing overdue vendor invoices, retrieving customer balances, and creating draft purchase orders.
The constraint on that last one is deliberate: the server can create a draft purchase order, but it cannot submit one for approval. That was a governance decision, not a technical limitation. I will come back to why.
I built on Microsoft's Contoso USMF sandbox - the standard pre-seeded demo environment that comes with D365. Every vendor record is clean. Every price line exists. Every field is correctly populated. I chose it precisely because I wanted to start with the best possible data before introducing any real-world complexity.
It took a week.