2026-09-17 09:01:14 +00:00
using System.Collections.Generic ;
using System.ComponentModel ;
using System.Threading.Tasks ;
using ModelContextProtocol.Server ;
using Sozsoft.Mcp.Dtos ;
namespace Sozsoft.Mcp.Tools ;
/// <summary>Salt-okunur sorgu araclari.</summary>
[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 < McpListQueryResultDto > 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 ,
2026-09-24 11:58:23 +00:00
[Description("Siralama, JSON metni. Ornek: [{\"selector\":\"CreationTime\",\"desc\":true}] . selector alan adidir ( describe_list field ) ; ifade ya da bosluk icermez . ")]
2026-09-17 09:01:14 +00:00
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 < McpQueryResultDto > 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 < string , object? > ? 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 < List < McpSavedQueryDto > > 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 < McpQueryResultDto > 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 < string , object? > ? 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
} ) ;
}