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
23 changes: 19 additions & 4 deletions src/main/scala/mcp/model/mcp/ToolsProtocol.scala
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -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

Expand All @@ -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))
4 changes: 2 additions & 2 deletions src/main/scala/mcp/tools/arithmetic/AddTool.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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] =
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/mcp/tools/arithmetic/DivideTool.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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] =
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/mcp/tools/arithmetic/MultiplyTool.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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] =
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/mcp/tools/arithmetic/SubtractTool.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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] =
Expand Down
14 changes: 8 additions & 6 deletions src/main/scala/mcp/tools/common/NumericPairSchema.scala
Original file line number Diff line number Diff line change
@@ -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"))
)
4 changes: 2 additions & 2 deletions src/main/scala/mcp/tools/logic/AndTool.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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] =
Expand Down
6 changes: 3 additions & 3 deletions src/main/scala/mcp/tools/logic/EqualsTool.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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))
.map(parsed => Json.fromBoolean(parsed.a == parsed.b))
4 changes: 2 additions & 2 deletions src/main/scala/mcp/tools/logic/GreaterThanTool.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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] =
Expand Down
5 changes: 2 additions & 3 deletions src/main/scala/mcp/tools/logic/LessThanTool.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,12 @@ 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] =
ZIO
.fromEither(args.asJson.as[BinaryArgs])
.mapError(err => ToolError.InvalidArguments(s"Invalid arguments for lessThan: ${err.getMessage}"))
.map(parsed => Json.fromBoolean(parsed.a < parsed.b))

4 changes: 2 additions & 2 deletions src/main/scala/mcp/tools/logic/OrTool.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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] =
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/mcp/tools/logic/XorTool.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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] =
Expand Down