End of Custom AI Glue

Mirko PetersPodcasts1 hour ago23 Views


1
00:00:00,000 –> 00:00:01,920
Why is everyone suddenly talking about MCP

2
00:00:01,920 –> 00:00:03,620
and why should Microsoft people care?

3
00:00:03,620 –> 00:00:07,280
Because the AI integration story you’ve been selling internally

4
00:00:07,280 –> 00:00:09,120
is collapsing under its own weight.

5
00:00:09,120 –> 00:00:10,940
Models can write decent plans.

6
00:00:10,940 –> 00:00:12,900
They can even sound confident while doing it,

7
00:00:12,900 –> 00:00:14,560
but enterprises don’t pay for confidence.

8
00:00:14,560 –> 00:00:16,080
They pay for controlled outcomes.

9
00:00:16,080 –> 00:00:17,520
Here’s the comfortable assumption.

10
00:00:17,520 –> 00:00:19,860
MCP is plugins for LLMs.

11
00:00:19,860 –> 00:00:21,480
A nicer way to bolt tools onto chat.

12
00:00:21,480 –> 00:00:23,240
That’s the story because it feels familiar.

13
00:00:23,240 –> 00:00:25,880
It sounds like what we already did with add-ins, connectors,

14
00:00:25,880 –> 00:00:27,160
and yet another SDK.

15
00:00:27,160 –> 00:00:27,960
It is not.

16
00:00:27,960 –> 00:00:29,040
MCP is not a plugin system.

17
00:00:29,040 –> 00:00:30,200
It’s not an API wrapper.

18
00:00:30,200 –> 00:00:32,520
It’s not function-calling, but standardized.

19
00:00:32,520 –> 00:00:34,080
Those descriptions are how you end up

20
00:00:34,080 –> 00:00:37,080
rebuilding the same glue code just with a new logo on it.

21
00:00:37,080 –> 00:00:38,360
This is the uncomfortable truth.

22
00:00:38,360 –> 00:00:40,160
MCP is where authority stops.

23
00:00:40,160 –> 00:00:42,320
In architectural terms, MCP is a protocol

24
00:00:42,320 –> 00:00:44,440
that sits between an AI host and the systems

25
00:00:44,440 –> 00:00:45,680
you actually care about.

26
00:00:45,680 –> 00:00:48,680
Graph, SharePoint, Line of Business APIs,

27
00:00:48,680 –> 00:00:50,160
anything with Blastradius.

28
00:00:50,160 –> 00:00:52,360
And the point of that protocol isn’t convenience.

29
00:00:52,360 –> 00:00:54,040
The point is to create a choke point

30
00:00:54,040 –> 00:00:57,400
where you can enforce identity, scope, audit, and failure

31
00:00:57,400 –> 00:01:00,120
behavior without trusting the model to behave,

32
00:01:00,120 –> 00:01:02,640
because the model will not behave, not because it’s evil,

33
00:01:02,640 –> 00:01:03,720
because it’s probabilistic.

34
00:01:03,720 –> 00:01:05,560
It picks the next token, then the next token,

35
00:01:05,560 –> 00:01:07,760
and somewhere inside that it decides which tool to call

36
00:01:07,760 –> 00:01:08,640
and with what inputs.

37
00:01:08,640 –> 00:01:11,040
That’s fine when the worst outcome is a wrong sentence.

38
00:01:11,040 –> 00:01:14,640
It’s catastrophic when the outcome is create a user,

39
00:01:14,640 –> 00:01:19,200
share a file, delete a record, or ex-filterate a report.

40
00:01:19,200 –> 00:01:22,680
So the real problem MCP solves isn’t model intelligence.

41
00:01:22,680 –> 00:01:24,760
It’s bounded action at enterprise scale.

42
00:01:24,760 –> 00:01:27,600
Before MCP, every team built their own bridge.

43
00:01:27,600 –> 00:01:30,320
A bespoke wrapper around graph, a custom connector

44
00:01:30,320 –> 00:01:32,800
to SharePoint, a hand-rolled middleware service

45
00:01:32,800 –> 00:01:34,880
with a service principle that never gets rotated

46
00:01:34,880 –> 00:01:36,560
because it’s temporary.

47
00:01:36,560 –> 00:01:39,080
Meanwhile, policy drift happens, endpoints change,

48
00:01:39,080 –> 00:01:41,720
someone adds a permission just for this sprint.

49
00:01:41,720 –> 00:01:43,840
And now your integration becomes a permanent incident

50
00:01:43,840 –> 00:01:44,840
generator.

51
00:01:44,840 –> 00:01:46,600
And Microsoft environments amplify this

52
00:01:46,600 –> 00:01:48,320
because identity is the control plane.

53
00:01:48,320 –> 00:01:49,760
Entra decides what is possible.

54
00:01:49,760 –> 00:01:52,160
Conditional access decides what is survivable.

55
00:01:52,160 –> 00:01:54,880
Or did decides what is defensible when something goes wrong.

56
00:01:54,880 –> 00:01:57,720
So in this episode, the goal isn’t to celebrate MCP.

57
00:01:57,720 –> 00:01:58,960
The goal is to make it obvious.

58
00:01:58,960 –> 00:02:01,400
We’re going to build MCP from first principles,

59
00:02:01,400 –> 00:02:04,240
then place it inside a Microsoft native architecture.

60
00:02:04,240 –> 00:02:06,440
Entra on behalf of for delegated authority,

61
00:02:06,440 –> 00:02:08,920
managed identity for operational baselines,

62
00:02:08,920 –> 00:02:12,000
and service principle plus Azure API management

63
00:02:12,000 –> 00:02:14,880
for the part everyone forgets, governance at the edge.

64
00:02:14,880 –> 00:02:16,840
And there’s one claim I’m going to prove later

65
00:02:16,840 –> 00:02:18,200
with real entrufflose.

66
00:02:18,200 –> 00:02:20,000
MCP isn’t AI tooling.

67
00:02:20,000 –> 00:02:22,080
It’s an integration security boundary

68
00:02:22,080 –> 00:02:24,960
masquerading as developer ergonomics.

69
00:02:24,960 –> 00:02:28,760
The foundational misunderstanding, LLMs don’t touch APIs.

70
00:02:28,760 –> 00:02:30,760
Most teams start with the wrong mental model.

71
00:02:30,760 –> 00:02:33,120
They think the LLM is calling graph,

72
00:02:33,120 –> 00:02:35,880
or hitting SharePoint or running an API.

73
00:02:35,880 –> 00:02:38,440
And then they build a security story on top of that assumption.

74
00:02:38,440 –> 00:02:39,480
That assumption is false.

75
00:02:39,480 –> 00:02:41,240
The model never touches your API.

76
00:02:41,240 –> 00:02:44,760
It never sees your open API spec in the way a developer does.

77
00:02:44,760 –> 00:02:47,680
It never understands your error codes, your pagination rules,

78
00:02:47,680 –> 00:02:50,680
or your permissions model the way your integration code does.

79
00:02:50,680 –> 00:02:52,200
The model interacts with one thing,

80
00:02:52,200 –> 00:02:54,080
the text and structured tool descriptions

81
00:02:54,080 –> 00:02:55,720
you choose to put in front of it.

82
00:02:55,720 –> 00:02:58,640
That distinction matters because you are not securing an API call.

83
00:02:58,640 –> 00:03:00,440
You are securing a decision pipeline.

84
00:03:00,440 –> 00:03:02,840
Okay, so basically an agentic loop looks like this.

85
00:03:02,840 –> 00:03:06,000
You give the model a prompt plus a list of available tools.

86
00:03:06,000 –> 00:03:07,080
The model chooses a tool.

87
00:03:07,080 –> 00:03:09,120
Some host process executes the tool.

88
00:03:09,120 –> 00:03:11,560
The results come back, the model sees the results,

89
00:03:11,560 –> 00:03:13,200
then it decides what to do next.

90
00:03:13,200 –> 00:03:14,680
Repeat until it stops.

91
00:03:14,680 –> 00:03:16,280
Notice what’s missing.

92
00:03:16,280 –> 00:03:18,280
There’s no direct binding between the user

93
00:03:18,280 –> 00:03:21,200
asked the question and the API call is safe.

94
00:03:21,200 –> 00:03:23,880
The binding is mediated by tool descriptions, schemas,

95
00:03:23,880 –> 00:03:24,800
and host behavior.

96
00:03:24,800 –> 00:03:27,000
That’s why I just call the API is not a plan.

97
00:03:27,000 –> 00:03:30,560
It’s a shortcut around the part that actually fails in production.

98
00:03:30,560 –> 00:03:31,920
Here’s what most people miss.

99
00:03:31,920 –> 00:03:34,680
In an enterprise, tool calling is not a coding problem.

100
00:03:34,680 –> 00:03:36,120
It’s a context shaping problem.

101
00:03:36,120 –> 00:03:38,840
If the tool schema is vague, the model will fill in gaps.

102
00:03:38,840 –> 00:03:41,160
If the tool names overlap, the model will guess.

103
00:03:41,160 –> 00:03:43,560
If you allow optional parameters that change meaning,

104
00:03:43,560 –> 00:03:44,600
the model will improvise.

105
00:03:44,600 –> 00:03:47,360
If your output isn’t stable, the model will learn the wrong patterns.

106
00:03:47,360 –> 00:03:49,720
And if you fix it later, you’ve already

107
00:03:49,720 –> 00:03:53,440
shipped a probabilistic interface into a deterministic environment.

108
00:03:53,440 –> 00:03:57,000
That’s the collision APIs assume deterministic callers.

109
00:03:57,000 –> 00:03:58,880
LLMs are probabilistic callers.

110
00:03:58,880 –> 00:04:01,920
So the real failure mode isn’t that the model can’t do the task.

111
00:04:01,920 –> 00:04:04,600
The failure mode is ambiguity, ambiguity in naming,

112
00:04:04,600 –> 00:04:07,200
ambiguity in inputs, ambiguity in outputs,

113
00:04:07,200 –> 00:04:10,760
ambiguity in what authority is being exercised when the tool runs.

114
00:04:10,760 –> 00:04:13,760
And it gets worse over time because the tool surface drifts.

115
00:04:13,760 –> 00:04:15,240
Someone adds a new parameter.

116
00:04:15,240 –> 00:04:18,280
Another team wraps the same back end with a slightly different tool.

117
00:04:18,280 –> 00:04:21,280
A third team adds a search tool that returns a different shape.

118
00:04:21,280 –> 00:04:23,600
Now, the model isn’t choosing between one correct action

119
00:04:23,600 –> 00:04:24,680
and one incorrect action.

120
00:04:24,680 –> 00:04:27,320
It’s choosing between three nearly correct actions

121
00:04:27,320 –> 00:04:28,520
that all work sometimes.

122
00:04:28,520 –> 00:04:29,360
Congratulations.

123
00:04:29,360 –> 00:04:30,760
You’ve built conditional chaos.

124
00:04:30,760 –> 00:04:34,120
This is also why prompt injection becomes a real operational concern.

125
00:04:34,120 –> 00:04:35,840
The model is not defending your API.

126
00:04:35,840 –> 00:04:36,600
The host is.

127
00:04:36,600 –> 00:04:39,920
The host decides what tools are available, what schemas are valid,

128
00:04:39,920 –> 00:04:43,280
what tokens are presented, and what failures are allowed to proceed.

129
00:04:43,280 –> 00:04:47,720
If your system lets untrusted content influence tool selection or tool inputs,

130
00:04:47,720 –> 00:04:49,840
it doesn’t matter how secure your API is.

131
00:04:49,840 –> 00:04:51,720
You just move the attack surface upstream.

132
00:04:51,720 –> 00:04:53,400
The attacker isn’t bypassing auth.

133
00:04:53,400 –> 00:04:54,560
They’re steering the caller.

134
00:04:54,560 –> 00:04:57,760
So when someone says, we’ll just give Copilot a service principle

135
00:04:57,760 –> 00:04:59,240
and let it call graph.

136
00:04:59,240 –> 00:05:01,920
What they’re really doing is bypassing the only place

137
00:05:01,920 –> 00:05:05,960
where policy can be enforced consistently, the orchestration boundary.

138
00:05:05,960 –> 00:05:08,760
That boundary is what MCP standardizes, not the intelligence,

139
00:05:08,760 –> 00:05:10,120
the plumbing around authority.

140
00:05:10,120 –> 00:05:15,600
And once you see that MCP stops sounding like plugins, it starts sounding like what it actually is.

141
00:05:15,600 –> 00:05:20,200
A way to describe capabilities precisely, invoke them consistently,

142
00:05:20,200 –> 00:05:24,800
and keep the model on the far side of a control plane you can audit and constrain.

143
00:05:24,800 –> 00:05:27,880
And now we can talk about the real cost of doing it the old way.

144
00:05:27,880 –> 00:05:31,480
Because every bespoke bridge you build becomes an entropy generator.

145
00:05:31,480 –> 00:05:35,440
The entropy tax, custom AI glue as a permanent incident generator.

146
00:05:35,440 –> 00:05:37,160
Here’s the part nobody budgets for.

147
00:05:37,160 –> 00:05:39,240
Once you let AI glue into the enterprise,

148
00:05:39,240 –> 00:05:40,880
you’re not building an integration.

149
00:05:40,880 –> 00:05:44,640
You’re adopting a new kind of maintenance burden, one that grows on its own.

150
00:05:44,640 –> 00:05:47,760
Because glue code doesn’t stay glue, it becomes policy.

151
00:05:47,760 –> 00:05:49,720
It starts innocently.

152
00:05:49,720 –> 00:05:54,080
A team wants Copilot, sorry, an agent to read a SharePoint library,

153
00:05:54,080 –> 00:05:57,400
summarise a document set and maybe create a planner task.

154
00:05:57,400 –> 00:05:59,440
So someone writes a thin wrapper around graph.

155
00:05:59,440 –> 00:06:00,760
They add a service principle.

156
00:06:00,760 –> 00:06:02,160
They store the secret in Key Vault.

157
00:06:02,160 –> 00:06:04,920
They ship everyone claps and then reality shows up.

158
00:06:04,920 –> 00:06:06,960
The first failure mode is toolsprull.

159
00:06:06,960 –> 00:06:10,880
Multiple teams will build the same bridge in parallel because there’s no shared contract layer.

160
00:06:10,880 –> 00:06:12,440
One wrapper calls graph search.

161
00:06:12,440 –> 00:06:14,480
Another wrapper calls SharePoint rest.

162
00:06:14,480 –> 00:06:18,560
A third wrapper scrapes results from the graph drive endpoint because it was faster.

163
00:06:18,560 –> 00:06:20,080
Now you don’t have one integration.

164
00:06:20,080 –> 00:06:23,280
You have three inconsistent interpretations of the same system,

165
00:06:23,280 –> 00:06:25,840
each with its own permissions, error handling and logging.

166
00:06:25,840 –> 00:06:28,880
That’s not innovation, that’s fragmentation.

167
00:06:28,880 –> 00:06:31,520
The second failure mode is humans acting as transport.

168
00:06:31,520 –> 00:06:36,640
If you’ve ever watched someone use Copilot by copy-pasting an email thread into a prompt,

169
00:06:36,640 –> 00:06:38,640
then copy-pasting a response into teams.

170
00:06:38,640 –> 00:06:40,040
You’ve seen the architecture.

171
00:06:40,040 –> 00:06:42,080
It’s manual ETL with vibes.

172
00:06:42,080 –> 00:06:45,680
It works right up until it becomes a process and then it becomes an audit problem.

173
00:06:45,680 –> 00:06:47,520
You can’t prove what data was used.

174
00:06:47,520 –> 00:06:49,080
You can’t prove what the model saw.

175
00:06:49,080 –> 00:06:52,920
You can’t prove what was sent out and you definitely can’t prove the user had authority

176
00:06:52,920 –> 00:06:54,920
to move that data in the first place.

177
00:06:54,920 –> 00:06:58,440
The third failure mode is security debt that masquerades as velocity.

178
00:06:58,440 –> 00:07:00,120
This is where entropy becomes measurable.

179
00:07:00,120 –> 00:07:01,800
You add temporary app permissions.

180
00:07:01,800 –> 00:07:03,120
You grant sites.

181
00:07:03,120 –> 00:07:05,040
Read all because scoping is annoying.

182
00:07:05,040 –> 00:07:08,240
You add “mail” don’t read to help with summarisation.

183
00:07:08,240 –> 00:07:11,880
You keep a long-lived credential because rotating it breaks the tool.

184
00:07:11,880 –> 00:07:13,360
Over time exceptions pile up.

185
00:07:13,360 –> 00:07:15,240
These exceptions are not edge cases.

186
00:07:15,240 –> 00:07:17,800
They are entropy generators.

187
00:07:17,800 –> 00:07:21,160
Because every exception weakens your ability to reason about the system.

188
00:07:21,160 –> 00:07:25,000
You no longer know which identities can touch which data, through which parts, under which

189
00:07:25,000 –> 00:07:26,160
conditions.

190
00:07:26,160 –> 00:07:30,120
You have transformed a deterministic security model into a probabilistic one.

191
00:07:30,120 –> 00:07:31,560
The fourth failure mode is drift.

192
00:07:31,560 –> 00:07:32,880
API is change.

193
00:07:32,880 –> 00:07:34,720
Graph endpoints evolve.

194
00:07:34,720 –> 00:07:36,400
Inseman tics shift.

195
00:07:36,400 –> 00:07:38,520
Conditional access policies tighten.

196
00:07:38,520 –> 00:07:42,520
SharePoint inheritance gets fixed by someone who doesn’t understand the business impact.

197
00:07:42,520 –> 00:07:44,960
Your glue code is now stale but it doesn’t fail loudly.

198
00:07:44,960 –> 00:07:45,960
It fails weirdly.

199
00:07:45,960 –> 00:07:46,960
Partial results.

200
00:07:46,960 –> 00:07:47,960
Empty arrays.

201
00:07:47,960 –> 00:07:48,960
Works for me access.

202
00:07:48,960 –> 00:07:50,760
Tool outputs that look valid but aren’t.

203
00:07:50,760 –> 00:07:53,880
And this is the worst kind of failure for an LLM driven loop.

204
00:07:53,880 –> 00:07:56,200
Because the model will treat ambiguity as a suggestion.

205
00:07:56,200 –> 00:07:59,640
If the tool returns a 403, the model might try a different tool.

206
00:07:59,640 –> 00:08:04,160
If the tool returns an empty response, the model might assume no data exists.

207
00:08:04,160 –> 00:08:07,880
If the tool returns a truncated payload, the model will fill the gap.

208
00:08:07,880 –> 00:08:09,640
Not maliciously.

209
00:08:09,640 –> 00:08:10,640
Automatically.

210
00:08:10,640 –> 00:08:14,840
So custom glue becomes a permanent incident generator even when the code is correct because

211
00:08:14,840 –> 00:08:16,920
the environment it depends on is not static.

212
00:08:16,920 –> 00:08:22,080
It’s a live policy changes, data changes, identity posture changes, and the more AI capabilities

213
00:08:22,080 –> 00:08:25,120
you bolt on, the more pathways you create for silent failure.

214
00:08:25,120 –> 00:08:28,160
This is why enterprises don’t actually struggle with AI reasoning.

215
00:08:28,160 –> 00:08:30,360
They struggle with orchestration entropy.

216
00:08:30,360 –> 00:08:32,360
And the uncomfortable part is this.

217
00:08:32,360 –> 00:08:36,800
Every new team that just needs one tool makes the entropy worse for everyone else.

218
00:08:36,800 –> 00:08:40,320
Because now you have more identities, more secrets, more permissions, more rappers, more

219
00:08:40,320 –> 00:08:44,320
logging formats, more exception handling styles, and more undocumented behavior.

220
00:08:44,320 –> 00:08:46,280
MCP doesn’t magically make systems safe.

221
00:08:46,280 –> 00:08:47,800
It gives you a place to stop the spread.

222
00:08:47,800 –> 00:08:49,120
A standard contract boundary.

223
00:08:49,120 –> 00:08:50,920
A predictable capability surface.

224
00:08:50,920 –> 00:08:56,320
A single choke point where identity scope, audit, and rate control can be enforced consistently.

225
00:08:56,320 –> 00:08:58,240
Without that choke point you don’t get a platform.

226
00:08:58,240 –> 00:09:02,720
You get a thousand slightly different bridges, all quietly rotting, all still holding production

227
00:09:02,720 –> 00:09:03,720
traffic.

228
00:09:03,720 –> 00:09:05,160
Pre-MCP pattern one.

229
00:09:05,160 –> 00:09:06,920
Rest everywhere, context nowhere.

230
00:09:06,920 –> 00:09:09,560
The first pattern everyone tried was the obvious one.

231
00:09:09,560 –> 00:09:11,800
Just expose rest endpoints and call it a day.

232
00:09:11,800 –> 00:09:12,800
And yes, rest is fine.

233
00:09:12,800 –> 00:09:14,320
It’s been fine for 20 years.

234
00:09:14,320 –> 00:09:18,200
It’s predictable, cashable, debuggable, and it makes developers feel like they’re doing

235
00:09:18,200 –> 00:09:21,400
real engineering instead of arguing about prompt phrasing.

236
00:09:21,400 –> 00:09:23,720
But rest was designed for deterministic clients.

237
00:09:23,720 –> 00:09:25,000
An LLM is not one.

238
00:09:25,000 –> 00:09:29,160
Rest assumes the caller already knows which end point to hit, what parameters mean, what

239
00:09:29,160 –> 00:09:32,240
shape comes back, and what to do when it doesn’t.

240
00:09:32,240 –> 00:09:36,160
Rest assumes the caller has a stable mental model of the API surface and enough discipline

241
00:09:36,160 –> 00:09:37,160
to follow it.

242
00:09:37,160 –> 00:09:38,520
The model has none of that discipline.

243
00:09:38,520 –> 00:09:39,720
It has pattern matching.

244
00:09:39,720 –> 00:09:43,320
So what happens in practice is that you don’t actually give the model your rest API.

245
00:09:43,320 –> 00:09:45,600
You give it a description of your rest API.

246
00:09:45,600 –> 00:09:50,040
In the prompt, or through tool metadata, or through some internal tool router layer that

247
00:09:50,040 –> 00:09:53,400
translates natural language intent into HTTP calls.

248
00:09:53,400 –> 00:09:57,200
And this is where the ROT starts because the moment you do that, pagination becomes a reasoning

249
00:09:57,200 –> 00:09:58,200
problem.

250
00:09:58,200 –> 00:09:59,960
Error handling becomes a reasoning problem.

251
00:09:59,960 –> 00:10:01,920
Edempotency becomes a reasoning problem.

252
00:10:01,920 –> 00:10:03,520
Filtering becomes a reasoning problem.

253
00:10:03,520 –> 00:10:07,600
And the model is now doing probabilistic inference over details that were never meant to be

254
00:10:07,600 –> 00:10:08,600
inferred.

255
00:10:08,600 –> 00:10:09,600
Here’s the weird part.

256
00:10:09,600 –> 00:10:11,760
Even when you have an open API spec, you’re still not safe.

257
00:10:11,760 –> 00:10:14,400
Open API is a contract for developers and code generators.

258
00:10:14,400 –> 00:10:18,280
It’s great for documenting endpoints, schemers, all schemes, and response types.

259
00:10:18,280 –> 00:10:20,320
But it doesn’t solve capability negotiation.

260
00:10:20,320 –> 00:10:24,840
It doesn’t solve tool discovery in a multi tool world, and it definitely doesn’t solve which

261
00:10:24,840 –> 00:10:28,800
of these five nearly identical endpoints should I call right now.

262
00:10:28,800 –> 00:10:31,440
In other words, open API can describe a surface.

263
00:10:31,440 –> 00:10:33,280
It can’t enforce a decision boundary.

264
00:10:33,280 –> 00:10:37,600
So teams build wrappers, one wrapper for graph search, another wrapper for SharePoint lists,

265
00:10:37,600 –> 00:10:40,640
another wrapper for the one endpoint that returns less data.

266
00:10:40,640 –> 00:10:41,880
So it’s faster.

267
00:10:41,880 –> 00:10:45,400
Each wrapper has slightly different defaults, slightly different filtering, slightly different

268
00:10:45,400 –> 00:10:47,400
error mapping, slightly different logging.

269
00:10:47,400 –> 00:10:48,560
And now you don’t have rest.

270
00:10:48,560 –> 00:10:50,280
You have interpretations of rest.

271
00:10:50,280 –> 00:10:53,520
That distinction matters because interpretations drift independently.

272
00:10:53,520 –> 00:10:56,320
The backend might evolve cleanly, but the wrappers don’t.

273
00:10:56,320 –> 00:10:57,320
They get patched.

274
00:10:57,320 –> 00:10:58,320
They get copied.

275
00:10:58,320 –> 00:10:59,520
They get forked.

276
00:10:59,520 –> 00:11:03,760
And over time, your API integration becomes a zoo of nearly correct callers with different

277
00:11:03,760 –> 00:11:04,840
assumptions.

278
00:11:04,840 –> 00:11:06,080
And then the LLM arrives.

279
00:11:06,080 –> 00:11:08,240
Now the model is asked to choose between those wrappers.

280
00:11:08,240 –> 00:11:09,320
It doesn’t know your intent.

281
00:11:09,320 –> 00:11:11,120
It doesn’t know which wrapper is the blessed one.

282
00:11:11,120 –> 00:11:15,440
It only sees names, descriptions, and whatever examples you happen to include in the context.

283
00:11:15,440 –> 00:11:19,760
So if you have three tools called search, search graph, and search SharePoint, you’re

284
00:11:19,760 –> 00:11:24,720
not giving the model capability, you’re giving it ambiguity, and ambiguity becomes behavior.

285
00:11:24,720 –> 00:11:28,360
This is also where security starts to degrade in ways that look harmless.

286
00:11:28,360 –> 00:11:32,040
Rest APIs often have broad permissions because developers want flexibility.

287
00:11:32,040 –> 00:11:36,560
But when you expose that same breadth to a model driven caller, you’re effectively saying,

288
00:11:36,560 –> 00:11:37,960
here’s a loaded interface.

289
00:11:37,960 –> 00:11:39,240
Please choose responsibly.

290
00:11:39,240 –> 00:11:40,400
It won’t.

291
00:11:40,400 –> 00:11:45,040
Even worse, rest normalizes the idea that if one call fails, you just try another endpoint.

292
00:11:45,040 –> 00:11:48,600
That’s acceptable in code where retries are bounded and logic is explicit.

293
00:11:48,600 –> 00:11:50,560
And an agent loop retries are creative.

294
00:11:50,560 –> 00:11:54,400
The model will attempt different calls, different parameters, different scopes of search, until

295
00:11:54,400 –> 00:11:56,160
it gets something that looks like progress.

296
00:11:56,160 –> 00:11:57,160
That’s not resilience.

297
00:11:57,160 –> 00:11:58,600
That’s wondering.

298
00:11:58,600 –> 00:12:02,200
So the rest everywhere pattern collapses because it externalizes context management.

299
00:12:02,200 –> 00:12:05,920
You push all the meaning into prompts and tool descriptions, and then you act surprised

300
00:12:05,920 –> 00:12:07,880
when the caller behaves inconsistently.

301
00:12:07,880 –> 00:12:10,680
This is why the industry pivoted to plugins next.

302
00:12:10,680 –> 00:12:14,980
Not because rest was broken, but because rest had no opinion about context, contracts, or

303
00:12:14,980 –> 00:12:16,920
governance at the AI boundary.

304
00:12:16,920 –> 00:12:20,720
Three MCP pattern two, plugins and extensions as vendor gravity.

305
00:12:20,720 –> 00:12:24,680
So after rest failed to give models a stable, governable tool surface, the industry did what

306
00:12:24,680 –> 00:12:25,680
it always does.

307
00:12:25,680 –> 00:12:27,560
It built plugins.

308
00:12:27,560 –> 00:12:31,440
Plugins feel like progress because they move the integration problem into a product shape,

309
00:12:31,440 –> 00:12:35,440
a marketplace, a manifest, an install button, and a permission prompt.

310
00:12:35,440 –> 00:12:37,040
Everyone recognizes that pattern.

311
00:12:37,040 –> 00:12:41,520
Microsoft people especially add ins, connectors, teams apps, power platform connectors, same

312
00:12:41,520 –> 00:12:43,040
movie, new cast.

313
00:12:43,040 –> 00:12:44,760
But here’s the foundational mistake.

