contextExtractor) {
+ Assert.notNull(contextExtractor, "Context extractor must not be null");
+ this.contextExtractor = contextExtractor;
+ return this;
+ }
+
/**
* Sets the interval for keep-alive pings.
*
@@ -609,7 +654,7 @@ public HttpServletSseServerTransportProvider build() {
throw new IllegalStateException("MessageEndpoint must be set");
}
return new HttpServletSseServerTransportProvider(objectMapper, baseUrl, messageEndpoint, sseEndpoint,
- keepAliveInterval);
+ keepAliveInterval, contextExtractor);
}
}
diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java b/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java
index 62985dc17..669c10b83 100644
--- a/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java
+++ b/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java
@@ -198,7 +198,9 @@ public Mono sendNotification(String method, Object params) {
* @return a Mono that completes when the message is processed
*/
public Mono handle(McpSchema.JSONRPCMessage message) {
- return Mono.defer(() -> {
+ return Mono.deferContextual(ctx -> {
+ McpTransportContext transportContext = ctx.getOrDefault(McpTransportContext.KEY, McpTransportContext.EMPTY);
+
// TODO handle errors for communication to without initialization happening
// first
if (message instanceof McpSchema.JSONRPCResponse response) {
@@ -214,7 +216,7 @@ public Mono handle(McpSchema.JSONRPCMessage message) {
}
else if (message instanceof McpSchema.JSONRPCRequest request) {
logger.debug("Received request: {}", request);
- return handleIncomingRequest(request).onErrorResume(error -> {
+ return handleIncomingRequest(request, transportContext).onErrorResume(error -> {
var errorResponse = new McpSchema.JSONRPCResponse(McpSchema.JSONRPC_VERSION, request.id(), null,
new McpSchema.JSONRPCResponse.JSONRPCError(McpSchema.ErrorCodes.INTERNAL_ERROR,
error.getMessage(), null));
@@ -227,7 +229,7 @@ else if (message instanceof McpSchema.JSONRPCNotification notification) {
// happening first
logger.debug("Received notification: {}", notification);
// TODO: in case of error, should the POST request be signalled?
- return handleIncomingNotification(notification)
+ return handleIncomingNotification(notification, transportContext)
.doOnError(error -> logger.error("Error handling notification: {}", error.getMessage()));
}
else {
@@ -240,9 +242,11 @@ else if (message instanceof McpSchema.JSONRPCNotification notification) {
/**
* Handles an incoming JSON-RPC request by routing it to the appropriate handler.
* @param request The incoming JSON-RPC request
+ * @param transportContext
* @return A Mono containing the JSON-RPC response
*/
- private Mono handleIncomingRequest(McpSchema.JSONRPCRequest request) {
+ private Mono handleIncomingRequest(McpSchema.JSONRPCRequest request,
+ McpTransportContext transportContext) {
return Mono.defer(() -> {
Mono> resultMono;
if (McpSchema.METHOD_INITIALIZE.equals(request.method())) {
@@ -266,7 +270,11 @@ private Mono handleIncomingRequest(McpSchema.JSONRPCR
error.message(), error.data())));
}
- resultMono = this.exchangeSink.asMono().flatMap(exchange -> handler.handle(exchange, request.params()));
+ resultMono = this.exchangeSink.asMono().flatMap(exchange -> {
+ McpAsyncServerExchange newExchange = new McpAsyncServerExchange(exchange.sessionId(), this,
+ exchange.getClientCapabilities(), exchange.getClientInfo(), transportContext);
+ return handler.handle(newExchange, request.params());
+ });
}
return resultMono
.map(result -> new McpSchema.JSONRPCResponse(McpSchema.JSONRPC_VERSION, request.id(), result, null))
@@ -280,16 +288,18 @@ private Mono handleIncomingRequest(McpSchema.JSONRPCR
/**
* Handles an incoming JSON-RPC notification by routing it to the appropriate handler.
* @param notification The incoming JSON-RPC notification
+ * @param transportContext
* @return A Mono that completes when the notification is processed
*/
- private Mono handleIncomingNotification(McpSchema.JSONRPCNotification notification) {
+ private Mono handleIncomingNotification(McpSchema.JSONRPCNotification notification,
+ McpTransportContext transportContext) {
return Mono.defer(() -> {
if (McpSchema.METHOD_NOTIFICATION_INITIALIZED.equals(notification.method())) {
this.state.lazySet(STATE_INITIALIZED);
// FIXME: The session ID passed here is not the same as the one in the
// legacy SSE transport.
exchangeSink.tryEmitValue(new McpAsyncServerExchange(this.id, this, clientCapabilities.get(),
- clientInfo.get(), McpTransportContext.EMPTY));
+ clientInfo.get(), transportContext));
}
var handler = notificationHandlers.get(notification.method());
@@ -297,7 +307,11 @@ private Mono handleIncomingNotification(McpSchema.JSONRPCNotification noti
logger.warn("No handler registered for notification method: {}", notification);
return Mono.empty();
}
- return this.exchangeSink.asMono().flatMap(exchange -> handler.handle(exchange, notification.params()));
+ return this.exchangeSink.asMono().flatMap(exchange -> {
+ McpAsyncServerExchange newExchange = new McpAsyncServerExchange(exchange.sessionId(), this,
+ exchange.getClientCapabilities(), exchange.getClientInfo(), transportContext);
+ return handler.handle(newExchange, notification.params());
+ });
});
}
diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/AbstractMcpAsyncClientResiliencyTests.java b/mcp/src/test/java/io/modelcontextprotocol/client/AbstractMcpAsyncClientResiliencyTests.java
index ec23e21dc..8d8edc187 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/client/AbstractMcpAsyncClientResiliencyTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/client/AbstractMcpAsyncClientResiliencyTests.java
@@ -49,7 +49,8 @@ public abstract class AbstractMcpAsyncClientResiliencyTests {
// Uses the https://github.com/tzolov/mcp-everything-server-docker-image
@SuppressWarnings("resource")
- static GenericContainer> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v2")
+ static GenericContainer> container = new GenericContainer<>(
+ "412335208158.dkr.ecr.us-east-1.amazonaws.com/docker-hub/tzolov/mcp-everything-server:v2")
.withCommand("node dist/index.js streamableHttp")
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
.withNetwork(network)
diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/HttpClientStreamableHttpAsyncClientTests.java b/mcp/src/test/java/io/modelcontextprotocol/client/HttpClientStreamableHttpAsyncClientTests.java
index aef2ab8dd..18dc724ba 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/client/HttpClientStreamableHttpAsyncClientTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/client/HttpClientStreamableHttpAsyncClientTests.java
@@ -18,7 +18,8 @@ public class HttpClientStreamableHttpAsyncClientTests extends AbstractMcpAsyncCl
// Uses the https://github.com/tzolov/mcp-everything-server-docker-image
@SuppressWarnings("resource")
- GenericContainer> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v2")
+ GenericContainer> container = new GenericContainer<>(
+ "412335208158.dkr.ecr.us-east-1.amazonaws.com/docker-hub/tzolov/mcp-everything-server:v2")
.withCommand("node dist/index.js streamableHttp")
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
.withExposedPorts(3001)
diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/HttpClientStreamableHttpSyncClientTests.java b/mcp/src/test/java/io/modelcontextprotocol/client/HttpClientStreamableHttpSyncClientTests.java
index 7f00de60e..b3a8e481b 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/client/HttpClientStreamableHttpSyncClientTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/client/HttpClientStreamableHttpSyncClientTests.java
@@ -18,7 +18,8 @@ public class HttpClientStreamableHttpSyncClientTests extends AbstractMcpSyncClie
// Uses the https://github.com/tzolov/mcp-everything-server-docker-image
@SuppressWarnings("resource")
- GenericContainer> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v2")
+ GenericContainer> container = new GenericContainer<>(
+ "412335208158.dkr.ecr.us-east-1.amazonaws.com/docker-hub/tzolov/mcp-everything-server:v2")
.withCommand("node dist/index.js streamableHttp")
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
.withExposedPorts(3001)
diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpAsyncClientLostConnectionTests.java b/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpAsyncClientLostConnectionTests.java
index 0a72b785d..b81f26a56 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpAsyncClientLostConnectionTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpAsyncClientLostConnectionTests.java
@@ -38,7 +38,8 @@ public class HttpSseMcpAsyncClientLostConnectionTests {
// Uses the https://github.com/tzolov/mcp-everything-server-docker-image
@SuppressWarnings("resource")
- static GenericContainer> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v2")
+ static GenericContainer> container = new GenericContainer<>(
+ "412335208158.dkr.ecr.us-east-1.amazonaws.com/docker-hub/tzolov/mcp-everything-server:v2")
.withCommand("node dist/index.js sse")
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
.withNetwork(network)
diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpAsyncClientTests.java b/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpAsyncClientTests.java
index 6cb3f7b65..909b87a5f 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpAsyncClientTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpAsyncClientTests.java
@@ -23,7 +23,8 @@ class HttpSseMcpAsyncClientTests extends AbstractMcpAsyncClientTests {
// Uses the https://github.com/tzolov/mcp-everything-server-docker-image
@SuppressWarnings("resource")
- GenericContainer> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v2")
+ GenericContainer> container = new GenericContainer<>(
+ "412335208158.dkr.ecr.us-east-1.amazonaws.com/docker-hub/tzolov/mcp-everything-server:v2")
.withCommand("node dist/index.js sse")
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
.withExposedPorts(3001)
diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpSyncClientTests.java b/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpSyncClientTests.java
index 8646c1b4c..52354a422 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpSyncClientTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/client/HttpSseMcpSyncClientTests.java
@@ -22,7 +22,8 @@ class HttpSseMcpSyncClientTests extends AbstractMcpSyncClientTests {
// Uses the https://github.com/tzolov/mcp-everything-server-docker-image
@SuppressWarnings("resource")
- GenericContainer> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v2")
+ GenericContainer> container = new GenericContainer<>(
+ "412335208158.dkr.ecr.us-east-1.amazonaws.com/docker-hub/tzolov/mcp-everything-server:v2")
.withCommand("node dist/index.js sse")
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
.withExposedPorts(3001)
diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/StdioMcpAsyncClientTests.java b/mcp/src/test/java/io/modelcontextprotocol/client/StdioMcpAsyncClientTests.java
index e9356d0c0..6cf96c970 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/client/StdioMcpAsyncClientTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/client/StdioMcpAsyncClientTests.java
@@ -23,14 +23,20 @@ class StdioMcpAsyncClientTests extends AbstractMcpAsyncClientTests {
@Override
protected McpClientTransport createMcpTransport() {
ServerParameters stdioParams;
+ String currentPath = System.getenv("PATH");
+ String nodePath = System.getProperty("user.dir") + "/node";
+ String newPath = nodePath + (currentPath != null ? System.getProperty("path.separator") + currentPath : "");
+
if (System.getProperty("os.name").toLowerCase().contains("win")) {
- stdioParams = ServerParameters.builder("cmd.exe")
- .args("/c", "npx.cmd", "-y", "@modelcontextprotocol/server-everything", "stdio")
+ stdioParams = ServerParameters.builder("./node/npx.cmd")
+ .args("-y", "@modelcontextprotocol/server-everything", "stdio")
+ .addEnvVar("PATH", newPath)
.build();
}
else {
- stdioParams = ServerParameters.builder("npx")
+ stdioParams = ServerParameters.builder("./node/npx")
.args("-y", "@modelcontextprotocol/server-everything", "stdio")
+ .addEnvVar("PATH", newPath)
.build();
}
return new StdioClientTransport(stdioParams);
diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/StdioMcpSyncClientTests.java b/mcp/src/test/java/io/modelcontextprotocol/client/StdioMcpSyncClientTests.java
index 4b5f4f9c0..eac722c53 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/client/StdioMcpSyncClientTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/client/StdioMcpSyncClientTests.java
@@ -31,14 +31,20 @@ class StdioMcpSyncClientTests extends AbstractMcpSyncClientTests {
@Override
protected McpClientTransport createMcpTransport() {
ServerParameters stdioParams;
+ String currentPath = System.getenv("PATH");
+ String nodePath = System.getProperty("user.dir") + "/node";
+ String newPath = nodePath + (currentPath != null ? System.getProperty("path.separator") + currentPath : "");
+
if (System.getProperty("os.name").toLowerCase().contains("win")) {
- stdioParams = ServerParameters.builder("cmd.exe")
- .args("/c", "npx.cmd", "-y", "@modelcontextprotocol/server-everything", "stdio")
+ stdioParams = ServerParameters.builder("./node/npx.cmd")
+ .args("-y", "@modelcontextprotocol/server-everything", "stdio")
+ .addEnvVar("PATH", newPath)
.build();
}
else {
- stdioParams = ServerParameters.builder("npx")
+ stdioParams = ServerParameters.builder("./node/npx")
.args("-y", "@modelcontextprotocol/server-everything", "stdio")
+ .addEnvVar("PATH", newPath)
.build();
}
return new StdioClientTransport(stdioParams);
diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java b/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java
index 46b9207f6..0d7a762e3 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java
@@ -54,7 +54,8 @@ class HttpClientSseClientTransportTests {
static String host = "http://localhost:3001";
@SuppressWarnings("resource")
- static GenericContainer> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v2")
+ static GenericContainer> container = new GenericContainer<>(
+ "412335208158.dkr.ecr.us-east-1.amazonaws.com/docker-hub/tzolov/mcp-everything-server:v2")
.withCommand("node dist/index.js sse")
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
.withExposedPorts(3001)
diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransportTest.java b/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransportTest.java
index d645bb0b3..20137bb8d 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransportTest.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransportTest.java
@@ -33,7 +33,8 @@ class HttpClientStreamableHttpTransportTest {
static String host = "http://localhost:3001";
@SuppressWarnings("resource")
- static GenericContainer> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v2")
+ static GenericContainer> container = new GenericContainer<>(
+ "412335208158.dkr.ecr.us-east-1.amazonaws.com/docker-hub/tzolov/mcp-everything-server:v2")
.withCommand("node dist/index.js streamableHttp")
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
.withExposedPorts(3001)
diff --git a/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpClientServerIntegrationTests.java b/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpClientServerIntegrationTests.java
index e2adb340c..cc580bdd4 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpClientServerIntegrationTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpClientServerIntegrationTests.java
@@ -10,6 +10,7 @@
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.assertWith;
import static org.awaitility.Awaitility.await;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import java.net.URI;
@@ -28,6 +29,7 @@
import java.util.function.Function;
import java.util.stream.Collectors;
+import jakarta.servlet.http.HttpServletRequest;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
@@ -825,6 +827,61 @@ void testThrowingToolCallIsCaughtBeforeTimeout(String clientType) {
mcpServer.close();
}
+ @ParameterizedTest(name = "{0} : {displayName} ")
+ @ValueSource(strings = { "httpclient" })
+ void testToolCallSuccessWithTranportContextExtraction(String clientType) {
+
+ var clientBuilder = clientBuilders.get(clientType);
+
+ var expectedCallResponse = new McpSchema.CallToolResult(
+ List.of(new McpSchema.TextContent("CALL RESPONSE; ctx=value")), null);
+ McpServerFeatures.SyncToolSpecification tool1 = McpServerFeatures.SyncToolSpecification.builder()
+ .tool(Tool.builder().name("tool1").description("tool1 description").inputSchema(emptyJsonSchema).build())
+ .callHandler((exchange, request) -> {
+
+ McpTransportContext transportContext = exchange.transportContext();
+ assertTrue(transportContext != null, "transportContext should not be null");
+ assertTrue(!transportContext.equals(McpTransportContext.EMPTY), "transportContext should not be empty");
+ String ctxValue = (String) transportContext.get("important");
+
+ try {
+ HttpResponse response = HttpClient.newHttpClient()
+ .send(HttpRequest.newBuilder()
+ .uri(URI.create(
+ "https://raw.githubusercontent.com/modelcontextprotocol/java-sdk/refs/heads/main/README.md"))
+ .GET()
+ .build(), HttpResponse.BodyHandlers.ofString());
+ String responseBody = response.body();
+ assertThat(responseBody).isNotBlank();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return new McpSchema.CallToolResult(
+ List.of(new McpSchema.TextContent("CALL RESPONSE; ctx=" + ctxValue)), null);
+ })
+ .build();
+
+ var mcpServer = prepareSyncServerBuilder().capabilities(ServerCapabilities.builder().tools(true).build())
+ .tools(tool1)
+ .build();
+
+ try (var mcpClient = clientBuilder.build()) {
+
+ InitializeResult initResult = mcpClient.initialize();
+ assertThat(initResult).isNotNull();
+
+ assertThat(mcpClient.listTools().tools()).contains(tool1.tool());
+
+ CallToolResult response = mcpClient.callTool(new McpSchema.CallToolRequest("tool1", Map.of()));
+
+ assertThat(response).isNotNull().isEqualTo(expectedCallResponse);
+ }
+
+ mcpServer.close();
+ }
+
@ParameterizedTest(name = "{0} : {displayName} ")
@ValueSource(strings = { "httpclient" })
void testToolListChangeHandlingSuccess(String clientType) {
@@ -1531,4 +1588,9 @@ private double evaluateExpression(String expression) {
};
}
+ protected static McpTransportContextExtractor extractor = (r, tc) -> {
+ tc.put("important", "value");
+ return tc;
+ };
+
}
diff --git a/mcp/src/test/java/io/modelcontextprotocol/server/HttpServletSseIntegrationTests.java b/mcp/src/test/java/io/modelcontextprotocol/server/HttpServletSseIntegrationTests.java
index 56e74218f..4435b8b44 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/server/HttpServletSseIntegrationTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/server/HttpServletSseIntegrationTests.java
@@ -40,6 +40,7 @@ public void before() {
// Create and configure the transport provider
mcpServerTransportProvider = HttpServletSseServerTransportProvider.builder()
.objectMapper(new ObjectMapper())
+ .contextExtractor(extractor)
.messageEndpoint(CUSTOM_MESSAGE_ENDPOINT)
.sseEndpoint(CUSTOM_SSE_ENDPOINT)
.build();
diff --git a/mcp/src/test/java/io/modelcontextprotocol/server/HttpServletStreamableIntegrationTests.java b/mcp/src/test/java/io/modelcontextprotocol/server/HttpServletStreamableIntegrationTests.java
index 6ac10014e..0815556b9 100644
--- a/mcp/src/test/java/io/modelcontextprotocol/server/HttpServletStreamableIntegrationTests.java
+++ b/mcp/src/test/java/io/modelcontextprotocol/server/HttpServletStreamableIntegrationTests.java
@@ -38,6 +38,7 @@ public void before() {
// Create and configure the transport provider
mcpServerTransportProvider = HttpServletStreamableServerTransportProvider.builder()
.objectMapper(new ObjectMapper())
+ .contextExtractor(extractor)
.mcpEndpoint(MESSAGE_ENDPOINT)
.keepAliveInterval(Duration.ofSeconds(1))
.build();
diff --git a/pom.xml b/pom.xml
index c0b1f7a44..57a179853 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,9 +4,9 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- io.modelcontextprotocol.sdk
+ com.sproutsocial.io.modelcontextprotocol.sdk
mcp-parent
- 0.12.0-SNAPSHOT
+ 0.12.0-sprout
pom
https://github.com/modelcontextprotocol/java-sdk
@@ -97,6 +97,7 @@
7.1.0
4.1.0
1.5.7
+ 1.15.1
@@ -259,7 +260,26 @@
maven-deploy-plugin
${maven-deploy-plugin.version}
-
+
+ com.github.eirslett
+ frontend-maven-plugin
+ ${frontend-maven-plugin.version}
+
+
+ install node and npm
+
+ install-node-and-npm
+
+ generate-test-resources
+
+ v18.19.0
+ 10.2.4
+
+
+
+
+
+
@@ -370,4 +390,15 @@
+
+
+ internal
+ https://nexus.int.sproutsocial.com/nexus/content/repositories/releases/
+
+
+ snapshots
+ https://nexus.int.sproutsocial.com/nexus/content/repositories/snapshots/
+
+
+