diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 485071a..20e3577 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - scala: [3.6.4] + scala: [3.7.2] java: [temurin@17, temurin@21, temurin@24] runs-on: ${{ matrix.os }} steps: @@ -87,7 +87,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - scala: [3.6.4] + scala: [3.7.2] java: [temurin@17] runs-on: ${{ matrix.os }} steps: @@ -123,12 +123,12 @@ jobs: - name: Setup sbt uses: sbt/setup-sbt@v1 - - name: Download target directories (3.6.4) + - name: Download target directories (3.7.2) uses: actions/download-artifact@v4 with: - name: target-${{ matrix.os }}-3.6.4-${{ matrix.java }} + name: target-${{ matrix.os }}-3.7.2-${{ matrix.java }} - - name: Inflate target directories (3.6.4) + - name: Inflate target directories (3.7.2) run: | tar xf targets.tar rm targets.tar diff --git a/.scalafix.conf b/.scalafix.conf index a4a2a25..27de20e 100644 --- a/.scalafix.conf +++ b/.scalafix.conf @@ -3,7 +3,6 @@ dialect = scala3 # List the rules to be applied rules = [ - RemoveUnused LeakingImplicitClassVal OrganizeImports ] diff --git a/build.sbt b/build.sbt index b0365a9..8058692 100644 --- a/build.sbt +++ b/build.sbt @@ -7,15 +7,16 @@ ThisBuild / sonatypeCredentialHost := sonatypeCentralHost ThisBuild / version := "0.1.2-SNAPSHOT" -ThisBuild / scalaVersion := "3.6.4" // Using Scala 3 +val sv = "3.7.2" +ThisBuild / scalaVersion := sv // Using Scala 3 ThisBuild / versionScheme := Some("semver-spec") lazy val Versions = new { - val zio = "2.1.17" - val zioSchema = "1.6.6" - val jackson = "2.18.3" - val tapir = "1.11.25" - val jsonSchemaCirce = "0.11.9" + val zio = "2.1.20" + val zioSchema = "1.7.4" + val jackson = "2.20.0" + val tapir = "1.11.42" + val jsonSchemaCirce = "0.11.10" val mcpSdk = "0.11.3" val scalaTest = "3.2.19" } @@ -43,7 +44,7 @@ lazy val root = (project in file(".")) libraryDependencies ++= Seq( // ZIO Core "dev.zio" %% "zio" % Versions.zio, - "dev.zio" %% "zio-json" % "0.7.42", + "dev.zio" %% "zio-json" % "0.7.44", // ZIO Schema for schema generation "dev.zio" %% "zio-schema" % Versions.zioSchema, @@ -96,7 +97,7 @@ ThisBuild / githubWorkflowJavaVersions := Seq( JavaSpec.temurin("24") ) -ThisBuild / githubWorkflowScalaVersions := Seq("3.6.4") +ThisBuild / githubWorkflowScalaVersions := Seq(sv) // Only run on main branch and version tags (vX.Y.Z) ThisBuild / githubWorkflowTargetBranches := Seq( diff --git a/src/main/scala/com/tjclp/fastmcp/examples/ManualServer.scala b/src/main/scala/com/tjclp/fastmcp/examples/ManualServer.scala index b7f5a91..e0e211d 100644 --- a/src/main/scala/com/tjclp/fastmcp/examples/ManualServer.scala +++ b/src/main/scala/com/tjclp/fastmcp/examples/ManualServer.scala @@ -4,7 +4,6 @@ package examples import com.tjclp.fastmcp.macros.JsonSchemaMacro import com.tjclp.fastmcp.macros.MapToFunctionMacro import com.tjclp.fastmcp.server.* -import com.tjclp.fastmcp.server.manager.* import sttp.tapir.* import zio.* import zio.json.* diff --git a/src/main/scala/com/tjclp/fastmcp/examples/TaskManagerServer.scala b/src/main/scala/com/tjclp/fastmcp/examples/TaskManagerServer.scala index 3ee98d2..e128020 100644 --- a/src/main/scala/com/tjclp/fastmcp/examples/TaskManagerServer.scala +++ b/src/main/scala/com/tjclp/fastmcp/examples/TaskManagerServer.scala @@ -1,15 +1,16 @@ package com.tjclp.fastmcp.examples import com.tjclp.fastmcp.core.* +import com.tjclp.fastmcp.macros.* import com.tjclp.fastmcp.macros.RegistrationMacro.* import com.tjclp.fastmcp.server.* -import com.tjclp.fastmcp.macros.* +import sttp.tapir.* +import sttp.tapir.generic.auto.* import zio.* + import java.time.LocalDateTime import java.util.UUID import scala.collection.mutable -import sttp.tapir.generic.auto.* -import sttp.tapir.* /** Example MCP server demonstrating complex task management with nested case classes and * collections - showcasing the enhanced JacksonConverter capabilities. diff --git a/src/main/scala/com/tjclp/fastmcp/macros/DeriveJacksonConverter.scala b/src/main/scala/com/tjclp/fastmcp/macros/DeriveJacksonConverter.scala index bb821fb..038a1de 100644 --- a/src/main/scala/com/tjclp/fastmcp/macros/DeriveJacksonConverter.scala +++ b/src/main/scala/com/tjclp/fastmcp/macros/DeriveJacksonConverter.scala @@ -1,9 +1,10 @@ package com.tjclp.fastmcp.macros -import scala.quoted.* -import scala.deriving.Mirror import com.fasterxml.jackson.databind.json.JsonMapper import com.fasterxml.jackson.module.scala.ClassTagExtensions + +import scala.deriving.Mirror +import scala.quoted.* import scala.reflect.ClassTag /** Macro to automatically derive JacksonConverter instances for case classes */ diff --git a/src/main/scala/com/tjclp/fastmcp/macros/JacksonConverter.scala b/src/main/scala/com/tjclp/fastmcp/macros/JacksonConverter.scala index e86b5ae..5028156 100644 --- a/src/main/scala/com/tjclp/fastmcp/macros/JacksonConverter.scala +++ b/src/main/scala/com/tjclp/fastmcp/macros/JacksonConverter.scala @@ -2,12 +2,11 @@ package com.tjclp.fastmcp.macros import com.fasterxml.jackson.databind.json.JsonMapper import com.fasterxml.jackson.databind.module.SimpleModule -import com.fasterxml.jackson.databind.{DeserializationFeature, JsonDeserializer, JsonSerializer} import com.fasterxml.jackson.module.scala.ClassTagExtensions import com.tjclp.fastmcp.server.McpContext -import scala.reflect.ClassTag import scala.jdk.CollectionConverters.* +import scala.reflect.ClassTag /** Typeclass that converts a raw `Any` value (from a Map) to `T` using Jackson. */ trait JacksonConverter[T]: diff --git a/src/main/scala/com/tjclp/fastmcp/server/FastMcpServer.scala b/src/main/scala/com/tjclp/fastmcp/server/FastMcpServer.scala index c8b5a34..a9f5b0f 100644 --- a/src/main/scala/com/tjclp/fastmcp/server/FastMcpServer.scala +++ b/src/main/scala/com/tjclp/fastmcp/server/FastMcpServer.scala @@ -1,6 +1,8 @@ package com.tjclp.fastmcp package server +import com.tjclp.fastmcp.core.* +import com.tjclp.fastmcp.server.manager.* import io.modelcontextprotocol.server.McpAsyncServer import io.modelcontextprotocol.server.McpAsyncServerExchange import io.modelcontextprotocol.server.McpServer @@ -17,9 +19,6 @@ import scala.jdk.CollectionConverters.* import scala.util.Failure import scala.util.Success -import com.tjclp.fastmcp.core.* -import com.tjclp.fastmcp.server.manager.* - /** Main server class for FastMCP-Scala * * This class provides a high-level API for creating MCP servers using Scala and ZIO diff --git a/src/test/scala/com/tjclp/fastmcp/TestFixtures.scala b/src/test/scala/com/tjclp/fastmcp/TestFixtures.scala index 6f5ec94..0e70fb8 100644 --- a/src/test/scala/com/tjclp/fastmcp/TestFixtures.scala +++ b/src/test/scala/com/tjclp/fastmcp/TestFixtures.scala @@ -1,11 +1,12 @@ package com.tjclp.fastmcp +import com.fasterxml.jackson.core.`type`.TypeReference import com.tjclp.fastmcp.server.McpContext import io.modelcontextprotocol.server.McpAsyncServerExchange +import io.modelcontextprotocol.spec.McpLoggableSession import io.modelcontextprotocol.spec.McpSchema -import io.modelcontextprotocol.spec.{McpLoggableSession, McpSchema => Schema} +import io.modelcontextprotocol.spec.McpSchema as Schema import reactor.core.publisher.Mono -import com.fasterxml.jackson.core.`type`.TypeReference /** Test fixtures and helpers for MCP tests. */ diff --git a/src/test/scala/com/tjclp/fastmcp/examples/ResourceTemplateTest.scala b/src/test/scala/com/tjclp/fastmcp/examples/ResourceTemplateTest.scala index 1cb9578..79f1c0b 100644 --- a/src/test/scala/com/tjclp/fastmcp/examples/ResourceTemplateTest.scala +++ b/src/test/scala/com/tjclp/fastmcp/examples/ResourceTemplateTest.scala @@ -1,12 +1,12 @@ package com.tjclp.fastmcp package examples -import com.tjclp.fastmcp.core.* import com.tjclp.fastmcp.server.* import com.tjclp.fastmcp.server.manager.* import zio.* import zio.test.* import zio.test.Assertion.* + import scala.jdk.CollectionConverters.* object ResourceTemplateTest extends ZIOSpecDefault: diff --git a/src/test/scala/com/tjclp/fastmcp/macros/ContextPropagationTest.scala b/src/test/scala/com/tjclp/fastmcp/macros/ContextPropagationTest.scala index 7597f3b..8dca0cc 100644 --- a/src/test/scala/com/tjclp/fastmcp/macros/ContextPropagationTest.scala +++ b/src/test/scala/com/tjclp/fastmcp/macros/ContextPropagationTest.scala @@ -1,16 +1,15 @@ package com.tjclp.fastmcp package macros +import com.fasterxml.jackson.core.`type`.TypeReference import io.modelcontextprotocol.server.McpAsyncServerExchange import io.modelcontextprotocol.spec.McpSchema import org.scalatest.funsuite.AnyFunSuite import zio.* -import com.fasterxml.jackson.core.`type`.TypeReference import java.util.concurrent.atomic.AtomicReference import server.* -import server.manager.* import RegistrationMacro.* class ContextPropagationTest extends AnyFunSuite: diff --git a/src/test/scala/com/tjclp/fastmcp/macros/JacksonConverterExample.scala b/src/test/scala/com/tjclp/fastmcp/macros/JacksonConverterExample.scala index 47c2b70..88bcb41 100644 --- a/src/test/scala/com/tjclp/fastmcp/macros/JacksonConverterExample.scala +++ b/src/test/scala/com/tjclp/fastmcp/macros/JacksonConverterExample.scala @@ -1,9 +1,11 @@ package com.tjclp.fastmcp.macros.test -import com.tjclp.fastmcp.macros.{JacksonConverter, DeriveJacksonConverter} import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.module.scala.{ClassTagExtensions, DefaultScalaModule} -import scala.deriving.Mirror +import com.fasterxml.jackson.module.scala.ClassTagExtensions +import com.fasterxml.jackson.module.scala.DefaultScalaModule +import com.tjclp.fastmcp.macros.DeriveJacksonConverter +import com.tjclp.fastmcp.macros.JacksonConverter + import scala.reflect.ClassTag // Example: Complex filter class similar to the one in the external app