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 ;
2026-09-24 13:29:53 +00:00
using Volo.Abp.MultiTenancy ;
2026-09-17 09:01:14 +00:00
namespace Sozsoft.Mcp.Tools ;
/// <summary>
/// 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.
/// </summary>
[McpServerToolType]
2026-09-24 13:29:53 +00:00
public sealed class McpSchemaTools ( IMcpSchemaAppService schemaAppService , ICurrentTenant currentTenant )
2026-09-17 09:01:14 +00:00
{
[McpServerTool(Name = McpToolNames.ServerInfo, ReadOnly = true)]
2026-09-24 13:29:53 +00:00
[Description("Bu baglantinin baglamini (scope: host ya da tenant; kiraci adi server.tenantName), acik araclari ve veri sozlugunun tazelik bilgisini dondurur. Baska bir arac beklendigi gibi calismiyorsa once bunu cagir.")]
2026-09-17 09:01:14 +00:00
public async Task < McpServerInfoResult > ServerInfoAsync ( )
{
var config = await schemaAppService . GetServerConfigAsync ( ) ;
var schema = await schemaAppService . GetSchemaInfoAsync ( ) ;
var availableTools = await schemaAppService . GetAvailableToolsAsync ( ) ;
2026-09-24 13:29:53 +00:00
return new McpServerInfoResult (
currentTenant . IsAvailable ? McpConsts . Scopes . Tenant : McpConsts . Scopes . Host ,
config ,
schema ,
availableTools ) ;
2026-09-17 09:01:14 +00:00
}
[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 < List < McpListSummaryDto > > 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 < McpListDetailDto ? > 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 < List < McpSchemaMatchDto > > 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 ) ;
}
2026-09-24 13:29:53 +00:00
/// <param name="Scope">Istegin baglami: <c>host</c> ya da <c>tenant</c>. Gelistirme araclari yalnizca host'ta aciktir.</param>
2026-09-17 09:01:14 +00:00
/// <param name="Server">Istegin kiracisina dusen sunucu kaydi; yoksa null.</param>
/// <param name="Schema">Veri sozlugunun tazelik bilgisi.</param>
/// <param name="AvailableTools">Bu baglantida cagrilabilen araclar.</param>
public sealed record McpServerInfoResult (
2026-09-24 13:29:53 +00:00
string Scope ,
2026-09-17 09:01:14 +00:00
McpServerConfigDto ? Server ,
McpSchemaInfoDto Schema ,
IReadOnlyList < string > AvailableTools ) ;