This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch CAMEL-22985 in repository https://gitbox.apache.org/repos/asf/camel.git
commit de88527bd014de3334972f1c5cd170a00487fcf7 Author: Andrea Cosentino <[email protected]> AuthorDate: Thu Feb 12 10:06:41 2026 +0100 CAMEL-22985 - camel-jbang-mcp - Add tool for yaml-dsl-validator Signed-off-by: Andrea Cosentino <[email protected]> --- .../modules/ROOT/pages/camel-jbang-mcp.adoc | 25 +++++++++- dsl/camel-jbang/camel-jbang-mcp/pom.xml | 6 +++ .../jbang/core/commands/mcp/TransformTools.java | 54 ++++++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-mcp.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-mcp.adoc index 0aa2857fb6b0..32438585bf9c 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-jbang-mcp.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-mcp.adoc @@ -24,7 +24,7 @@ By default, the HTTP server is disabled. To enable it, set `quarkus.http.host-en == Available Tools -The server exposes 15 tools organized into six functional areas. +The server exposes 16 tools organized into six functional areas. === Catalog Exploration @@ -109,6 +109,11 @@ The server exposes 15 tools organized into six functional areas. | Validates Camel endpoint URIs against the catalog schema. Catches unknown options, missing required parameters, invalid enum values, and type mismatches. Also provides suggestions for misspelled option names. +| `camel_validate_yaml_dsl` +| Validates a YAML DSL route definition against the Camel YAML DSL JSON schema. Checks for valid DSL elements, + correct route structure, and returns detailed schema validation errors including instance path, error type, + and schema path. + | `camel_transform_route` | Assists with route DSL format transformation between YAML and XML. |=== @@ -273,6 +278,24 @@ Validate this Kafka endpoint: kafka:myTopic?brkers=localhost:9092&groupId=myGrou The assistant calls `camel_validate_route` and detects the typo (`brkers`), reports the URI as invalid, and suggests the correct option name (`brokers`). +=== Validating YAML DSL Structure + +---- +Validate this YAML route definition for me: + +- route: + from: + uri: timer:yaml + steps: + - setCheese: + simple: Hello Camel + - log: ${body} +---- + +The assistant calls `camel_validate_yaml_dsl` which validates the route against the Camel YAML DSL JSON schema +and reports that `setCheese` is not a valid DSL element, returning the instance path and error type so the AI +can suggest the correct processor name (e.g., `setBody`). + === Understanding a Route Paste a route and ask: diff --git a/dsl/camel-jbang/camel-jbang-mcp/pom.xml b/dsl/camel-jbang/camel-jbang-mcp/pom.xml index 5b6998c20d45..f507a62c08ec 100644 --- a/dsl/camel-jbang/camel-jbang-mcp/pom.xml +++ b/dsl/camel-jbang/camel-jbang-mcp/pom.xml @@ -86,6 +86,12 @@ <artifactId>camel-jbang-core</artifactId> </dependency> + <!-- Camel YAML DSL Validator for schema validation --> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-yaml-dsl-validator</artifactId> + </dependency> + <!-- test dependencies --> <dependency> <groupId>io.quarkus</groupId> diff --git a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TransformTools.java b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TransformTools.java index 19ee6a216386..be69d593818a 100644 --- a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TransformTools.java +++ b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TransformTools.java @@ -16,6 +16,8 @@ */ package org.apache.camel.dsl.jbang.core.commands.mcp; +import java.io.File; +import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -23,12 +25,14 @@ import java.util.Map; import jakarta.enterprise.context.ApplicationScoped; +import com.networknt.schema.ValidationMessage; import io.quarkiverse.mcp.server.Tool; import io.quarkiverse.mcp.server.ToolArg; import io.quarkiverse.mcp.server.ToolCallException; import org.apache.camel.catalog.CamelCatalog; import org.apache.camel.catalog.DefaultCamelCatalog; import org.apache.camel.catalog.EndpointValidationResult; +import org.apache.camel.dsl.yaml.validator.YamlValidator; /** * MCP Tools for validating and transforming Camel routes using Quarkus MCP Server. @@ -37,6 +41,7 @@ import org.apache.camel.catalog.EndpointValidationResult; public class TransformTools { private final CamelCatalog catalog; + private YamlValidator yamlValidator; public TransformTools() { this.catalog = new DefaultCamelCatalog(true); @@ -150,6 +155,49 @@ public class TransformTools { return result; } + /** + * Tool to validate a YAML DSL route definition against the Camel YAML DSL JSON schema. + */ + @Tool(description = "Validate a YAML DSL route definition against the Camel YAML DSL JSON schema. " + + "Checks for valid DSL elements, correct route structure, and returns detailed schema validation errors.") + public YamlDslValidationResult camel_validate_yaml_dsl( + @ToolArg(description = "YAML DSL route definition to validate") String route) { + + if (route == null || route.isBlank()) { + throw new ToolCallException("'route' parameter is required", null); + } + + try { + if (yamlValidator == null) { + yamlValidator = new YamlValidator(); + yamlValidator.init(); + } + + File tempFile = File.createTempFile("camel-validate-", ".yaml"); + try { + Files.writeString(tempFile.toPath(), route); + List<ValidationMessage> messages = yamlValidator.validate(tempFile); + + List<YamlDslError> errors = null; + if (!messages.isEmpty()) { + errors = messages.stream() + .map(m -> new YamlDslError( + m.getMessage(), + m.getInstanceLocation() != null ? m.getInstanceLocation().toString() : null, + m.getType(), + m.getSchemaLocation() != null ? m.getSchemaLocation().toString() : null)) + .toList(); + } + + return new YamlDslValidationResult(messages.isEmpty(), messages.size(), errors); + } finally { + tempFile.delete(); + } + } catch (Exception e) { + throw new ToolCallException("Failed to validate YAML DSL: " + e.getMessage(), e); + } + } + /** * Extract endpoint URIs from a YAML route definition. */ @@ -213,4 +261,10 @@ public class TransformTools { public boolean supported; public String recommendation; } + + public record YamlDslValidationResult(boolean valid, int numberOfErrors, List<YamlDslError> errors) { + } + + public record YamlDslError(String error, String instancePath, String type, String schemaPath) { + } }
