using System;
using System.Collections.Generic;
using System.Linq;
namespace Sozsoft.Mcp;
///
/// 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.
///
public static class McpToolPolicy
{
/// Istegin kiracisina dusen aktif bir sunucu kaydi var mi.
/// Sunucu kaydinda veri yazma acik mi.
/// Acik arac adlari; bos liste "yazma disindaki tumu acik" demektir.
public static bool IsAllowed(
bool hasServerRecord,
bool allowWrite,
IReadOnlyCollection 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 VisibleTools(
bool hasServerRecord,
bool allowWrite,
IReadOnlyCollection allowedTools)
=> [.. McpToolNames.All.Where(name => IsAllowed(hasServerRecord, allowWrite, allowedTools, name))];
}