evalstate HF Staff commited on
Commit
e2176ee
Β·
verified Β·
1 Parent(s): 8a1d3e9

Upload 37 files

Browse files
.gitattributes CHANGED
@@ -60,3 +60,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
60
  2026/mcp-connect/images/2026-02-04-client-dataset.png filter=lfs diff=lfs merge=lfs -text
61
  2026/mcp-connect/images/intro-spaces.webm filter=lfs diff=lfs merge=lfs -text
62
  2026/mcp-connect/images/xcom-logo-black.png filter=lfs diff=lfs merge=lfs -text
 
 
60
  2026/mcp-connect/images/2026-02-04-client-dataset.png filter=lfs diff=lfs merge=lfs -text
61
  2026/mcp-connect/images/intro-spaces.webm filter=lfs diff=lfs merge=lfs -text
62
  2026/mcp-connect/images/xcom-logo-black.png filter=lfs diff=lfs merge=lfs -text
63
+ 2026/mcp-connect/images/2026-02-05-mcpremote1.png filter=lfs diff=lfs merge=lfs -text
2026/mcp-connect/animations/http-dual-cluster.html ADDED
@@ -0,0 +1,643 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <style>
6
+ * { margin: 0; padding: 0; box-sizing: border-box; }
7
+ body {
8
+ background: #fafafa;
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ width: 100vw;
13
+ height: 100vh;
14
+ overflow: hidden;
15
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
16
+ padding: 0;
17
+ }
18
+
19
+ .canvas-root {
20
+ display: inline-flex;
21
+ flex-direction: column;
22
+ align-items: center;
23
+ justify-content: center;
24
+ padding: 20px 10px;
25
+ }
26
+
27
+ .diagram {
28
+ position: relative;
29
+ width: 1000px;
30
+ height: 280px;
31
+ }
32
+
33
+ .entity {
34
+ position: absolute;
35
+ display: flex;
36
+ flex-direction: column;
37
+ align-items: center;
38
+ gap: 6px;
39
+ }
40
+
41
+ /* User */
42
+ .user { left: 0; top: 90px; }
43
+ .user .entity-box {
44
+ width: 80px;
45
+ height: 60px;
46
+ border-radius: 30px;
47
+ background: #f3e5f5;
48
+ border: 3px solid #7b1fa2;
49
+ color: #7b1fa2;
50
+ display: flex;
51
+ align-items: center;
52
+ justify-content: center;
53
+ font-weight: 600;
54
+ font-size: 13px;
55
+ transition: all 0.4s ease;
56
+ }
57
+ .user .entity-box.active {
58
+ background: #e1bee7;
59
+ box-shadow: 0 4px 15px rgba(123, 31, 162, 0.3);
60
+ }
61
+
62
+ /* Load Balancers */
63
+ .lb { top: 95px; }
64
+ .lb-1 { left: 130px; }
65
+ .lb-2 { left: 560px; }
66
+ .lb .entity-box {
67
+ width: 50px;
68
+ height: 50px;
69
+ background: linear-gradient(180deg, #fafafa 0%, #e0e0e0 100%);
70
+ border: 2px solid #9e9e9e;
71
+ border-radius: 6px;
72
+ display: flex;
73
+ align-items: center;
74
+ justify-content: center;
75
+ color: #616161;
76
+ font-weight: 600;
77
+ font-size: 11px;
78
+ }
79
+
80
+ /* Cluster bounding boxes */
81
+ .cluster {
82
+ position: absolute;
83
+ border-radius: 16px;
84
+ top: 0;
85
+ height: 280px;
86
+ }
87
+
88
+ .client-cluster {
89
+ left: 200px;
90
+ width: 340px;
91
+ border: 3px solid #1976d2;
92
+ background: rgba(227, 242, 253, 0.3);
93
+ }
94
+
95
+ .server-cluster {
96
+ left: 640px;
97
+ width: 360px;
98
+ border: 3px solid #ef6c00;
99
+ background: rgba(255, 243, 224, 0.3);
100
+ }
101
+
102
+ .cluster-label {
103
+ position: absolute;
104
+ top: -12px;
105
+ left: 16px;
106
+ background: #fafafa;
107
+ padding: 2px 12px;
108
+ font-size: 13px;
109
+ font-weight: 600;
110
+ white-space: nowrap;
111
+ }
112
+
113
+ .client-cluster .cluster-label { color: #1976d2; }
114
+ .server-cluster .cluster-label { color: #ef6c00; }
115
+
116
+ /* Client nodes */
117
+ .client {
118
+ flex-direction: row;
119
+ align-items: center;
120
+ gap: 8px;
121
+ left: 220px;
122
+ }
123
+ .client-1 { top: 15px; }
124
+ .client-2 { top: 110px; }
125
+ .client-3 { top: 205px; }
126
+
127
+ .client .entity-box {
128
+ width: 80px;
129
+ height: 45px;
130
+ border-radius: 10px;
131
+ background: #f5f5f5;
132
+ border: 2px solid #90caf9;
133
+ color: #64b5f6;
134
+ display: flex;
135
+ align-items: center;
136
+ justify-content: center;
137
+ font-weight: 600;
138
+ font-size: 11px;
139
+ transition: all 0.4s ease;
140
+ }
141
+
142
+ .client .entity-box.alive {
143
+ background: #e3f2fd;
144
+ border-color: #1976d2;
145
+ color: #1976d2;
146
+ }
147
+
148
+ .client .entity-box.active {
149
+ background: #bbdefb;
150
+ border-color: #1976d2;
151
+ color: #1976d2;
152
+ box-shadow: 0 3px 15px rgba(25, 118, 210, 0.3);
153
+ }
154
+
155
+ .client .entity-box.error {
156
+ background: #ffebee;
157
+ border-color: #c62828;
158
+ color: #c62828;
159
+ animation: shake 0.4s ease;
160
+ }
161
+
162
+ /* Server nodes */
163
+ .server {
164
+ flex-direction: row;
165
+ align-items: center;
166
+ gap: 8px;
167
+ left: 660px;
168
+ }
169
+ .server-1 { top: 15px; }
170
+ .server-2 { top: 110px; }
171
+ .server-3 { top: 205px; }
172
+
173
+ .server .entity-box {
174
+ width: 80px;
175
+ height: 45px;
176
+ border-radius: 10px;
177
+ background: #f5f5f5;
178
+ border: 2px solid #ffcc80;
179
+ color: #ffa726;
180
+ display: flex;
181
+ align-items: center;
182
+ justify-content: center;
183
+ font-weight: 600;
184
+ font-size: 11px;
185
+ transition: all 0.4s ease;
186
+ }
187
+
188
+ .server .entity-box.alive {
189
+ background: #fff3e0;
190
+ border-color: #ef6c00;
191
+ color: #ef6c00;
192
+ }
193
+
194
+ .server .entity-box.active {
195
+ background: #ffe0b2;
196
+ border-color: #ef6c00;
197
+ color: #ef6c00;
198
+ box-shadow: 0 3px 15px rgba(239, 108, 0, 0.3);
199
+ }
200
+
201
+ .server .entity-box.error {
202
+ background: #ffebee;
203
+ border-color: #c62828;
204
+ color: #c62828;
205
+ animation: shake 0.4s ease;
206
+ }
207
+
208
+ @keyframes shake {
209
+ 0%, 100% { transform: translateX(0); }
210
+ 25% { transform: translateX(-4px); }
211
+ 75% { transform: translateX(4px); }
212
+ }
213
+
214
+ /* State badges */
215
+ .state-badge {
216
+ display: flex;
217
+ flex-direction: column;
218
+ gap: 2px;
219
+ padding: 5px 8px;
220
+ border-radius: 6px;
221
+ font-size: 8px;
222
+ opacity: 0;
223
+ transition: all 0.3s ease;
224
+ min-width: 95px;
225
+ }
226
+
227
+ .state-badge.visible { opacity: 1; }
228
+
229
+ .client .state-badge {
230
+ background: #e3f2fd;
231
+ border: 1px solid #90caf9;
232
+ color: #1565c0;
233
+ }
234
+ .client .state-badge.empty {
235
+ background: #f5f5f5;
236
+ border-color: #e0e0e0;
237
+ color: #9e9e9e;
238
+ }
239
+ .client .state-badge.error {
240
+ background: #ffebee;
241
+ border-color: #ef9a9a;
242
+ color: #c62828;
243
+ }
244
+
245
+ .server .state-badge {
246
+ background: #fff3e0;
247
+ border: 1px solid #ffcc80;
248
+ color: #e65100;
249
+ }
250
+ .server .state-badge.empty {
251
+ background: #f5f5f5;
252
+ border-color: #e0e0e0;
253
+ color: #9e9e9e;
254
+ }
255
+ .server .state-badge.error {
256
+ background: #ffebee;
257
+ border-color: #ef9a9a;
258
+ color: #c62828;
259
+ }
260
+
261
+ .state-badge .badge-row {
262
+ display: flex;
263
+ align-items: center;
264
+ gap: 4px;
265
+ }
266
+
267
+ .state-badge .badge-label {
268
+ font-weight: 500;
269
+ text-transform: uppercase;
270
+ letter-spacing: 0.3px;
271
+ font-size: 7px;
272
+ color: #888;
273
+ }
274
+
275
+ .state-badge .badge-value {
276
+ font-family: 'SF Mono', Monaco, monospace;
277
+ font-size: 8px;
278
+ }
279
+
280
+ /* Connection lines */
281
+ .connection {
282
+ position: absolute;
283
+ height: 2px;
284
+ background: #ccc;
285
+ top: 120px;
286
+ }
287
+ .conn-user-lb1 { left: 85px; width: 45px; }
288
+ .conn-lb1-clients { left: 185px; width: 15px; }
289
+ .conn-clients-lb2 { left: 540px; width: 20px; }
290
+ .conn-lb2-servers { left: 615px; width: 25px; }
291
+
292
+ /* Moving message */
293
+ .message {
294
+ position: absolute;
295
+ display: flex;
296
+ flex-direction: column;
297
+ align-items: center;
298
+ gap: 2px;
299
+ opacity: 0;
300
+ pointer-events: none;
301
+ z-index: 100;
302
+ transform: translateX(-50%);
303
+ }
304
+
305
+ .message.visible { opacity: 1; }
306
+
307
+ .message-header {
308
+ display: flex;
309
+ align-items: center;
310
+ gap: 4px;
311
+ }
312
+
313
+ .message-arrow {
314
+ font-size: 18px;
315
+ font-weight: bold;
316
+ }
317
+
318
+ .message-type {
319
+ padding: 3px 8px;
320
+ border-radius: 5px;
321
+ font-size: 9px;
322
+ font-weight: 600;
323
+ white-space: nowrap;
324
+ box-shadow: 0 2px 8px rgba(0,0,0,0.12);
325
+ }
326
+
327
+ .message-session {
328
+ padding: 2px 6px;
329
+ border-radius: 3px;
330
+ font-size: 7px;
331
+ font-family: 'SF Mono', Monaco, monospace;
332
+ }
333
+
334
+ .message.user-request .message-arrow { color: #7b1fa2; }
335
+ .message.user-request .message-type { background: #7b1fa2; color: white; }
336
+ .message.user-request .message-session { background: #f3e5f5; color: #7b1fa2; border: 1px solid #ce93d8; }
337
+
338
+ .message.client-request .message-arrow { color: #1976d2; }
339
+ .message.client-request .message-type { background: #1976d2; color: white; }
340
+ .message.client-request .message-session { background: #e3f2fd; color: #1565c0; border: 1px solid #90caf9; }
341
+
342
+ .message.server-response .message-arrow { color: #ef6c00; }
343
+ .message.server-response .message-type { background: #ef6c00; color: white; }
344
+ .message.server-response .message-session { background: #fff3e0; color: #e65100; border: 1px solid #ffcc80; }
345
+
346
+ .message.client-response .message-arrow { color: #1976d2; }
347
+ .message.client-response .message-type { background: #1976d2; color: white; }
348
+ .message.client-response .message-session { background: #e3f2fd; color: #1565c0; border: 1px solid #90caf9; }
349
+
350
+ .message.error-response .message-arrow { color: #c62828; }
351
+ .message.error-response .message-type { background: #c62828; color: white; }
352
+ .message.error-response .message-session { background: #ffebee; color: #c62828; border: 1px solid #ef9a9a; }
353
+
354
+ /* Narration */
355
+ .narration {
356
+ margin-top: 20px;
357
+ padding: 12px 20px;
358
+ background: white;
359
+ border: 2px solid #e0e0e0;
360
+ border-radius: 10px;
361
+ font-size: 13px;
362
+ color: #333;
363
+ max-width: 800px;
364
+ text-align: center;
365
+ min-height: 48px;
366
+ display: flex;
367
+ align-items: center;
368
+ justify-content: center;
369
+ }
370
+
371
+ .narration .step-num {
372
+ display: inline-block;
373
+ width: 24px;
374
+ height: 24px;
375
+ background: #9e9e9e;
376
+ color: white;
377
+ border-radius: 50%;
378
+ font-size: 12px;
379
+ font-weight: 600;
380
+ line-height: 24px;
381
+ text-align: center;
382
+ margin-right: 10px;
383
+ flex-shrink: 0;
384
+ }
385
+
386
+ .narration.user-state .step-num { background: #7b1fa2; }
387
+ .narration.client-state .step-num { background: #1976d2; }
388
+ .narration.server-state .step-num { background: #ef6c00; }
389
+ .narration.error-state .step-num { background: #c62828; }
390
+ .narration.error-state { border-color: #ef9a9a; background: #fff8f8; }
391
+ .narration.success-state .step-num { background: #4caf50; }
392
+ </style>
393
+ </head>
394
+ <body>
395
+ <div class="canvas-root">
396
+ <div class="diagram">
397
+ <!-- User -->
398
+ <div class="entity user">
399
+ <div class="entity-box" id="user-box">User</div>
400
+ </div>
401
+
402
+ <!-- LB 1 -->
403
+ <div class="entity lb lb-1">
404
+ <div class="entity-box">LB</div>
405
+ </div>
406
+
407
+ <!-- Client Cluster -->
408
+ <div class="cluster client-cluster">
409
+ <div class="cluster-label">MCP Clients</div>
410
+ </div>
411
+
412
+ <!-- Client Nodes -->
413
+ <div class="entity client client-1">
414
+ <div class="entity-box" id="client-1-box">Client 1</div>
415
+ <div class="state-badge visible empty" id="client-1-state">
416
+ <div class="badge-row"><span class="badge-label">user:</span><span class="badge-value" id="client-1-user">β€”</span></div>
417
+ <div class="badge-row"><span class="badge-label">server:</span><span class="badge-value" id="client-1-server">β€”</span></div>
418
+ </div>
419
+ </div>
420
+ <div class="entity client client-2">
421
+ <div class="entity-box" id="client-2-box">Client 2</div>
422
+ <div class="state-badge visible empty" id="client-2-state">
423
+ <div class="badge-row"><span class="badge-label">user:</span><span class="badge-value">β€”</span></div>
424
+ <div class="badge-row"><span class="badge-label">server:</span><span class="badge-value">β€”</span></div>
425
+ </div>
426
+ </div>
427
+ <div class="entity client client-3">
428
+ <div class="entity-box" id="client-3-box">Client 3</div>
429
+ <div class="state-badge visible empty" id="client-3-state">
430
+ <div class="badge-row"><span class="badge-label">user:</span><span class="badge-value" id="client-3-user">β€”</span></div>
431
+ <div class="badge-row"><span class="badge-label">server:</span><span class="badge-value" id="client-3-server">β€”</span></div>
432
+ </div>
433
+ </div>
434
+
435
+ <!-- LB 2 -->
436
+ <div class="entity lb lb-2">
437
+ <div class="entity-box">LB</div>
438
+ </div>
439
+
440
+ <!-- Server Cluster -->
441
+ <div class="cluster server-cluster">
442
+ <div class="cluster-label">MCP Servers</div>
443
+ </div>
444
+
445
+ <!-- Server Nodes -->
446
+ <div class="entity server server-1">
447
+ <div class="entity-box" id="server-1-box">Server 1</div>
448
+ <div class="state-badge visible empty" id="server-1-state">
449
+ <div class="badge-row"><span class="badge-label">session:</span><span class="badge-value" id="server-1-session">β€”</span></div>
450
+ <div class="badge-row"><span class="badge-label">caps:</span><span class="badge-value" id="server-1-caps">β€”</span></div>
451
+ </div>
452
+ </div>
453
+ <div class="entity server server-2">
454
+ <div class="entity-box" id="server-2-box">Server 2</div>
455
+ <div class="state-badge visible empty" id="server-2-state">
456
+ <div class="badge-row"><span class="badge-label">session:</span><span class="badge-value">β€”</span></div>
457
+ <div class="badge-row"><span class="badge-label">caps:</span><span class="badge-value">β€”</span></div>
458
+ </div>
459
+ </div>
460
+ <div class="entity server server-3">
461
+ <div class="entity-box" id="server-3-box">Server 3</div>
462
+ <div class="state-badge visible empty" id="server-3-state">
463
+ <div class="badge-row"><span class="badge-label">session:</span><span class="badge-value" id="server-3-session">β€”</span></div>
464
+ <div class="badge-row"><span class="badge-label">caps:</span><span class="badge-value" id="server-3-caps">β€”</span></div>
465
+ </div>
466
+ </div>
467
+
468
+ <!-- Connections -->
469
+ <div class="connection conn-user-lb1"></div>
470
+ <div class="connection conn-lb1-clients"></div>
471
+ <div class="connection conn-clients-lb2"></div>
472
+ <div class="connection conn-lb2-servers"></div>
473
+
474
+ <!-- Message -->
475
+ <div class="message" id="message">
476
+ <div class="message-header">
477
+ <span class="message-type" id="message-type">request</span>
478
+ <span class="message-arrow" id="message-arrow">β†’</span>
479
+ </div>
480
+ <div class="message-session" id="message-session">session_123</div>
481
+ </div>
482
+ </div>
483
+
484
+ <div class="narration" id="narration">
485
+ <span class="step-num" id="step-num">β—‹</span>
486
+ <span id="narration-text">Dual-cluster deployment...</span>
487
+ </div>
488
+
489
+ </div>
490
+
491
+ <script src="shared/canvas-scale.js"></script>
492
+ <script>
493
+ const message = document.getElementById('message');
494
+ const messageType = document.getElementById('message-type');
495
+ const messageArrow = document.getElementById('message-arrow');
496
+ const messageSession = document.getElementById('message-session');
497
+ const narration = document.getElementById('narration');
498
+ const narrationText = document.getElementById('narration-text');
499
+ const stepNum = document.getElementById('step-num');
500
+
501
+ const userBox = document.getElementById('user-box');
502
+ const client1Box = document.getElementById('client-1-box');
503
+ const client2Box = document.getElementById('client-2-box');
504
+ const client3Box = document.getElementById('client-3-box');
505
+ const server1Box = document.getElementById('server-1-box');
506
+ const server2Box = document.getElementById('server-2-box');
507
+ const server3Box = document.getElementById('server-3-box');
508
+
509
+ const client1State = document.getElementById('client-1-state');
510
+ const client1User = document.getElementById('client-1-user');
511
+ const client1Server = document.getElementById('client-1-server');
512
+ const client3State = document.getElementById('client-3-state');
513
+ const client3User = document.getElementById('client-3-user');
514
+
515
+ const server1State = document.getElementById('server-1-state');
516
+ const server1Session = document.getElementById('server-1-session');
517
+ const server1Caps = document.getElementById('server-1-caps');
518
+ const server3State = document.getElementById('server-3-state');
519
+ const server3Session = document.getElementById('server-3-session');
520
+
521
+ // Positions
522
+ const pos = {
523
+ user: 40,
524
+ lb1: 155,
525
+ client1: 260, client2: 260, client3: 260,
526
+ lb2: 585,
527
+ server1: 700, server2: 700, server3: 700
528
+ };
529
+ const yUser = 105;
530
+ const yRow1 = 25, yRow2 = 120, yRow3 = 215;
531
+
532
+ function setPos(x, y) {
533
+ message.style.left = x + 'px';
534
+ message.style.top = y + 'px';
535
+ }
536
+
537
+ function animate(fromX, fromY, toX, toY, dur, cb) {
538
+ const start = performance.now();
539
+ function step(now) {
540
+ const p = Math.min((now - start) / dur, 1);
541
+ const e = 1 - Math.pow(1 - p, 3);
542
+ setPos(fromX + (toX - fromX) * e, fromY + (toY - fromY) * e);
543
+ if (p < 1) requestAnimationFrame(step);
544
+ else if (cb) cb();
545
+ }
546
+ requestAnimationFrame(step);
547
+ }
548
+
549
+ function path(pts, durs, cb) {
550
+ let i = 0;
551
+ function next() {
552
+ if (i < pts.length - 1) {
553
+ animate(pts[i].x, pts[i].y, pts[i+1].x, pts[i+1].y, durs[i], () => { i++; next(); });
554
+ } else if (cb) cb();
555
+ }
556
+ next();
557
+ }
558
+
559
+ function config(type, arrow, label, session, dir) {
560
+ message.className = `message ${type} visible`;
561
+ messageType.textContent = label;
562
+ messageArrow.textContent = arrow;
563
+ messageSession.textContent = session;
564
+ messageSession.style.display = session ? 'block' : 'none';
565
+ message.querySelector('.message-header').style.flexDirection = dir === 'left' ? 'row-reverse' : 'row';
566
+ }
567
+
568
+ function reset() {
569
+ message.className = 'message';
570
+ userBox.classList.remove('active');
571
+ [client1Box, client2Box, client3Box].forEach(b => b.className = 'entity-box');
572
+ [server1Box, server2Box, server3Box].forEach(b => b.className = 'entity-box');
573
+ client1State.className = 'state-badge visible empty';
574
+ client1User.textContent = 'β€”';
575
+ client1Server.textContent = 'β€”';
576
+ client3State.className = 'state-badge visible empty';
577
+ client3User.textContent = 'β€”';
578
+ server1State.className = 'state-badge visible empty';
579
+ server1Session.textContent = 'β€”';
580
+ server1Caps.textContent = 'β€”';
581
+ server3State.className = 'state-badge visible empty';
582
+ server3Session.textContent = 'β€”';
583
+ }
584
+
585
+ const steps = [
586
+ // 0: Initial
587
+ { setup: () => { reset(); stepNum.textContent = 'β—‹'; narrationText.textContent = 'User connects to MCP Client pool, which connects to MCP Server pool...'; narration.className = 'narration'; },
588
+ run: (done) => setTimeout(done, 2500), after: () => {} },
589
+
590
+ // 1: User β†’ LB1 β†’ Client1
591
+ { setup: () => { config('user-request', 'β†’', 'connect', 'user_xyz', 'right'); setPos(pos.user, yUser); stepNum.textContent = '1'; narrationText.textContent = 'User connects to Client 1'; narration.className = 'narration user-state'; userBox.classList.add('active'); },
592
+ run: (done) => path([{x:pos.user,y:yUser},{x:pos.lb1,y:yUser},{x:pos.client1,y:yRow1}], [200,250], done),
593
+ after: () => { userBox.classList.remove('active'); client1Box.classList.add('alive','active'); } },
594
+
595
+ // 2: Client1 β†’ LB2 β†’ Server1 (init)
596
+ { setup: () => { config('client-request', 'β†’', 'initialize', '', 'right'); setPos(pos.client1, yRow1); stepNum.textContent = '2'; narrationText.textContent = 'Client 1 initializes session with Server 1'; narration.className = 'narration client-state'; },
597
+ run: (done) => path([{x:pos.client1,y:yRow1},{x:pos.lb2,y:yUser},{x:pos.server1,y:yRow1}], [300,250], done),
598
+ after: () => { client1Box.classList.remove('active'); server1Box.classList.add('alive','active'); } },
599
+
600
+ // 3: Server1 β†’ Client1 (session)
601
+ { setup: () => { config('server-response', '←', 'initialize', 'srv_sess_42', 'left'); setPos(pos.server1, yRow1); stepNum.textContent = '3'; narrationText.textContent = 'Server 1 returns InitializeResult + Mcp-Session-Id'; narration.className = 'narration server-state';
602
+ server1State.className = 'state-badge visible'; server1Session.textContent = 'srv_sess_42'; server1Caps.textContent = 'sampling βœ“'; },
603
+ run: (done) => path([{x:pos.server1,y:yRow1},{x:pos.lb2,y:yUser},{x:pos.client1,y:yRow1}], [250,300], done),
604
+ after: () => { server1Box.classList.remove('active'); client1Box.classList.add('active');
605
+ client1State.className = 'state-badge visible'; client1User.textContent = 'user_xyz'; client1Server.textContent = 'srv_sess_42'; } },
606
+
607
+ // 4: Client1 β†’ Server1 (initialized)
608
+ { setup: () => { config('client-request', 'β†’', 'initialized', 'srv_sess_42', 'right'); setPos(pos.client1, yRow1); stepNum.textContent = '4'; narrationText.textContent = 'Client 1 sends initialized notification'; narration.className = 'narration client-state'; },
609
+ run: (done) => path([{x:pos.client1,y:yRow1},{x:pos.lb2,y:yUser},{x:pos.server1,y:yRow1}], [250,250], done),
610
+ after: () => { client1Box.classList.remove('active'); server1Box.classList.add('active'); } },
611
+
612
+ // 5: Client1 β†’ User (ready)
613
+ { setup: () => { config('client-response', '←', 'ready', 'user_xyz', 'left'); setPos(pos.client1, yRow1); stepNum.textContent = '5'; narrationText.textContent = 'Client 1 ready β€” has User session + Server session'; narration.className = 'narration client-state'; },
614
+ run: (done) => path([{x:pos.client1,y:yRow1},{x:pos.lb1,y:yUser},{x:pos.user,y:yUser}], [250,200], done),
615
+ after: () => { server1Box.classList.remove('active'); } },
616
+
617
+ // 6: User β†’ LB1 β†’ Client3 (WRONG!)
618
+ { setup: () => { config('user-request', 'β†’', 'tools/call', 'user_xyz', 'right'); setPos(pos.user, yUser); stepNum.textContent = '6'; narrationText.textContent = 'User sends request... LB routes to Client 3!'; narration.className = 'narration user-state'; userBox.classList.add('active'); },
619
+ run: (done) => path([{x:pos.user,y:yUser},{x:pos.lb1,y:yUser},{x:pos.client3,y:yRow3}], [200,300], done),
620
+ after: () => { userBox.classList.remove('active'); client3Box.classList.add('alive'); } },
621
+
622
+ // 7: Client3 error - no user session
623
+ { setup: () => { config('error-response', '←', '404 Not Found', 'user_xyz ?', 'left'); setPos(pos.client3, yRow3); stepNum.textContent = 'βœ—'; narrationText.textContent = 'Client 3 has no session for user_xyz β€” fails at first hop!'; narration.className = 'narration error-state';
624
+ client3Box.classList.add('error'); client3State.className = 'state-badge visible error'; client3User.textContent = 'user_xyz ?'; },
625
+ run: (done) => path([{x:pos.client3,y:yRow3},{x:pos.lb1,y:yUser},{x:pos.user,y:yUser}], [300,200], done),
626
+ after: () => {} },
627
+
628
+ // 7: Summary
629
+ { setup: () => { message.className = 'message'; stepNum.textContent = '!'; narrationText.textContent = 'State required at BOTH tiers β€” two LBs, two routing problems'; narration.className = 'narration error-state'; },
630
+ run: (done) => setTimeout(done, 4000), after: () => reset() }
631
+ ];
632
+
633
+ let cur = 0;
634
+ function run() {
635
+ const s = steps[cur];
636
+ s.setup();
637
+ setTimeout(() => s.run(() => { s.after(); cur = (cur + 1) % steps.length; setTimeout(run, cur === 0 ? 1500 : 900); }), 350);
638
+ }
639
+ setTimeout(run, 500);
640
+ scaleCanvas();
641
+ </script>
642
+ </body>
643
+ </html>
2026/mcp-connect/animations/mcp-mrtr-flow.html CHANGED
@@ -150,32 +150,32 @@
150
 
151
  <div class="flow-msg server-msg" data-delay="2500">
152
  <div class="msg-content">
153
- <div class="msg-type">elicitation/create</div>
154
- <div class="msg-detail">server waits for client reply</div>
155
  </div>
156
  <div class="arrow">←</div>
157
  </div>
158
 
159
  <div class="flow-msg client-msg" data-delay="5000">
160
  <div class="msg-content">
161
- <div class="msg-type">elicitation/response</div>
162
- <div class="msg-detail">client must retain request id</div>
163
  </div>
164
  <div class="arrow">β†’</div>
165
  </div>
166
 
167
  <div class="flow-msg server-msg" data-delay="7500">
168
  <div class="msg-content">
169
- <div class="msg-type">sampling/createMessage</div>
170
- <div class="msg-detail">server keeps call context</div>
171
  </div>
172
  <div class="arrow">←</div>
173
  </div>
174
 
175
  <div class="flow-msg client-msg" data-delay="10000">
176
  <div class="msg-content">
177
- <div class="msg-type">sampling/response</div>
178
- <div class="msg-detail">client responds on new request</div>
179
  </div>
180
  <div class="arrow">β†’</div>
181
  </div>
 
150
 
151
  <div class="flow-msg server-msg" data-delay="2500">
152
  <div class="msg-content">
153
+ <div class="msg-type">dependent_requests</div>
154
+ <div class="msg-detail">elicitation/create needed</div>
155
  </div>
156
  <div class="arrow">←</div>
157
  </div>
158
 
159
  <div class="flow-msg client-msg" data-delay="5000">
160
  <div class="msg-content">
161
+ <div class="msg-type">Retry tools/call</div>
162
+ <div class="msg-detail">includes dependent_responses</div>
163
  </div>
164
  <div class="arrow">β†’</div>
165
  </div>
166
 
167
  <div class="flow-msg server-msg" data-delay="7500">
168
  <div class="msg-content">
169
+ <div class="msg-type">dependent_requests</div>
170
+ <div class="msg-detail">sampling/createMessage needed</div>
171
  </div>
172
  <div class="arrow">←</div>
173
  </div>
174
 
175
  <div class="flow-msg client-msg" data-delay="10000">
176
  <div class="msg-content">
177
+ <div class="msg-type">Retry tools/call</div>
178
+ <div class="msg-detail">adds sampling response</div>
179
  </div>
180
  <div class="arrow">β†’</div>
181
  </div>
2026/mcp-connect/images/2026-02-03-mcpremote1.png CHANGED

Git LFS Details

  • SHA256: ec92c2f68888e74aab259fe2983ec263fc1bb6f13502578569a137dfb39a0678
  • Pointer size: 131 Bytes
  • Size of remote file: 955 kB

Git LFS Details

  • SHA256: 289abea62fa753ba7ad02016c4933de7e16149b1c3709c17b660e1895c3e7db2
  • Pointer size: 131 Bytes
  • Size of remote file: 951 kB
2026/mcp-connect/images/2026-02-05-mcpremote1.png ADDED

Git LFS Details

  • SHA256: 289abea62fa753ba7ad02016c4933de7e16149b1c3709c17b660e1895c3e7db2
  • Pointer size: 131 Bytes
  • Size of remote file: 951 kB
2026/mcp-connect/images/help-circle.svg ADDED