314
00:12:44,760 –> 00:12:48,160
Because plugin ecosystems don’t exist to reduce your integration debt.

315
00:12:48,160 –> 00:12:49,720
They exist to concentrate it.

316
00:12:49,720 –> 00:12:53,760
Vendor gravity is what happens when the platform becomes the default integration runtime.

317
00:12:53,760 –> 00:12:55,240
Your tools aren’t yours anymore.

318
00:12:55,240 –> 00:13:00,640
Their artifacts shaped around a vendor’s permission model, their audit model, their schema conventions,

319
00:13:00,640 –> 00:13:01,880
and their release cadence.

320
00:13:01,880 –> 00:13:05,400
That sounds manageable until you realize you just outsourced your boundary decisions to

321
00:13:05,400 –> 00:13:06,840
someone else’s roadmap.

322
00:13:06,840 –> 00:13:09,680
And enterprises don’t fail because they lack features.

323
00:13:09,680 –> 00:13:11,600
They fail because boundaries erode.

324
00:13:11,600 –> 00:13:15,280
plugin systems typically start with an optimistic premise.

325
00:13:15,280 –> 00:13:20,080
We’ll let the model call tools, but safely so the platform defines a plugin schema.

326
00:13:20,080 –> 00:13:24,120
You register an endpoint, you describe actions and the host decides when to call them.

327
00:13:24,120 –> 00:13:25,200
It looks clean.

328
00:13:25,200 –> 00:13:26,680
It demos well.

329
00:13:26,680 –> 00:13:28,400
Then you scale it.

330
00:13:28,400 –> 00:13:29,960
Now the real issues show up.

331
00:13:29,960 –> 00:13:34,120
In consistent permissions, in consistent schemas and inconsistent auditing, one plugin

332
00:13:34,120 –> 00:13:37,240
asks for broad read access because it can’t function otherwise.

333
00:13:37,240 –> 00:13:40,840
Another uses fine grained scopes but returns messy, untyped output.

334
00:13:40,840 –> 00:13:45,080
A third logs nothing useful because the platform doesn’t enforce audit discipline at the tool

335
00:13:45,080 –> 00:13:46,080
boundary.

336
00:13:46,080 –> 00:13:49,800
So you end up with an ecosystem of integrations that are all technically supported but operationally

337
00:13:49,800 –> 00:13:50,800
incomparable.

338
00:13:50,800 –> 00:13:52,160
That is not interoperability.

339
00:13:52,160 –> 00:13:53,760
That is standardization theater.

340
00:13:53,760 –> 00:13:55,920
The second problem is maintenance reality.

341
00:13:55,920 –> 00:13:59,600
In a plugin ecosystem, every platform update is a revalidation event.

342
00:13:59,600 –> 00:14:02,320
The host changes how it interprets tool descriptions.

343
00:14:02,320 –> 00:14:04,720
The model changes how it selects tools.

344
00:14:04,720 –> 00:14:09,000
The platform changes permission prompts or deprecates an auth flow or modifies how it

345
00:14:09,000 –> 00:14:10,160
passes context.

346
00:14:10,160 –> 00:14:14,280
The plugin still works until it doesn’t and when it breaks, it breaks at the worst layer.

347
00:14:14,280 –> 00:14:17,200
The layer where an LLM decides what to do next.

348
00:14:17,200 –> 00:14:20,280
That means your incident isn’t API call failed.

349
00:14:20,280 –> 00:14:24,720
Your incident is agent behavior drifted and you can’t patch that with a hot fix in a postman

350
00:14:24,720 –> 00:14:25,720
test.

351
00:14:25,720 –> 00:14:29,880
The third problem is lock in and it’s more subtle than we used proprietary APIs.

352
00:14:29,880 –> 00:14:33,800
Lock in happens because you build against the platform’s integration contract, not your

353
00:14:33,800 –> 00:14:34,800
own.

354
00:14:34,800 –> 00:14:40,840
Saming conventions, parameter shapes, error mapping, rate limits, approval prompts and user interaction

355
00:14:40,840 –> 00:14:44,040
patterns become entangled with one vendor’s client.

356
00:14:44,040 –> 00:14:48,120
So if you ever want to move the tool to another host, another co-pilot surface, another

357
00:14:48,120 –> 00:14:51,680
IDE agent, another model provider, you’re not porting code.

358
00:14:51,680 –> 00:14:53,280
You’re rebuilding semantics.

359
00:14:53,280 –> 00:14:54,920
And semantics are where the real cost is.

360
00:14:54,920 –> 00:14:56,960
This is also where governance gets weird.

361
00:14:56,960 –> 00:15:02,520
Enterprises want one consistent enforcement plane, identity, policy, logging, throttling, retention.

362
00:15:02,520 –> 00:15:06,320
Plug-in ecosystems usually give you some of that, but in platform-shaped ways, you get the

363
00:15:06,320 –> 00:15:07,640
platform’s consent screen.

364
00:15:07,640 –> 00:15:11,800
The platform’s audit format, the platform’s throttling assumptions and when you need to answer

365
00:15:11,800 –> 00:15:17,520
a compliance question, who accessed what, under what user through which tool, with what input,

366
00:15:17,520 –> 00:15:20,680
you discover that your data is trapped inside the platform’s lens.

367
00:15:20,680 –> 00:15:23,880
It’s auditable, but only in the way the vendor thinks matters.

368
00:15:23,880 –> 00:15:28,760
So plugins solved one pain, distribution and replaced it with a bigger one.

369
00:15:28,760 –> 00:15:32,000
Your integration boundary became a product feature you don’t control.

370
00:15:32,000 –> 00:15:35,200
Which is why everyone got excited about function calling next.

371
00:15:35,200 –> 00:15:36,960
It looked like the escape hatch.

372
00:15:36,960 –> 00:15:41,400
Forget marketplaces, forget vendor schemers, just define functions in code, call them with

373
00:15:41,400 –> 00:15:46,640
structured arguments, keep it inside your app, and then scale arrived, pre-mcp pattern

374
00:15:46,640 –> 00:15:49,400
three, function calling without a protocol.

375
00:15:49,400 –> 00:15:51,840
Function calling looked like the grown-up version of plugins.

376
00:15:51,840 –> 00:15:56,280
No marketplace, no vendor manifest format, no install this extension, just a set of functions

377
00:15:56,280 –> 00:16:00,560
in your own code base, describe with JSON schema and invoked by the model with structured

378
00:16:00,560 –> 00:16:04,960
arguments, clean, familiar, contained, and for a single app in a single repo with a single

379
00:16:04,960 –> 00:16:06,440
team, it mostly works.

380
00:16:06,440 –> 00:16:08,680
But here’s what function calling actually is.

381
00:16:08,680 –> 00:16:10,680
It’s a local convention inside one client.

382
00:16:10,680 –> 00:16:11,680
It is not a protocol.

383
00:16:11,680 –> 00:16:16,120
A protocol is what lets independent systems coordinate without sharing a code base, a deployment

384
00:16:16,120 –> 00:16:17,880
pipeline, or a set of assumptions.

385
00:16:17,880 –> 00:16:19,160
HTTP is a protocol.

386
00:16:19,160 –> 00:16:20,200
Oh, auth is a protocol.

387
00:16:20,200 –> 00:16:24,320
They survive because they define the interaction boundary clearly enough that two strangers

388
00:16:24,320 –> 00:16:27,160
can interoperate and still argue about everything else.

389
00:16:27,160 –> 00:16:28,840
Function calling doesn’t do that.

390
00:16:28,840 –> 00:16:30,240
Function calling says.

391
00:16:30,240 –> 00:16:34,320
But this one application will give the model a list of callable things.

392
00:16:34,320 –> 00:16:36,080
It does not standardize.

393
00:16:36,080 –> 00:16:40,400
Discovery across environments, version negotiation, transports, isolation, governance, or audit

394
00:16:40,400 –> 00:16:41,400
semantics.

395
00:16:41,400 –> 00:16:44,040
And those missing layers are exactly where enterprises bleed.

396
00:16:44,040 –> 00:16:45,040
So what happens?

397
00:16:45,040 –> 00:16:46,200
Everyone invents them again.

398
00:16:46,200 –> 00:16:49,160
One team puts functions behind an internal gateway.

399
00:16:49,160 –> 00:16:51,880
Another team wraps them with a thin tool router.

400
00:16:51,880 –> 00:16:56,720
A third team adds a database-backed registry so tools can be enabled per tenant.

401
00:16:56,720 –> 00:17:00,600
One else adds policy checks before execution, and now you’ve rebuilt a platform.

402
00:17:00,600 –> 00:17:04,320
Poorly, in five different ways, with five different security failure modes.

403
00:17:04,320 –> 00:17:06,600
This is the part most people don’t want to hear.

404
00:17:06,600 –> 00:17:08,000
Function calling is not a boundary.

405
00:17:08,000 –> 00:17:09,000
It’s a convenience layer.

406
00:17:09,000 –> 00:17:10,720
The model still doesn’t touch your API.

407
00:17:10,720 –> 00:17:12,640
The model still only sees descriptions.

408
00:17:12,640 –> 00:17:15,560
And if your descriptions are incomplete, the model still improvises.

409
00:17:15,560 –> 00:17:20,080
You just move the surface from rest endpoints to function names, and then you hit the overlap

410
00:17:20,080 –> 00:17:21,080
problem.

411
00:17:21,080 –> 00:17:24,160
In the real world, every enterprise has three search functions.

412
00:17:24,160 –> 00:17:25,160
One search is graph.

413
00:17:25,160 –> 00:17:26,480
One search is SharePoint.

414
00:17:26,480 –> 00:17:28,360
One searches the app database.

415
00:17:28,360 –> 00:17:29,840
Each one returns a different shape.

416
00:17:29,840 –> 00:17:34,120
Each one has different paging, different throttling, different semantics for top.

417
00:17:34,120 –> 00:17:37,400
The model sees three tools that look like they do the same thing, and it chooses based

418
00:17:37,400 –> 00:17:39,080
on vibes and token probabilities.

419
00:17:39,080 –> 00:17:40,080
That’s not tool use.

420
00:17:40,080 –> 00:17:41,080
That’s tool roulette.

421
00:17:41,080 –> 00:17:45,440
So teams try to fix it by stuffing more explanation into the tool description.

422
00:17:45,440 –> 00:17:48,240
Longer prompts, more examples, more rules.

423
00:17:48,240 –> 00:17:51,440
And it works until the next team adds the fourth search function.

424
00:17:51,440 –> 00:17:54,600
Because the root cause isn’t documentation quality, the root cause is that you never

425
00:17:54,600 –> 00:17:56,880
established a governable contract boundary.

426
00:17:56,880 –> 00:18:00,080
There’s also a security trap hidden here with function calling.

427
00:18:00,080 –> 00:18:04,200
Teams often assume that because the function is in the app, it inherits the app security

428
00:18:04,200 –> 00:18:05,200
posture.

429
00:18:05,200 –> 00:18:10,240
But the function is typically executed by the server side runtime identity, not the user,

430
00:18:10,240 –> 00:18:13,000
not the requester, the runtime.

431
00:18:13,000 –> 00:18:15,720
So you end up with a quiet privilege escalation.

432
00:18:15,720 –> 00:18:20,480
User asks a question, model requests a function, server executes it with whatever identity

433
00:18:20,480 –> 00:18:22,240
the service is running under.

434
00:18:22,240 –> 00:18:27,720
If that identity is a service principle with broad graph permissions, because it was easier,

435
00:18:27,720 –> 00:18:32,720
then your AI helper is now an unbounded automation account with a chat interface.

436
00:18:32,720 –> 00:18:34,080
That is not a good time.

437
00:18:34,080 –> 00:18:37,360
And even if you do the right thing and thread user tokens through, you still don’t have

438
00:18:37,360 –> 00:18:40,320
the protocol level enforcement and telemetry you need.

439
00:18:40,320 –> 00:18:42,240
You don’t have standardized call envelopes.

440
00:18:42,240 –> 00:18:45,040
You don’t have consistent correlation IDs across tool calls.

441
00:18:45,040 –> 00:18:46,720
You don’t have portable audit events.

442
00:18:46,720 –> 00:18:51,040
You don’t have a clean way to say this tool requires delegated access, and this other tool

443
00:18:51,040 –> 00:18:54,920
requires app only access, and the host must enforce that distinction.

444
00:18:54,920 –> 00:18:59,800
Instead you rely on developer discipline, which is just entropy with a nicer commit history.

445
00:18:59,800 –> 00:19:03,880
Function calling was the escape hatch from plug-in lock-in, but at enterprise scale it just

446
00:19:03,880 –> 00:19:08,680
created a new kind of sprawl, private tool APIs that can’t interoperate, can’t be governed

447
00:19:08,680 –> 00:19:12,720
consistently, and can’t be shared across hosts without rewriting everything again.

448
00:19:12,720 –> 00:19:15,800
And that’s why the next step wasn’t a better function calling library.

449
00:19:15,800 –> 00:19:16,800
It was a protocol.

450
00:19:16,800 –> 00:19:18,760
Pre-MCP pattern 4.

451
00:19:18,760 –> 00:19:21,000
Agent frameworks aren’t standards.

452
00:19:21,000 –> 00:19:24,480
After function calling hit its limits, the next move was predictable.

453
00:19:24,480 –> 00:19:25,480
Frameworks.

454
00:19:25,480 –> 00:19:28,960
Lang chain, semantic kernel, autogen, lang graph.

455
00:19:28,960 –> 00:19:31,800
Then a new one every week, each promising the same thing.

456
00:19:31,800 –> 00:19:34,600
Stop writing glue, start building agents.

457
00:19:34,600 –> 00:19:35,600
Frameworks do help.

458
00:19:35,600 –> 00:19:39,160
They give you patterns for tool selection, memory, retries, planning and orchestration.

459
00:19:39,160 –> 00:19:42,040
They make prototypes feel like products for about two weeks.

460
00:19:42,040 –> 00:19:43,280
And then the enterprise shows up.

461
00:19:43,280 –> 00:19:44,280
Here’s the foundational mistake.

462
00:19:44,280 –> 00:19:47,840
Frameworks optimize developer velocity inside a project.

463
00:19:47,840 –> 00:19:50,360
Standards optimize interoperability across projects.

464
00:19:50,360 –> 00:19:51,480
Those are not the same job.

465
00:19:51,480 –> 00:19:54,760
A framework is a set of conventions plus runtime code.

466
00:19:54,760 –> 00:19:59,080
It assumes you’ll run its loop, store state its way, define tools its way, and deploy it

467
00:19:59,080 –> 00:20:01,160
in a world where you control both ends.

468
00:20:01,160 –> 00:20:03,400
That’s fine when you own the whole stack.

469
00:20:03,400 –> 00:20:04,600
Enterprises don’t own the whole stack.

470
00:20:04,600 –> 00:20:08,080
They have multiple teams, multiple languages, multiple hosting environments, multiple

471
00:20:08,080 –> 00:20:12,000
risk postures and multiple approval chains that exist because auditors don’t accept

472
00:20:12,000 –> 00:20:14,480
the framework handles it as an answer.

473
00:20:14,480 –> 00:20:16,320
So portability collapses first.

474
00:20:16,320 –> 00:20:20,240
Tools written for one framework don’t transfer cleanly to another, even when they look similar.

475
00:20:20,240 –> 00:20:23,480
One framework calls tools with a certain schema shape.

476
00:20:23,480 –> 00:20:27,920
Another embeds extra metadata, a third models tools as a class with side effects.

477
00:20:27,920 –> 00:20:30,760
A fourth assumes a specific message format for streaming.

478
00:20:30,760 –> 00:20:33,800
The details vary and those details are where systems break.

479
00:20:33,800 –> 00:20:37,480
You end up with the same problem you had with plugins, just redistributed.

480
00:20:37,480 –> 00:20:41,440
Integration artifacts tied to a runtime you didn’t want to standardize on.

481
00:20:41,440 –> 00:20:43,320
Then governance collapses.

482
00:20:43,320 –> 00:20:44,600
Most frameworks can log.

483
00:20:44,600 –> 00:20:45,600
They can trace.

484
00:20:45,600 –> 00:20:46,840
They can do observability.

485
00:20:46,840 –> 00:20:50,560
But they don’t give you audit grade boundaries by default because audit grade boundaries are

486
00:20:50,560 –> 00:20:51,840
not a library feature.

487
00:20:51,840 –> 00:20:57,080
They’re an architectural decision enforced at the edges, identity proof, policy evaluation,

488
00:20:57,080 –> 00:21:01,840
data minimization and a clear mapping from action to accountable principle.

489
00:21:01,840 –> 00:21:06,440
If your agent framework executes tools using an application identity with broad permissions,

490
00:21:06,440 –> 00:21:07,760
you didn’t build an agent.

491
00:21:07,760 –> 00:21:11,000
You built a privileged automation account with conversational UX.

492
00:21:11,000 –> 00:21:15,440
If your framework allows a tool to receive arbitrary user provided strings that flow straight

493
00:21:15,440 –> 00:21:18,400
into downstream APIs you didn’t build orchestration.

494
00:21:18,400 –> 00:21:20,800
You built a prompt injection amplifier.

495
00:21:20,800 –> 00:21:24,280
And frameworks tend to hide the sharp edges because they’re trying to be helpful, helpful

496
00:21:24,280 –> 00:21:26,560
means convenience defaults.

497
00:21:26,560 –> 00:21:30,960
Convenience defaults mean silent permission expansion, implicit retries, broad tool exposure

498
00:21:30,960 –> 00:21:32,880
and just make it work behavior.

499
00:21:32,880 –> 00:21:35,080
That’s how entropy enters.

500
00:21:35,080 –> 00:21:38,800
There’s also a life cycle problem that frameworks can’t solve for you.

501
00:21:38,800 –> 00:21:40,600
Enterprises don’t just need agents to run.

502
00:21:40,600 –> 00:21:41,920
They need them to survive.

503
00:21:41,920 –> 00:21:47,080
Final executions, timeouts, compensating actions, fail-close behavior, human approvals, cost

504
00:21:47,080 –> 00:21:51,280
controls, change management, a stable contract that other teams can build against without

505
00:21:51,280 –> 00:21:53,320
importing your entire runtime.

506
00:21:53,320 –> 00:21:54,960
Frameworks are not built to be that contract.

507
00:21:54,960 –> 00:21:57,120
They are built to be your scaffolding.

508
00:21:57,120 –> 00:21:59,040
So what happens over time is simple.

509
00:21:59,040 –> 00:22:03,400
Every team picks a different framework than every team builds a different tool abstraction.

510
00:22:03,400 –> 00:22:06,160
Then every team invents a different way to secure it.

511
00:22:06,160 –> 00:22:10,320
Then security teams show up and ban half of it because there’s no consistent enforcement

512
00:22:10,320 –> 00:22:11,800
point.

513
00:22:11,800 –> 00:22:13,480
Now you’re back to the beginning.

514
00:22:13,480 –> 00:22:14,480
Custom glue everywhere.

515
00:22:14,480 –> 00:22:16,000
This is the uncomfortable truth.

516
00:22:16,000 –> 00:22:18,640
Agent frameworks are accelerators for prototypes.

517
00:22:18,640 –> 00:22:21,480
They are not coordination layers for ecosystems.

518
00:22:21,480 –> 00:22:24,280
And once you accept that, the next step becomes inevitable.

519
00:22:24,280 –> 00:22:26,640
The missing layer isn’t a better agent loop.

520
00:22:26,640 –> 00:22:31,520
The missing layer is a protocol that defines how tools are described, how capabilities

521
00:22:31,520 –> 00:22:35,640
are discovered, how calls are transported, and where isolation boundaries live.

522
00:22:35,640 –> 00:22:37,480
That’s what MCPs are trying to be.

523
00:22:37,480 –> 00:22:39,600
Why a protocol was inevitable?

524
00:22:39,600 –> 00:22:41,480
Standard speed frameworks at scale.

525
00:22:41,480 –> 00:22:45,760
Once you’ve watched rest rappers drift, plug in ecosystems, trap you, function calling

526
00:22:45,760 –> 00:22:50,600
fragment into private conventions, and agent frameworks multiply like rabbits, you end

527
00:22:50,600 –> 00:22:51,920
up with one conclusion.

528
00:22:51,920 –> 00:22:54,720
The problem isn’t that teams can’t build integrations.

529
00:22:54,720 –> 00:22:56,800
The problem is that they can’t coordinate them.

530
00:22:56,800 –> 00:22:58,520
Coordination is not a library feature.

531
00:22:58,520 –> 00:22:59,520
It’s a protocol problem.

532
00:22:59,520 –> 00:23:04,200
This is why protocols keep showing up at the exact moment an ecosystem stops being a project

533
00:23:04,200 –> 00:23:05,880
and starts being an economy.

534
00:23:05,880 –> 00:23:09,360
HTTP didn’t win because it was the most elegant way to move bytes.

535
00:23:09,360 –> 00:23:13,280
But one, because it let strangers build software that could talk to other software without a

536
00:23:13,280 –> 00:23:14,280
shared code base.

537
00:23:14,280 –> 00:23:17,280
Oh, oath didn’t win because developers love oath flows.

538
00:23:17,280 –> 00:23:21,520
It won because it let independent systems delegate authority without exchanging passwords

539
00:23:21,520 –> 00:23:25,040
and without inventing a new custom trust dance every time.

540
00:23:25,040 –> 00:23:29,280
Open API exists for the same reason, not because APIs were impossible, but because organizations

541
00:23:29,280 –> 00:23:34,240
needed a shared contract language to reduce ambiguity across teams, vendors, and tooling.

542
00:23:34,240 –> 00:23:37,160
MCP is the same move, just aimed at a new a failure mode.

543
00:23:37,160 –> 00:23:40,640
Because the moment you put an LLM in the loop, you introduce a caller that is inherently

544
00:23:40,640 –> 00:23:44,720
non-deterministic, operating against systems that are designed to be deterministic.

545
00:23:44,720 –> 00:23:48,440
The integration problem stops being how do we call the API and becomes how do we express

546
00:23:48,440 –> 00:23:53,280
capabilities and authority in a way that stays stable even when the caller is probabilistic.

547
00:23:53,280 –> 00:23:54,280
Frameworks can’t solve that.

548
00:23:54,280 –> 00:23:55,640
They can only hide it.

549
00:23:55,640 –> 00:23:56,880
Standards don’t hide complexity.

550
00:23:56,880 –> 00:23:57,880
They pin it down.

551
00:23:57,880 –> 00:23:59,360
That distinction matters.

552
00:23:59,360 –> 00:24:02,680
A framework says, here’s how we do tool calling in this runtime.

553
00:24:02,680 –> 00:24:07,680
A standard says, here’s how any runtime can describe tools, negotiate capabilities, and invoke

554
00:24:07,680 –> 00:24:09,760
them over a consistent envelope.

555
00:24:09,760 –> 00:24:13,040
That’s the difference between an integration that works in one repo and an integration that

556
00:24:13,040 –> 00:24:14,800
can become an organizational asset.

557
00:24:14,800 –> 00:24:18,880
And in an enterprise, organizational assets are the only thing worth building.

558
00:24:18,880 –> 00:24:22,480
Everything else becomes abandoned middleware with a service principle nobody owns.

559
00:24:22,480 –> 00:24:24,400
Here’s the other uncomfortable truth.

560
00:24:24,400 –> 00:24:29,440
Once multiple tool providers and multiple tool consumers exist, best practice collapses.

561
00:24:29,440 –> 00:24:30,440
It always does.

562
00:24:30,440 –> 00:24:32,240
Best practice requires alignment.

563
00:24:32,240 –> 00:24:33,680
It requires governance.

564
00:24:33,680 –> 00:24:35,520
Governance requires a shared boundary.

565
00:24:35,520 –> 00:24:39,600
Without a shared boundary, your best practice is just a style guide no one reads.

566
00:24:39,600 –> 00:24:42,480
So a protocol becomes inevitable because it gives you three things.

567
00:24:42,480 –> 00:24:44,560
Frameworks can’t provide across an ecosystem.

568
00:24:44,560 –> 00:24:46,680
First, a stable interaction contract.

569
00:24:46,680 –> 00:24:51,240
Not we call functions, but how you list capabilities, how you call them, what the requests and response

570
00:24:51,240 –> 00:24:57,280
envelopes look like, how errors are represented, and how state is managed when state matters.

571
00:24:57,280 –> 00:24:58,280
Second, portability.

572
00:24:58,280 –> 00:25:01,880
A tool described through a protocol can outlive your current agent framework.

573
00:25:01,880 –> 00:25:03,880
It can outlive your current model provider.

574
00:25:03,880 –> 00:25:06,040
It can outlive your current host application.

575
00:25:06,040 –> 00:25:07,040
That’s not theoretical.

576
00:25:07,040 –> 00:25:10,080
That’s the difference between a two year investment and a quarterly experiment.

577
00:25:10,080 –> 00:25:12,920
Third, a place to enforce boundaries consistently.

578
00:25:12,920 –> 00:25:16,440
Not by trusting developers to remember rules, but by forcing the interaction through a

579
00:25:16,440 –> 00:25:19,200
shape where identity policy and audit can attach.

580
00:25:19,200 –> 00:25:23,560
And this is why MCP’s bet is not let standardized AI integrations.

581
00:25:23,560 –> 00:25:24,960
It’s narrower and smarter.

582
00:25:24,960 –> 00:25:28,560
Standardize how context and capabilities are presented to a model driven host and how

583
00:25:28,560 –> 00:25:31,600
the host invokes external tool servers in a controlled way.

584
00:25:31,600 –> 00:25:33,920
That’s why MCP isn’t competing with agent frameworks.

585
00:25:33,920 –> 00:25:35,640
It’s sitting underneath them.

586
00:25:35,640 –> 00:25:39,520
Frameworks can keep innovating on planning loops and memory strategies and orchestration

587
00:25:39,520 –> 00:25:40,520
patterns.

588
00:25:40,520 –> 00:25:41,520
Fine, let them.

589
00:25:41,520 –> 00:25:44,640
But they need a stable substrate for tool integration that doesn’t turn into glue code

590
00:25:44,640 –> 00:25:47,240
entropy the moment you cross team boundaries.

591
00:25:47,240 –> 00:25:49,880
This is also why this fits Microsoft’s world so well.

592
00:25:49,880 –> 00:25:52,040
Microsoft doesn’t sell simple.

593
00:25:52,040 –> 00:25:53,800
Microsoft sells governable.

594
00:25:53,800 –> 00:25:58,480
Identity first, policy driven, audit heavy systems that assume entropy is the default

595
00:25:58,480 –> 00:26:00,880
and control has to be enforced by design.

596
00:26:00,880 –> 00:26:05,440
So yes, a protocol was inevitable because at scale you either standardize the boundary

597
00:26:05,440 –> 00:26:07,760
or you standardize the incident review.

598
00:26:07,760 –> 00:26:13,080
MCP defined precisely communication plus capabilities plus boundaries.

599
00:26:13,080 –> 00:26:18,280
So now define MCP without the analogies because USB for AI is cute but it hides the part

600
00:26:18,280 –> 00:26:19,760
that matters.

601
00:26:19,760 –> 00:26:24,600
MCP is a protocol that defines how an AI host talks to external capability servers.

602
00:26:24,600 –> 00:26:25,600
That’s it.

603
00:26:25,600 –> 00:26:26,840
Not the model talks to tools.

604
00:26:26,840 –> 00:26:28,360
The model still doesn’t touch anything.

605
00:26:28,360 –> 00:26:29,360
The host does.

606
00:26:29,360 –> 00:26:34,200
MCP defines the shape of that interaction so it can be repeatable, inspectable and governable.

607
00:26:34,200 –> 00:26:38,160
At the wire level, MCP uses JSON RPC2 as the message format.

608
00:26:38,160 –> 00:26:41,560
That means you get a predictable request and response envelope.

609
00:26:41,560 –> 00:26:44,800
Method names, parameters, IDs and structured error objects.

610
00:26:44,800 –> 00:26:46,960
The point isn’t that JSON RPC is fashionable.

611
00:26:46,960 –> 00:26:51,960
The point is that the tool call stops being some HTTP request your agent loop invented

612
00:26:51,960 –> 00:26:55,560
and becomes a standardized call with a known life cycle.

613
00:26:55,560 –> 00:26:59,720
MCP also forces you to separate two layers people keep mixing up.

614
00:26:59,720 –> 00:27:01,120
Transport and protocol.

615
00:27:01,120 –> 00:27:03,400
The protocol is the message format and semantics.

