From 7639f7e441d7aa333f0d90493d18513aaec57404 Mon Sep 17 00:00:00 2001 From: Alexandre-Roussel48 Date: Sun, 16 Nov 2025 02:18:08 +0100 Subject: [PATCH] feat(spec): updated parameters to inputSchema to match current MCP spec --- .../scala/mcp/model/mcp/ToolsProtocol.scala | 23 +++++++++++++++---- .../scala/mcp/tools/arithmetic/AddTool.scala | 4 ++-- .../mcp/tools/arithmetic/DivideTool.scala | 4 ++-- .../mcp/tools/arithmetic/MultiplyTool.scala | 4 ++-- .../mcp/tools/arithmetic/SubtractTool.scala | 4 ++-- .../mcp/tools/common/NumericPairSchema.scala | 14 ++++++----- src/main/scala/mcp/tools/logic/AndTool.scala | 4 ++-- .../scala/mcp/tools/logic/EqualsTool.scala | 6 ++--- .../mcp/tools/logic/GreaterThanTool.scala | 4 ++-- .../scala/mcp/tools/logic/LessThanTool.scala | 5 ++-- src/main/scala/mcp/tools/logic/OrTool.scala | 4 ++-- src/main/scala/mcp/tools/logic/XorTool.scala | 4 ++-- 12 files changed, 48 insertions(+), 32 deletions(-) diff --git a/src/main/scala/mcp/model/mcp/ToolsProtocol.scala b/src/main/scala/mcp/model/mcp/ToolsProtocol.scala index 98a5051..8d01f14 100644 --- a/src/main/scala/mcp/model/mcp/ToolsProtocol.scala +++ b/src/main/scala/mcp/model/mcp/ToolsProtocol.scala @@ -1,12 +1,20 @@ package mcp.model.mcp -import io.circe.{Decoder, Encoder, Json, JsonObject} import io.circe.generic.semiauto._ +import io.circe.{Decoder, Encoder, Json, JsonObject} + +final case class JsonSchema( + `type`: String = "object", + properties: Option[JsonObject] = None, + required: Option[List[String]] = None +) final case class ToolDefinition( name: String, - description: String, - parameters: JsonObject + inputSchema: JsonSchema, + description: Option[String] = None, + outputSchema: Option[JsonSchema] = None, + title: Option[String] = None ) final case class ToolsListResult( @@ -31,7 +39,11 @@ final case class ToolCallResult( content: List[ToolResultContent] ) -given Encoder[ToolDefinition] = deriveEncoder +given Encoder.AsObject[JsonSchema] = deriveEncoder[JsonSchema].mapJsonObject(dropNullFields) + +given Decoder[JsonSchema] = deriveDecoder + +given Encoder.AsObject[ToolDefinition] = deriveEncoder[ToolDefinition].mapJsonObject(dropNullFields) given Decoder[ToolDefinition] = deriveDecoder @@ -50,3 +62,6 @@ given Decoder[ToolResultContent] = deriveDecoder given Encoder[ToolCallResult] = deriveEncoder given Decoder[ToolCallResult] = deriveDecoder + +private def dropNullFields(obj: JsonObject): JsonObject = + JsonObject.fromIterable(obj.toIterable.filterNot(_._2.isNull)) diff --git a/src/main/scala/mcp/tools/arithmetic/AddTool.scala b/src/main/scala/mcp/tools/arithmetic/AddTool.scala index 44d3846..bd1a359 100644 --- a/src/main/scala/mcp/tools/arithmetic/AddTool.scala +++ b/src/main/scala/mcp/tools/arithmetic/AddTool.scala @@ -12,8 +12,8 @@ import mcp.tools.{Tool, ToolError} object AddTool extends Tool: val definition: ToolDefinition = ToolDefinition( name = "add", - description = "Add two numbers together.", - parameters = NumericPairSchema.definition + description = Some("Add two numbers together."), + inputSchema = NumericPairSchema.definition ) def execute(args: JsonObject): ZIO[Any, ToolError, Json] = diff --git a/src/main/scala/mcp/tools/arithmetic/DivideTool.scala b/src/main/scala/mcp/tools/arithmetic/DivideTool.scala index 51cc59f..d2d27f1 100644 --- a/src/main/scala/mcp/tools/arithmetic/DivideTool.scala +++ b/src/main/scala/mcp/tools/arithmetic/DivideTool.scala @@ -12,8 +12,8 @@ import mcp.tools.{Tool, ToolError} object DivideTool extends Tool: val definition: ToolDefinition = ToolDefinition( name = "divide", - description = "Divide two numbers.", - parameters = NumericPairSchema.definition + description = Some("Divide two numbers."), + inputSchema = NumericPairSchema.definition ) def execute(args: JsonObject): ZIO[Any, ToolError, Json] = diff --git a/src/main/scala/mcp/tools/arithmetic/MultiplyTool.scala b/src/main/scala/mcp/tools/arithmetic/MultiplyTool.scala index a156062..c7902a4 100644 --- a/src/main/scala/mcp/tools/arithmetic/MultiplyTool.scala +++ b/src/main/scala/mcp/tools/arithmetic/MultiplyTool.scala @@ -12,8 +12,8 @@ import mcp.tools.{Tool, ToolError} object MultiplyTool extends Tool: val definition: ToolDefinition = ToolDefinition( name = "multiply", - description = "Multiply two numbers.", - parameters = NumericPairSchema.definition + description = Some("Multiply two numbers."), + inputSchema = NumericPairSchema.definition ) def execute(args: JsonObject): ZIO[Any, ToolError, Json] = diff --git a/src/main/scala/mcp/tools/arithmetic/SubtractTool.scala b/src/main/scala/mcp/tools/arithmetic/SubtractTool.scala index ea813f7..e0e47c2 100644 --- a/src/main/scala/mcp/tools/arithmetic/SubtractTool.scala +++ b/src/main/scala/mcp/tools/arithmetic/SubtractTool.scala @@ -12,8 +12,8 @@ import mcp.tools.{Tool, ToolError} object SubtractTool extends Tool: val definition: ToolDefinition = ToolDefinition( name = "subtract", - description = "Subtract two numbers.", - parameters = NumericPairSchema.definition + description = Some("Subtract two numbers."), + inputSchema = NumericPairSchema.definition ) def execute(args: JsonObject): ZIO[Any, ToolError, Json] = diff --git a/src/main/scala/mcp/tools/common/NumericPairSchema.scala b/src/main/scala/mcp/tools/common/NumericPairSchema.scala index 0d40e0b..3d93c98 100644 --- a/src/main/scala/mcp/tools/common/NumericPairSchema.scala +++ b/src/main/scala/mcp/tools/common/NumericPairSchema.scala @@ -1,13 +1,15 @@ package mcp.tools.common import io.circe.{Json, JsonObject} +import mcp.model.mcp.JsonSchema object NumericPairSchema: - val definition: JsonObject = JsonObject( - "type" -> Json.fromString("object"), - "properties" -> Json.obj( - "a" -> Json.obj("type" -> Json.fromString("number")), - "b" -> Json.obj("type" -> Json.fromString("number")) + val definition: JsonSchema = JsonSchema( + properties = Some( + JsonObject( + "a" -> Json.obj("type" -> Json.fromString("number")), + "b" -> Json.obj("type" -> Json.fromString("number")) + ) ), - "required" -> Json.arr(Json.fromString("a"), Json.fromString("b")) + required = Some(List("a", "b")) ) diff --git a/src/main/scala/mcp/tools/logic/AndTool.scala b/src/main/scala/mcp/tools/logic/AndTool.scala index ba10836..6587f6c 100644 --- a/src/main/scala/mcp/tools/logic/AndTool.scala +++ b/src/main/scala/mcp/tools/logic/AndTool.scala @@ -12,8 +12,8 @@ import mcp.tools.{Tool, ToolError} object AndTool extends Tool: val definition: ToolDefinition = ToolDefinition( name = "and", - description = "Bitwise AND operation on integers.", - parameters = NumericPairSchema.definition + description = Some("Bitwise AND operation on integers."), + inputSchema = NumericPairSchema.definition ) def execute(args: JsonObject): ZIO[Any, ToolError, Json] = diff --git a/src/main/scala/mcp/tools/logic/EqualsTool.scala b/src/main/scala/mcp/tools/logic/EqualsTool.scala index 66083b3..17ba781 100644 --- a/src/main/scala/mcp/tools/logic/EqualsTool.scala +++ b/src/main/scala/mcp/tools/logic/EqualsTool.scala @@ -12,12 +12,12 @@ import mcp.tools.{Tool, ToolError} object EqualsTool extends Tool: val definition: ToolDefinition = ToolDefinition( name = "equals", - description = "Logical equality operation.", - parameters = NumericPairSchema.definition + description = Some("Logical equality operation."), + inputSchema = NumericPairSchema.definition ) def execute(args: JsonObject): ZIO[Any, ToolError, Json] = ZIO .fromEither(args.asJson.as[BinaryArgs]) .mapError(err => ToolError.InvalidArguments(s"Invalid arguments for equals: ${err.getMessage}")) - .map(parsed => Json.fromBoolean(parsed.a == parsed.b)) \ No newline at end of file + .map(parsed => Json.fromBoolean(parsed.a == parsed.b)) diff --git a/src/main/scala/mcp/tools/logic/GreaterThanTool.scala b/src/main/scala/mcp/tools/logic/GreaterThanTool.scala index 894f582..8f58bf6 100644 --- a/src/main/scala/mcp/tools/logic/GreaterThanTool.scala +++ b/src/main/scala/mcp/tools/logic/GreaterThanTool.scala @@ -12,8 +12,8 @@ import mcp.tools.{Tool, ToolError} object GreaterThanTool extends Tool: val definition: ToolDefinition = ToolDefinition( name = "greaterThan", - description = "Logical greater than operation.", - parameters = NumericPairSchema.definition + description = Some("Logical greater than operation."), + inputSchema = NumericPairSchema.definition ) def execute(args: JsonObject): ZIO[Any, ToolError, Json] = diff --git a/src/main/scala/mcp/tools/logic/LessThanTool.scala b/src/main/scala/mcp/tools/logic/LessThanTool.scala index f71270d..d4f1c99 100644 --- a/src/main/scala/mcp/tools/logic/LessThanTool.scala +++ b/src/main/scala/mcp/tools/logic/LessThanTool.scala @@ -12,8 +12,8 @@ import mcp.tools.{Tool, ToolError} object LessThanTool extends Tool: val definition: ToolDefinition = ToolDefinition( name = "lessThan", - description = "Logical less than operation.", - parameters = NumericPairSchema.definition + description = Some("Logical less than operation."), + inputSchema = NumericPairSchema.definition ) def execute(args: JsonObject): ZIO[Any, ToolError, Json] = @@ -21,4 +21,3 @@ object LessThanTool extends Tool: .fromEither(args.asJson.as[BinaryArgs]) .mapError(err => ToolError.InvalidArguments(s"Invalid arguments for lessThan: ${err.getMessage}")) .map(parsed => Json.fromBoolean(parsed.a < parsed.b)) - diff --git a/src/main/scala/mcp/tools/logic/OrTool.scala b/src/main/scala/mcp/tools/logic/OrTool.scala index f0d42fc..b27fd9f 100644 --- a/src/main/scala/mcp/tools/logic/OrTool.scala +++ b/src/main/scala/mcp/tools/logic/OrTool.scala @@ -12,8 +12,8 @@ import mcp.tools.{Tool, ToolError} object OrTool extends Tool: val definition: ToolDefinition = ToolDefinition( name = "or", - description = "Bitwise OR operation on integers.", - parameters = NumericPairSchema.definition + description = Some("Bitwise OR operation on integers."), + inputSchema = NumericPairSchema.definition ) def execute(args: JsonObject): ZIO[Any, ToolError, Json] = diff --git a/src/main/scala/mcp/tools/logic/XorTool.scala b/src/main/scala/mcp/tools/logic/XorTool.scala index 80ed52e..bc3a8e8 100644 --- a/src/main/scala/mcp/tools/logic/XorTool.scala +++ b/src/main/scala/mcp/tools/logic/XorTool.scala @@ -12,8 +12,8 @@ import mcp.tools.{Tool, ToolError} object XorTool extends Tool: val definition: ToolDefinition = ToolDefinition( name = "xor", - description = "Bitwise XOR operation on integers.", - parameters = NumericPairSchema.definition + description = Some("Bitwise XOR operation on integers."), + inputSchema = NumericPairSchema.definition ) def execute(args: JsonObject): ZIO[Any, ToolError, Json] =