Dynamics 365 MCP server
Prebuilt SnapLogic agentic-tool pipelines that let an LLM read from and act on Dynamics 365, callable as MCP tools via Pipeline Execute. Published in the SnapLogic pattern catalog.
Overview
This pack covers three Dynamics 365 back ends through one MCP server: Business Central for financials and SMB operations, Dataverse for Sales for CRM records such as accounts and opportunities, and Finance and Supply Chain Management for the FinOps data-entity layer. Each back end offers the same describe, search, read, create, update, and delete verbs using entity-generic tools, so the agent names the target entity at call time and uses the appropriate family for each Dynamics app.
For setup instructions, see SnapLogic MCP Server quickstart.
Example Prompts
- Add a new Business Central customer called New Customer Corp with email [email protected]
- Create a vendor record for Nordic Supplies in CRONUS USA, Inc.
- Set up a new item in Business Central named 'Desk Lamp'
- Register a new customer for me and tell me the id you got back
- Delete the Business Central customer I just created
- Remove the duplicate vendor record with id 00000000-0000-0000-0000-000000000001
- Clean up that test item in CRONUS USA, Inc.
- What fields does the Business Central customers entity have?
- Show me the shape of a salesInvoice record in CRONUS USA, Inc.
- Before I filter on vendors, show me what a vendor record looks like
Tools
| Tool Name | Functions |
|---|---|
| MSDynamics365BusinessCentralCreate | Create a Business Central record from a field map. |
| MSDynamics365BusinessCentralCreateChild | MS Dynamics365Business Central Create Child |
| MSDynamics365BusinessCentralDelete | Delete a Business Central record by primary key. |
| MSDynamics365BusinessCentralDeleteChild | MS Dynamics365Business Central Delete Child |
| MSDynamics365BusinessCentralDescribe | Inspect a Business Central entity's fields by sampling one record. |
| MSDynamics365BusinessCentralRead | Retrieve a Business Central record by its primary key. |
| MSDynamics365BusinessCentralSearch | Query Business Central records with an OData filter, select and sort. |
| MSDynamics365BusinessCentralUpdate | Patch fields on an existing Business Central record. |
| MSDynamics365BusinessCentralUpdateChild | MS Dynamics365Business Central Update Child |
| MSDynamics365FinanceandSCMCreate | Create a Finance and SCM record from a field map. |
| MSDynamics365FinanceandSCMCreateChild | MS Dynamics365Financeand SCM Create Child |
| MSDynamics365FinanceandSCMDelete | Delete a Finance and SCM record by primary key. |
| MSDynamics365FinanceandSCMDeleteChild | MS Dynamics365Financeand SCM Delete Child |
| MSDynamics365FinanceandSCMDescribe | Inspect a Finance and SCM data entity by sampling one record. |
| MSDynamics365FinanceandSCMRead | Retrieve a Finance and SCM record by its primary key. |
| MSDynamics365FinanceandSCMSearch | Query Finance and SCM entities with an OData filter, optionally across companies. |
| MSDynamics365FinanceandSCMUpdate | Patch fields on an existing Finance and SCM record. |
| MSDynamics365FinanceandSCMUpdateChild | MS Dynamics365Financeand SCM Update Child |
| MSDynamics365ForSalesCreate | Create a Dataverse record from a field map. |
| MSDynamics365ForSalesCreateChild | MS Dynamics365For Sales Create Child |
| MSDynamics365ForSalesDelete | Delete a Dataverse record by GUID. |
| MSDynamics365ForSalesDeleteChild | MS Dynamics365For Sales Delete Child |
| MSDynamics365ForSalesDescribe | List a Dataverse table's attributes, types and write eligibility. |
| MSDynamics365ForSalesExecute | Issue a raw GET against any Dataverse Web API path. |
| MSDynamics365ForSalesRead | Retrieve a Dataverse record by GUID. |
| MSDynamics365ForSalesSearch | Query Dataverse records with an OData filter, select and sort. |
| MSDynamics365ForSalesUpdate | Patch fields on an existing Dataverse record by GUID. |
| MSDynamics365ForSalesUpdateChild | MS Dynamics365For Sales Update Child |
Set up the MCP Server tools
- Download dynamics365_tools.zip.
- In SnapLogic Designer, open the target project space (or create one), then choose Import Project / Import Pipelines and select the downloaded dynamics365_tools.zip. Designer unpacks each pipeline into the project.
- Attach the required account to the connectivity snaps (see Connection Setup).
- Expose the project as an MCP server — each pipeline becomes a tool named after its label. New to this? Start with the MCP quickstart, then use the MCP Server Pipeline Builder to generate the server from the imported pipelines.
Configure account
Attach the Microsoft Dynamics 365 account matching the sub-pack in use (Business Central, Finance & SCM, or For Sales) in Designer after import.
These pipelines ship without credentials by design — attach a valid account in Designer before the tools will execute.
See the SnapLogic account documentation for this connector: Dynamics 365 For Sales Account.
MSDynamics365BusinessCentralCreate
Creates a new record in any Business Central entity from a field map and returns the new id. Use it to add customers, vendors, items, or any other Business Central entity row.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Business Central entity set to act on, e.g. customers, vendors, items, salesInvoices. |
| company | string | — | Business Central company the entity is read from or written to, e.g. CRONUS USA, Inc. Omit to use the connection's default company. |
| record* | object | — | Field map posted as the new record's body, e.g. {displayName, email}. |
* Required parameter.
Try asking:
- Add a new Business Central customer called New Customer Corp with email [email protected]
- Create a vendor record for Nordic Supplies in CRONUS USA, Inc.
- Set up a new item in Business Central named 'Desk Lamp'
- Register a new customer for me and tell me the id you got back
MSDynamics365BusinessCentralCreateChild
Lets the LLM ms dynamics365business central create child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity | string | customers |
— |
| company | string | — | — |
MSDynamics365BusinessCentralDelete
Deletes a specific Business Central record by primary key and returns a confirmation. Use it only when the user names a specific record, such as a test or duplicate row to clean up.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Business Central entity set to act on, e.g. customers, vendors, items, salesInvoices. |
| company | string | — | Business Central company the entity is read from or written to, e.g. CRONUS USA, Inc. Omit to use the connection's default company. |
| primary_key_json* | string | — | Primary key as a JSON list of key/value objects; only the first entry is used, e.g. [{"key": "id", "value": "00000000-0000-0000-0000-000000000001"}]. |
* Required parameter.
Try asking:
- Delete the Business Central customer I just created
- Remove the duplicate vendor record with id 00000000-0000-0000-0000-000000000001
- Clean up that test item in CRONUS USA, Inc.
MSDynamics365BusinessCentralDeleteChild
Lets the LLM ms dynamics365business central delete child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity | string | customers |
— |
| company | string | — | — |
MSDynamics365BusinessCentralDescribe
Shows the shape of a Business Central entity by returning a single sample record, so the agent can see available field names before filtering, creating, or updating. Use it when working with an unfamiliar entity or when a guessed field name returns no results.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Business Central entity to sample one record from, e.g. customers or salesInvoices. |
| company | string | — | Business Central company the entity is read from or written to, e.g. CRONUS USA, Inc. Omit to use the connection's default company. |
* Required parameter.
Try asking:
- What fields does the Business Central customers entity have?
- Show me the shape of a salesInvoice record in CRONUS USA, Inc.
- Before I filter on vendors, show me what a vendor record looks like
- Which fields can I use on the items entity in Business Central?
MSDynamics365BusinessCentralRead
Fetches a specific Business Central record by primary key and returns its fields, optionally scoped to a company and field selection. Use it when the user has identified a record and wants its details.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Business Central entity set to act on, e.g. customers, vendors, items, salesInvoices. |
| company | string | — | Business Central company the entity is read from or written to, e.g. CRONUS USA, Inc. Omit to use the connection's default company. |
| primary_key_json | string | — | Primary key as a JSON list of key/value objects; only the first entry is used, e.g. [{"key": "id", "value": "00000000-0000-0000-0000-000000000001"}]. Omit to read the entity's records up to the page size. |
| select_fields | string | — | Comma-separated fields to return via $select, e.g. displayName,email,phoneNumber. Omit to return all fields. |
| page_size | integer | 100 |
Records fetched per page when no primary key is supplied (default 100). |
* Required parameter.
Try asking:
- Pull up Business Central customer 00000000-0000-0000-0000-000000000001
- Show me the email and phone number for that customer record
- Get the full detail of this sales invoice in CRONUS USA, Inc.
- Read the item record for the id you just returned
MSDynamics365BusinessCentralSearch
Queries any Business Central entity with an optional OData filter, field selection, and sort order, returning matching records. Use it for open-ended questions like 'which customers owe money' or 'list unpaid invoices' before a specific record is identified.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Business Central entity set to act on, e.g. customers, vendors, items, salesInvoices. |
| company | string | — | Business Central company the entity is read from or written to, e.g. CRONUS USA, Inc. Omit to use the connection's default company. |
| filter | string | — | OData $filter expression applied to the query, e.g. balanceDue gt 0. Omit to return unfiltered records. |
| select_fields | string | — | Comma-separated fields to return via $select, e.g. displayName,email,balanceDue. Omit to return all fields. |
| orderby | string | — | OData $orderby clause, e.g. displayName asc. |
| page_size | integer | 100 |
Records fetched per page (default 100). |
| max_page | integer | 1 |
Maximum number of pages to retrieve (default 1). |
* Required parameter.
Try asking:
- List Business Central customers with a balance due, sorted by name
- Which sales invoices in CRONUS USA, Inc. are still open?
- Show me the top 50 items with their number, description and unit price
- Find vendors whose name starts with 'Nordic' and give me their email and phone
- Get purchase invoices posted this month, newest first
MSDynamics365BusinessCentralUpdate
Patches specific fields on an existing Business Central record and returns a confirmation. Use it for corrections and status changes such as a new email, contact name, or credit limit.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Business Central entity set to act on, e.g. customers, vendors, items, salesInvoices. |
| company | string | — | Business Central company the entity is read from or written to, e.g. CRONUS USA, Inc. Omit to use the connection's default company. |
| primary_key_json* | string | — | Primary key as a JSON list of key/value objects; only the first entry is used, e.g. [{"key": "id", "value": "00000000-0000-0000-0000-000000000001"}]. |
| fields* | object | — | Field map of values to change; only these fields are sent, e.g. {email: '[email protected]'}. |
* Required parameter.
Try asking:
- Change the email on Business Central customer 00000000-0000-0000-0000-000000000001 to [email protected]
- Update that vendor's phone number in CRONUS USA, Inc.
- Correct the display name on the customer record you just created
- Bump the unit price on this item to 49.99
MSDynamics365BusinessCentralUpdateChild
Lets the LLM ms dynamics365business central update child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity | string | customers |
— |
| company | string | — | — |
MSDynamics365FinanceandSCMCreate
Creates a record in a Finance and Supply Chain data entity from a field map and returns a confirmation. Run the describe tool first to identify required fields, as FinOps entities enforce mandatory fields and natural keys.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Finance and Supply Chain data entity the record is created in, e.g. CustomersV3. |
| record* | object | — | Field map posted as the new record's body, including the entity's key fields, e.g. {CustomerAccount, CustomerName, CustomerGroupId}. |
* Required parameter.
Try asking:
- Create a customer in CustomersV3 with account US-999, name 'Test Customer', group 10
- Add a new vendor record in Finance and Operations
- Set up a released product with the item number and name I gave you
- Create a customer record and confirm it went through
MSDynamics365FinanceandSCMCreateChild
Lets the LLM ms dynamics365financeand scm create child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity | string | CustomersV3 |
— |
MSDynamics365FinanceandSCMDelete
Deletes a Finance and Supply Chain record by primary key and returns a confirmation. Use it only for records the user explicitly names, such as test data created earlier in the session.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Finance and Supply Chain data entity the record belongs to, e.g. CustomersV3. |
| primary_key_json* | string | — | Primary key as a JSON list of key/value objects; only the first entry is used, e.g. [{"key": "CustomerAccount", "value": "US-999"}]. |
* Required parameter.
Try asking:
- Delete customer account US-999 from CustomersV3
- Remove the test customer I created a moment ago
- Delete that duplicate vendor record in Finance and Operations
MSDynamics365FinanceandSCMDeleteChild
Lets the LLM ms dynamics365financeand scm delete child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity | string | CustomersV3 |
— |
MSDynamics365FinanceandSCMDescribe
Shows the shape of a Finance and Supply Chain data entity by returning a single sample record, so the agent can learn field names before filtering or writing. Use it first, as FinOps entity and field names are versioned and guessing them is unreliable.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Finance and Supply Chain data entity to sample one record from, e.g. CustomersV3. |
* Required parameter.
Try asking:
- What fields does the CustomersV3 entity have?
- Show me the shape of a SalesOrderHeadersV2 record
- I need to filter vendors in Finance and Operations — what are the field names?
- Sample one record from the released products entity
MSDynamics365FinanceandSCMRead
Fetches a Finance and Supply Chain record by primary key and returns its fields, with optional field selection and a cross-company flag. Use it once a search or the user has identified the specific record.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Finance and Supply Chain data entity the record belongs to, e.g. CustomersV3. |
| primary_key_json | string | — | Primary key as a JSON list of key/value objects; only the first entry is used, e.g. [{"key": "CustomerAccount", "value": "US-001"}]. Omit to read the entity's records up to the page size. |
| select_fields | string | — | Comma-separated fields to return via $select, e.g. CustomerAccount,CustomerName. Omit to return all fields. |
| cross_company | boolean | false |
Pass the string 'true' to read a record held in another legal entity; any other value reads only the default company (default false). |
| page_size | integer | 100 |
Records fetched per page when no primary key is supplied (default 100). |
* Required parameter.
Try asking:
- Look up customer account US-001 in Finance and Operations
- Show me the name and group for CustomersV3 record US-001
- Read that sales order header by its order number
- Get customer US-001 even though it sits in a different legal entity
MSDynamics365FinanceandSCMSearch
Queries any Finance and Supply Chain data entity with an OData filter, field selection, and sort order, with an option to search across all legal entities. Use it for open-ended finance and supply-chain questions before drilling into a specific record.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Finance and Supply Chain data entity to query, e.g. CustomersV3 or SalesOrderHeadersV2. |
| filter | string | — | OData $filter expression applied to the query, e.g. CustomerGroupId eq 10. Omit to return unfiltered records. |
| select_fields | string | — | Comma-separated fields to return via $select, e.g. CustomerAccount,CustomerName,CustomerGroupId. Omit to return all fields. |
| orderby | string | — | OData $orderby clause, e.g. CustomerName asc. |
| cross_company | boolean | false |
Pass the string 'true' to search across every legal entity; any other value searches only the default company (default false). |
| page_size | integer | 100 |
Records fetched per page (default 100). |
| max_page | integer | 1 |
Maximum number of pages to retrieve (default 1). |
* Required parameter.
Try asking:
- List customers in customer group 10 across all companies
- Show me open sales orders with their order number and customer account
- Which vendors have invoices posted this month?
- Get the first 50 released products with item number and name, sorted by name
- Find customers whose name contains 'Contoso' in every legal entity
MSDynamics365FinanceandSCMUpdate
Patches specific fields on a Finance and Supply Chain record by primary key and returns a confirmation. Use it for mid-conversation corrections such as renaming a customer or changing a group assignment.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity* | string | — | Finance and Supply Chain data entity the record belongs to, e.g. CustomersV3. |
| primary_key_json* | string | — | Primary key as a JSON list of key/value objects; only the first entry is used, e.g. [{"key": "CustomerAccount", "value": "US-001"}]. |
| fields* | object | — | Field map of values to change; only these fields are sent, e.g. {CustomerName: 'Updated Customer Name'}. |
* Required parameter.
Try asking:
- Rename customer account US-001 to 'Updated Customer Name'
- Change the customer group on US-001 in Finance and Operations
- Update the record we just created with the corrected name
- Adjust that vendor's payment terms field
MSDynamics365FinanceandSCMUpdateChild
Lets the LLM ms dynamics365financeand scm update child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| entity | string | CustomersV3 |
— |
MSDynamics365ForSalesCreate
Creates a record in a Dataverse object type from a field map and returns the new record id. Use it to add accounts, contacts, leads, or opportunities; field names must be Dataverse logical names.
| Parameter | Type | Default | Description |
|---|---|---|---|
| object_type* | string | — | Dataverse entity set the record is created in, e.g. accounts. |
| record* | object | — | Field map posted as the new record's body, keyed by Dataverse logical names, e.g. {name, revenue, industrycode}. |
* Required parameter.
Try asking:
- Create a Dataverse account for Contoso Ltd with revenue 5,000,000
- Add a new contact for Jane Meyer at Contoso
- Log a new lead from the trade show and give me its id
- Create an opportunity against the account we just made
MSDynamics365ForSalesCreateChild
Lets the LLM ms dynamics365for sales create child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| object_type | string | accounts |
— |
MSDynamics365ForSalesDelete
Deletes a Dataverse record by GUID and returns a confirmation. Use it only for records the user explicitly identifies, such as test data or a confirmed duplicate.
| Parameter | Type | Default | Description |
|---|---|---|---|
| object_type* | string | — | Dataverse entity set the record belongs to, e.g. accounts. |
| id* | string | — | GUID of the record to delete, e.g. 00000000-0000-0000-0000-000000000001. |
* Required parameter.
Try asking:
- Delete the Dataverse account I just created
- Remove the duplicate contact with id 00000000-0000-0000-0000-000000000001
- Clean up that test lead
MSDynamics365ForSalesDeleteChild
Lets the LLM ms dynamics365for sales delete child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| object_type | string | accounts |
— |
MSDynamics365ForSalesDescribe
Returns declared attribute metadata for a Dataverse table, including each field's logical name, type, and whether it is writable. Use it before creating or updating records to confirm required field names and types.
| Parameter | Type | Default | Description |
|---|---|---|---|
| object_type* | string | — | Singular Dataverse logical entity name whose attribute metadata is read, e.g. account, contact, opportunity. |
* Required parameter.
Try asking:
- What fields does the Dataverse account table have?
- Which attributes on the opportunity entity are required when creating a record?
- Show me the field types on contact so I know what to send
- Can I set statuscode on an account update? Check the metadata
MSDynamics365ForSalesExecute
Issues a raw GET against any Dataverse Web API path and returns the response, covering scenarios the typed tools do not handle such as $expand, $apply, and metadata endpoints. Treat this as read-only; use the create, update, and delete tools for writes.
| Parameter | Type | Default | Description |
|---|---|---|---|
| url_path* | string | — | Web API path and query string appended to the tenant URL, e.g. accounts?$select=name,revenue&$top=5. |
| http_method | string | GET |
HTTP method requested (default GET); the underlying snap is pinned to GET, so this value is not applied. |
| body | string | — | Request body passed to the snap's HTTP entity; leave empty for GET calls. |
* Required parameter.
Try asking:
- Run the raw Dataverse query accounts?$select=name,revenue&$top=5
- Fetch contacts expanded with their parent account in one call
- Get an aggregated count of opportunities by status using $apply
- Hit the Dataverse Web API path for WhoAmI and show me the response
MSDynamics365ForSalesRead
Fetches a single Dataverse record by GUID and returns its fields, optionally narrowed to a field selection. Use it after a search or when the user provides a GUID directly.
| Parameter | Type | Default | Description |
|---|---|---|---|
| object_type* | string | — | Dataverse entity set the record belongs to, e.g. accounts. |
| id* | string | — | GUID of the record to retrieve, e.g. 00000000-0000-0000-0000-000000000001. |
| select_fields | string | — | Comma-separated logical names to return via $select, e.g. name,revenue,industrycode. Omit to return all fields. |
| page_size | integer | 100 |
Records fetched per page (default 100). |
* Required parameter.
Try asking:
- Open Dataverse account 00000000-0000-0000-0000-000000000001
- Show me the name, revenue and industry for that account
- Read the full contact record for the id from the last search
- Pull up the opportunity with this GUID
MSDynamics365ForSalesSearch
Queries Dataverse accounts, contacts, leads, or opportunities with an OData filter, field selection, and sort order. Use it for CRM questions where the record is not yet identified; pair it with the describe tool when field names are unclear.
| Parameter | Type | Default | Description |
|---|---|---|---|
| object_type* | string | — | Dataverse entity set to query, e.g. accounts, contacts, leads, opportunities. |
| filter | string | — | OData $filter expression applied to the query, e.g. revenue gt 1000000. Omit to return unfiltered records. |
| select_fields | string | — | Comma-separated logical names to return via $select, e.g. name,revenue,industrycode. Omit to return all fields. |
| orderby | string | — | OData $orderby clause, e.g. name asc. |
| page_size | integer | 100 |
Records fetched per page (default 100). |
| max_page | integer | 1 |
Maximum number of pages to retrieve (default 1). |
* Required parameter.
Try asking:
- Find Dataverse accounts with revenue over a million, sorted by name
- List open opportunities with their estimated value and close date
- Which contacts belong to Contoso Ltd?
- Show me the 50 most recently created leads
- Get accounts in the manufacturing industry with their name and revenue
MSDynamics365ForSalesUpdate
Patches specific fields on a Dataverse record by GUID and returns a confirmation. Resolve the record's GUID with search or read first, then use this tool for corrections such as updating revenue or changing an owner.
| Parameter | Type | Default | Description |
|---|---|---|---|
| object_type* | string | — | Dataverse entity set the record belongs to, e.g. accounts. |
| id* | string | — | GUID of the record to update, e.g. 00000000-0000-0000-0000-000000000001. |
| fields* | object | — | Field map of values to change; only these fields are written, e.g. {revenue: 7500000, description: '...'}. |
* Required parameter.
Try asking:
- Update the revenue on Dataverse account 00000000-0000-0000-0000-000000000001 to 7,500,000
- Add a description to that account saying it was updated by the agent
- Change this contact's job title to Head of Procurement
- Revise the estimated value on the opportunity you just found
MSDynamics365ForSalesUpdateChild
Lets the LLM ms dynamics365for sales update child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| object_type | string | accounts |
— |