This is an automated email from the ASF dual-hosted git repository.

Croway pushed a commit to branch camel-4.22.x
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/camel-4.22.x by this push:
     new 4706410947ab [4.22.x] camel-jbang-mcp - optional tool arguments, blank 
and non-version catalog arguments (#27512)
4706410947ab is described below

commit 4706410947abcc8126ba3ca7347af0abc1026a0c
Author: Federico Mariani <[email protected]>
AuthorDate: Thu Oct 8 09:02:12 2026 +0200

    [4.22.x] camel-jbang-mcp - optional tool arguments, blank and non-version 
catalog arguments (#27512)
    
    * camel-jbang-mcp - optional tool arguments, blank and non-version catalog 
arguments on 4.22.x
    
    The catalog tools and the other tools taking runtime, camelVersion and 
platformBom declared them required: an
    assistant without a platform BOM sent an empty one, which failed with 
"platformBom must be in GAV format", and
    omitting it failed with "Missing required argument". On main this is fixed 
as part of the shared authoring tools;
    this is the targeted fix for 4.22.x.
    
    - runtime, camelVersion, platformBom, filter, label, limit, level and 
nameOrPid are optional where the tool handles
      them being absent, as are the arguments documented as optional or with a 
default (144 arguments).
    - The catalog resolution from main: a blank platformBom or camelVersion 
means none, a camelVersion that is not a
      version (main, latest) or the version in use is the default catalog, a 
version that cannot be downloaded falls
      back to the default catalog for the main runtime.
    - With the main runtime, a platformBom that is not an org.apache.camel GAV 
is ignored instead of failing the call.
    - camel_runtime_memory_leak records in dual mode when mode is omitted, as 
documented.
    
    Co-Authored-By: Claude Opus 5.5 <[email protected]>
    
    * camel-jbang-mcp - more tool arguments the tools handle when absent are 
optional
    
    Review follow-up: arguments the tool already handles when absent (a null 
check with a default, or no filtering) but
    still declared required (20): documentProcessor and documentSource of 
camel_ai_pipeline_scaffold, filter and type of
    camel_catalog_kamelets, duration and minSize of camel_runtime_memory_leak, 
width and ignoreLoadingError of
    camel_render_route_diagram, routes of the dependency tools, javaVersion of 
the migration tools, routeId of the route
    dump, structure and processor detail tools (all routes), body and headers 
of camel_runtime_send, the boolean flags
    of the topology and processor detail tools, and fromVersion of 
camel_version_list.
    
    Co-Authored-By: Claude Opus 5.5 <[email protected]>
    
    ---------
    
    Co-authored-by: Claude Opus 5.5 <[email protected]>
---
 .../dsl/jbang/core/commands/mcp/AdvisoryTools.java |   8 +-
 .../core/commands/mcp/AiPipelineScaffoldTools.java |  12 ++-
 .../dsl/jbang/core/commands/mcp/AiTraceTools.java  |   5 +-
 .../jbang/core/commands/mcp/CatalogService.java    |  46 ++++++++-
 .../dsl/jbang/core/commands/mcp/CatalogTools.java  |  82 ++++++++--------
 .../commands/mcp/ComponentPropertiesTools.java     |   6 +-
 .../commands/mcp/ConfigurationValidateTools.java   |   6 +-
 .../core/commands/mcp/DependencyCheckTools.java    |  12 ++-
 .../commands/mcp/DependencySecurityAuditTools.java |  12 ++-
 .../dsl/jbang/core/commands/mcp/DiagnoseTools.java |   6 +-
 .../dsl/jbang/core/commands/mcp/ExampleTools.java  |   8 +-
 .../dsl/jbang/core/commands/mcp/ExplainTools.java  |   8 +-
 .../dsl/jbang/core/commands/mcp/HardenTools.java   |   8 +-
 .../dsl/jbang/core/commands/mcp/KameletTools.java  |  13 ++-
 .../jbang/core/commands/mcp/MigrationTools.java    |  14 +--
 .../commands/mcp/MigrationWildflyKarafTools.java   |   6 +-
 .../dsl/jbang/core/commands/mcp/OpenApiTools.java  |   9 +-
 .../core/commands/mcp/RouteCostEstimateTools.java  |  12 ++-
 .../jbang/core/commands/mcp/RouteDiagramTools.java |  22 +++--
 .../dsl/jbang/core/commands/mcp/RuntimeTools.java  | 106 ++++++++++++---------
 .../jbang/core/commands/mcp/SecurityScanTools.java |   2 +-
 .../jbang/core/commands/mcp/TestScaffoldTools.java |   8 +-
 .../jbang/core/commands/mcp/TransformTools.java    |   6 +-
 .../dsl/jbang/core/commands/mcp/VersionTools.java  |   8 +-
 .../jbang/core/commands/mcp/CatalogToolsTest.java  |  35 ++++++-
 25 files changed, 290 insertions(+), 170 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AdvisoryTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AdvisoryTools.java
index 1fd76914592c..5c8ca4127954 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AdvisoryTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AdvisoryTools.java
@@ -50,12 +50,14 @@ public class AdvisoryTools {
                         + "advisories published after this Camel version was 
released are not included - check the "
                         + "web page for the very latest.")
     public AdvisoriesResult camel_security_advisories(
-            @ToolArg(description = "Camel version to check, e.g. 4.10.1 
(optional)") String camelVersion,
+            @ToolArg(description = "Camel version to check, e.g. 4.10.1 
(optional)", required = false) String camelVersion,
             @ToolArg(description = "Component to filter by, e.g. kafka or 
camel-kafka (optional; best-effort match "
                                    + "against components named in the advisory 
text - older advisories may not name "
-                                   + "components)") String component,
+                                   + "components)",
+                     required = false) String component,
             @ToolArg(description = "Severity to filter by: LOW, MEDIUM, HIGH, 
or CRITICAL "
-                                   + "(optional)") String severity) {
+                                   + "(optional)",
+                     required = false) String severity) {
         try {
             List<SecurityAdvisoryModel> advisories = 
advisoryService.advisories();
             List<AdvisoryService.AdvisoryView> matches
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AiPipelineScaffoldTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AiPipelineScaffoldTools.java
index 1a392ff181dd..c145e110dfdb 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AiPipelineScaffoldTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AiPipelineScaffoldTools.java
@@ -42,14 +42,18 @@ public class AiPipelineScaffoldTools {
     public ScaffoldResult camel_ai_pipeline_scaffold(
             @ToolArg(description = "Pipeline type: summarization, extraction, 
rag, or classification") String pipelineType,
             @ToolArg(description = "Document processor: docling (open-source, 
default), textract (AWS), "
-                                   + "or combined (Docling for text + Textract 
for tables)") String documentProcessor,
+                                   + "or combined (Docling for text + Textract 
for tables)",
+                     required = false) String documentProcessor,
             @ToolArg(description = "Document source: file (local path, 
default), s3 (AWS S3 bucket), "
-                                   + "or url (HTTP/HTTPS URL)") String 
documentSource,
+                                   + "or url (HTTP/HTTPS URL)",
+                     required = false) String documentSource,
             @ToolArg(description = "Bedrock model ID (default: Claude Sonnet 
4). "
                                    + "Examples: 
anthropic.claude-sonnet-4-20250514-v1:0, "
                                    + "anthropic.claude-opus-4-20250514-v1:0, "
-                                   + "amazon.nova-pro-v1:0") String modelId,
-            @ToolArg(description = "AWS region for Bedrock and Textract 
(default: us-east-1)") String region) {
+                                   + "amazon.nova-pro-v1:0",
+                     required = false) String modelId,
+            @ToolArg(description = "AWS region for Bedrock and Textract 
(default: us-east-1)",
+                     required = false) String region) {
 
         if (pipelineType == null || pipelineType.isBlank()) {
             throw new ToolCallException(
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AiTraceTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AiTraceTools.java
index c4597cc8a22c..882aa00c4ae0 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AiTraceTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AiTraceTools.java
@@ -74,8 +74,9 @@ public class AiTraceTools {
                         + "TensorFlow Serving, HuggingFace). "
                         + "Combines message history with processor statistics 
filtered to AI steps.")
     public AiTraceResult camel_runtime_ai_trace(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
-            @ToolArg(description = "Route ID filter (exact match or * for all, 
default: *)") String routeFilter) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
+            @ToolArg(description = "Route ID filter (exact match or * for all, 
default: *)",
+                     required = false) String routeFilter) {
 
         RuntimeService.ProcessInfo p = 
runtimeService.findSingleProcess(nameOrPid);
         ToolContext ctx = new ToolContext();
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogService.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogService.java
index b43153820fdf..38e592f8dd09 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogService.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogService.java
@@ -79,8 +79,21 @@ public class CatalogService {
     public CamelCatalog loadCatalog(String runtime, String camelVersion, 
String platformBom) throws Exception {
         RuntimeType runtimeType = resolveRuntime(runtime);
 
-        boolean hasVersion = camelVersion != null && !camelVersion.isBlank();
+        // "main", "latest", "current" or "default" (what an assistant writes 
when it means the version in use) is
+        // the default catalog, not a version to download
+        boolean hasVersion = camelVersion != null && !camelVersion.isBlank() 
&& !camelVersion.isEmpty()
+                && Character.isDigit(camelVersion.trim().charAt(0));
+        if (hasVersion && sameAsDefault(camelVersion)) {
+            // the version in use (4.23.0 for a 4.23.0-SNAPSHOT build): 
nothing to download
+            hasVersion = false;
+        }
         boolean hasBom = platformBom != null && !platformBom.isBlank();
+        if (hasBom && runtimeType == RuntimeType.main && 
!isCamelGav(platformBom)) {
+            // with the main runtime only a Camel artifact 
(org.apache.camel:camel-bom:<version>) selects a version: a
+            // Spring Boot or Quarkus platform BOM, or a value that is not a 
GAV ("none", "n/a"), does not apply to main
+            // and is ignored rather than failing the call; the answer reports 
the catalog version it used
+            hasBom = false;
+        }
 
         // No version-specific parameters and main runtime -> default catalog
         if (!hasVersion && !hasBom && runtimeType == RuntimeType.main) {
@@ -105,7 +118,7 @@ public class CatalogService {
                 normalizedVersion = platformBomGav.getVersion();
             }
         }
-        if (platformBomGav == null && platformBom != null) {
+        if (platformBomGav == null && hasBom) {
             String[] parts = platformBom.split(":");
             if (parts.length != 3) {
                 throw new ToolCallException(
@@ -121,11 +134,38 @@ public class CatalogService {
             return cached;
         }
 
-        CamelCatalog loaded = doLoadCatalog(runtimeType, camelVersion, 
platformBomGav);
+        CamelCatalog loaded;
+        try {
+            loaded = doLoadCatalog(runtimeType, camelVersion, platformBomGav);
+        } catch (Exception e) {
+            if (runtimeType == RuntimeType.main && hasVersion && !hasBom) {
+                // a version that cannot be downloaded (not released, no 
network): answer from the default catalog
+                // rather than fail the tool call
+                return defaultCatalog;
+            }
+            throw e;
+        }
         cache.putIfAbsent(key, loaded);
         return cache.get(key);
     }
 
+    /** Whether the value is an org.apache.camel groupId:artifactId:version 
GAV. */
+    static boolean isCamelGav(String gav) {
+        String[] parts = gav.trim().split(":");
+        return parts.length == 3 && "org.apache.camel".equals(parts[0].trim()) 
&& !parts[1].isBlank() && !parts[2].isBlank();
+    }
+
+    /** Whether the version is the default catalog's, with or without a 
-SNAPSHOT qualifier. */
+    boolean sameAsDefault(String camelVersion) {
+        String mine = defaultCatalog.getCatalogVersion();
+        if (mine == null) {
+            return false;
+        }
+        String v = camelVersion.trim();
+        return v.equals(mine) || v.equals(mine.replace("-SNAPSHOT", ""))
+                || mine.equals(v.replace("-SNAPSHOT", ""));
+    }
+
     /**
      * Resolve a runtime string to a {@link RuntimeType} enum value.
      *
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 22298f6ee71f..f79340eec30a 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
@@ -53,12 +53,14 @@ public class CatalogTools {
                         + "camel_catalog_component_doc for that). "
                         + "Use filter to search by name, label to filter by 
category.")
     public ComponentListResult camel_catalog_components(
-            @ToolArg(description = "Filter components by name 
(case-insensitive substring match)") String filter,
-            @ToolArg(description = "Filter by category label (e.g., cloud, 
messaging, database, file)") String label,
-            @ToolArg(description = "Maximum number of results to return 
(default: 20)") Integer limit,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.VERSION_QUERY) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = "Filter components by name 
(case-insensitive substring match)",
+                     required = false) String filter,
+            @ToolArg(description = "Filter by category label (e.g., cloud, 
messaging, database, file)",
+                     required = false) String label,
+            @ToolArg(description = "Maximum number of results to return 
(default: 20)", required = false) Integer limit,
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.VERSION_QUERY, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         int maxResults = limit != null ? limit : 20;
 
@@ -106,9 +108,9 @@ public class CatalogTools {
             @ToolArg(description = "Whether to include message headers in the 
response (default: false). "
                                    + "Headers show the CamelXxx header names, 
their Java constants, types, and consumer/producer group.",
                      required = false) Boolean includeHeaders,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.VERSION_QUERY) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.VERSION_QUERY, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (component == null || component.isBlank()) {
             throw new ToolCallException("Component name is required", null);
@@ -165,9 +167,9 @@ public class CatalogTools {
                         + "for adding it as a dependency.")
     public ComponentMavenResult camel_catalog_component_maven(
             @ToolArg(description = "Component name (e.g., kafka, http, file, 
timer)") String component,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.VERSION_QUERY) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.VERSION_QUERY, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (component == null || component.isBlank()) {
             throw new ToolCallException("Component name is required", null);
@@ -199,11 +201,11 @@ public class CatalogTools {
           description = "List available Camel data formats for 
marshalling/unmarshalling " +
                         "(e.g., json, xml, csv, avro, protobuf).")
     public DataFormatListResult camel_catalog_dataformats(
-            @ToolArg(description = "Filter by name") String filter,
-            @ToolArg(description = "Maximum results (default: 20)") Integer 
limit,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = "Filter by name", required = false) String 
filter,
+            @ToolArg(description = "Maximum results (default: 20)", required = 
false) Integer limit,
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         int maxResults = limit != null ? limit : 20;
 
@@ -232,10 +234,10 @@ public class CatalogTools {
           description = "List available Camel expression languages " +
                         "(e.g., simple, jsonpath, xpath, groovy, jq).")
     public LanguageListResult camel_catalog_languages(
-            @ToolArg(description = "Filter by name") String filter,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = "Filter by name", required = false) String 
filter,
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         try {
             CamelCatalog cat = catalogService.loadCatalog(runtime, 
camelVersion, platformBom);
@@ -262,9 +264,9 @@ public class CatalogTools {
                         + "Maven coordinates, and configuration parameters.")
     public DataFormatDetailResult camel_catalog_dataformat_doc(
             @ToolArg(description = "Data format name (e.g., json-jackson, 
avro, csv, protobuf, jaxb)") String dataformat,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (dataformat == null || dataformat.isBlank()) {
             throw new ToolCallException("Data format name is required", null);
@@ -296,9 +298,9 @@ public class CatalogTools {
                         + "Maven coordinates, and configuration parameters.")
     public LanguageDetailResult camel_catalog_language_doc(
             @ToolArg(description = "Language name (e.g., simple, jsonpath, 
xpath, jq, groovy)") String language,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (language == null || language.isBlank()) {
             throw new ToolCallException("Language name is required", null);
@@ -330,11 +332,13 @@ public class CatalogTools {
                         "EIPs have aliases for common AI/modern terms (e.g., 
fan-out, scatter-gather, retry, dedup). " +
                         "Filter also matches aliases with dash normalization 
(fan-out, fanout, fanOut all match).")
     public EipListResult camel_catalog_eips(
-            @ToolArg(description = "Filter by name, title, description, or 
alias (e.g., fan-out, dedup, rate-limit)") String filter,
-            @ToolArg(description = "Filter by category (e.g., routing, 
transformation, error handling)") String label,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = "Filter by name, title, description, or 
alias (e.g., fan-out, dedup, rate-limit)",
+                     required = false) String filter,
+            @ToolArg(description = "Filter by category (e.g., routing, 
transformation, error handling)",
+                     required = false) String label,
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         try {
             CamelCatalog cat = catalogService.loadCatalog(runtime, 
camelVersion, platformBom);
@@ -361,9 +365,9 @@ public class CatalogTools {
           description = "Get detailed documentation for a Camel EIP 
(Enterprise Integration Pattern).")
     public EipDetailResult camel_catalog_eip_doc(
             @ToolArg(description = "EIP name (e.g., split, aggregate, choice, 
filter)") String eip,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (eip == null || eip.isBlank()) {
             throw new ToolCallException("EIP name is required", null);
@@ -399,9 +403,9 @@ public class CatalogTools {
                         + "with usage examples, code snippets, and best 
practices. "
                         + "Only available from Camel 4.22 onwards.")
     public DocListResult camel_catalog_docs(
-            @ToolArg(description = "Filter page names by substring 
(case-insensitive)") String filter,
-            @ToolArg(description = "Maximum number of results to return 
(default: 50)") Integer limit,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion) {
+            @ToolArg(description = "Filter page names by substring 
(case-insensitive)", required = false) String filter,
+            @ToolArg(description = "Maximum number of results to return 
(default: 50)", required = false) Integer limit,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion) {
 
         int maxResults = limit != null ? limit : 50;
 
@@ -451,7 +455,7 @@ public class CatalogTools {
     public DocResult camel_catalog_doc(
             @ToolArg(description = "Documentation page name without .adoc 
extension "
                                    + "(e.g., 'kafka-component', 'split-eip', 
'simple-language', 'jackson-dataformat')") String name,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion) {
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion) {
 
         if (name == null || name.isBlank()) {
             throw new ToolCallException("Documentation page name is required", 
null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ComponentPropertiesTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ComponentPropertiesTools.java
index 3b14f515aee2..f285ddd0409b 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ComponentPropertiesTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ComponentPropertiesTools.java
@@ -53,9 +53,9 @@ public class ComponentPropertiesTools {
                         "component-level defaults via the same prefix in 
application.properties.")
     public ComponentPropertiesResult camel_component_properties(
             @ToolArg(description = "Component name / scheme (e.g., kafka, 
http, file, timer)") String component,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.VERSION_QUERY) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.VERSION_QUERY, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (component == null || component.isBlank()) {
             throw new ToolCallException("Component name is required", null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ConfigurationValidateTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ConfigurationValidateTools.java
index 8bff50d125c9..de13bfd8647b 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ConfigurationValidateTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ConfigurationValidateTools.java
@@ -57,9 +57,9 @@ public class ConfigurationValidateTools {
     public ConfigurationValidateResult camel_configuration_validate(
             @ToolArg(description = "Configuration property lines to validate. 
Can be a single line "
                                    + "(e.g. \"camel.main.streamCaching=true\") 
or multiple lines separated by newlines.") String properties,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (properties == null || properties.isBlank()) {
             throw new ToolCallException("properties argument is required", 
null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DependencyCheckTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DependencyCheckTools.java
index bc5b92da8616..1622dbb21c45 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DependencyCheckTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DependencyCheckTools.java
@@ -60,11 +60,13 @@ public class DependencyCheckTools {
                                    + "IMPORTANT: Avoid including sensitive 
data such as passwords, tokens, or API keys. "
                                    + "Sensitive content is automatically 
detected and masked.") String pomContent,
             @ToolArg(description = "Route definitions (YAML, XML, or Java DSL) 
to check for missing component dependencies. "
-                                   + "Multiple routes can be provided 
concatenated.") String routes,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom,
-            @ToolArg(description = "If true (default), automatically sanitize 
POM content by masking credentials") Boolean sanitizePom) {
+                                   + "Multiple routes can be provided 
concatenated.",
+                     required = false) String routes,
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom,
+            @ToolArg(description = "If true (default), automatically sanitize 
POM content by masking credentials",
+                     required = false) Boolean sanitizePom) {
 
         if (pomContent == null || pomContent.isBlank()) {
             throw new ToolCallException("pomContent is required", null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DependencySecurityAuditTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DependencySecurityAuditTools.java
index f482d0419992..f204062d963f 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DependencySecurityAuditTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DependencySecurityAuditTools.java
@@ -57,11 +57,13 @@ public class DependencySecurityAuditTools {
     public AuditResult camel_dependency_security_audit(
             @ToolArg(description = "The pom.xml file content") String 
pomContent,
             @ToolArg(description = "Route definitions (YAML, XML, or Java DSL) 
to determine which components "
-                                   + "are actually used (for reachability 
analysis)") String routes,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom,
-            @ToolArg(description = "If true (default), mask credentials in POM 
content") Boolean sanitizePom) {
+                                   + "are actually used (for reachability 
analysis)",
+                     required = false) String routes,
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom,
+            @ToolArg(description = "If true (default), mask credentials in POM 
content",
+                     required = false) Boolean sanitizePom) {
 
         if (pomContent == null || pomContent.isBlank()) {
             throw new ToolCallException("pomContent is required", null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DiagnoseTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DiagnoseTools.java
index 6a473a662c5d..75404eeb6ee4 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DiagnoseTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/DiagnoseTools.java
@@ -79,9 +79,9 @@ public class DiagnoseTools {
                         + "ResolveEndpointFailedException, 
FailedToCreateRouteException, and more.")
     public DiagnoseResult camel_error_diagnose(
             @ToolArg(description = "The Camel stack trace or error message to 
diagnose") String error,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (error == null || error.isBlank()) {
             throw new ToolCallException("Error message or stack trace is 
required", null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ExampleTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ExampleTools.java
index c2c2d3d5c6e6..81c1862fa61d 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ExampleTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ExampleTools.java
@@ -43,9 +43,11 @@ public class ExampleTools {
                         + "Use filter to search by name, description, or tag. "
                         + "Use level to filter by difficulty (beginner, 
intermediate, advanced).")
     public ExampleListResult camel_catalog_examples(
-            @ToolArg(description = "Filter examples by name, description, or 
tag (case-insensitive substring match)") String filter,
-            @ToolArg(description = "Filter by difficulty level: beginner, 
intermediate, or advanced") String level,
-            @ToolArg(description = "Maximum number of results to return 
(default: 50)") Integer limit) {
+            @ToolArg(description = "Filter examples by name, description, or 
tag (case-insensitive substring match)",
+                     required = false) String filter,
+            @ToolArg(description = "Filter by difficulty level: beginner, 
intermediate, or advanced",
+                     required = false) String level,
+            @ToolArg(description = "Maximum number of results to return 
(default: 50)", required = false) Integer limit) {
 
         int maxResults = limit != null ? limit : 50;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ExplainTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ExplainTools.java
index 46cbe959d89d..fc7c3584a9a7 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ExplainTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/ExplainTools.java
@@ -52,10 +52,10 @@ public class ExplainTools {
                         "Use this context to understand and explain the 
route.")
     public RouteContextResult camel_route_context(
             @ToolArg(description = "The Camel route content (YAML, XML, or 
Java DSL)") String route,
-            @ToolArg(description = "Route format: yaml, xml, or java (default: 
yaml)") String format,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = "Route format: yaml, xml, or java (default: 
yaml)", required = false) String format,
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (route == null || route.isBlank()) {
             throw new ToolCallException("Route content is required", null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/HardenTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/HardenTools.java
index 7f7bd5213ec1..e2ba938a7666 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/HardenTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/HardenTools.java
@@ -67,10 +67,10 @@ public class HardenTools {
                         "Use this context to provide security hardening 
recommendations for the route.")
     public HardenContextResult camel_route_harden_context(
             @ToolArg(description = "The Camel route content (YAML, XML, or 
Java DSL)") String route,
-            @ToolArg(description = "Route format: yaml, xml, or java (default: 
yaml)") String format,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = "Route format: yaml, xml, or java (default: 
yaml)", required = false) String format,
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (route == null || route.isBlank()) {
             throw new ToolCallException("Route content is required", null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/KameletTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/KameletTools.java
index 3167220bf593..43000d02a0b5 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/KameletTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/KameletTools.java
@@ -46,10 +46,12 @@ public class KameletTools {
                         "Returns kamelet name, type (source, sink, action), 
support level, and description. " +
                         "Use filter to search by name or description, type to 
filter by category.")
     public KameletListResult camel_catalog_kamelets(
-            @ToolArg(description = "Filter kamelets by name or description 
(case-insensitive substring match)") String filter,
-            @ToolArg(description = "Filter by type: source, sink, or action") 
String type,
-            @ToolArg(description = "Maximum number of results to return 
(default: 50)") Integer limit,
-            @ToolArg(description = "Apache Camel Kamelets version. If not 
specified, uses the default version.") String kameletsVersion) {
+            @ToolArg(description = "Filter kamelets by name or description 
(case-insensitive substring match)",
+                     required = false) String filter,
+            @ToolArg(description = "Filter by type: source, sink, or action", 
required = false) String type,
+            @ToolArg(description = "Maximum number of results to return 
(default: 50)", required = false) Integer limit,
+            @ToolArg(description = "Apache Camel Kamelets version. If not 
specified, uses the default version.",
+                     required = false) String kameletsVersion) {
 
         int maxResults = limit != null ? limit : 50;
 
@@ -104,7 +106,8 @@ public class KameletTools {
                         + "dependencies, and usage information.")
     public KameletDetailResult camel_catalog_kamelet_doc(
             @ToolArg(description = "Kamelet name (e.g., aws-s3-source, 
kafka-sink, log-action)") String kamelet,
-            @ToolArg(description = "Apache Camel Kamelets version. If not 
specified, uses the default version.") String kameletsVersion) {
+            @ToolArg(description = "Apache Camel Kamelets version. If not 
specified, uses the default version.",
+                     required = false) String kameletsVersion) {
 
         if (kamelet == null || kamelet.isBlank()) {
             throw new ToolCallException("Kamelet name is required", null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/MigrationTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/MigrationTools.java
index 23b1ec5365fb..3e48180ea377 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/MigrationTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/MigrationTools.java
@@ -58,7 +58,8 @@ public class MigrationTools {
             @ToolArg(description = "The pom.xml file content. "
                                    + "IMPORTANT: Avoid including sensitive 
data such as passwords, tokens, or API keys. "
                                    + "Sensitive content is automatically 
detected and masked.") String pomContent,
-            @ToolArg(description = "If true (default), automatically sanitize 
POM content by masking credentials") Boolean sanitizePom) {
+            @ToolArg(description = "If true (default), automatically sanitize 
POM content by masking credentials",
+                     required = false) Boolean sanitizePom) {
 
         if (pomContent == null || pomContent.isBlank()) {
             throw new ToolCallException("pomContent is required", null);
@@ -114,7 +115,7 @@ public class MigrationTools {
             @ToolArg(description = "Current Camel version (e.g., 3.20.0)") 
String currentVersion,
             @ToolArg(description = "Target Camel version (e.g., 4.18.0)") 
String targetVersion,
             @ToolArg(description = ToolArgDocs.RUNTIME_REQUIRED) String 
runtime,
-            @ToolArg(description = "Current Java version (e.g., 11, 17, 21)") 
String javaVersion) {
+            @ToolArg(description = "Current Java version (e.g., 11, 17, 21)", 
required = false) String javaVersion) {
 
         if (camelComponents == null || camelComponents.isBlank()) {
             throw new ToolCallException("camelComponents is required", null);
@@ -211,11 +212,12 @@ public class MigrationTools {
                         + "BEFORE running the OpenRewrite recipes. If the 
project does not compile, fix the build "
                         + "errors first. OpenRewrite requires a compilable 
project to parse and transform the code.")
     public MigrationRecipesResult camel_migration_recipes(
-            @ToolArg(description = ToolArgDocs.RUNTIME_REQUIRED) String 
runtime,
+            @ToolArg(description = ToolArgDocs.RUNTIME_REQUIRED, required = 
false) String runtime,
             @ToolArg(description = "Current Camel version (e.g., 4.4.0)") 
String currentVersion,
             @ToolArg(description = "Target Camel version (e.g., 4.18.0)") 
String targetVersion,
-            @ToolArg(description = "Current Java version (e.g., 11, 17)") 
String javaVersion,
-            @ToolArg(description = "If true, perform a dry run without making 
changes (default: true)") Boolean dryRun) {
+            @ToolArg(description = "Current Java version (e.g., 11, 17)", 
required = false) String javaVersion,
+            @ToolArg(description = "If true, perform a dry run without making 
changes (default: true)",
+                     required = false) Boolean dryRun) {
 
         if (runtime == null || runtime.isBlank()) {
             throw new ToolCallException("runtime is required", null);
@@ -298,7 +300,7 @@ public class MigrationTools {
     public GuideSearchResult camel_migration_guide_search(
             @ToolArg(description = "Search query — component name, API class, 
method, or keyword "
                                    + "(e.g., direct-vm, getOut, camel-http4, 
ExchangePattern)") String query,
-            @ToolArg(description = "Maximum number of results to return 
(default: 3)") Integer limit) {
+            @ToolArg(description = "Maximum number of results to return 
(default: 3)", required = false) Integer limit) {
 
         if (query == null || query.isBlank()) {
             throw new ToolCallException("query is required", null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/MigrationWildflyKarafTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/MigrationWildflyKarafTools.java
index 5d11a943f7be..3d1c0fd29b08 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/MigrationWildflyKarafTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/MigrationWildflyKarafTools.java
@@ -57,9 +57,11 @@ public class MigrationWildflyKarafTools {
             @ToolArg(description = "The pom.xml file content of the 
WildFly/Karaf project. "
                                    + "IMPORTANT: Avoid including sensitive 
data such as passwords, tokens, or API keys. "
                                    + "Sensitive content is automatically 
detected and masked.") String pomContent,
-            @ToolArg(description = "Target runtime: spring-boot or quarkus 
(default: quarkus)") String targetRuntime,
+            @ToolArg(description = "Target runtime: spring-boot or quarkus 
(default: quarkus)",
+                     required = false) String targetRuntime,
             @ToolArg(description = "Target Camel version (e.g., 4.18.0)") 
String targetVersion,
-            @ToolArg(description = "If true (default), automatically sanitize 
POM content by masking credentials") Boolean sanitizePom) {
+            @ToolArg(description = "If true (default), automatically sanitize 
POM content by masking credentials",
+                     required = false) Boolean sanitizePom) {
 
         if (pomContent == null || pomContent.isBlank()) {
             throw new ToolCallException("pomContent is required", null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/OpenApiTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/OpenApiTools.java
index 8e50784a4beb..74be1de05588 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/OpenApiTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/OpenApiTools.java
@@ -136,10 +136,12 @@ public class OpenApiTools {
     public ScaffoldResult camel_openapi_scaffold(
             @ToolArg(description = "OpenAPI 3.x specification content (JSON or 
YAML string)") String spec,
             @ToolArg(description = "Filename of the OpenAPI spec file as it 
will be referenced at runtime "
-                                   + "(default: 'openapi.json')") String 
specFilename,
+                                   + "(default: 'openapi.json')",
+                     required = false) String specFilename,
             @ToolArg(description = "Behavior when a route is missing for an 
operationId: "
                                    + "'fail' (default, throw error), 'ignore' 
(skip silently), "
-                                   + "or 'mock' (return mock responses)") 
String missingOperation) {
+                                   + "or 'mock' (return mock responses)",
+                     required = false) String missingOperation) {
 
         OpenAPI openAPI = parseSpec(spec);
 
@@ -201,7 +203,8 @@ public class OpenApiTools {
     public MockGuidanceResult camel_openapi_mock_guidance(
             @ToolArg(description = "OpenAPI 3.x specification content (JSON or 
YAML string)") String spec,
             @ToolArg(description = "The missingOperation mode to get guidance 
for: "
-                                   + "'mock' (default), 'fail', or 'ignore'") 
String mode) {
+                                   + "'mock' (default), 'fail', or 'ignore'",
+                     required = false) String mode) {
 
         OpenAPI openAPI = parseSpec(spec);
 
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RouteCostEstimateTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RouteCostEstimateTools.java
index 57e5fd519e3a..65652b8c48e9 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RouteCostEstimateTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RouteCostEstimateTools.java
@@ -64,10 +64,14 @@ public class RouteCostEstimateTools {
                         + "Cost data is approximate based on published AWS 
pricing (2025-Q2).")
     public CostEstimateResult camel_route_cost_estimate(
             @ToolArg(description = "The Camel route definition (YAML or XML)") 
String route,
-            @ToolArg(description = "Expected messages per hour for cost 
projection (default: 100)") Integer messagesPerHour,
-            @ToolArg(description = "Average document pages per message for 
Textract/Docling (default: 5)") Integer avgPages,
-            @ToolArg(description = "Average LLM input tokens per request 
(default: 1000)") Integer avgInputTokens,
-            @ToolArg(description = "Average LLM output tokens per request 
(default: 500)") Integer avgOutputTokens) {
+            @ToolArg(description = "Expected messages per hour for cost 
projection (default: 100)",
+                     required = false) Integer messagesPerHour,
+            @ToolArg(description = "Average document pages per message for 
Textract/Docling (default: 5)",
+                     required = false) Integer avgPages,
+            @ToolArg(description = "Average LLM input tokens per request 
(default: 1000)",
+                     required = false) Integer avgInputTokens,
+            @ToolArg(description = "Average LLM output tokens per request 
(default: 500)",
+                     required = false) Integer avgOutputTokens) {
 
         if (route == null || route.isBlank()) {
             throw new ToolCallException("Route content is required", null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RouteDiagramTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RouteDiagramTools.java
index e7a5bd920ab6..9d4e5a56491d 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RouteDiagramTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RouteDiagramTools.java
@@ -50,19 +50,25 @@ public class RouteDiagramTools {
     public RouteDiagramResult camel_render_route_diagram(
             @ToolArg(description = "Absolute or relative path to the Camel 
route source file (YAML, XML, Java, ...)") String sourceFile,
             @ToolArg(description = "Optional output file path. For image 
themes a PNG is written; for text themes a .txt "
-                                   + "file is written. If not specified, a 
temporary file is created.") String outputFile,
+                                   + "file is written. If not specified, a 
temporary file is created.",
+                     required = false) String outputFile,
             @ToolArg(description = "Color theme: 'dark' (default), 'light', 
'transparent', 'ascii' (plain ASCII art), "
                                    + "'unicode' (box-drawing characters), or a 
custom spec like "
                                    + "'bg=#1e1e1e:from=#2e7d32:to=#1565c0'. "
-                                   + "Use 'ascii' or 'unicode' to get a text 
diagram that can be read directly.") String theme,
+                                   + "Use 'ascii' or 'unicode' to get a text 
diagram that can be read directly.",
+                     required = false) String theme,
             @ToolArg(description = "Optional filter to limit the diagram to 
routes whose route id or source filename "
-                                   + "matches the given pattern (supports 
wildcards)") String filter,
-            @ToolArg(description = "Image width in pixels; 0 (or unset) = auto 
(only used for image themes)") Integer width,
-            @ToolArg(description = "Font size in logical pixels for node text 
(default 12)") Integer fontSize,
-            @ToolArg(description = "Node box width in logical pixels (default 
180)") Integer boxWidth,
+                                   + "matches the given pattern (supports 
wildcards)",
+                     required = false) String filter,
+            @ToolArg(description = "Image width in pixels; 0 (or unset) = auto 
(only used for image themes)",
+                     required = false) Integer width,
+            @ToolArg(description = "Font size in logical pixels for node text 
(default 12)", required = false) Integer fontSize,
+            @ToolArg(description = "Node box width in logical pixels (default 
180)", required = false) Integer boxWidth,
             @ToolArg(description = "What text to display in diagram nodes: 
'code' (default), 'description' (prefer "
-                                   + "description over code if available), or 
'both' (show description and code)") String nodeLabel,
-            @ToolArg(description = "Whether to ignore route loading and 
compilation errors (use with care)") Boolean ignoreLoadingError) {
+                                   + "description over code if available), or 
'both' (show description and code)",
+                     required = false) String nodeLabel,
+            @ToolArg(description = "Whether to ignore route loading and 
compilation errors (use with care)",
+                     required = false) Boolean ignoreLoadingError) {
 
         if (sourceFile == null || sourceFile.isBlank()) {
             throw new ToolCallException("'sourceFile' parameter is required", 
null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RuntimeTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RuntimeTools.java
index 3b0d4652a899..34cc607f756c 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RuntimeTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RuntimeTools.java
@@ -115,77 +115,77 @@ public class RuntimeTools {
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Get Camel context information: name, version, state, 
uptime, route count, exchange statistics.")
     public JsonObject camel_runtime_context(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_context", nameOrPid, Map.of());
     }
 
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "List Camel routes with their state, uptime, messages 
processed, last error, and throughput statistics.")
     public JsonObject camel_runtime_routes(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_routes", nameOrPid, Map.of());
     }
 
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Get health check status for the Camel application.")
     public JsonObject camel_runtime_health(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_health", nameOrPid, Map.of());
     }
 
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "List all endpoints registered in the Camel context 
with their URIs and usage statistics.")
     public JsonObject camel_runtime_endpoints(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_endpoints", nameOrPid, Map.of());
     }
 
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Show currently in-flight exchanges (messages being 
processed).")
     public JsonObject camel_runtime_inflight(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_inflight", nameOrPid, Map.of());
     }
 
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Show blocked exchanges that are stuck or waiting.")
     public JsonObject camel_runtime_blocked(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_blocked", nameOrPid, Map.of());
     }
 
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Show exchange variables in the Camel context.")
     public JsonObject camel_runtime_variables(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_variables", nameOrPid, Map.of());
     }
 
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Show consumer statistics (polling consumers, 
event-driven consumers).")
     public JsonObject camel_runtime_consumers(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_consumers", nameOrPid, Map.of());
     }
 
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Show configuration properties of the running Camel 
application.")
     public JsonObject camel_runtime_properties(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_properties", nameOrPid, Map.of());
     }
 
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Show services registered in the Camel service 
registry.")
     public JsonObject camel_runtime_services(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_services", nameOrPid, Map.of());
     }
 
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Show JVM memory usage (heap/non-heap), garbage 
collection stats, and thread counts.")
     public JsonObject camel_runtime_memory(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_memory", nameOrPid, Map.of());
     }
 
@@ -194,8 +194,8 @@ public class RuntimeTools {
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Get the source code of routes in the running Camel 
application.")
     public JsonObject camel_runtime_route_source(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
-            @ToolArg(description = "Filter source files by name (supports 
wildcards)") String filter) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
+            @ToolArg(description = "Filter source files by name (supports 
wildcards)", required = false) String filter) {
         return delegateToRegistry("get_route_source", nameOrPid,
                 Map.of("filter", filter != null ? filter : "*"));
     }
@@ -203,9 +203,9 @@ public class RuntimeTools {
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Dump route definitions in XML, YAML, or Java DSL 
format.")
     public JsonObject camel_runtime_route_dump(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
-            @ToolArg(description = "Route ID to dump (use * for all routes)") 
String routeId,
-            @ToolArg(description = "Output format: xml, yaml, or java 
(default: yaml)") String format) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
+            @ToolArg(description = "Route ID to dump (use * for all routes)", 
required = false) String routeId,
+            @ToolArg(description = "Output format: xml, yaml, or java 
(default: yaml)", required = false) String format) {
         Map<String, String> args = new HashMap<>();
         args.put("routeId", routeId != null ? routeId : "*");
         args.put("format", format != null ? format : "yaml");
@@ -215,8 +215,8 @@ public class RuntimeTools {
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Show the route structure as a tree of processors.")
     public JsonObject camel_runtime_route_structure(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
-            @ToolArg(description = "Route ID to inspect (use * for all 
routes)") String routeId) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
+            @ToolArg(description = "Route ID to inspect (use * for all 
routes)", required = false) String routeId) {
         return delegateToRegistry("get_route_structure", nameOrPid,
                 Map.of("routeId", routeId != null ? routeId : "*"));
     }
@@ -228,9 +228,10 @@ public class RuntimeTools {
                   Use includeDocs=true to enrich the response with 
documentation from the Camel catalog \
                   for each EIP option and component endpoint option.""")
     public JsonObject camel_runtime_processor_detail(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
-            @ToolArg(description = "Route ID to inspect (use * for all 
routes)") String routeId,
-            @ToolArg(description = "If true, enrich each processor's options 
with documentation from the Camel catalog") Boolean includeDocs) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
+            @ToolArg(description = "Route ID to inspect (use * for all 
routes)", required = false) String routeId,
+            @ToolArg(description = "If true, enrich each processor's options 
with documentation from the Camel catalog",
+                     required = false) Boolean includeDocs) {
         Map<String, String> args = new HashMap<>();
         args.put("routeId", routeId != null ? routeId : "*");
         if (includeDocs != null && includeDocs) {
@@ -266,10 +267,11 @@ public class RuntimeTools {
     @Tool(annotations = @Tool.Annotations(readOnlyHint = false, 
destructiveHint = true, openWorldHint = false),
           description = "Send a test message to a Camel endpoint in the 
running application.")
     public JsonObject camel_runtime_send(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
             @ToolArg(description = "Endpoint URI to send to (e.g., 
direct:myRoute, seda:queue)") String endpoint,
-            @ToolArg(description = "Message body to send") String body,
-            @ToolArg(description = "Message headers as key=value pairs 
separated by newlines") String headers) {
+            @ToolArg(description = "Message body to send", required = false) 
String body,
+            @ToolArg(description = "Message headers as key=value pairs 
separated by newlines",
+                     required = false) String headers) {
         if (endpoint == null || endpoint.isBlank()) {
             throw new ToolCallException("endpoint is required", null);
         }
@@ -287,7 +289,7 @@ public class RuntimeTools {
     @Tool(annotations = @Tool.Annotations(readOnlyHint = false, 
destructiveHint = false, openWorldHint = false),
           description = "Enable, disable, or dump message tracing for the 
running Camel application.")
     public JsonObject camel_runtime_trace(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
             @ToolArg(description = "Action: enable, disable, or dump") String 
action) {
         if (action == null || action.isBlank()) {
             throw new ToolCallException("action is required (enable, disable, 
dump)", null);
@@ -298,7 +300,7 @@ public class RuntimeTools {
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Show top processor statistics: which processors are 
slowest and most active.")
     public JsonObject camel_runtime_top(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_top_processors", nameOrPid, Map.of());
     }
 
@@ -307,7 +309,7 @@ public class RuntimeTools {
                   Evaluate an expression in the given language (e.g., simple, 
jsonpath, xpath) \
                   against the Camel context.""")
     public JsonObject camel_runtime_eval(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
             @ToolArg(description = "Expression language (e.g., simple, 
jsonpath, xpath, jq)") String language,
             @ToolArg(description = "Expression to evaluate") String 
expression) {
         if (language == null || language.isBlank()) {
@@ -327,9 +329,11 @@ public class RuntimeTools {
                   Get the inter-route topology showing how routes connect to 
each other \
                   and to external endpoints. Returns nodes and edges 
describing the route graph.""")
     public JsonObject camel_runtime_route_topology(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
-            @ToolArg(description = "Include live metrics (message counts, 
throughput) on nodes and edges") Boolean metric,
-            @ToolArg(description = "Include external systems (databases, 
messaging brokers, etc.) as nodes") Boolean external) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
+            @ToolArg(description = "Include live metrics (message counts, 
throughput) on nodes and edges",
+                     required = false) Boolean metric,
+            @ToolArg(description = "Include external systems (databases, 
messaging brokers, etc.) as nodes",
+                     required = false) Boolean external) {
         Map<String, String> args = new HashMap<>();
         args.put("metric", metric == null || metric ? "true" : "false");
         args.put("external", external == null || external ? "true" : "false");
@@ -341,14 +345,14 @@ public class RuntimeTools {
                   Get captured routing errors from the running Camel 
application. \
                   Returns error details including exception, exchange context, 
and route information.""")
     public JsonObject camel_runtime_errors(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_errors", nameOrPid, Map.of());
     }
 
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Get a JVM thread dump showing thread names, states, 
and stack traces.")
     public JsonObject camel_runtime_thread_dump(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_thread_dump", nameOrPid, Map.of());
     }
 
@@ -357,7 +361,7 @@ public class RuntimeTools {
                   Get a class-level heap histogram showing instance counts and 
byte usage per class. \
                   Useful for diagnosing memory leaks and understanding which 
classes dominate heap usage.""")
     public JsonObject camel_runtime_heap_histogram(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_heap_histogram", nameOrPid, Map.of());
     }
 
@@ -366,9 +370,11 @@ public class RuntimeTools {
                   Write a heap dump (.hprof) file from a running Camel 
integration for deep memory analysis \
                   with tools like Eclipse MAT, VisualVM, or jhat. The dump is 
written to the process working directory.""")
     public JsonObject camel_runtime_heap_dump(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
-            @ToolArg(description = "File name for the heap dump (without 
.hprof extension). Defaults to heap-dump-<timestamp>") String name,
-            @ToolArg(description = "Whether to dump only live objects (default 
true). Live dumps trigger a GC first") String live) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
+            @ToolArg(description = "File name for the heap dump (without 
.hprof extension). Defaults to heap-dump-<timestamp>",
+                     required = false) String name,
+            @ToolArg(description = "Whether to dump only live objects (default 
true). Live dumps trigger a GC first",
+                     required = false) String live) {
         RuntimeService.ProcessInfo p = 
runtimeService.findSingleProcess(nameOrPid);
         return runtimeService.executeAction(p.pid(), "heap-dump", root -> {
             if (name != null && !name.isBlank()) {
@@ -394,18 +400,24 @@ public class RuntimeTools {
                   Entries with lowConfidence=true have unreliable growth 
percentages due to low sample counts or \
                   sample counts that diverge significantly between runs — 
recommend a longer recording duration.""")
     public JsonObject camel_runtime_memory_leak(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
             @ToolArg(description = "Command: start, stop, status, or query") 
String command,
-            @ToolArg(description = "Recording duration in seconds (only for 
start command, default 60, use 0 for manual stop)") String duration,
-            @ToolArg(description = "Recording mode: dual (default, two 
recordings at Xs and 2Xs with trend comparison) or single (one recording)") 
String mode,
-            @ToolArg(description = "Include allocation stack traces in results 
(default false, set true for detailed analysis)") String stacktrace,
-            @ToolArg(description = "Minimum total size in bytes to include a 
sample (e.g. 1024 for 1KB). Filters out small allocations to reduce noise. 
Default 1024 (1KB) in dual mode") String minSize) {
+            @ToolArg(description = "Recording duration in seconds (only for 
start command, default 60, use 0 for manual stop)",
+                     required = false) String duration,
+            @ToolArg(description = "Recording mode: dual (default, two 
recordings at Xs and 2Xs with trend comparison) or single (one recording)",
+                     required = false) String mode,
+            @ToolArg(description = "Include allocation stack traces in results 
(default false, set true for detailed analysis)",
+                     required = false) String stacktrace,
+            @ToolArg(description = "Minimum total size in bytes to include a 
sample (e.g. 1024 for 1KB). Filters out small allocations to reduce noise. 
Default 1024 (1KB) in dual mode",
+                     required = false) String minSize) {
         if (command == null || command.isBlank()) {
             throw new ToolCallException("command is required (start, stop, 
status, or query)", null);
         }
         RuntimeService.ProcessInfo p = 
runtimeService.findSingleProcess(nameOrPid);
 
-        if ("start".equals(command) && "dual".equalsIgnoreCase(mode)) {
+        // dual is the documented default: an omitted or blank mode records 
twice too
+        boolean dual = mode == null || mode.isBlank() || 
"dual".equalsIgnoreCase(mode);
+        if ("start".equals(command) && dual) {
             return doDualJfrRecording(p.pid(), duration, stacktrace, minSize);
         }
 
@@ -530,7 +542,7 @@ public class RuntimeTools {
                   This is always captured (no need to enable tracing) and 
shows the single most recent exchange \
                   with its route path, processors visited, headers, body, and 
timing.""")
     public JsonObject camel_runtime_history(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("get_history", nameOrPid, Map.of());
     }
 
@@ -539,7 +551,7 @@ public class RuntimeTools {
                   Initiate graceful shutdown of a running Camel application. \
                   The application will finish processing in-flight exchanges 
before stopping.""")
     public JsonObject camel_runtime_stop(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid) {
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid) {
         return delegateToRegistry("stop_application", nameOrPid, Map.of());
     }
 
@@ -548,7 +560,7 @@ public class RuntimeTools {
                   Receive (poll) a message from a Camel endpoint in the 
running application. \
                   This is the complement to camel_runtime_send — it consumes 
one message from the endpoint.""")
     public JsonObject camel_runtime_receive(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
             @ToolArg(description = "Endpoint URI to receive from") String 
endpoint) {
         if (endpoint == null || endpoint.isBlank()) {
             throw new ToolCallException("endpoint is required", null);
@@ -564,9 +576,9 @@ public class RuntimeTools {
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint 
= false, openWorldHint = false),
           description = "Browse messages in a Camel endpoint (e.g., browse 
messages queued in a SEDA endpoint).")
     public JsonObject camel_runtime_browse(
-            @ToolArg(description = NAME_OR_PID_DESC) String nameOrPid,
+            @ToolArg(description = NAME_OR_PID_DESC, required = false) String 
nameOrPid,
             @ToolArg(description = "Endpoint URI to browse") String endpoint,
-            @ToolArg(description = "Maximum number of messages to return 
(default: 50)") Integer limit) {
+            @ToolArg(description = "Maximum number of messages to return 
(default: 50)", required = false) Integer limit) {
         if (endpoint == null || endpoint.isBlank()) {
             throw new ToolCallException("endpoint is required", null);
         }
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/SecurityScanTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/SecurityScanTools.java
index 55a56b6cb54f..5911998fda63 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/SecurityScanTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/SecurityScanTools.java
@@ -64,7 +64,7 @@ public class SecurityScanTools {
                         + "and CVE advisories.")
     public SecurityScanResult camel_security_scan(
             @ToolArg(description = "The Camel route content (YAML, XML, or 
Java DSL)") String route,
-            @ToolArg(description = "Route format: yaml, xml, or java (default: 
yaml)") String format) {
+            @ToolArg(description = "Route format: yaml, xml, or java (default: 
yaml)", required = false) String format) {
 
         if (route == null || route.isBlank()) {
             throw new ToolCallException("Route content is required", null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TestScaffoldTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TestScaffoldTools.java
index 35ec249b8f87..af5620e544fc 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TestScaffoldTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TestScaffoldTools.java
@@ -81,10 +81,10 @@ public class TestScaffoldTools {
                         + "and @RegisterExtension stubs for infrastructure 
components (Kafka, AWS, etc.).")
     public String camel_route_test_scaffold(
             @ToolArg(description = "The Camel route definition (YAML or XML)") 
String route,
-            @ToolArg(description = "Route format: yaml or xml (default: 
yaml)") String format,
-            @ToolArg(description = "Target runtime: main or spring-boot 
(default: main)") String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = "Route format: yaml or xml (default: 
yaml)", required = false) String format,
+            @ToolArg(description = "Target runtime: main or spring-boot 
(default: main)", required = false) String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (route == null || route.isBlank()) {
             throw new ToolCallException("Route content is required", null);
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 37eb945716a3..a8e64dd850d1 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
@@ -71,9 +71,9 @@ public class TransformTools {
     public ValidationResult camel_validate_route(
             @ToolArg(description = "Camel endpoint URI to validate (e.g., 
'kafka:myTopic?brokers=localhost:9092')") String uri,
             @ToolArg(description = "YAML route definition to validate") String 
route,
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = ToolArgDocs.CAMEL_VERSION) String 
camelVersion,
-            @ToolArg(description = ToolArgDocs.PLATFORM_BOM) String 
platformBom) {
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = ToolArgDocs.CAMEL_VERSION, required = 
false) String camelVersion,
+            @ToolArg(description = ToolArgDocs.PLATFORM_BOM, required = false) 
String platformBom) {
 
         if (uri == null && route == null) {
             throw new ToolCallException("Either 'uri' or 'route' is required", 
null);
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/VersionTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/VersionTools.java
index 38bbed64491d..503014445f1b 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/VersionTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/VersionTools.java
@@ -46,10 +46,10 @@ public class VersionTools {
           description = "List available Camel versions for a specific runtime 
(main, spring-boot, quarkus). " +
                         "Returns version information including release date, 
JDK requirements, and LTS status.")
     public VersionListResult camel_version_list(
-            @ToolArg(description = ToolArgDocs.RUNTIME) String runtime,
-            @ToolArg(description = "Only show LTS (Long Term Support) releases 
(default: false)") Boolean lts,
-            @ToolArg(description = "Minimum Camel version to include (e.g., 
4.0)") String fromVersion,
-            @ToolArg(description = "Maximum number of versions to return 
(default: 10)") Integer limit) {
+            @ToolArg(description = ToolArgDocs.RUNTIME, required = false) 
String runtime,
+            @ToolArg(description = "Only show LTS (Long Term Support) releases 
(default: false)", required = false) Boolean lts,
+            @ToolArg(description = "Minimum Camel version to include (e.g., 
4.0)", required = false) String fromVersion,
+            @ToolArg(description = "Maximum number of versions to return 
(default: 10)", required = false) Integer limit) {
 
         try {
             StringPrinter printer = new StringPrinter();
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/test/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogToolsTest.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/test/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogToolsTest.java
index 57ddd62c027f..3ea8211e64ca 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/test/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogToolsTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/test/java/org/apache/camel/dsl/jbang/core/commands/mcp/CatalogToolsTest.java
@@ -219,7 +219,7 @@ class CatalogToolsTest {
     void platformBomInvalidFormatThrows() {
         CatalogTools tools = createTools(null);
 
-        assertThatThrownBy(() -> tools.camel_catalog_components(null, null, 5, 
null, null, "invalid-format"))
+        assertThatThrownBy(() -> tools.camel_catalog_components(null, null, 5, 
"spring-boot", null, "invalid-format"))
                 .isInstanceOf(ToolCallException.class)
                 .hasMessageContaining("GAV format");
     }
@@ -228,11 +228,42 @@ class CatalogToolsTest {
     void platformBomInvalidFormatTwoPartsThrows() {
         CatalogTools tools = createTools(null);
 
-        assertThatThrownBy(() -> tools.camel_catalog_components(null, null, 5, 
null, null, "group:artifact"))
+        assertThatThrownBy(() -> tools.camel_catalog_components(null, null, 5, 
"spring-boot", null, "group:artifact"))
                 .isInstanceOf(ToolCallException.class)
                 .hasMessageContaining("GAV format");
     }
 
+    @Test
+    void platformBomThatIsNotACamelGavIsIgnoredForMain() {
+        CatalogTools tools = createTools(null);
+
+        assertThat(tools.camel_catalog_components(null, null, 5, null, null, 
"invalid-format").camelVersion())
+                .isEqualTo(BUILTIN_VERSION);
+        assertThat(tools.camel_catalog_components(null, null, 5, "main", null, 
"group:artifact").camelVersion())
+                .isEqualTo(BUILTIN_VERSION);
+        assertThat(tools.camel_catalog_components(null, null, 5, "main", null, 
"io.quarkus.platform:quarkus-camel-bom:3.31.3")
+                .camelVersion())
+                .isEqualTo(BUILTIN_VERSION);
+    }
+
+    @Test
+    void docToolWithBlankPlatformBomAndMainRuntime() {
+        // what an assistant sends when the schema made every argument 
mandatory: runtime main, a version, an empty BOM
+        CatalogTools tools = createTools(null);
+
+        assertThat(tools.camel_catalog_language_doc("simple", "main", 
BUILTIN_VERSION, "")).isNotNull();
+        assertThat(tools.camel_catalog_language_doc("simple", "main", null, 
null)).isNotNull();
+    }
+
+    @Test
+    void camelVersionThatIsNotAVersionIsTheDefaultCatalog() {
+        CatalogTools tools = createTools(null);
+
+        assertThat(tools.camel_catalog_components(null, null, 5, null, "main", 
null).camelVersion()).isEqualTo(BUILTIN_VERSION);
+        assertThat(tools.camel_catalog_components(null, null, 5, null, 
"latest", null).camelVersion())
+                .isEqualTo(BUILTIN_VERSION);
+    }
+
     @Test
     void platformBomNullDoesNotThrow() {
         CatalogTools tools = createTools(null);

Reply via email to