What it does
Exposes Customer Service data and tools outward — case, customer, knowledge, activity and email actions — to Copilot Studio agents and external MCP clients over HTTP. The server went generally available in September 2026 as an independent offering, the Dynamics 365 Customer Experience MCP Server for Service. Agent 365 Tooling Gateway (ATG) is the Microsoft-hosted gateway that sits in front of the Dynamics 365 CX MCP Server - Service, handles OAuth, and does the on-behalf-of exchange through to Dataverse. This is the outbound counterpart to registering inbound MCP servers in Service Agent.
Key facts
- GA since September 2026, sold and positioned as an independent offering rather than a Service Agent sub-feature. That changes the scoping conversation — a client can buy into the server without adopting Service Agent.
- Ships more than 90 service-oriented tools spanning case management, customer information access, knowledge management, email assistance, and activity/conversation management.
- Validated clients: Microsoft 365 Copilot (including Service Agent), Copilot Studio agents, Visual Studio Code, GitHub Copilot CLI, and other HTTP-based MCP clients.
- Access aligns with existing Dataverse roles and permissions — the server doesn't introduce a parallel permission model.
- ATG is an OAuth 2.0-protected resource. Clients request a token for the gateway resource, not for the MCP server directly, and the gateway performs the on-behalf-of hop to Dataverse.
- The scope is
<ATG-ring-app-id>/.default. Because/.defaultdoesn't support incremental or dynamic consent, a tenant admin has to grant admin consent up front — there's no per-user consent prompt. - Three rings, each with its own gateway host and Entra app ID: Test, PreProd and Prod. The environment ID in the server URL must belong to the same ring as the host, or it won't resolve.
- Server URL format is fixed:
https://<ring-host>/mcp/environments/<environment-id>/servers/mcp_D365CX_Service. Drop the/mcp/environments/segment and you get404 RouteNotFound. - Discovery-capable clients (VS Code, GitHub Copilot CLI, Cursor, ChatGPT, Claude Code) read the OAuth metadata automatically — just point them at the URL and let them handle sign-in. Copilot Studio custom connectors usually need the OAuth values entered by hand.
- Config roles: System Administrator or Omnichannel Administrator to set it up; Customer Service Representative or CSR Manager to use it. You also need a Dataverse environment ID and admin-consent rights.
- Enabling it lets data egress outside the Dynamics 365 FedRAMP High boundary — Microsoft flags this explicitly in the doc.
When to use / skip
Use it when you want Customer Service data and actions available to a Copilot Studio agent or an external MCP client — a developer working in VS Code, a maker building a cross-product agent, or a client standing up their own agent surface over service data. Skip it if the requirement is the other direction (bringing external tools into Service Agent) — that's the inbound MCP server registration, a different feature entirely. Don't reach for it just to give reps in-app actions they already have.
Configuration decisions
- Which ring you're targeting, and matching the host, app ID and environment ID to it — a Test environment ID on the Prod host simply won't work.
- Whether the tenant admin grants consent via the adminconsent URL or you provision the service principal manually (
az ad sp create/New-MgServicePrincipal). - For Copilot Studio, whether to register your own confidential client Entra app (needed for the custom connector) versus letting a discovery-capable client handle OAuth itself.
- Which tools the connected agent should surface, and how you describe the server so the orchestrator routes to it sensibly.
Gotchas
- Admin consent is mandatory before any client can get a token. Skip it and every connection attempt fails with no obvious cause until you check consent.
- The ring/environment/host mismatch is the classic trap — a Test-ring environment ID on the PreProd or Prod host returns nothing useful. Line all three up before you debug anything else.
- For Test or PreProd, sign in with a non-production tenant account. A production or corporate account on a non-production ring triggers
TenantBlocked. - The Copilot Studio callback URL only appears after you create the OAuth config — you then have to go back and add it as a Web redirect URI on your Entra app. Easy to miss, and the connection won't complete without it.
- Data egresses the FedRAMP High boundary once this is on. On regulated tenants that's a compliance conversation, not a checkbox — get it signed off before enabling.
Consultant notes
- This is what clients mean when they ask "can our own agent read our service cases?" — and it's a much lighter lift than a bespoke integration now the gateway fronts the auth. Scope it as connector-plus-consent, not custom development.
- The three-ring host/app-ID/environment matrix is the thing that eats time in setup. Build a small crib sheet of host, app ID and scope per ring for the client before you start, or you'll lose an afternoon to
404 RouteNotFoundandTenantBlocked. - Get the admin-consent step onto the tenant admin's radar early — it needs someone with tenant-admin rights, which on larger clients is a separate team and a separate change ticket. It's the most common reason a first connection stalls.
- Flag the FedRAMP High egress note to anyone in a regulated or government tenant during design, not at go-live. It's a governance decision above the implementer's pay grade and it can block the whole thing.
Worth revisiting after the next release wave. Last refreshed 2026-09-22 when the CX MCP Server for Service reached GA as an independent offering with 90+ tools and a published validated-client list.