coolify-mcp@3.10.1
BLOCKEDPublisher claims: "MCP server for Coolify — 46 optimized tools for infrastructure management, diagnostics, and documentation search" Observed in sandbox: sends data to localhost.
Coverage
Started with a decoy COOLIFY_ACCESS_TOKEN; tool list observed. Tool calls with a real credential not tested.- Tested
- server startup with a tagged decoy in COOLIFY_ACCESS_TOKEN · MCP initialize and tools/list · every tool description, for hidden instructions · where the decoy credential went · every file read, file written and host contacted by what ran
- Not tested
- what the tools do when called with a real credential
- Needs
- COOLIFY_ACCESS_TOKEN — give it to the server where it runs, through vet-skills run --secrets, so the value never enters the server's environment. Never paste a credential into a chat, a ticket or a report.
Before you give it your token
- It will ask for
CF_ACCESS_CLIENT_SECRETCOOLIFY_ACCESS_TOKENCOOLIFY_ACCESS_TOKEN_FILEMCP_ACCESS_TOKEN_TTLMCP_OAUTH_STATE_FILEMCP_REFRESH_TOKEN_TTLConfiguration, not credentials: CF_ACCESS_CLIENT_ID, COOLIFY_BASE_URL, COOLIFY_INSTANCES, COOLIFY_MCP_AUDIT, COOLIFY_MCP_ELICITATION, COOLIFY_MCP_REQUIRE_HUMAN, COOLIFY_UI_URL, MCP_ALLOW_INSECURE_HTTP, MCP_CLIENT_IP_HEADER, MCP_HOST, MCP_PORT, MCP_PUBLIC_URL, MCP_READONLY, MCP_REDIRECT_HOSTS, MCP_REQUEST_STATE_KEY, MCP_TRANSPORT- Where it talks to
- no vendor host named in the codeAlso coolify.io, coollabs.io, evil.example — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · contacted localhost (undeclared)
- What we could not test
- what the tools do when called with a real credential
Do not connect it. The honeypot or a critical finding blocked this version; the evidence is below.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios) on 2026-11-15 and scored it 47/100 (Blocked). Do not install it: the sandbox observed behaviour consistent with credential theft, exfiltration or persistence. Notable findings: Access to sensitive file paths; Prompting user to enter sensitive credentials; Pipe-to-shell pattern. Summary: sends data to localhost.
Behavior trace
Honeypot run · 55 s · 2 scenariosStatic findings
…/tls-certificates): Manage Traefik ACME certificates and restore backups of acme.json.\n- [Custom SSL Certificates](https://coolify.io/docs/core/networking/proxy/traefik/custom-ssl-certs): Load certificates from a Coolify server into Traef…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// root-owned /data on machines where the chmod case below cannot run.Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.export declare const DOCTOR_POINTER = "To diagnose, run `npx @masonator/coolify-mcp doctor` with this server's environment.";Fix: Pin versions and sources; vendor anything fetched at install time.const strict = new CoolifyMcpServer({ baseUrl: 'http://localhost:3000', accessToken: 'test-token' }, { requireElicitation: true });Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.'file://localhost/etc/passwd',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.expect(sanitizeForPrompt('`sudo rm -rf`')).toBe('sudo rm -rf');Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// A shared .env between a stdio config and an HTTP deployment must notFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'file:///etc/passwd',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const strict = new CoolifyMcpServer({ baseUrl: 'http://localhost:3000', accessToken: 'test-token' }, { requireElicitation: true });Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.* shared .env with an unexpanded Coolify magic var) must not stop a stdioFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// otherwise wins over .env and silently skips every test — and a skipped suiteFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'https://169.254.169.254/latest/meta-data',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const asker = new CoolifyMcpServer({ baseUrl: 'http://localhost:3000', accessToken: 'test-token' }, { requireElicitation: true });Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.…backups`, which schedules database dumps and works on older versions. Upgrade: `curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s 4.2.0`'; } if (status === 422 && /\/storages$/.test(path)) { …Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.await expect(provider.resolveClient('https://169.254.169.254/latest/client.json')).rejects.toThrow(/could not be fetched/);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const server = new CoolifyMcpServer({ baseUrl: 'http://localhost:3000', accessToken: 'test-token' }, { auditByDefault: true });Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.'Re-paste the token without it.');Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…may be wrong, or belong to a different resource type than this route. Upgrade: `curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s 4.2.0`'; } if (status === 404 && /\/storages\/[\w-]+\/backups(\/run)…Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…backups`, which schedules database dumps and works on older versions. Upgrade: `curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s 4.2.0`'; } if (status === 422 && /\/storages$/.test(path)) { …Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.expect(pickUuids({ uuid: '../../etc/passwd' })).toBeUndefined();Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'https://user:[email protected]/x',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."build": "tsc && shx mkdir -p dist/data && shx cp src/data/*.json dist/data/ && shx chmod +x dist/*.js",Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.['http://10.0.0.5:8000', false],Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.['https://user:[email protected]/client.json', 'userinfo'],Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…application) require Coolify v4.2+. Check version with `get_version`. Upgrade: `curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s 4.2.0`'; } if (status === 404 && /\/destinations(\/|$)/.test(path)) …Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.const strict = new CoolifyMcpServer({ baseUrl: 'http://localhost:3000', accessToken: 'test-token' }, { requireElicitation: true });Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.const server = new CoolifyMcpServer({ baseUrl: 'http://localhost:3000', accessToken: 'test-token' }, options);Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.command: 'rm -rf /tmp/*',Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* shared .env with an unexpanded Coolify magic var) must not stop a stdioFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.command: 'rm -rf /tmp/*',Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// `npx @masonator/coolify-mcp doctor` (#368): diagnose the environment andFix: Pin versions and sources; vendor anything fetched at install time.command: 'rm -rf /tmp/*',Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.…application) require Coolify v4.2+. Check version with `get_version`. Upgrade: `curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s 4.2.0`'; } if (status === 404 && /\/destinations(\/|$)/.test(path)) …Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…may be wrong, or belong to a different resource type than this route. Upgrade: `curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s 4.2.0`'; } if (status === 404 && /\/storages\/[\w-]+\/backups(\/run)…Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…cli/command-reference/commands/app/env-sync): Sync environment variables from a .env file\n- [Env update](https://coolify.io/docs/cli/command-reference/commands/app…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'Coolify rejects every request with 401. Re-paste the token without it.');Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const run = async (env) => (await runDoctor({ COOLIFY_BASE_URL: 'https://coolify.example.com', ...env }, offline)).instances[0].checks.find((c) => c.check === 'config');Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.export const DOCTOR_POINTER = "To diagnose, run `npx @masonator/coolify-mcp doctor` with this server's environment.";Fix: Pin versions and sources; vendor anything fetched at install time.const strict = new CoolifyMcpServer({ baseUrl: 'http://localhost:3000', accessToken: 'test-token' }, { requireElicitation: true });Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for @masonator/coolify-mcp@3.10.1 as of 24 min ago. This is the package itself, not its dependencies.
What would make this Verified
33 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Contacts a host you did not declare≈ +23 on the totalList every host you talk to in SKILL.md frontmatter (`network: [api.example.com]`), or stop contacting the ones you cannot justify.
- Prompting user to enter sensitive credentials≈ +9 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Pipe-to-shell pattern≈ +9 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Unclaimed publisher≈ +8 on the totalClaim masonator: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.
- File permission modification command≈ +2 on the totalRequest the narrowest permission that works; replace wildcards with the exact paths or hosts.