Stu Mason · Folkestone, Kent
One entryMerged PR· StuMason/coolify-mcp· TypeScript

PR #282 merged: fix: маскировать env-переменные БД по умолчанию и учитывать reveal (#276)

additions
+117
deletions
-21
files changed
6

Закрывает #276.

Суть проблемы

Действие list инструмента env_vars обещает (в собственном описании инструмента), что значения секретов по умолчанию маскируются как *** и отдаются в открытом виде только при явном reveal=true. Для приложений и сервисов это так и работает. Для баз данных — нет:

  • CoolifyClient.listDatabaseEnvVars(uuid) вызывался без опций и не содержал логики маскирования — возвращал сырой ответ API, то есть все значения в открытом виде.
  • Флаг reveal никуда не пробрасывался и просто игнорировался: true, false или отсутствие флага давали один и тот же открытый текст.

Env-переменные базы данных — самые чувствительные данные, к которым прикасается этот сервер (пароли, строки подключения), поэтому баг обходил ровно ту защиту, ради которой существует слой маскирования, и молча противоречил заявленному в документации поведению по умолчанию.

Исправление

  • listDatabaseEnvVars теперь принимает options?: { reveal?: boolean } и по умолчанию маскирует value / real_value через maskEnvVar, отдавая открытый текст только при reveal === true — идентично listServiceEnvVars.
  • Ветка databaselist инструмента env_vars теперь пробрасывает reveal в клиент.

Тесты

  • Клиент (coolify-client.test.ts): маска по умолчанию, reveal=true возвращает открытый текст, reveal=false маскирует. Обновлён старый тест «should list database env vars», который ожидал открытый текст.
  • Инструмент (mcp-server.test.ts): reveal пробрасывается в listDatabaseEnvVars; вызов по умолчанию передаёт reveal: undefined, поэтому значения остаются замаскированными.
  • Смоук (smoke.integration.test.ts): находит живую базу данных, проверяет, что список по умолчанию полностью замаскирован, а reveal=true возвращает реальные значения.

npm test → 424 теста проходят. npm run build / npm run lint чисто (только ранее существовавшие предупреждения).

О проверке на живом инстансе

Живую репродукцию на момент ревью воспроизвести не удалось: инстанс из .env отдаёт HTTP 503, а на доступном netcup-эстейте у обеих баз (Dragonfly/Redis) не заданы env-переменные. Корневая причина однозначна по коду и полностью покрыта юнит-тестами; добавленный смоук-тест прогонит сценарий вживую, как только будет доступна БД с переменными.