in src/Commands/Server/ToolOperations.cs [58:127]
private async ValueTask<CallToolResponse> OnCallTools(RequestContext<CallToolRequestParams> parameters,
CancellationToken cancellationToken)
{
if (parameters.Params == null)
{
var content = new Content
{
Text = "Cannot call tools with null parameters.",
};
_logger.LogWarning(content.Text);
return new CallToolResponse
{
Content = [content],
IsError = true,
};
}
var command = _commandFactory.FindCommandByName(parameters.Params.Name);
if (command == null)
{
var content = new Content
{
Text = $"Could not find command: {parameters.Params.Name}",
};
_logger.LogWarning(content.Text);
return new CallToolResponse
{
Content = [content],
IsError = true,
};
}
var commandContext = new CommandContext(_serviceProvider);
var args = parameters.Params.Arguments != null
? string.Join(" ", parameters.Params.Arguments.Select(kvp => $"--{kvp.Key} \"{kvp.Value}\""))
: string.Empty;
var realCommand = command.GetCommand();
var commandOptions = realCommand.Parse(args);
_logger.LogTrace("Invoking '{Tool}'.", realCommand.Name);
try
{
var commandResponse = await command.ExecuteAsync(commandContext, commandOptions);
var jsonResponse = JsonSerializer.Serialize(commandResponse, ModelsJsonContext.Default.CommandResponse);
return new CallToolResponse
{
Content = [
new Content {
Text = jsonResponse,
MimeType = "application/json" }],
};
}
catch (Exception ex)
{
_logger.LogError(ex, "An exception occurred running '{Tool}'. ", realCommand.Name);
throw;
}
finally
{
_logger.LogTrace("Finished executing '{Tool}'.", realCommand.Name);
}
}