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);