616
00:27:03,400 –> 00:27:05,440
The transport is how bytes move.

617
00:27:05,440 –> 00:27:11,880
MCP supports local process boundary transports like SDDIO and remote transports over HTTP

618
00:27:11,880 –> 00:27:13,240
with streaming options.

619
00:27:13,240 –> 00:27:14,840
Those transports aren’t cosmetic.

620
00:27:14,840 –> 00:27:16,960
They define where your trust boundary sits.

621
00:27:16,960 –> 00:27:19,200
Local stereo is a local execution trust problem.

622
00:27:19,200 –> 00:27:22,040
Remote HTTP is an identity and policy problem.

623
00:27:22,040 –> 00:27:23,640
Same protocol, different blast radius.

624
00:27:23,640 –> 00:27:25,600
Now the second part, capabilities.

625
00:27:25,600 –> 00:27:28,800
MCP is not, here’s an endpoint, good luck.

626
00:27:28,800 –> 00:27:30,320
It’s capability declaration.

627
00:27:30,320 –> 00:27:34,560
An MCP server advertises what it can do and the client negotiates what it supports.

628
00:27:34,560 –> 00:27:38,880
That means the host can enumerate tools and decide what to expose to the model and under

629
00:27:38,880 –> 00:27:39,880
what conditions.

630
00:27:39,880 –> 00:27:43,440
This matters because tools for all doesn’t become manageable by writing better prompts.

631
00:27:43,440 –> 00:27:47,920
It becomes manageable when the host can treat tools as a capability surface.

632
00:27:47,920 –> 00:27:50,600
Discoverable, versionable and constrained.

633
00:27:50,600 –> 00:27:54,000
Start a pile of bespoke function calls scattered across repos.

634
00:27:54,000 –> 00:27:58,280
In MCP, servers expose three primitives, tools, resources and prompts.

635
00:27:58,280 –> 00:27:59,280
Tools are actions.

636
00:27:59,280 –> 00:28:01,480
They have names, descriptions and schemers.

637
00:28:01,480 –> 00:28:05,280
They are the part that changes the world or at least queries it with intent.

638
00:28:05,280 –> 00:28:07,840
Because the model is probabilistic, tools have to be deterministic.

639
00:28:07,840 –> 00:28:10,880
Your tool schema is you forcing ambiguity out of the interface.

640
00:28:10,880 –> 00:28:14,320
If you leave ambiguity in, the model will reintroduce it for you.

641
00:28:14,320 –> 00:28:15,640
Resources are raw context.

642
00:28:15,640 –> 00:28:19,640
Think, read oriented inputs that can be pulled into the model’s working set or used

643
00:28:19,640 –> 00:28:20,640
for retrieval.

644
00:28:20,640 –> 00:28:21,640
They’re not actions.

645
00:28:21,640 –> 00:28:23,680
They are structured ways to fetch data.

646
00:28:23,680 –> 00:28:26,720
And separating resources from tools is not pedantry.

647
00:28:26,720 –> 00:28:29,280
It’s how you separate knowledge from authority.

648
00:28:29,280 –> 00:28:30,280
Prompts or templates.

649
00:28:30,280 –> 00:28:31,960
They are productized in tent shaping.

650
00:28:31,960 –> 00:28:36,200
In practice, they are how a host can offer a consistent entry point like a slash command

651
00:28:36,200 –> 00:28:40,440
without requiring every user to reinvent the same instruction set.

652
00:28:40,440 –> 00:28:43,560
Prompts aren’t governance by themselves, but they reduce drift in how people ask for

653
00:28:43,560 –> 00:28:44,560
the same operation.

654
00:28:44,560 –> 00:28:46,120
Now the third part, boundaries.

655
00:28:46,120 –> 00:28:49,160
MCP’s isolation model is the thing you should care about most.

656
00:28:49,160 –> 00:28:52,360
And MCP server does not automatically see the full conversation.

657
00:28:52,360 –> 00:28:54,520
The host mediates what context is sent.

658
00:28:54,520 –> 00:28:56,440
Each server is isolated from other servers.

659
00:28:56,440 –> 00:29:00,320
That means MCP gives you a place to implement data minimization by design.

660
00:29:00,320 –> 00:29:04,280
Only send the minimum context necessary for this call to this server at this time.

661
00:29:04,280 –> 00:29:05,840
That is the architectural choke point.

662
00:29:05,840 –> 00:29:10,160
It’s the difference between the model can do things and the model can request things

663
00:29:10,160 –> 00:29:12,480
and the platform decides what actually happens.

664
00:29:12,480 –> 00:29:16,960
So when people describe MCP as standardized function calling, they’re missing the enforcement

665
00:29:16,960 –> 00:29:17,960
potential.

666
00:29:17,960 –> 00:29:19,920
Calling is usually an in-process feature.

667
00:29:19,920 –> 00:29:25,600
MCP is an externalized contract with explicit discovery, explicit capability surfaces,

668
00:29:25,600 –> 00:29:29,000
and transport choices that map cleanly to trust boundaries.

669
00:29:29,000 –> 00:29:31,040
And the cleanest way to say it is this.

670
00:29:31,040 –> 00:29:35,840
MCP is a protocol that turns tool use into an auditable, governable interface.

671
00:29:35,840 –> 00:29:38,160
Because it puts the host back in charge of authority.

672
00:29:38,160 –> 00:29:39,400
That’s what we needed all along.

673
00:29:39,400 –> 00:29:43,720
Now that MCP is defined precisely, the next step is to break down the primitives that

674
00:29:43,720 –> 00:29:47,760
actually matter in real systems, resources, tools and prompts.

675
00:29:47,760 –> 00:29:52,840
And why mixing them is how you accidentally give an LLM more power than you intended.

676
00:29:52,840 –> 00:29:57,040
MCP primitives that actually matter, resources, tools, prompts.

677
00:29:57,040 –> 00:30:01,400
Most explanations of MCP stop at the vocabulary list, resources, tools, prompts.

678
00:30:01,400 –> 00:30:05,520
And then they move on like naming the parts is the same as understanding the failure modes.

679
00:30:05,520 –> 00:30:06,520
It isn’t.

680
00:30:06,520 –> 00:30:10,960
These three primitives are MCP’s real contribution because they force you to separate things,

681
00:30:10,960 –> 00:30:13,200
enterprises keep mixing together.

682
00:30:13,200 –> 00:30:16,240
Information, action and intent shaping.

683
00:30:16,240 –> 00:30:19,400
When you mix them, you don’t just create messy integrations.

684
00:30:19,400 –> 00:30:22,800
You create authority leaks, start with resources.

685
00:30:22,800 –> 00:30:24,480
Resources are read-oriented.

686
00:30:24,480 –> 00:30:29,280
They are how an MCP server exposes context without pretending it’s an action.

687
00:30:29,280 –> 00:30:32,120
Think of them as controlled retrieval surfaces.

688
00:30:32,120 –> 00:30:33,640
Give me the policy text.

689
00:30:33,640 –> 00:30:34,640
Give me the schema.

690
00:30:34,640 –> 00:30:35,840
Give me the metadata.

691
00:30:35,840 –> 00:30:37,600
Give me the last 20 entries.

692
00:30:37,600 –> 00:30:41,000
They’re rag-friendly by design because they produce inputs the host can decide to pass

693
00:30:41,000 –> 00:30:42,800
into the model’s context window.

694
00:30:42,800 –> 00:30:44,520
But here’s the crucial part.

695
00:30:44,520 –> 00:30:45,960
Resources should not mutate anything.

696
00:30:45,960 –> 00:30:49,360
The moment you let a resource also perform an action you’ve created a hidden side effect

697
00:30:49,360 –> 00:30:50,360
channel.

698
00:30:50,360 –> 00:30:53,880
Side effects are where audit trails get fuzzy and blame gets shared.

699
00:30:53,880 –> 00:30:55,680
Enterprises don’t survive shared blame.

700
00:30:55,680 –> 00:31:00,640
So you treat resources as context supply, stable shapes, clear identifiers, minimal surprise.

701
00:31:00,640 –> 00:31:04,920
If you want a model to understand what confidential means in your tenant, you don’t give it a tool

702
00:31:04,920 –> 00:31:07,040
called “interpret confidentiality”.

703
00:31:07,040 –> 00:31:11,400
You give it a resource that returns the actual classification policy, deterministic input,

704
00:31:11,400 –> 00:31:13,440
probabilistic reasoning, that’s the correct separation.

705
00:31:13,440 –> 00:31:14,920
Now tools.

706
00:31:14,920 –> 00:31:16,560
Tools are where the blast radius lives.

707
00:31:16,560 –> 00:31:18,000
A tool is an action interface.

708
00:31:18,000 –> 00:31:22,440
It either changes the world or it queries something in a way that drives downstream action.

709
00:31:22,440 –> 00:31:26,800
And because the model is probabilistic, tool interfaces must be intentionally boring.

710
00:31:26,800 –> 00:31:27,800
Strict schemas.

711
00:31:27,800 –> 00:31:32,240
Stable output shapes, narrow parameter ranges, and names that make overlap impossible.

712
00:31:32,240 –> 00:31:34,320
This is where most teams sabotage themselves.

713
00:31:34,320 –> 00:31:38,840
They define tools like search, get, update, and create with optional parameters that

714
00:31:38,840 –> 00:31:39,840
change meaning.

715
00:31:39,840 –> 00:31:43,120
Then they wonder why the model calls the wrong thing or calls the right thing with the

716
00:31:43,120 –> 00:31:44,120
wrong scope.

717
00:31:44,120 –> 00:31:45,600
A tool schema is not documentation.

718
00:31:45,600 –> 00:31:48,440
It is your enforcement mechanism against ambiguity.

719
00:31:48,440 –> 00:31:52,960
If you allow site id or site URL as optional fields, the model will sometimes send both.

720
00:31:52,960 –> 00:31:57,120
If you allow query as a free string, the model will eventually embed instructions in it.

721
00:31:57,120 –> 00:32:01,440
If you return results as an untyped array of mixed objects, you’re making the model reverse

722
00:32:01,440 –> 00:32:03,520
engineer your domain model mid-flight.

723
00:32:03,520 –> 00:32:06,600
That’s not intelligence, that’s punishment.

724
00:32:06,600 –> 00:32:10,760
The correct pattern is to design tools like deterministic RPC calls.

725
00:32:10,760 –> 00:32:15,040
And input so a model can’t get creatively, constraint output so a model can’t hallucinate

726
00:32:15,040 –> 00:32:16,760
structure that isn’t there.

727
00:32:16,760 –> 00:32:21,520
And log every call as a first class audit event tied to an identity, a scope, and a correlation

728
00:32:21,520 –> 00:32:22,520
ID.

729
00:32:22,520 –> 00:32:26,120
Now prompts in MCPR templates, productized intent shaping.

730
00:32:26,120 –> 00:32:28,920
They exist because humans are the original entropy source.

731
00:32:28,920 –> 00:32:33,160
If you let every user invent their own, please summarize this and then do the thing instruction

732
00:32:33,160 –> 00:32:35,200
set, you get behavioral drift.

733
00:32:35,200 –> 00:32:40,400
And drift turns into inconsistent tool usage, inconsistent approvals, and inconsistent risk.

734
00:32:40,400 –> 00:32:42,040
Let’s reduce that.

735
00:32:42,040 –> 00:32:46,160
They give the host a stable entry point, use the approved template for SharePoint document

736
00:32:46,160 –> 00:32:47,160
review.

737
00:32:47,160 –> 00:32:50,440
Not because prompts are magic, but because they standardize how the task is framed and

738
00:32:50,440 –> 00:32:51,800
what constraints are stated.

739
00:32:51,800 –> 00:32:53,080
But prompts are not governance.

740
00:32:53,080 –> 00:32:55,400
They’re guardrails for the human, not the model.

741
00:32:55,400 –> 00:32:59,200
The governance still lives in the hosts’ decision about which resources and tools are

742
00:32:59,200 –> 00:33:01,520
even available, and under which identity.

743
00:33:01,520 –> 00:33:03,040
So the split matters.

744
00:33:03,040 –> 00:33:07,160
Resources feed knowledge, tools exercise authority, prompts shape intent.

745
00:33:07,160 –> 00:33:09,720
Knowledge is not authority, authority is not intent.

746
00:33:09,720 –> 00:33:12,920
And MCP’s primitives force you to stop pretending they are.

747
00:33:12,920 –> 00:33:15,360
Next, the uncomfortable part transport and state.

748
00:33:15,360 –> 00:33:21,720
Because when you move from local studio to remote HTTP, you’re not changing performance

749
00:33:21,720 –> 00:33:22,720
characteristics.

750
00:33:22,720 –> 00:33:25,200
You’re changing who has to be trusted.

751
00:33:25,200 –> 00:33:26,200
Transport and state.

752
00:33:26,200 –> 00:33:31,440
Stiav versus HTTP, local versus remote, and why it’s not cosmetic.

753
00:33:31,440 –> 00:33:34,760
Transport is where most protocol people lose the room because it sounds like plumbing.

754
00:33:34,760 –> 00:33:36,520
But transport is not plumbing.

755
00:33:36,520 –> 00:33:39,040
Transport is the first place your trust model becomes real.

756
00:33:39,040 –> 00:33:41,240
MCP gives you at least two common transports.

757
00:33:41,240 –> 00:33:42,440
Stiav and HTTP.

758
00:33:42,440 –> 00:33:44,720
People talk about them like the difference is performance.

759
00:33:44,720 –> 00:33:47,360
Local is faster, remote is slower, pick your favorite.

760
00:33:47,360 –> 00:33:48,840
That’s the comfortable story.

761
00:33:48,840 –> 00:33:53,760
The real story is, STDO and HTTP change who you have to trust, what identity you can

762
00:33:53,760 –> 00:33:55,920
prove and what failure looks like.

763
00:33:55,920 –> 00:33:56,920
Start with STDO.

764
00:33:56,920 –> 00:33:58,440
STDO is a local process boundary.

765
00:33:58,440 –> 00:34:02,760
The host starts the MCP server as a child process, then communicates over standard input

766
00:34:02,760 –> 00:34:03,760
and output.

767
00:34:03,760 –> 00:34:06,000
No network, no load balancer, no TLS.

768
00:34:06,000 –> 00:34:08,440
It feels safe because it’s on the machine.

769
00:34:08,440 –> 00:34:11,760
And it can be safe if you treat local execution as a security boundary.

770
00:34:11,760 –> 00:34:12,760
But most teams don’t.

771
00:34:12,760 –> 00:34:14,840
They treat local as trusted.

772
00:34:14,840 –> 00:34:18,720
Then they start running random community MCP servers because it’s convenient.

773
00:34:18,720 –> 00:34:23,120
And now your AI host is launching arbitrary code with whatever file system and network access

774
00:34:23,120 –> 00:34:24,560
your user account has.

775
00:34:24,560 –> 00:34:26,160
Local doesn’t mean safe.

776
00:34:26,160 –> 00:34:29,160
Local means the trust decision moved from the network to the endpoint.

777
00:34:29,160 –> 00:34:33,160
If you’re on Windows, that endpoint is now a workstation with browser sessions, cache

778
00:34:33,160 –> 00:34:38,040
tokens, synced one drive content, and usually an over-privileged developer identity.

779
00:34:38,040 –> 00:34:39,720
If you’re on a build agent, it’s worse.

780
00:34:39,720 –> 00:34:42,840
It’s a machine with CI secrets and deployment permissions.

781
00:34:42,840 –> 00:34:47,000
So STDO is great for development because it’s simple and fast.

782
00:34:47,000 –> 00:34:50,040
And the isolation is basically the OS process boundary.

783
00:34:50,040 –> 00:34:52,840
But it also means the server is inside your blast radius.

784
00:34:52,840 –> 00:34:58,520
Now HTTP, HTTP is where the enterprise story begins because remote MCP servers are how

785
00:34:58,520 –> 00:35:01,080
you build shared capability services.

786
00:35:01,080 –> 00:35:06,880
The SharePoint MCP server, the Graph MCP server, the ticketing MCP server, centralized,

787
00:35:06,880 –> 00:35:09,600
managed, logged, rate-limited, scalable.

788
00:35:09,600 –> 00:35:13,040
But remote means every tool call is now a distributed system call.

789
00:35:13,040 –> 00:35:14,480
So identity must be explicit.

790
00:35:14,480 –> 00:35:18,520
If your MCP server is remote and it doesn’t authenticate callers properly, you didn’t

791
00:35:18,520 –> 00:35:19,600
build a tool server.

792
00:35:19,600 –> 00:35:22,000
You build Shadow IT with a JSON RPC wrapper.

793
00:35:22,000 –> 00:35:23,640
This is where entra flows matter.

794
00:35:23,640 –> 00:35:26,440
With HTTP, you can and should require a token.

795
00:35:26,440 –> 00:35:30,520
That token should have an audience, scopes or roles, and an accountable principle.

796
00:35:30,520 –> 00:35:34,240
And you need to decide whether that principle is the user, the workload, or a broken identity

797
00:35:34,240 –> 00:35:35,600
via on behalf of.

798
00:35:35,600 –> 00:35:38,360
As remote changes, what the audit trail can prove.

799
00:35:38,360 –> 00:35:41,080
With STDO, your audit trail is mostly host local.

800
00:35:41,080 –> 00:35:42,440
The user ran this tool.

801
00:35:42,440 –> 00:35:45,680
With HTTP, your audit trail can be centralized.

802
00:35:45,680 –> 00:35:50,520
This user, through this host, called this tool under this policy at this time.

803
00:35:50,520 –> 00:35:52,040
That’s a different class of defensibility.

804
00:35:52,040 –> 00:35:55,800
Now state, MCP connections are typically stateful at the protocol level.

805
00:35:55,800 –> 00:35:58,600
That doesn’t mean the server stores your conversation history.

806
00:35:58,600 –> 00:36:00,520
It means there’s a session lifecycle.

807
00:36:00,520 –> 00:36:05,840
Initialize, negotiate capabilities, exchange messages, and the server can send notifications

808
00:36:05,840 –> 00:36:08,400
or progress updates in a consistent way.

809
00:36:08,400 –> 00:36:11,200
Statefulness matters because tool execution isn’t always instant.

810
00:36:11,200 –> 00:36:13,000
A search files tool might be fast.

811
00:36:13,000 –> 00:36:15,240
A raindeck’s aside tool might take minutes.

812
00:36:15,240 –> 00:36:17,440
A, create a report tool might be queued.

813
00:36:17,440 –> 00:36:22,080
If you treat every tool as a stateless request response call, you end up reinventing long-running

814
00:36:22,080 –> 00:36:23,920
task patterns poorly.

815
00:36:23,920 –> 00:36:28,560
Polling endpoints, random retries, duplicate actions, and half-finished operations that look

816
00:36:28,560 –> 00:36:30,720
successful to the model.

817
00:36:30,720 –> 00:36:33,680
And remember, agent loops amplify ambiguity.

818
00:36:33,680 –> 00:36:36,440
If a tool call is slow or flaky, the model doesn’t just wait.

819
00:36:36,440 –> 00:36:40,200
It tries again, or it tries something else, or it assumes the action completed and moves

820
00:36:40,200 –> 00:36:41,200
on.

821
00:36:41,200 –> 00:36:45,840
So you need explicit patterns for state, progress events, correlation IDs, and idempotency

822
00:36:45,840 –> 00:36:48,200
keys, where actions mutate systems.

823
00:36:48,200 –> 00:36:49,200
That’s not optional.

824
00:36:49,200 –> 00:36:51,240
Now connect this back to Microsoft reality.

825
00:36:51,240 –> 00:36:52,560
Studio is your dev loop.

826
00:36:52,560 –> 00:36:54,520
HTTP is your enterprise loop.

827
00:36:54,520 –> 00:36:57,480
Local MCP servers are for building and experimenting.

828
00:36:57,480 –> 00:36:59,960
Vote MCP servers are for governance.

829
00:36:59,960 –> 00:37:05,200
Entra backed A, A, P, I, M, front doors, logging into Sentinel and policy enforcement that

830
00:37:05,200 –> 00:37:08,880
doesn’t depend on whether a developer remembered to do the right thing.

831
00:37:08,880 –> 00:37:12,560
And here’s the rule you should tattoo onto every architecture diagram.

832
00:37:12,560 –> 00:37:16,360
Transport choices change trust boundaries, not just latency.

833
00:37:16,360 –> 00:37:20,680
So before you ask functions or container apps ask the real question, where does this tool

834
00:37:20,680 –> 00:37:25,400
run, under which identity, with what policy, and what happens when it fails.

835
00:37:25,400 –> 00:37:29,120
Because if you can’t answer that, you don’t have an MCP architecture, you have a demo.

836
00:37:29,120 –> 00:37:31,040
MCP meets Microsoft.

837
00:37:31,040 –> 00:37:32,760
Why this fits too well.

838
00:37:32,760 –> 00:37:37,280
This is where MCP stops being an AI developer trend and starts looking like a Microsoft

839
00:37:37,280 –> 00:37:39,520
platform move that was going to happen anyway.

840
00:37:39,520 –> 00:37:42,000
Because Microsoft doesn’t really build products around models.

841
00:37:42,000 –> 00:37:44,560
Microsoft builds products around governance.

842
00:37:44,560 –> 00:37:50,000
And that distinction matters because MCP is, architecturally, a governance primitive, pretending

843
00:37:50,000 –> 00:37:51,800
to be an integration protocol.

844
00:37:51,800 –> 00:37:55,360
Most ecosystems treat tool integration as a convenience feature.

845
00:37:55,360 –> 00:37:59,480
When you add after the model works, Microsoft environments treat integration as the blast

846
00:37:59,480 –> 00:38:00,480
radius.

847
00:38:00,480 –> 00:38:04,480
Identity policy audit, retention, e-discovery, DLP, those aren’t add-ons, they’re the shape

848
00:38:04,480 –> 00:38:05,480
of the environment.

849
00:38:05,480 –> 00:38:09,200
And when you drop LLM tool use into that environment, you don’t get to treat it like a weekend

850
00:38:09,200 –> 00:38:10,200
project.

851
00:38:10,200 –> 00:38:11,480
You need a boundary.

852
00:38:11,480 –> 00:38:13,040
Microsoft’s posture is identity first.

853
00:38:13,040 –> 00:38:16,320
Entra sits in the middle of everything, not because Microsoft loves orth prompts, but because

854
00:38:16,320 –> 00:38:21,400
identities, the only stable perimeter that survives cloud remote work and SaaS sprawl.

855
00:38:21,400 –> 00:38:26,200
That means MCP’s host mediates authority model plugs into existing instincts.

856
00:38:26,200 –> 00:38:30,200
Make the caller prove who they are, make the token express what they can do, and log

857
00:38:30,200 –> 00:38:33,040
the action in a way that maps to an accountable principle.

858
00:38:33,040 –> 00:38:37,120
MCP doesn’t magically solve that, but it gives you a consistent place to attach it.

859
00:38:37,120 –> 00:38:39,480
Now look at the co-pilot ecosystem pressure.

860
00:38:39,480 –> 00:38:41,760
Co-pilot exists across multiple hosts.

861
00:38:41,760 –> 00:38:48,000
M365 surfaces, teams, windows, edge, VS code, custom apps, and whatever the next assistant

862
00:38:48,000 –> 00:38:49,880
endpoint becomes.

863
00:38:49,880 –> 00:38:55,000
If tool integrations are bespoke per host, Microsoft inherits the worst problem on Earth, a thousand

864
00:38:55,000 –> 00:38:59,280
inconsistent adapters to the same enterprise systems, each with different permission handling

865
00:38:59,280 –> 00:39:01,160
and audit semantics.

866
00:39:01,160 –> 00:39:03,240
That is not a scalable platform strategy.

867
00:39:03,240 –> 00:39:05,680
So MCP aligns with inevitability.

868
00:39:05,680 –> 00:39:08,840
Tool integration has to become a shared substrate.

869
00:39:08,840 –> 00:39:12,960
Not because it’s elegant, but because it’s the only way to keep co-pilot style experiences

870
00:39:12,960 –> 00:39:17,560
consistent across hosts without rebuilding the tool ecosystem for every new client, and

871
00:39:17,560 –> 00:39:20,080
Microsoft is structurally built for choke points.

872
00:39:20,080 –> 00:39:21,800
Azure is a control plane company.

873
00:39:21,800 –> 00:39:23,760
The value isn’t we can call an API.

874
00:39:23,760 –> 00:39:27,560
The value is we can put policy in front of the API.

875
00:39:27,560 –> 00:39:32,560
Resource groups, RBAC, private link, APIM, Key Vault, Defender, Perview, these are all

876
00:39:32,560 –> 00:39:34,800
different ways of saying the same thing.

877
00:39:34,800 –> 00:39:37,440
Control, by centralizing enforcement.

878
00:39:37,440 –> 00:39:41,000
MCP is the same pattern applied to model tool use.

879
00:39:41,000 –> 00:39:45,120
Now the part most people miss, Microsoft already has the data gravity that makes MCP

880
00:39:45,120 –> 00:39:48,120
useful.

881
00:39:48,120 –> 00:39:49,120
Graph and SharePoint aren’t just APIs.

882
00:39:49,120 –> 00:39:52,120
They’re the enterprise’s nervous system, files, permissions, groups, chats, meetings, tasks,

883
00:39:52,120 –> 00:39:55,120
identities, devices, risk signals.

884
00:39:55,120 –> 00:40:00,120
When you let a model use tools in that ecosystem, the failure mode isn’t the model made a mistake.

885
00:40:00,120 –> 00:40:04,520
The failure mode is the model acted with the wrong authority across a graph of interconnected

886
00:40:04,520 –> 00:40:05,520
resources.

887
00:40:05,520 –> 00:40:09,400
That’s why MCP fits it forces you to treat tools as declared capabilities with explicit

888
00:40:09,400 –> 00:40:12,000
contracts, not whatever endpoint we can reach.

889
00:40:12,000 –> 00:40:17,000
It encourages an integration boundary where you can standardize the boring parts, tool naming,

890
00:40:17,000 –> 00:40:19,800
schemers, identity handling, logging and rate control.

891
00:40:19,800 –> 00:40:23,720
And yes, Microsoft is culturally inclined to standardize the boring parts.

892
00:40:23,720 –> 00:40:25,000
That’s half the platform.

893
00:40:25,000 –> 00:40:28,040
There’s also a compliance angle that’s not optional.

894
00:40:28,040 –> 00:40:31,720
Enterprises want audit trails that survive incident response and regulatory review.

895
00:40:31,720 –> 00:40:34,120
MCP’s host-mediated model makes that feasible.

896
00:40:34,120 –> 00:40:39,040
You can correlate a user prompt to tool selection, to tool execution, to downstream API calls.

897
00:40:39,040 –> 00:40:41,200
Not perfectly, not automatically, but feasibly.

898
00:40:41,200 –> 00:40:45,040
Without a protocol boundary, you end up scraping logs across five layers and still not knowing

899
00:40:45,040 –> 00:40:47,880
what the model saw or why it chose the tool it did.

900
00:40:47,880 –> 00:40:53,440
So MCP fits Microsoft because it reinforces Microsoft’s default operating model.

901
00:40:53,440 –> 00:40:58,320
Reduce entropy by making boundaries explicit, make identity central and make enforcement

902
00:40:58,320 –> 00:41:00,600
attached to a consistent interface.

903
00:41:00,600 –> 00:41:02,160
It’s not AI stuff.

904
00:41:02,160 –> 00:41:06,200
Its integration architecture catching up to a world where the corner is probabilistic

905
00:41:06,200 –> 00:41:09,520
and the enterprise environment is not allowed to be.

906
00:41:09,520 –> 00:41:12,560
MCP versus proprietary co-pilot extensions.

907
00:41:12,560 –> 00:41:15,000
Open standard versus platform gravity.

908
00:41:15,000 –> 00:41:18,280
This is where people try to turn MCP into a culture war.

909
00:41:18,280 –> 00:41:20,320
Open standard good proprietary bad does.

910
00:41:20,320 –> 00:41:22,600
That’s not architecture, that’s branding.

911
00:41:22,600 –> 00:41:26,160
In Microsoft land, you’re going to live in a hybrid world for a long time.

912
00:41:26,160 –> 00:41:29,640
Some capabilities will come through co-pilot native extension points.

913
00:41:29,640 –> 00:41:32,160
Some will come through open protocols like MCP.

