using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;
using ModelContextProtocol.Server;
using Sozsoft.Mcp.Dtos;
namespace Sozsoft.Mcp.Tools;
///
/// Sema kesfi araclari. Tablo ve sutun bilgisi canli katalogdan degil, platformun ekran
/// tanimlarindan uretilen veri sozlugunden gelir; boylece modelin gordugu adlar kullanicinin
/// ekranda gordugu adlarla ayni olur.
///
[McpServerToolType]
public sealed class McpSchemaTools(IMcpSchemaAppService schemaAppService)
{
[McpServerTool(Name = McpToolNames.ServerInfo, ReadOnly = true)]
[Description("Bu baglantinin kiracisini, acik araclari ve veri sozlugunun tazelik bilgisini dondurur. Baska bir arac beklendigi gibi calismiyorsa once bunu cagir.")]
public async Task ServerInfoAsync()
{
var config = await schemaAppService.GetServerConfigAsync();
var schema = await schemaAppService.GetSchemaInfoAsync();
var availableTools = await schemaAppService.GetAvailableToolsAsync();
return new McpServerInfoResult(config, schema, availableTools);
}
[McpServerTool(Name = McpToolNames.ListLists, ReadOnly = true)]
[Description("Kiracinin listelerini (ekranlarini) ad, baslik, aciklama ve arkasindaki tablo ile dondurur. Arama metni verilmezse tumu doner.")]
public async Task> ListListsAsync(
[Description("Liste adi, basligi, aciklamasi ya da tablo adi icinde aranacak metin. Bos birakilabilir.")]
string? search = null,
[Description("Donecek en fazla liste sayisi. Varsayilan 200.")]
int maxResults = 200)
=> await schemaAppService.GetListsAsync(search, maxResults);
[McpServerTool(Name = McpToolNames.DescribeList, ReadOnly = true)]
[Description("Tek bir listenin sutunlarini dondurur: alan adi, kullaniciya gorunen basligi, SQL tipi, lookup iliskisi ve sutunun hassas olup olmadigi.")]
public async Task DescribeListAsync(
[Description("Listenin kodu; list_lists cikisindaki listFormCode degeri.")]
string listFormCode)
=> await schemaAppService.GetListAsync(listFormCode);
[McpServerTool(Name = McpToolNames.SearchSchema, ReadOnly = true)]
[Description("Liste ve sutun adlari ile basliklari uzerinde aksan ve buyuk/kucuk harf duyarsiz arama yapar; hangi listenin hangi sutununun arandigini bulmak icin kullanilir.")]
public async Task> SearchSchemaAsync(
[Description("Aranacak metin. Turkce karakterler ve aksanlar onemsizdir.")]
string term,
[Description("Donecek en fazla eslesme sayisi. Varsayilan 50.")]
int maxResults = 50)
=> await schemaAppService.SearchAsync(term, maxResults);
}
/// Istegin kiracisina dusen sunucu kaydi; yoksa null.
/// Veri sozlugunun tazelik bilgisi.
/// Bu baglantida cagrilabilen araclar.
public sealed record McpServerInfoResult(
McpServerConfigDto? Server,
McpSchemaInfoDto Schema,
IReadOnlyList AvailableTools);