1
+ package io .quarkus .devui .deployment .mcp ;
2
+
3
+ import java .io .IOException ;
4
+ import java .util .List ;
5
+
6
+ import io .quarkus .deployment .IsDevelopment ;
7
+ import io .quarkus .deployment .annotations .BuildProducer ;
8
+ import io .quarkus .deployment .annotations .BuildStep ;
9
+ import io .quarkus .deployment .annotations .ExecutionTime ;
10
+ import io .quarkus .deployment .builditem .LaunchModeBuildItem ;
11
+ import io .quarkus .devui .deployment .InternalPageBuildItem ;
12
+ import io .quarkus .devui .runtime .DevUIRecorder ;
13
+ import io .quarkus .devui .runtime .mcp .MCPResourcesService ;
14
+ import io .quarkus .devui .runtime .mcp .MCPToolsService ;
15
+ import io .quarkus .devui .spi .JsonRPCProvidersBuildItem ;
16
+ import io .quarkus .devui .spi .page .Page ;
17
+ import io .quarkus .vertx .http .deployment .NonApplicationRootPathBuildItem ;
18
+ import io .quarkus .vertx .http .deployment .RouteBuildItem ;
19
+
20
+ public class MCPProcessor {
21
+
22
+ private static final String DEVMCP = "dev-mcp" ;
23
+
24
+ private static final String NS_MCP = "mcp" ;
25
+ private static final String NS_RESOURCES = "resources" ;
26
+ private static final String NS_TOOLS = "tools" ;
27
+
28
+ @ BuildStep (onlyIf = IsDevelopment .class )
29
+ InternalPageBuildItem createMCPPage (NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem ) {
30
+ InternalPageBuildItem mcpServerPage = new InternalPageBuildItem ("MCP Server" , 28 );
31
+
32
+ // Pages
33
+ mcpServerPage .addPage (Page .webComponentPageBuilder ()
34
+ .namespace (NS_MCP )
35
+ .title ("MCP Server" )
36
+ .icon ("font-awesome-solid:robot" )
37
+ .componentLink ("qwc-mcp-server.js" ));
38
+
39
+ mcpServerPage .addPage (Page .webComponentPageBuilder ()
40
+ .namespace (NS_MCP )
41
+ .title ("Tools" )
42
+ .icon ("font-awesome-solid:screwdriver-wrench" )
43
+ .componentLink ("qwc-mcp-tools.js" ));
44
+
45
+ mcpServerPage .addPage (Page .webComponentPageBuilder ()
46
+ .namespace (NS_MCP )
47
+ .title ("Resources" )
48
+ .icon ("font-awesome-solid:file-invoice" )
49
+ .componentLink ("qwc-mcp-resources.js" ));
50
+
51
+ return mcpServerPage ;
52
+ }
53
+
54
+ @ BuildStep (onlyIf = IsDevelopment .class )
55
+ @ io .quarkus .deployment .annotations .Record (ExecutionTime .STATIC_INIT )
56
+ void registerDevUiHandlers (
57
+ BuildProducer <RouteBuildItem > routeProducer ,
58
+ DevUIRecorder recorder ,
59
+ LaunchModeBuildItem launchModeBuildItem ,
60
+ NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem ) throws IOException {
61
+
62
+ if (launchModeBuildItem .isNotLocalDevModeType ()) {
63
+ return ;
64
+ }
65
+
66
+ // SSE for JsonRPC comms
67
+ routeProducer .produce (
68
+ nonApplicationRootPathBuildItem
69
+ .routeBuilder ().route (DEVMCP )
70
+ .handler (recorder .serverSendEventHandler ())
71
+ .build ());
72
+
73
+ }
74
+
75
+ @ BuildStep (onlyIf = IsDevelopment .class )
76
+ void createMCPJsonRPCService (BuildProducer <JsonRPCProvidersBuildItem > bp ) {
77
+ bp .produce (List .of (
78
+ new JsonRPCProvidersBuildItem (NS_RESOURCES , MCPResourcesService .class ),
79
+ new JsonRPCProvidersBuildItem (NS_TOOLS , MCPToolsService .class )));
80
+ }
81
+ }
0 commit comments