93 lines
2.3 KiB
C#
93 lines
2.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text.Json;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using AxCopilot.Models;
|
|
|
|
namespace AxCopilot.Services.Agent;
|
|
|
|
public class McpTool : IAgentTool
|
|
{
|
|
private readonly McpClientService _client;
|
|
|
|
private readonly McpToolDefinition _def;
|
|
|
|
public string Name => "mcp_" + _def.ServerName + "_" + _def.Name;
|
|
|
|
public string Description => "[MCP:" + _def.ServerName + "] " + _def.Description;
|
|
|
|
public ToolParameterSchema Parameters
|
|
{
|
|
get
|
|
{
|
|
ToolParameterSchema toolParameterSchema = new ToolParameterSchema
|
|
{
|
|
Properties = new Dictionary<string, ToolProperty>(),
|
|
Required = new List<string>()
|
|
};
|
|
foreach (var (text2, mcpParameterDef2) in _def.Parameters)
|
|
{
|
|
toolParameterSchema.Properties[text2] = new ToolProperty
|
|
{
|
|
Type = mcpParameterDef2.Type,
|
|
Description = mcpParameterDef2.Description
|
|
};
|
|
if (mcpParameterDef2.Required)
|
|
{
|
|
toolParameterSchema.Required.Add(text2);
|
|
}
|
|
}
|
|
return toolParameterSchema;
|
|
}
|
|
}
|
|
|
|
public McpTool(McpClientService client, McpToolDefinition def)
|
|
{
|
|
_client = client;
|
|
_def = def;
|
|
}
|
|
|
|
public async Task<ToolResult> ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default(CancellationToken))
|
|
{
|
|
try
|
|
{
|
|
if (!_client.IsConnected)
|
|
{
|
|
return ToolResult.Fail("MCP 서버 '" + _def.ServerName + "'에 연결되어 있지 않습니다.");
|
|
}
|
|
Dictionary<string, object> arguments = new Dictionary<string, object>();
|
|
if (args.ValueKind == JsonValueKind.Object)
|
|
{
|
|
foreach (JsonProperty prop in args.EnumerateObject())
|
|
{
|
|
Dictionary<string, object> dictionary = arguments;
|
|
string name = prop.Name;
|
|
JsonValueKind valueKind = prop.Value.ValueKind;
|
|
if (1 == 0)
|
|
{
|
|
}
|
|
object value = valueKind switch
|
|
{
|
|
JsonValueKind.String => prop.Value.GetString(),
|
|
JsonValueKind.Number => prop.Value.GetDouble(),
|
|
JsonValueKind.True => true,
|
|
JsonValueKind.False => false,
|
|
_ => prop.Value.ToString(),
|
|
};
|
|
if (1 == 0)
|
|
{
|
|
}
|
|
dictionary[name] = value;
|
|
}
|
|
}
|
|
return ToolResult.Ok(await _client.CallToolAsync(_def.Name, arguments, ct));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Exception ex2 = ex;
|
|
return ToolResult.Fail("MCP 도구 실행 실패: " + ex2.Message);
|
|
}
|
|
}
|
|
}
|