sozsoft-platform/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Domain.Shared/McpToolPolicy.cs
2026-09-10 17:40:43 +03:00

51 lines
1.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
namespace Sozsoft.Mcp;
/// <summary>
/// Bir aracin bir sunucu kaydina gore acik olup olmadigina karar veren kural. Karar iki yerde
/// kullanilir: arac listesi suzulurken ve arac cagrilirken. Listeyi suzmek tek basina bir
/// yetki siniri degildir — istemci listede olmayan bir araci da cagirabilir.
/// </summary>
public static class McpToolPolicy
{
/// <param name="hasServerRecord">Istegin kiracisina dusen aktif bir sunucu kaydi var mi.</param>
/// <param name="allowWrite">Sunucu kaydinda veri yazma acik mi.</param>
/// <param name="allowedTools">Acik arac adlari; bos liste "yazma disindaki tumu acik" demektir.</param>
public static bool IsAllowed(
bool hasServerRecord,
bool allowWrite,
IReadOnlyCollection<string> allowedTools,
string toolName)
{
if (McpToolNames.AlwaysAvailableTools.Contains(toolName, StringComparer.Ordinal))
{
return true;
}
if (!hasServerRecord)
{
return false;
}
if (!allowWrite && McpToolNames.WriteTools.Contains(toolName, StringComparer.Ordinal))
{
return false;
}
if (allowedTools.Count == 0)
{
return true;
}
return allowedTools.Contains(toolName, StringComparer.OrdinalIgnoreCase);
}
public static IReadOnlyList<string> VisibleTools(
bool hasServerRecord,
bool allowWrite,
IReadOnlyCollection<string> allowedTools)
=> [.. McpToolNames.All.Where(name => IsAllowed(hasServerRecord, allowWrite, allowedTools, name))];
}