67 lines
3.5 KiB
C#
67 lines
3.5 KiB
C#
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Threading.Tasks;
|
|
using ModelContextProtocol.Server;
|
|
using Sozsoft.Mcp.Dtos;
|
|
using Volo.Abp.MultiTenancy;
|
|
|
|
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]
|
|
public sealed class McpSchemaTools(IMcpSchemaAppService schemaAppService, ICurrentTenant currentTenant)
|
|
{
|
|
[McpServerTool(Name = McpToolNames.ServerInfo, ReadOnly = true)]
|
|
[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.")]
|
|
public async Task<McpServerInfoResult> ServerInfoAsync()
|
|
{
|
|
var config = await schemaAppService.GetServerConfigAsync();
|
|
var schema = await schemaAppService.GetSchemaInfoAsync();
|
|
var availableTools = await schemaAppService.GetAvailableToolsAsync();
|
|
|
|
return new McpServerInfoResult(
|
|
currentTenant.IsAvailable ? McpConsts.Scopes.Tenant : McpConsts.Scopes.Host,
|
|
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<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);
|
|
}
|
|
|
|
/// <param name="Scope">Istegin baglami: <c>host</c> ya da <c>tenant</c>. Gelistirme araclari yalnizca host'ta aciktir.</param>
|
|
/// <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(
|
|
string Scope,
|
|
McpServerConfigDto? Server,
|
|
McpSchemaInfoDto Schema,
|
|
IReadOnlyList<string> AvailableTools);
|