Editor/Commands/CallToolCommand.cs
using System.Collections.Generic;
using System.Text.Json;
using System.Threading.Tasks;

namespace Braxnet.Commands;

[MCPCommand( "tools/call" )]
public class CallToolCommand : IMCPCommand
{
	public string Name => "tools/call";

	public async Task<object> ExecuteAsync( JsonRpcRequest request, string sessionId, string protocolVersion )
	{
		var result = new CallToolResult();

		if ( request.Params.HasValue )
		{
			var paramsObj = JsonSerializer.Deserialize<Dictionary<string, object>>(
				request.Params.Value.GetRawText(), MCPServer.JsonOptions );

			var toolName = paramsObj?.GetValueOrDefault( "name" )?.ToString();
			var argumentsElement = paramsObj?.GetValueOrDefault( "arguments" );

			Dictionary<string, object> arguments = null;
			if ( argumentsElement is JsonElement argsJson )
			{
				arguments = JsonSerializer.Deserialize<Dictionary<string, object>>(
					argsJson.GetRawText(), MCPServer.JsonOptions );
			}

			try
			{
				var toolResult = await MCPCommandRegistry.ExecuteToolAsync( toolName, arguments, sessionId );
				if ( toolResult != null )
				{
					return toolResult;
				}
				else
				{
					result.IsError = true;
					result.Content.Add( new TextContent { Text = $"Unknown tool: {toolName}" } );
				}
			}
			catch ( System.Exception ex )
			{
				result.IsError = true;
				result.Content.Add( new TextContent { Text = $"Tool execution error: {ex.Message}" } );
			}
		}
		else
		{
			result.IsError = true;
			result.Content.Add( new TextContent { Text = "No parameters provided" } );
		}

		return result;
	}
}