914
00:41:32,160 –> 00:41:34,120
The question is in which one is morally superior.

915
00:41:34,120 –> 00:41:36,840
The question is where you want to pay your integration tax.

916
00:41:36,840 –> 00:41:40,160
Start with what proprietary co-pilot extensions optimize for.

917
00:41:40,160 –> 00:41:42,440
Speed inside a single platform.

918
00:41:42,440 –> 00:41:46,720
When Microsoft owns the host, the identity integration, the UX surface and the distribution

919
00:41:46,720 –> 00:41:49,560
channel, they can deliver a very coherent experience.

920
00:41:49,560 –> 00:41:50,880
Permissions prompts feel consistent.

921
00:41:50,880 –> 00:41:53,160
Admin controls show up in familiar places.

922
00:41:53,160 –> 00:41:56,600
Telemetry is good enough for most deployments because it’s standardized to the platform.

923
00:41:56,600 –> 00:41:59,320
That’s the upside of platform gravity.

924
00:41:59,320 –> 00:42:02,720
It reduces choices and reduces choices feel like simplicity.

925
00:42:02,720 –> 00:42:05,720
The platform gravity also captures your integration semantics.

926
00:42:05,720 –> 00:42:08,200
You build the tool the way the platform wants it built.

927
00:42:08,200 –> 00:42:10,400
You name things the way the platform wants them named.

928
00:42:10,400 –> 00:42:15,520
You accept the platform’s interpretation of what an action is, what approval is, what

929
00:42:15,520 –> 00:42:18,280
logging is, and how versioning should work.

930
00:42:18,280 –> 00:42:22,840
If Microsoft changes any of that, your integration isn’t wrong, but it becomes out of date.

931
00:42:22,840 –> 00:42:25,000
Then you get drift not in your backend API.

932
00:42:25,000 –> 00:42:28,360
In the user facing behavior of the agent, that’s the part enterprises hate because it’s

933
00:42:28,360 –> 00:42:30,200
difficult to regression test.

934
00:42:30,200 –> 00:42:33,520
Your security review can validate scopes and endpoints.

935
00:42:33,520 –> 00:42:38,400
It cannot easily validate the model now chooses this action more often because the host changed

936
00:42:38,400 –> 00:42:39,840
how it presents tools.

937
00:42:39,840 –> 00:42:44,560
Now MCP’s value proposition in this comparison is narrower and therefore more durable.

938
00:42:44,560 –> 00:42:47,680
It standardizes the boundary between host and tool server.

939
00:42:47,680 –> 00:42:52,400
You can build a SharePoint MCP server once, with a stable contract and multiple hosts can

940
00:42:52,400 –> 00:42:53,400
consume it.

941
00:42:53,400 –> 00:42:57,760
IDE agents internal chat apps, whatever co-pilot surface comes next.

942
00:42:57,760 –> 00:43:02,200
The host experience can evolve without forcing you to rebuild the tool server every time.

943
00:43:02,200 –> 00:43:06,520
So the integration investment becomes less host shaped and more enterprise shaped.

944
00:43:06,520 –> 00:43:08,240
That distinction matters.

945
00:43:08,240 –> 00:43:11,000
But don’t mistake open protocol for free.

946
00:43:11,000 –> 00:43:14,000
With MCP, you inherit responsibility for the boundary.

947
00:43:14,000 –> 00:43:17,320
You have to decide how discovery works inside your organization.

948
00:43:17,320 –> 00:43:19,880
You have to decide how you version tool schemers.

949
00:43:19,880 –> 00:43:22,280
You have to decide how you authenticate remote servers.

950
00:43:22,280 –> 00:43:25,320
You have to decide how you log and attribute tool calls.

951
00:43:25,320 –> 00:43:27,360
You have to decide what you will not allow.

952
00:43:27,360 –> 00:43:30,400
With a proprietary extension surface, Microsoft makes those calls for you.

953
00:43:30,400 –> 00:43:32,160
With MCP, you make them.

954
00:43:32,160 –> 00:43:34,160
Enterprises tend to pretend they want flexibility.

955
00:43:34,160 –> 00:43:35,160
They don’t.

956
00:43:35,160 –> 00:43:36,480
They want survivability.

957
00:43:36,480 –> 00:43:38,280
So here’s the practical trade.

958
00:43:38,280 –> 00:43:41,120
Propriatory co-pilot extensions maximize time to first demo.

959
00:43:41,120 –> 00:43:44,560
And MCP maximizes time to still working in two years.

960
00:43:44,560 –> 00:43:49,160
One optimizes for initial integration velocity inside Microsoft’s ecosystem.

961
00:43:49,160 –> 00:43:53,440
The other optimizes for portability and governance across an ecosystem that won’t stay still.

962
00:43:53,440 –> 00:43:55,200
Now the deeper issue, ecosystem effects.

963
00:43:55,200 –> 00:43:59,360
A proprietary extension model creates a winner takes most gravity well.

964
00:43:59,360 –> 00:44:04,160
Integration value accrues to the platform owner because the extensions are shaped to that platform.

965
00:44:04,160 –> 00:44:07,920
Tool vendors build where the users are and users stay where the tools are.

966
00:44:07,920 –> 00:44:08,600
It’s efficient.

967
00:44:08,600 –> 00:44:10,960
It’s also how lock-in becomes just the way things are.

968
00:44:10,960 –> 00:44:13,880
An open protocol like MCP flips that incentive.

969
00:44:13,880 –> 00:44:17,360
Tool builders target the protocol and host compete on experience.

970
00:44:17,360 –> 00:44:19,040
That’s a different market structure.

971
00:44:19,040 –> 00:44:24,000
Less captured by any single client, more resilient to shifts in model providers and app surfaces.

972
00:44:24,000 –> 00:44:28,800
And yes, Microsoft can participate in that world while still running proprietary surfaces.

973
00:44:28,800 –> 00:44:29,480
That’s the point.

974
00:44:29,480 –> 00:44:30,960
Protocols don’t kill platforms.

975
00:44:30,960 –> 00:44:34,320
They limit how much the platform can trap you at the integration boundary.

976
00:44:34,320 –> 00:44:37,440
So if you’re deciding where to standardize the rule is simple.

977
00:44:37,440 –> 00:44:40,560
Standardize at the boundary you can’t afford to rebuild.

978
00:44:40,560 –> 00:44:44,200
If your business logic lives in the tool server, standardize that with MCP.

979
00:44:44,200 –> 00:44:47,400
If your differentiator is the host UX inside Microsoft 365,

980
00:44:47,400 –> 00:44:49,760
then use co-pilot extensions where they fit.

981
00:44:49,760 –> 00:44:53,600
But don’t confuse those layers because the moment you build enterprise integrations,

982
00:44:53,600 –> 00:44:57,880
directly against the single host’s extension model, you are not building AI capability.

983
00:44:57,880 –> 00:45:00,440
You’re leasing it and lease terms change.

984
00:45:00,440 –> 00:45:04,360
Microsoft reference architecture where MCP sits in the stack.

985
00:45:04,360 –> 00:45:10,240
Now put all of this into a Microsoft shaped architecture because protocol only becomes real

986
00:45:10,240 –> 00:45:12,440
when you can point at a diagram and say,

987
00:45:12,440 –> 00:45:18,640
that box is where authority is enforced and this other box is where entropy leaks in.

988
00:45:18,640 –> 00:45:23,880
At a high level, an MCP enabled system in Microsoft land has five moving parts.

989
00:45:23,880 –> 00:45:28,400
The model, the host, the MCP client, the MCP server and the enterprise systems behind it.

990
00:45:28,400 –> 00:45:32,280
The model is boring by design as your open AI foundry models, whatever you’re using.

991
00:45:32,280 –> 00:45:33,200
The model reasons.

992
00:45:33,200 –> 00:45:34,400
It does not execute.

993
00:45:34,400 –> 00:45:35,520
It does not authenticate.

994
00:45:35,520 –> 00:45:36,800
It does not own credentials.

995
00:45:36,800 –> 00:45:40,280
If you let the model become the actor, you’re not building an agent system.

996
00:45:40,280 –> 00:45:41,600
You’re building a breach narrative.

997
00:45:41,600 –> 00:45:43,800
The host is where the real power sits.

998
00:45:43,800 –> 00:45:44,800
This is your application.

999
00:45:44,800 –> 00:45:50,640
The co-pilot like chat surface, a team’s app, a custom web app, an internal obsassistent

1000
00:45:50,640 –> 00:45:51,840
or an IDE agent.

1001
00:45:51,840 –> 00:45:55,720
The host is the only component allowed to see the full conversation and the user’s intent

1002
00:45:55,720 –> 00:45:56,720
and to end.

1003
00:45:56,720 –> 00:45:57,880
That’s not a convenience detail.

1004
00:45:57,880 –> 00:45:59,880
That’s the privacy and governance boundary.

1005
00:45:59,880 –> 00:46:01,720
Inside the host lives the MCP client.

1006
00:46:01,720 –> 00:46:04,000
Think of it as the protocol adapter and session manager.

1007
00:46:04,000 –> 00:46:09,720
It negotiates capabilities with servers, lists tools, invokes tools and receives results.

1008
00:46:09,720 –> 00:46:13,960
But more importantly, it’s the mechanism that allows the host to decide what the model

1009
00:46:13,960 –> 00:46:15,600
is even allowed to ask for.

1010
00:46:15,600 –> 00:46:18,320
This is the first Microsoft native reframe.

1011
00:46:18,320 –> 00:46:21,040
The host is an authorization broker.

1012
00:46:21,040 –> 00:46:22,280
Not an AI wrapper.

1013
00:46:22,280 –> 00:46:26,360
It decides which MCP servers are connected, which tools are exposed, which resources can

1014
00:46:26,360 –> 00:46:28,360
be fetched and what context gets forwarded.

1015
00:46:28,360 –> 00:46:33,480
In practice, it’s the thing that turns user-aster question into a scoped attributable action

1016
00:46:33,480 –> 00:46:34,480
was executed.

1017
00:46:34,480 –> 00:46:36,800
Now the MCP server, this is the integration boundary.

1018
00:46:36,800 –> 00:46:41,720
It wraps enterprise systems, graph, sharepoint, secle, service, now, whatever, into a declared

1019
00:46:41,720 –> 00:46:43,320
set of capabilities.

1020
00:46:43,320 –> 00:46:47,320
These are your actions, resources are your context surfaces, prompts are your standardized

1021
00:46:47,320 –> 00:46:48,560
entry points.

1022
00:46:48,560 –> 00:46:52,640
And the server is where you translate messy backend reality into deterministic contracts

1023
00:46:52,640 –> 00:46:55,120
that a probabilistic caller can’t ruin.

1024
00:46:55,120 –> 00:46:58,680
But don’t confuse integration boundary with security boundary.

1025
00:46:58,680 –> 00:47:03,440
In Microsoft environments, security is enforced by identity plus policy, not by your Python

1026
00:47:03,440 –> 00:47:04,880
code behaving politely.

1027
00:47:04,880 –> 00:47:08,560
So the reference architecture needs explicit integration points that enterprises already

1028
00:47:08,560 –> 00:47:09,560
trust.

1029
00:47:09,560 –> 00:47:14,720
Enter ID. Every series deployment uses Entra to prove identities, issue tokens and express

1030
00:47:14,720 –> 00:47:15,720
least privilege.

1031
00:47:15,720 –> 00:47:17,520
The host authenticates the user.

1032
00:47:17,520 –> 00:47:21,920
The host then either calls the MCP server with a delegated token model or the MCP server

1033
00:47:21,920 –> 00:47:23,880
operates under a workload identity model.

1034
00:47:23,880 –> 00:47:27,840
We’ll go deep on the token flows next, but for now, the architectural rule is simple.

1035
00:47:27,840 –> 00:47:31,560
Tool execution must map to an accountable principle and Entra is the only system that

1036
00:47:31,560 –> 00:47:33,840
can make that defensible at scale.

1037
00:47:33,840 –> 00:47:35,760
Second, Key Vault.

1038
00:47:35,760 –> 00:47:40,080
If your MCP server needs secrets for downstream APIs that aren’t entrusted integrated for

1039
00:47:40,080 –> 00:47:44,080
certificates for legacy systems, Key Vault is where those secrets live.

1040
00:47:44,080 –> 00:47:47,920
Not in environment variables, not in app settings copied between environments, not in temporary

1041
00:47:47,920 –> 00:47:50,560
service principle secrets that never expire.

1042
00:47:50,560 –> 00:47:51,560
Key Vault isn’t exciting.

1043
00:47:51,560 –> 00:47:54,520
It’s where entropy goes to die if you actually use it.

1044
00:47:54,520 –> 00:47:56,520
Third, Azure API management.

1045
00:47:56,520 –> 00:47:58,560
This is where you put governance at the edge.

1046
00:47:58,560 –> 00:48:00,200
APM doesn’t replace MCP.

1047
00:48:00,200 –> 00:48:01,200
It governs exposure.

1048
00:48:01,200 –> 00:48:02,560
It validates tokens.

1049
00:48:02,560 –> 00:48:06,520
And forces Quoters applies rate limits, does request transformation when needed and gives

1050
00:48:06,520 –> 00:48:07,760
you central logging.

1051
00:48:07,760 –> 00:48:11,680
Most importantly, it gives you a consistent place to say, this tool is allowed for these

1052
00:48:11,680 –> 00:48:16,120
callers from these networks at this rate with this retention and with this cost profile.

1053
00:48:16,120 –> 00:48:18,000
MCP standardizes tool invocation.

1054
00:48:18,000 –> 00:48:19,720
APM standardizes the consequences.

1055
00:48:19,720 –> 00:48:21,720
Fourth, logging and monitoring.

1056
00:48:21,720 –> 00:48:27,000
In a Microsoft stack that means Azure Monitor application insights, log analytics and then

1057
00:48:27,000 –> 00:48:28,440
Sentinel if you’re serious.

1058
00:48:28,440 –> 00:48:31,200
The reference architecture should emit audit grade events.

1059
00:48:31,200 –> 00:48:36,760
Call name, input schema version, caller identity, correlation ID, downstream dependency calls

1060
00:48:36,760 –> 00:48:37,760
and outcome.

1061
00:48:37,760 –> 00:48:41,600
If you can’t answer who did what in one query, you built a demo, not a platform.

1062
00:48:41,600 –> 00:48:44,600
Now, place enterprise systems behind the MCP server.

1063
00:48:44,600 –> 00:48:49,000
SharePoint and graph databases, line of business APIs, even legacy soap endpoints.

1064
00:48:49,000 –> 00:48:53,320
The point is that MCP servers are adapters with contracts, not direct pipes.

1065
00:48:53,320 –> 00:48:55,160
You’re not exposing your raw back end.

1066
00:48:55,160 –> 00:48:57,840
You’re exposing an intentional capability surface.

1067
00:48:57,840 –> 00:48:59,840
So the stack looks like this.

1068
00:48:59,840 –> 00:49:01,680
Azure Interacts with host.

1069
00:49:01,680 –> 00:49:05,440
Host authenticates with Entra, model reasons within the host.

1070
00:49:05,440 –> 00:49:11,640
Host invokes MCP tools via MCP client, MCP server enforces its contract, APIM and Entra

1071
00:49:11,640 –> 00:49:13,120
enforce policy.

1072
00:49:13,120 –> 00:49:15,920
Backends do the work, telemetry proves what happened.

1073
00:49:15,920 –> 00:49:19,520
And the next question is the only one that matters, which identity is actually holding

1074
00:49:19,520 –> 00:49:25,120
the knife when a tool runs identity flow one, Entra on behalf of delegated authority,

1075
00:49:25,120 –> 00:49:26,960
not LLM God mode.

1076
00:49:26,960 –> 00:49:30,880
So answer the knife question, when a tool runs whose authority is it using?

1077
00:49:30,880 –> 00:49:34,560
If you can’t say that in one sentence, you don’t have an AI architecture.

1078
00:49:34,560 –> 00:49:35,960
You have a liability generator.

1079
00:49:35,960 –> 00:49:39,360
The cleanest place to start is Entra on behalf of.

1080
00:49:39,360 –> 00:49:42,000
Because it forces a truth enterprises love to avoid.

1081
00:49:42,000 –> 00:49:45,720
Most AI integrations quietly run as an app with broad permissions.

1082
00:49:45,720 –> 00:49:49,640
And then everyone acts surprised when it behaves like an app with broad permissions.

1083
00:49:49,640 –> 00:49:52,840
On behalf of is the opposite, it’s delegated authority.

1084
00:49:52,840 –> 00:49:56,920
It’s the platform saying, the user is the actor, the application is the broker.

1085
00:49:56,920 –> 00:50:02,680
And the downstream call must remain attributable to the user’s permissions and the user’s context.

1086
00:50:02,680 –> 00:50:03,680
That distinction matters.

1087
00:50:03,680 –> 00:50:05,400
Here’s the core idea in plain terms.

1088
00:50:05,400 –> 00:50:06,920
The user signs into the host.

1089
00:50:06,920 –> 00:50:09,640
The host gets a user token from Entra.

1090
00:50:09,640 –> 00:50:14,480
Then when the host wants to call an MCP server, it passes a token or a proof of user identity

1091
00:50:14,480 –> 00:50:15,480
to that server.

1092
00:50:15,480 –> 00:50:18,480
The MCP server doesn’t just reuse that token blindly.

1093
00:50:18,480 –> 00:50:24,160
It exchanges it using the OBO flow to obtain a new access token for the downstream API,

1094
00:50:24,160 –> 00:50:27,480
like Microsoft Graph, scope for the user and for the specific audience.

1095
00:50:27,480 –> 00:50:28,840
So the sequence is simple.

1096
00:50:28,840 –> 00:50:30,640
User authenticates to the host.

1097
00:50:30,640 –> 00:50:32,400
Host receives a delegated token.

1098
00:50:32,400 –> 00:50:35,560
MCP server exchanges that token on behalf of the user.

1099
00:50:35,560 –> 00:50:40,200
MCP server calls Graph or SharePoint with a delegated token representing the user.

1100
00:50:40,200 –> 00:50:41,200
And the result comes back.

1101
00:50:41,200 –> 00:50:43,120
What this buys you is not security theater.

1102
00:50:43,120 –> 00:50:45,320
It buys you scope trimming as architecture.

1103
00:50:45,320 –> 00:50:47,680
Because delegated tokens carry scopes.

1104
00:50:47,680 –> 00:50:49,560
Scopes are the contract of least privilege.

1105
00:50:49,560 –> 00:50:53,560
When the tool is list documents in this site, the server requests the specific graph scopes

1106
00:50:53,560 –> 00:50:54,560
it needs.

1107
00:50:54,560 –> 00:50:58,640
And Entra enforces whether that user has consented, whether the tenant allows it and whether

1108
00:50:58,640 –> 00:51:00,400
policy conditions apply.

1109
00:51:00,400 –> 00:51:02,040
The model never gets got mode.

1110
00:51:02,040 –> 00:51:05,040
The model gets a request path that can be denied.

1111
00:51:05,040 –> 00:51:07,200
And that denial is a feature, not an outage.

1112
00:51:07,200 –> 00:51:08,800
Now the part people get wrong.

1113
00:51:08,800 –> 00:51:11,840
OBO is not about letting the model do user stuff.

1114
00:51:11,840 –> 00:51:13,560
It’s about preserving accountability.

1115
00:51:13,560 –> 00:51:18,560
If an MCP tool uses OBO, your audit trail can say, “This action happened because this

1116
00:51:18,560 –> 00:51:24,040
user asked for it through this host and the downstream system evaluated the user’s own permissions.”

1117
00:51:24,040 –> 00:51:27,800
That’s how you survive incident review, because the question will be who did it, not which

1118
00:51:27,800 –> 00:51:29,040
model suggested it.

1119
00:51:29,040 –> 00:51:33,600
And if your tools run under app only permissions, your answer becomes the service principle,

1120
00:51:33,600 –> 00:51:35,720
which is another way of saying nobody.

1121
00:51:35,720 –> 00:51:40,600
OBO is also the clean way to separate knowledge access from action authority without inventing

1122
00:51:40,600 –> 00:51:41,760
custom logic.

1123
00:51:41,760 –> 00:51:44,880
If the user can read a document in SharePoint, Graph will allow the call.

1124
00:51:44,880 –> 00:51:49,160
If the user can’t graph will deny it, your MCP server doesn’t have to become a parallel authorization

1125
00:51:49,160 –> 00:51:50,160
system.

1126
00:51:50,160 –> 00:51:53,920
It becomes an integration boundary that respects the enterprise authorization engine.

1127
00:51:53,920 –> 00:51:55,880
Entra and graph remain the decision engine.

1128
00:51:55,880 –> 00:51:58,280
Your server becomes a translator, not a judge.

1129
00:51:58,280 –> 00:52:00,840
Now the failure modes, because OBO is not magic.

1130
00:52:00,840 –> 00:52:02,960
First consent and permissions sprawl.

1131
00:52:02,960 –> 00:52:06,120
OBO requires that your app is configured with the right delegated permissions and that

1132
00:52:06,120 –> 00:52:08,280
admin consent is handled intentionally.

1133
00:52:08,280 –> 00:52:11,920
If you treat admin consent as just make it work, you reintroduce the same entropy you

1134
00:52:11,920 –> 00:52:15,080
were trying to eliminate, just earlier in the life cycle.

1135
00:52:15,080 –> 00:52:16,280
Second token handling.

1136
00:52:16,280 –> 00:52:19,240
The host must not leak user tokens into places they don’t belong.

1137
00:52:19,240 –> 00:52:24,200
If you forward user tokens to random downstream systems or third party MCP servers, you’ve turned

1138
00:52:24,200 –> 00:52:28,040
your delegated model into a portable credential theft mechanism.

1139
00:52:28,040 –> 00:52:32,080
Third conditional access, this is where Microsoft environments get serious.

1140
00:52:32,080 –> 00:52:36,240
Conditional access might require compliant devices, specific locations or MFA for certain

1141
00:52:36,240 –> 00:52:37,240
resources.

1142
00:52:37,240 –> 00:52:38,320
OBO doesn’t bypass that.

1143
00:52:38,320 –> 00:52:39,320
It inherits it.

1144
00:52:39,320 –> 00:52:42,800
It’s good because it means your tool execution respects the same risk posture as the rest

1145
00:52:42,800 –> 00:52:47,440
of the tenant, but it also means your tool calls can fail for reasons that look non-technical

1146
00:52:47,440 –> 00:52:48,440
to developers.

1147
00:52:48,440 –> 00:52:49,840
They aren’t non-technical.

1148
00:52:49,840 –> 00:52:51,120
They’re policy doing its job.

1149
00:52:51,120 –> 00:52:55,200
So if you implement OBO, you need to design for denial, clear error mapping, fail closed

1150
00:52:55,200 –> 00:52:59,840
behavior and user visible explanations that don’t leak sensitive policy detail.

1151
00:52:59,840 –> 00:53:02,280
Because access denied is a correct outcome.

1152
00:53:02,280 –> 00:53:03,760
And that’s the takeaway.

1153
00:53:03,760 –> 00:53:08,880
OBO turns MCP tool execution into delegated authority with auditability, scope trimming

1154
00:53:08,880 –> 00:53:10,200
and policy inheritance.

1155
00:53:10,200 –> 00:53:14,520
It is the closest thing you get to a deterministic security model in a probabilistic tool selection

1156
00:53:14,520 –> 00:53:15,520
world.

1157
00:53:15,520 –> 00:53:17,200
Now the uncomfortable contrast.

1158
00:53:17,200 –> 00:53:22,400
Same MCP tool surface, different blast radius when you switch to managed identity.

1159
00:53:22,400 –> 00:53:23,520
Identity flow 2.

1160
00:53:23,520 –> 00:53:26,760
Managed identity plus Microsoft graph, the operational baseline.

1161
00:53:26,760 –> 00:53:31,200
Now take the same idea, an MCP server calling Microsoft Graph and remove the user.

1162
00:53:31,200 –> 00:53:32,720
That’s the managed identity pattern.

1163
00:53:32,720 –> 00:53:36,440
This is the operational baseline because it matches how Azure is supposed to work, workloads

1164
00:53:36,440 –> 00:53:38,000
authenticate as workloads.

1165
00:53:38,000 –> 00:53:42,800
No secrets, no copied client secrets in app settings, no temporary certificates that become

1166
00:53:42,800 –> 00:53:45,440
permanent because nobody owns rotation.

1167
00:53:45,440 –> 00:53:50,320
Just a resource in Azure with an identity asking entra for a token and calling graph.

1168
00:53:50,320 –> 00:53:51,520
Clean.

1169
00:53:51,520 –> 00:53:54,800
But don’t confuse clean with equivalent to OBO.

1170
00:53:54,800 –> 00:53:55,800
It isn’t.

1171
00:53:55,800 –> 00:53:59,280
The authority model is different and that changes everything about accountability.

1172
00:53:59,280 –> 00:54:01,600
With managed identity, the principle is the workload.

1173
00:54:01,600 –> 00:54:03,160
The MCP server is the actor.

1174
00:54:03,160 –> 00:54:07,440
So when the host invokes a tool and the tool ends up calling graph, the downstream system

1175
00:54:07,440 –> 00:54:09,680
sees an app identity, not a user identity.

1176
00:54:09,680 –> 00:54:13,600
And that means the audit question changes from which user did this and to which workload

1177
00:54:13,600 –> 00:54:15,200
did this and that can be acceptable.

1178
00:54:15,200 –> 00:54:16,720
Sometimes it’s the correct model.

1179
00:54:16,720 –> 00:54:20,320
The right use cases are the boring ones that keep enterprises alive.

1180
00:54:20,320 –> 00:54:24,320
Background indexing, scheduled classification, metadata normalization,

1181
00:54:24,320 –> 00:54:29,120
nightly reports, content inventory and controlled automation that’s explicitly not user-driven.

1182
00:54:29,120 –> 00:54:30,080
You’re building a service.

1183
00:54:30,080 –> 00:54:31,920
The service should have a service identity.

1184
00:54:31,920 –> 00:54:36,000
This is also why managed identity is the baseline for shared MCP servers.

1185
00:54:36,000 –> 00:54:40,080
If your organization wants a centrally hosted SharePoint Graph MCP server

1186
00:54:40,080 –> 00:54:44,240
that multiple hosts can use Teams Assistance internal chat apps, dev tooling,

1187
00:54:44,240 –> 00:54:47,920
managed identity is the simplest identity story that doesn’t involve

1188
00:54:47,920 –> 00:54:50,960
the user token forwarding across every client.

1189
00:54:50,960 –> 00:54:52,560
Mechanically, it looks like this.

1190
00:54:52,560 –> 00:54:56,800
The MCP server runs on an Azure host that supports managed identity, functions,

1191
00:54:56,800 –> 00:54:59,760
container apps, AKS with workload identity, whatever.

1192
00:54:59,760 –> 00:55:02,960
The server requests an access token from Entra for the Microsoft Graph audience.

1193
00:55:02,960 –> 00:55:04,320
It calls graph with that token.

1194
00:55:04,320 –> 00:55:08,720
Graph evaluates app permissions and directory roles assigned to that managed identity.

1195
00:55:08,720 –> 00:55:10,160
The call succeeds or fails.

1196
00:55:10,160 –> 00:55:12,640
The server returns a deterministic response to the host.

1197
00:55:12,640 –> 00:55:14,800
No user tokens ever cross that boundary.

1198
00:55:14,800 –> 00:55:15,680
And that’s the benefit.

1199
00:55:15,680 –> 00:55:20,560
Fewer moving parts, fewer consent flows, fewer conditional access surprises tied to user posture.

1200
00:55:20,560 –> 00:55:23,280
The system behaves like any other server to server integration.

1201
00:55:23,280 –> 00:55:24,160
But there’s a price.

1202
00:55:24,160 –> 00:55:26,480
You lose user-level accountability by default.

1203
00:55:26,480 –> 00:55:29,440
If a tool mutates data, create a Teams message,

1204
00:55:29,440 –> 00:55:32,560
update a SharePoint list item, modify permissions.

1205
00:55:32,560 –> 00:55:37,520
You’ve just created an action surface that is not naturally attributable to the user who asked for it.

1206
00:55:37,520 –> 00:55:39,040
You can add your own logging, of course.

1207
00:55:39,040 –> 00:55:42,240
You can stamp “requested by user x” into telemetry.

1208
00:55:42,240 –> 00:55:45,200
But that is not the same as graph enforcing user permissions.

