From 24f91e65a17d0c8d7e564a81f7a318fef6516a19 Mon Sep 17 00:00:00 2001 From: Richie Caputo Date: Fri, 26 Sep 2025 11:05:34 -0400 Subject: [PATCH] feat: Update to MCP SDK 0.13.1 and fix breaking changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update mcpSdk dependency from 0.11.3 to 0.13.1 in build.sbt - Fix StdioServerTransportProvider constructor to use McpJsonMapper - Update inputSchema handling to parse JSON strings using McpJsonMapper.readValue() - Replace deprecated TypeReference with TypeRef in test files - All tests passing (139 tests) Breaking changes addressed: - StdioServerTransportProvider now requires McpJsonMapper parameter - Method signatures changed from TypeReference to TypeRef - JSON schema parsing now requires explicit use of McpJsonMapper 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- build.sbt | 2 +- src/main/scala/com/tjclp/fastmcp/core/Types.scala | 7 +++++-- .../scala/com/tjclp/fastmcp/server/FastMcpServer.scala | 4 +++- src/test/scala/com/tjclp/fastmcp/TestFixtures.scala | 4 ++-- .../com/tjclp/fastmcp/macros/ContextPropagationTest.scala | 4 ++-- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/build.sbt b/build.sbt index 146d9de..7179546 100644 --- a/build.sbt +++ b/build.sbt @@ -17,7 +17,7 @@ lazy val Versions = new { val jackson = "2.20.0" val tapir = "1.11.42" val jsonSchemaCirce = "0.11.10" - val mcpSdk = "0.11.3" + val mcpSdk = "0.13.1" val scalaTest = "3.2.19" } diff --git a/src/main/scala/com/tjclp/fastmcp/core/Types.scala b/src/main/scala/com/tjclp/fastmcp/core/Types.scala index 5d89abd..ad41dd5 100644 --- a/src/main/scala/com/tjclp/fastmcp/core/Types.scala +++ b/src/main/scala/com/tjclp/fastmcp/core/Types.scala @@ -1,5 +1,6 @@ package com.tjclp.fastmcp.core +import io.modelcontextprotocol.json.McpJsonMapper import io.modelcontextprotocol.spec.McpSchema import io.modelcontextprotocol.spec.McpSchema.Tool import zio.json.* @@ -45,8 +46,10 @@ object ToolDefinition: // Directly use McpSchema.JsonSchema baseToolBuilder.inputSchema(mcpSchema) case Right(stringSchema) => - // Use string schema - MCP SDK will parse it - baseToolBuilder.inputSchema(stringSchema) + // Parse string schema to JsonSchema using McpJsonMapper + val jsonMapper = McpJsonMapper.createDefault() + val jsonSchema = jsonMapper.readValue(stringSchema, classOf[McpSchema.JsonSchema]) + baseToolBuilder.inputSchema(jsonSchema) } toolBuilder.build() diff --git a/src/main/scala/com/tjclp/fastmcp/server/FastMcpServer.scala b/src/main/scala/com/tjclp/fastmcp/server/FastMcpServer.scala index a9f5b0f..9992a09 100644 --- a/src/main/scala/com/tjclp/fastmcp/server/FastMcpServer.scala +++ b/src/main/scala/com/tjclp/fastmcp/server/FastMcpServer.scala @@ -3,6 +3,7 @@ package server import com.tjclp.fastmcp.core.* import com.tjclp.fastmcp.server.manager.* +import io.modelcontextprotocol.json.McpJsonMapper import io.modelcontextprotocol.server.McpAsyncServer import io.modelcontextprotocol.server.McpAsyncServerExchange import io.modelcontextprotocol.server.McpServer @@ -160,7 +161,8 @@ class FastMcpServer( ZIO.scoped { // ⬅ drops the `Scope` requirement ZIO.acquireRelease( for { - provider <- ZIO.attempt(new StdioServerTransportProvider()) + jsonMapper <- ZIO.attempt(McpJsonMapper.createDefault()) + provider <- ZIO.attempt(new StdioServerTransportProvider(jsonMapper)) _ <- ZIO.attempt(setupServer(provider)) _ <- ZIO.attempt( JSystem.err.println( diff --git a/src/test/scala/com/tjclp/fastmcp/TestFixtures.scala b/src/test/scala/com/tjclp/fastmcp/TestFixtures.scala index 0e70fb8..b8c1f84 100644 --- a/src/test/scala/com/tjclp/fastmcp/TestFixtures.scala +++ b/src/test/scala/com/tjclp/fastmcp/TestFixtures.scala @@ -1,7 +1,7 @@ package com.tjclp.fastmcp -import com.fasterxml.jackson.core.`type`.TypeReference import com.tjclp.fastmcp.server.McpContext +import io.modelcontextprotocol.json.TypeRef import io.modelcontextprotocol.server.McpAsyncServerExchange import io.modelcontextprotocol.spec.McpLoggableSession import io.modelcontextprotocol.spec.McpSchema @@ -19,7 +19,7 @@ object TestFixtures { override def sendRequest[T]( method: String, params: Object, - typeRef: TypeReference[T] + typeRef: TypeRef[T] ): Mono[T] = Mono.empty() override def sendNotification(method: String): Mono[Void] = Mono.empty() override def sendNotification(method: String, obj: Object): Mono[Void] = Mono.empty() diff --git a/src/test/scala/com/tjclp/fastmcp/macros/ContextPropagationTest.scala b/src/test/scala/com/tjclp/fastmcp/macros/ContextPropagationTest.scala index 8dca0cc..44076b3 100644 --- a/src/test/scala/com/tjclp/fastmcp/macros/ContextPropagationTest.scala +++ b/src/test/scala/com/tjclp/fastmcp/macros/ContextPropagationTest.scala @@ -1,7 +1,7 @@ package com.tjclp.fastmcp package macros -import com.fasterxml.jackson.core.`type`.TypeReference +import io.modelcontextprotocol.json.TypeRef import io.modelcontextprotocol.server.McpAsyncServerExchange import io.modelcontextprotocol.spec.McpSchema import org.scalatest.funsuite.AnyFunSuite @@ -130,7 +130,7 @@ class NoopLoggableSession extends io.modelcontextprotocol.spec.McpLoggableSessio override def sendRequest[T]( method: String, params: Object, - typeRef: TypeReference[T] + typeRef: TypeRef[T] ): reactor.core.publisher.Mono[T] = reactor.core.publisher.Mono.empty() override def sendNotification(method: String): reactor.core.publisher.Mono[Void] =