THE DEATH OF THE PROXY: Architecting Dataverse for the Agent Fabric
For years, Microsoft's recommended architecture for connecting AI assistants like Claude Desktop to Dataverse relied on a local STDIO proxy. It was simple, easy to install, and perfectly suited for individual developers experimenting with AI-powered workflows. But enterprise AI has evolved. Organizations are no longer connecting a single assistant to a single application. They're connecting hundreds—or even thousands—of AI agents across multiple clients, platforms, and business systems. That architectural shift changes everything. This episode explains why the traditional proxy model has reached its limits, why Streamable HTTP fundamentally changes enterprise AI integration, and how Dataverse is evolving from the database behind Power Apps into the governed data backbone for the entire Agent Fabric.
WHY THE STDIO PROXY WAS CREATED
The original STDIO proxy solved a very specific problem. Early MCP clients like Claude Desktop needed a simple way to communicate with cloud services while running locally on a developer's machine. Instead of exposing an internet-facing endpoint, developers launched a local process that translated communication between the AI client and Dataverse. The advantages were obvious:
- Simple installation
- No HTTP server required
- No certificates
- Minimal infrastructure
- Isolated execution per user
THE PROXY SCALING PROBLEM
The proxy architecture assumes one developer. Modern enterprises operate very differently. Instead of one Claude Desktop instance, organizations now deploy:
- Claude Desktop
- Claude Code
- GitHub Copilot
- Copilot CLI
- Custom orchestration services
- Internal AI assistants
- Independent authentication
- Separate connection pools
- Individual infrastructure
- Separate monitoring
- Isolated failure domains
THE LATENCY MYTH
One of the strongest arguments for STDIO has always been performance. Microbenchmarks show local inter-process communication taking only a few milliseconds, while HTTP introduces network latency and TLS negotiation. On paper, STDIO appears dramatically faster. However, those benchmarks ignore the actual workload. Most Dataverse operations spend hundreds of milliseconds—or even more than a second—executing business logic, security checks, and database queries. When those execution times are included, HTTP overhead becomes relatively insignificant. Even more importantly, enterprise HTTP deployments benefit from:
- Connection pooling
- Persistent sessions
- Horizontal scaling
- Long-lived services
- Shared infrastructure
STREAMABLE HTTP CHANGES EVERYTHING
Instead of every AI client running its own proxy, Dataverse now exposes a single Streamable HTTP endpoint. Every supported AI client connects to exactly the same service. Examples include:
- Claude Desktop
- Claude Code
- GitHub Copilot
- VS Code
- Custom AI orchestrators
PKCE ENABLES SECURE PUBLIC CLIENTS
Moving to HTTP introduces a new challenge: How do desktop applications authenticate without storing client secrets? The answer is PKCE (Proof Key for Code Exchange). Instead of embedding long-lived secrets inside client applications, PKCE generates temporary cryptographic values during authentication. This approach allows applications like:
- Claude Desktop
- Claude Code
- GitHub Copilot
- Secret-free
- User-based
- Standards compliant
- Automatically renewable
DATAVERSE BECOMES THE AGENT FABRIC
Perhaps the most important architectural shift is how Dataverse itself is positioned. Historically many organizations viewed Dataverse simply as the database behind Power Apps. The presentation argues that this perspective is obsolete. Dataverse now becomes the central business data platform for AI agents. Every supported AI client communicates through the same endpoint. Every request uses:
- Shared governance
- Shared authentication
- Shared business logic
- Shared security
- Shared audit trails
Become a supporter of this podcast: https://www.spreaker.com/podcast/m365-fm-modern-work-security-and-productivity-with-microsoft-365--6704921/support.
🚀 Want to be part of m365.fm?
Then stop just listening… and start showing up.
👉 Connect with me on LinkedIn and let’s make something happen:
- 🎙️ Be a podcast guest and share your story
- 🎧 Host your own episode (yes, seriously)
- 💡 Pitch topics the community actually wants to hear
- 🌍 Build your personal brand in the Microsoft 365 space
This isn’t just a podcast — it’s a platform for people who take action.
🔥 Most people wait. The best ones don’t.
👉 Connect with me on LinkedIn and send me a message:
"I want in"
Let’s build something awesome 👊
00:00:00,000 --> 00:00:02,800
The documentation tells you to use a local STDO proxy,
2
00:00:02,800 --> 00:00:04,080
install it on your machine,
3
00:00:04,080 --> 00:00:06,920
wire it to Claude Desktop, connected to Dataverse.
4
00:00:06,920 --> 00:00:09,360
That guidance was sound a year ago, it's broken now.
5
00:00:09,360 --> 00:00:11,840
The issue isn't that the proxy fails to work technically,
6
00:00:11,840 --> 00:00:14,280
it works fine, the issue is the architecture behind it.
7
00:00:14,280 --> 00:00:16,080
Your building single threaded integrations
8
00:00:16,080 --> 00:00:17,760
when your enterprise needs a fabric.
9
00:00:17,760 --> 00:00:20,640
You're optimizing for the latency on one developer's laptop
10
00:00:20,640 --> 00:00:23,200
when you should be optimizing for a thousand agents.
11
00:00:23,200 --> 00:00:25,280
They all need to access the same business data
12
00:00:25,280 --> 00:00:26,720
across a govern platform.
13
00:00:26,720 --> 00:00:27,520
What changed?
14
00:00:27,520 --> 00:00:28,320
Two things.
15
00:00:28,320 --> 00:00:29,280
The clients got better.
16
00:00:29,280 --> 00:00:31,440
Claude GitHub Copilot and the rest all support
17
00:00:31,440 --> 00:00:33,120
remote HTTP endpoints now.
18
00:00:33,120 --> 00:00:35,760
The proxy isn't a necessity anymore, it's a liability.
19
00:00:35,760 --> 00:00:38,720
Second, enterprises figured out that if you're serious about AI,
20
00:00:38,720 --> 00:00:41,440
you can't afford one-off integrations for every LLM.
21
00:00:41,440 --> 00:00:44,640
You need a contract, a single endpoint, a model that scales.
22
00:00:44,640 --> 00:00:47,440
This is the story of that shift, why the proxy became a bottleneck,
23
00:00:47,440 --> 00:00:50,240
why the streamable HTTP endpoint is the only architecture
24
00:00:50,240 --> 00:00:51,280
that works at scale,
25
00:00:51,280 --> 00:00:53,040
and why this matters to your enterprise.
26
00:00:53,040 --> 00:00:56,720
Because Dataverse stops being the database under power apps
27
00:00:56,720 --> 00:00:59,520
and becomes the agentic backbone of your entire platform.
28
00:00:59,520 --> 00:01:02,480
One endpoint, any LLM, same governance, same security,
29
00:01:02,480 --> 00:01:05,840
same audit trail, the proxy is dead, the fabric is now.
30
00:01:05,840 --> 00:01:08,640
The STDIO proxy model, why it existed?
31
00:01:08,640 --> 00:01:10,800
The STDIO proxy exists for a reason.
32
00:01:10,800 --> 00:01:12,400
It was born from a real constraint.
33
00:01:12,400 --> 00:01:15,120
When MCP first appeared, local clients needed a way
34
00:01:15,120 --> 00:01:16,560
to talk to cloud services.
35
00:01:16,560 --> 00:01:18,320
Claude Desktop runs on your machine,
36
00:01:18,320 --> 00:01:19,840
while Dataverse lives in the cloud,
37
00:01:19,840 --> 00:01:21,600
so you have to bridge them somehow.
38
00:01:21,600 --> 00:01:23,520
You create a local process, a proxy.
39
00:01:23,520 --> 00:01:25,120
It sits on your machine and translates
40
00:01:25,120 --> 00:01:27,200
between the agent and the remote API.
41
00:01:27,200 --> 00:01:29,760
STDIO is the simplest possible mechanism for this.
42
00:01:29,760 --> 00:01:34,080
Standard input, standard output, pipes, no network, no HTTP,
43
00:01:34,080 --> 00:01:35,680
no TLS negotiation,
44
00:01:35,680 --> 00:01:38,640
just two processes on the same machine talking through streams.
45
00:01:38,640 --> 00:01:40,800
From a simplicity standpoint, this was elegant.
46
00:01:40,800 --> 00:01:43,280
One process per user, one session per connection,
47
00:01:43,280 --> 00:01:45,920
an isolated fault domain, if the proxy crashes,
48
00:01:45,920 --> 00:01:47,680
only that user is affected.
49
00:01:47,680 --> 00:01:49,120
There is no shared infrastructure
50
00:01:49,120 --> 00:01:51,920
and no blast radius that spreads across your organization.
51
00:01:51,920 --> 00:01:53,600
The virtue of the proxy was obvious
52
00:01:53,600 --> 00:01:56,000
because it removed operational complexity.
53
00:01:56,000 --> 00:01:58,080
You didn't need to manage HTTP servers
54
00:01:58,080 --> 00:02:00,000
or worry about horizontal scaling.
55
00:02:00,000 --> 00:02:02,080
You didn't need certificates or load balances
56
00:02:02,080 --> 00:02:03,360
or uptime guarantees.
57
00:02:03,360 --> 00:02:04,720
You just installed a tool,
58
00:02:04,720 --> 00:02:06,960
ran it, plugged in your credentials, done.
59
00:02:06,960 --> 00:02:09,760
But simplicity is not a strategy, it's a constraint.
60
00:02:09,760 --> 00:02:12,400
The proxy model assumes your building for one person,
61
00:02:12,400 --> 00:02:14,800
one machine, one integration.
62
00:02:14,800 --> 00:02:16,240
The mental model is a tool.
63
00:02:16,240 --> 00:02:19,040
The utility you install, use, and then discard.
64
00:02:19,040 --> 00:02:19,920
It doesn't compose.
65
00:02:19,920 --> 00:02:22,080
If you want Claude Desktop to access Dataverse
66
00:02:22,080 --> 00:02:23,840
and GitHub Copilot to access Dataverse,
67
00:02:23,840 --> 00:02:26,800
you run two separate proxies, two separate orth flows,
68
00:02:26,800 --> 00:02:28,240
two separate connection pools,
69
00:02:28,240 --> 00:02:30,800
two separate instances of every piece of infrastructure
70
00:02:30,800 --> 00:02:31,440
that could fail.
71
00:02:31,440 --> 00:02:33,440
It doesn't scale, it doesn't govern.
72
00:02:33,440 --> 00:02:34,800
And it doesn't answer the question,
73
00:02:34,800 --> 00:02:36,240
which Claude instance accessed,
74
00:02:36,240 --> 00:02:38,720
which record, when, under whose identity?
75
00:02:38,720 --> 00:02:40,880
The proxy assumes you'll never need to answer those questions.
76
00:02:40,880 --> 00:02:42,720
That assumption is what breaks.
77
00:02:42,720 --> 00:02:45,600
The latency lie, why STDO, looks faster?
78
00:02:45,600 --> 00:02:48,240
The latency argument for STDO is real.
79
00:02:48,240 --> 00:02:50,720
But in reality, it's a trap.
80
00:02:50,720 --> 00:02:53,680
If you look at the micro benchmarks, the numbers seem clear.
81
00:02:53,680 --> 00:02:56,320
A STDO call between two processes on the same machine
82
00:02:56,320 --> 00:02:58,320
takes about one to four milliseconds.
83
00:02:58,320 --> 00:03:00,960
HTTP adds overhead because you have the network,
84
00:03:00,960 --> 00:03:03,920
roundtrip, TLS negotiation, and parsing to deal with.
85
00:03:03,920 --> 00:03:06,960
You're looking at 50 to 100 milliseconds per call.
86
00:03:06,960 --> 00:03:09,920
On paper, that is a 25 to 100 times difference.
87
00:03:09,920 --> 00:03:11,680
On the surface, STDO wins.
88
00:03:11,680 --> 00:03:13,680
But this is where the benchmark tells you a lie.
89
00:03:13,680 --> 00:03:15,840
Those numbers only measure transport latency.
90
00:03:15,840 --> 00:03:17,520
They show you the pure protocol cost.
91
00:03:17,520 --> 00:03:19,120
What they don't measure is what actually happens
92
00:03:19,120 --> 00:03:20,480
in a real enterprise system.
93
00:03:20,480 --> 00:03:22,240
In the real world, a dataverse query
94
00:03:22,240 --> 00:03:24,000
doesn't execute in five milliseconds.
95
00:03:24,000 --> 00:03:25,840
A typical query to dataverse runs
96
00:03:25,840 --> 00:03:28,640
somewhere between 515 milliseconds.
97
00:03:28,640 --> 00:03:30,240
That is just the back-end work.
98
00:03:30,240 --> 00:03:32,000
The database, the business rules,
99
00:03:32,000 --> 00:03:34,720
and the security checks that happen after your request arrives.
100
00:03:34,720 --> 00:03:35,760
So let's add it up.
101
00:03:35,760 --> 00:03:38,800
You send a request over STDO, which takes one millisecond,
102
00:03:38,800 --> 00:03:40,880
dataverse executes for 1,000 milliseconds.
103
00:03:40,880 --> 00:03:43,120
The response comes back in another millisecond.
104
00:03:43,120 --> 00:03:45,600
Your total time is 1,000 and two milliseconds.
105
00:03:45,600 --> 00:03:47,360
Now do the same thing over HTTP.
106
00:03:47,360 --> 00:03:49,200
The request takes 100 milliseconds,
107
00:03:49,200 --> 00:03:51,440
dataverse executes for 1,000 milliseconds.
108
00:03:51,440 --> 00:03:52,800
The response takes another 100.
109
00:03:52,800 --> 00:03:54,960
Your total is 1,200 milliseconds.
110
00:03:54,960 --> 00:03:58,400
That is 200 extra milliseconds out of a total of 1,200.
111
00:03:58,400 --> 00:04:00,000
It's about 17% overhead.
112
00:04:00,000 --> 00:04:01,440
In an enterprise workload where you're
113
00:04:01,440 --> 00:04:03,040
chaining multiple queries together,
114
00:04:03,040 --> 00:04:04,640
that overhead is just noise.
115
00:04:04,640 --> 00:04:06,320
But there's another cost STDO carries
116
00:04:06,320 --> 00:04:07,600
that doesn't show up in the benchmark.
117
00:04:07,600 --> 00:04:09,120
Every time you start a proxy process,
118
00:04:09,120 --> 00:04:10,560
you pay a start-up cost.
119
00:04:10,560 --> 00:04:11,600
The process launches,
120
00:04:11,600 --> 00:04:13,120
the dataverse client libraries load,
121
00:04:13,120 --> 00:04:15,600
and the authentication context has to initialize.
122
00:04:15,600 --> 00:04:17,440
The first query always pays a penalty,
123
00:04:17,440 --> 00:04:18,880
and sometimes it's a big one.
124
00:04:18,880 --> 00:04:21,120
In Kubernetes environments where containers spin up
125
00:04:21,120 --> 00:04:22,320
and down constantly,
126
00:04:22,320 --> 00:04:23,920
you pay this cost over and over again.
127
00:04:23,920 --> 00:04:26,480
With HTTP, you run one long-lived server.
128
00:04:26,480 --> 00:04:28,080
Clients authenticate once,
129
00:04:28,080 --> 00:04:29,360
connections pool,
130
00:04:29,360 --> 00:04:30,880
and every call after that
131
00:04:30,880 --> 00:04:33,040
reuses the infrastructure you already built.
132
00:04:33,040 --> 00:04:34,560
The research on this is unambiguous.
133
00:04:34,560 --> 00:04:36,800
A MongoDB case study from 2026,
134
00:04:36,800 --> 00:04:39,280
compared STDO and HTTP endpoints,
135
00:04:39,280 --> 00:04:41,120
handling the same data access patterns.
136
00:04:41,120 --> 00:04:44,320
STDO averaged 6.4 seconds per query,
137
00:04:44,320 --> 00:04:46,880
while HTTP averaged 1.8 seconds.
138
00:04:46,880 --> 00:04:49,600
HTTP was 3 to 4 times faster end-to-end.
139
00:04:49,600 --> 00:04:51,840
It wasn't slower, it was faster.
140
00:04:51,840 --> 00:04:53,520
The HTTP deployment was tuned
141
00:04:53,520 --> 00:04:55,200
with connection pooling, caching,
142
00:04:55,200 --> 00:04:56,320
and horizontal scaling.
143
00:04:56,320 --> 00:04:59,120
The STDO deployment paid the cost of process management
144
00:04:59,120 --> 00:05:00,160
and cold starts
145
00:05:00,160 --> 00:05:02,080
that aren't obvious in the raw numbers.
146
00:05:02,080 --> 00:05:03,760
The latency advantage STDO
147
00:05:03,760 --> 00:05:04,800
appears to have evaporates
148
00:05:04,800 --> 00:05:06,560
when you measure what actually matters.
149
00:05:06,560 --> 00:05:08,080
The gap narrows even further
150
00:05:08,080 --> 00:05:10,480
when you add monitoring, retry logic,
151
00:05:10,480 --> 00:05:12,000
and resilience patterns.
152
00:05:12,000 --> 00:05:14,240
If you add a retry to your HTTP call,
153
00:05:14,240 --> 00:05:16,560
it costs you 30 milliseconds extra on a failure.
154
00:05:16,880 --> 00:05:19,040
If you add that same retry to STDO,
155
00:05:19,040 --> 00:05:20,800
you're spinning up a whole new process.
156
00:05:20,800 --> 00:05:22,800
That costs you more in startup time alone
157
00:05:22,800 --> 00:05:24,240
than the entire HTTP call,
158
00:05:24,240 --> 00:05:26,160
STDO wins the latency tournament,
159
00:05:26,160 --> 00:05:28,800
but latency isn't the tournament that matters.
160
00:05:28,800 --> 00:05:30,000
The scaling problem,
161
00:05:30,000 --> 00:05:32,240
why proxies die at enterprise scale?
162
00:05:32,240 --> 00:05:33,840
Once you move beyond one developer
163
00:05:33,840 --> 00:05:35,520
using Claude desktop on a laptop,
164
00:05:35,520 --> 00:05:37,440
the proxy architecture collapses.
165
00:05:37,440 --> 00:05:39,280
It fails because of the model behind it.
166
00:05:39,280 --> 00:05:40,880
Here's what happens when you scale.
167
00:05:40,880 --> 00:05:42,720
Imagine you have 50 people in your organization
168
00:05:42,720 --> 00:05:44,400
who want to use Claude with dataverse.
169
00:05:44,400 --> 00:05:46,800
Each person installs the proxy on their own machine.
170
00:05:46,800 --> 00:05:48,480
Now you have 50 separate processes
171
00:05:48,480 --> 00:05:50,080
running somewhere in your infrastructure.
172
00:05:50,080 --> 00:05:52,560
Each one is spawning its own connection to dataverse,
173
00:05:52,560 --> 00:05:54,800
each one is managing its own authentication,
174
00:05:54,800 --> 00:05:56,720
and each one is an isolated instance
175
00:05:56,720 --> 00:05:58,320
that nobody can manage centrally.
176
00:05:58,320 --> 00:05:59,520
Kubernetes doesn't like this.
177
00:05:59,520 --> 00:06:00,880
If you're running these proxies
178
00:06:00,880 --> 00:06:02,480
in containerized environments,
179
00:06:02,480 --> 00:06:04,080
you're creating a logistics nightmare.
180
00:06:04,080 --> 00:06:07,200
50 short-lived processes means 50 scheduling decisions,
181
00:06:07,200 --> 00:06:08,480
50 resource allocations,
182
00:06:08,480 --> 00:06:09,840
and 50 shutdown events.
183
00:06:09,840 --> 00:06:11,600
Every process that spins up
184
00:06:11,600 --> 00:06:13,040
needs its own configuration
185
00:06:13,040 --> 00:06:14,640
and every process that fails
186
00:06:14,640 --> 00:06:16,720
needs its own monitoring and recovery logic.
187
00:06:16,720 --> 00:06:18,640
If you scale this to 500 users,
188
00:06:18,640 --> 00:06:21,520
you are managing 500 independent failure domains.
189
00:06:21,520 --> 00:06:23,120
At that scale, process management
190
00:06:23,120 --> 00:06:25,760
stops being administration and becomes firefighting.
191
00:06:25,760 --> 00:06:28,000
The connection pooling problem becomes acute.
192
00:06:28,000 --> 00:06:30,160
Every proxy spawns its own dataverse client
193
00:06:30,160 --> 00:06:32,880
with no sharing and no pooling across users.
194
00:06:32,880 --> 00:06:35,200
Your dataverse environment sees 500 independent
195
00:06:35,200 --> 00:06:38,000
authentication sessions instead of one managed gateway.
196
00:06:38,000 --> 00:06:40,960
Your token budget gets consumed 500 times faster
197
00:06:40,960 --> 00:06:43,600
and your rate limits hit walls you didn't anticipate.
198
00:06:43,600 --> 00:06:45,040
The platform starts throttling you
199
00:06:45,040 --> 00:06:46,400
because it can't tell the difference
200
00:06:46,400 --> 00:06:48,960
between legitimate work and a coordinated attack.
201
00:06:48,960 --> 00:06:50,560
The memory footprint also explodes.
202
00:06:50,560 --> 00:06:54,000
Each proxy process consumes resources for process overhead,
203
00:06:54,000 --> 00:06:56,240
client libraries, and cached metadata.
204
00:06:56,240 --> 00:06:58,160
When you multiply that by 500,
205
00:06:58,160 --> 00:06:59,520
you're running infrastructure
206
00:06:59,520 --> 00:07:02,160
that is expensive to host and difficult to manage.
207
00:07:02,160 --> 00:07:03,840
Resource contention starts to appear.
208
00:07:03,840 --> 00:07:05,920
If your users are concentrated in the same region,
209
00:07:05,920 --> 00:07:08,240
you're fighting for bandwidth on shared networks.
210
00:07:08,240 --> 00:07:09,200
Your cloud bills go up
211
00:07:09,200 --> 00:07:12,000
and you have nothing to show for it, except operational complexity.
212
00:07:12,000 --> 00:07:14,320
But the worst cost is invisible until you need it.
213
00:07:14,320 --> 00:07:16,640
Observability breaks completely.
214
00:07:16,640 --> 00:07:17,760
When something goes wrong,
215
00:07:17,760 --> 00:07:20,320
like a data corruption incident or a security breach,
216
00:07:20,320 --> 00:07:23,920
you need to know which user accessed which record at what time?
217
00:07:23,920 --> 00:07:25,760
With 500 independent proxies,
218
00:07:25,760 --> 00:07:28,720
that information is scattered across 500 different machines.
219
00:07:28,720 --> 00:07:30,400
Some logs live on client laptops,
220
00:07:30,400 --> 00:07:32,480
some live in container logs that get deleted,
221
00:07:32,480 --> 00:07:33,840
and some are still in flight.
222
00:07:33,840 --> 00:07:35,280
None of it is centralized.
223
00:07:35,280 --> 00:07:36,640
Recreating the audit trail
224
00:07:36,640 --> 00:07:38,960
becomes an investigative archaeology project
225
00:07:38,960 --> 00:07:40,080
instead of a simple search.
226
00:07:40,080 --> 00:07:41,920
Governance also becomes impossible to enforce.
227
00:07:41,920 --> 00:07:43,840
You might want to say that a cloud instance
228
00:07:43,840 --> 00:07:45,520
can access the accounts table,
229
00:07:45,520 --> 00:07:47,440
but not the opportunities table.
230
00:07:47,440 --> 00:07:48,640
With distributed proxies,
231
00:07:48,640 --> 00:07:51,280
you have no central place to make that decision stick.
232
00:07:51,280 --> 00:07:54,320
You have no way to verify that the policy is being followed,
233
00:07:54,320 --> 00:07:56,560
and you have no audit trail to prove it.
234
00:07:56,560 --> 00:07:58,080
You're flying blind.
235
00:07:58,080 --> 00:08:00,880
The proxy becomes a single point of failure for every user,
236
00:08:00,880 --> 00:08:02,240
rather than a resilient service.
237
00:08:02,240 --> 00:08:05,120
It's not one gateway going down where everything stops.
238
00:08:05,120 --> 00:08:07,680
It's one user experiencing a broken proxy,
239
00:08:07,680 --> 00:08:10,080
and you have no way to diagnose why it happened.
240
00:08:10,080 --> 00:08:12,000
You can't tell if the installation is wrong,
241
00:08:12,000 --> 00:08:13,760
their authentication is stale,
242
00:08:13,760 --> 00:08:15,920
or if there is a network issue on their machine.
243
00:08:15,920 --> 00:08:18,400
You can't see across the system to answer those questions.
244
00:08:18,400 --> 00:08:20,720
At scale, the proxy stops being infrastructure.
245
00:08:20,720 --> 00:08:22,160
It becomes a liability.
246
00:08:22,160 --> 00:08:24,560
This is where streamable HTTP changes the game.
247
00:08:24,560 --> 00:08:28,400
Enter streamable HTTP, the remote endpoint.
248
00:08:28,400 --> 00:08:30,960
The architecture of this new approach is radically simpler.
249
00:08:30,960 --> 00:08:33,760
Instead of asking every client to run its own proxy,
250
00:08:33,760 --> 00:08:36,320
data versa itself exposes an HTTP endpoint.
251
00:08:36,320 --> 00:08:38,560
The endpoint lives at a predictable URL.
252
00:08:38,560 --> 00:08:40,320
For your organization, it looks like this.
253
00:08:40,320 --> 00:08:42,080
HTTPS/orgID.
254
00:08:42,080 --> 00:08:46,160
cpmlinomics.com/apirge/mcp
255
00:08:46,160 --> 00:08:47,120
That is it.
256
00:08:47,120 --> 00:08:48,880
One endpoint, stateless.
257
00:08:48,880 --> 00:08:51,920
Ready to accept mcp requests from any authenticated client?
258
00:08:51,920 --> 00:08:54,880
The moment you publish that endpoint, everything changes.
259
00:08:54,880 --> 00:08:58,400
A single HTTP endpoint can serve many clients at the same time.
260
00:08:58,400 --> 00:09:01,440
Cloud Desktop, Connects, GitHub Co-Pilot Connects,
261
00:09:01,440 --> 00:09:03,760
a custom orchestrator in your pipeline connects.
262
00:09:03,760 --> 00:09:05,520
They are all hitting the same service.
263
00:09:05,520 --> 00:09:06,800
They are running the same code.
264
00:09:06,800 --> 00:09:09,600
They are using the same connection pools to data versa.
265
00:09:09,600 --> 00:09:12,640
You do not multiply your infrastructure by the number of users.
266
00:09:12,640 --> 00:09:14,000
You scale the endpoint itself.
267
00:09:14,000 --> 00:09:17,360
If you need more power, you add capacity behind a load balancer.
268
00:09:17,360 --> 00:09:18,720
The clients do not care.
269
00:09:18,720 --> 00:09:20,880
They just keep sending requests to the same URL.
270
00:09:20,880 --> 00:09:23,040
This is horizontally scalable architecture.
271
00:09:23,040 --> 00:09:25,840
It is table stakes for any production service in the enterprise.
272
00:09:25,840 --> 00:09:28,160
But for AI integrations with business data,
273
00:09:28,160 --> 00:09:29,520
it has been absent until now.
274
00:09:29,520 --> 00:09:31,760
The proxy model forced you into vertical scaling.
275
00:09:31,760 --> 00:09:35,360
Bigger machines, more memory, more processes running on client devices.
276
00:09:35,360 --> 00:09:38,720
The HTTP model lets you do what every mature platform does.
277
00:09:38,720 --> 00:09:40,960
You distribute work across many instances.
278
00:09:40,960 --> 00:09:42,960
You balance the load, you fail over transparently.
279
00:09:42,960 --> 00:09:45,280
Cloud Desktop natively supports this.
280
00:09:45,280 --> 00:09:46,240
So does Cloud Code.
281
00:09:46,240 --> 00:09:47,760
GitHub Co-Pilot in all its forms.
282
00:09:47,760 --> 00:09:51,760
VS Code, the app, the CLI, they all speak HTTP to MCP servers.
283
00:09:51,760 --> 00:09:54,000
These clients already have the capability built in.
284
00:09:54,000 --> 00:09:56,720
They are just waiting for you to point them at the right endpoint.
285
00:09:56,720 --> 00:09:58,960
No installation, no local proxy to manage.
286
00:09:58,960 --> 00:10:01,440
You configure the URL once in the client settings
287
00:10:01,440 --> 00:10:02,800
and the client handles the rest.
288
00:10:02,800 --> 00:10:04,400
The authentication flow is elegant.
289
00:10:04,400 --> 00:10:06,720
You authenticate once the client receives a token.
290
00:10:06,720 --> 00:10:07,920
It caches that token.
291
00:10:07,920 --> 00:10:11,840
Subsequent requests use that cashed token until it expires or gets revoked.
292
00:10:11,840 --> 00:10:14,400
This is how web applications have worked for 20 years.
293
00:10:14,400 --> 00:10:15,600
It is a solved problem.
294
00:10:15,600 --> 00:10:18,720
The client libraries handle token refresh automatically.
295
00:10:18,720 --> 00:10:20,400
Users do not see the machinery.
296
00:10:20,400 --> 00:10:21,840
They see seamless access.
297
00:10:21,840 --> 00:10:24,000
The contrast with the proxy is instructive.
298
00:10:24,000 --> 00:10:27,600
With STDIO, every time a process starts, it authenticates independently.
299
00:10:27,600 --> 00:10:29,600
Every process holds its own alt context.
300
00:10:29,600 --> 00:10:32,800
Every process is a separate disconnected session to dataverse.
301
00:10:32,800 --> 00:10:36,640
With HTTP, you are building on top of standard OAuth infrastructure.
302
00:10:36,640 --> 00:10:37,920
Token management is centralized.
303
00:10:37,920 --> 00:10:39,520
Revocation is immediate.
304
00:10:39,520 --> 00:10:42,560
If a user loses access, that replication applies instantly
305
00:10:42,560 --> 00:10:44,320
across every connected client.
306
00:10:44,320 --> 00:10:46,480
Try doing that with distributed proxies.
307
00:10:46,480 --> 00:10:51,120
Under the hood, HTTP2 multiplexing means you are not opening a new connection
308
00:10:51,120 --> 00:10:52,560
for every single request.
309
00:10:52,560 --> 00:10:54,800
The client opens one connection to the endpoint
310
00:10:54,800 --> 00:10:57,200
and sends many requests over that same pipe.
311
00:10:57,200 --> 00:11:01,680
Connection pooling on the server side means dataverse does not see a flood of independent sessions.
312
00:11:01,680 --> 00:11:05,280
It sees a manageable number of persistent connections from the MCP server.
313
00:11:05,280 --> 00:11:08,400
And the server distributes the work across those connections efficiently.
314
00:11:08,400 --> 00:11:12,160
Load balances in front of the endpoint root requests to healthy instances.
315
00:11:12,160 --> 00:11:14,720
If one server fails, the traffic shifts to another.
316
00:11:14,720 --> 00:11:17,200
You have moved from a tool to an enterprise service.
317
00:11:17,200 --> 00:11:18,800
It is the same dataverse underneath.
318
00:11:18,800 --> 00:11:22,400
Same security model, same business rules, same audit trails.
319
00:11:22,400 --> 00:11:23,440
The tool surface.
320
00:11:23,440 --> 00:11:28,400
The MCP tools that let agents discover tables, query records, and create entities.
321
00:11:28,400 --> 00:11:30,480
Is identical to what the proxy exposes.
322
00:11:30,480 --> 00:11:31,760
You have not lost any functionality.
323
00:11:31,760 --> 00:11:34,000
You have gained the ability to operate at scale.
324
00:11:34,000 --> 00:11:35,040
To govern centrally.
325
00:11:35,040 --> 00:11:36,640
To observe comprehensively.
326
00:11:36,640 --> 00:11:38,880
And to manage everything as a unified platform.
327
00:11:38,880 --> 00:11:42,720
This shift from local execution to a remote service is architectural bedrock.
328
00:11:42,720 --> 00:11:43,840
Everything that follows.
329
00:11:43,840 --> 00:11:47,120
The governance, the multi-LLM strategy, the token efficiency,
330
00:11:47,120 --> 00:11:48,960
it all depends on this foundation.
331
00:11:48,960 --> 00:11:50,160
PKCE.
332
00:11:50,160 --> 00:11:52,640
The authentication that doesn't require secrets.
333
00:11:52,640 --> 00:11:55,440
The HTTP endpoint solves the scaling problem.
334
00:11:55,440 --> 00:11:59,680
But it introduces a security problem that traditional applications never had to solve.
335
00:11:59,680 --> 00:12:02,160
How do you authenticate when your client cannot keep a secret?
336
00:12:02,160 --> 00:12:03,840
This is not a hypothetical concern.
337
00:12:03,840 --> 00:12:06,000
Claude desktop is installed on a user's machine.
338
00:12:06,000 --> 00:12:10,080
The configuration file that points to your dataverse endpoint lives on that same machine.
339
00:12:10,080 --> 00:12:12,960
If that configuration file contains a client's secret.
340
00:12:12,960 --> 00:12:16,160
Which is basically a password that proves the application's identity.
341
00:12:16,160 --> 00:12:16,880
You have a problem.
342
00:12:16,880 --> 00:12:19,840
Anyone with access to that file can impersonate the application
343
00:12:19,840 --> 00:12:22,240
and request tokens from your authorization server.
344
00:12:22,240 --> 00:12:23,840
The same applies to GitHub co-pilot.
345
00:12:23,840 --> 00:12:25,120
The same applies to any client.
346
00:12:25,120 --> 00:12:26,480
You do not directly control.
347
00:12:27,120 --> 00:12:31,920
Traditional OAuth solved this by assuming the client was a web server running in a secure data center.
348
00:12:31,920 --> 00:12:35,360
The server could store secrets in environment variables or encrypted vaults.
349
00:12:35,360 --> 00:12:36,960
The secret never left the server.
350
00:12:36,960 --> 00:12:40,720
A public application could not use OAuth because it could not protect a secret.
351
00:12:40,720 --> 00:12:45,120
PKCE, proof-key for code exchange pronounced pixie, removes that requirement.
352
00:12:45,120 --> 00:12:49,440
It lets public clients authenticate securely without storing any secret at all.
353
00:12:49,440 --> 00:12:50,640
Here is how it works.
354
00:12:50,640 --> 00:12:55,520
Instead of a static secret, the client generates a random value called a code verifier.
355
00:12:55,520 --> 00:12:58,000
It hashes that verifier into a code challenge.
356
00:12:58,000 --> 00:13:00,080
The challenge goes into the authorization request.
357
00:13:00,080 --> 00:13:01,840
The authorization server receives the request,
358
00:13:01,840 --> 00:13:04,400
verifies who you are, and returns an authorization code.
359
00:13:04,400 --> 00:13:08,160
The client then redeems that code by sending the original verifier alongside it.
360
00:13:08,160 --> 00:13:12,320
The authorization server hashes that verifier, checks that it matches the challenge,
361
00:13:12,320 --> 00:13:13,440
and issues a token.
362
00:13:13,440 --> 00:13:15,520
The security comes from the verification.
363
00:13:15,520 --> 00:13:20,080
If an attacker intercepts the authorization code, they cannot use it because they do not have the verifier.
364
00:13:20,080 --> 00:13:22,080
The code is useless without the verifier.
365
00:13:22,080 --> 00:13:24,400
Only the original client can provide the verifier.
366
00:13:24,400 --> 00:13:26,640
Because only the original client generated it.
367
00:13:26,640 --> 00:13:28,560
The verifier never travels over the network.
368
00:13:28,560 --> 00:13:32,160
The challenge, which is derived from the verifier, is what crosses the wire.
369
00:13:32,160 --> 00:13:34,880
And you cannot reverse a hash to recover the original verifier.
370
00:13:34,880 --> 00:13:35,920
This is not theoretical.
371
00:13:35,920 --> 00:13:41,920
It is formalized in RFC 76636, and is now a required component of OAuth 2.1.
372
00:13:41,920 --> 00:13:43,920
Every major identity provider supports it.
373
00:13:43,920 --> 00:13:47,520
EntraID supports it, Claude supports it, GitHub co-pilot supports it.
374
00:13:47,520 --> 00:13:51,680
Data versus MCP server is built with the assumption that clients will use PKCE.
375
00:13:51,680 --> 00:13:53,840
The practical implication is straightforward.
376
00:13:53,840 --> 00:13:57,200
Your Dataverse MCP endpoint asks EntraID for tokens.
377
00:13:57,200 --> 00:13:58,960
EntraID authenticates the user.
378
00:13:58,960 --> 00:14:03,680
The user's browser opens, they sign in, they are redirected back to the client with an authorization code.
379
00:14:03,680 --> 00:14:07,600
The client exchanges that code with the verifier it generated and receives a token.
380
00:14:07,600 --> 00:14:09,600
No secret sits in the configuration file.
381
00:14:09,600 --> 00:14:10,640
No secret leaks into logs.
382
00:14:10,640 --> 00:14:13,680
No secret appears in the client's prompts or behavior.
383
00:14:13,680 --> 00:14:16,240
This is what enables the multi-LLM integration model.
384
00:14:16,240 --> 00:14:18,800
You can point Claude at your Dataverse endpoint.
385
00:14:18,800 --> 00:14:21,440
You can point GitHub co-pilot at the same endpoint.
386
00:14:21,440 --> 00:14:23,760
You can point the custom orchestrator at the same endpoint.
387
00:14:23,760 --> 00:14:25,200
They are all using PKCE.
388
00:14:25,200 --> 00:14:28,240
They are all securing themselves without requiring any shared secret
389
00:14:28,240 --> 00:14:31,920
that you have to manage, rotate, and protect across every client installation.
390
00:14:31,920 --> 00:14:35,680
The security model that makes multi-LLM integration safe is already built in.
391
00:14:35,680 --> 00:14:37,200
You just need to configure it correctly.
392
00:14:37,200 --> 00:14:40,560
Registering your EntraID app, the Blueprint.
393
00:14:40,560 --> 00:14:42,000
Now you're going to make this real.
394
00:14:42,000 --> 00:14:43,280
The theory ends here.
395
00:14:43,280 --> 00:14:44,720
The Blueprint begins.
396
00:14:44,720 --> 00:14:49,120
Log in to the Azure portal and navigate to EntraID to create a new application registration.
397
00:14:49,120 --> 00:14:51,920
This is the same process you'd use for any OAuth client,
398
00:14:51,920 --> 00:14:54,320
whether it's a web app, a mobile app, or a service.
399
00:14:54,320 --> 00:14:58,480
You're registering a new application that represents your Dataverse MCP consumers
400
00:14:58,480 --> 00:14:59,840
to the authorization system.
401
00:14:59,840 --> 00:15:04,880
So you should name it something meaningful like Dataverse MCP or ClaudePlus Dataverse integration.
402
00:15:04,880 --> 00:15:07,760
The name doesn't affect how the code runs,
403
00:15:07,760 --> 00:15:11,760
but it definitely affects your sanity when you're managing dozens of app registration
404
00:15:11,760 --> 00:15:12,960
six months from now.
405
00:15:12,960 --> 00:15:16,160
Once the app exists, you need to declare what it's allowed to do.
406
00:15:16,160 --> 00:15:19,200
This happens in API permissions, add a permission for MCP tools.
407
00:15:19,200 --> 00:15:24,400
This is the specific permission that grants MCP clients access to Dataverse through the MCP server.
408
00:15:24,400 --> 00:15:26,320
It's not a generic Dataverse permission.
409
00:15:26,320 --> 00:15:28,720
It's scoped to the MCP interface specifically.
410
00:15:28,720 --> 00:15:32,720
This granularity matters because you're saying this application can use the MCP protocol to
411
00:15:32,720 --> 00:15:35,760
interact with Dataverse, but it doesn't have a blank check for everything else.
412
00:15:35,760 --> 00:15:37,840
Copy the application ID and write it down.
413
00:15:37,840 --> 00:15:42,720
This identifier is going to appear in every client configuration you set up from here on out.
414
00:15:42,720 --> 00:15:44,880
It's the public face of your app registration,
415
00:15:44,880 --> 00:15:48,080
and it's the value that clients pass back to the authorization server to say,
416
00:15:48,080 --> 00:15:48,960
"This is who I am."
417
00:15:48,960 --> 00:15:52,080
Keep it visible. You'll reference it constantly.
418
00:15:52,080 --> 00:15:54,720
The next step happens in the Power Platform admin center,
419
00:15:54,720 --> 00:15:56,080
not the Azure portal.
420
00:15:56,080 --> 00:16:00,480
Navigate to your Dataverse environment and find the settings that govern MCP client access.
421
00:16:00,480 --> 00:16:02,480
Add your application ID to the allow list.
422
00:16:02,480 --> 00:16:03,520
This is the gate.
423
00:16:03,520 --> 00:16:05,920
Without this step, your app registration exists,
424
00:16:05,920 --> 00:16:08,960
but it's not permitted to touch this specific Dataverse environment.
425
00:16:08,960 --> 00:16:10,800
You might have multiple environments for
426
00:16:10,800 --> 00:16:12,320
development, staging, and production,
427
00:16:12,320 --> 00:16:16,560
and you can grant the same app registration access to some while denying others.
428
00:16:16,560 --> 00:16:20,960
This is how you prevent a test integration from accidentally touching production data.
429
00:16:20,960 --> 00:16:22,560
Then comes the critical configuration.
430
00:16:22,560 --> 00:16:25,120
Allow public client flows.
431
00:16:25,120 --> 00:16:28,000
Find this in the app registration's authentication settings.
432
00:16:28,000 --> 00:16:29,200
It's not enabled by default.
433
00:16:29,200 --> 00:16:30,880
You have to explicitly turn it on.
434
00:16:30,880 --> 00:16:34,560
This flag tells EntraID that this client cannot securely store secrets,
435
00:16:34,560 --> 00:16:37,920
so it needs to use PKCE based authentication flows instead.
436
00:16:37,920 --> 00:16:38,800
Without the setting,
437
00:16:38,800 --> 00:16:43,760
the PKCE flow won't work and the authorization server will reject every request from public clients.
438
00:16:43,760 --> 00:16:46,400
This setting is what makes the entire architecture possible,
439
00:16:46,400 --> 00:16:49,200
and it's the lock-and-key that allows Claude and GitHub co-pilot
440
00:16:49,200 --> 00:16:52,400
to authenticate without embedding secrets in their client code.
441
00:16:52,400 --> 00:16:53,680
Why is each step necessary?
442
00:16:53,680 --> 00:16:55,920
Because the security model depends on isolation.
443
00:16:55,920 --> 00:16:59,360
The app registration isolates this integration from others you might build,
444
00:16:59,360 --> 00:17:03,840
while the API permission isolates MCP access from other Dataverse capabilities.
445
00:17:03,840 --> 00:17:07,200
The environment allow list isolates which Dataverse tenants this app can reach,
446
00:17:07,200 --> 00:17:11,600
and the public client flows setting isolates the authentication mechanism to PKCE.
447
00:17:11,600 --> 00:17:13,840
Each step narrows the scope and adds a gate,
448
00:17:13,840 --> 00:17:16,640
and together they form a security posture where an attacker
449
00:17:16,640 --> 00:17:19,520
would need to compromise multiple independent systems to get in.
450
00:17:19,520 --> 00:17:21,040
This is not optional infrastructure.
451
00:17:21,040 --> 00:17:22,400
This is the foundation.
452
00:17:22,400 --> 00:17:26,160
If you skip any step, the architecture fails in ways that won't become obvious
453
00:17:26,160 --> 00:17:29,040
until you're deep in the integration and something breaks.
454
00:17:29,040 --> 00:17:32,080
Redirect URIs, the callback contract.
455
00:17:32,080 --> 00:17:35,040
With the app registered, you need to define the redirect URIs.
456
00:17:35,040 --> 00:17:37,360
This is where the architecture meets the real world.
457
00:17:37,360 --> 00:17:40,160
When a user authenticates through Dataverse MCP,
458
00:17:40,160 --> 00:17:43,600
they're going to see an authorization screen where they enter their credentials.
459
00:17:43,600 --> 00:17:45,120
Entra ID will verify them,
460
00:17:45,120 --> 00:17:47,520
and then the authorization server needs to send the user
461
00:17:47,520 --> 00:17:49,280
and the authorization code somewhere.
462
00:17:49,280 --> 00:17:51,280
Where? That's the redirect URI.
463
00:17:51,280 --> 00:17:53,440
Different clients have different callback URLs,
464
00:17:53,440 --> 00:17:54,560
and this isn't arbitrary.
465
00:17:54,560 --> 00:17:57,520
It's the contract between the client and the authorization server.
466
00:17:57,520 --> 00:18:00,320
Claude Desktop expects redirects to come back to HTTPS,
467
00:18:00,320 --> 00:18:04,000
ASA's Claude, IA, API, MCP, or callback.
468
00:18:04,000 --> 00:18:07,760
That's the endpoint in the Claude service that knows how to handle the authorization code,
469
00:18:07,760 --> 00:18:12,560
exchange it for a token, and send that token back to your local Claude Desktop instance.
470
00:18:12,560 --> 00:18:14,880
If you try to redirect to any other URI,
471
00:18:14,880 --> 00:18:18,160
Claude won't catch the callback and the authorization flow will just hang.
472
00:18:18,160 --> 00:18:20,800
The user will see a browser window waiting for something to happen,
473
00:18:20,800 --> 00:18:22,000
and nothing will happen.
474
00:18:22,000 --> 00:18:25,040
Claude code, which runs in your terminal, uses a different pattern.
475
00:18:25,040 --> 00:18:29,200
It expects HTTP, KAS-LASH, localhost, callback.
476
00:18:29,200 --> 00:18:30,880
The code is running locally on your machine,
477
00:18:30,880 --> 00:18:33,360
so the authorization server redirects to localhost.
478
00:18:33,360 --> 00:18:36,560
Claude code has a local HTTP listener waiting on that endpoint,
479
00:18:36,560 --> 00:18:39,280
and it catches the callback to process the authorization code,
480
00:18:39,280 --> 00:18:42,160
so the user's terminal session can be authenticated.
481
00:18:42,160 --> 00:18:48,320
GitHub Copilot uses HTTP/127.0.0.1.
482
00:18:48,320 --> 00:18:49,920
It's similar to Claude code conceptually,
483
00:18:49,920 --> 00:18:53,200
but the IP address is explicit instead of hostname based.
484
00:18:53,200 --> 00:18:55,360
Again, the difference isn't accidental,
485
00:18:55,360 --> 00:18:58,640
and it's exactly how the copilot client expects to receive its callback.
486
00:18:58,640 --> 00:19:02,400
You register all three redirect URIs in your app registration.
487
00:19:02,400 --> 00:19:04,640
When a user authenticates EntraID,
488
00:19:04,640 --> 00:19:06,880
looks at which client initiated the request
489
00:19:06,880 --> 00:19:10,080
and sends the callback to the URI registered for that specific client.
490
00:19:10,080 --> 00:19:12,400
If the callback doesn't match the registered URI,
491
00:19:12,400 --> 00:19:14,560
EntraID rejects it immediately.
492
00:19:14,560 --> 00:19:16,880
This is a security measure that prevents attackers
493
00:19:16,880 --> 00:19:18,640
from hijacking authorization flows
494
00:19:18,640 --> 00:19:20,880
by redirecting users to malicious sites.
495
00:19:20,880 --> 00:19:23,360
Why can't you use the same URI for all clients?
496
00:19:23,360 --> 00:19:26,720
Because each client has its own way of receiving and processing callbacks.
497
00:19:26,720 --> 00:19:30,320
A single URI assumes a single server waiting to catch the response,
498
00:19:30,320 --> 00:19:32,960
but you have many clients like Claude Desktop, Claude Code,
499
00:19:32,960 --> 00:19:34,960
and Copilot that aren't all servers.
500
00:19:34,960 --> 00:19:37,680
They are local applications with their own callback mechanisms,
501
00:19:37,680 --> 00:19:40,400
and each one needs its own configured URI
502
00:19:40,400 --> 00:19:42,480
that matches its specific architecture.
503
00:19:42,480 --> 00:19:44,080
For testing locally during setup,
504
00:19:44,080 --> 00:19:46,640
you might use HTTP/Localhost,
505
00:19:46,640 --> 00:19:49,280
but for production, you have to ensure the URIs align
506
00:19:49,280 --> 00:19:51,600
with where each client actually runs.
507
00:19:51,600 --> 00:19:54,400
Mis-matched redirects are the most common setup error I see
508
00:19:54,400 --> 00:19:56,080
where the authentication succeeds,
509
00:19:56,080 --> 00:19:58,880
but EntraID tries to send the callback to a URI
510
00:19:58,880 --> 00:20:00,880
that doesn't match what you registered.
511
00:20:00,880 --> 00:20:02,320
The request gets rejected,
512
00:20:02,320 --> 00:20:05,360
and the user sees an error instead of being authenticated.
513
00:20:05,360 --> 00:20:08,160
Register the URIs correctly, and the flow is seamless.
514
00:20:08,160 --> 00:20:10,080
Register them wrong and nothing works.
515
00:20:10,080 --> 00:20:12,240
Claude Desktop 0 friction setup.
516
00:20:12,240 --> 00:20:14,160
Connecting Claude Desktop is almost trivial
517
00:20:14,160 --> 00:20:15,920
once your EntraID app is registered,
518
00:20:15,920 --> 00:20:17,520
and your redirect URIs are set,
519
00:20:17,520 --> 00:20:19,920
open Claude Desktop, and head into the settings.
520
00:20:19,920 --> 00:20:23,280
Look for custom connectors or MCP servers and add a new one.
521
00:20:23,280 --> 00:20:25,440
You will see fields for a name and a URIL.
522
00:20:25,440 --> 00:20:26,560
The name is just a label,
523
00:20:26,560 --> 00:20:28,400
call it "Dataverse" or "business data".
524
00:20:28,400 --> 00:20:29,840
Whatever makes sense for you.
525
00:20:29,840 --> 00:20:32,080
The URIL is your production endpoint.
526
00:20:32,080 --> 00:20:34,080
HTPS are org ID.
527
00:20:34,080 --> 00:20:37,280
CRMDynamics.com API-MCP.
528
00:20:37,280 --> 00:20:38,880
Just make sure to swap that placeholder
529
00:20:38,880 --> 00:20:40,320
with your actual organization ID.
530
00:20:40,320 --> 00:20:42,480
But here's the problem with the old proxy approach.
531
00:20:42,480 --> 00:20:44,400
You used to have to manage connection details,
532
00:20:44,400 --> 00:20:46,640
credentials, and environment variables
533
00:20:46,640 --> 00:20:47,680
just to get things running.
534
00:20:47,680 --> 00:20:49,280
Now, all of that disappears.
535
00:20:49,280 --> 00:20:51,600
You only need two things, the name and the URIL.
536
00:20:51,600 --> 00:20:54,000
The application ID goes right into the client ID field.
537
00:20:54,000 --> 00:20:55,200
You don't need a secret.
538
00:20:55,200 --> 00:20:57,200
The client ID itself is public information
539
00:20:57,200 --> 00:20:59,040
that you already registered in Enter ID.
540
00:20:59,040 --> 00:21:01,680
Putting it in your configuration doesn't expose anything.
541
00:21:01,680 --> 00:21:04,320
Because a secret that was never generated can't be leaked.
542
00:21:04,320 --> 00:21:06,080
Save the configuration and Claude Desktop
543
00:21:06,080 --> 00:21:07,600
will recognize the new connector.
544
00:21:07,600 --> 00:21:10,240
The moment you ask a question that needs dataverse access,
545
00:21:10,240 --> 00:21:12,480
the authentication flow starts automatically.
546
00:21:12,480 --> 00:21:13,680
Claude launches your browser
547
00:21:13,680 --> 00:21:15,760
and shows you the Enter ID sign-in screen.
548
00:21:15,760 --> 00:21:17,760
You enter your credentials and hit consent.
549
00:21:17,760 --> 00:21:19,120
The browser sends you back.
550
00:21:19,120 --> 00:21:21,520
Claude catches the callback at your configured URIL.
551
00:21:21,520 --> 00:21:23,680
And the token arrives, authentication is finished.
552
00:21:23,680 --> 00:21:25,760
This only happens once.
553
00:21:25,760 --> 00:21:27,760
The token stays in a local cache on your machine
554
00:21:27,760 --> 00:21:30,080
so your next query doesn't trigger another sign-in.
555
00:21:30,080 --> 00:21:33,360
Claude uses that cache token to make requests work instantly.
556
00:21:33,360 --> 00:21:35,440
When the token expires after an hour or so,
557
00:21:35,440 --> 00:21:37,040
Claude refreshes it automatically
558
00:21:37,040 --> 00:21:38,640
without asking you for anything.
559
00:21:38,640 --> 00:21:40,560
You never have to see the machinery.
560
00:21:40,560 --> 00:21:42,880
From your perspective, Claude has access to dataverse.
561
00:21:42,880 --> 00:21:43,680
And it just works.
562
00:21:43,680 --> 00:21:45,200
The simplicity here is the point.
563
00:21:45,200 --> 00:21:46,880
There is no proxy to install.
564
00:21:46,880 --> 00:21:48,320
No processes to manage,
565
00:21:48,320 --> 00:21:49,840
and no terminal commands to run.
566
00:21:49,840 --> 00:21:51,600
You open an app, add a connector,
567
00:21:51,600 --> 00:21:52,880
and type in a URIL.
568
00:21:52,880 --> 00:21:54,560
You authenticate once and you're done.
569
00:21:54,560 --> 00:21:56,160
This is what zero-fixion looks like.
570
00:21:56,160 --> 00:21:58,560
It's the perfect model for power users and architects
571
00:21:58,560 --> 00:21:59,760
who need to explore data.
572
00:21:59,760 --> 00:22:01,760
You can ask Claude questions about your environment
573
00:22:01,760 --> 00:22:02,960
using natural language.
574
00:22:02,960 --> 00:22:05,760
Claude uses the described table tool to learn the schema.
575
00:22:05,760 --> 00:22:08,160
Then it queries records and gives you insights.
576
00:22:08,160 --> 00:22:10,480
It all happens through one HTTP endpoint,
577
00:22:10,480 --> 00:22:12,320
secured by PKCE,
578
00:22:12,320 --> 00:22:14,560
and tracked in the dataverse logs.
579
00:22:14,560 --> 00:22:16,720
Claude code, the developers' path.
580
00:22:16,720 --> 00:22:17,840
Claude code works differently
581
00:22:17,840 --> 00:22:19,680
because it's a terminal-based environment
582
00:22:19,680 --> 00:22:20,560
rather than a GUI.
583
00:22:20,560 --> 00:22:21,760
The setup reflects that.
584
00:22:21,760 --> 00:22:23,440
Open your terminal and run the command
585
00:22:23,440 --> 00:22:24,800
to add a new MCP server.
586
00:22:24,800 --> 00:22:28,640
Claude MCP add, transport HTTP,
587
00:22:28,640 --> 00:22:33,440
client ID, plush AP, ID, DVMCP server, MCP URL.
588
00:22:33,440 --> 00:22:34,800
Put in your application ID
589
00:22:34,800 --> 00:22:37,200
and your dataverse endpoint URL and hit enter.
590
00:22:37,200 --> 00:22:39,600
Claude code registers the server immediately.
591
00:22:39,600 --> 00:22:41,920
Claude Desktop uses a settings file.
592
00:22:41,920 --> 00:22:43,600
But Claude code integrates servers
593
00:22:43,600 --> 00:22:45,840
directly into the runtime through the command line.
594
00:22:45,840 --> 00:22:47,280
This is how developers actually work.
595
00:22:47,280 --> 00:22:49,760
They are comfortable with CLI tools and setup commands.
596
00:22:49,760 --> 00:22:52,240
They would rather run a command than click through menus.
597
00:22:52,240 --> 00:22:54,160
The CLI first approach fits the workflow.
598
00:22:54,160 --> 00:22:55,600
When you launch Claude code,
599
00:22:55,600 --> 00:22:57,840
it already knows about your dataverse server.
600
00:22:57,840 --> 00:23:00,560
Run the "ash MCP" command in the chat interface
601
00:23:00,560 --> 00:23:03,280
to see your registered servers and start the login.
602
00:23:03,280 --> 00:23:04,720
Select the dataverse server
603
00:23:04,720 --> 00:23:07,440
and an authentication URL will appear in the chat.
604
00:23:07,440 --> 00:23:09,600
Copy that link and paste it into your browser,
605
00:23:09,600 --> 00:23:11,920
sign in through EntraID and grant consent.
606
00:23:11,920 --> 00:23:13,760
The browser redirects to HTTP's
607
00:23:13,760 --> 00:23:15,760
farfetched localhost, callback,
608
00:23:15,760 --> 00:23:17,680
where Claude code is already listening.
609
00:23:17,680 --> 00:23:19,680
It catches the response, the token arrives,
610
00:23:19,680 --> 00:23:20,880
and you are authenticated.
611
00:23:20,880 --> 00:23:22,320
The context is what matters here.
612
00:23:22,320 --> 00:23:24,080
Claude Desktop is for quick answers.
613
00:23:24,080 --> 00:23:25,440
But Claude code is an environment
614
00:23:25,440 --> 00:23:27,760
where you spend hours building and automating.
615
00:23:27,760 --> 00:23:29,520
The CLI setup matches that reality.
616
00:23:29,520 --> 00:23:32,240
You sign in once and Claude code keeps the session alive.
617
00:23:32,240 --> 00:23:34,240
You can query dataverse from your editor,
618
00:23:34,240 --> 00:23:35,520
pull in live schema,
619
00:23:35,520 --> 00:23:38,720
and even generate code that calls the API is directly.
620
00:23:38,720 --> 00:23:40,960
This is where the value becomes real for a developer.
621
00:23:40,960 --> 00:23:42,880
You load the tool, authenticate once,
622
00:23:42,880 --> 00:23:45,360
and every task has access to live data.
623
00:23:45,360 --> 00:23:46,560
If you are writing a plugin,
624
00:23:46,560 --> 00:23:48,080
you can query the interface.
625
00:23:48,080 --> 00:23:49,280
If you are building an app,
626
00:23:49,280 --> 00:23:51,040
you can inspect the actual tables.
627
00:23:51,040 --> 00:23:53,280
The experience shifts from guessing how the schema works
628
00:23:53,280 --> 00:23:55,120
to seeing exactly what it looks like.
629
00:23:55,120 --> 00:23:56,560
The setup is still trivial.
630
00:23:56,560 --> 00:23:58,240
You don't have to maintain a proxy
631
00:23:58,240 --> 00:24:00,400
or manage custom credentials in your code,
632
00:24:00,400 --> 00:24:02,000
but the integration is much deeper.
633
00:24:02,000 --> 00:24:03,280
You aren't just asking questions.
634
00:24:03,280 --> 00:24:04,720
You are building inside a system
635
00:24:04,720 --> 00:24:06,560
that has governed access to the data.
636
00:24:06,560 --> 00:24:08,320
Both tools use the same endpoint
637
00:24:08,320 --> 00:24:09,680
and the same audit trail.
638
00:24:09,680 --> 00:24:11,280
The only difference is how you use them.
639
00:24:11,280 --> 00:24:13,040
Desktop is for exploring,
640
00:24:13,040 --> 00:24:14,800
and Claude code is for building.
641
00:24:14,800 --> 00:24:17,840
GitHub Copilot, the Enterprise Integration.
642
00:24:17,840 --> 00:24:20,560
Copilot sits in a different place in your infrastructure than Claude.
643
00:24:20,560 --> 00:24:21,680
Claude runs on your machine.
644
00:24:21,680 --> 00:24:23,360
It's a personal tool for personal use.
645
00:24:23,360 --> 00:24:26,000
One person, one install, one conversation at a time.
646
00:24:26,000 --> 00:24:26,960
Copilot is different.
647
00:24:26,960 --> 00:24:28,880
It lives inside your development environment
648
00:24:28,880 --> 00:24:32,160
and it scales across your entire engineering organization by default.
649
00:24:32,160 --> 00:24:34,640
When you setup Copilot to use Dataverse MCP,
650
00:24:34,640 --> 00:24:36,160
you aren't just enabling one person.
651
00:24:36,160 --> 00:24:37,440
You're opening Dataverse Access
652
00:24:37,440 --> 00:24:38,960
to every developer in your company
653
00:24:38,960 --> 00:24:41,120
who touches VS Code or the command line.
654
00:24:41,120 --> 00:24:42,880
The setup itself is almost nothing.
655
00:24:42,880 --> 00:24:44,000
Open VS Code.
656
00:24:44,000 --> 00:24:45,040
Go to Settings.
657
00:24:45,040 --> 00:24:46,320
Find MCP servers.
658
00:24:46,320 --> 00:24:47,840
Select Add Custom Server.
659
00:24:47,840 --> 00:24:49,680
Choose HTTP as the transport.
660
00:24:49,680 --> 00:24:51,840
Not STDIO, not some other protocol.
661
00:24:51,840 --> 00:24:55,120
Just HTTP paste in your Dataverse MCP endpoint URL
662
00:24:55,120 --> 00:24:56,320
and your application ID.
663
00:24:56,320 --> 00:24:56,800
And that's it.
664
00:24:56,800 --> 00:24:57,680
Two fields.
665
00:24:57,680 --> 00:24:59,200
No environment variables to wire up.
666
00:24:59,200 --> 00:25:01,360
No extra config files to hunt down.
667
00:25:01,360 --> 00:25:02,800
Click Sign In.
668
00:25:02,800 --> 00:25:04,960
That click kicks off the PKCE flow
669
00:25:04,960 --> 00:25:06,880
and your browser opens automatically.
670
00:25:06,880 --> 00:25:08,480
You land on the Entra ID screen
671
00:25:08,480 --> 00:25:10,560
and sign in with your normal work credentials.
672
00:25:10,560 --> 00:25:11,920
You might see a consent dialog
673
00:25:11,920 --> 00:25:13,680
asking you to approve Copilot's Access
674
00:25:13,680 --> 00:25:15,520
to the Dataverse MCP server.
675
00:25:15,520 --> 00:25:16,560
You approve it once.
676
00:25:16,560 --> 00:25:18,960
The browser redirects back to your local endpoint,
677
00:25:18,960 --> 00:25:20,000
the token arrives,
678
00:25:20,000 --> 00:25:22,240
and authentication finishes right there.
679
00:25:22,240 --> 00:25:24,720
Copilot now has access to your Dataverse environment
680
00:25:24,720 --> 00:25:26,400
and it didn't take more than a minute.
681
00:25:26,400 --> 00:25:28,800
So what actually makes this the enterprise integration
682
00:25:28,800 --> 00:25:30,400
and not just another client?
683
00:25:30,400 --> 00:25:31,200
Scope.
684
00:25:31,200 --> 00:25:32,560
When you set this up in VS Code,
685
00:25:32,560 --> 00:25:34,080
you're doing it for yourself, sure.
686
00:25:34,080 --> 00:25:36,400
But the same configuration doesn't have to stay yours.
687
00:25:36,400 --> 00:25:37,760
Your enterprise can push this out
688
00:25:37,760 --> 00:25:39,680
to every developer machine through policy,
689
00:25:39,680 --> 00:25:40,720
through team templates,
690
00:25:40,720 --> 00:25:42,000
through whatever deployment tooling
691
00:25:42,000 --> 00:25:44,480
you already used to manage dev environments.
692
00:25:44,480 --> 00:25:46,640
One configuration, deployed once,
693
00:25:46,640 --> 00:25:48,240
available everywhere instantly.
694
00:25:48,240 --> 00:25:49,680
Every developer in your organization
695
00:25:49,680 --> 00:25:51,680
gets Dataverse access through Copilot,
696
00:25:51,680 --> 00:25:53,440
authenticated with their own credentials
697
00:25:53,440 --> 00:25:56,080
and governed by the same Dataverse roles they already have.
698
00:25:56,080 --> 00:25:58,160
Nobody gets more access than their role allows
699
00:25:58,160 --> 00:26:00,000
and nobody needs a separate setup process.
700
00:26:00,000 --> 00:26:00,800
It's the same endpoint,
701
00:26:00,800 --> 00:26:04,080
the same PKCE flow just pointed at 100 machines instead of one.
702
00:26:04,080 --> 00:26:06,480
The Copilot CLI stretches this even further.
703
00:26:06,480 --> 00:26:07,920
Developers who live in terminals,
704
00:26:07,920 --> 00:26:09,520
platform engineers, DevOps teams,
705
00:26:09,520 --> 00:26:10,560
running deployment scripts,
706
00:26:10,560 --> 00:26:12,800
none of them need a GUI to get this working.
707
00:26:12,800 --> 00:26:14,800
They authenticate to Dataverse MCP
708
00:26:14,800 --> 00:26:15,840
straight from the command line
709
00:26:15,840 --> 00:26:18,080
and start pulling schema, querying records,
710
00:26:18,080 --> 00:26:19,600
or debugging infrastructure issues
711
00:26:19,600 --> 00:26:21,280
without ever opening an editor.
712
00:26:21,280 --> 00:26:23,440
Same authentication, same authorization,
713
00:26:23,440 --> 00:26:25,600
same endpoint, just a different door into it.
714
00:26:25,600 --> 00:26:26,640
But here's the capability
715
00:26:26,640 --> 00:26:28,160
that actually separates Copilot
716
00:26:28,160 --> 00:26:29,760
from everything else we've covered.
717
00:26:29,760 --> 00:26:30,800
Agent mode.
718
00:26:30,800 --> 00:26:32,560
Copilot doesn't just answer questions
719
00:26:32,560 --> 00:26:34,000
when you ask it something.
720
00:26:34,000 --> 00:26:35,760
It can run as an autonomous agent,
721
00:26:35,760 --> 00:26:37,280
reasoning through your code base
722
00:26:37,280 --> 00:26:38,560
and taking action on its own
723
00:26:38,560 --> 00:26:40,080
within the boundaries you've set.
724
00:26:40,080 --> 00:26:41,680
When Copilot runs in Agent mode
725
00:26:41,680 --> 00:26:43,520
with Dataverse MCP attached,
726
00:26:43,520 --> 00:26:44,800
it stops being a chat window
727
00:26:44,800 --> 00:26:47,520
and starts being infrastructure your teams build on top of.
728
00:26:47,520 --> 00:26:49,120
A platform team can stand up in agent
729
00:26:49,120 --> 00:26:50,640
that understands your entire data model.
730
00:26:50,640 --> 00:26:52,560
So other teams building integrations
731
00:26:52,560 --> 00:26:55,040
don't have to relearn your schema every time.
732
00:26:55,040 --> 00:26:56,640
A DevOps team can run an agent
733
00:26:56,640 --> 00:26:58,240
that queries Dataverse directly
734
00:26:58,240 --> 00:27:00,000
to inform deployment decisions,
735
00:27:00,000 --> 00:27:01,520
checking configuration records
736
00:27:01,520 --> 00:27:02,480
or environment settings
737
00:27:02,480 --> 00:27:04,160
before a rollout goes out.
738
00:27:04,160 --> 00:27:06,640
This is exactly where Copilot splits from Claude.
739
00:27:06,640 --> 00:27:07,920
Claude is individual oriented,
740
00:27:07,920 --> 00:27:09,920
one person, one question, one answer.
741
00:27:09,920 --> 00:27:11,920
Copilot is organization oriented,
742
00:27:11,920 --> 00:27:14,240
one config deployed across every developer
743
00:27:14,240 --> 00:27:15,760
running autonomously in the background
744
00:27:15,760 --> 00:27:17,280
of your engineering process.
745
00:27:17,280 --> 00:27:19,760
The same Dataverse MCP endpoint serves both of them,
746
00:27:19,760 --> 00:27:21,600
same PKCE flow, same governance,
747
00:27:21,600 --> 00:27:22,800
same audit trail underneath,
748
00:27:22,800 --> 00:27:24,000
what changes its scale.
749
00:27:24,000 --> 00:27:26,320
When one developer uses Claude to ask a question,
750
00:27:26,320 --> 00:27:27,280
that's useful.
751
00:27:27,280 --> 00:27:29,200
When your entire engineering organization
752
00:27:29,200 --> 00:27:32,080
has Copilot agents querying Dataverse autonomously
753
00:27:32,080 --> 00:27:33,760
day and night across every team,
754
00:27:33,760 --> 00:27:34,800
that's not a tool anymore,
755
00:27:34,800 --> 00:27:35,920
that's infrastructure.
756
00:27:35,920 --> 00:27:37,280
The setup took you five minutes,
757
00:27:37,280 --> 00:27:39,040
the implications don't stop.
758
00:27:39,040 --> 00:27:42,240
The 15 tool contract, what Dataverse exposes.
759
00:27:42,240 --> 00:27:43,760
Now that you have authentication working,
760
00:27:43,760 --> 00:27:46,080
you need to understand what you have actually unlocked.
761
00:27:46,080 --> 00:27:47,440
Claude does not get a raw,
762
00:27:47,440 --> 00:27:49,360
rest API to Dataverse.
763
00:27:49,360 --> 00:27:51,760
It does not get a database driver or in SQL shell.
764
00:27:51,760 --> 00:27:54,000
It gets a carefully bounded set of tools.
765
00:27:54,000 --> 00:27:56,800
In June of 2026, Microsoft formalized this tool shape.
766
00:27:56,800 --> 00:27:58,480
It isn't a vague promise of access.
767
00:27:58,480 --> 00:28:00,800
It is a concrete contract of 15 named tools.
768
00:28:00,800 --> 00:28:02,160
This precision is important.
769
00:28:02,160 --> 00:28:03,200
It isn't a limitation.
770
00:28:03,200 --> 00:28:04,320
It's a security boundary.
771
00:28:04,320 --> 00:28:05,920
The tools break down into families.
772
00:28:05,920 --> 00:28:08,720
Discovery tools let agents explore the structure.
773
00:28:08,720 --> 00:28:11,920
The list tables tool returns every table in an environment,
774
00:28:11,920 --> 00:28:14,080
while described table returns the schema,
775
00:28:14,080 --> 00:28:15,920
including column names and relationships.
776
00:28:15,920 --> 00:28:17,280
There is also a search tool.
777
00:28:17,280 --> 00:28:19,200
It lets agents find tables by keyword.
778
00:28:19,200 --> 00:28:21,120
And agent asking Claude about your data model
779
00:28:21,120 --> 00:28:23,040
doesn't need to know the schema in advance.
780
00:28:23,040 --> 00:28:25,520
It queries these tools to learn what tables exist
781
00:28:25,520 --> 00:28:27,280
and how they relate to each other.
782
00:28:27,280 --> 00:28:29,200
Retrieval tools let agents fetch data,
783
00:28:29,200 --> 00:28:31,520
the search data tool queries records with filters.
784
00:28:31,520 --> 00:28:34,160
An agent can search for all accounts in a specific region
785
00:28:34,160 --> 00:28:36,160
or opportunities above a certain threshold.
786
00:28:36,160 --> 00:28:37,680
The query happens server side.
787
00:28:37,680 --> 00:28:40,560
Dataverse applies security, row level security,
788
00:28:40,560 --> 00:28:44,000
field level security, and any restrictions on the user identity.
789
00:28:44,000 --> 00:28:46,800
The agent only receives data the user is authorized to see.
790
00:28:46,800 --> 00:28:49,680
The tool also searches across unstructured data
791
00:28:49,680 --> 00:28:51,040
like notes and files.
792
00:28:51,040 --> 00:28:53,360
The new agentic search index makes this fast
793
00:28:53,360 --> 00:28:55,600
and that six times improvement in performance
794
00:28:55,600 --> 00:28:57,520
is something agents can use directly.
795
00:28:57,520 --> 00:28:59,600
Mutation tools let agents take action.
796
00:28:59,600 --> 00:29:01,280
Create record inserts a new row.
797
00:29:01,280 --> 00:29:03,600
Update record modifies an existing one.
798
00:29:03,600 --> 00:29:05,680
Delete record removes a record entirely.
799
00:29:05,680 --> 00:29:08,800
But deletion carries a flag, requires confirmation.
800
00:29:08,800 --> 00:29:10,560
The client, Claude or Copilot
801
00:29:10,560 --> 00:29:12,480
must show the user a confirmation dialogue
802
00:29:12,480 --> 00:29:14,000
before the deletion executes.
803
00:29:14,000 --> 00:29:15,600
There is no silent data loss.
804
00:29:15,600 --> 00:29:18,000
No agent decides on its own to destroy records
805
00:29:18,000 --> 00:29:20,560
without a human in the loop approving the action first.
806
00:29:20,560 --> 00:29:23,040
Schema tools let agents understand relationships.
807
00:29:23,040 --> 00:29:26,400
A dataverse table might have lookup fields pointing to other tables.
808
00:29:26,400 --> 00:29:28,400
A contact might have a lookup to an account.
809
00:29:28,400 --> 00:29:30,160
An agent needs to understand this graph
810
00:29:30,160 --> 00:29:33,040
to reason correctly about which queries to run.
811
00:29:33,040 --> 00:29:35,200
Schema tools expose these relationships.
812
00:29:35,200 --> 00:29:36,880
They show which fields are read only
813
00:29:36,880 --> 00:29:38,880
and which ones have validation rules.
814
00:29:38,880 --> 00:29:40,880
File tools let agents work with documents.
815
00:29:40,880 --> 00:29:42,640
Dataverse can store files
816
00:29:42,640 --> 00:29:44,880
and an agent might need to upload or retrieve one.
817
00:29:44,880 --> 00:29:48,240
The initialize upload tool creates a storage location
818
00:29:48,240 --> 00:29:50,480
while upload chunk sends the actual data.
819
00:29:50,480 --> 00:29:53,120
These tools integrate with dataverse security.
820
00:29:53,120 --> 00:29:56,240
Files inherit the security of the record they are attached to.
821
00:29:56,240 --> 00:30:00,080
Business skills tools let agents call reusable process instructions.
822
00:30:00,080 --> 00:30:02,960
A business skill is a natural language description of a process
823
00:30:02,960 --> 00:30:04,160
stored in dataverse.
824
00:30:04,160 --> 00:30:07,440
An agent can query available skills and execute them.
825
00:30:07,440 --> 00:30:09,680
This is where governance and business logic converge.
826
00:30:09,680 --> 00:30:11,680
Instead of an agent improvising its response,
827
00:30:11,680 --> 00:30:12,560
it follows a skill.
828
00:30:12,560 --> 00:30:14,160
A documented and approved procedure
829
00:30:14,160 --> 00:30:15,840
that your organization has formalized.
830
00:30:15,840 --> 00:30:17,200
Different agents.
831
00:30:17,200 --> 00:30:18,560
Same skills.
832
00:30:18,560 --> 00:30:19,920
Consistency emerges.
833
00:30:19,920 --> 00:30:23,360
Why this boundary matters is straightforward.
834
00:30:23,360 --> 00:30:26,800
You aren't giving Claude or co-pilot unrestricted access to dataverse.
835
00:30:26,800 --> 00:30:29,120
You are constraining what they can do to operations.
836
00:30:29,120 --> 00:30:30,720
You have explicitly allowed.
837
00:30:30,720 --> 00:30:32,240
An agent cannot drop tables.
838
00:30:32,240 --> 00:30:33,840
It cannot change security roles.
839
00:30:33,840 --> 00:30:35,440
It cannot execute arbitrary SQL.
840
00:30:35,440 --> 00:30:36,720
It can discover tables.
841
00:30:36,720 --> 00:30:39,440
Query records and execute pre-approved skills.
842
00:30:39,440 --> 00:30:41,200
Those constraints exist for a reason.
843
00:30:41,200 --> 00:30:42,560
Agents hallucinate.
844
00:30:42,560 --> 00:30:44,000
They misunderstand context.
845
00:30:44,000 --> 00:30:46,720
They can cause damage through confusion rather than malice.
846
00:30:46,720 --> 00:30:48,560
The 15 tool contract prevents that.
847
00:30:48,560 --> 00:30:50,720
The boundary is also about governance clarity.
848
00:30:50,720 --> 00:30:52,480
When you audit what an agent did,
849
00:30:52,480 --> 00:30:54,160
you are auditing tool calls.
850
00:30:54,160 --> 00:30:56,080
Which of the 15 tools did it invoke?
851
00:30:56,080 --> 00:30:57,520
But what parameters did it use?
852
00:30:57,520 --> 00:31:01,040
The audit trail is easy to read because the surface area is small and intentional.
853
00:31:02,000 --> 00:31:02,960
Safe mutation.
854
00:31:02,960 --> 00:31:05,040
How destructive operations get gated?
855
00:31:05,040 --> 00:31:07,600
The 15 tool contract includes something subtle.
856
00:31:07,600 --> 00:31:10,960
It's a flag on specific tools that reads requires confirmation.
857
00:31:10,960 --> 00:31:12,880
You won't see this flag on read operations.
858
00:31:12,880 --> 00:31:14,000
You can search records.
859
00:31:14,000 --> 00:31:14,960
You can list tables.
860
00:31:14,960 --> 00:31:16,960
You can pull data all day without any friction.
861
00:31:16,960 --> 00:31:18,480
But on destructive operations,
862
00:31:18,480 --> 00:31:20,000
specifically delete record.
863
00:31:20,000 --> 00:31:22,160
That flag changes the entire flow.
864
00:31:22,160 --> 00:31:24,960
When an agent tries to call delete record, it doesn't just happen.
865
00:31:24,960 --> 00:31:28,560
The MCP protocol has built in support for this exact requirement.
866
00:31:28,560 --> 00:31:30,080
The client receives a response saying
867
00:31:30,080 --> 00:31:32,960
this operation needs a human to sign off before it can proceed.
868
00:31:32,960 --> 00:31:35,120
Claude sees the flag, GitHub co-pilot sees it.
869
00:31:35,120 --> 00:31:37,200
They don't just pass the request through to dataverse.
870
00:31:37,200 --> 00:31:38,320
Instead, they stop.
871
00:31:38,320 --> 00:31:40,400
They show you a confirmation dialogue.
872
00:31:40,400 --> 00:31:42,160
This agent wants to delete a record.
873
00:31:42,160 --> 00:31:43,600
Record details.
874
00:31:43,600 --> 00:31:44,960
User.
875
00:31:44,960 --> 00:31:45,920
Who authorize this?
876
00:31:45,920 --> 00:31:46,560
Confirm?
877
00:31:46,560 --> 00:31:47,600
You see the context.
878
00:31:47,600 --> 00:31:48,880
You make the final call.
879
00:31:48,880 --> 00:31:51,360
Only if you click yes, does the actual deletion happen.
880
00:31:51,360 --> 00:31:54,560
This isn't a workaround or a hack we bolted onto the protocol later.
881
00:31:54,560 --> 00:31:57,200
It's a core feature of how MCP handles governance.
882
00:31:57,200 --> 00:31:59,200
The requires confirmation flag tells the client
883
00:31:59,200 --> 00:32:02,160
that this is a decision point where a human must step in.
884
00:32:02,160 --> 00:32:04,400
The client respects that because the major vendors,
885
00:32:04,400 --> 00:32:05,920
anthropic GitHub and others,
886
00:32:05,920 --> 00:32:08,480
know that autonomous systems touching business data
887
00:32:08,480 --> 00:32:09,680
need these checkpoints.
888
00:32:09,680 --> 00:32:10,800
Why is this non-negotiable?
889
00:32:10,800 --> 00:32:12,800
Because agents will delete records.
890
00:32:12,800 --> 00:32:14,000
Not because they're malicious,
891
00:32:14,000 --> 00:32:16,240
but because they misunderstand the prompt.
892
00:32:16,240 --> 00:32:17,840
You might say remove in active accounts,
893
00:32:17,840 --> 00:32:20,160
meaning anyone who hasn't bought anything in a year,
894
00:32:20,160 --> 00:32:21,840
the agent might interpret that as any account
895
00:32:21,840 --> 00:32:23,520
that hasn't been touched today.
896
00:32:23,520 --> 00:32:24,720
Before you realize what's happening
897
00:32:24,720 --> 00:32:26,560
an entire year of data is gone.
898
00:32:26,560 --> 00:32:27,600
With the confirmation flag,
899
00:32:27,600 --> 00:32:29,360
you get a dialog box that shows you the scope.
900
00:32:29,360 --> 00:32:31,440
You see the mistake before it becomes permanent.
901
00:32:31,440 --> 00:32:33,280
This also solves the regulatory problem.
902
00:32:33,280 --> 00:32:35,040
In healthcare, HIPAA requires you to prove
903
00:32:35,040 --> 00:32:37,440
who authorized the deletion of sensitive data.
904
00:32:37,440 --> 00:32:41,040
In finance, SOIX demands an approval chain for every modification.
905
00:32:41,040 --> 00:32:44,400
A confirmation dialog in co-pilot or Claude
906
00:32:44,400 --> 00:32:46,320
paired with the audit trail gives you that evidence.
907
00:32:46,320 --> 00:32:48,080
A regulator can look at the logs
908
00:32:48,080 --> 00:32:50,240
and see the agent requested the delete.
909
00:32:50,240 --> 00:32:51,600
The user saw the prompt
910
00:32:51,600 --> 00:32:53,440
and the user clicked approve.
911
00:32:53,440 --> 00:32:56,320
The chain is unbroken and the authorization is fully documented.
912
00:32:56,320 --> 00:32:59,040
The audit trail is the second half of the safety net.
913
00:32:59,040 --> 00:33:01,680
Every single tool call, whether you confirm it or not,
914
00:33:01,680 --> 00:33:03,920
gets logged in the dataverse audit system.
915
00:33:03,920 --> 00:33:06,320
It tracks who called it, which agent was used,
916
00:33:06,320 --> 00:33:08,720
what the parameters were, and exactly when it happened.
917
00:33:08,720 --> 00:33:11,520
The confirmation dialog adds another layer to that log.
918
00:33:11,520 --> 00:33:13,360
It records that a confirmation was requested
919
00:33:13,360 --> 00:33:15,440
and shows whether the user said yes or no.
920
00:33:15,440 --> 00:33:16,880
If the deletion went through,
921
00:33:16,880 --> 00:33:18,640
the audit trail shows your approval,
922
00:33:18,640 --> 00:33:19,920
but if you clicked no,
923
00:33:19,920 --> 00:33:21,840
it shows the agent's request was denied.
924
00:33:21,840 --> 00:33:24,800
This trail is your forensic evidence for when things go wrong.
925
00:33:24,800 --> 00:33:27,120
If a record vanishes and nobody knows why,
926
00:33:27,120 --> 00:33:28,720
you just pull the audit log.
927
00:33:28,720 --> 00:33:30,320
You can see which agent tried to kill it,
928
00:33:30,320 --> 00:33:32,320
who approved it, and exactly what was lost.
929
00:33:32,320 --> 00:33:33,760
The entire history is right there,
930
00:33:33,760 --> 00:33:35,440
tamper evident and immutable.
931
00:33:35,440 --> 00:33:36,960
The difference between a powerful system
932
00:33:36,960 --> 00:33:39,200
and a reckless one is this checkpoint.
933
00:33:39,200 --> 00:33:41,520
A powerful system lets agents take action,
934
00:33:41,520 --> 00:33:43,360
but a reckless one gives them that power
935
00:33:43,360 --> 00:33:44,640
without any oversight.
936
00:33:44,640 --> 00:33:46,560
Dataverse MCP with the confirmation flag
937
00:33:46,560 --> 00:33:48,560
gives you the power with a built-in circuit breaker.
938
00:33:48,560 --> 00:33:50,720
The agent can do real work like creating records
939
00:33:50,720 --> 00:33:51,840
or modifying data,
940
00:33:51,840 --> 00:33:53,840
but on the operations that can't be undone,
941
00:33:53,840 --> 00:33:57,120
you get one last chance to catch a disaster before it happens.
942
00:33:57,120 --> 00:33:58,240
The governance layer,
943
00:33:58,240 --> 00:34:00,000
controlling who accesses what?
944
00:34:00,000 --> 00:34:02,240
You've authenticated Claude to Dataverse.
945
00:34:02,240 --> 00:34:04,560
You've made sure mutations require approval.
946
00:34:04,560 --> 00:34:05,840
Now we have to answer the question
947
00:34:05,840 --> 00:34:08,080
that keeps security teams awake at night.
948
00:34:08,080 --> 00:34:10,000
How do you control which Claude instances
949
00:34:10,000 --> 00:34:11,440
can talk to which environments?
950
00:34:11,440 --> 00:34:13,280
And how do you stop an authenticated agent
951
00:34:13,280 --> 00:34:14,800
from seeing data it shouldn't?
952
00:34:14,800 --> 00:34:16,080
The answer lives in layers.
953
00:34:16,080 --> 00:34:17,920
The first layer is the environment allow list
954
00:34:17,920 --> 00:34:19,600
in the Power Platform Admin Center.
955
00:34:19,600 --> 00:34:21,440
When you registered your EntraID app,
956
00:34:21,440 --> 00:34:24,640
you had to add it to a list for a specific Dataverse environment.
957
00:34:24,640 --> 00:34:27,440
This isn't an optional setting, it's a hard gate.
958
00:34:27,440 --> 00:34:30,400
If an app isn't on that list, it cannot connect, period.
959
00:34:30,400 --> 00:34:32,800
If you have dev, staging, and production environments,
960
00:34:32,800 --> 00:34:34,960
you can add your app to dev and staging,
961
00:34:34,960 --> 00:34:36,400
but leave production locked.
962
00:34:36,400 --> 00:34:38,080
Claude talking to your test data is fine,
963
00:34:38,080 --> 00:34:40,720
but Claude talking to your live customer data is forbidden.
964
00:34:40,720 --> 00:34:43,280
The allow list makes that a technical impossibility
965
00:34:43,280 --> 00:34:44,960
rather than just a policy hope.
966
00:34:44,960 --> 00:34:47,760
This matters because it prevents accidental scope creep.
967
00:34:47,760 --> 00:34:50,880
Maybe you set up Dataverse MCP for a small internal test,
968
00:34:50,880 --> 00:34:52,960
but six months later, a deployment script
969
00:34:52,960 --> 00:34:53,920
runs in the wrong place.
970
00:34:53,920 --> 00:34:55,760
Without the allow list, that mistake could expose
971
00:34:55,760 --> 00:34:57,680
your production data, but with the list,
972
00:34:57,680 --> 00:34:59,680
the connection just fails at the protocol level,
973
00:34:59,680 --> 00:35:01,520
no access, no risk, no incident.
974
00:35:01,520 --> 00:35:03,440
The second layer is Dataverse roles.
975
00:35:03,440 --> 00:35:05,600
You've authenticated as a specific user,
976
00:35:05,600 --> 00:35:08,000
and that user has roles like System Administrator
977
00:35:08,000 --> 00:35:08,880
or Sales Manager.
978
00:35:08,880 --> 00:35:10,640
Those roles have specific permissions.
979
00:35:10,640 --> 00:35:13,200
This account can create records but not delete them.
980
00:35:13,200 --> 00:35:15,600
That account can read opportunities but not close them.
981
00:35:15,600 --> 00:35:18,400
These permissions aren't new to MCP,
982
00:35:18,400 --> 00:35:22,000
they're the same ones, power apps and Dynamics 365 use every day.
983
00:35:22,000 --> 00:35:23,120
Here's the critical insight.
984
00:35:23,120 --> 00:35:25,280
The MCP server is just a thin layer.
985
00:35:25,280 --> 00:35:26,720
It isn't a new security boundary
986
00:35:26,720 --> 00:35:28,720
that tries to reinvent access control.
987
00:35:28,720 --> 00:35:30,320
It's just a protocol translator.
988
00:35:30,320 --> 00:35:32,560
When an agent calls the CreateRecord tool,
989
00:35:32,560 --> 00:35:35,280
Dataverse doesn't care that the request came through MCP.
990
00:35:35,280 --> 00:35:37,440
It applies the same role checks it always does.
991
00:35:37,440 --> 00:35:38,880
It asks if this user has permission
992
00:35:38,880 --> 00:35:40,480
to create records in this table,
993
00:35:40,480 --> 00:35:42,560
and if they don't, the tool call fails.
994
00:35:42,560 --> 00:35:44,480
The agent gets an error and the human sees
995
00:35:44,480 --> 00:35:45,920
that the action wasn't allowed.
996
00:35:45,920 --> 00:35:48,560
The third layer is Row Level and Field Level Security.
997
00:35:48,560 --> 00:35:49,680
These are the granular features
998
00:35:49,680 --> 00:35:52,320
that let you restrict access down to the specific cell.
999
00:35:52,320 --> 00:35:54,480
Maybe your sales team can see all accounts,
1000
00:35:54,480 --> 00:35:57,040
but only the opportunities they actually own.
1001
00:35:57,040 --> 00:35:59,120
Maybe Finance can see the transaction amounts,
1002
00:35:59,120 --> 00:36:01,360
but they can't see the customer's payment method.
1003
00:36:01,360 --> 00:36:03,360
These rules are defined inside Dataverse
1004
00:36:03,360 --> 00:36:04,880
and they apply to everyone,
1005
00:36:04,880 --> 00:36:07,440
whether they're using a REST API or MCP.
1006
00:36:07,440 --> 00:36:09,920
If an agent queries data the user isn't allowed to see,
1007
00:36:09,920 --> 00:36:11,840
those roles simply won't appear in the results.
1008
00:36:11,840 --> 00:36:14,640
To the agent, it just looks like those records don't exist.
1009
00:36:14,640 --> 00:36:16,240
The fourth layer is Business Rules.
1010
00:36:16,240 --> 00:36:17,760
Dataverse lets you define logic
1011
00:36:17,760 --> 00:36:20,160
where changing one field triggers another action.
1012
00:36:20,160 --> 00:36:22,560
Maybe when an opportunity is marked as one,
1013
00:36:22,560 --> 00:36:25,040
the system automatically creates an invoice.
1014
00:36:25,040 --> 00:36:27,280
When an agent updates a status through MCP,
1015
00:36:27,280 --> 00:36:28,880
that business rule still fires.
1016
00:36:28,880 --> 00:36:30,720
The same automation that runs for a human
1017
00:36:30,720 --> 00:36:33,200
in a PowerApp runs for the agent in MCP.
1018
00:36:33,200 --> 00:36:35,440
The agent doesn't even need to know the rules exist
1019
00:36:35,440 --> 00:36:37,440
because they are part of the system's DNA.
1020
00:36:37,440 --> 00:36:38,560
This is fundamentally different
1021
00:36:38,560 --> 00:36:40,800
from just giving an LLM access to a database.
1022
00:36:40,800 --> 00:36:43,040
A raw database connection gives you a SQL,
1023
00:36:43,040 --> 00:36:44,800
which lets you query or modify anything
1024
00:36:44,800 --> 00:36:46,160
while bypassing constraints.
1025
00:36:46,160 --> 00:36:47,920
In that world, you have to trust the person
1026
00:36:47,920 --> 00:36:49,280
you're giving access to.
1027
00:36:49,280 --> 00:36:51,680
Dataverse MCP gives you a governed interface instead.
1028
00:36:51,680 --> 00:36:53,520
The allowless controls the environment,
1029
00:36:53,520 --> 00:36:55,200
the roles control the records,
1030
00:36:55,200 --> 00:36:57,680
and the field security controls the granularity.
1031
00:36:57,680 --> 00:36:59,040
An agent can do real work,
1032
00:36:59,040 --> 00:37:01,680
but it stays inside the boundaries you've already built.
1033
00:37:01,680 --> 00:37:03,840
The system enforces those limits automatically.
1034
00:37:03,840 --> 00:37:05,680
You don't have to audit every single move
1035
00:37:05,680 --> 00:37:07,520
to make sure the agent's stayed in bounds.
1036
00:37:07,520 --> 00:37:09,520
The bounds are built into the platform itself.
1037
00:37:09,520 --> 00:37:12,480
Observability, seeing what agents do.
1038
00:37:12,480 --> 00:37:14,400
We've spent a lot of time talking about what Claude
1039
00:37:14,400 --> 00:37:16,160
or GitHub co-pilot can actually do.
1040
00:37:16,160 --> 00:37:18,320
We've looked at the constraints and the permissions,
1041
00:37:18,320 --> 00:37:19,760
but there's another side to governance
1042
00:37:19,760 --> 00:37:21,040
that matters just as much.
1043
00:37:21,040 --> 00:37:23,600
What can you actually see after the agent takes an action?
1044
00:37:23,600 --> 00:37:26,080
The moment an agent calls a tool, that action is recorded.
1045
00:37:26,080 --> 00:37:28,000
It doesn't matter if it's just looking up a record
1046
00:37:28,000 --> 00:37:29,440
or creating a brand new one.
1047
00:37:29,440 --> 00:37:30,960
That call gets logged immediately.
1048
00:37:30,960 --> 00:37:32,800
This isn't happening in some separate audit system
1049
00:37:32,800 --> 00:37:34,240
that you have to bolt on later.
1050
00:37:34,240 --> 00:37:36,320
It's logged directly into the Dataverse audit trail.
1051
00:37:36,320 --> 00:37:37,600
This is the same permanent record
1052
00:37:37,600 --> 00:37:39,840
that tracks when a human changes a field in PowerApps
1053
00:37:39,840 --> 00:37:41,280
or when a flow updates a row.
1054
00:37:41,280 --> 00:37:43,600
From the perspective of Dataverse and agents' actions
1055
00:37:43,600 --> 00:37:45,200
look exactly like human actions.
1056
00:37:45,200 --> 00:37:47,760
They are both just modifications to the system of record.
1057
00:37:47,760 --> 00:37:50,080
The log captures every specific detail you need.
1058
00:37:50,080 --> 00:37:51,840
It tracks which agent made the request.
1059
00:37:51,840 --> 00:37:55,040
This is vital because you might have several Claude instances running at once.
1060
00:37:55,040 --> 00:37:57,040
You might have different versions of GitHub co-pilot
1061
00:37:57,040 --> 00:38:00,160
across different teams or custom orchestrators for specific jobs.
1062
00:38:00,160 --> 00:38:02,720
When something breaks, you have to know which specific agent did it.
1063
00:38:02,720 --> 00:38:04,480
The audit trail gives you that answer.
1064
00:38:04,480 --> 00:38:07,040
It also records which user was authenticated at the time.
1065
00:38:07,040 --> 00:38:08,640
An agent never acts alone.
1066
00:38:08,640 --> 00:38:10,160
It acts on behalf of a person.
1067
00:38:10,160 --> 00:38:12,400
That person's identity is baked into the record.
1068
00:38:12,400 --> 00:38:13,520
Then you have the tool itself.
1069
00:38:13,520 --> 00:38:17,360
The log shows if it used search data, create record or update record.
1070
00:38:17,360 --> 00:38:20,160
It captures the parameters like which table was queried
1071
00:38:20,160 --> 00:38:21,520
and which fields were changed.
1072
00:38:21,520 --> 00:38:23,840
It marks the exact time down to the millisecond.
1073
00:38:23,840 --> 00:38:25,600
Finally, it shows if the action worked.
1074
00:38:25,600 --> 00:38:27,200
If an agent tried to create a record
1075
00:38:27,200 --> 00:38:28,400
but hit a validation rule,
1076
00:38:28,400 --> 00:38:30,240
the audit log catches that failure.
1077
00:38:30,240 --> 00:38:32,320
The fact that these logs are tamper evident
1078
00:38:32,320 --> 00:38:33,920
is the most important part.
1079
00:38:33,920 --> 00:38:35,600
These records are append-only.
1080
00:38:35,600 --> 00:38:37,360
You can read them and you can query them,
1081
00:38:37,360 --> 00:38:38,560
but you cannot change them.
1082
00:38:38,560 --> 00:38:42,080
You can't delete a single entry just because you want to hide a mistake.
1083
00:38:42,080 --> 00:38:43,680
The logs use cryptographic chaining
1084
00:38:43,680 --> 00:38:45,840
where every entry points to the one before it.
1085
00:38:45,840 --> 00:38:47,440
If an attacker gets into the storage
1086
00:38:47,440 --> 00:38:50,480
and tries to forge or delete a line, the chain breaks.
1087
00:38:50,480 --> 00:38:52,880
Any standard audit review will see that break
1088
00:38:52,880 --> 00:38:54,560
and know something was erased.
1089
00:38:54,560 --> 00:38:56,880
This isn't just theoretical security theatre.
1090
00:38:56,880 --> 00:38:59,520
It's a technical wall that keeps the audit trail honest.
1091
00:38:59,520 --> 00:39:02,320
That trail then feeds into your main compliance setup.
1092
00:39:02,320 --> 00:39:04,560
If you use a CM for security monitoring,
1093
00:39:04,560 --> 00:39:07,040
you can pull these data verse logs right into it.
1094
00:39:07,040 --> 00:39:11,200
Your security team can see agent activity sitting right next to everything else in the company.
1095
00:39:11,200 --> 00:39:13,120
You can even set up automated alerts.
1096
00:39:13,120 --> 00:39:15,920
If an agent tries to delete more than three records in an hour,
1097
00:39:15,920 --> 00:39:17,280
you get a notification.
1098
00:39:17,280 --> 00:39:19,840
If it starts querying sensitive tables in the middle of the night,
1099
00:39:19,840 --> 00:39:21,040
it gets flagged.
1100
00:39:21,040 --> 00:39:23,280
The audit trail stops being a dusty history book
1101
00:39:23,280 --> 00:39:25,120
and starts being a live security tool.
1102
00:39:25,120 --> 00:39:27,440
We can go even deeper with open telemetry support.
1103
00:39:27,440 --> 00:39:29,040
This is a standard for distributed tracing
1104
00:39:29,040 --> 00:39:32,160
that lets you follow one request through every system it touches.
1105
00:39:32,160 --> 00:39:34,480
An agent query might hit data verse,
1106
00:39:34,480 --> 00:39:36,000
which triggers a business rule
1107
00:39:36,000 --> 00:39:39,760
which then calls a power automate flow that talks to an external API.
1108
00:39:39,760 --> 00:39:41,280
All of that shows up as one single trace.
1109
00:39:41,280 --> 00:39:44,240
You can see the whole flow and find exactly where the bottlenecks are.
1110
00:39:44,240 --> 00:39:47,200
For compliance, it means you can trace a data change from start to finish.
1111
00:39:47,200 --> 00:39:49,120
You don't just see that an agent made a change.
1112
00:39:49,120 --> 00:39:50,720
You see everything that happened because of it.
1113
00:39:50,720 --> 00:39:52,480
This changes your relationship with AI
1114
00:39:52,480 --> 00:39:54,560
from a black box to total transparency.
1115
00:39:54,560 --> 00:39:56,560
You aren't just hoping the agent behaves well.
1116
00:39:56,560 --> 00:39:58,080
You are watching it behave in real time.
1117
00:39:58,080 --> 00:40:01,760
You are capturing every move and plugging it into your existing security world.
1118
00:40:01,760 --> 00:40:02,880
If something goes wrong,
1119
00:40:02,880 --> 00:40:06,080
the audit trail tells you what happened when it happened and who was involved.
1120
00:40:06,080 --> 00:40:07,200
That isn't blind trust.
1121
00:40:07,200 --> 00:40:08,400
That's governed autonomy.
1122
00:40:08,400 --> 00:40:10,960
The fabric model from point integration to platform.
1123
00:40:10,960 --> 00:40:13,280
Everything we've talked about, the logins, the governance,
1124
00:40:13,280 --> 00:40:16,480
the audit trails only really make sense when you look at the big picture.
1125
00:40:16,480 --> 00:40:18,960
We are seeing a massive shift in how systems are built.
1126
00:40:18,960 --> 00:40:20,480
We think about how we used to do this.
1127
00:40:20,480 --> 00:40:23,280
Claude needed to talk to data verse, so you built a proxy,
1128
00:40:23,280 --> 00:40:24,720
GitHub co-pilot needed access,
1129
00:40:24,720 --> 00:40:26,320
so you built another integration.
1130
00:40:26,320 --> 00:40:27,920
Then a custom orchestrator came along
1131
00:40:27,920 --> 00:40:29,440
and you built a third one.
1132
00:40:29,440 --> 00:40:33,040
Even Dynamics 365 co-pilot needed its own separate configuration.
1133
00:40:33,040 --> 00:40:36,960
Every single connection had its own login flow and its own security model.
1134
00:40:36,960 --> 00:40:39,920
Each one had its own set of rules and its own maintenance list.
1135
00:40:39,920 --> 00:40:41,600
You weren't running a single system.
1136
00:40:41,600 --> 00:40:44,400
You were managing a messy pile of one-to-one connections.
1137
00:40:44,400 --> 00:40:45,920
Every piece was a new burden.
1138
00:40:45,920 --> 00:40:48,640
This way of building is tempting because it works at first.
1139
00:40:48,640 --> 00:40:51,120
You can tweak each connection for one specific tool,
1140
00:40:51,120 --> 00:40:54,240
but it creates a mountain of technical debt that just keeps growing.
1141
00:40:54,240 --> 00:40:57,280
If you have 10 integrations, you need 10 sets of documents.
1142
00:40:57,280 --> 00:41:00,800
You have 10 different ways to manage secrets and 10 different ways to monitor them.
1143
00:41:00,800 --> 00:41:03,280
If a security hole pops up in how you handle credentials,
1144
00:41:03,280 --> 00:41:05,200
you have to fix it in 10 different places.
1145
00:41:05,200 --> 00:41:06,880
When a new tool comes out that you want to try,
1146
00:41:06,880 --> 00:41:08,160
you have to start from scratch.
1147
00:41:08,160 --> 00:41:11,200
That means weeks or months of work just to get connected.
1148
00:41:11,200 --> 00:41:13,120
Then you have to maintain that code forever.
1149
00:41:13,120 --> 00:41:15,120
The fabric model flips this completely.
1150
00:41:15,120 --> 00:41:18,640
Data verse provides one single endpoint that endpoint uses one way to login,
1151
00:41:18,640 --> 00:41:20,240
PKCE with EntraID.
1152
00:41:20,240 --> 00:41:21,840
It offers one standard set of tools.
1153
00:41:21,840 --> 00:41:26,160
Any client that understands the MCP protocol and PKCE can connect to it.
1154
00:41:26,160 --> 00:41:28,560
Any of them, it's not just Claude and Copilot.
1155
00:41:28,560 --> 00:41:32,240
It's literally anything, Claude, custom agents, or even tools from other vendors.
1156
00:41:32,240 --> 00:41:34,080
They all see the exact same data verse.
1157
00:41:34,080 --> 00:41:36,720
They all log in the same way and follow the same rules.
1158
00:41:36,720 --> 00:41:38,480
They all write to the same audit trail.
1159
00:41:38,480 --> 00:41:40,400
The fabric isn't a bunch of loose strings.
1160
00:41:40,400 --> 00:41:41,600
It's a solid weave.
1161
00:41:41,600 --> 00:41:44,800
This standardization isn't about forcing everyone to be identical.
1162
00:41:44,800 --> 00:41:46,960
It's about creating a contract that is so clear
1163
00:41:46,960 --> 00:41:48,720
that different tools can work together
1164
00:41:48,720 --> 00:41:50,640
without even knowing the others exist.
1165
00:41:50,640 --> 00:41:53,360
Claude doesn't need to care how GitHub Copilot logs in.
1166
00:41:53,360 --> 00:41:56,480
Copilot doesn't need to know anything about Claude's internal setup.
1167
00:41:56,480 --> 00:41:59,840
They don't have to talk to each other because they both know how to speak MCP.
1168
00:41:59,840 --> 00:42:02,320
Data verse just speaks that one language back to everyone.
1169
00:42:02,320 --> 00:42:04,080
This changes everything for your operations.
1170
00:42:04,080 --> 00:42:06,800
Today, adding a new tool takes weeks of engineering.
1171
00:42:06,800 --> 00:42:08,960
Under the fabric model, it takes minutes.
1172
00:42:08,960 --> 00:42:11,120
If a vendor drops a new AI tool tomorrow,
1173
00:42:11,120 --> 00:42:12,000
you just plug it in.
1174
00:42:12,000 --> 00:42:15,280
You give it the URL, the ID, and the redirect info.
1175
00:42:15,280 --> 00:42:16,000
That's it.
1176
00:42:16,000 --> 00:42:19,200
It immediately gets the same data and the same tools as everything else.
1177
00:42:19,200 --> 00:42:21,920
It follows the same governance and writes to the same logs.
1178
00:42:21,920 --> 00:42:23,680
There is no custom integration work
1179
00:42:23,680 --> 00:42:25,440
because the contract is already there.
1180
00:42:25,440 --> 00:42:27,200
The cost of governance basically disappears.
1181
00:42:27,200 --> 00:42:29,600
You aren't managing 10 different access policies anymore.
1182
00:42:29,600 --> 00:42:30,560
You are managing one.
1183
00:42:30,560 --> 00:42:32,800
You have one set of roles and one set of security rules.
1184
00:42:32,800 --> 00:42:35,920
You have one business rule engine and one audit system.
1185
00:42:35,920 --> 00:42:38,240
If you need to change who can see certain data,
1186
00:42:38,240 --> 00:42:40,240
you change it once and it works everywhere.
1187
00:42:40,240 --> 00:42:42,000
If you want to give your agents a new skill,
1188
00:42:42,000 --> 00:42:44,960
you define that tool once and every agent can use it instantly.
1189
00:42:44,960 --> 00:42:46,560
Compliance gets much simpler too.
1190
00:42:46,560 --> 00:42:48,560
When an auditor asks who accessed your data,
1191
00:42:48,560 --> 00:42:50,640
you don't have to hunt through 10 different logs.
1192
00:42:50,640 --> 00:42:52,400
You have one single source of truth.
1193
00:42:52,400 --> 00:42:54,640
Every action from every tool shows up in that same
1194
00:42:54,640 --> 00:42:56,000
tamper evident trail.
1195
00:42:56,000 --> 00:42:57,200
The story is consistent.
1196
00:42:57,200 --> 00:42:58,240
This is how you scale.
1197
00:42:58,240 --> 00:42:59,920
You might start with Claude and co-pilot,
1198
00:42:59,920 --> 00:43:01,760
then add a custom orchestrator later.
1199
00:43:01,760 --> 00:43:04,080
Maybe you add a third party platform after that.
1200
00:43:04,080 --> 00:43:06,080
By the time you get to your 10th tool,
1201
00:43:06,080 --> 00:43:07,840
your costs haven't actually gone up.
1202
00:43:07,840 --> 00:43:09,840
But it's still just an endpoint and a login.
1203
00:43:09,840 --> 00:43:12,080
The fabric doesn't break down as you add more pieces
1204
00:43:12,080 --> 00:43:14,240
because you aren't adding more complexity.
1205
00:43:14,240 --> 00:43:15,920
You are just plugging into the same surface.
1206
00:43:15,920 --> 00:43:18,080
This architecture is built to last for years
1207
00:43:18,080 --> 00:43:19,600
because it's based on a standard.
1208
00:43:19,600 --> 00:43:22,480
It doesn't rely on what one specific vendor wants to do today.
1209
00:43:22,480 --> 00:43:25,360
If Microsoft updates dataverse, the contract stays the same.
1210
00:43:25,360 --> 00:43:28,000
If anthropic updates Claude, the contract stays the same.
1211
00:43:28,000 --> 00:43:30,720
The fabric lasts because it's built on a shared language,
1212
00:43:30,720 --> 00:43:31,760
not a one-off hack.
1213
00:43:31,760 --> 00:43:35,200
Token efficiency, the hidden ROI.
1214
00:43:35,200 --> 00:43:38,720
Most teams don't talk about the actual cost of building AI integrations,
1215
00:43:38,720 --> 00:43:40,080
but here's the problem.
1216
00:43:40,080 --> 00:43:43,200
You want Claude to answer a question about your dataverse records.
1217
00:43:43,200 --> 00:43:46,160
The naive approach is to stuff the entire schema into the prompt.
1218
00:43:46,160 --> 00:43:47,120
You list every table.
1219
00:43:47,120 --> 00:43:48,160
You describe every column.
1220
00:43:48,160 --> 00:43:51,120
You include sample data so Claude understands what lives where.
1221
00:43:51,120 --> 00:43:52,720
You might even throw in business context,
1222
00:43:52,720 --> 00:43:54,960
like what the tables mean or how they relate.
1223
00:43:54,960 --> 00:43:57,440
All of that goes into the system prompt or the user's query.
1224
00:43:57,440 --> 00:43:59,200
Now run that query and count the tokens.
1225
00:43:59,200 --> 00:44:02,000
The schema alone runs 5,000 to 10,000 tokens.
1226
00:44:02,000 --> 00:44:04,960
Sample data adds another 3,000 to 5,000.
1227
00:44:04,960 --> 00:44:06,560
Business context adds even more.
1228
00:44:06,560 --> 00:44:08,960
By the time Claude even understands your environment,
1229
00:44:08,960 --> 00:44:11,920
you're at 10,000 to 50,000 tokens just for the setup.
1230
00:44:11,920 --> 00:44:13,840
That's before Claude even answers the actual question.
1231
00:44:13,840 --> 00:44:16,720
At current pricing, you're paying 15 cents
1232
00:44:16,720 --> 00:44:19,120
to a $1.50 per query just in overhead.
1233
00:44:19,120 --> 00:44:21,120
If you run 100 queries a day,
1234
00:44:21,120 --> 00:44:23,680
you're burning hundreds of dollars on redundant context.
1235
00:44:23,680 --> 00:44:26,240
If you have a support team running 1,000 queries,
1236
00:44:26,240 --> 00:44:28,480
you're losing thousands of dollars every single day.
1237
00:44:28,480 --> 00:44:29,200
The math breaks.
1238
00:44:29,200 --> 00:44:31,920
Now contrast that with the MCP approach.
1239
00:44:31,920 --> 00:44:33,920
Claude doesn't load the schema into memory upfront.
1240
00:44:33,920 --> 00:44:36,960
Instead, when it needs to understand your dataverse,
1241
00:44:36,960 --> 00:44:37,840
it uses a tool.
1242
00:44:37,840 --> 00:44:41,440
Claude asks, what does the account table look like?
1243
00:44:41,440 --> 00:44:44,480
The tool returns only the schema for that specific table.
1244
00:44:44,480 --> 00:44:45,840
200 tokens, that's it.
1245
00:44:45,840 --> 00:44:48,000
Claude doesn't get a dump of every table you own.
1246
00:44:48,000 --> 00:44:49,200
It gets exactly what it asked for.
1247
00:44:49,200 --> 00:44:51,280
When it needs sample data, it calls the search tool
1248
00:44:51,280 --> 00:44:52,800
and retrieves three examples.
1249
00:44:52,800 --> 00:44:55,040
Not the entire table, just a few hundred tokens.
1250
00:44:55,040 --> 00:44:56,880
The result is a massive shift in efficiency.
1251
00:44:56,880 --> 00:44:58,880
Instead of 50,000 tokens of context,
1252
00:44:58,880 --> 00:44:59,840
you're at 500.
1253
00:44:59,840 --> 00:45:01,680
That's an 80% reduction in overhead.
1254
00:45:01,680 --> 00:45:04,720
The impact compounds across every single query you run.
1255
00:45:04,720 --> 00:45:08,160
In the old model, you have to include every schema upfront just in case.
1256
00:45:08,160 --> 00:45:11,440
With MCP, Claude asks for what it needs as it needs it.
1257
00:45:11,440 --> 00:45:13,440
If a query only requires the account schema,
1258
00:45:13,440 --> 00:45:14,640
you only pay for that.
1259
00:45:14,640 --> 00:45:16,800
The cost reflects the actual complexity,
1260
00:45:16,800 --> 00:45:19,040
not a static overhead that waste your budget.
1261
00:45:19,040 --> 00:45:20,800
Here's where this becomes a financial reality.
1262
00:45:20,800 --> 00:45:24,240
A support agent that costs $2 per interaction under the old model
1263
00:45:24,240 --> 00:45:26,640
costs 40 cents under the MCP approach.
1264
00:45:26,640 --> 00:45:29,600
Same agent, same results, one waste's money on duplication
1265
00:45:29,600 --> 00:45:30,560
and the other doesn't.
1266
00:45:30,560 --> 00:45:32,080
Scale that across your organization.
1267
00:45:32,080 --> 00:45:33,680
If you run 50 agents,
1268
00:45:33,680 --> 00:45:35,520
you aren't looking at a small difference.
1269
00:45:35,520 --> 00:45:37,760
You're looking at an 80-dollar daily saving.
1270
00:45:37,760 --> 00:45:39,600
That's $24,000 a year,
1271
00:45:39,600 --> 00:45:41,920
or because of a single architectural choice.
1272
00:45:41,920 --> 00:45:43,760
But the benefit isn't just about the money.
1273
00:45:43,760 --> 00:45:46,000
Fewer tokens mean faster responses.
1274
00:45:46,000 --> 00:45:49,280
Claude processes smaller context windows much more quickly.
1275
00:45:49,280 --> 00:45:51,680
It focuses its reasoning on what actually matters.
1276
00:45:51,680 --> 00:45:53,040
The data and the question.
1277
00:45:53,040 --> 00:45:57,360
The quality of the answer improves because Claude isn't distracted by a relevant noise.
1278
00:45:57,360 --> 00:46:00,000
The user gets a faster, more accurate experience.
1279
00:46:00,000 --> 00:46:01,760
This is why the business case for MCP
1280
00:46:01,760 --> 00:46:03,360
isn't just about better technology.
1281
00:46:03,360 --> 00:46:06,160
It's about a system that pays for itself while performing better.
1282
00:46:06,160 --> 00:46:09,120
From semantic kernel to agent framework,
1283
00:46:09,120 --> 00:46:10,640
the platform succession.
1284
00:46:10,640 --> 00:46:12,960
A decade ago, if you wanted to orchestrate an LLM,
1285
00:46:12,960 --> 00:46:14,640
you used semantic kernel.
1286
00:46:14,640 --> 00:46:17,840
Microsoft released it as a general SDK for building intelligent apps.
1287
00:46:17,840 --> 00:46:19,120
The mental model was simple.
1288
00:46:19,120 --> 00:46:21,280
You had a kernel, you loaded plugins,
1289
00:46:21,280 --> 00:46:24,000
you executed planners to decide which plugins to call.
1290
00:46:24,000 --> 00:46:26,560
It worked and teams built real systems on it.
1291
00:46:26,560 --> 00:46:28,800
Some of those integrations are still running today.
1292
00:46:28,800 --> 00:46:30,880
But semantic kernel was born in a different era.
1293
00:46:30,880 --> 00:46:33,920
The assumption back then was that your application would be a single unit.
1294
00:46:33,920 --> 00:46:37,280
One app, one kernel, one orchestration engine.
1295
00:46:37,280 --> 00:46:40,320
The framework assumed you owned both the AI and the application.
1296
00:46:40,320 --> 00:46:42,880
You were weaving them together inside your own codebase.
1297
00:46:42,880 --> 00:46:44,080
It was SDK-centric.
1298
00:46:44,080 --> 00:46:45,920
You wrote code, you imported a library,
1299
00:46:45,920 --> 00:46:48,000
and you extended it, everything lived in the code.
1300
00:46:48,000 --> 00:46:49,200
That assumption has inverted.
1301
00:46:49,200 --> 00:46:53,600
Today, you aren't building one LLM inside one app.
1302
00:46:53,600 --> 00:46:56,240
You're building multiple agents that live in different places.
1303
00:46:56,240 --> 00:46:59,360
Co-pilot studio, GitHub Co-pilot, custom orchestrators.
1304
00:46:59,360 --> 00:47:01,600
They all need to talk to the same business data.
1305
00:47:01,600 --> 00:47:03,840
The agent is no longer bundled with your application.
1306
00:47:03,840 --> 00:47:07,440
The agent is a separate runtime that calls your data through a protocol.
1307
00:47:07,440 --> 00:47:09,840
The framework can't be SDK-centric anymore.
1308
00:47:09,840 --> 00:47:11,360
It has to be server-centric.
1309
00:47:11,360 --> 00:47:14,880
It has to assume the agent might not even be written in the same language as your data.
1310
00:47:14,880 --> 00:47:16,720
It has to think in terms of contracts.
1311
00:47:16,720 --> 00:47:18,080
Not imports and function calls.
1312
00:47:18,080 --> 00:47:21,840
This is why Microsoft released the agent framework in April of 2026.
1313
00:47:21,840 --> 00:47:24,320
It is the official successor to semantic kernel.
1314
00:47:24,320 --> 00:47:26,880
Agent framework is designed for this new reality.
1315
00:47:26,880 --> 00:47:29,840
Instead of loading plugins into a kernel, the model is simple.
1316
00:47:29,840 --> 00:47:31,040
Agents call tools.
1317
00:47:31,040 --> 00:47:32,080
Tools come from anywhere.
1318
00:47:32,080 --> 00:47:34,720
APIs, MCP servers, cloud services.
1319
00:47:34,720 --> 00:47:36,160
The agent doesn't care about the source.
1320
00:47:36,160 --> 00:47:38,080
It just knows its tool set and its goal.
1321
00:47:38,080 --> 00:47:40,160
The engine is agnostic about where those tools live.
1322
00:47:40,160 --> 00:47:41,280
It's not about the SDK.
1323
00:47:41,280 --> 00:47:42,160
It's about the tool.
1324
00:47:42,160 --> 00:47:44,560
And critically, agent framework is MCP native.
1325
00:47:44,560 --> 00:47:46,320
MCP isn't an afterthought here.
1326
00:47:46,320 --> 00:47:47,840
It's a first-class concern.
1327
00:47:47,840 --> 00:47:50,880
When you define an agent, you define it in terms of tools.
1328
00:47:50,880 --> 00:47:53,200
Those tools are naturally expressed as MCP servers.
1329
00:47:53,200 --> 00:47:54,480
Dataverse is an MCP server.
1330
00:47:54,480 --> 00:47:56,240
Your automation layer is an MCP server.
1331
00:47:56,240 --> 00:47:58,640
Your external APIs are wired through MCP.
1332
00:47:58,640 --> 00:48:03,040
The same agent definition works whether it runs in co-pilot studio or GitHub.
1333
00:48:03,040 --> 00:48:05,040
Because the contract is the same across all of them.
1334
00:48:05,040 --> 00:48:06,960
Semantic kernel still works.
1335
00:48:06,960 --> 00:48:08,800
And Microsoft is still maintaining it.
1336
00:48:08,800 --> 00:48:10,880
They aren't abandoning the people who use it.
1337
00:48:10,880 --> 00:48:13,680
But the guidance from the platform team is very clear.
1338
00:48:13,680 --> 00:48:15,920
Do not start anything new on semantic kernel.
1339
00:48:15,920 --> 00:48:18,800
If you're building a new agent system in 2027,
1340
00:48:18,800 --> 00:48:20,400
you start with agent framework.
1341
00:48:20,400 --> 00:48:23,280
If you have existing code, there are migration parts available.
1342
00:48:23,280 --> 00:48:25,600
They aren't always easy, but they are documented.
1343
00:48:25,600 --> 00:48:27,040
Your investment isn't wasted.
1344
00:48:27,040 --> 00:48:28,480
The codebase just evolves.
1345
00:48:28,480 --> 00:48:30,000
Why does this matter for your roadmap?
1346
00:48:30,000 --> 00:48:31,520
Because your framework choice determines
1347
00:48:31,520 --> 00:48:33,440
how your agents connect to your data.
1348
00:48:33,440 --> 00:48:36,240
Semantic kernel ties you to a specific way of working.
1349
00:48:36,240 --> 00:48:39,360
Agent framework aligns you with where the entire industry is moving.
1350
00:48:39,360 --> 00:48:42,000
The fabric we've been describing relies on one idea.
1351
00:48:42,000 --> 00:48:44,480
Any client should be able to connect through one endpoint.
1352
00:48:44,480 --> 00:48:47,360
That only works if you think in terms of tools and protocols.
1353
00:48:47,360 --> 00:48:49,120
Agent framework encodes that assumption.
1354
00:48:49,120 --> 00:48:50,240
Semantic kernel doesn't.
1355
00:48:50,240 --> 00:48:54,000
If you're architecting for the future, the choice is obvious.
1356
00:48:54,000 --> 00:48:55,680
The multi-LLM enterprise?
1357
00:48:55,680 --> 00:48:57,280
Why vendor lock in is dead?
1358
00:48:57,280 --> 00:48:59,600
Your enterprise doesn't run on just one LLM.
1359
00:48:59,600 --> 00:49:00,480
You might think it does.
1360
00:49:00,480 --> 00:49:02,800
You might have a policy that says you've standardized on
1361
00:49:02,800 --> 00:49:04,720
OpenAI, Anthropic, or Azure.
1362
00:49:04,720 --> 00:49:07,200
But underneath that policy, reality is more complex.
1363
00:49:07,200 --> 00:49:09,920
The finance team is using GPT 4.5 for complex math
1364
00:49:09,920 --> 00:49:11,760
because it's fast and accurate with numbers.
1365
00:49:11,760 --> 00:49:13,520
Legal prefers Claude for long contracts
1366
00:49:13,520 --> 00:49:15,520
because it doesn't lose focus on page 90.
1367
00:49:15,520 --> 00:49:18,160
Your infrastructure team is running Yammer on premise
1368
00:49:18,160 --> 00:49:20,560
to stay compliant with data residency laws.
1369
00:49:20,560 --> 00:49:23,840
Research is experimenting with Gemini for scientific tasks.
1370
00:49:23,840 --> 00:49:26,320
This isn't a shadow IT problem or a policy violation.
1371
00:49:26,320 --> 00:49:27,680
It's rational optimization.
1372
00:49:27,680 --> 00:49:30,000
Different models have different strengths
1373
00:49:30,000 --> 00:49:32,480
and using the right tool for the job just gets better results.
1374
00:49:32,480 --> 00:49:33,680
But here's the problem.
1375
00:49:33,680 --> 00:49:37,600
About 60% of enterprises are running multiple LLMs at the same time
1376
00:49:37,600 --> 00:49:40,000
and under the old model, that's an integration nightmare.
1377
00:49:40,000 --> 00:49:41,440
Every vendor has a different API.
1378
00:49:41,440 --> 00:49:43,840
OpenAI works one way and topic works another.
1379
00:49:43,840 --> 00:49:45,200
Yammer is different again.
1380
00:49:45,200 --> 00:49:47,840
When every model needs its own connection to dataverse,
1381
00:49:47,840 --> 00:49:50,400
you end up building a separate integration for every single one.
1382
00:49:50,400 --> 00:49:52,080
You build a connector for OpenAI,
1383
00:49:52,080 --> 00:49:54,480
then a separate one for Claude, then another for Yammer.
1384
00:49:54,480 --> 00:49:57,600
Each one has its own login flow, its own errors, and its own setup.
1385
00:49:57,600 --> 00:49:58,800
That isn't integration.
1386
00:49:58,800 --> 00:50:02,640
It's integration dead that gets heavier every time a new model hits the market.
1387
00:50:02,640 --> 00:50:03,920
And one level deeper.
1388
00:50:03,920 --> 00:50:05,040
You're locked in.
1389
00:50:05,040 --> 00:50:08,800
If you've built your entire business process around one specific API,
1390
00:50:08,800 --> 00:50:10,160
your team is trained on it,
1391
00:50:10,160 --> 00:50:12,400
and your infrastructure is optimized for it.
1392
00:50:12,400 --> 00:50:14,880
Then a competitor releases a better model at half the price.
1393
00:50:14,880 --> 00:50:16,640
You want to switch, but you can't.
1394
00:50:16,640 --> 00:50:19,360
Switching means rebuilding everything from scratch
1395
00:50:19,360 --> 00:50:21,120
and retraining your entire team.
1396
00:50:21,120 --> 00:50:23,600
The cost is so high that you stay stuck with a worse option.
1397
00:50:23,600 --> 00:50:24,400
The vendor owns you.
1398
00:50:24,400 --> 00:50:27,360
This is why MCP fundamentally changes the equation.
1399
00:50:27,360 --> 00:50:29,760
Instead of building 10 integrations, you build one.
1400
00:50:29,760 --> 00:50:31,280
Dataverse speaks MCP.
1401
00:50:31,280 --> 00:50:32,880
The LLMs speak MCP.
1402
00:50:32,880 --> 00:50:35,040
The same dataverse endpoint works for all of them.
1403
00:50:35,040 --> 00:50:38,160
When a new model comes out, your connector doesn't change.
1404
00:50:38,160 --> 00:50:40,720
The new model just connects to the existing endpoint
1405
00:50:40,720 --> 00:50:44,000
and instantly has access to your tools, your data, and your security.
1406
00:50:44,000 --> 00:50:45,760
No extra work, no rebuilding.
1407
00:50:45,760 --> 00:50:47,760
Think of it like USB-C for AI.
1408
00:50:47,760 --> 00:50:50,880
Before USB-C, every phone and laptop had a different plug,
1409
00:50:50,880 --> 00:50:53,440
which created nothing but waste and frustration.
1410
00:50:53,440 --> 00:50:56,240
Now one cable works with everything MCP is that connector.
1411
00:50:56,240 --> 00:50:57,680
Dataverse is the platform.
1412
00:50:57,680 --> 00:50:59,840
The LLM is just the device you're plugging in,
1413
00:50:59,840 --> 00:51:01,440
because the protocol is a standard,
1414
00:51:01,440 --> 00:51:04,320
you aren't locked into anyone, switching costs, nothing.
1415
00:51:04,320 --> 00:51:06,800
The business case is simple.
1416
00:51:06,800 --> 00:51:09,920
In the old model, adding a new vendor takes weeks of coding
1417
00:51:09,920 --> 00:51:11,280
and a lifetime of maintenance.
1418
00:51:11,280 --> 00:51:13,680
With MCP, it's just a configuration change.
1419
00:51:13,680 --> 00:51:16,080
You add the endpoint, set up the login, and you're done.
1420
00:51:16,080 --> 00:51:18,640
That is the difference between being flexible and being trapped.
1421
00:51:18,640 --> 00:51:22,720
For most enterprises, avoiding lock-in is a requirement.
1422
00:51:22,720 --> 00:51:25,040
You need to keep your options open so you can switch models
1423
00:51:25,040 --> 00:51:28,320
based on cost or new regulations without tearing your house down.
1424
00:51:28,320 --> 00:51:31,040
You can run five models at once without five times the work.
1425
00:51:31,040 --> 00:51:34,400
The complexity stays the same, no matter how many LLMs you add.
1426
00:51:34,400 --> 00:51:36,960
This is non-negotiable for any large organization.
1427
00:51:36,960 --> 00:51:39,520
The moment you depend on one vendor for your core business,
1428
00:51:39,520 --> 00:51:40,880
they control your roadmap.
1429
00:51:40,880 --> 00:51:42,320
MCP takes that control back.
1430
00:51:42,320 --> 00:51:44,720
Dataverse becomes truly multi-LLM,
1431
00:51:44,720 --> 00:51:47,120
and you stay in charge of your own technology.
1432
00:51:47,120 --> 00:51:49,760
Business skills, encoding process and data.
1433
00:51:49,760 --> 00:51:53,200
Agents are powerful, but power without a process is just chaos.
1434
00:51:53,200 --> 00:51:55,120
This is where business skills change the game.
1435
00:51:55,120 --> 00:51:56,480
A business skill is simple.
1436
00:51:56,480 --> 00:51:59,040
It's a description of a process written in plain English
1437
00:51:59,040 --> 00:52:00,720
and stored as a record in Dataverse.
1438
00:52:00,720 --> 00:52:02,720
It isn't code, it isn't a flow chart in a PDF.
1439
00:52:02,720 --> 00:52:04,720
It isn't a wiki page that nobody looks at.
1440
00:52:04,720 --> 00:52:07,520
It is a structured, versioned, and auditable record
1441
00:52:07,520 --> 00:52:09,280
of how your company actually works.
1442
00:52:09,280 --> 00:52:11,840
An agent can find these skills, read them and follow them.
1443
00:52:11,840 --> 00:52:13,280
So why does this matter?
1444
00:52:13,280 --> 00:52:15,360
Imagine your sales qualification process.
1445
00:52:15,360 --> 00:52:18,080
It's probably documented in an email or stuck in someone's head.
1446
00:52:18,080 --> 00:52:21,680
The rule might be if a prospect has five employees in North America,
1447
00:52:21,680 --> 00:52:22,480
they're qualified.
1448
00:52:22,480 --> 00:52:24,960
If they don't have a budget, nurture them for six months.
1449
00:52:24,960 --> 00:52:27,120
It's basic logic that humans get immediately.
1450
00:52:27,120 --> 00:52:28,880
Now, you want an agent to do this.
1451
00:52:28,880 --> 00:52:31,760
The old way was to hard code that logic into the agent.
1452
00:52:31,760 --> 00:52:34,160
You write the if-then statements and deploy the code.
1453
00:52:34,160 --> 00:52:36,400
But three months later, the sales strategy changes.
1454
00:52:36,400 --> 00:52:37,840
The budget rules shift.
1455
00:52:37,840 --> 00:52:40,080
To update the agent, you have to call the developers,
1456
00:52:40,080 --> 00:52:41,920
change the code, test it and redeploy.
1457
00:52:41,920 --> 00:52:44,400
It's slow, it's expensive, and it creates friction.
1458
00:52:44,400 --> 00:52:46,480
The business skill approach inverts this.
1459
00:52:46,480 --> 00:52:48,080
You create a record in Dataverse
1460
00:52:48,080 --> 00:52:50,240
that describes the rules in plain text.
1461
00:52:50,240 --> 00:52:52,640
When the geography or the budget rules change,
1462
00:52:52,640 --> 00:52:54,640
you just update the text in that record.
1463
00:52:55,040 --> 00:52:56,960
The agent queries the business skills tool,
1464
00:52:56,960 --> 00:52:59,920
reads the new instructions, and follows them on the very next lead.
1465
00:52:59,920 --> 00:53:02,400
No developers, no code changes, no waiting.
1466
00:53:02,400 --> 00:53:04,800
The business team owns the process directly.
1467
00:53:04,800 --> 00:53:07,440
That shift is about control and velocity.
1468
00:53:07,440 --> 00:53:10,240
In the old way, business teams are stuck waiting on engineering
1469
00:53:10,240 --> 00:53:11,840
to update a simple rule.
1470
00:53:11,840 --> 00:53:13,360
Engineering has other priorities,
1471
00:53:13,360 --> 00:53:14,480
so the business waits,
1472
00:53:14,480 --> 00:53:16,400
and the process becomes outdated.
1473
00:53:16,400 --> 00:53:18,480
With business skills, the bottleneck is gone.
1474
00:53:18,480 --> 00:53:20,880
If a sales leader needs to change a rule,
1475
00:53:20,880 --> 00:53:22,480
they change the record in Dataverse,
1476
00:53:22,480 --> 00:53:23,760
and it happens instantly.
1477
00:53:23,760 --> 00:53:25,440
The governance side is just as big.
1478
00:53:25,440 --> 00:53:26,640
Business skills are versioned,
1479
00:53:26,640 --> 00:53:29,040
so you can keep the old rules while you test new ones.
1480
00:53:29,040 --> 00:53:31,440
A manager can draft a new version of a skill
1481
00:53:31,440 --> 00:53:32,960
and run it on a few agents
1482
00:53:32,960 --> 00:53:34,880
to see if it actually closes more deals.
1483
00:53:34,880 --> 00:53:37,520
Once it's proven, you promote it to the live version.
1484
00:53:37,520 --> 00:53:39,680
The old version stays in the system for compliance,
1485
00:53:39,680 --> 00:53:41,280
so you always have an audit trail.
1486
00:53:41,280 --> 00:53:43,200
Approval workflows fit right into this.
1487
00:53:43,200 --> 00:53:45,120
You can require that any change to a skill
1488
00:53:45,120 --> 00:53:46,960
has to be signed off by a VP.
1489
00:53:46,960 --> 00:53:49,200
The analyst drafts it, the VP approves it,
1490
00:53:49,200 --> 00:53:51,280
and the whole decision trail is saved.
1491
00:53:51,280 --> 00:53:54,000
When in order to ask why a process changed,
1492
00:53:54,000 --> 00:53:55,120
you have the proof.
1493
00:53:55,120 --> 00:53:58,160
You have the who, the when, and the why, all in one place.
1494
00:53:58,160 --> 00:54:00,320
The system even captures the execution.
1495
00:54:00,320 --> 00:54:02,480
When an agent uses a skill to make a decision,
1496
00:54:02,480 --> 00:54:03,600
it logs everything.
1497
00:54:03,600 --> 00:54:05,040
You see which agent ran it,
1498
00:54:05,040 --> 00:54:06,480
which version of the skill it used,
1499
00:54:06,480 --> 00:54:08,080
and what data it was looking at.
1500
00:54:08,080 --> 00:54:10,240
If an agent makes a mistake, you can trace it back.
1501
00:54:10,240 --> 00:54:12,080
It's not just the AI messed up.
1502
00:54:12,080 --> 00:54:14,160
It's the agent followed version two of the skill
1503
00:54:14,160 --> 00:54:15,920
which had a specific budget requirement
1504
00:54:15,920 --> 00:54:17,360
this prospect didn't meet.
1505
00:54:17,360 --> 00:54:18,800
The whole chain is transparent.
1506
00:54:18,800 --> 00:54:21,840
This is the bridge between AI and real governance.
1507
00:54:21,840 --> 00:54:24,000
Agents get the ability to handle complex logic
1508
00:54:24,000 --> 00:54:25,440
without being hard coded.
1509
00:54:25,440 --> 00:54:28,640
Business teams get to update that logic without calling IT.
1510
00:54:28,640 --> 00:54:30,800
An auditor gets to see exactly how every decision was made.
1511
00:54:30,800 --> 00:54:32,000
It's not agents running wild.
1512
00:54:32,000 --> 00:54:34,080
It's agents following the exact processes
1513
00:54:34,080 --> 00:54:36,400
that your business defined and approved.
1514
00:54:36,400 --> 00:54:39,280
The 2027 trajectory, where this is heading.
1515
00:54:39,280 --> 00:54:42,080
Today, Dataverse MCP is in public preview.
1516
00:54:42,080 --> 00:54:44,320
The tool surface is formalized, but not final.
1517
00:54:44,320 --> 00:54:46,480
The governance patterns are just starting to emerge,
1518
00:54:46,480 --> 00:54:47,680
but by 2027.
1519
00:54:47,680 --> 00:54:49,680
This shifts into a different phase entirely.
1520
00:54:49,680 --> 00:54:51,920
General availability means you can finally plan
1521
00:54:51,920 --> 00:54:54,720
production deployments without the asterisks.
1522
00:54:54,720 --> 00:54:56,320
No more, this might change.
1523
00:54:56,320 --> 00:54:58,560
No more, we're still refining the contract.
1524
00:54:58,560 --> 00:55:01,280
Dataverse MCP becomes a stable supported platform
1525
00:55:01,280 --> 00:55:02,960
with SLA, security patches,
1526
00:55:02,960 --> 00:55:05,040
and a long-term commitment from Microsoft.
1527
00:55:05,040 --> 00:55:06,960
That's not just a versioning number change.
1528
00:55:06,960 --> 00:55:09,360
That is permission to build your most critical systems
1529
00:55:09,360 --> 00:55:10,640
on this foundation.
1530
00:55:10,640 --> 00:55:12,560
Organizations currently running pilots
1531
00:55:12,560 --> 00:55:14,080
will move into full production,
1532
00:55:14,080 --> 00:55:16,080
and new organizations will enter the space
1533
00:55:16,080 --> 00:55:18,640
because the risk profile has fundamentally changed.
1534
00:55:18,640 --> 00:55:20,560
The tool surface is going to expand.
1535
00:55:20,560 --> 00:55:22,400
15 tools today feels like a lot,
1536
00:55:22,400 --> 00:55:25,440
but by 2027 expect that suite to grow significantly.
1537
00:55:25,440 --> 00:55:26,720
This won't happen randomly.
1538
00:55:26,720 --> 00:55:28,240
It will happen deliberately in response
1539
00:55:28,240 --> 00:55:30,240
to what agents actually need to do their jobs.
1540
00:55:30,240 --> 00:55:32,160
You'll see more granular schema operations
1541
00:55:32,160 --> 00:55:33,840
and tools for managing Dataverse plugins
1542
00:55:33,840 --> 00:55:34,800
and workflows directly.
1543
00:55:34,800 --> 00:55:37,040
We'll see domain-specific tools for industry scenarios
1544
00:55:37,040 --> 00:55:38,640
like financial tools for banking
1545
00:55:38,640 --> 00:55:40,080
or clinical tools for healthcare.
1546
00:55:40,080 --> 00:55:41,360
The contract grows,
1547
00:55:41,360 --> 00:55:43,040
but the principle stays the same.
1548
00:55:43,040 --> 00:55:45,120
Tools remain bounded, intentional, and governed.
1549
00:55:45,120 --> 00:55:48,320
The expansion doesn't mean agents gain wild unchecked power.
1550
00:55:48,320 --> 00:55:49,760
It means you get more precision.
1551
00:55:49,760 --> 00:55:52,320
Remote MCP servers will solve a specific pain point
1552
00:55:52,320 --> 00:55:54,160
that is becoming increasingly urgent.
1553
00:55:54,160 --> 00:55:56,160
Today, if you want multiple environments
1554
00:55:56,160 --> 00:55:57,920
like dev, staging, and production,
1555
00:55:57,920 --> 00:55:59,840
you have to configure them all separately.
1556
00:55:59,840 --> 00:56:03,600
By 2027, you'll be able to set up a single remote MCP server
1557
00:56:03,600 --> 00:56:05,600
that roots to multiple Dataverse environments
1558
00:56:05,600 --> 00:56:08,400
while managing credentials and policies centrally.
1559
00:56:08,400 --> 00:56:10,480
One endpoint, different target environments
1560
00:56:10,480 --> 00:56:12,320
based on rules, one deployment,
1561
00:56:12,320 --> 00:56:13,600
multiple control planes.
1562
00:56:14,480 --> 00:56:16,960
The operational burden drops significantly
1563
00:56:16,960 --> 00:56:19,440
because the complexity is handled at the server level.
1564
00:56:19,440 --> 00:56:21,040
Agent framework will become the default
1565
00:56:21,040 --> 00:56:23,120
orchestration model across power platform,
1566
00:56:23,120 --> 00:56:25,680
Microsoft 365, and your custom applications.
1567
00:56:25,680 --> 00:56:27,920
It won't be an alternative to other frameworks.
1568
00:56:27,920 --> 00:56:29,200
It will be the framework.
1569
00:56:29,200 --> 00:56:31,200
Teams building new agents in 2027
1570
00:56:31,200 --> 00:56:32,720
won't even evaluate alternatives
1571
00:56:32,720 --> 00:56:35,600
because this is where all the platform investment is concentrated.
1572
00:56:35,600 --> 00:56:37,280
The documentation will be mature,
1573
00:56:37,280 --> 00:56:38,720
the tooling will be stable,
1574
00:56:38,720 --> 00:56:40,480
and the community will be massive.
1575
00:56:40,480 --> 00:56:42,480
By sheer inertia and capability,
1576
00:56:42,480 --> 00:56:44,080
it becomes the standard.
1577
00:56:44,080 --> 00:56:46,560
Business skills will transition from an interesting experiment
1578
00:56:46,560 --> 00:56:48,240
to the way we actually encode process.
1579
00:56:48,240 --> 00:56:50,880
By 2027, your organization won't maintain
1580
00:56:50,880 --> 00:56:53,760
process documentation in messy wikis and long email chains.
1581
00:56:53,760 --> 00:56:56,720
You will maintain it in Dataverse as skills, sales processes,
1582
00:56:56,720 --> 00:56:58,160
support escalation procedures,
1583
00:56:58,160 --> 00:56:59,920
approval workflows, and compliance checks
1584
00:56:59,920 --> 00:57:01,360
will all exist as queryable,
1585
00:57:01,360 --> 00:57:03,120
versionable, and auditable records.
1586
00:57:03,120 --> 00:57:05,760
Agents execute them, humans update them.
1587
00:57:05,760 --> 00:57:09,120
The distinction between automation and process blurs
1588
00:57:09,120 --> 00:57:10,640
because in this model,
1589
00:57:10,640 --> 00:57:13,040
processes are executable by default.
1590
00:57:13,040 --> 00:57:16,080
Governance and compliance tooling will mature around this architecture.
1591
00:57:16,080 --> 00:57:18,480
Today, you're likely piecing together your own solutions,
1592
00:57:18,480 --> 00:57:19,840
but by 2027,
1593
00:57:19,840 --> 00:57:22,880
you'll have product-grade offerings built directly into power platform.
1594
00:57:22,880 --> 00:57:26,080
You'll have centralized tool policies and role-based tool access.
1595
00:57:26,080 --> 00:57:28,080
Data classification will automatically affect
1596
00:57:28,080 --> 00:57:30,080
which agents can access which tables.
1597
00:57:30,080 --> 00:57:33,520
And workflow approvals will trigger based on specific agent actions.
1598
00:57:33,520 --> 00:57:36,160
The governance layer is no longer something you bolt on at the end,
1599
00:57:36,160 --> 00:57:37,120
it's native.
1600
00:57:37,120 --> 00:57:40,240
The agentic backbone becomes a standard piece of infrastructure.
1601
00:57:40,240 --> 00:57:42,480
Today, agents are exciting because they're new,
1602
00:57:42,480 --> 00:57:44,720
but by 2027, they are expected.
1603
00:57:44,720 --> 00:57:46,720
You won't ask, "Should we use agents?"
1604
00:57:46,720 --> 00:57:50,560
Instead, you'll ask, "Which processes should agents handle next?"
1605
00:57:50,560 --> 00:57:53,120
The infrastructure supporting them, the authentication,
1606
00:57:53,120 --> 00:57:55,760
the tool routing, the governance, and the audit logs
1607
00:57:55,760 --> 00:57:58,160
becomes as foundational as the database itself.
1608
00:57:58,160 --> 00:58:00,480
IT teams build it, support teams maintain it,
1609
00:58:00,480 --> 00:58:02,720
business teams use it, it's not cutting edge anymore,
1610
00:58:02,720 --> 00:58:04,480
it's just infrastructure.
1611
00:58:04,480 --> 00:58:07,440
So why start now instead of waiting for 2027?
1612
00:58:07,440 --> 00:58:10,800
Because the gap between a pilot and full production is six months at a minimum
1613
00:58:10,800 --> 00:58:14,080
and usually much longer. If you wait until 2027 to begin,
1614
00:58:14,080 --> 00:58:16,720
you'll be entering your first pilots just as your competitors
1615
00:58:16,720 --> 00:58:18,080
are scaling their production.
1616
00:58:18,080 --> 00:58:20,720
You'll be learning the hard lessons they've already mastered
1617
00:58:20,720 --> 00:58:23,120
and you'll be paying the price for their early mistakes.
1618
00:58:23,120 --> 00:58:26,080
The organizations that begin right now will have worked through the pilot phase
1619
00:58:26,080 --> 00:58:27,920
by the time these GA features arrive.
1620
00:58:27,920 --> 00:58:30,560
They'll have real agents in production, real user feedback,
1621
00:58:30,560 --> 00:58:31,760
and real optimization.
1622
00:58:31,760 --> 00:58:34,960
When dataverse MCP goes GA and the agent framework matures,
1623
00:58:34,960 --> 00:58:36,000
they aren't learning.
1624
00:58:36,000 --> 00:58:37,440
They're scaling.
1625
00:58:37,440 --> 00:58:39,680
That is the competitive advantage.
1626
00:58:39,680 --> 00:58:44,960
What you do Monday morning, stop planning, start doing Monday morning,
1627
00:58:44,960 --> 00:58:49,440
register an enter ID app with pkce enabled and walk through the setup we covered
1628
00:58:49,440 --> 00:58:50,480
in this episode.
1629
00:58:50,480 --> 00:58:53,760
Test the streamable HTTP endpoint with claw desktop on your own machine
1630
00:58:53,760 --> 00:58:55,200
just to verify that it works.
1631
00:58:55,200 --> 00:58:56,800
Don't worry about an elaborate pilot yet.
1632
00:58:56,800 --> 00:58:58,560
This is five minutes of configuration.
1633
00:58:58,560 --> 00:59:00,080
Then identify just one use case.
1634
00:59:00,080 --> 00:59:03,200
Find one process that agents could genuinely improve right now.
1635
00:59:03,200 --> 00:59:05,600
It could be a support team qualifying tickets,
1636
00:59:05,600 --> 00:59:09,360
a sales team researching prospects or an operations team checking inventory.
1637
00:59:09,360 --> 00:59:11,360
Pick something real that has a clear owner.
1638
00:59:11,360 --> 00:59:14,000
Map your dataverse schema to the MCP tool surface.
1639
00:59:14,000 --> 00:59:17,040
Decide which tables matter, which fields are necessary,
1640
00:59:17,040 --> 00:59:19,760
and what queries your agents would actually need to run.
1641
00:59:19,760 --> 00:59:20,720
Document this.
1642
00:59:20,720 --> 00:59:23,120
It doesn't need to be perfect, but it needs to be real.
1643
00:59:23,120 --> 00:59:24,160
Choose your agents.
1644
00:59:24,160 --> 00:59:27,440
Will Claude handle the work, or will you use GitHub co-pilot?
1645
00:59:27,440 --> 00:59:30,240
Decide which environments each one connects to now,
1646
00:59:30,240 --> 00:59:32,400
because planning this early prevents a massive
1647
00:59:32,400 --> 00:59:34,000
misconfiguration later.
1648
00:59:34,000 --> 00:59:36,640
Start with that one integration and that one use case
1649
00:59:36,640 --> 00:59:38,160
with those agents in that environment.
1650
00:59:38,160 --> 00:59:40,320
It's rate based on real usage, not theory.
1651
00:59:40,320 --> 00:59:42,320
The proxy is dead, the fabric is now.