1209
00:55:45,200 –> 00:55:46,800
It’s your app asserting a story.

1210
00:55:46,800 –> 00:55:50,640
And incident reviews don’t accept the app says so as a strong boundary.

1211
00:55:50,640 –> 00:55:54,240
So the correct pattern is to treat managed identity as operational authority,

1212
00:55:54,240 –> 00:55:55,440
not delegated authority.

1213
00:55:55,440 –> 00:55:56,880
Keep the tools read heavy.

1214
00:55:56,880 –> 00:56:01,680
Keep the mutation tools rare, narrow, and gated behind explicit approvals in the host.

1215
00:56:01,680 –> 00:56:06,400
And never pretend that because the user asked means the user is accountable

1216
00:56:06,400 –> 00:56:07,920
when the token is app-only.

1217
00:56:07,920 –> 00:56:12,240
Now the failure mode, this is where managed identity turns into silent privilege expansion.

1218
00:56:12,240 –> 00:56:15,440
Because it’s so easy, a team needs one more graph capability.

1219
00:56:15,440 –> 00:56:18,240
They add one more application permission, everything works.

1220
00:56:18,240 –> 00:56:21,680
Then another team needs another capability, another permission.

1221
00:56:21,680 –> 00:56:24,880
Then six months later, your managed identity has broad read access

1222
00:56:24,880 –> 00:56:29,360
across male files, users, groups, sites because every request was individually reasonable.

1223
00:56:29,360 –> 00:56:31,520
And collectively, it became a super user.

1224
00:56:31,520 –> 00:56:34,000
That’s how security that grows in Microsoft environments,

1225
00:56:34,000 –> 00:56:36,240
not through one catastrophic misconfiguration,

1226
00:56:36,240 –> 00:56:39,760
but through cumulative permission accretion that nobody revisits.

1227
00:56:39,760 –> 00:56:41,520
Managed identity doesn’t prevent that.

1228
00:56:41,520 –> 00:56:43,840
It accelerates it because it feels safe.

1229
00:56:43,840 –> 00:56:46,480
So if you use managed identity for MCP servers,

1230
00:56:46,480 –> 00:56:49,360
you enforce three disciplines, first explicit scoping.

1231
00:56:49,360 –> 00:56:51,840
Prefer graph application permissions that are narrow

1232
00:56:51,840 –> 00:56:54,960
and when possible, scope access to specific sites or resources,

1233
00:56:54,960 –> 00:56:56,080
rather than tenant-wide.

1234
00:56:56,080 –> 00:56:59,040
Don’t build a tenant reader identity unless you actually mean it.

1235
00:56:59,040 –> 00:57:00,640
Second, road separation.

1236
00:57:00,640 –> 00:57:03,520
Don’t run every MCP server under one identity.

1237
00:57:03,520 –> 00:57:06,080
Different tool surfaces get different identities.

1238
00:57:06,080 –> 00:57:09,360
Read only servers and write capable servers do not share principles.

1239
00:57:09,360 –> 00:57:11,680
Shared principles are entropy generators.

1240
00:57:11,680 –> 00:57:13,840
Third, audit as architecture.

1241
00:57:13,840 –> 00:57:16,320
Every tool call emits a structured event.

1242
00:57:16,320 –> 00:57:20,880
Two name parameters, graph endpoint called result, correlation ID,

1243
00:57:20,880 –> 00:57:22,560
and the calling host identity.

1244
00:57:22,560 –> 00:57:24,640
That’s the minimum bar for survivability.

1245
00:57:24,640 –> 00:57:28,880
So managed identity is the baseline because it’s operationally sane and agonative.

1246
00:57:28,880 –> 00:57:31,040
But it is not a free substitute for OBO.

1247
00:57:31,040 –> 00:57:33,840
It’s the same tools, the same server, the same graph calls,

1248
00:57:33,840 –> 00:57:35,680
and a completely different blast radius.

1249
00:57:35,680 –> 00:57:37,120
Identity flow three.

1250
00:57:37,120 –> 00:57:40,160
Service principle plus azure API management.

1251
00:57:40,160 –> 00:57:41,440
Governance at the edge.

1252
00:57:41,440 –> 00:57:44,720
Now take the managed identity pattern and make it enterprise scale on purposes.

1253
00:57:44,720 –> 00:57:48,240
Because managed identity answers how does the workload authenticate?

1254
00:57:48,240 –> 00:57:50,480
But it doesn’t answer how do we govern exposure

1255
00:57:50,480 –> 00:57:53,040
when the caller is multiplying the traffic turns bursty?

1256
00:57:53,040 –> 00:57:56,560
That’s where the service principle plus azure API management pattern shows up.

1257
00:57:56,560 –> 00:57:57,600
Not because it’s trendy.

1258
00:57:57,600 –> 00:58:00,480
Because it’s the only place you can consistently enforce policy

1259
00:58:00,480 –> 00:58:02,720
when the tool surface becomes a shared utility.

1260
00:58:02,720 –> 00:58:03,680
Here’s the shape.

1261
00:58:03,680 –> 00:58:06,080
Your MCP server is still the integration boundary.

1262
00:58:06,080 –> 00:58:08,320
It still exposes tools, resources, and prompts.

1263
00:58:08,320 –> 00:58:10,880
But you don’t let random host caller directly.

1264
00:58:10,880 –> 00:58:13,120
You put azure API management in front of it

1265
00:58:13,120 –> 00:58:15,440
and you treat APM as the enforcement layer.

1266
00:58:15,440 –> 00:58:19,360
Validate tokens, apply throttles, do quota, log everything,

1267
00:58:19,360 –> 00:58:22,800
and reject anything that doesn’t match your policy posture.

1268
00:58:22,800 –> 00:58:25,120
In this pattern, the caller is a service principle.

1269
00:58:25,120 –> 00:58:26,800
That might be the host application itself

1270
00:58:26,800 –> 00:58:30,320
or it might be a broker component that fronts multiple hosts.

1271
00:58:30,320 –> 00:58:33,280
Either way, it’s app to app auth client credentials,

1272
00:58:33,280 –> 00:58:36,400
deterministic, boring, which is what you want at the edge.

1273
00:58:36,400 –> 00:58:40,320
And before anyone panics about service principle equals broad permissions,

1274
00:58:40,320 –> 00:58:42,560
separate two concerns that people keep mixing.

1275
00:58:42,560 –> 00:58:45,120
The service principle is for calling the MCP server.

1276
00:58:45,120 –> 00:58:48,480
The MCP server’s downstream identity is a separate decision.

1277
00:58:48,480 –> 00:58:52,080
The server can still use OBO for user delegated operations

1278
00:58:52,080 –> 00:58:54,320
or manage identity for operational calls

1279
00:58:54,320 –> 00:58:57,200
or even a different app identity for downstream systems.

1280
00:58:57,200 –> 00:58:59,600
APM doesn’t force one model. It forces one entrance.

1281
00:58:59,600 –> 00:59:00,240
That’s the point.

1282
00:59:00,240 –> 00:59:02,320
APM is where you standardize the gate,

1283
00:59:02,320 –> 00:59:04,640
not where you collapse all identities into one blob.

1284
00:59:04,640 –> 00:59:06,640
So what does APM actually give you that matters

1285
00:59:06,640 –> 00:59:07,840
in an MCP world?

1286
00:59:07,840 –> 00:59:10,640
First, authentication and authorization at the boundary.

1287
00:59:10,640 –> 00:59:16,000
APM can validate Entra-issue JWTs and force issuer, audience, and claims

1288
00:59:16,000 –> 00:59:18,400
and reject callers that aren’t who they claim to be.

1289
00:59:18,400 –> 00:59:19,520
And because it’s centralized,

1290
00:59:19,520 –> 00:59:21,840
you don’t end up with every MCP server team

1291
00:59:21,840 –> 00:59:25,600
implemented else differently. That inconsistency is where breach is hide.

1292
00:59:25,600 –> 00:59:27,600
Second, throttling and quotas.

1293
00:59:27,600 –> 00:59:29,360
Agent traffic is not normal traffic.

1294
00:59:29,360 –> 00:59:32,080
It is spiky, recursive, and sometimes stupid.

1295
00:59:32,080 –> 00:59:35,520
When a model hits a transient error, the agent loop tends to retry.

1296
00:59:35,520 –> 00:59:38,560
When a tool call is slow, the model tends to try alternate tools.

1297
00:59:38,560 –> 00:59:40,800
When you expose 10 tools, you don’t get 10 calls.

1298
00:59:40,800 –> 00:59:42,000
You get call cascades.

1299
00:59:42,000 –> 00:59:45,840
APM is where you stop that from turning into a back end denial of service

1300
00:59:45,840 –> 00:59:47,040
you did to yourself.

1301
00:59:47,040 –> 00:59:49,280
Rate limits per client. Quotas per time period.

1302
00:59:49,280 –> 00:59:50,240
Verse control.

1303
00:59:50,240 –> 00:59:54,240
And if you want to be sane, you enforce different limits per tool category.

1304
00:59:54,240 –> 00:59:56,320
Read tools get higher throughput.

1305
00:59:56,320 –> 00:59:57,920
Write tools get tighter limits.

1306
00:59:57,920 –> 01:00:02,160
And expensive tools get explicit quotas tied to cost centers.

1307
01:00:02,160 –> 01:00:04,000
Third, transformation and normalization.

1308
01:00:04,000 –> 01:00:06,080
This is not about making JSON pretty.

1309
01:00:06,080 –> 01:00:07,760
It’s about enforcing stable contracts.

1310
01:00:07,760 –> 01:00:09,360
If your MCP server evolves,

1311
01:00:09,360 –> 01:00:13,040
APM can help you keep a stable external surface while you transition

1312
01:00:13,040 –> 01:00:13,920
internals.

1313
01:00:13,920 –> 01:00:15,040
Version routing,

1314
01:00:15,040 –> 01:00:16,640
header-based feature flags,

1315
01:00:16,640 –> 01:00:18,800
or even schema validation if you go that far.

1316
01:00:19,600 –> 01:00:21,680
Enterprises don’t want surprises.

1317
01:00:21,680 –> 01:00:23,120
They want managed change.

1318
01:00:23,120 –> 01:00:27,200
Fourth, observability and audit trails that don’t require you to stitch logs

1319
01:00:27,200 –> 01:00:28,480
from every app team.

1320
01:00:28,480 –> 01:00:31,680
APM gives you a single choke point where every request and response

1321
01:00:31,680 –> 01:00:34,480
can be logged with correlation IDs and client identity.

1322
01:00:34,480 –> 01:00:37,680
You still need application-level logs inside the MCP server,

1323
01:00:37,680 –> 01:00:41,520
but APM becomes the authoritative record of who called what when.

1324
01:00:41,520 –> 01:00:44,080
And that matters because MCP is a tool protocol.

1325
01:00:44,080 –> 01:00:45,520
Tool calls are actions.

1326
01:00:45,520 –> 01:00:46,800
Actions require attribution.

1327
01:00:46,800 –> 01:00:48,800
Attribution requires a reliable ledger.

1328
01:00:48,800 –> 01:00:52,160
Now, the uncomfortable boundary question, where does MCP end?

1329
01:00:52,160 –> 01:00:54,880
MCP standardizes how tools are described and invoked.

1330
01:00:54,880 –> 01:00:57,040
It does not standardize enterprise governance.

1331
01:00:57,040 –> 01:00:58,640
It doesn’t enforce your rate limits.

1332
01:00:58,640 –> 01:01:00,560
It doesn’t implement your tenant restrictions.

1333
01:01:00,560 –> 01:01:01,840
It doesn’t control your budgets.

1334
01:01:01,840 –> 01:01:03,600
It doesn’t decide what allowed means.

1335
01:01:03,600 –> 01:01:06,160
APM is where those enterprise controls live.

1336
01:01:06,160 –> 01:01:07,680
So the clean framing is this.

1337
01:01:07,680 –> 01:01:09,840
MCP is the tool invocation protocol.

1338
01:01:09,840 –> 01:01:11,760
APM is the policy engine at the edge.

1339
01:01:11,760 –> 01:01:15,440
Entra is the identity issuer and authorization substrate.

1340
01:01:15,440 –> 01:01:18,160
And your MCP server is the translator that keeps back-end

1341
01:01:18,160 –> 01:01:21,040
complexity from leaking into a probabilistic caller.

1342
01:01:21,040 –> 01:01:24,240
Once you have this pattern, you can finally answer the CFO question

1343
01:01:24,240 –> 01:01:27,200
and the incident reviewer question with the same architecture.

1344
01:01:27,200 –> 01:01:28,640
How do we control cost?

1345
01:01:28,640 –> 01:01:30,080
How do we prove accountability?

1346
01:01:30,080 –> 01:01:31,520
Because the edge is governable.

1347
01:01:31,520 –> 01:01:33,840
Now, we can build the SharePoint and Graph MCP server

1348
01:01:33,840 –> 01:01:35,920
without pretending the boundary will take care of itself.

1349
01:01:35,920 –> 01:01:38,000
Hands-on anchor.

1350
01:01:38,000 –> 01:01:41,120
Designing the SharePoint+ Graph MCP server.

1351
01:01:41,120 –> 01:01:43,760
Now, we stop talking about protocols like their philosophy

1352
01:01:43,760 –> 01:01:44,880
and we build one.

1353
01:01:44,880 –> 01:01:46,800
Not a toy Hello World MCP server.

1354
01:01:47,600 –> 01:01:50,640
A SharePoint+ Microsoft Graph MCP server

1355
01:01:50,640 –> 01:01:53,440
that survives contact with an enterprise tenant.

1356
01:01:53,440 –> 01:01:55,360
SharePoint is the perfect trap for this

1357
01:01:55,360 –> 01:01:57,840
because it looks simple until you ask one question.

1358
01:01:57,840 –> 01:01:58,880
Who can see what?

1359
01:01:58,880 –> 01:02:00,880
Then you realize permissions aren’t a boolean.

1360
01:02:00,880 –> 01:02:02,640
They’re an inheritance graph.

1361
01:02:02,640 –> 01:02:04,560
With exceptions, broken inheritance,

1362
01:02:04,560 –> 01:02:07,120
sharing links, guest access, sensitivity labels,

1363
01:02:07,120 –> 01:02:09,120
and whatever else the organization bolted on

1364
01:02:09,120 –> 01:02:11,280
during the last five reorganizations.

1365
01:02:11,280 –> 01:02:13,200
That is exactly why this is the right anchor.

1366
01:02:13,200 –> 01:02:15,360
If you can make MCP behave in SharePoint,

1367
01:02:15,360 –> 01:02:16,800
you can make it behave anywhere.

1368
01:02:16,800 –> 01:02:18,560
So the first architectural decision is not

1369
01:02:18,560 –> 01:02:20,800
what language you use or where you host it.

1370
01:02:20,800 –> 01:02:23,840
It’s how you draw the boundary between context and authority

1371
01:02:23,840 –> 01:02:25,920
because SharePoint makes it painfully obvious

1372
01:02:25,920 –> 01:02:27,120
when you get that wrong.

1373
01:02:27,120 –> 01:02:28,320
Start with the server contract.

1374
01:02:28,320 –> 01:02:29,440
What resources exist?

1375
01:02:29,440 –> 01:02:30,240
What tools exist?

1376
01:02:30,240 –> 01:02:31,360
And what prompts exist?

1377
01:02:31,360 –> 01:02:33,520
Resources come first because if your MCP server

1378
01:02:33,520 –> 01:02:36,400
can’t supply stable contacts, the model will improvise.

1379
01:02:36,400 –> 01:02:38,000
An improvisation inside SharePoint

1380
01:02:38,000 –> 01:02:39,520
turns into open the wrong document

1381
01:02:39,520 –> 01:02:41,040
and summarise it confidently.

1382
01:02:41,040 –> 01:02:43,280
So define read-oriented resources

1383
01:02:43,280 –> 01:02:45,280
that are predictable and low-risk.

1384
01:02:45,280 –> 01:02:48,000
A resource for site metadata is a good example.

1385
01:02:48,000 –> 01:02:50,960
Site ID, Site URL, Display Name,

1386
01:02:50,960 –> 01:02:53,920
Classification, Sensitivity Label if available,

1387
01:02:53,920 –> 01:02:56,640
and maybe the default document library identifiers.

1388
01:02:56,640 –> 01:02:59,280
Not the documents themselves, metadata first.

1389
01:02:59,280 –> 01:03:03,680
A resource for permission context is even more important.

1390
01:03:03,680 –> 01:03:06,480
Whether the caller is using OBO or app only,

1391
01:03:06,480 –> 01:03:07,840
which identity is active,

1392
01:03:07,840 –> 01:03:09,680
and what scope is being requested.

1393
01:03:09,680 –> 01:03:11,440
This isn’t for the model’s curiosity,

1394
01:03:11,440 –> 01:03:12,480
it’s for determinism.

1395
01:03:12,480 –> 01:03:16,080
If the host and server can fetch a small structured permission context,

1396
01:03:16,080 –> 01:03:20,080
the host can decide whether to allow downstream tool calls without guessing.

1397
01:03:20,080 –> 01:03:22,880
A resource for content types and columns is also valuable

1398
01:03:22,880 –> 01:03:25,920
because in SharePoint, list data without schema is just noise.

1399
01:03:25,920 –> 01:03:27,600
Give the model stable names for fields,

1400
01:03:27,600 –> 01:03:29,280
expected types, and allowed values.

1401
01:03:29,280 –> 01:03:31,680
Otherwise, it will hallucinate a column called status

1402
01:03:31,680 –> 01:03:33,120
because every system has a status

1403
01:03:33,120 –> 01:03:35,280
and then your tool call fails and the loop retries

1404
01:03:35,280 –> 01:03:36,960
until your back end hates you.

1405
01:03:36,960 –> 01:03:38,080
Now tools.

1406
01:03:38,080 –> 01:03:39,680
Tools are where the damage happens,

1407
01:03:39,680 –> 01:03:42,160
so tools need strict schemas and narrow meaning.

1408
01:03:42,480 –> 01:03:44,080
Avoid the generic search.

1409
01:03:44,080 –> 01:03:45,520
SharePoint search is not one thing.

1410
01:03:45,520 –> 01:03:48,480
It’s multiple things with different authorization surfaces

1411
01:03:48,480 –> 01:03:50,160
and different failure modes.

1412
01:03:50,160 –> 01:03:52,960
So instead, define tools with explicit scope and intent.

1413
01:03:52,960 –> 01:03:55,920
A tool like SharePoint search documents inside

1414
01:03:55,920 –> 01:03:58,080
with required site id and query text,

1415
01:03:58,080 –> 01:04:01,040
plus optional filters that you explicitly constrain,

1416
01:04:01,040 –> 01:04:03,440
file type, modified after, author,

1417
01:04:03,440 –> 01:04:05,840
upan, sensitivity label, top.

1418
01:04:05,840 –> 01:04:07,680
No freeform filters object.

1419
01:04:07,680 –> 01:04:09,920
You want schema discipline, not creativity.

1420
01:04:09,920 –> 01:04:13,040
A tool like SharePoint tag get document metadata

1421
01:04:13,040 –> 01:04:16,080
takes a stable identifier, returns stable fields,

1422
01:04:16,080 –> 01:04:18,240
and never returns full content by default.

1423
01:04:18,240 –> 01:04:20,880
If you want content, you make that a separate tool.

1424
01:04:20,880 –> 01:04:24,640
SharePoint get document content with explicit max bytes

1425
01:04:24,640 –> 01:04:26,720
and the host must enforce policy around it.

1426
01:04:26,720 –> 01:04:30,880
A tool like graph list user groups is a trap

1427
01:04:30,880 –> 01:04:33,360
unless you tightly scope why it exists.

1428
01:04:33,360 –> 01:04:34,480
In an enterprise tenant,

1429
01:04:34,480 –> 01:04:36,480
enumerating group membership is sensitive,

1430
01:04:36,480 –> 01:04:39,040
so if you need it, constrain it to a specific purpose.

1431
01:04:39,040 –> 01:04:42,320
Graph check user access to site where the server answers a yes,

1432
01:04:42,320 –> 01:04:45,760
no plus evidence fields instead of dumping raw group data.

1433
01:04:45,760 –> 01:04:47,920
Then prompts are templates that standardize

1434
01:04:47,920 –> 01:04:49,760
how humans invoke common workflows.

1435
01:04:49,760 –> 01:04:51,760
For SharePoint, the obvious ones are things like

1436
01:04:51,760 –> 01:04:53,680
review this document for policy compliance

1437
01:04:53,680 –> 01:04:56,160
or summarize changes since last week for this site.

1438
01:04:56,160 –> 01:04:57,600
But you keep prompts honest.

1439
01:04:57,600 –> 01:05:00,320
They don’t grant permissions, they don’t bypass approval

1440
01:05:00,320 –> 01:05:02,400
and they don’t magically solve injection.

1441
01:05:02,400 –> 01:05:03,840
They just reduce human drift.

1442
01:05:03,840 –> 01:05:05,600
Now the identity model ties it together.

1443
01:05:05,600 –> 01:05:07,760
If the host uses oboe, your tools operate

1444
01:05:07,760 –> 01:05:10,320
under user delegated access and SharePoint and graph

1445
01:05:10,320 –> 01:05:11,840
become the enforcement engines.

1446
01:05:11,840 –> 01:05:13,760
If the host uses managed identity,

1447
01:05:13,760 –> 01:05:16,240
your tools must be scoped to operational tasks

1448
01:05:16,240 –> 01:05:18,480
and your server must log attribution explicitly

1449
01:05:18,480 –> 01:05:20,080
because graph won’t do it for you.

1450
01:05:20,080 –> 01:05:22,000
If you front the whole thing with APM,

1451
01:05:22,000 –> 01:05:24,000
you get rate control and a ledger of calls

1452
01:05:24,000 –> 01:05:25,600
that doesn’t depend on every developer

1453
01:05:25,600 –> 01:05:27,040
remembering to instrument,

1454
01:05:27,040 –> 01:05:29,600
finally you define what fail closed means.

1455
01:05:29,600 –> 01:05:31,520
If the tool can’t prove site scope,

1456
01:05:31,520 –> 01:05:32,880
it refuses the call.

1457
01:05:32,880 –> 01:05:35,360
If a document is overshared or unlabeled

1458
01:05:35,360 –> 01:05:37,360
and your policy requires classification,

1459
01:05:37,360 –> 01:05:38,720
the tool refuses the call.

1460
01:05:38,720 –> 01:05:40,000
If the query is ambiguous,

1461
01:05:40,000 –> 01:05:41,360
the tool refuses the call

1462
01:05:41,360 –> 01:05:43,600
and forces illicitation through the host.

1463
01:05:43,600 –> 01:05:46,400
This is the real value of MCP in Microsoft land.

1464
01:05:46,400 –> 01:05:48,320
Not that the model can reach SharePoint,

1465
01:05:48,320 –> 01:05:50,800
that the model can’t reach SharePoint unless you let it.

1466
01:05:50,800 –> 01:05:53,680
Contract design, tool schemers, naming

1467
01:05:53,680 –> 01:05:55,440
and the art of avoiding overlap.

1468
01:05:55,440 –> 01:05:57,040
Now comes the part everyone skips

1469
01:05:57,040 –> 01:05:59,600
because it feels too API-ish at contract design.

1470
01:05:59,600 –> 01:06:02,000
If you get the contract wrong, MCP doesn’t save you,

1471
01:06:02,000 –> 01:06:03,840
it just makes your mistakes reusable.

1472
01:06:03,840 –> 01:06:05,360
And the first mistake is naming.

1473
01:06:05,360 –> 01:06:08,000
Most teams name tools like they name helper functions,

1474
01:06:08,000 –> 01:06:10,160
short, generic and optimistic.

1475
01:06:10,160 –> 01:06:13,040
Search, get files, create item.

1476
01:06:13,040 –> 01:06:15,040
That works when a human developer reads the code

1477
01:06:15,040 –> 01:06:16,240
and understands context.

1478
01:06:16,240 –> 01:06:17,760
A model doesn’t have that context.

1479
01:06:17,760 –> 01:06:20,080
A model sees a menu of tools with descriptions.

1480
01:06:20,080 –> 01:06:22,160
Then it guesses, so naming has one job,

1481
01:06:22,160 –> 01:06:23,520
make guessing unnecessary.

1482
01:06:23,520 –> 01:06:26,720
The rule is verb first, scope second, and domain explicit.

1483
01:06:26,720 –> 01:06:30,400
Not search, SharePoint search, documents inside.

1484
01:06:30,400 –> 01:06:33,360
Not get, SharePoint get document metadata.

1485
01:06:33,360 –> 01:06:36,080
Not update, SharePoint update list item fields.

1486
01:06:36,080 –> 01:06:39,920
The name should answer, what system, what object, what scope, what action.

1487
01:06:39,920 –> 01:06:43,120
Every extra syllable is cheaper than an incident review.

1488
01:06:43,120 –> 01:06:45,840
Now the next rule, never create overlapping tools.

1489
01:06:45,840 –> 01:06:48,880
If you expose three tools that all feel like search,

1490
01:06:48,880 –> 01:06:50,800
the model will pick the wrong one eventually.

1491
01:06:50,800 –> 01:06:53,520
Not because it’s dumb, but because you asked it to choose between

1492
01:06:53,520 –> 01:06:57,360
ambiguous options, so you define one canonical tool per intent, per scope.

1493
01:06:57,360 –> 01:06:59,360
If you need different search semantics,

1494
01:06:59,360 –> 01:07:02,960
graph search versus SharePoint rest versus search API,

1495
01:07:02,960 –> 01:07:04,400
you hide that inside the server.

1496
01:07:04,400 –> 01:07:07,440
You don’t force the model to know which back end is better.

1497
01:07:07,440 –> 01:07:09,040
The server is the translator.

1498
01:07:09,040 –> 01:07:10,960
The model is not your integration engineer.

1499
01:07:10,960 –> 01:07:13,440
Now schemas, your input schema is not a convenience.

1500
01:07:13,440 –> 01:07:15,600
It is the boundary that keeps prompt injection

1501
01:07:15,600 –> 01:07:16,880
from becoming tool injection.

1502
01:07:16,880 –> 01:07:20,480
If you accept freeform strings where you actually need constrained fields,

1503
01:07:20,480 –> 01:07:22,960
the model will smuggle instructions into parameters.

1504
01:07:22,960 –> 01:07:23,920
It won’t even mean to.

1505
01:07:23,920 –> 01:07:26,160
It’s just optimizing for get the job done.

1506
01:07:26,160 –> 01:07:28,800
So constrained inputs until the model can’t be clever.

1507
01:07:28,800 –> 01:07:31,360
If a tool needs a site, require a site ID,

1508
01:07:31,360 –> 01:07:34,240
not site URL or site name or whatever you can find,

1509
01:07:34,240 –> 01:07:35,120
one identifier.

1510
01:07:35,120 –> 01:07:39,680
If a tool needs a time window, require ISO 8601 timestamps,

1511
01:07:39,680 –> 01:07:40,800
not last week.

1512
01:07:40,800 –> 01:07:42,880
If a tool needs a filter, make it an in-home,

1513
01:07:42,880 –> 01:07:44,000
not filter text.

1514
01:07:44,000 –> 01:07:47,360
And if you absolutely must accept freeform text,

1515
01:07:47,360 –> 01:07:50,160
you treat it as untrusted, you validate it, you log it,

1516
01:07:50,160 –> 01:07:52,880
and you design the tool, so the worst case is bad query,

1517
01:07:52,880 –> 01:07:54,240
not privilege escalation.

1518
01:07:54,240 –> 01:07:56,000
Outputs matter just as much.

1519
01:07:56,000 –> 01:07:58,800
Most MCP servers return whatever the back end returned,

1520
01:07:58,800 –> 01:08:00,000
because it’s easy.

1521
01:08:00,000 –> 01:08:03,120
That is how you make the model reverse engineer your system at runtime.

1522
01:08:03,120 –> 01:08:05,040
Instead, you return stable shapes.

1523
01:08:05,040 –> 01:08:08,640
For a search tool, a list of results with a strict object schema.

1524
01:08:08,640 –> 01:08:13,040
Each result has ID, title, web URL, last modified data time,

1525
01:08:13,040 –> 01:08:16,320
author, and classification signals you can reliably provide.

1526
01:08:16,320 –> 01:08:18,160
No polymorphic blobs.

1527
01:08:18,160 –> 01:08:20,880
For metadata tools, predictable fields,

