Stu Mason · Folkestone, Kent
One entryOpened issue· StuMason/coolify-mcp· TypeScript

Issue #274 opened: Database env var listing returns secret values in plaintext by default

Summary

The env_vars tool documents that secret values are masked by default (returned as ***) so they aren't leaked to MCP clients, and that a caller must explicitly pass reveal=true to see plaintext. That promise holds for applications and services, but not for databases.

When you list the environment variables of a database, the values come back in plaintext, straight away, with no opt-in. Worse, passing reveal=true or reveal=false makes no difference to the database case at all — the flag is simply ignored.

Steps to reproduce

  1. Point the MCP server at a Coolify instance that has at least one database with env vars set (a password, a connection string, anything sensitive).
  2. Call the env_vars tool with the database resource and the list action, leaving reveal unset (i.e. rely on the documented default).
  3. Do the same for an application and for a service.

Expected

All three resource types behave the same way the tool description promises: values masked as *** by default, real values only when reveal=true is passed explicitly.

Actual

  • Application list → masked. ✅
  • Service list → masked. ✅
  • Database list → plaintext secrets returned by default, and reveal has no effect. ❌

Why this matters

Database env vars are one of the most sensitive things this server can touch — they routinely hold DB credentials and connection strings. The masking layer exists specifically to stop those from being handed to an LLM client by accident. Right now the database path is a hole straight through it, and because the flag is ignored there's no way to even ask for masking. This also silently contradicts the tool's own documented default, so a caller trusting the docs is being misled.