sozsoft-platform/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/Tools/McpSchemaTools.cs

68 lines
3.5 KiB
C#
Raw Normal View History

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;
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]
public sealed class McpSchemaTools(IMcpSchemaAppService schemaAppService, ICurrentTenant currentTenant)
2026-09-17 09:01:14 +00:00
{
[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.")]
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();
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);
}
/// <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(
string Scope,
2026-09-17 09:01:14 +00:00
McpServerConfigDto? Server,
McpSchemaInfoDto Schema,
IReadOnlyList<string> AvailableTools);