1528
01:08:20,880 –> 01:08:23,680
predictable null behavior, predictable paging.

1529
01:08:23,680 –> 01:08:25,680
If there’s paging, return the next cursor.

1530
01:08:25,680 –> 01:08:28,880
Don’t dump our data next link and call it a day.

1531
01:08:28,880 –> 01:08:30,480
And here’s the uncomfortable part.

1532
01:08:30,480 –> 01:08:33,280
You need to design outputs for audit, not just for the model.

1533
01:08:33,280 –> 01:08:36,560
If a tool fetches a document, include the permission path you used,

1534
01:08:36,560 –> 01:08:39,040
delegated user token, or app only,

1535
01:08:39,040 –> 01:08:40,720
include the resource identifiers,

1536
01:08:40,720 –> 01:08:43,360
include a correlation ID that ties back to logs.

1537
01:08:43,360 –> 01:08:45,280
That’s how you prove what happened later,

1538
01:08:45,280 –> 01:08:48,960
when later becomes why did this tool access that file?

1539
01:08:48,960 –> 01:08:51,920
Now, versioning and MCP capability services are discoverable.

1540
01:08:51,920 –> 01:08:55,280
That’s good, but it tempts teams into silent braking changes.

1541
01:08:55,280 –> 01:08:58,080
Rename fields, change meanings, add optional parameters

1542
01:08:58,080 –> 01:08:59,040
that alter behavior.

1543
01:08:59,040 –> 01:09:01,920
That’s how deterministic contracts turn probabilistic.

1544
01:09:01,920 –> 01:09:04,640
So treat capability versioning as a first class design input.

1545
01:09:04,640 –> 01:09:06,880
Either version your tool names like SharePoint,

1546
01:09:06,880 –> 01:09:09,120
search documents inside V2,

1547
01:09:09,120 –> 01:09:11,520
or version your server capabilities explicitly

1548
01:09:11,520 –> 01:09:13,920
and keep old shapes alive until clients migrate.

1549
01:09:13,920 –> 01:09:16,000
It’s not elegant, but it’s survivable.

1550
01:09:16,000 –> 01:09:19,680
Finally, the anti-overlapped discipline needs a naming taxonomy.

1551
01:09:19,680 –> 01:09:22,560
Within a server, tools should follow a consistent pattern.

1552
01:09:22,560 –> 01:09:26,560
System prefix, SharePoint, graph, SQL, Action Verb,

1553
01:09:26,560 –> 01:09:30,640
Search, Get, List, Create, Update, Delete,

1554
01:09:30,640 –> 01:09:32,000
Scope Qualifier.

1555
01:09:32,000 –> 01:09:34,560
Inside, in library, by ID.

1556
01:09:34,560 –> 01:09:39,280
Object noun, documents, list items, permissions.

1557
01:09:39,280 –> 01:09:40,240
That’s not aesthetics.

1558
01:09:40,240 –> 01:09:42,560
It’s how you prevent the three search tools problem

1559
01:09:42,560 –> 01:09:44,080
that they are from Anthropic called out.

1560
01:09:44,080 –> 01:09:45,600
Overlapping tools, confuse models,

1561
01:09:45,600 –> 01:09:48,240
and confusion becomes unpredictable tool selection.

1562
01:09:48,240 –> 01:09:50,160
And when tool selection becomes unpredictable,

1563
01:09:50,160 –> 01:09:52,480
your security model becomes probabilistic.

1564
01:09:52,480 –> 01:09:54,240
So yes, contract design is boring.

1565
01:09:54,240 –> 01:09:55,280
That’s why it works.

1566
01:09:55,280 –> 01:09:58,000
The whole point of MCP is to give a probabilistic model

1567
01:09:58,000 –> 01:09:59,920
a deterministic capability surface.

1568
01:09:59,920 –> 01:10:02,560
Names remove guesswork, skimmers remove ambiguity,

1569
01:10:02,560 –> 01:10:04,320
output shapes remove interpretation,

1570
01:10:04,320 –> 01:10:05,840
versioning removes drift.

1571
01:10:05,840 –> 01:10:08,560
If you do those four things, MCP becomes governable.

1572
01:10:08,560 –> 01:10:11,600
If you don’t, MCP becomes just another way to scale your glue code.

1573
01:10:11,600 –> 01:10:16,640
Hosting decision point, functions, versus container apps, versus AKS.

1574
01:10:16,640 –> 01:10:18,080
Now you’ve got a contract.

1575
01:10:18,080 –> 01:10:20,080
You’ve got tool names that don’t overlap.

1576
01:10:20,080 –> 01:10:22,560
You’ve got skimmers that don’t invite improvisation.

1577
01:10:22,560 –> 01:10:24,400
So the next question is painfully unglomerate.

1578
01:10:24,400 –> 01:10:26,160
Where does the MCP server live?

1579
01:10:26,160 –> 01:10:28,560
This is where teams pretend they’re discussing cost and latency,

1580
01:10:28,560 –> 01:10:31,440
but they’re really choosing blast radius and operational ownership.

1581
01:10:31,440 –> 01:10:32,800
Hosting is not a runtime choice.

1582
01:10:32,800 –> 01:10:33,680
And it’s a pager choice.

1583
01:10:33,680 –> 01:10:34,960
Start with Azure Functions.

1584
01:10:34,960 –> 01:10:38,000
Functions are the default reflex

1585
01:10:38,000 –> 01:10:40,080
because they feel like small tools.

1586
01:10:40,080 –> 01:10:42,960
One function per tool, scale to zero, paper execution.

1587
01:10:42,960 –> 01:10:44,240
It looks like alignment.

1588
01:10:44,240 –> 01:10:47,600
But MCP servers, especially remote ones over HTTP,

1589
01:10:47,600 –> 01:10:49,840
don’t behave like typical webhook handlers.

1590
01:10:49,840 –> 01:10:51,680
They behave like interactive services

1591
01:10:51,680 –> 01:10:53,760
that get called in bursts in loops.

1592
01:10:53,760 –> 01:10:57,600
And sometimes in rapid retries, because the model is trying to complete a task.

1593
01:10:57,600 –> 01:11:00,880
Functions can work if your MCP server is truly stateless per call

1594
01:11:00,880 –> 01:11:02,480
and your tools are short-lived.

1595
01:11:02,480 –> 01:11:05,200
Read only queries, quick lookups, narrow transformations.

1596
01:11:05,200 –> 01:11:07,440
It’s great for background automation tools too,

1597
01:11:07,440 –> 01:11:09,840
where a cold start is annoying but not catastrophic.

1598
01:11:09,840 –> 01:11:12,000
The catch is cold start and connection behavior.

1599
01:11:12,000 –> 01:11:13,520
In an interactive agent loop,

1600
01:11:13,520 –> 01:11:16,480
a few seconds of startup delay doesn’t just slow the user.

1601
01:11:16,480 –> 01:11:17,840
It changes model behavior.

1602
01:11:17,840 –> 01:11:21,200
The model sees tool is slow, tries a different tool,

1603
01:11:21,200 –> 01:11:22,320
or retries.

1604
01:11:22,320 –> 01:11:25,040
And now you’ve built an accidental traffic amplifier.

1605
01:11:25,040 –> 01:11:27,840
Functions also push you toward fragmented deployments.

1606
01:11:27,840 –> 01:11:30,320
One server per team, per tool set,

1607
01:11:30,320 –> 01:11:32,400
each with slightly different auth handling,

1608
01:11:32,400 –> 01:11:34,240
logging and network controls.

1609
01:11:34,240 –> 01:11:36,720
That is not a platform that is distributed entropy.

1610
01:11:36,720 –> 01:11:38,080
Now, Azure Container Apps.

1611
01:11:38,080 –> 01:11:42,240
Container Apps is the middle path that enterprises should default to

1612
01:11:42,240 –> 01:11:44,480
and rarely do because it’s not serverless pure

1613
01:11:44,480 –> 01:11:46,160
and it’s not Kubernetes heroic.

1614
01:11:46,160 –> 01:11:48,960
It’s a managed container runtime with sane scaling,

1615
01:11:48,960 –> 01:11:52,720
optional scale to zero, and a predictable execution environment

1616
01:11:52,720 –> 01:11:54,080
for HTTP services.

1617
01:11:54,080 –> 01:11:57,520
For MCP servers, that matters because you typically want a single process

1618
01:11:57,520 –> 01:11:59,360
that owns the tool registry,

1619
01:11:59,360 –> 01:12:01,760
can maintain session level behavior if needed,

1620
01:12:01,760 –> 01:12:03,200
and can handle streaming patterns

1621
01:12:03,200 –> 01:12:04,960
without you fighting the platform.

1622
01:12:04,960 –> 01:12:06,560
You also get cleaner identity stories,

1623
01:12:06,560 –> 01:12:08,560
managed identity integration is straightforward.

1624
01:12:08,560 –> 01:12:09,840
Network boundaries are clearer.

1625
01:12:09,840 –> 01:12:12,400
You can front it with APM without weird workarounds.

1626
01:12:12,400 –> 01:12:14,560
And your deployment artifact is a container image,

1627
01:12:14,560 –> 01:12:17,520
which means your dewex and your runtime are finally the same thing.

1628
01:12:17,520 –> 01:12:21,360
The trade is that container apps forces you to act like you’re running a service.

1629
01:12:21,360 –> 01:12:24,400
You need health probes, resource limits, log strategy,

1630
01:12:24,400 –> 01:12:26,480
and you need to accept that scaling is not free.

1631
01:12:26,480 –> 01:12:29,520
A burst of tool calls becomes a burst of container replicas

1632
01:12:29,520 –> 01:12:31,840
unless you control concurrency intentionally.

1633
01:12:31,840 –> 01:12:33,760
Now, AKS-AKS is the correct answer

1634
01:12:33,760 –> 01:12:36,960
when you already operate Kubernetes as a first-class platform,

1635
01:12:36,960 –> 01:12:38,480
not when you might need it later.

1636
01:12:38,480 –> 01:12:40,240
Kubernetes isn’t a hosting option.

1637
01:12:40,240 –> 01:12:42,400
It’s an operating model with an attached tax.

1638
01:12:42,400 –> 01:12:45,360
AKS makes sense if you need strict network segmentation,

1639
01:12:45,360 –> 01:12:49,200
advanced routing, custom side cars, service mesh integration,

1640
01:12:49,200 –> 01:12:52,960
or if you’re collocating MCP servers with other internal services

1641
01:12:52,960 –> 01:12:55,280
in a cluster that’s already governed and monitored.

1642
01:12:55,280 –> 01:12:58,720
It’s also reasonable if you’re building a multi-tenant MCP platform

1643
01:12:58,720 –> 01:13:01,680
with strong isolation requirements per team or per environment.

1644
01:13:01,680 –> 01:13:03,520
But here’s the architectural truth.

1645
01:13:03,520 –> 01:13:06,720
If this is your first MCP server and your first question is,

1646
01:13:06,720 –> 01:13:07,920
should we run AKS?

1647
01:13:07,920 –> 01:13:08,960
You’re early solving.

1648
01:13:08,960 –> 01:13:11,280
You are optimizing for theoretical future scale

1649
01:13:11,280 –> 01:13:13,200
instead of today’s boundary correctness.

1650
01:13:13,200 –> 01:13:15,920
An MCP doesn’t fail first because you didn’t have enough nodes.

1651
01:13:15,920 –> 01:13:18,160
It fails because you didn’t have deterministic contracts

1652
01:13:18,160 –> 01:13:20,240
and forcible identity and a failure model

1653
01:13:20,240 –> 01:13:22,160
that closes doors instead of opening them.

1654
01:13:22,160 –> 01:13:23,840
So choose based on the real constraints.

1655
01:13:23,840 –> 01:13:26,560
If you need to move fast and your tools are short-lived,

1656
01:13:26,560 –> 01:13:29,360
functions can be fine, but treated as a stepping stone,

1657
01:13:29,360 –> 01:13:30,480
not the destination.

1658
01:13:30,480 –> 01:13:32,960
If you want a stable, governable HTTP service

1659
01:13:32,960 –> 01:13:35,760
with Sain Operations, container apps is the default.

1660
01:13:35,760 –> 01:13:37,200
If you already live in Kubernetes

1661
01:13:37,200 –> 01:13:39,040
and you need Kubernetes class controls,

1662
01:13:39,040 –> 01:13:40,000
AKS is reasonable,

1663
01:13:40,000 –> 01:13:42,640
but only if you’re willing to pay the ongoing cost

1664
01:13:42,640 –> 01:13:43,840
in human attention.

1665
01:13:43,840 –> 01:13:46,720
Because the question behind every hosting decision is simple.

1666
01:13:46,720 –> 01:13:49,120
When this tool server misbehaves at 2am,

1667
01:13:49,120 –> 01:13:50,640
who gets blamed, who gets paged,

1668
01:13:50,640 –> 01:13:52,240
and what system is now at risk?

1669
01:13:52,240 –> 01:13:56,000
SLOs and failure modes, latency, timeouts, and failing closed.

1670
01:13:56,000 –> 01:13:57,520
Now assume you picked a host.

1671
01:13:57,520 –> 01:13:59,520
Great, your next problem is that agent traffic

1672
01:13:59,520 –> 01:14:01,280
doesn’t behave like human traffic.

1673
01:14:01,280 –> 01:14:02,800
So you need SLOs, not vibes.

1674
01:14:02,800 –> 01:14:04,000
For interactive tool use,

1675
01:14:04,000 –> 01:14:06,720
the only number that matters is perceived responsiveness.

1676
01:14:06,720 –> 01:14:08,880
A good target is P95,

1677
01:14:08,880 –> 01:14:11,920
around 300 to 500 milliseconds per tool call

1678
01:14:11,920 –> 01:14:15,360
end to end, not back end time, end to end,

1679
01:14:15,360 –> 01:14:19,120
arth, network, execution, serialization, logging.

1680
01:14:19,120 –> 01:14:21,120
Because the model doesn’t care why it was slow.

1681
01:14:21,120 –> 01:14:23,440
It just reacts, and when it reacts, it amplifies.

1682
01:14:23,440 –> 01:14:24,800
A slow tool triggers retrieves.

1683
01:14:24,800 –> 01:14:26,640
Retrieves trigger concurrency.

1684
01:14:26,640 –> 01:14:28,400
Concurrency triggers throttling.

1685
01:14:28,400 –> 01:14:30,240
Throttling triggers more retrieves.

1686
01:14:30,240 –> 01:14:32,240
That loop is how you doss your own tenant.

1687
01:14:32,240 –> 01:14:34,880
So set explicit timeouts, short for read tools.

1688
01:14:34,880 –> 01:14:36,320
Longer only when the tool is designed

1689
01:14:36,320 –> 01:14:38,480
for long running work with progress reporting.

1690
01:14:38,480 –> 01:14:40,000
If the tool can mutate state,

1691
01:14:40,000 –> 01:14:41,440
it must be idempotent,

1692
01:14:41,440 –> 01:14:43,200
or you will eventually duplicate actions

1693
01:14:43,200 –> 01:14:44,560
under retry pressure,

1694
01:14:44,560 –> 01:14:47,360
then decide fail closed versus fail open.

1695
01:14:47,360 –> 01:14:48,720
Fail open feels helpful.

1696
01:14:48,720 –> 01:14:51,040
It’s also how policy turns into a suggestion.

1697
01:14:51,040 –> 01:14:52,240
If oath fails deny.

1698
01:14:52,240 –> 01:14:53,680
If scope is unclear deny,

1699
01:14:53,680 –> 01:14:56,080
if classification is missing and policy requires it,

1700
01:14:56,080 –> 01:14:57,920
deny denial is stability.

1701
01:14:57,920 –> 01:14:59,920
MCP and developer experience,

1702
01:14:59,920 –> 01:15:01,120
strong interfaces,

1703
01:15:01,120 –> 01:15:02,960
fewer hallucinated integrations.

1704
01:15:02,960 –> 01:15:04,720
Now here’s the part that gets MCP

1705
01:15:04,720 –> 01:15:06,880
adopted inside engineering teams.

1706
01:15:06,880 –> 01:15:08,160
Not governance,

1707
01:15:08,160 –> 01:15:09,280
developer experience.

1708
01:15:09,280 –> 01:15:11,440
Because most teams don’t start a project by saying,

1709
01:15:11,440 –> 01:15:13,760
I’d like a new control plane boundary, they don’t.

1710
01:15:13,760 –> 01:15:14,560
They start by saying,

1711
01:15:14,560 –> 01:15:16,160
I’m tired of rewriting this integration

1712
01:15:16,160 –> 01:15:17,680
for every agent framework,

1713
01:15:17,680 –> 01:15:18,880
and I’m tired of the model

1714
01:15:18,880 –> 01:15:20,640
guessing my API shape wrong.

1715
01:15:20,640 –> 01:15:22,560
This is the uncomfortable truth.

1716
01:15:22,560 –> 01:15:24,320
The average LLM integration fails

1717
01:15:24,320 –> 01:15:25,680
because the interface is vague,

1718
01:15:25,680 –> 01:15:27,120
not because the model is dumb.

1719
01:15:27,120 –> 01:15:28,800
When people say the model hallucinated,

1720
01:15:28,800 –> 01:15:30,320
what they usually mean is,

1721
01:15:30,320 –> 01:15:31,920
we handed a probabilistic caller

1722
01:15:31,920 –> 01:15:33,120
an ambiguous tool surface

1723
01:15:33,120 –> 01:15:34,800
and then acted surprised when it guessed.

1724
01:15:34,800 –> 01:15:38,800
MCP’s real devex win is that it makes ambiguity expensive.

1725
01:15:38,800 –> 01:15:41,600
It forces you to declare the capability surface up front,

1726
01:15:41,600 –> 01:15:43,520
tool names, descriptions, schemers,

1727
01:15:43,520 –> 01:15:44,320
output shapes.

1728
01:15:44,320 –> 01:15:45,200
And once you have that,

1729
01:15:45,200 –> 01:15:47,520
you can do something that enterprises have always needed

1730
01:15:47,520 –> 01:15:49,360
but rarely got from AI tooling.

1731
01:15:49,360 –> 01:15:50,720
You can treat tool integrations

1732
01:15:50,720 –> 01:15:52,400
like software contracts again.

1733
01:15:52,400 –> 01:15:54,160
That distinction matters.

1734
01:15:54,160 –> 01:15:56,880
Because rest APIs and open API do this for developers,

1735
01:15:56,880 –> 01:16:00,160
but LLM tool use introduces an extra problem.

1736
01:16:00,160 –> 01:16:03,040
Tool discovery and selection happens at runtime

1737
01:16:03,040 –> 01:16:04,720
inside a reasoning loop

1738
01:16:04,720 –> 01:16:06,720
by a caller that does not read your docs

1739
01:16:06,720 –> 01:16:08,480
like a human reads docs.

1740
01:16:08,480 –> 01:16:12,000
So MCP gives you a structured inventory of capabilities

1741
01:16:12,000 –> 01:16:14,720
that the host can present to the model consistently

1742
01:16:14,720 –> 01:16:15,920
and it gives you schemers

1743
01:16:15,920 –> 01:16:18,400
that the host can validate before anything runs.

1744
01:16:18,400 –> 01:16:21,680
That means fewer hallucinated integrations in practice.

1745
01:16:21,680 –> 01:16:23,280
Fewer invented parameters,

1746
01:16:23,280 –> 01:16:24,960
fewer wrong endpoint assumptions,

1747
01:16:24,960 –> 01:16:27,680
fewer it tried to call search with a site name

1748
01:16:27,680 –> 01:16:28,960
when you needed a site ID,

1749
01:16:28,960 –> 01:16:30,800
not eliminated, reduced.

1750
01:16:30,800 –> 01:16:34,240
And reduction is the whole game in enterprise architecture.

1751
01:16:34,240 –> 01:16:36,240
Now the second devex upgrade is that MCP

1752
01:16:36,240 –> 01:16:39,040
makes testing possible in a way that most agent toolchains

1753
01:16:39,040 –> 01:16:39,920
quietly don’t.

1754
01:16:39,920 –> 01:16:42,320
When tool invocation becomes a declared contract,

1755
01:16:42,320 –> 01:16:44,560
you can write contract tests that validate.

1756
01:16:44,560 –> 01:16:46,320
Does this tool accept the schema?

1757
01:16:46,320 –> 01:16:48,000
Does it reject invalid inputs?

1758
01:16:48,000 –> 01:16:49,920
Does it return the output shape you promised?

1759
01:16:49,920 –> 01:16:52,800
Does it fail closed when identity isn’t present?

1760
01:16:52,800 –> 01:16:55,120
And you can run those tests without a model in the loop.

1761
01:16:55,120 –> 01:16:56,560
That’s not a small improvement.

1762
01:16:56,560 –> 01:16:58,400
That’s the difference between AI prototype

1763
01:16:58,400 –> 01:17:00,720
and integration that survives a quarter.

1764
01:17:00,720 –> 01:17:03,360
Because if you can’t test the tool layer deterministically,

1765
01:17:03,360 –> 01:17:05,760
you end up testing the entire system through the model

1766
01:17:05,760 –> 01:17:08,000
and the model will never give you stable test cases.

1767
01:17:08,000 –> 01:17:09,360
It’s probabilistic by design.

1768
01:17:09,360 –> 01:17:11,600
So MCP lets you split the work.

1769
01:17:11,600 –> 01:17:14,480
The model is tested for behavior and guardrails.

1770
01:17:14,480 –> 01:17:17,280
The tools are tested for contracts and policy.

1771
01:17:17,280 –> 01:17:20,160
Two different test strategies for two different types of components.

1772
01:17:20,160 –> 01:17:22,000
That is what mature engineering looks like.

1773
01:17:22,000 –> 01:17:24,320
Now talk about versioning because every integration

1774
01:17:24,320 –> 01:17:25,600
eventually changes.

1775
01:17:25,600 –> 01:17:28,720
Schemas evolve, back ends evolve, requirements evolve.

1776
01:17:28,720 –> 01:17:31,200
And if you handle that by just update the code,

1777
01:17:31,200 –> 01:17:33,360
you will break clients you don’t even know exist,

1778
01:17:33,360 –> 01:17:34,880
especially in an MCP world

1779
01:17:34,880 –> 01:17:37,520
where multiple hosts can connect to the same server.

1780
01:17:37,520 –> 01:17:41,200
So the Devex benefit is not that MCP magically versions your tools.

1781
01:17:41,200 –> 01:17:44,480
That’s that MCP gives you a place to version them cleanly.

1782
01:17:44,480 –> 01:17:46,640
You can add a new tool without deleting the old one.

1783
01:17:46,640 –> 01:17:49,600
You can introduce V2 shapes while keeping V1 alive.

1784
01:17:49,600 –> 01:17:51,600
You can mark capabilities as deprecated.

1785
01:17:51,600 –> 01:17:53,760
You can run compatibility checks in CI.

1786
01:17:53,760 –> 01:17:55,600
And the clients don’t need to be rewritten

1787
01:17:55,600 –> 01:17:57,680
just because you changed the back end implementation.

1788
01:17:57,680 –> 01:18:00,000
Because the contract is the thing you treat as durable.

1789
01:18:00,000 –> 01:18:02,000
Again, survivability over novelty.

1790
01:18:02,000 –> 01:18:04,000
But there’s a warning here.

1791
01:18:04,000 –> 01:18:06,400
And it’s the same warning from earlier sections.

1792
01:18:06,400 –> 01:18:08,960
If you treat MCP as faster plugins,

1793
01:18:08,960 –> 01:18:10,720
you will rebuild the glue code anyway.

1794
01:18:10,720 –> 01:18:13,600
You’ll create 10 overlapping tools because it feels convenient.

1795
01:18:13,600 –> 01:18:16,000
You’ll expose raw back end responses because it’s faster.

1796
01:18:16,000 –> 01:18:19,200
You’ll accept freeform parameters because the model will figure it out.

1797
01:18:19,200 –> 01:18:22,000
And then you’ll spend the next six months writing prompt band aids

1798
01:18:22,000 –> 01:18:24,800
and system messages to compensate for a capability surface

1799
01:18:24,800 –> 01:18:25,840
that never had discipline.

1800
01:18:25,840 –> 01:18:27,120
That’s not MCP failing.

1801
01:18:27,120 –> 01:18:29,360
That’s you refusing to design an interface.

1802
01:18:29,360 –> 01:18:31,920
An MCP can’t fix that because MCP is not intelligence.

1803
01:18:31,920 –> 01:18:34,320
It’s a protocol. A protocol can enforce structure,

1804
01:18:34,320 –> 01:18:37,920
but it cannot enforce intent unless you actually embed intent

1805
01:18:37,920 –> 01:18:41,120
into the structure names, schemas, scoping rules,

1806
01:18:41,120 –> 01:18:42,640
and fail closed behavior.

1807
01:18:42,640 –> 01:18:44,560
So the clean takeaway for DevEx is simple.

1808
01:18:44,560 –> 01:18:46,400
MCP doesn’t make agents smarter.

1809
01:18:46,400 –> 01:18:48,080
It makes integrations less ambiguous.

1810
01:18:48,080 –> 01:18:50,560
And when you reduce ambiguity, you reduce hallucination,

1811
01:18:50,560 –> 01:18:52,880
you reduce retries, you reduce incident fuel,

1812
01:18:52,880 –> 01:18:55,440
and you reduce the amount of custom glue code you need

1813
01:18:55,440 –> 01:18:58,480
to keep rewriting every time the ecosystem shifts.

1814
01:18:58,480 –> 01:18:59,760
That’s why engineers like it.

1815
01:18:59,760 –> 01:19:00,880
Not because it’s magical.

1816
01:19:01,520 –> 01:19:04,320
Because it’s boring in exactly the right place.

1817
01:19:04,320 –> 01:19:09,440
Tooling integration, VS Code, GitHub, Copilot, CICD, and in a source.

1818
01:19:09,440 –> 01:19:11,680
Once you accept that MCP is a contract boundary,

1819
01:19:11,680 –> 01:19:12,880
the next question is obvious.

1820
01:19:12,880 –> 01:19:16,160
How does it actually live inside real engineering workflows?

1821
01:19:16,160 –> 01:19:18,160
Because nobody deploys a protocol.

1822
01:19:18,160 –> 01:19:21,040
They deploy code through pipelines with approvals

1823
01:19:21,040 –> 01:19:23,520
under the comforting illusion that someone reviewed it.

1824
01:19:23,520 –> 01:19:24,800
So start with VS Code,

1825
01:19:24,800 –> 01:19:27,360
because that’s where most MCP adoption shows up first.

1826
01:19:27,360 –> 01:19:29,520
Developer tools and agent enabled IDs.

1827
01:19:29,520 –> 01:19:31,600
Not because IDs are the center of the universe,

1828
01:19:31,600 –> 01:19:34,480
but because they’re where tool use is easiest to demonstrate.

1829
01:19:34,480 –> 01:19:37,680
You can wire up an MCP server locally, expose a couple of tools,

1830
01:19:37,680 –> 01:19:40,080
and suddenly your assistant stops being a text generator

1831
01:19:40,080 –> 01:19:41,680
and starts being a bounded actor.

1832
01:19:41,680 –> 01:19:43,520
But don’t let that demo lie to you.

1833
01:19:43,520 –> 01:19:45,440
VS Code integration is a DevEx feature.

1834
01:19:45,440 –> 01:19:46,720
It is not an enterprise boundary.

1835
01:19:46,720 –> 01:19:49,120
The enterprise boundary is the MCP server contract

1836
01:19:49,120 –> 01:19:50,640
and the identity model behind it.

1837
01:19:50,640 –> 01:19:53,120
VS Code is just one host, a convenient one.

1838
01:19:53,120 –> 01:19:54,800
So the right mental model is this.

1839
01:19:54,800 –> 01:19:58,240
VS Code is where you develop and test MCP servers.

1840
01:19:58,240 –> 01:20:01,280
Your organization’s platform is where you publish and govern them.

1841
01:20:01,280 –> 01:20:03,280
Now, layer GitHub co-pilot on top of that.

1842
01:20:03,280 –> 01:20:05,280
Co-pilot helps you write the server quickly.

1843
01:20:05,280 –> 01:20:07,360
It will happily generate tool schemers,

1844
01:20:07,360 –> 01:20:09,600
JSON, RPC handlers, and boilerplate.

1845
01:20:09,600 –> 01:20:10,160
That’s fine.

1846
01:20:10,160 –> 01:20:11,520
It’s also not the hard part.

