using System.Collections.Generic; using System.ComponentModel; using System.Threading.Tasks; using ModelContextProtocol.Server; using Sozsoft.Mcp.Dtos; namespace Sozsoft.Mcp.Tools; /// Salt-okunur sorgu araclari. [McpServerToolType] public sealed class McpQueryTools(IMcpQueryAppService queryAppService) { [McpServerTool(Name = McpToolNames.QueryList, ReadOnly = true)] [Description("Bir listenin verisini uygulamadaki ekranla ayni sorguyla okur; kullanicinin liste ve alan yetkileri, kiraci ve sube filtreleri gecerlidir. Veri okumak icin once bunu kullan. Alan adlari describe_list cikisindaki field degerleridir. Filtre/siralama/gruplama DevExtreme bicimindedir.")] public async Task QueryListAsync( [Description("Listenin kodu; list_lists cikisindaki listFormCode degeri.")] string listFormCode, [Description("Filtre, JSON metni. Ornek: [\"Status\",\"=\",\"Open\"] ya da [[\"Amount\",\">\",100],\"and\",[\"Name\",\"contains\",\"abc\"]]. Operatorler: =, <>, >, >=, <, <=, contains, notcontains, startswith, endswith.")] string? filter = null, [Description("Siralama, JSON metni. Ornek: [{\"selector\":\"CreationTime\",\"desc\":true}].")] string? sort = null, [Description("Gruplama, JSON metni. Ornek: [{\"selector\":\"CustomerId\",\"desc\":false,\"isExpanded\":false}]. Gruplu sorguda satirlar yerine grup anahtarlari ve ozetleri doner.")] string? group = null, [Description("Grup ozetleri, JSON metni. Ornek: [{\"selector\":\"Id\",\"summaryType\":\"count\"},{\"selector\":\"Amount\",\"summaryType\":\"sum\"}]. Tipler: count, sum, min, max, avg.")] string? groupSummary = null, [Description("Tum sonuc icin ozet, JSON metni. Ornek: [{\"selector\":\"Amount\",\"summaryType\":\"sum\"}].")] string? totalSummary = null, [Description("Atlanacak kayit sayisi (sayfalama).")] int skip = 0, [Description("Istenen kayit sayisi; sunucu kaydindaki tavandan buyuk olamaz.")] int take = 0) => await queryAppService.QueryListAsync(new McpListQueryRequestDto { ListFormCode = listFormCode, Filter = filter, Sort = sort, Group = group, GroupSummary = groupSummary, TotalSummary = totalSummary, Skip = skip, Take = take }); [McpServerTool(Name = McpToolNames.RunSelect, ReadOnly = true)] [Description("Yalnizca uygulamada SQL Query Manager yetkisi olan kullanicilar icin: tek bir parametreli SELECT ifadesi kosturur. Liste verisi icin query_list tercih edilir. Coklu ifade, DDL ve DML reddedilir; satir sayisi sunucu kaydindaki tavana kirpilir. Sorguya deger gomme, @ad parametresi kullan.")] public async Task RunSelectAsync( [Description("Tek bir SELECT (ya da WITH ... SELECT) ifadesi. Degerler @ad bicimindeki parametrelerle verilir.")] string sql, [Description("Sorgudaki adli parametreler: anahtar parametre adi, deger ise ham JSON degeri.")] Dictionary? parameters = null, [Description("Istenen en fazla satir sayisi; sunucu kaydindaki tavandan buyuk olamaz.")] int maxRows = 0) => await queryAppService.RunSelectAsync(new McpSelectRequestDto { Sql = sql, Parameters = parameters ?? [], MaxRows = maxRows }); [McpServerTool(Name = McpToolNames.ListQueries, ReadOnly = true)] [Description("Veri kaynagindaki kayitli nesneleri (view, stored procedure, function) ve cagrilabilir Custom Endpoint'leri dondurur. run_query bunlardan birini cagirir.")] public async Task> ListQueriesAsync( [Description("Nesne adi ya da aciklamasi icinde aranacak metin. Bos birakilabilir.")] string? search = null) => await queryAppService.GetSavedQueriesAsync(search); [McpServerTool(Name = McpToolNames.RunQuery, ReadOnly = true)] [Description("Kayitli bir nesneyi ya da Custom Endpoint'i parametreleriyle cagirir. Nesne turu ve adi list_queries cikisindan alinir.")] public async Task RunQueryAsync( [Description("Nesne turu: view, procedure, tableFunction, scalarFunction ya da customEndpoint.")] string kind, [Description("Nesnenin ya da Custom Endpoint'in adi.")] string name, [Description("Nesnenin semasi. Bos birakilirsa SQL Server'da dbo, PostgreSQL'de public kullanilir.")] string? schemaName = null, [Description("Adli parametreler: anahtar parametre adi, deger ise ham JSON degeri.")] Dictionary? parameters = null, [Description("Istenen en fazla satir sayisi; sunucu kaydindaki tavandan buyuk olamaz.")] int maxRows = 0) => await queryAppService.RunSavedQueryAsync(new McpSavedQueryRequestDto { Kind = kind, Name = name, SchemaName = schemaName, Parameters = parameters ?? [], MaxRows = maxRows }); }