Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion .scalafix.conf
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ dialect = scala3

# List the rules to be applied
rules = [
RemoveUnused
LeakingImplicitClassVal
OrganizeImports
]
Expand Down
17 changes: 9 additions & 8 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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]:
Expand Down
5 changes: 2 additions & 3 deletions src/main/scala/com/tjclp/fastmcp/server/FastMcpServer.scala
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down
5 changes: 3 additions & 2 deletions src/test/scala/com/tjclp/fastmcp/TestFixtures.scala
Original file line number Diff line number Diff line change
@@ -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.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down