You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by fm...@apache.org on 2026/02/17 13:01:18 UTC
(camel) 03/05: camel mcp - improve catalog descriptions and add fallback strategies
This is an automated email from the ASF dual-hosted git repository.
fmariani pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 137ac2420d9549bf94852666e09c392c98fa8cfa
Author: Croway <fe...@gmail.com>
AuthorDate: Mon Feb 16 18:18:26 2026 +0100
camel mcp - improve catalog descriptions and add fallback strategies
---
.../dsl/jbang/core/commands/mcp/CatalogTools.java | 46 +++++++++++++++++++---
1 file changed, 41 insertions(+), 5 deletions(-)
diff --git a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogTools.java b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogTools.java
index 983d1e8da63c..bab82da3b9ed 100644
--- a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogTools.java
+++ b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogTools.java
@@ -57,7 +57,10 @@ public class CatalogTools {
@ToolArg(description = "Filter by category label (e.g., cloud, messaging, database, file)") String label,
@ToolArg(description = "Maximum number of results to return (default: 50)") Integer limit,
@ToolArg(description = "Runtime type: main, spring-boot, or quarkus (default: main)") String runtime,
- @ToolArg(description = "Specific Camel version to query (e.g., 4.4.0). If not specified, uses the default catalog version.") String camelVersion) {
+ @ToolArg(description = "Version to query. For Main or Spring Boot: the Camel version (e.g., 4.17.0). "
+ + "For quarkus: the Quarkus Platform version (e.g., 3.31.3) as returned by "
+ + "camel_version_list quarkusVersion field. "
+ + "If not specified, uses the default catalog version.") String camelVersion) {
int maxResults = limit != null ? limit : 50;
@@ -77,8 +80,13 @@ public class CatalogTools {
} catch (ToolCallException e) {
throw e;
} catch (Throwable e) {
- throw new ToolCallException(
- "Failed to list components (" + e.getClass().getName() + "): " + e.getMessage(), null);
+ String hint = "";
+ if ("quarkus".equalsIgnoreCase(runtime) && camelVersion != null) {
+ hint = " Note: For Quarkus runtime, the version parameter must be the Quarkus Platform version "
+ + "(e.g., 3.31.3) as returned by camel_version_list quarkusVersion field, "
+ + "not the Camel core version. You passed: " + camelVersion;
+ }
+ throw new ToolCallException("Failed to list components: " + e.getMessage() + hint, e);
}
}
@@ -90,7 +98,10 @@ public class CatalogTools {
public ComponentDetailResult camel_catalog_component_doc(
@ToolArg(description = "Component name (e.g., kafka, http, file, timer)") String component,
@ToolArg(description = "Runtime type: main, spring-boot, or quarkus (default: main)") String runtime,
- @ToolArg(description = "Specific Camel version to query (e.g., 4.4.0). If not specified, uses the default catalog version.") String camelVersion) {
+ @ToolArg(description = "Version to query. For Main or Spring Boot: the Camel version (e.g., 4.17.0). "
+ + "For quarkus: the Quarkus Platform version (e.g., 3.31.3) as returned by "
+ + "camel_version_list quarkusVersion field. "
+ + "If not specified, uses the default catalog version.") String camelVersion) {
if (component == null || component.isBlank()) {
throw new ToolCallException("Component name is required", null);
@@ -100,7 +111,32 @@ public class CatalogTools {
CamelCatalog cat = loadCatalog(runtime, camelVersion);
ComponentModel model = cat.componentModel(component);
if (model == null) {
- throw new ToolCallException("Component not found: " + component, null);
+ // Check if it might be a data format or language instead
+ StringBuilder hint = new StringBuilder("Component not found: " + component + ".");
+ DataFormatModel dfModel = cat.dataFormatModel(component);
+ if (dfModel != null) {
+ hint.append(" However, '").append(component).append("' exists as a DATA FORMAT. ")
+ .append("Use camel_catalog_dataformat_doc instead.");
+ } else {
+ // Try partial match in data formats
+ List<String> matchingDf = cat.findDataFormatNames().stream()
+ .filter(n -> n.contains(component) || component.contains(n))
+ .collect(Collectors.toList());
+ if (!matchingDf.isEmpty()) {
+ hint.append(" Did you mean one of these DATA FORMATS? ").append(matchingDf)
+ .append(". Use camel_catalog_dataformat_doc instead.");
+ } else {
+ // Try partial match in components
+ List<String> matchingComp = findComponentNames(cat).stream()
+ .filter(n -> n.contains(component) || component.contains(n))
+ .limit(5)
+ .collect(Collectors.toList());
+ if (!matchingComp.isEmpty()) {
+ hint.append(" Did you mean one of these components? ").append(matchingComp);
+ }
+ }
+ }
+ throw new ToolCallException(hint.toString(), null);
}
return toComponentDetailResult(model);