Model Context Protocol (MCP) упростил подключение инструментов к AI-агентам. Но чем больше инструментов доступно агенту, тем острее вопрос контроля. Какие tools можно вызывать? Что если в описании инструмента спрятана prompt-инъекция? Как не пропустить опасный ответ обратно в модель?
Microsoft предложила ответ в виде NuGet-пакета
Microsoft.AgentGovernance.Extensions.ModelContextProtocol. Это Public Preview расширение для официального MCP C# SDK, которое добавляет слой governance к вашему MCP-серверу одним вызовом.Что делает пакет
Пакет встраивается в стандартный
IMcpServerBuilder и добавляет четыре вещи. Сканирование инструментов при старте, проверку политик при каждом вызове, санитизацию ответов перед возвратом в модель и аудит с метриками.Установка стандартная:
dotnet add package Microsoft.AgentGovernance.Extensions.ModelContextProtocol
Подключение через один extension-метод:
using AgentGovernance.Extensions.ModelContextProtocol;
builder.Services
.AddMcpServer()
.WithGovernance(options =>
{
options.PolicyPaths.Add("policies/mcp.yaml");
options.DefaultAgentId = "did:mcp:server";
options.ServerName = "contoso-support";
});
Сканирование при запуске
До того как инструменты станут доступны клиентам, пакет проверяет их определения на угрозы. Среди детектируемых категорий: tool poisoning, тайпсквоттинг, скрытые инструкции в описаниях, schema abuse (например, поля вроде
password или system_prompt), cross-server атаки. Если инструмент не прошёл проверку, сервер по умолчанию не запустится. Это fail closed на этапе старта, а не рантайм-фильтр.Политики вызовов
Контроль доступа к инструментам описывается в YAML-файлах. Политики работают по модели allow/deny с приоритетами. Пример:
apiVersion: governance.toolkit/v1
version: "1.0"
name: mcp-governance-policy
default_action: deny
rules:
- name: allow-echo
condition: "tool_name == 'echo'"
action: allow
priority: 10
Если вызов запрещён, пакет вернёт governed error result вместо выполнения инструмента. Политики поддерживают identity: если есть аутентифицированный вызывающий, его идентификатор участвует в оценке. Если нет, используется fallback DID, например
did:mcp:anonymous.Санитизация ответов
Ответы инструментов проходят через санитайзер до возврата клиенту. Он ищет prompt-injection теги (
<system>...</system>), фразы переопределения вроде «ignore previous instructions», паттерны утечки credentials и URL для эксфильтрации данных. Опасные фрагменты вырезаются, остальной контент сохраняется.Дефолты из коробки
Пакет включает защиту по умолчанию без дополнительной настройки.
ScanToolsOnStartup, FailOnUnsafeTools, SanitizeResponses, GovernFallbackHandlers, EnableAudit, EnableMetrics — всё это true сразу после подключения.Итого
Пакет не требует форка SDK и не вводит отдельный прокси-процесс. Он оборачивает финальный
ToolCollection в стандартном builder-пайплайне и применяется ко всем инструментам, зарегистрированным до или после вызова .WithGovernance(). Работает с .NET 8+.Если вы строите MCP-серверы для внутренних копайлотов или корпоративных агентов, это готовый способ добавить контроль доступа, аудит и защиту от инъекций без ручной реализации в каждом сервисе.
➡️ Блог разработчиков
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view