1847
01:20:11,520 –> 01:20:14,640
The hard part is deciding what tools should exist at all.

1848
01:20:14,640 –> 01:20:18,000
Because co-pilot will default to generic convenient tools.

1849
01:20:18,000 –> 01:20:19,840
Search, get, update.

1850
01:20:19,840 –> 01:20:22,240
And you already know what happens when you expose ambiguous

1851
01:20:22,240 –> 01:20:24,400
capabilities to a probabilistic caller.

1852
01:20:24,400 –> 01:20:25,680
So use co-pilot for speed,

1853
01:20:25,680 –> 01:20:27,600
but you still own the boundary design.

1854
01:20:27,600 –> 01:20:30,160
If you delegate boundary design to an autocomplete engine,

1855
01:20:30,160 –> 01:20:31,280
you’re not moving faster.

1856
01:20:31,280 –> 01:20:32,720
You’re moving the incident earlier.

1857
01:20:32,720 –> 01:20:35,360
Now, the part most teams ignore until they get burned.

1858
01:20:35,360 –> 01:20:37,120
CI/CD.

1859
01:20:37,120 –> 01:20:40,000
If MCP is going to be the end of custom AI glue,

1860
01:20:40,000 –> 01:20:42,800
then MCP servers must become shared assets.

1861
01:20:42,800 –> 01:20:46,480
And shared assets require the same discipline you apply to APIs.

1862
01:20:46,480 –> 01:20:49,600
Linting, testing, versioning, and deployment gates.

1863
01:20:49,600 –> 01:20:53,040
So treat an MCP server like a product with three non-negotiables.

1864
01:20:53,040 –> 01:20:54,960
First, schema validation in CI.

1865
01:20:54,960 –> 01:20:58,640
Every tool input schema and output shape should be machine validated,

1866
01:20:58,640 –> 01:21:00,240
not reviewed in a PR.

1867
01:21:00,240 –> 01:21:01,120
Validated.

1868
01:21:01,120 –> 01:21:03,680
This is where you catch the slow death of contract drift.

1869
01:21:03,680 –> 01:21:05,440
Renamed fields, changed meanings,

1870
01:21:05,440 –> 01:21:06,960
loose types creeping back in.

1871
01:21:06,960 –> 01:21:08,800
Second, contract tests for each tool,

1872
01:21:08,800 –> 01:21:10,880
test the success path and the denial path.

1873
01:21:10,880 –> 01:21:12,000
Especially the denial path.

1874
01:21:12,000 –> 01:21:14,000
If identity is missing, does it fail closed?

1875
01:21:14,000 –> 01:21:15,760
If scope is wrong, does it refuse?

1876
01:21:15,760 –> 01:21:19,440
If the request is ambiguous, does it force elicitation through the host?

1877
01:21:19,440 –> 01:21:20,560
Instead of guessing.

1878
01:21:20,560 –> 01:21:22,240
Your model is not your test harness.

1879
01:21:22,240 –> 01:21:23,120
Your pipeline is.

1880
01:21:23,920 –> 01:21:25,600
Third, policy gates on deployment.

1881
01:21:25,600 –> 01:21:27,440
If you run MCP servers in Azure,

1882
01:21:27,440 –> 01:21:29,200
you already have the governance tooling.

1883
01:21:29,200 –> 01:21:31,600
Azure Policy, APIM policies,

1884
01:21:31,600 –> 01:21:33,920
deployment approvals, environment separation.

1885
01:21:33,920 –> 01:21:34,640
Use them.

1886
01:21:34,640 –> 01:21:36,480
Don’t ship new tools straight to production

1887
01:21:36,480 –> 01:21:38,640
because it’s just an internal assistant.

1888
01:21:38,640 –> 01:21:41,920
Internal is where the most expensive breaches live now in a source.

1889
01:21:41,920 –> 01:21:45,040
This is where MCP becomes a real organizational multiplier

1890
01:21:45,040 –> 01:21:47,680
or just another pile of half-maintained repositories.

1891
01:21:47,680 –> 01:21:49,440
In most enterprises, every team

1892
01:21:49,440 –> 01:21:52,080
builds the same integration three times.

1893
01:21:52,080 –> 01:21:56,080
One for their app, one for power automate, one for whatever agent framework

1894
01:21:56,080 –> 01:21:57,200
they’re experimenting with.

1895
01:21:57,200 –> 01:21:58,000
And they all drift.

1896
01:21:58,000 –> 01:22:00,960
Different naming, different permissions, different behavior,

1897
01:22:00,960 –> 01:22:02,080
different logs.

1898
01:22:02,080 –> 01:22:03,280
Same backend.

1899
01:22:03,280 –> 01:22:05,360
MCP can collapse that duplication,

1900
01:22:05,360 –> 01:22:09,360
but only if you treat MCP servers as shared products with shared ownership.

1901
01:22:09,360 –> 01:22:10,720
Inner source is the mechanism.

1902
01:22:10,720 –> 01:22:14,880
Publish MCP servers as internal packages

1903
01:22:14,880 –> 01:22:16,000
with documentation,

1904
01:22:16,000 –> 01:22:17,920
versioning and a contribution model.

1905
01:22:17,920 –> 01:22:19,200
One team owns the boundary,

1906
01:22:19,200 –> 01:22:20,800
other teams contribute improvements.

1907
01:22:20,800 –> 01:22:22,960
Everyone consumes the same capability surface.

1908
01:22:22,960 –> 01:22:24,320
That’s how you reduce toolsprall,

1909
01:22:24,320 –> 01:22:26,080
without creating a central bottleneck.

1910
01:22:26,080 –> 01:22:30,080
And it also changes how you think about platform engineering for AI.

1911
01:22:30,080 –> 01:22:31,440
The platform isn’t the model.

1912
01:22:31,440 –> 01:22:34,400
The platform is the catalog of govern tool surfaces.

1913
01:22:34,400 –> 01:22:38,080
SharePoint access, graph search, ticket creation, deployment status,

1914
01:22:38,080 –> 01:22:39,440
whatever your organization needs.

1915
01:22:39,440 –> 01:22:40,240
The moment you do this,

1916
01:22:40,240 –> 01:22:43,120
your host applications become interchangeable at the tool boundary.

1917
01:22:43,120 –> 01:22:44,800
Teams can build different experiences,

1918
01:22:44,800 –> 01:22:46,800
Teams bots, web chat, IDE agents,

1919
01:22:46,800 –> 01:22:48,880
without rebuilding the integration every time.

1920
01:22:48,880 –> 01:22:51,200
That’s the practical payoff of standardization,

1921
01:22:51,200 –> 01:22:53,440
but it comes with one uncomfortable rule.

1922
01:22:53,440 –> 01:22:54,720
You need an internal registry,

1923
01:22:54,720 –> 01:22:56,400
even if it’s informal at first.

1924
01:22:56,400 –> 01:22:58,160
Not a public marketplace fantasy.

1925
01:22:58,160 –> 01:23:00,640
An internal system that answers

1926
01:23:00,640 –> 01:23:02,080
what MCP servers exist,

1927
01:23:02,080 –> 01:23:02,720
who owns them,

1928
01:23:02,720 –> 01:23:03,840
what version is deployed,

1929
01:23:03,840 –> 01:23:05,040
what tools they expose,

1930
01:23:05,040 –> 01:23:06,800
and what identity model they run under.

1931
01:23:06,800 –> 01:23:08,320
If you can’t answer those questions,

1932
01:23:08,320 –> 01:23:10,640
your shared MCP ecosystem

1933
01:23:10,640 –> 01:23:12,880
will become shadow IT with better marketing.

1934
01:23:12,880 –> 01:23:15,440
So the workflow is simple and also relentless.

1935
01:23:15,440 –> 01:23:16,880
Develop locally in VS Code.

1936
01:23:16,880 –> 01:23:18,960
Use co-pilot for code, not for boundaries,

1937
01:23:18,960 –> 01:23:22,880
enforce contracts in CI, deploy behind identity and APM,

1938
01:23:22,880 –> 01:23:24,560
publish as inner source assets.

1939
01:23:24,560 –> 01:23:26,800
And then, this is the part people hate.

1940
01:23:26,800 –> 01:23:28,320
Operate them like real services,

1941
01:23:28,320 –> 01:23:30,240
because MCP doesn’t remove responsibility.

1942
01:23:30,240 –> 01:23:31,680
It concentrates it.

1943
01:23:31,680 –> 01:23:33,280
Limitations and risks,

1944
01:23:33,280 –> 01:23:35,920
latency, overreach, and governance debt.

1945
01:23:35,920 –> 01:23:39,040
Now for the part people treat like a disclaimer slide at the end,

1946
01:23:39,040 –> 01:23:40,880
limitations, risks.

1947
01:23:40,880 –> 01:23:42,640
The stuff that decides whether MCP

1948
01:23:42,640 –> 01:23:45,840
becomes infrastructure or becomes another abandoned integration pattern

1949
01:23:45,840 –> 01:23:46,800
with a nice logo.

1950
01:23:46,800 –> 01:23:47,600
Start with latency,

1951
01:23:47,600 –> 01:23:50,480
because agent systems are latency amplifiers.

1952
01:23:50,480 –> 01:23:53,120
MCP doesn’t create latency out of thin air.

1953
01:23:53,120 –> 01:23:55,520
It exposes latency that was always there.

1954
01:23:55,520 –> 01:23:57,040
Out, network hops,

1955
01:23:57,040 –> 01:23:58,320
backend variability,

1956
01:23:58,320 –> 01:24:00,160
throttling, cold starts, and retries.

1957
01:24:00,160 –> 01:24:01,520
The difference is that an LLM

1958
01:24:01,520 –> 01:24:03,600
doesn’t experience latency like a human does.

1959
01:24:03,600 –> 01:24:04,960
A human waits, a model adapts,

1960
01:24:04,960 –> 01:24:06,320
it tries another tool, it retries,

1961
01:24:06,320 –> 01:24:07,920
it changes its plan mid-flight.

1962
01:24:07,920 –> 01:24:09,200
And if your host is naive,

1963
01:24:09,200 –> 01:24:10,560
it lets the loop keep spinning

1964
01:24:10,560 –> 01:24:12,160
because the model is working.

1965
01:24:12,160 –> 01:24:14,320
So latency isn’t just a UX problem,

1966
01:24:14,320 –> 01:24:16,400
it’s a behavior shaping input.

1967
01:24:16,400 –> 01:24:17,600
If you don’t design around that,

1968
01:24:17,600 –> 01:24:19,840
you train the system into conditional chaos.

1969
01:24:19,840 –> 01:24:20,960
Slow tool calls,

1970
01:24:20,960 –> 01:24:22,240
lead to more tool calls,

1971
01:24:22,240 –> 01:24:24,480
and more tool calls lead to more failures.

1972
01:24:24,480 –> 01:24:26,400
And the system becomes noisy and expensive

1973
01:24:26,400 –> 01:24:27,920
before it becomes useful.

1974
01:24:27,920 –> 01:24:29,520
That’s why you front load SLOs

1975
01:24:29,520 –> 01:24:31,200
and fail closed behavior earlier.

1976
01:24:31,200 –> 01:24:32,800
But here’s the deeper limitation.

1977
01:24:32,800 –> 01:24:35,760
MCP doesn’t solve long running work by itself.

1978
01:24:35,760 –> 01:24:37,760
MCP can carry state incessions,

1979
01:24:37,760 –> 01:24:38,720
and it can stream,

1980
01:24:38,720 –> 01:24:40,480
and frameworks can build on it.

1981
01:24:40,480 –> 01:24:42,800
But your backend reality still exists.

1982
01:24:42,800 –> 01:24:44,480
Some enterprise actions take minutes,

1983
01:24:44,480 –> 01:24:45,600
some take hours.

1984
01:24:45,600 –> 01:24:48,320
And the model’s default instinct is to keep the loop alive

1985
01:24:48,320 –> 01:24:50,640
until it gets a result that is not a safe default.

1986
01:24:50,640 –> 01:24:51,920
So for long running tasks,

1987
01:24:51,920 –> 01:24:53,280
you need explicit patterns.

1988
01:24:53,280 –> 01:24:55,120
Acing job submission, progress reporting,

1989
01:24:55,120 –> 01:24:56,240
and durable orchestration

1990
01:24:56,240 –> 01:24:58,560
that doesn’t depend on one chat session staying alive.

1991
01:24:58,560 –> 01:24:59,760
MCP can be part of that.

1992
01:24:59,760 –> 01:25:01,280
MCP is not the whole thing.

1993
01:25:01,280 –> 01:25:02,960
Next risk, overreach.

1994
01:25:02,960 –> 01:25:05,120
MCP makes it easy to expose tools.

1995
01:25:05,120 –> 01:25:06,720
That’s the problem.

1996
01:25:06,720 –> 01:25:09,520
When the cost of adding one more tool feels low,

1997
01:25:09,520 –> 01:25:12,160
teams will expose internal capability surfaces

1998
01:25:12,160 –> 01:25:13,680
that were never designed to be invoked

1999
01:25:13,680 –> 01:25:15,040
by a probabilistic planner.

2000
01:25:15,040 –> 01:25:17,840
Especially right tools, especially admin tools,

2001
01:25:17,840 –> 01:25:20,160
especially anything that touches permissions.

2002
01:25:20,160 –> 01:25:22,080
So the overreach failure mode looks like this.

2003
01:25:22,080 –> 01:25:25,920
A team starts with safe, read-oriented tools.

2004
01:25:25,920 –> 01:25:27,520
Then someone asks for convenience.

2005
01:25:27,520 –> 01:25:29,120
Can we also create tickets?

2006
01:25:29,120 –> 01:25:31,280
Can we also update list items?

2007
01:25:31,280 –> 01:25:33,200
Can we also post to teams?

2008
01:25:33,200 –> 01:25:34,960
Can we also invite guests?

2009
01:25:34,960 –> 01:25:36,880
And each one is reasonable.

2010
01:25:36,880 –> 01:25:40,320
Until you realize you’ve built an AI-driven control plane

2011
01:25:40,320 –> 01:25:42,320
with no consistent approval model

2012
01:25:42,320 –> 01:25:44,080
and no reliable attribution model.

2013
01:25:44,080 –> 01:25:45,280
MCP didn’t cause that.

2014
01:25:45,280 –> 01:25:46,560
MCP made it scalable.

2015
01:25:46,560 –> 01:25:48,400
So the architectural rule is simple.

2016
01:25:48,400 –> 01:25:50,160
Expose read tools broadly.

2017
01:25:50,160 –> 01:25:51,680
Expose write tools narrowly.

2018
01:25:51,680 –> 01:25:53,520
Expose permission tools almost never.

2019
01:25:53,520 –> 01:25:55,920
And when you do expose write tools,

2020
01:25:55,920 –> 01:25:57,920
force explicit confirmations in the host

2021
01:25:57,920 –> 01:25:59,280
and design idempotency.

2022
01:25:59,280 –> 01:26:01,120
So retries don’t duplicate damage.

2023
01:26:01,120 –> 01:26:03,280
Now the one everyone wants to believe is handled already.

2024
01:26:03,280 –> 01:26:04,000
Prompt injection.

2025
01:26:04,000 –> 01:26:06,160
MCP does not remove prompt injection risk.

2026
01:26:06,160 –> 01:26:07,280
It relocates it.

2027
01:26:07,280 –> 01:26:09,600
Instead of the model being tricked into outputting text,

2028
01:26:09,600 –> 01:26:10,320
it shouldn’t.

2029
01:26:10,320 –> 01:26:12,720
It gets tricked into selecting tools it shouldn’t

2030
01:26:12,720 –> 01:26:14,320
or passing parameters it shouldn’t

2031
01:26:14,320 –> 01:26:16,400
or fetching resources it shouldn’t.

2032
01:26:16,400 –> 01:26:18,720
The thread model shifts from what did the model say

2033
01:26:18,720 –> 01:26:20,240
to what did the model do.

2034
01:26:20,240 –> 01:26:22,800
So you design tool schemers to resist injection.

2035
01:26:22,800 –> 01:26:24,000
You validate inputs.

2036
01:26:24,000 –> 01:26:25,680
You constrain freeform fields

2037
01:26:25,680 –> 01:26:28,080
and you treat tool selection as a privileged operation

2038
01:26:28,080 –> 01:26:30,320
that can require approval or policy checks.

2039
01:26:30,320 –> 01:26:32,560
If you don’t, you will eventually run a tool call

2040
01:26:32,560 –> 01:26:34,480
that looked reasonable in the prompt

2041
01:26:34,480 –> 01:26:37,040
and you’ll still be accountable for what it did.

2042
01:26:37,040 –> 01:26:38,400
Now the enterprise class risks.

2043
01:26:38,400 –> 01:26:40,720
Data residency logging and auditability.

2044
01:26:40,720 –> 01:26:43,120
Remote MCP servers are the obvious trap here.

2045
01:26:43,120 –> 01:26:45,280
If your host forwards context to a remote server

2046
01:26:45,280 –> 01:26:47,760
you don’t control, you are exporting data.

2047
01:26:47,760 –> 01:26:49,760
Not hypothetically, literally.

2048
01:26:49,760 –> 01:26:52,480
And we didn’t mean to send sensitive data is not a control.

2049
01:26:52,480 –> 01:26:53,840
It’s a post-incident quote.

2050
01:26:53,840 –> 01:26:57,840
So you need explicit decisions about what context can leave the boundary

2051
01:26:57,840 –> 01:27:01,200
where your MCP servers run and what telemetry is retained.

2052
01:27:01,200 –> 01:27:04,480
In regulated environments that means data residency constraints

2053
01:27:04,480 –> 01:27:07,440
and retention policies for logs that contain tool parameters

2054
01:27:07,440 –> 01:27:10,080
document identifiers and possibly content excerpts.

2055
01:27:10,080 –> 01:27:11,600
Audit trails are not optional.

2056
01:27:11,600 –> 01:27:13,920
They’re the only reason enterprises will tolerate

2057
01:27:13,920 –> 01:27:15,440
agentex systems at scale.

2058
01:27:15,440 –> 01:27:17,440
If you can’t reconstruct a tool called chain

2059
01:27:17,440 –> 01:27:19,440
who invoked what tool, what parameters,

2060
01:27:19,440 –> 01:27:21,680
what downstream API, what result,

2061
01:27:21,680 –> 01:27:24,160
you have no defensible story when something goes wrong.

2062
01:27:24,160 –> 01:27:25,360
And yes, it will go wrong.

2063
01:27:25,360 –> 01:27:28,480
Finally, governance.dead.mcp centralizes tool invocation

2064
01:27:28,480 –> 01:27:29,440
that sounds like control.

2065
01:27:29,440 –> 01:27:31,040
It is also concentration of risk.

2066
01:27:31,040 –> 01:27:34,160
A small number of MCP servers will become critical infrastructure

2067
01:27:34,160 –> 01:27:35,200
inside the organization.

2068
01:27:35,200 –> 01:27:36,800
Everyone will depend on them.

2069
01:27:36,800 –> 01:27:39,200
And then those servers become the new shared service

2070
01:27:39,200 –> 01:27:41,600
that accumulates exceptions, special cases,

2071
01:27:41,600 –> 01:27:43,280
and temporary bypasses.

2072
01:27:43,280 –> 01:27:44,400
Entropy doesn’t disappear.

2073
01:27:44,400 –> 01:27:45,520
It moves to the choke point.

2074
01:27:45,520 –> 01:27:49,120
So treat MCP governance like you treat identity governance.

2075
01:27:49,120 –> 01:27:52,560
Ownership, life cycle, reviews, and deprecation discipline.

2076
01:27:52,560 –> 01:27:54,320
If a tool exists, someone owns it.

2077
01:27:54,320 –> 01:27:56,000
If no one owns it, it gets removed.

2078
01:27:56,000 –> 01:27:57,760
If it can’t be audited, it doesn’t ship.

2079
01:27:57,760 –> 01:27:59,920
If it can’t fail closed, it’s not production ready.

2080
01:27:59,920 –> 01:28:01,600
That’s the honest limitation section.

2081
01:28:01,600 –> 01:28:03,120
MCP doesn’t make AI safe.

2082
01:28:03,120 –> 01:28:05,920
It creates a place where safety can actually be enforced.

2083
01:28:05,920 –> 01:28:08,080
And that’s only useful if you enforce it.

2084
01:28:08,080 –> 01:28:11,360
MCP’s maturity curve, spec evolution, remote registries,

2085
01:28:11,360 –> 01:28:12,640
and agent discovery.

2086
01:28:12,640 –> 01:28:14,640
So now that the risks are on the table,

2087
01:28:14,640 –> 01:28:18,080
the next question is whether MCP is mature enough to bet on.

2088
01:28:18,080 –> 01:28:21,200
And the only honest answer is, it depends what you think you’re betting on.

2089
01:28:21,200 –> 01:28:23,840
But if you’re betting on a stable enterprise-grade ecosystem

2090
01:28:23,840 –> 01:28:27,200
of remote servers, you can plug into production tomorrow, you’re early.

2091
01:28:27,200 –> 01:28:29,200
If you’re betting on the core mechanics,

2092
01:28:29,200 –> 01:28:31,920
typed tool calls, declared capabilities,

2093
01:28:31,920 –> 01:28:34,640
and a host mediated boundary, then you’re not early.

2094
01:28:34,640 –> 01:28:36,160
You’re catching up to the inevitable.

2095
01:28:36,160 –> 01:28:38,000
That distinction matters.

2096
01:28:38,000 –> 01:28:41,760
Because MCP has two maturity curves running at the same time.

2097
01:28:41,760 –> 01:28:44,000
One curve is the protocol’s core primitives.

2098
01:28:44,000 –> 01:28:47,920
Tools, resources, prompts, life cycle, capability negotiation, transport.

2099
01:28:47,920 –> 01:28:49,360
Those are already useful today.

2100
01:28:49,360 –> 01:28:53,440
They are the part that collapses custom glue code into a contract surface.

2101
01:28:53,440 –> 01:28:55,600
The other curve is the ecosystem layer.

2102
01:28:55,600 –> 01:28:59,520
Discovery, registries, trust, and how agents decide what to connect to

2103
01:28:59,520 –> 01:29:01,200
without humans handwiring everything.

2104
01:29:01,200 –> 01:29:02,400
That’s where things are still moving.

2105
01:29:02,400 –> 01:29:05,280
So separate what exists from what’s emerging.

2106
01:29:05,280 –> 01:29:06,880
What’s real today is the boring part.

2107
01:29:06,880 –> 01:29:09,040
The protocol is JSON RPC-based.

2108
01:29:09,040 –> 01:29:12,240
Server’s advertised capabilities host, mediate the conversation

2109
01:29:12,240 –> 01:29:14,240
and decide what context moves to what server.

2110
01:29:14,240 –> 01:29:16,640
Transport exists for local and remote operation.

2111
01:29:16,640 –> 01:29:18,960
In architectural terms, MCP already provides

2112
01:29:18,960 –> 01:29:22,640
the minimum structure needed to turn tool use into a governable interface.

2113
01:29:22,640 –> 01:29:23,840
That is the foundation.

2114
01:29:23,840 –> 01:29:27,120
Now, what’s emerging is what turns MCP from integration standard

2115
01:29:27,120 –> 01:29:28,720
into integration marketplace.

2116
01:29:28,720 –> 01:29:30,640
Remote registries, agent discovery.

2117
01:29:30,640 –> 01:29:35,280
The ability for a host or agent to say, “I need a capability I don’t currently have.”

2118
01:29:35,280 –> 01:29:36,880
Go find me a server that provides it.

2119
01:29:36,880 –> 01:29:38,080
That sounds convenient.

2120
01:29:38,080 –> 01:29:41,120
It is also where trust collapses if you’re not careful.

2121
01:29:41,120 –> 01:29:44,560
Because discovery without governance is just automated supply chain risk.

2122
01:29:44,560 –> 01:29:47,280
If the model can discover servers on demand,

2123
01:29:47,280 –> 01:29:50,080
then the model can expand its tool surface on demand.

2124
01:29:50,080 –> 01:29:52,560
And if that tool surface expansion isn’t controlled by policy,

2125
01:29:52,560 –> 01:29:53,760
you didn’t build a boundary.

2126
01:29:53,760 –> 01:29:54,480
You built a hole.

2127
01:29:54,480 –> 01:29:56,880
So when people get excited about registries,

2128
01:29:56,880 –> 01:29:59,200
the correct mental model is not App Store.

2129
01:29:59,200 –> 01:30:00,720
It’s Package Manager.

2130
01:30:00,720 –> 01:30:04,240
And Package Managers have supply chain incidents for a living.

2131
01:30:04,240 –> 01:30:07,520
So what does a mature registry model need to become enterprise usable?

2132
01:30:07,520 –> 01:30:08,800
First, a trust story.

2133
01:30:08,800 –> 01:30:10,240
Not its open source.

2134
01:30:10,240 –> 01:30:11,280
A real trust story.

2135
01:30:11,280 –> 01:30:12,400
Who published the server?

2136
01:30:12,400 –> 01:30:13,280
Who maintains it?

2137
01:30:13,280 –> 01:30:14,720
What version is deployed?

2138
01:30:14,720 –> 01:30:17,040
What identity and authorization model does it use?

2139
01:30:17,040 –> 01:30:18,240
What data does it receive?

2140
01:30:18,240 –> 01:30:19,040
Where does it run?

2141
01:30:19,040 –> 01:30:20,160
What logs does it keep?

2142
01:30:20,160 –> 01:30:23,440
And in Microsoft Land, the trust story eventually collapses into Entra.

2143
01:30:23,440 –> 01:30:26,880
Because Entra is where identity becomes enforceable at scale.

2144
01:30:26,880 –> 01:30:28,880
If a registry can’t map servers

2145
01:30:28,880 –> 01:30:31,680
to tenant identity, policy, and ownership,

2146
01:30:31,680 –> 01:30:33,440
it’s not an enterprise registry.

2147
01:30:33,440 –> 01:30:35,520
It’s a directory of things you shouldn’t connect to.

2148
01:30:35,520 –> 01:30:36,800
Second, a governance story.

2149
01:30:36,800 –> 01:30:38,880
Even if discovery exists,

2150
01:30:38,880 –> 01:30:41,280
enterprises don’t allow install anything.

2151
01:30:41,280 –> 01:30:43,360
They allow install from the approved catalog.

2152
01:30:43,360 –> 01:30:45,920
That means you need approval workflows,

2153
01:30:45,920 –> 01:30:47,680
environment promotion, and policy gates

2154
01:30:47,680 –> 01:30:49,120
that sit outside the protocol.

2155
01:30:49,120 –> 01:30:50,800
MCP is the protocol.

2156
01:30:50,800 –> 01:30:52,080
The approval model is not.

2157
01:30:52,080 –> 01:30:53,120
So expect a split.

2158
01:30:53,120 –> 01:30:54,640
MCP standardizes the calls

2159
01:30:54,640 –> 01:30:57,600
and Microsoft governance tooling, Entra, APM, PerView,

2160
01:30:57,600 –> 01:31:00,400
whatever else will be used to control what gets connected.

2161
01:31:00,400 –> 01:31:02,560
Third, a maturity story for agent discovery itself,

2162
01:31:02,560 –> 01:31:04,880
because discovery isn’t just finding a server.

2163
01:31:04,880 –> 01:31:07,760
It’s deciding whether the server’s capabilities overlap

2164
01:31:07,760 –> 01:31:09,120
with what you already have,

2165
01:31:09,120 –> 01:31:10,640
whether the two names are ambiguous,

2166
01:31:10,640 –> 01:31:12,160
whether the schemas are safe,

2167
01:31:12,160 –> 01:31:14,000
and whether the outcomes are predictable.

2168
01:31:14,000 –> 01:31:15,360
Remember the earlier rule.

2169
01:31:15,360 –> 01:31:17,920
Overlapping tools create probabilistic behavior.

2170
01:31:17,920 –> 01:31:19,840
Discovery increases overlap by default,

2171
01:31:19,840 –> 01:31:22,480
so if you want agent-driven discovery in an enterprise,

2172
01:31:22,480 –> 01:31:25,200
the real work is not how do we find more tools.

2173
01:31:25,200 –> 01:31:27,440
It’s how do we prevent tool collisions?

2174
01:31:27,440 –> 01:31:29,920
That likely means standard naming taxonomies,

2175
01:31:29,920 –> 01:31:31,520
server certification, and tool-linting

2176
01:31:31,520 –> 01:31:33,920
that catches generic or overlapping capabilities

