88 lines
5 KiB
C#
88 lines
5 KiB
C#
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,
|
|
[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<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
|
|
});
|
|
}
|