Federico Mariani created CAMEL-25537:
----------------------------------------
Summary: camel-jbang-mcp - every tool is listed to the client: add
tool profiles (catalog, runtime, migration, authoring) and an allow-list
Key: CAMEL-25537
URL: https://issues.apache.org/jira/browse/CAMEL-25537
Project: Camel
Issue Type: Improvement
Components: camel-jbang-mcp
Affects Versions: 4.22.1
Reporter: Federico Mariani
camel-jbang-mcp registers every @Tool bean unconditionally, so a client always
receives all of them: 73 tools in 4.22.1 (31 of them {{camel_runtime_*}}), 86
on main. Each tool definition (name, description, argument schema) goes into
the model's context on every turn, whether the session needs it or not.
h3. Evidence
In an evaluation of coding agents (Claude Code and IBM Bob) on legacy-to-Camel
migration tasks, using camel-jbang-mcp 4.22.1 via Claude Code 2.1.29x and
camel-kit 0.4.1, 218 sessions made 1,729 calls to the server and used 27 of the
73 tools. The catalog tools, {{camel_validate_yaml_dsl}},
{{camel_component_properties}} and {{camel_configuration_validate}} made up
1,688 of those calls (98%). Only 6 of the 31 runtime tools were ever called
(processes, routes, send, stop, errors, history: 19 calls in total). Never
called in any session: the other 25 {{camel_runtime_*}} tools,
{{camel_openapi_*}}, {{camel_dependency_*}}, {{camel_error_diagnose}},
{{camel_transform_route}}, {{camel_version_list}}, the {{camel_ai_*}} tools,
{{camel_route_*}} and {{camel_render_route_diagram}}. With the server plus two
other MCP servers, Claude Code listed 116 tools to the model.
h3. Cause
Every class with {{@Tool}} methods under
{{dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/}}
is an {{@ApplicationScoped}} bean (e.g. {{RuntimeTools}} has 31 tools at
4.22.1, 41 on main; {{CatalogTools}} 11 at 4.22.1). The only
{{io.quarkiverse.mcp.server.ToolFilter}} is {{McpAccessFilter}}, which filters
by read-only/destructive hint and only when
{{camel.mcp.security.enabled=true}}. There is no option to select tools by
purpose.
CAMEL-24834 (on main, not in 4.22.x) added {{camel_runtime_tool_groups}}, which
tells a client which runtime groups (sql, tracing, resilience, http) the
selected integration needs. That is advisory: the server still lists every
tool, and it covers runtime tools only, not catalog, migration, authoring or
the rest.
h3. Fix
Let the server expose a subset, selected at startup, through a {{ToolFilter}}
next to {{McpAccessFilter}}:
* Profiles, selectable by a server argument (e.g. {{camel mcp
--tools=catalog,migration}} or {{-Dcamel.mcp.tools.profiles=...}}): {{catalog}}
(catalog docs and lists, examples, Kamelets, component properties, validation),
{{authoring}} (file write/edit, validate, transform, project overview),
{{runtime}} (the {{camel_runtime_*}} tools, optionally narrowed further by the
groups of CAMEL-24834), {{migration}} (migration guide, analyze, WildFly/Karaf,
properties translate). No argument keeps today's behaviour (all tools).
* An explicit allow-list and deny-list of tool names or globs
({{camel.mcp.tools.include=camel_catalog_*,camel_validate_yaml_dsl}},
{{camel.mcp.tools.exclude=camel_runtime_*}}), so a client such as a project's
{{.mcp.json}} can pass exactly what it needs in the server's {{args}}/{{env}}.
* Optionally, with a client that supports {{notifications/tools/list_changed}},
a tool that enables a profile for the session so the runtime tools are only
listed once the agent starts an integration.
Document the profiles and their tools in camel-jbang-mcp.adoc.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)