2177
01:31:33,920 –> 01:31:35,520
before they hit production.

2178
01:31:35,520 –> 01:31:38,240
In other words, MCP will grow into the same governance shape

2179
01:31:38,240 –> 01:31:39,440
as APIs did.

2180
01:31:39,440 –> 01:31:40,480
Registries will exist,

2181
01:31:40,480 –> 01:31:42,160
but enterprises will treat them

2182
01:31:42,160 –> 01:31:44,560
like internal marketplaces with procurement rules,

2183
01:31:44,560 –> 01:31:45,840
not like the open internet.

2184
01:31:45,840 –> 01:31:48,320
And if you’re listening to this as a Microsoft architect,

2185
01:31:48,320 –> 01:31:50,240
the practical decision rule is simple.

2186
01:31:50,240 –> 01:31:53,040
Build against the stable layer, contracts, and identity.

2187
01:31:53,040 –> 01:31:54,960
Treat the ecosystem layer as optional.

2188
01:31:54,960 –> 01:31:57,680
Use community servers for prototypes, demos, and learning,

2189
01:31:57,680 –> 01:32:00,400
but for real tenants, you run your own MCP servers,

2190
01:32:00,400 –> 01:32:02,880
or you consume vendor servers only when they come

2191
01:32:02,880 –> 01:32:04,720
with enterprise-grade identity, auditing,

2192
01:32:04,720 –> 01:32:06,400
and data-residency guarantees.

2193
01:32:06,400 –> 01:32:09,280
Because MCP’s maturity curve doesn’t reward optimism,

2194
01:32:09,280 –> 01:32:10,800
it rewards boundary discipline,

2195
01:32:10,800 –> 01:32:13,040
and if you anchor on contracts and identity today,

2196
01:32:13,040 –> 01:32:15,760
the registry and discovery world can evolve later

2197
01:32:15,760 –> 01:32:17,920
without forcing you to rewrite everything again.

2198
01:32:17,920 –> 01:32:20,320
That’s the only kind of future-proofing that works.

2199
01:32:20,320 –> 01:32:22,720
Looking ahead in Microsoft Land speculation,

2200
01:32:22,720 –> 01:32:25,760
Co-Pilot Studio, Power Platform, D365,

2201
01:32:25,760 –> 01:32:27,440
now the part that needs a warning label.

2202
01:32:27,440 –> 01:32:29,840
This is speculation, not because nobody has opinions,

2203
01:32:29,840 –> 01:32:31,600
but because Microsoft Product Direction

2204
01:32:31,600 –> 01:32:34,000
is a moving target and marketing names change faster

2205
01:32:34,000 –> 01:32:35,520
than your tenant policies.

2206
01:32:35,520 –> 01:32:37,440
So treat this as architectural trajectory,

2207
01:32:37,440 –> 01:32:40,000
not roadmap promises, start with the simplest observation.

2208
01:32:40,000 –> 01:32:42,400
Microsoft is already building an agent ecosystem,

2209
01:32:42,400 –> 01:32:44,400
whether you call it Co-Pilot, Co-Pilot Studio,

2210
01:32:44,400 –> 01:32:46,640
or whatever got renamed last quarter.

2211
01:32:46,640 –> 01:32:50,320
And the ecosystem problem is the same one MCP was created to solve.

2212
01:32:50,320 –> 01:32:53,040
How does an agent safely discover and use tools

2213
01:32:53,040 –> 01:32:55,680
across thousands of tenants and millions of workloads

2214
01:32:55,680 –> 01:32:58,720
without every integration becoming bespoke glue?

2215
01:32:58,720 –> 01:33:01,840
So if MCP keeps its momentum as an open protocol,

2216
01:33:01,840 –> 01:33:05,360
the most likely future is that it becomes a common integration surface

2217
01:33:05,360 –> 01:33:08,320
that sits underneath multiple Microsoft experiences,

2218
01:33:08,320 –> 01:33:10,960
not replacing proprietary extensibility overnight,

2219
01:33:10,960 –> 01:33:13,120
coexisting and quietly winning over time.

2220
01:33:13,120 –> 01:33:15,440
Co-Pilot Studio is the obvious pressure point.

2221
01:33:15,440 –> 01:33:18,000
Co-Pilot Studio lives in the world of connectors,

2222
01:33:18,000 –> 01:33:21,040
actions, plugins and custom agents.

2223
01:33:21,040 –> 01:33:24,000
That world is powerful, but it is also highly platform-shaped.

2224
01:33:24,000 –> 01:33:25,920
You build inside the Co-Pilot ecosystem,

2225
01:33:25,920 –> 01:33:27,200
you inherit its constraints,

2226
01:33:27,200 –> 01:33:29,040
and you accept that portability is limited.

2227
01:33:29,040 –> 01:33:31,600
MCP in contrast is portable by design.

2228
01:33:31,600 –> 01:33:33,280
So the architectural question is not,

2229
01:33:33,280 –> 01:33:35,360
will Co-Pilot Studio support MCP?

2230
01:33:35,360 –> 01:33:38,320
It’s, will enterprises standardize their internal tool surface

2231
01:33:38,320 –> 01:33:41,280
on MCP so that Co-Pilot Studio becomes just one client,

2232
01:33:41,280 –> 01:33:44,480
because that’s the move that changes the power dynamic.

2233
01:33:44,480 –> 01:33:46,800
If the organization exposes SharePoint access,

2234
01:33:46,800 –> 01:33:48,960
ticketing operations, inventory systems,

2235
01:33:48,960 –> 01:33:51,280
and approvals through a governed MCP server layer,

2236
01:33:51,280 –> 01:33:53,760
then Co-Pilot Studio becomes a user experience layer,

2237
01:33:53,760 –> 01:33:55,520
a good one, probably, but not the only one.

2238
01:33:55,520 –> 01:33:57,760
And then you can swap clients without rebuilding the boundary.

2239
01:33:57,760 –> 01:34:00,480
That’s the end of custom glue in Microsoft terms.

2240
01:34:00,480 –> 01:34:03,040
Now, power platform, power platform is where this gets uncomfortable

2241
01:34:03,040 –> 01:34:06,720
because low-code and governance have a long, hostile history together.

2242
01:34:06,720 –> 01:34:08,320
Low-code ones make it work.

2243
01:34:08,320 –> 01:34:10,480
Governance once proves it’s allowed.

2244
01:34:10,480 –> 01:34:14,000
So if MCP enters power platform, it won’t be as a developer toy.

2245
01:34:14,000 –> 01:34:15,600
It will be as an enforcement surface.

2246
01:34:15,600 –> 01:34:19,440
Because the moment citizen developers can build agents that call tools,

2247
01:34:19,440 –> 01:34:23,280
the organization needs deterministic boundaries, identity, policy,

2248
01:34:23,280 –> 01:34:25,120
logging, throttling, and change control,

2249
01:34:25,120 –> 01:34:27,440
power platform is excellent at scaling creation.

2250
01:34:27,440 –> 01:34:29,440
It is not excellent at scaling restraint

2251
01:34:29,440 –> 01:34:31,680
unless you enforce restraint by design.

2252
01:34:31,680 –> 01:34:34,480
MCP provides a language for tool invocation

2253
01:34:34,480 –> 01:34:37,120
that could let power platform consume enterprise tools

2254
01:34:37,120 –> 01:34:39,280
without building yet another connector format

2255
01:34:39,280 –> 01:34:42,480
and without forcing the model to guess API shapes.

2256
01:34:42,480 –> 01:34:45,120
But the real value would be the governance alignment.

2257
01:34:45,120 –> 01:34:48,320
The tools become centrally defined, centrally audited,

2258
01:34:48,320 –> 01:34:49,440
and centrally versioned.

2259
01:34:49,440 –> 01:34:52,320
That’s the only way low-code agents don’t become shadow IT

2260
01:34:52,320 –> 01:34:53,680
with better UX.

2261
01:34:53,680 –> 01:34:58,320
Now Dynamics 365.d365 is the place where the agents can act story

2262
01:34:58,320 –> 01:34:59,840
becomes politically real.

2263
01:34:59,840 –> 01:35:03,200
Because D365 is money, leads, quotes, invoices,

2264
01:35:03,200 –> 01:35:04,960
customer records, support cases.

2265
01:35:04,960 –> 01:35:07,440
This is where a bad tool call is not an inconvenience.

2266
01:35:07,440 –> 01:35:08,400
It’s a business event.

2267
01:35:08,400 –> 01:35:11,840
And D365 also has the most obvious permission complexity

2268
01:35:11,840 –> 01:35:14,000
because it’s full of role-based security models

2269
01:35:14,000 –> 01:35:15,920
that were built for humans, clicking forms,

2270
01:35:15,920 –> 01:35:19,040
not for probabilistic systems, issuing multi-step actions.

2271
01:35:19,040 –> 01:35:22,160
So if MCP becomes the tool boundary for D365 actions,

2272
01:35:22,160 –> 01:35:24,400
the identity model matters even more.

2273
01:35:24,400 –> 01:35:26,880
OBS becomes non-negotiable for user-driven actions

2274
01:35:26,880 –> 01:35:28,480
because you need downstream enforcement

2275
01:35:28,480 –> 01:35:29,840
that maps to a user.

2276
01:35:29,840 –> 01:35:32,480
Managed identity becomes acceptable for controlled automation

2277
01:35:32,480 –> 01:35:34,640
but it has to be narrow and heavily audited.

2278
01:35:34,640 –> 01:35:36,720
APM becomes the expected wrapper

2279
01:35:36,720 –> 01:35:39,120
because D365 oriented tool traffic

2280
01:35:39,120 –> 01:35:40,640
will be bursty and expensive

2281
01:35:40,640 –> 01:35:43,120
and cost-control becomes a first-class requirement.

2282
01:35:43,120 –> 01:35:45,680
The likely Microsoft direction if it happens

2283
01:35:45,680 –> 01:35:48,000
is that MCP becomes one of the standardized ways

2284
01:35:48,000 –> 01:35:50,880
to expose actions and context across business systems

2285
01:35:50,880 –> 01:35:52,880
while Entra becomes the standardized way

2286
01:35:52,880 –> 01:35:54,720
to issue authority for those actions.

2287
01:35:54,720 –> 01:35:57,200
Which is the same pattern Microsoft always ships.

2288
01:35:57,200 –> 01:35:58,960
The protocol stabilizes the ecosystem.

2289
01:35:58,960 –> 01:36:00,560
Identity stabilizes the risk.

2290
01:36:00,560 –> 01:36:02,160
Everything else is product-packaging.

2291
01:36:02,160 –> 01:36:04,240
So if you’re trying to interpret what this means

2292
01:36:04,240 –> 01:36:06,000
over the next couple of years,

2293
01:36:06,000 –> 01:36:08,000
here’s the simplest prediction you can actually use.

2294
01:36:08,000 –> 01:36:10,640
MCP adoption in Microsoft Land will follow the path

2295
01:36:10,640 –> 01:36:12,400
of every successful standard.

2296
01:36:12,400 –> 01:36:15,120
First it shows up in developer tools and side projects

2297
01:36:15,120 –> 01:36:17,120
because that’s where friction is loudest.

2298
01:36:17,120 –> 01:36:20,160
Then it shows up in platform products as a compatibility layer.

2299
01:36:20,160 –> 01:36:22,320
Then it becomes the thing you assume exists

2300
01:36:22,320 –> 01:36:24,560
and everyone forgets why it was controversial.

2301
01:36:24,560 –> 01:36:27,200
But only if enterprises do the hard part.

2302
01:36:27,200 –> 01:36:28,800
They build the tool boundary once,

2303
01:36:28,800 –> 01:36:29,760
with discipline,

2304
01:36:29,760 –> 01:36:32,400
and they refuse to let convenience erase intent.

2305
01:36:32,400 –> 01:36:34,560
Because Microsoft will happily give you 100 ways

2306
01:36:34,560 –> 01:36:36,800
to integrate the platform always does.

2307
01:36:36,800 –> 01:36:39,360
Your job is to choose one boundary model

2308
01:36:39,360 –> 01:36:41,840
and enforce it until entropy gives up.

2309
01:36:41,840 –> 01:36:44,560
The MCP as AI infrastructure,

2310
01:36:44,560 –> 01:36:46,400
the control plane for tool use.

2311
01:36:46,400 –> 01:36:48,320
If you step back from all the mechanics,

2312
01:36:48,320 –> 01:36:51,120
JSON, RPC, schemas, transports, and droplets,

2313
01:36:51,120 –> 01:36:52,720
the real pattern shows up.

2314
01:36:52,720 –> 01:36:55,520
MCP is not AI tooling, it’s infrastructure.

2315
01:36:55,520 –> 01:36:58,160
More specifically, it’s the control plane for tool use.

2316
01:36:58,160 –> 01:37:00,240
And that phrase matters because it reframes

2317
01:37:00,240 –> 01:37:01,440
what you’re actually building.

2318
01:37:01,440 –> 01:37:03,360
You are not building a smarter assistant.

2319
01:37:03,360 –> 01:37:05,120
You are building a system that decides

2320
01:37:05,120 –> 01:37:06,560
what actions are even possible

2321
01:37:06,560 –> 01:37:08,880
under what authority with what observability

2322
01:37:08,880 –> 01:37:10,160
and with what failure behavior.

2323
01:37:10,160 –> 01:37:12,720
The model is the data plane, it generates proposals.

2324
01:37:12,720 –> 01:37:15,920
It makes plans, it produces structured tool calls.

2325
01:37:15,920 –> 01:37:17,760
But it doesn’t own the permission boundary,

2326
01:37:17,760 –> 01:37:19,040
it can’t, it’s probabilistic.

2327
01:37:19,040 –> 01:37:21,600
It will optimize for completion unless you constrain it.

2328
01:37:21,600 –> 01:37:23,760
So the host plus the MCP server layer

2329
01:37:23,760 –> 01:37:25,280
becomes the control plane.

2330
01:37:25,280 –> 01:37:27,200
The place where your intent gets compiled

2331
01:37:27,200 –> 01:37:28,640
into enforceable capability.

2332
01:37:28,640 –> 01:37:30,320
That’s why this whole thing feels inevitable.

2333
01:37:30,320 –> 01:37:33,120
Enterprises already know how to run control planes.

2334
01:37:33,120 –> 01:37:35,760
They just weren’t running one for LLM tool use yet.

2335
01:37:35,760 –> 01:37:37,680
Now connect that to familiar constructs.

2336
01:37:37,680 –> 01:37:40,400
People keep comparing MCP to an API gateway

2337
01:37:40,400 –> 01:37:43,360
and that comparison is useful as long as you don’t oversimplify it.

2338
01:37:43,360 –> 01:37:45,440
API gateways sit in front of backends

2339
01:37:45,440 –> 01:37:47,600
and enforce things like authentication,

2340
01:37:47,600 –> 01:37:49,200
rate limiting and transformation.

2341
01:37:49,200 –> 01:37:50,000
APIM does that.

2342
01:37:50,000 –> 01:37:51,760
We already covered why it matters.

2343
01:37:51,760 –> 01:37:54,160
But MCP adds a model oriented contract surface

2344
01:37:54,160 –> 01:37:54,960
on top of that.

2345
01:37:54,960 –> 01:37:57,040
Tools and resources aren’t just endpoints.

2346
01:37:57,040 –> 01:37:59,760
They are capabilities shaped for a reasoning loop.

2347
01:37:59,760 –> 01:38:02,480
They come with descriptions that influence selection,

2348
01:38:02,480 –> 01:38:04,400
schemas that constrain behavior

2349
01:38:04,400 –> 01:38:05,840
and output shapes that allow

2350
01:38:05,840 –> 01:38:08,320
deterministic downstream processing and auditing.

2351
01:38:08,320 –> 01:38:09,840
So MCP isn’t your gateway.

2352
01:38:09,840 –> 01:38:11,680
It’s the layer that makes your APIs

2353
01:38:11,680 –> 01:38:13,440
legible to a probabilistic caller

2354
01:38:13,440 –> 01:38:15,680
without letting that caller touch the raw edges.

2355
01:38:15,680 –> 01:38:17,600
Then there’s the service mesh comparison.

2356
01:38:17,600 –> 01:38:19,680
Service meshes exist because microservices

2357
01:38:19,680 –> 01:38:22,080
created too many sideways dependencies.

2358
01:38:22,080 –> 01:38:24,160
Identity drift, inconsistent retries,

2359
01:38:24,160 –> 01:38:26,880
inconsistent telemetry, inconsistent policy.

2360
01:38:26,880 –> 01:38:30,240
So the mesh moved those concerns into shared infrastructure.

2361
01:38:30,240 –> 01:38:33,360
MTLS retries, circuit breakers, observability.

2362
01:38:33,360 –> 01:38:35,760
MCP is the same move but for tool calls.

2363
01:38:35,760 –> 01:38:38,000
Tool calls are just service calls

2364
01:38:38,000 –> 01:38:39,440
with a different failure mode.

2365
01:38:39,440 –> 01:38:42,240
The caller isn’t a human or a deterministic client.

2366
01:38:42,240 –> 01:38:44,080
The caller is a reasoning engine

2367
01:38:44,080 –> 01:38:46,240
that can generate unexpected sequences

2368
01:38:46,240 –> 01:38:48,080
and amplify its own mistakes.

2369
01:38:48,080 –> 01:38:49,760
So you need the mesh-like controls

2370
01:38:49,760 –> 01:38:51,920
but oriented around tool invocation,

2371
01:38:51,920 –> 01:38:53,920
identity binding, throttling, logging,

2372
01:38:53,920 –> 01:38:56,320
input validation and explicit failure semantics.

2373
01:38:56,320 –> 01:38:58,400
And then there’s the event-driven platform analogy

2374
01:38:58,400 –> 01:39:00,960
because not everything should be a synchronous tool call.

2375
01:39:00,960 –> 01:39:04,000
A lot of enterprise work is inherently asynchronous.

2376
01:39:04,000 –> 01:39:06,880
Start an export, kick off a compliance scan,

2377
01:39:06,880 –> 01:39:09,440
provision an environment, runner workflow,

2378
01:39:09,440 –> 01:39:10,880
wait for approval.

2379
01:39:10,880 –> 01:39:13,040
If you force those into synchronous tool calls

2380
01:39:13,040 –> 01:39:15,520
you end up with timeouts, retries, duplicate actions

2381
01:39:15,520 –> 01:39:17,600
and an agent loop that keeps poking the system

2382
01:39:17,600 –> 01:39:18,800
until something breaks.

2383
01:39:18,800 –> 01:39:20,560
So the mature pattern is,

2384
01:39:20,560 –> 01:39:22,960
MCP handles the invocation contract

2385
01:39:22,960 –> 01:39:26,080
but long-running actions become asynchronous jobs behind it.

2386
01:39:26,080 –> 01:39:28,560
Tool calls submit work, return a job ID,

2387
01:39:28,560 –> 01:39:30,160
stream progress if appropriate

2388
01:39:30,160 –> 01:39:32,160
and require the host to handle completion

2389
01:39:32,160 –> 01:39:33,520
without assuming the chat session

2390
01:39:33,520 –> 01:39:35,120
is a durable workflow engine.

2391
01:39:35,120 –> 01:39:38,160
That’s where MCP integrates with actual cloud architecture

2392
01:39:38,160 –> 01:39:40,320
instead of pretending chat is a scheduler.

2393
01:39:40,320 –> 01:39:43,440
Now the hard truth, MCP doesn’t make probabilistic systems safe.

2394
01:39:43,440 –> 01:39:44,800
It makes them governable.

2395
01:39:44,800 –> 01:39:47,360
Governable means you can enforce your assumptions at scale.

2396
01:39:47,360 –> 01:39:48,880
Identity is explicit.

2397
01:39:48,880 –> 01:39:51,040
Enter issues authority and you select the flow

2398
01:39:51,040 –> 01:39:52,400
that matches the scenario.

2399
01:39:52,400 –> 01:39:54,720
OBO, for user-delegated action,

2400
01:39:54,720 –> 01:39:56,880
manage identity for operational tasks,

2401
01:39:56,880 –> 01:39:58,720
service principles and APRM

2402
01:39:58,720 –> 01:40:01,360
for controlled multi-client exposure.

2403
01:40:01,360 –> 01:40:02,480
Contracts are explicit.

2404
01:40:02,480 –> 01:40:04,480
Tools are named, scoped and schematized

2405
01:40:04,480 –> 01:40:07,040
ambiguity gets removed before it hits the model.

2406
01:40:07,040 –> 01:40:08,160
Failure is explicit.

2407
01:40:08,160 –> 01:40:09,360
You decide fail-closed.

2408
01:40:09,360 –> 01:40:10,400
You decide timeouts.

2409
01:40:10,400 –> 01:40:11,760
You decide which tools can write.

2410
01:40:11,760 –> 01:40:13,440
You decide what requires approval

2411
01:40:13,440 –> 01:40:15,520
and observability is explicit.

2412
01:40:15,520 –> 01:40:16,720
You can build an audit trail

2413
01:40:16,720 –> 01:40:19,280
that reconstructs what happened without relying on

2414
01:40:19,280 –> 01:40:20,880
the model said it did X.

2415
01:40:20,880 –> 01:40:22,560
That’s what infrastructure actually does.

2416
01:40:22,560 –> 01:40:23,920
It doesn’t eliminate mistakes.

2417
01:40:23,920 –> 01:40:25,600
It makes mistakes containable.

2418
01:40:25,600 –> 01:40:26,720
So when someone asks,

2419
01:40:26,720 –> 01:40:29,040
is MCP just another integration trend?

2420
01:40:29,040 –> 01:40:30,240
The answer is simple.

2421
01:40:30,240 –> 01:40:31,040
No.

2422
01:40:31,040 –> 01:40:34,800
MCP is how enterprises stop letting probabilistic systems

2423
01:40:34,800 –> 01:40:36,880
talk directly to deterministic systems

2424
01:40:36,880 –> 01:40:39,120
without an enforcement layer in between.

2425
01:40:39,120 –> 01:40:40,640
It’s the control plane for tool use.

2426
01:40:40,640 –> 01:40:42,800
And in Microsoft Land, that’s not a niche feature.

2427
01:40:42,800 –> 01:40:45,520
That’s how the platform survives the next decade of agents

2428
01:40:45,520 –> 01:40:47,840
without turning into conditional chaos.

2429
01:40:47,840 –> 01:40:48,880
Conclusion.

2430
01:40:48,880 –> 01:40:50,640
Protocols don’t make things easy.

2431
01:40:50,640 –> 01:40:52,240
They make them governable.

2432
01:40:52,240 –> 01:40:55,280
Most organizations want MCP to be a productivity feature.

2433
01:40:55,280 –> 01:40:57,200
A faster way to bold tools onto a model.

2434
01:40:57,200 –> 01:40:58,880
That’s the comfortable interpretation

2435
01:40:58,880 –> 01:41:00,960
because it keeps the story in developer land.

2436
01:41:00,960 –> 01:41:03,600
Better ergonomics, less glue code, more shipping.

2437
01:41:03,600 –> 01:41:05,360
But that’s not what makes MCP matter.

2438
01:41:05,360 –> 01:41:08,160
MCP matters because it gives you a place to stop the model.

2439
01:41:08,160 –> 01:41:10,320
A place to say you can reason all day,

2440
01:41:10,320 –> 01:41:13,120
but you can’t act unless the boundary allows it.

2441
01:41:13,120 –> 01:41:14,800
And that boundary can be made explicit.

2442
01:41:14,800 –> 01:41:17,760
Contracts, identity, policy, logging, throttling,

2443
01:41:17,760 –> 01:41:19,120
failure semantics.

2444
01:41:19,120 –> 01:41:20,560
That distinction matters.

2445
01:41:20,560 –> 01:41:22,320
Because in enterprise environments,

2446
01:41:22,320 –> 01:41:24,640
the hard problem is not can the model do this.

2447
01:41:24,640 –> 01:41:28,320
The hard problem is can the organization survive it doing this every day

2448
01:41:28,320 –> 01:41:30,000
across every tenant, under-ordered,

2449
01:41:30,000 –> 01:41:32,080
under-incident pressure, under-drift?

2450
01:41:32,080 –> 01:41:34,640
Most integrations fail the same way over time.

2451
01:41:34,640 –> 01:41:37,200
They start clean, then the first exception gets added,

2452
01:41:37,200 –> 01:41:39,280
then the second, then the workaround becomes permanent.

2453
01:41:39,280 –> 01:41:41,600
Then the logs get ignored because they’re noisy.

2454
01:41:41,600 –> 01:41:44,480
Then nobody knows which identity is actually doing the work.

2455
01:41:44,480 –> 01:41:46,240
Then the system becomes probabilistic,

2456
01:41:46,240 –> 01:41:47,840
not because the model is probabilistic,

2457
01:41:47,840 –> 01:41:50,400
but because the boundary was never enforced as infrastructure.

2458
01:41:50,400 –> 01:41:52,080
MCP is the attempt to reverse that,

2459
01:41:52,080 –> 01:41:54,560
not by making models safer through wishful thinking,

2460
01:41:54,560 –> 01:41:57,200
by making tool use governable through structure.

2461
01:41:57,200 –> 01:41:59,120
So the key takeaway is one sentence,

2462
01:41:59,120 –> 01:42:00,560
and it’s not inspirational.

2463
01:42:00,560 –> 01:42:02,880
MCP is a security boundary first.

2464
01:42:02,880 –> 01:42:05,360
Developer ergonomics are the side effect.

2465
01:42:05,360 –> 01:42:07,600
If you’re building this in Microsoft Land,

2466
01:42:07,600 –> 01:42:10,640
you already have the ingredients most ecosystems don’t.

2467
01:42:10,640 –> 01:42:14,000
Entra gives you identity that can actually bind authority.

2468
01:42:14,000 –> 01:42:17,200
OBO, when the user owns the action, manage identity,

2469
01:42:17,200 –> 01:42:19,280
when the workload owns the action,

2470
01:42:19,280 –> 01:42:20,880
service principles and APM,

2471
01:42:20,880 –> 01:42:24,880
when you need an enforcement edge that can meter and throttle reality,

2472
01:42:24,880 –> 01:42:28,000
Azure gives you a place to host the boundary as a real service,

2473
01:42:28,000 –> 01:42:29,360
not a developer toy,

2474
01:42:29,360 –> 01:42:32,560
and the governance stack, logging, auditing, policy,

2475
01:42:32,560 –> 01:42:35,040
data residency controls already exists.

2476
01:42:35,040 –> 01:42:36,880
But you still have to make the uncomfortable choice.

2477
01:42:36,880 –> 01:42:38,560
You’re not adopting MCP.

2478
01:42:38,560 –> 01:42:41,360
You’re defining where authority stops in your architecture.

2479
01:42:41,360 –> 01:42:43,520
So here’s the decision checklist that actually matters,

2480
01:42:43,520 –> 01:42:44,400
and it’s short.

2481
01:42:44,400 –> 01:42:46,320
Who owns identity for each tool call?

2482
01:42:46,320 –> 01:42:48,800
The user, the workload, or the platform?

2483
01:42:48,800 –> 01:42:50,640
Where is authority enforced?

2484
01:42:50,640 –> 01:42:54,960
In entroscopes, in APM policies, in the server, in the host, or nowhere,

2485
01:42:54,960 –> 01:42:56,720
what fails closed when things get weird,

2486
01:42:56,720 –> 01:42:59,760
and what is observable enough that you can reconstruct a tool chain

2487
01:42:59,760 –> 01:43:01,360
without trusting the model’s story.

2488
01:43:01,360 –> 01:43:04,000
If you can answer those, MCP becomes infrastructure.

2489
01:43:04,000 –> 01:43:06,720
If you can’t, MCP becomes another integration pattern

2490
01:43:06,720 –> 01:43:07,760
that scales your chaos.

2491
01:43:07,760 –> 01:43:10,960
If you want to see this implemented the way enterprises actually need it,

2492
01:43:10,960 –> 01:43:13,840
go watch the next episode on building the Entra OBO flow

2493
01:43:13,840 –> 01:43:16,720
and putting APM in front of your MCP server.

2494
01:43:16,720 –> 01:43:19,920
So your agent tools become a governed surface you can defend.





Source link

0 Votes: 0 Upvotes, 0 Downvotes (0 Points)

Leave a reply

Follow
Search
Loading

Signing-in 3 seconds...

Signing-up 3 seconds...

Discover more from 365 Community Online

Subscribe now to keep reading and get access to the full archive.

Continue reading