From a8b82e93c19abd53d89c5e3299b5335f390a3881 Mon Sep 17 00:00:00 2001 From: shahondin1624 Date: Sun, 15 Feb 2026 17:09:55 +0100 Subject: [PATCH] Refactoring and add semantic cache --- src/main/java/mcp/tools/McpTool.java | 2 +- src/main/java/mcp/tools/McpValidatedTool.java | 12 +++--- .../mcp/tools/helper/AnnotationsBuilder.java | 12 +++--- .../tools/helper/CallToolResultBuilder.java | 8 ++-- .../java/mcp/tools/helper/QueryValidator.java | 2 +- .../java/mcp/tools/helper/SchemaBuilder.java | 14 +++---- .../mcp/tools/helper/ToolQueryValidator.java | 38 +++++++++---------- src/main/java/mcp/util/Option.java | 20 +++++----- src/main/java/mcp/util/Result.java | 20 +++++----- 9 files changed, 62 insertions(+), 66 deletions(-) diff --git a/src/main/java/mcp/tools/McpTool.java b/src/main/java/mcp/tools/McpTool.java index 63049ab..0b59aaa 100644 --- a/src/main/java/mcp/tools/McpTool.java +++ b/src/main/java/mcp/tools/McpTool.java @@ -33,5 +33,5 @@ public interface McpTool { return null; } - McpSchema.CallToolResult call(McpSchema.CallToolRequest request, Map arguments); + McpSchema.CallToolResult call(final McpSchema.CallToolRequest request, final Map arguments); } diff --git a/src/main/java/mcp/tools/McpValidatedTool.java b/src/main/java/mcp/tools/McpValidatedTool.java index 048bd90..ada34a6 100644 --- a/src/main/java/mcp/tools/McpValidatedTool.java +++ b/src/main/java/mcp/tools/McpValidatedTool.java @@ -4,8 +4,6 @@ import io.modelcontextprotocol.spec.McpSchema; import mcp.tools.helper.AnnotationsBuilder; import mcp.tools.helper.CallToolResultBuilder; import mcp.tools.helper.ToolQueryValidator; -import mcp.util.Err; -import mcp.util.Ok; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,7 +16,7 @@ public abstract class McpValidatedTool implements McpTool { public abstract McpSchema.CallToolResult callValidated(McpSchema.CallToolRequest request, Map arguments) throws Exception; @Override - public final McpSchema.CallToolResult call(McpSchema.CallToolRequest request, Map arguments) { + public final McpSchema.CallToolResult call(final McpSchema.CallToolRequest request, final Map arguments) { final var result = validator.validate(inputSchema(), arguments); if (result.isError()) { logger.warn("Validation failed for tool {}: {}", name(), result.err().unwrap().getMessage()); @@ -62,22 +60,22 @@ public abstract class McpValidatedTool implements McpTool { return false; } - protected McpSchema.CallToolResult success(String text) { + protected McpSchema.CallToolResult success(final String text) { return new CallToolResultBuilder().addText(text).build(); } - protected McpSchema.CallToolResult success(String text, Map structured) { + protected McpSchema.CallToolResult success(final String text, final Map structured) { return new CallToolResultBuilder() .addText(text) .structuredContent(structured) .build(); } - protected McpSchema.CallToolResult successResult(Object resultValue) { + protected McpSchema.CallToolResult successResult(final Object resultValue) { return success(String.valueOf(resultValue), Map.of("result", resultValue)); } - protected McpSchema.CallToolResult error(String text) { + protected McpSchema.CallToolResult error(final String text) { return new CallToolResultBuilder().isError(true).addText(text).build(); } } diff --git a/src/main/java/mcp/tools/helper/AnnotationsBuilder.java b/src/main/java/mcp/tools/helper/AnnotationsBuilder.java index aad113b..2b874b1 100644 --- a/src/main/java/mcp/tools/helper/AnnotationsBuilder.java +++ b/src/main/java/mcp/tools/helper/AnnotationsBuilder.java @@ -10,32 +10,32 @@ public class AnnotationsBuilder { private Boolean openWorldHint; private Boolean returnDirect; - public AnnotationsBuilder title(String title) { + public AnnotationsBuilder title(final String title) { this.title = title; return this; } - public AnnotationsBuilder readOnlyHint(Boolean readOnlyHint) { + public AnnotationsBuilder readOnlyHint(final Boolean readOnlyHint) { this.readOnlyHint = readOnlyHint; return this; } - public AnnotationsBuilder destructiveHint(Boolean destructiveHint) { + public AnnotationsBuilder destructiveHint(final Boolean destructiveHint) { this.destructiveHint = destructiveHint; return this; } - public AnnotationsBuilder idempotentHint(Boolean idempotentHint) { + public AnnotationsBuilder idempotentHint(final Boolean idempotentHint) { this.idempotentHint = idempotentHint; return this; } - public AnnotationsBuilder openWorldHint(Boolean openWorldHint) { + public AnnotationsBuilder openWorldHint(final Boolean openWorldHint) { this.openWorldHint = openWorldHint; return this; } - public AnnotationsBuilder returnDirect(Boolean returnDirect) { + public AnnotationsBuilder returnDirect(final Boolean returnDirect) { this.returnDirect = returnDirect; return this; } diff --git a/src/main/java/mcp/tools/helper/CallToolResultBuilder.java b/src/main/java/mcp/tools/helper/CallToolResultBuilder.java index df73152..198cce6 100644 --- a/src/main/java/mcp/tools/helper/CallToolResultBuilder.java +++ b/src/main/java/mcp/tools/helper/CallToolResultBuilder.java @@ -11,22 +11,22 @@ public class CallToolResultBuilder { private Map meta; private Map structuredContent; - public CallToolResultBuilder isError(boolean isError) { + public CallToolResultBuilder isError(final boolean isError) { this.isError = isError; return this; } - public CallToolResultBuilder addText(String text) { + public CallToolResultBuilder addText(final String text) { this.content.add(new McpSchema.TextContent(text)); return this; } - public CallToolResultBuilder meta(Map meta) { + public CallToolResultBuilder meta(final Map meta) { this.meta = meta; return this; } - public CallToolResultBuilder structuredContent(Map structuredContent) { + public CallToolResultBuilder structuredContent(final Map structuredContent) { this.structuredContent = structuredContent; return this; } diff --git a/src/main/java/mcp/tools/helper/QueryValidator.java b/src/main/java/mcp/tools/helper/QueryValidator.java index fafd9dd..afc9a3b 100644 --- a/src/main/java/mcp/tools/helper/QueryValidator.java +++ b/src/main/java/mcp/tools/helper/QueryValidator.java @@ -15,5 +15,5 @@ public interface QueryValidator { * @param arguments The tool arguments to validate. * @return A {@link Result} indicating success (Ok(null)) or failure (Err(exception)). */ - Result validate(McpSchema.JsonSchema schema, Map arguments); + Result validate(final McpSchema.JsonSchema schema, final Map arguments); } diff --git a/src/main/java/mcp/tools/helper/SchemaBuilder.java b/src/main/java/mcp/tools/helper/SchemaBuilder.java index 4b5a3dc..9d870af 100644 --- a/src/main/java/mcp/tools/helper/SchemaBuilder.java +++ b/src/main/java/mcp/tools/helper/SchemaBuilder.java @@ -14,13 +14,13 @@ public class SchemaBuilder { private final Map definitions = new HashMap<>(); private final Map defs = new HashMap<>(); - public SchemaBuilder type(String type) { + public SchemaBuilder type(final String type) { this.type = type; return this; } - public SchemaBuilder addProperty(String name, String type, String description) { - Map prop = new HashMap<>(); + public SchemaBuilder addProperty(final String name, final String type, final String description) { + final Map prop = new HashMap<>(); prop.put("type", type); if (description != null) { prop.put("description", description); @@ -29,17 +29,17 @@ public class SchemaBuilder { return this; } - public SchemaBuilder required(String... names) { + public SchemaBuilder required(final String... names) { required.addAll(Arrays.asList(names)); return this; } - public SchemaBuilder additionalProperties(Boolean additionalProperties) { + public SchemaBuilder additionalProperties(final Boolean additionalProperties) { this.additionalProperties = additionalProperties; return this; } - public SchemaBuilder returns(String type, String description) { + public SchemaBuilder returns(final String type, final String description) { return this.type("object") .addProperty("result", type, description); } @@ -56,7 +56,7 @@ public class SchemaBuilder { } public Map buildMap() { - Map map = new HashMap<>(); + final Map map = new HashMap<>(); map.put("type", type); if (!properties.isEmpty()) { map.put("properties", properties); diff --git a/src/main/java/mcp/tools/helper/ToolQueryValidator.java b/src/main/java/mcp/tools/helper/ToolQueryValidator.java index 42be045..06822e3 100644 --- a/src/main/java/mcp/tools/helper/ToolQueryValidator.java +++ b/src/main/java/mcp/tools/helper/ToolQueryValidator.java @@ -22,7 +22,7 @@ public class ToolQueryValidator { * * @param validator The validator to add. */ - public void addValidator(QueryValidator validator) { + public void addValidator(final QueryValidator validator) { validators.add(validator); } @@ -33,12 +33,12 @@ public class ToolQueryValidator { * @param arguments The arguments passed to the tool. * @return A {@link Result} indicating success or failure. */ - public Result validate(McpSchema.JsonSchema schema, Map arguments) { + public Result validate(final McpSchema.JsonSchema schema, final Map arguments) { if (schema == null) { return Result.Ok(null); } - for (QueryValidator validator : validators) { - Result result = validator.validate(schema, arguments); + for (final QueryValidator validator : validators) { + final Result result = validator.validate(schema, arguments); if (result.isError()) { return result; } @@ -51,32 +51,30 @@ public class ToolQueryValidator { */ private static class SchemaConformityValidator implements QueryValidator { @Override - public Result validate(McpSchema.JsonSchema schema, Map arguments) { - // Check required fields - List requiredFields = schema.required(); + public Result validate(final McpSchema.JsonSchema schema, final Map arguments) { + final List requiredFields = schema.required(); if (requiredFields != null) { - for (String field : requiredFields) { + for (final String field : requiredFields) { if (arguments == null || !arguments.containsKey(field) || arguments.get(field) == null) { return Result.Err(new IllegalArgumentException("Missing required argument: " + field)); } } } - // Check types if properties are defined - Map properties = schema.properties(); + final Map properties = schema.properties(); if (properties != null && arguments != null) { - for (Map.Entry entry : arguments.entrySet()) { - String argName = entry.getKey(); - Object argValue = entry.getValue(); + for (final Map.Entry entry : arguments.entrySet()) { + final String argName = entry.getKey(); + final Object argValue = entry.getValue(); if (properties.containsKey(argName)) { - Object propSchemaObj = properties.get(argName); + final Object propSchemaObj = properties.get(argName); if (propSchemaObj instanceof Map) { @SuppressWarnings("unchecked") - Map propSchema = (Map) propSchemaObj; - Object expectedType = propSchema.get("type"); + final Map propSchema = (Map) propSchemaObj; + final Object expectedType = propSchema.get("type"); if (expectedType instanceof String) { - Result typeResult = validateType((String) expectedType, argValue, argName); + final Result typeResult = validateType((String) expectedType, argValue, argName); if (typeResult.isError()) { return typeResult; } @@ -89,12 +87,12 @@ public class ToolQueryValidator { return Result.Ok(null); } - private Result validateType(String expectedType, Object value, String fieldName) { + private Result validateType(final String expectedType, final Object value, final String fieldName) { if (value == null) { return Result.Ok(null); } - boolean valid = switch (expectedType) { + final boolean valid = switch (expectedType) { case "string" -> value instanceof String; case "number" -> value instanceof Number; case "integer" -> isInteger(value); @@ -112,7 +110,7 @@ public class ToolQueryValidator { return Result.Ok(null); } - private boolean isInteger(Object value) { + private boolean isInteger(final Object value) { if (value instanceof Integer || value instanceof Long || value instanceof Short || value instanceof Byte) { return true; } diff --git a/src/main/java/mcp/util/Option.java b/src/main/java/mcp/util/Option.java index 99bc57d..e2075c3 100644 --- a/src/main/java/mcp/util/Option.java +++ b/src/main/java/mcp/util/Option.java @@ -20,16 +20,16 @@ public sealed interface Option permits Some, None { }; } - default T unwrapOr(T defaultValue) { + default T unwrapOr(final T defaultValue) { return isSome() ? unwrap() : defaultValue; } - default T unwrapOrElse(Supplier supplier) { + default T unwrapOrElse(final Supplier supplier) { return isSome() ? unwrap() : supplier.get(); } @SuppressWarnings("unchecked") - default Option map(Function mapper) { + default Option map(final Function mapper) { return switch (this) { case Some some -> new Some<>(mapper.apply(some.value())); case None none -> (None) none; @@ -37,7 +37,7 @@ public sealed interface Option permits Some, None { } @SuppressWarnings("unchecked") - default Option flatMap(Function> mapper) { + default Option flatMap(final Function> mapper) { return switch (this) { case Some some -> mapper.apply(some.value()); case None none -> (None) none; @@ -48,15 +48,15 @@ public sealed interface Option permits Some, None { return isSome() ? Optional.of(unwrap()) : Optional.empty(); } - default Option filter(java.util.function.Predicate predicate) { + default Option filter(final java.util.function.Predicate predicate) { return isSome() && predicate.test(unwrap()) ? this : none(); } - default Option or(Option alternative) { + default Option or(final Option alternative) { return isSome() ? this : alternative; } - default Option orElse(Supplier> supplier) { + default Option orElse(final Supplier> supplier) { return isSome() ? this : supplier.get(); } @@ -64,11 +64,11 @@ public sealed interface Option permits Some, None { return isSome() ? Result.Ok(unwrap()) : Result.Err(error); } - default Result okOrElse(Supplier errorSupplier) { + default Result okOrElse(final Supplier errorSupplier) { return isSome() ? Result.Ok(unwrap()) : Result.Err(errorSupplier.get()); } - static Option some(T value) { + static Option some(final T value) { return new Some<>(value); } @@ -76,7 +76,7 @@ public sealed interface Option permits Some, None { return new None<>(); } - static Option ofNullable(T value) { + static Option ofNullable(final T value) { return value == null ? none() : some(value); } } diff --git a/src/main/java/mcp/util/Result.java b/src/main/java/mcp/util/Result.java index 6a0387c..f1146ed 100644 --- a/src/main/java/mcp/util/Result.java +++ b/src/main/java/mcp/util/Result.java @@ -19,10 +19,10 @@ public sealed interface Result permits Err, Ok { }; } - default E unwrapOrElse(E defaultValue) { + default E unwrapOrElse(final E defaultValue) { try { return isError() ? defaultValue : unwrap(); - } catch (Throwable e) { + } catch (final Throwable e) { return defaultValue; } } @@ -30,7 +30,7 @@ public sealed interface Result permits Err, Ok { default Optional toOptional() { try { return isError() ? Optional.empty() : Optional.of(unwrap()); - } catch (Throwable e) { + } catch (final Throwable e) { return Optional.empty(); } } @@ -38,19 +38,19 @@ public sealed interface Result permits Err, Ok { default Option toOption() { return switch (this) { case Ok ok -> Option.some(ok.value()); - case Err err -> Option.none(); + case Err ignored -> Option.none(); }; } default Option err() { return switch (this) { - case Ok ok -> Option.none(); + case Ok ignored -> Option.none(); case Err err -> Option.some(err.throwable()); }; } @SuppressWarnings("unchecked") - default Result map(java.util.function.Function mapper) { + default Result map(final java.util.function.Function mapper) { return switch (this) { case Ok ok -> new Ok<>(mapper.apply(ok.value())); case Err err -> (Err) err; @@ -58,7 +58,7 @@ public sealed interface Result permits Err, Ok { } @SuppressWarnings("unchecked") - default Result flatMap(java.util.function.Function> mapper) { + default Result flatMap(final java.util.function.Function> mapper) { return switch (this) { case Ok ok -> mapper.apply(ok.value()); case Err err -> (Err) err; @@ -66,18 +66,18 @@ public sealed interface Result permits Err, Ok { } @SuppressWarnings("unchecked") - default Result mapError(java.util.function.Function mapper) { + default Result mapError(final java.util.function.Function mapper) { return switch (this) { case Ok ok -> (Ok) ok; case Err err -> new Err<>(mapper.apply(err.throwable())); }; } - static Result Ok(E value) { + static Result Ok(final E value) { return new Ok<>(value); } - static Result Err(T throwable) { + static Result Err(final T throwable) { return new Err<>(throwable); } }