diff --git a/mcp-core/pom.xml b/mcp-core/pom.xml
index f3f0fcc2a..27c65991f 100644
--- a/mcp-core/pom.xml
+++ b/mcp-core/pom.xml
@@ -82,6 +82,12 @@
${jackson-annotations.version}
+
+ org.jspecify
+ jspecify
+ ${jspecify.version}
+
+
io.projectreactor
reactor-core
diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/customizer/McpAsyncHttpClientRequestCustomizer.java b/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/customizer/McpAsyncHttpClientRequestCustomizer.java
index f2951d832..8a6d9739c 100644
--- a/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/customizer/McpAsyncHttpClientRequestCustomizer.java
+++ b/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/customizer/McpAsyncHttpClientRequestCustomizer.java
@@ -12,7 +12,7 @@
import org.reactivestreams.Publisher;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
-import reactor.util.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Customize {@link HttpRequest.Builder} before executing the request, in either SSE or
diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/customizer/McpSyncHttpClientRequestCustomizer.java b/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/customizer/McpSyncHttpClientRequestCustomizer.java
index e22e3aa62..9d92cfa72 100644
--- a/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/customizer/McpSyncHttpClientRequestCustomizer.java
+++ b/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/customizer/McpSyncHttpClientRequestCustomizer.java
@@ -7,7 +7,7 @@
import java.net.URI;
import java.net.http.HttpRequest;
-import reactor.util.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.modelcontextprotocol.client.McpClient.SyncSpec;
import io.modelcontextprotocol.common.McpTransportContext;
diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/modern/server/McpParamHeaders.java b/mcp-core/src/main/java/io/modelcontextprotocol/modern/server/McpParamHeaders.java
index 26bdbf487..dcf2e4580 100644
--- a/mcp-core/src/main/java/io/modelcontextprotocol/modern/server/McpParamHeaders.java
+++ b/mcp-core/src/main/java/io/modelcontextprotocol/modern/server/McpParamHeaders.java
@@ -13,7 +13,7 @@
import io.modelcontextprotocol.modern.McpHttp;
import io.modelcontextprotocol.util.Assert;
-import reactor.util.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* The {@code Mcp-Param-{Name}} headers of a {@code tools/call} request, which a client
@@ -90,8 +90,7 @@ public boolean isMalformed(String name) {
* @param name the {@code {Name}} part of {@code Mcp-Param-{Name}}, in any case
* @return the decoded value, or {@code null} if the header is absent or malformed
*/
- @Nullable
- public String value(String name) {
+ @Nullable public String value(String name) {
return this.values.get(normalize(name));
}
diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/modern/server/transport/McpHeaderDecoder.java b/mcp-core/src/main/java/io/modelcontextprotocol/modern/server/transport/McpHeaderDecoder.java
index e7aae57d8..3a9d0fcf0 100644
--- a/mcp-core/src/main/java/io/modelcontextprotocol/modern/server/transport/McpHeaderDecoder.java
+++ b/mcp-core/src/main/java/io/modelcontextprotocol/modern/server/transport/McpHeaderDecoder.java
@@ -20,7 +20,7 @@
import io.modelcontextprotocol.modern.McpHttp.Headers;
import io.modelcontextprotocol.modern.server.McpParamHeaders;
import io.modelcontextprotocol.server.transport.HeaderAccessor;
-import reactor.util.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Strict decoder for MCP header values such as {@code Mcp-Name} and
@@ -50,8 +50,7 @@ private McpHeaderDecoder() {
* @param raw the header value as received
* @return the decoded value, or {@code null} if the value is malformed
*/
- @Nullable
- public static String decodeValue(String raw) {
+ @Nullable public static String decodeValue(String raw) {
if (raw.length() >= Headers.BASE64_VALUE_PREFIX.length() + Headers.BASE64_VALUE_SUFFIX.length()
&& raw.startsWith(Headers.BASE64_VALUE_PREFIX) && raw.endsWith(Headers.BASE64_VALUE_SUFFIX)) {
String encoded = raw.substring(Headers.BASE64_VALUE_PREFIX.length(),
diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/spec/ClosedMcpTransportSession.java b/mcp-core/src/main/java/io/modelcontextprotocol/spec/ClosedMcpTransportSession.java
index 6ed01dee3..770e8c046 100644
--- a/mcp-core/src/main/java/io/modelcontextprotocol/spec/ClosedMcpTransportSession.java
+++ b/mcp-core/src/main/java/io/modelcontextprotocol/spec/ClosedMcpTransportSession.java
@@ -8,7 +8,7 @@
import org.reactivestreams.Publisher;
import reactor.core.Disposable;
import reactor.core.publisher.Mono;
-import reactor.util.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Represents a closed MCP session, which may not be reused.
diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpTransportSessionClosedException.java b/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpTransportSessionClosedException.java
index 9e9e4616b..aa3cf73f3 100644
--- a/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpTransportSessionClosedException.java
+++ b/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpTransportSessionClosedException.java
@@ -4,7 +4,7 @@
package io.modelcontextprotocol.spec;
-import reactor.util.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Exception thrown when trying to use an {@link McpTransportSession} that has been
diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/util/Assert.java b/mcp-core/src/main/java/io/modelcontextprotocol/util/Assert.java
index 7218be514..c90027ccb 100644
--- a/mcp-core/src/main/java/io/modelcontextprotocol/util/Assert.java
+++ b/mcp-core/src/main/java/io/modelcontextprotocol/util/Assert.java
@@ -6,7 +6,7 @@
import java.util.Collection;
-import reactor.util.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Assertion utility class that assists in validating arguments.
diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/util/Utils.java b/mcp-core/src/main/java/io/modelcontextprotocol/util/Utils.java
index cd420100c..1c0c4407d 100644
--- a/mcp-core/src/main/java/io/modelcontextprotocol/util/Utils.java
+++ b/mcp-core/src/main/java/io/modelcontextprotocol/util/Utils.java
@@ -8,7 +8,7 @@
import java.util.Collection;
import java.util.Map;
-import reactor.util.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Miscellaneous utility methods.
diff --git a/mcp-test/pom.xml b/mcp-test/pom.xml
index 376f81c60..5d0dffb55 100644
--- a/mcp-test/pom.xml
+++ b/mcp-test/pom.xml
@@ -37,6 +37,12 @@
${slf4j-api.version}
+
+ org.jspecify
+ jspecify
+ ${jspecify.version}
+
+
io.projectreactor
reactor-core
diff --git a/pom.xml b/pom.xml
index 5c8b28bff..17636b0b9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -71,6 +71,7 @@
2.0.5
2.0.20
+ 1.0.0
1.6.6
2.22
2.22.4