4
4
< meta charset ="UTF-8 " />
5
5
< meta name ="viewport " content ="width=device-width, initial-scale=1.0 " />
6
6
< title > MCP Gateway Admin</ title >
7
+ <!-- Favicon -->
8
+ < link
9
+ rel ="icon "
10
+ type ="image/png "
11
+ sizes ="32x32 "
12
+ href ="{{ root_path }}/static/favicon.ico "
13
+ />
7
14
< link
8
15
href ="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.2.19/tailwind.min.css "
9
16
rel ="stylesheet "
25
32
26
33
< body class ="bg-gray-100 ">
27
34
< div class ="w-full max-w-screen-2xl mx-auto px-4 py-8 ">
28
- < header class ="mb-8 ">
29
- < h1 class ="text-3xl font-bold text-gray-800 ">
30
- MCP Context Forge - Gateway Administration
31
- </ h1 >
32
- < p class ="text-gray-600 ">
33
- Manage tools, resources, prompts, servers, and federated gateways
34
- </ p >
35
- </ header >
35
+ < header class ="mb-8 ">
36
+ < h1 class ="text-3xl font-bold text-gray-800 ">
37
+ MCP Context Forge – Gateway Administration
38
+ </ h1 >
39
+
40
+ < p class ="text-gray-600 ">
41
+ Manage tools, resources, prompts, servers, and federated gateways
42
+ (remote MCP servers)
43
+ < span class ="mx-2 text-gray-400 "> |</ span >
44
+ < a
45
+ href ="https://ibm.github.io/mcp-context-forge/ "
46
+ target ="_blank "
47
+ class ="text-indigo-600 hover:underline "
48
+ > Docs</ a
49
+ >
50
+ < span class ="mx-2 text-gray-400 "> |</ span >
51
+ < a
52
+ href ="https://github.com/IBM/mcp-context-forge "
53
+ target ="_blank "
54
+ class ="text-indigo-600 hover:underline "
55
+ > ⭐ Star mcp-context-forge on GitHub</ a
56
+ >
57
+ </ p >
58
+ </ header >
59
+
60
+
36
61
37
62
<!-- Tabs -->
38
63
< div class ="mb-8 ">
@@ -43,35 +68,35 @@ <h1 class="text-3xl font-bold text-gray-800">
43
68
id ="tab-catalog "
44
69
class ="tab-link border-indigo-500 text-indigo-600 whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm "
45
70
>
46
- Servers Catalog
71
+ Virtual Servers Catalog
47
72
</ a >
48
73
< a
49
74
href ="#tools "
50
75
id ="tab-tools "
51
76
class ="tab-link border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm "
52
77
>
53
- Tools
78
+ Global Tools
54
79
</ a >
55
80
< a
56
81
href ="#resources "
57
82
id ="tab-resources "
58
83
class ="tab-link border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm "
59
84
>
60
- Resources
85
+ Global Resources
61
86
</ a >
62
87
< a
63
88
href ="#prompts "
64
89
id ="tab-prompts "
65
90
class ="tab-link border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm "
66
91
>
67
- Prompts
92
+ Global Prompts
68
93
</ a >
69
94
< a
70
95
href ="#gateways "
71
96
id ="tab-gateways "
72
97
class ="tab-link border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm "
73
98
>
74
- Gateways
99
+ Gateways/MCP Servers
75
100
</ a >
76
101
< a
77
102
href ="#roots "
@@ -87,6 +112,14 @@ <h1 class="text-3xl font-bold text-gray-800">
87
112
>
88
113
Metrics
89
114
</ a >
115
+ <!-- New Version tab (opens separate /version page) -->
116
+ < a
117
+ href ="{{ root_path }}/version "
118
+ target ="_blank "
119
+ class ="border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm "
120
+ >
121
+ Version
122
+ </ a >
90
123
</ nav >
91
124
</ div >
92
125
</ div >
@@ -95,6 +128,8 @@ <h1 class="text-3xl font-bold text-gray-800">
95
128
< div id ="catalog-panel " class ="tab-panel ">
96
129
< div class ="flex justify-between items-center mb-4 ">
97
130
< h2 class ="text-2xl font-bold "> MCP Servers Catalog</ h2 >
131
+ < p class ="text-sm text-gray-600 mt-1 "> Virtual Servers let you combine Tools, Resources, and Prompts from the global Tools catalog into a reusable configuration.</ p >
132
+
98
133
< div class ="flex items-center ">
99
134
< input
100
135
type ="checkbox "
@@ -356,6 +391,7 @@ <h3 class="text-lg font-bold mb-4">Add New Server</h3>
356
391
< div id ="tools-panel " class ="tab-panel hidden ">
357
392
< div class ="flex justify-between items-center mb-4 ">
358
393
< h2 class ="text-2xl font-bold "> Registered Tools</ h2 >
394
+ < p class ="text-sm text-gray-600 mt-1 "> This is the global catalog of Tools available. Create a Virtual Server using one of these tools.</ p >
359
395
< div class ="flex items-center ">
360
396
< input
361
397
type ="checkbox "
@@ -737,6 +773,7 @@ <h3 class="text-lg font-bold mb-4">Add New Tool</h3>
737
773
< div id ="resources-panel " class ="tab-panel hidden ">
738
774
< div class ="flex justify-between items-center mb-4 ">
739
775
< h2 class ="text-2xl font-bold "> Available Resources</ h2 >
776
+ < p class ="text-sm text-gray-600 mt-1 "> Resources are reusable data assets—like text, code, or media—that Tools and Prompts can reference by URI.</ p >
740
777
< div class ="flex items-center ">
741
778
< input
742
779
type ="checkbox "
@@ -967,6 +1004,7 @@ <h3 class="text-lg font-bold mb-4">Add New Resource</h3>
967
1004
< div id ="prompts-panel " class ="tab-panel hidden ">
968
1005
< div class ="flex justify-between items-center mb-4 ">
969
1006
< h2 class ="text-2xl font-bold "> Available Prompts</ h2 >
1007
+ < p class ="text-sm text-gray-600 mt-1 "> Prompts define reusable message templates with parameters, useful for driving LLM interactions or Tool input.</ p >
970
1008
< div class ="flex items-center ">
971
1009
< input
972
1010
type ="checkbox "
@@ -1173,7 +1211,8 @@ <h3 class="text-lg font-bold mb-4">Add New Prompt</h3>
1173
1211
<!-- Gateways Panel -->
1174
1212
< div id ="gateways-panel " class ="tab-panel hidden ">
1175
1213
< div class ="flex justify-between items-center mb-4 ">
1176
- < h2 class ="text-2xl font-bold "> Federated Gateways</ h2 >
1214
+ < h2 class ="text-2xl font-bold "> Federated Gateways (MCP)</ h2 >
1215
+ < p class ="text-sm text-gray-600 mt-1 "> Gateways are where you register external MCP servers to federate their tools/resources/prompts into your environment.</ p >
1177
1216
< div class ="flex items-center ">
1178
1217
< input
1179
1218
type ="checkbox "
@@ -1440,45 +1479,59 @@ <h3 class="text-lg font-bold mb-4">Add New Gateway</h3>
1440
1479
1441
1480
<!-- Roots Panel -->
1442
1481
< div id ="roots-panel " class ="tab-panel hidden ">
1482
+ <!-- List of roots ------------------------------------------------------->
1443
1483
< div class ="bg-white shadow rounded-lg p-6 mb-8 ">
1444
- < h2 class ="text-2xl font-bold mb-4 "> Root Directories</ h2 >
1484
+ <!-- Consistent header -->
1485
+ < div class ="flex justify-between items-center mb-4 ">
1486
+ < h2 class ="text-2xl font-bold "> Root Directories</ h2 >
1487
+ < div class ="flex items-center ">
1488
+ < input
1489
+ type ="checkbox "
1490
+ id ="show-inactive-roots "
1491
+ class ="mr-2 "
1492
+ onchange ="toggleInactiveItems('roots') "
1493
+ />
1494
+ < label
1495
+ for ="show-inactive-roots "
1496
+ class ="text-sm font-medium text-gray-700 "
1497
+ >
1498
+ Show Inactive
1499
+ </ label >
1500
+ </ div >
1501
+ </ div >
1502
+
1503
+ <!-- Description -->
1504
+ < p class ="text-sm text-gray-600 mb-4 ">
1505
+ Roots define the base folders accessible for file-based Resources.
1506
+ They enable MCP servers to browse local content.
1507
+ </ p >
1508
+
1509
+ <!-- Roots table -->
1445
1510
< div class ="overflow-x-auto ">
1446
1511
< table class ="min-w-full divide-y divide-gray-200 ">
1447
1512
< thead class ="bg-gray-50 ">
1448
1513
< tr >
1449
- < th
1450
- class ="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider "
1451
- >
1514
+ < th class ="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider ">
1452
1515
ID
1453
1516
</ th >
1454
- < th
1455
- class ="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider "
1456
- >
1517
+ < th class ="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider ">
1457
1518
URI
1458
1519
</ th >
1459
- < th
1460
- class ="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider "
1461
- >
1520
+ < th class ="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider ">
1462
1521
Name
1463
1522
</ th >
1464
- < th
1465
- class ="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider "
1466
- >
1523
+ < th class ="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider ">
1467
1524
Actions
1468
1525
</ th >
1469
1526
</ tr >
1470
1527
</ thead >
1471
1528
< tbody class ="bg-white divide-y divide-gray-200 ">
1472
1529
{% for root in roots %}
1473
1530
< tr >
1474
- < td
1475
- class ="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900 "
1476
- >
1531
+ < td class ="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900 ">
1477
1532
{{ root.id }}
1478
1533
</ td >
1479
- < td
1480
- class ="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900 "
1481
- >
1534
+ < td class ="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900 ">
1482
1535
{{ root.uri }}
1483
1536
</ td >
1484
1537
< td class ="px-6 py-4 whitespace-nowrap text-sm text-gray-500 ">
@@ -1491,10 +1544,7 @@ <h2 class="text-2xl font-bold mb-4">Root Directories</h2>
1491
1544
class ="inline "
1492
1545
onsubmit ="return confirm('Are you sure you want to delete this root?'); "
1493
1546
>
1494
- < button
1495
- type ="submit "
1496
- class ="text-red-600 hover:text-red-900 "
1497
- >
1547
+ < button type ="submit " class ="text-red-600 hover:text-red-900 ">
1498
1548
Delete
1499
1549
</ button >
1500
1550
</ form >
@@ -1506,14 +1556,13 @@ <h2 class="text-2xl font-bold mb-4">Root Directories</h2>
1506
1556
</ div >
1507
1557
</ div >
1508
1558
1559
+ <!-- Add new root -------------------------------------------------------->
1509
1560
< div class ="bg-white shadow rounded-lg p-6 ">
1510
1561
< h3 class ="text-lg font-bold mb-4 "> Add New Root</ h3 >
1511
1562
< form method ="POST " action ="{{ root_path }}/admin/roots " id ="add-root-form ">
1512
1563
< div class ="grid grid-cols-1 gap-6 ">
1513
1564
< div >
1514
- < label class ="block text-sm font-medium text-gray-700 "
1515
- > URI</ label
1516
- >
1565
+ < label class ="block text-sm font-medium text-gray-700 "> URI</ label >
1517
1566
< input
1518
1567
type ="text "
1519
1568
name ="uri "
@@ -1523,9 +1572,7 @@ <h3 class="text-lg font-bold mb-4">Add New Root</h3>
1523
1572
/>
1524
1573
</ div >
1525
1574
< div >
1526
- < label class ="block text-sm font-medium text-gray-700 "
1527
- > Name</ label
1528
- >
1575
+ < label class ="block text-sm font-medium text-gray-700 "> Name</ label >
1529
1576
< input
1530
1577
type ="text "
1531
1578
name ="name "
@@ -1545,12 +1592,14 @@ <h3 class="text-lg font-bold mb-4">Add New Root</h3>
1545
1592
</ form >
1546
1593
</ div >
1547
1594
</ div >
1548
- </ div >
1595
+
1596
+
1549
1597
1550
1598
<!-- Metrics Panel -->
1551
1599
< div id ="metrics-panel " class ="tab-panel hidden ">
1552
1600
< div class ="bg-white shadow rounded-lg p-6 ">
1553
1601
< h2 class ="text-2xl font-bold mb-4 "> Aggregated Metrics</ h2 >
1602
+ < p class ="text-sm text-gray-600 mt-1 "> Metrics provide visibility into Tool, Resource, Prompt, and Server usage across your Gateway—helpful for debugging and optimization.</ p >
1554
1603
1555
1604
<!-- Refresh button (also auto-refreshes when the tab is selected) -->
1556
1605
< button
@@ -1599,6 +1648,7 @@ <h2 class="text-2xl font-bold mb-4">Aggregated Metrics</h2>
1599
1648
</ div >
1600
1649
</ div >
1601
1650
1651
+
1602
1652
<!-- Modals -->
1603
1653
<!-- Tool Detail Modal -->
1604
1654
< div id ="tool-modal " class ="fixed z-10 inset-0 overflow-y-auto hidden ">
0 commit comments