Microsoft ships MCP servers for Dynamics 365 — which means an agent can now read and write your ERP through a standard protocol. This playbook builds a Copilot Studio agent on those servers with one non-negotiable asymmetry: reads auto-execute, and every state-changing action routes through a human approval step before it touches a record.
Tier: Advanced · Workflow area: ERP Copilots & Agents · ~45 minutes
MCP (Model Context Protocol) turns ERP capabilities into tools an agent can discover and call. Dynamics 365 ERP MCP servers expose finance and operations actions to Copilot Studio agents, and that is exactly the moment governance has to be designed in rather than bolted on. The pattern this playbook installs — read/write asymmetry with Power Automate approvals on the write path — is the single most reusable control in agentic ERP work.
Connect the ERP MCP server in Copilot Studio. Create a new agent, then under Tools → Add a tool → Model Context Protocol, add the Dynamics 365 ERP MCP server for your environment and authenticate with a service connection scoped to a dedicated agent account — never a human's credentials. The tool list the server advertises is your action inventory.
Sort every advertised tool into read or write. Make the inventory explicit before wiring anything:
Here is the MCP tool list from our ERP server (names + descriptions
pasted below). Classify each as READ (no state change) or WRITE
(creates/updates/posts anything). Flag any tool whose description is
ambiguous about side effects — those default to WRITE until verified.
Output a two-column table I can paste into our design doc.
The default-to-WRITE rule for ambiguous tools is the whole point of the exercise. Enable only the tools you classified; an agent should not carry tools it has no scenario for.
Let reads flow, and verify grounding. Wire read tools (query vendor, get invoice status, list purchase orders) directly to topics. Test that answers come from tool output, not model memory: ask about a vendor that does not exist and confirm the agent reports "not found" rather than inventing one.
Build the approval flow for the write path. In Power Automate, create a flow triggered by the agent (or wrap the write as an agent flow) with this shape:
Trigger: agent requests write action
→ Compose: action name, full parameter payload, requesting user,
conversation ID, agent's one-line justification
→ Start and wait for an approval (Approvals connector)
Assigned to: role-based approver group (not one person)
Details: the composed payload, verbatim
→ Condition: Approved?
Yes → call the ERP MCP write tool with the SAME payload
No → return rejection reason to the agent conversation
→ Log: outcome + payload + approver + timestamp to an audit table
Two details carry the integrity of the gate: the approver sees the exact payload that will execute (not a paraphrase), and the executed call uses that same payload — approval of X must never execute X′.
Instruct the agent to be honest about the gate. Add to the agent's instructions:
When a user requests any change to ERP data, state that the change
requires approval, summarize exactly what will be submitted, and
submit it via the approval flow. Never claim a change is complete
until the flow returns an approved-and-executed result.
Then test the lie case deliberately: request a write, reject it in the approval queue, and confirm the agent reports rejection instead of success.
Run an end-to-end trace before anyone else touches it. One read (auto-executes, grounded answer), one write (approval card arrives with full payload → approve → record actually changes in Dynamics → audit row written), one rejected write (record unchanged, agent reports it). Screenshot all three traces; they are your governance evidence for pb-52.
An MCP server connected with an over-privileged service account turns every agent bug into an ERP incident. Scope the agent's connection to the minimum entities and actions the enabled tools need, and review that scope whenever the tool list changes.
The durable pattern here is asymmetry: reads flow, writes queue for a human who sees the exact payload. Install that once at the MCP boundary and every future agent inherits the gate — instead of each one renegotiating trust from scratch.