gnodet-bot commented on code in PR #28683:
URL: https://github.com/apache/camel/pull/28683#discussion_r4412653175
##########
dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AuthoringTools.java:
##########
@@ -397,9 +398,51 @@ public JsonObject camel_eval_expression(
@ToolArg(description = "e.g. ${random(1,10)} or ${body} ?:
'none'", required = true) String expression,
@ToolArg(description = "simple (default), jsonpath, xpath, jq",
required = false) String language,
@ToolArg(description = "Message body", required = false) String
body,
- @ToolArg(description = NAME_DESC, required = false) String name) {
+ @ToolArg(description = NAME_DESC, required = false) String name,
+ // Object, so the schema takes any JSON: a client sends a JSON
object, or the text of key=value lines
+ @ToolArg(description =
org.apache.camel.dsl.jbang.core.commands.ai.AuthoringTools.EVAL_HEADERS_DESC,
+ required = false) Object headers,
+ @ToolArg(description =
org.apache.camel.dsl.jbang.core.commands.ai.AuthoringTools.EVAL_VARIABLES_DESC,
+ required = false) Object variables,
+ @ToolArg(description =
org.apache.camel.dsl.jbang.core.commands.ai.AuthoringTools.EVAL_PREDICATE_DESC,
+ required = false) Boolean predicate,
+ @ToolArg(description =
org.apache.camel.dsl.jbang.core.commands.ai.AuthoringTools.EVAL_RESULT_TYPE_DESC,
+ required = false) String resultType) {
return call("camel_eval_expression", args("expression", expression,
"language", language, "body", body,
- "name", name));
+ "name", name, "headers", limited("headers",
jsonText(headers)), "variables",
+ limited("variables", jsonText(variables)), "predicate",
predicate, "resultType", resultType));
+ }
+
+ /**
+ * The text of an argument held to the length limit of the string
arguments: McpSecurityInterceptor checks the
+ * arguments that are strings, and a JSON object is not one.
+ */
+ String limited(String argument, String text) {
+ int max = securityConfig != null
+ ? securityConfig.getMaxArgumentLength() :
McpSecurityConfig.DEFAULT_MAX_ARGUMENT_LENGTH;
+ if (text != null && text.length() > max) {
+ throw new ToolCallException(
+ "Argument '" + argument + "' is " + text.length() + "
characters long as JSON, over the limit of "
+ + max + "; nothing was done. Pass
fewer or shorter values, or raise"
+ + "
camel.mcp.security.max-argument-length");
+ }
+ return text;
+ }
+
+ /**
+ * An argument that is a JSON object or text, as the text the shared tool
reads. The server hands a JSON object over
+ * as a Map of Maps, Lists, strings, numbers and booleans, which is the
JSON of the object for Jsoner.
+ */
+ static String jsonText(Object value) {
+ if (value == null || value instanceof String) {
+ return (String) value;
+ }
+ try {
+ return Jsoner.serialize(value);
+ } catch (IllegalArgumentException e) {
+ // not a value Jsoner knows: its own text, which the shared tool
reads or refuses with the reason
+ return value.toString();
+ }
Review Comment:
💡 **Nit:** The `IllegalArgumentException` fallback silently converts the
value to its `toString()` representation without any logging. While this path
should be unreachable in practice (MCP only delivers JSON-native types: `Map`,
`List`, `String`, `Number`, `Boolean`), adding a debug log would make
unexpected inputs easier to diagnose:
```suggestion
} catch (IllegalArgumentException e) {
// not a value Jsoner knows: its own text, which the shared tool
reads or refuses with the reason
LOG.debug("jsonText: Jsoner cannot serialize {}, falling back to
toString()", value.getClass().getSimpleName(), e);
return value.toString();
}
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]