Skip to main content
Glama
amintt2
by amintt2

coolify-mcp

Let your AI agent run your self-hosted Coolify: list apps, manage env vars safely, deploy, restart and read logs.

CI License: MIT

An MCP server for the Coolify v4 REST API. Works with Claude Code, Claude Desktop, Cursor, VS Code, Windsurf and any other stdio MCP client. No install step: your client runs it with npx -y github:amintt2/coolify-mcp.

Website and config generator: https://amintt2.github.io/coolify-mcp/ (type your Coolify URL, pick your client, copy the snippet or click Add to Cursor / Add to VS Code).

Why this one

  • Secrets are masked by default. list_envs shows post*** (41 chars), not your database password. Plaintext needs reveal: true in the call and COOLIFY_ALLOW_REVEAL=1 on the server, so an agent can't decide on its own to read them.

  • Dry runs. set_envs and delete_env take dry_run: true and report what would change (created / updated / unchanged per key) without touching anything. Values are never echoed back.

  • Read-only mode. COOLIFY_READ_ONLY=1 refuses every mutating tool. Good for "look but don't touch" sessions.

  • Coolify quirks handled. Coolify's bulk env endpoint silently resets is_literal, is_multiline and is_shown_once when they are omitted, so set_envs resends the current flags for each key it updates. It also sends both the current is_buildtime flag and the older beta name is_build_time.

  • Human references. Point at an app by uuid, name or part of its domain ("api", "shop.example.com"). Ambiguous references fail and list the candidates instead of guessing.

  • Token hygiene. The token is never logged and is redacted from every error message.

Related MCP server: Coolify MCP Server

Quick start

You need Node.js 20+ and git (npx fetches the server from GitHub on first run), plus a Coolify v4 instance.

1. Enable the API

Coolify → Settings → Advanced → turn on API Access. If Allowed IPs is set there, add the IP of the machine that will run the MCP server (your laptop, usually).

2. Create a token

Coolify → Keys & Tokens → API tokens → Create. The token is scoped to the team you are in. Recommended permissions:

Permission

Needed for

read

Listing, env keys and flags, deployments, app logs. The minimum.

read:sensitive

Env values (to mask them and to tell unchanged from updated) and deployment logs. Values reach this server and are masked before they reach the agent.

write

set_envs, delete_env

deploy

deploy, start_application, stop_application, restart_application, restart_service

Don't use root. For an inspection-only setup, give read (+ read:sensitive) and run with COOLIFY_READ_ONLY=1. Only team admins and owners can create tokens with write, deploy or read:sensitive.

3. Add it to your client

Replace https://coolify.example.com with your instance and <YOUR_COOLIFY_TOKEN> with the token.

claude mcp add coolify --scope user \
  -e COOLIFY_URL="https://coolify.example.com" \
  -e COOLIFY_TOKEN="<YOUR_COOLIFY_TOKEN>" \
  -- npx -y github:amintt2/coolify-mcp

Add -e COOLIFY_READ_ONLY=1 or -e COOLIFY_ALLOW_REVEAL=1 to turn those on. Check with claude mcp list.

Edit claude_desktop_config.json (Settings → Developer → Edit Config), at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows:

{
  "mcpServers": {
    "coolify": {
      "command": "npx",
      "args": ["-y", "github:amintt2/coolify-mcp"],
      "env": {
        "COOLIFY_URL": "https://coolify.example.com",
        "COOLIFY_TOKEN": "<YOUR_COOLIFY_TOKEN>"
      }
    }
  }
}

Restart Claude Desktop. If it can't find npx (common with nvm), use the absolute path from which npx.

One click: use the Add to Cursor button on the website, or open this deeplink (it installs with placeholder values; edit the token afterwards in Settings → MCP):

cursor://anysphere.cursor-deeplink/mcp/install?name=coolify&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsImdpdGh1YjphbWludHQyL2Nvb2xpZnktbWNwIl0sImVudiI6eyJDT09MSUZZX1VSTCI6Imh0dHBzOi8vY29vbGlmeS5leGFtcGxlLmNvbSIsIkNPT0xJRllfVE9LRU4iOiI8WU9VUl9DT09MSUZZX1RPS0VOPiJ9fQ%3D%3D

The config parameter is the base64 of the server JSON ({"command": ..., "args": ..., "env": ...}).

Or by hand, in ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):

{
  "mcpServers": {
    "coolify": {
      "command": "npx",
      "args": ["-y", "github:amintt2/coolify-mcp"],
      "env": {
        "COOLIFY_URL": "https://coolify.example.com",
        "COOLIFY_TOKEN": "<YOUR_COOLIFY_TOKEN>"
      }
    }
  }
}

From a terminal:

code --add-mcp '{"name":"coolify","type":"stdio","command":"npx","args":["-y","github:amintt2/coolify-mcp"],"env":{"COOLIFY_URL":"https://coolify.example.com","COOLIFY_TOKEN":"<YOUR_COOLIFY_TOKEN>"}}'

Or per workspace in .vscode/mcp.json, where VS Code prompts for the token once and stores it securely:

{
  "inputs": [
    { "type": "promptString", "id": "coolify-token", "description": "Coolify API token", "password": true }
  ],
  "servers": {
    "coolify": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "github:amintt2/coolify-mcp"],
      "env": {
        "COOLIFY_URL": "https://coolify.example.com",
        "COOLIFY_TOKEN": "${input:coolify-token}"
      }
    }
  }
}

The website also has an Add to VS Code button (vscode:mcp/install?...).

Edit ~/.codeium/windsurf/mcp_config.json (Windsurf Settings → Cascade → MCP servers → View raw config):

{
  "mcpServers": {
    "coolify": {
      "command": "npx",
      "args": ["-y", "github:amintt2/coolify-mcp"],
      "env": {
        "COOLIFY_URL": "https://coolify.example.com",
        "COOLIFY_TOKEN": "<YOUR_COOLIFY_TOKEN>"
      }
    }
  }
}

Command npx, arguments -y github:amintt2/coolify-mcp, environment COOLIFY_URL and COOLIFY_TOKEN:

{
  "command": "npx",
  "args": ["-y", "github:amintt2/coolify-mcp"],
  "env": {
    "COOLIFY_URL": "https://coolify.example.com",
    "COOLIFY_TOKEN": "<YOUR_COOLIFY_TOKEN>"
  }
}

To run from a local clone instead: npm install (builds dist/ via prepare), then use node /path/to/coolify-mcp/dist/index.js as the command.

Then ask your agent something like "Which Coolify apps are unhealthy?", "Set LOG_LEVEL=debug on the api app, dry run first" or "Redeploy the web app and show me the build log".

The first launch takes a little longer: npx clones the repo and compiles it once, then caches it.

Tools

18 tools. Every tool that takes an application or service accepts a uuid, the exact name, or a unique part of the name or domain.

Area

Tool

What it does

Discovery

get_version

Coolify version, health, API base in use, read-only / reveal flags. Call first when something fails.

list_projects

Projects and their environments

list_servers

Servers, IPs, reachability, proxy type

list_applications

Name, uuid, fqdn, status, git repo/branch, project/environment (filter optional)

get_application

One application's details, secrets stripped

list_services

One-click / compose services (filter optional)

list_databases

Standalone databases, no credentials

Env vars

list_envs

Keys, uuids and flags of an app or service, values masked (key_filter, reveal)

set_envs

Upsert up to 200 {key, value, is_build_time?, is_runtime?, is_preview?, is_literal?, is_multiline?} in one call; dry_run

delete_env

Delete a key (is_preview selects the preview copy); dry_run

Lifecycle

deploy

Deploy by resource (uuid/name, comma-separated) or Coolify tag; force rebuilds without cache

restart_application

Restart containers without rebuilding (picks up runtime env changes)

start_application

Start a stopped app (force, instant_deploy)

stop_application

Stop an app (docker_cleanup)

restart_service

Restart a service, optionally pulling latest images

Observability

list_deployments

Recent deployments of an app, or everything queued / in progress

get_deployment

Status plus the last N build/deploy log lines (default 100)

get_application_logs

Last N container log lines of a running app

Env changes apply after a restart (runtime variables) or a redeploy (build-time variables). set_envs says which in its result. Mutating tools carry MCP destructiveHint / readOnlyHint annotations so clients can ask before running them.

Configuration

Variable

Required

Meaning

COOLIFY_URL

yes

Instance URL, e.g. https://coolify.example.com. A trailing slash or /api/v1 is stripped; /api/v1 is added.

COOLIFY_TOKEN

yes

API token (sent as Authorization: Bearer).

COOLIFY_READ_ONLY

no

1 refuses every mutating tool. Dry runs are still allowed.

COOLIFY_ALLOW_REVEAL

no

1 lets list_envs return plaintext when called with reveal: true. Off by default.

COOLIFY_TIMEOUT_MS

no

Per-request timeout in ms. Default 30000.

npx -y github:amintt2/coolify-mcp --help prints the same list.

Security notes

  • The server runs locally over stdio. It talks only to your COOLIFY_URL; there is no telemetry and no other network access.

  • Your token lives in your MCP client's config. Prefer a client that stores secrets securely (VS Code inputs), keep config files out of git, and scope the token to the permissions you actually want the agent to have.

  • With read:sensitive, env values are fetched from Coolify so they can be compared and masked, but they are not returned to the agent unless you enabled COOLIFY_ALLOW_REVEAL=1 and the agent asked for reveal: true.

  • Service and database listings strip credentials; application details strip webhook secrets and basic-auth passwords.

  • stop_application and delete_env are marked destructive. Use COOLIFY_READ_ONLY=1 when you only want answers.

  • Anything the agent reads (app names, logs) is still shown to your model provider. Don't reveal secrets you wouldn't paste into a chat.

Found a vulnerability? Please open a private security advisory rather than a public issue.

Coolify API notes

  • PATCH /{applications|services}/{uuid}/envs/bulk with {"data": [...]} is an upsert. On applications it resets is_literal, is_multiline and is_shown_once when they are omitted, so set_envs sends the current flags for every key it updates.

  • The build-time flag is is_buildtime (with is_runtime) on current Coolify and is_build_time on older betas. set_envs sends both; the endpoint ignores the one it doesn't know.

  • Service env vars have no preview or build-time flags. Coolify trims values and stores an empty value as null.

  • Application env listings include preview copies: the same key can exist once as a main copy and once as a preview copy (is_preview).

Contributing

Issues and pull requests are welcome.

git clone https://github.com/amintt2/coolify-mcp && cd coolify-mcp
npm install     # also builds dist/ through the prepare script
npm test        # build, then node:test unit tests + an MCP stdio smoke test against an in-process mock Coolify
npm run dev     # tsc --watch

Tests never talk to a real Coolify. When you add a tool, add it to the mock in test/mock-coolify.ts, cover it in test/tools.test.ts and update the tool list in test/smoke.test.ts, this README and docs/index.html.

To try a local build in Claude Code: claude mcp add coolify-dev -e COOLIFY_URL=... -e COOLIFY_TOKEN=... -- node "$PWD/dist/index.js".

License

MIT © Tahar Amin. Not affiliated with Coolify.

Available Tools

18 tools
delete_envDelete an environment variableA
Destructive

Delete one environment variable from an application or service, by key. For applications, is_preview selects the preview copy (default: the main one). Use dry_run to check first. Takes effect after a restart/redeploy.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesVariable name to delete.
dry_runNoReport what would change without calling the mutating API. Allowed even in read-only mode.
resourceYesThe resource: its uuid, its exact name, or a unique part of its name or domain (e.g. "api" or "app.example.com").
is_previewNoApplications only: delete the preview copy of the key.
resource_typeNoRestrict lookup to applications or services. Omit to search both.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description doesn't need to restate destruction. It adds valuable context beyond annotations: the dry_run option (non-destructive way to preview) and the dependency on restart/redeploy for the change to take effect. There is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three tight sentences with no filler. The core action is front-loaded, and the most important modifiers (is_preview, dry_run, restart requirement) are given in a logical order. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, full schema coverage, and a destructive operation with annotations covering safety, the description covers the essential operational details: deletion by key, preview selection, dry-run, and post-action restart. It does not explain error handling (e.g., key not found) but that's not strictly required for a delete operation. Minor gap, so a 4.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 5 parameters. The tool description adds meaningful usage context for dry_run ('Use dry_run to check first') and clarifies the is_preview parameter specifically for applications. This goes slightly beyond the schema's basic descriptions, earning a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Delete') and a clear resource ('environment variable') with scope ('from an application or service, by key'). It also mentions the is_preview distinction for applications, which distinguishes it from sibling tools like set_envs and list_envs. The purpose is immediately unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides actionable guidance: use dry_run to check first and notes that changes take effect after a restart/redeploy. It also clarifies that is_preview applies only to applications. While it doesn't explicitly name sibling tools or state when not to use it, the context is clear enough for an agent to decide. Lacks an explicit alternative comparison, hence a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

deployDeployA

Queue a (re)deployment — rebuilds and restarts. Target either resource (application/service uuid or name; comma-separate several) or tag (every resource with that Coolify tag). force: true rebuilds without cache. Returns deployment uuids; follow progress with get_deployment. Needs the token's deploy permission.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoCoolify tag name(s), comma separated. Mutually exclusive with resource.
forceNoForce rebuild without Docker cache.
resourceNoApplication or service uuid/name; several separated by commas.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behavioral details beyond the annotations: the operation is queued, it rebuilds and restarts, it returns deployment uuids, and it requires the token's deploy permission. It also explains force behavior. No contradiction with the annotations exists; readOnlyHint=false aligns with the mutating nature of the operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and every sentence earns its place: operation, targeting options, force behavior, return value/follow-up, and permission requirement. Important constraints are front-loaded and nothing extraneous is included.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the action, parameter selection, mutual exclusivity, return value, follow-up monitoring tool, and permission requirement. The agent has everything needed to select and invoke it correctly, including an appropriate next step via get_deployment.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema carries the parameter documentation. The description adds useful context for tag ('every resource with that Coolify tag') and clarifies the either/or relationship, but much of the resource/force semantics is already present in the schema. This meets the baseline without needing additional compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Queue a (re)deployment — rebuilds and restarts.' It clearly identifies the operation on applications/services via resource or tag, and the action is distinct from sibling lifecycle tools like restart_service, start_application, and stop_application.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear guidance on targeting modes: 'Target either resource ... or tag,' and explains the force flag alternative for cacheless rebuilds. It also directs the agent to get_deployment for follow-up. It does not explicitly state when to prefer a sibling tool like restart_service, so exclusions are absent but the context is otherwise clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_applicationGet applicationA
Read-only

Get one application's details (domains, status, git, build/start commands, ports, health check, limits, project/environment). Accepts a uuid, exact name, or a unique name/domain substring; errors with the candidates when ambiguous. Secrets (webhook secrets, basic-auth password, compose files) are never returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYesApplication uuid, exact name, or a unique part of its name or domain.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses two valuable behaviors: it returns candidates when the identifier is ambiguous, and it never returns secrets (webhook secrets, basic-auth passwords, compose files). This gives the agent important expectations about outputs and error handling that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences and economically packed. The core purpose is front-loaded, followed by input flexibility and the critical secrets exclusion. No filler or repetition of annotation data is present, earning a top score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by listing the returned detail categories and explicitly noting what will never be returned. It also covers identifier resolution and ambiguous-case errors, which are the main non-obvious behaviors. For a single-resource get, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully describes the parameter with 100% coverage ('Application uuid, exact name, or a unique part of its name or domain'). The description repeats the same semantics and adds the ambiguity-related error behavior, but that is behavioral transparency, not parameter meaning. Baseline 3 applies because the schema carries the full semantic load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: 'Get one application's details', then enumerates the exact fields returned (domains, status, git, build/start commands, ports, health check, limits, project/environment). This clearly distinguishes it from sibling list tools like list_applications and get_application_logs, leaving no ambiguity about its scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use case is clear: when you need a single application's full configuration. It also explains the accepted input formats and the ambiguity error behavior. However, it does not explicitly contrast with alternative tools like list_applications or get_deployment, though the 'one application' framing implies when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_application_logsGet application logsA
Read-only

Last lines lines (default 100) of a running application's container logs. Fails with a clear message if the app is not running.

ParametersJSON Schema
NameRequiredDescriptionDefault
linesNoTrailing lines to return.
applicationYesApplication uuid, exact name, or a unique part of its name or domain.
show_timestampsNoPrefix lines with Docker timestamps.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already communicate read-only safety. The description adds useful behavioral context by stating the tool returns only trailing lines and fails clearly when the app is not running, which is beyond what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences front-load the core behavior and add a relevant failure note with no wasted words. The description is appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description sufficiently conveys invocation conditions, failure behavior, and output scope for a simple read-only log tool. There is no output schema, so the exact response format is slightly under-specified, but this does not materially impair correct selection or calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each parameter is already well-described in the schema. The tool description only restates the lines default and application context, adding little semantic value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: retrieving the last lines of a running application's container logs, including the default line count. This clearly distinguishes it from the sibling management/list tools, none of which are log-focused.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Establishes the applicable context (running application) and explicitly describes the failure mode if the app is not running. It does not name alternatives, but no sibling tool targets application logs, so this is sufficient practical guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_deploymentGet deploymentA
Read-only

Status of one deployment plus the last lines lines of its build/deploy log (default 100). Log output requires the token's read:sensitive permission.

ParametersJSON Schema
NameRequiredDescriptionDefault
linesNoHow many trailing log lines to return.
deployment_uuidYesDeployment uuid (from deploy, restart_application or list_deployments).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, and the description adds the permission requirement for log output (read:sensitive) and the line-limit behavior (default 100). This goes beyond the annotation by specifying a practical constraint, though it doesn't describe the response structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences front-load the primary purpose (status + log lines) and immediately follow with the permission note. No filler or redundancy; every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with fully described parameters, this covers the essential context: what it returns and a critical permission caveat. The lack of return-format details is acceptable since no output schema is expected, and the annotations cover the safety profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so both parameters are fully described in the schema. The description adds only the nuance that lines come from the build/deploy log, which is a minor clarification that doesn't materially exceed what the schema already conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it retrieves the status of a single deployment plus log lines, which distinguishes it from list_deployments (listing multiple) and get_application_logs (application logs). The verb 'get' plus resource 'deployment' is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for a specific deployment via its UUID but does not explicitly contrast with siblings like list_deployments or get_application_logs. No 'when not to use' guidance is provided, leaving the agent to infer context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_versionCoolify version and healthA
Read-only

Check connectivity: returns the Coolify version, the health endpoint result, the API base URL in use and whether this MCP server is read-only / allows revealing secrets. Call this first when other tools fail.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and openWorldHint=true, so the description doesn't contradict them. It adds value by mentioning that it reveals whether the server is read-only and whether secrets are allowed to be revealed, which is not evident from annotations alone. However, it doesn't detail what specific endpoints are hit or potential side effects (though read-only), so a slight gap remains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the primary purpose ('Check connectivity') and then lists the key return values concisely. It also includes the usage guidance in the same sentence, making it extremely efficient with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool has no parameters, no output schema, and simple annotations, the description is fully complete for an agent to understand what the tool does and when to call it. The agent knows it returns version/health/base URL and read-only status, and the usage context is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so the description need not explain any. The schema is empty with 100% coverage (effectively), and the description accurately states there are no inputs needed. This baseline of 4 for no-parameter tools is justified because the description doesn't introduce any confusion and is consistent with the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: checking connectivity and returning version, health, base URL, and read-only/secret-reveal status. It is distinct from sibling tools, which are all focused on specific resources or actions, while this one is a meta/connectivity check.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to call this tool first when other tools fail, providing a clear 'when to use' directive. It also conveys that it is a preliminary diagnostic tool, effectively differentiating it from the resource-specific siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_applicationsList applicationsA
Read-only

List applications with name, uuid, domain(s) (fqdn), status (e.g. running:healthy, exited), git repo/branch, build pack, project and environment. Use filter to narrow by name/domain substring.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoCase-insensitive substring matched against name and fqdn.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the description only needs to add extra behavioral context. It does so by specifying filter semantics (case-insensitive substring on name/fqdn) and enumerating returned fields with status examples, which is especially valuable because no output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: the first front-loads the purpose and output fields, the second gives the only invocation nuance. No filler and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one optional parameter, no output schema, and read-only annotations, the description provides enough information to select and invoke correctly: output fields, filter behavior, and resource type. Missing pagination/ordering details are minor given openWorldHint and the simple scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter is fully documented in the input schema ('Case-insensitive substring matched against name and fqdn'), and the description largely restates that instruction. With 100% schema coverage, the description adds no new parameter semantics beyond what the schema already provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly identifies a list operation on applications and enumerates the meaningful output fields (name, uuid, fqdn, status, git repo/branch, build pack, project, environment). This makes it easy to distinguish from sibling list_* tools and get_application.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus get_application or other list_* siblings. The only usage note targets the filter parameter ('Use filter to narrow...'), not tool selection, so an agent must infer the appropriate context from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_databasesList databasesA
Read-only

List standalone databases (name, uuid, type, status, public exposure, project/environment). Connection URLs and passwords are never returned.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, indicating a safe read operation. The description adds a valuable behavioral guarantee that 'Connection URLs and passwords are never returned', which is not derivable from annotations and directly affects agent expectations about sensitive data. This enriches the transparency beyond the annotation baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the action and resource, then lists the returned fields, and ends with a security note. Every word adds value; there is no filler or repetition. It is concise and well-structured for quick parsing by an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with no parameters and no output schema, the description covers the essential information: what is listed and what fields are returned, plus a security caveat. It does not mention pagination, sorting, or filtering, but these are unlikely to be needed given the tool's simplicity and the absence of input parameters. The description is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema coverage is 100% (vacuously). With no parameters to document, the baseline for parameter semantics is 4, and the description does not need to add parameter-specific details. The description focuses on output fields, which is appropriate given the absence of inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and the resource 'standalone databases', specifying the exact fields returned (name, uuid, type, status, public exposure, project/environment). This distinguishes it from sibling list tools like list_projects or list_servers by making the database scope explicit, and the qualifier 'standalone' further narrows the resource type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives, nor does it mention when not to use it. However, the purpose is clear enough that an agent would infer usage for listing databases, and the sibling tools are named by resource, making the selection intuitive. No explicit exclusions or alternative routing are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_deploymentsList deploymentsA
Read-only

With application: that app's most recent deployments (newest first, status/commit/timestamps). Without it: deployments currently queued or in progress across all servers.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many recent deployments (per application).
applicationNoApplication uuid, exact name, or a unique part of its name or domain.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is known. The description adds value by revealing the ordering (newest first), the fields returned (status/commit/timestamps), and the special behavior for the unfiltered case (queued or in-progress). It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loading the key distinction between the two modes. Every word earns its place, and the structure makes the behavior immediately understandable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the readOnlyHint and openWorldHint annotations, the description is quite complete. It explains the return fields, ordering, and the difference in scope. It doesn't describe pagination beyond the limit parameter, but the limit is already documented in the schema. No critical information is missing for a listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters have clear descriptions. The tool description adds conditional semantics (the application parameter changes the scope entirely), which goes beyond the schema's standalone definitions. It reinforces the meaning without redundancy.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists deployments, with a specific distinction based on the application parameter. It describes the output content (newest first, status/commit/timestamps) and differentiates between filtered and unfiltered behavior, making it distinct from sibling tools like get_deployment which fetches a single deployment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use the tool with the application parameter (to get that app's recent deployments) and without it (to see queued or in-progress deployments). However, it does not name alternatives or state when not to use it, though the two-mode behavior itself serves as clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_envsList environment variablesA
Read-only

List the environment variables of an application or service: key, uuid and flags (is_build_time, is_runtime, is_preview, is_literal, is_multiline, is_shown_once). Values are MASKED (short prefix + length, or "(empty)") so secrets stay out of the conversation. reveal: true returns plaintext only if the server was started with COOLIFY_ALLOW_REVEAL=1 — avoid it unless the user explicitly needs a value.

ParametersJSON Schema
NameRequiredDescriptionDefault
revealNoReturn plaintext values (requires COOLIFY_ALLOW_REVEAL=1).
resourceYesThe resource: its uuid, its exact name, or a unique part of its name or domain (e.g. "api" or "app.example.com").
key_filterNoOnly keys containing this substring (case-insensitive).
resource_typeNoRestrict lookup to applications or services. Omit to search both.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses that values are masked to keep secrets out of the conversation, explains the masking format, and reveals the server-side requirement (COOLIFY_ALLOW_REVEAL=1) for plaintext. This is valuable behavioral context that annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler: it front-loads what is listed, then the masking rule, then the reveal caveat. Every sentence earns its place and the most safety-critical guidance is placed at the end without being buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description compensates by explicitly listing the output fields and flag names. It also covers the important masking behavior and the security-critical reveal condition. The schema covers all parameters, so no essential calling information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all parameters. The description adds context about reveal behavior but does not add new meaning to the parameters themselves; it correctly relies on the schema for parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('List') and a precise resource ('environment variables of an application or service'), and explicitly enumerates the returned fields (key, uuid, flags). This clearly distinguishes it from sibling tools like list_applications, set_envs, and delete_env.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear usage context: this is a read-only listing operation, and it gives an explicit when-not instruction for reveal ('avoid it unless the user explicitly needs a value'). It does not explicitly name alternatives such as set_envs or delete_env, but the read-only framing makes the distinction clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsList projectsA
Read-only

List Coolify projects with their environments (e.g. production, staging).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that projects are returned with their environment names, but it does not disclose pagination, sorting, or response shape beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. The verb, resource, and output detail are all present and every element earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list operation with open-world semantics, this description is sufficient. It states what is returned and the annotations cover safety, so an agent can select and invoke the tool correctly without missing critical context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema documents this completely with 100% coverage. With no parameters to explain, the description does not need to add parameter semantics; the environment mention is a useful extra but not required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'List', names the resource 'Coolify projects', and specifies that output includes environments such as production/staging. This clearly distinguishes it from sibling listing tools by resource type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance about when to prefer this over list_applications, list_servers, or list_envs, nor any 'when not to use' note. The resource name implies its purpose, but the description leaves the comparison to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_serversList serversA
Read-only

List servers attached to Coolify with IP, reachability and proxy type.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=true and openWorldHint=true, and the description is consistent with both. The description adds value by disclosing the output attributes (IP, reachability, proxy type), which helps the agent interpret results, though it leaves minor ambiguity about whether unreachable servers are included in the list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with the verb and resource front-loaded, followed by scope and output fields. No filler; every phrase contributes to the agent's understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool, the description names the resource, scope, and principal output fields, which is sufficient given the readOnly and openWorld annotations. With no output schema, the description carries the return expectations and does so, though pagination behavior and reachability semantics remain unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema carries nothing to elaborate. Per the zero-parameter baseline, the description needs no parameter detail; it instead clarifies what the returned records contain, which is the meaningful semantic content here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') with a clear resource ('servers attached to Coolify') and enumerates the returned attributes (IP, reachability, proxy type). This differentiates it from sibling list tools like list_projects, list_applications, and list_databases, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage is implied — call this to inspect the Coolify server inventory — but the description never explicitly states when to use it versus alternatives or provides exclusion conditions. No sibling lists servers, so differentiation is carried by the resource name alone rather than explicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_servicesList servicesA
Read-only

List one-click / docker-compose services (name, uuid, type, status, project/environment).

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoCase-insensitive substring matched against name.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already convey readOnlyHint and openWorldHint, so the description does not need to restate safety. It adds the returned fields but no further behavioral details such as pagination, sorting, limits, or error behavior, which is acceptable for a simple read-only list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with the core action front-loaded. Every word contributes to defining scope and output without unnecessary filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a low-complexity tool with one optional parameter and no output schema. The description names the returned fields, and the annotations cover safety and world-interaction context, so it is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, filter, is fully described in the input schema with 100% coverage. The description adds no additional semantic meaning beyond the schema, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource, 'List one-click / docker-compose services', and enumerates the returned fields. This clearly distinguishes it from sibling list tools such as list_applications and list_databases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The resource scope is implied by the description, but it does not explicitly say when to use this tool versus alternatives like list_applications or list_databases. There are no exclusions, fallbacks, or conditions stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restart_applicationRestart applicationA

Restart an application's containers without rebuilding (picks up runtime env var changes; build-time changes need deploy). Returns a deployment uuid to follow with get_deployment.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYesApplication uuid, exact name, or a unique part of its name or domain.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate this is not read-only and not destructive. The description adds valuable context: it restarts containers without rebuilding, which implies a potentially brief downtime (not stated, but the nature of restart is clear). It also discloses it returns a deployment uuid to follow, which is a behavioral trait not in annotations or schema. No contradiction. The description carries the burden well given annotations exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no fluff. The first sentence states the core action and its limits, the second states the return value and how to use it. Every word earns its place, and the critical information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple tool with one parameter and no output schema. The description tells the agent exactly what to expect (a deployment uuid) and how to proceed (follow with get_deployment). It explains the difference from deploy, which is the main contextual gap. It does not mention potential failure modes or prerequisites (e.g., application must exist), but those are likely inferred from the parameter description. Overall, adequate for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and fully explains the 'application' parameter (uuid, exact name, or unique part). The tool description does not add any additional meaning to the parameter beyond what the schema provides. Baseline of 3 is appropriate because the schema already handles semantics completely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Restart') and resource ('an application's containers'), and clarifies the scope ('without rebuilding'). It distinguishes itself from siblings like deploy, start_application, and stop_application by noting the change mechanism (runtime env vars vs build-time changes). An agent can immediately understand what this tool does and how it differs from related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool ('picks up runtime env var changes') and when not to ('build-time changes need deploy'), providing a clear decision rule against the most likely alternative. It also guides the follow-up action (use get_deployment with the returned uuid). It does not explicitly mention other siblings like restart_service, but the core distinction is covered. Would be a 5 if it named restart_service as an alternative for service-level restarts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restart_serviceRestart serviceA

Restart a service (all its containers), e.g. after changing its env vars. latest: true pulls the latest images first.

ParametersJSON Schema
NameRequiredDescriptionDefault
latestNoPull latest images before restarting.
serviceYesService uuid, exact name, or unique name substring.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false and destructiveHint=false, and openWorldHint=true. The description adds that it restarts all containers and can pull images if `latest` is set, which are useful behavioral details. However, it doesn't mention potential downtime or side effects on connections, which could be relevant but isn't a contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences, front-loaded with the core purpose and a concrete example. It avoids unnecessary detail and is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a simple restart operation with full schema coverage and no output schema. The description provides the key usage context and the flag explanation. It could explicitly distinguish from restart_application, but the tool name and description make it reasonably clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are fully documented in the schema (100% coverage), including the meaning of `latest` and the flexible format for `service`. The description essentially repeats the schema's explanation for `latest` and adds nothing new about parameters, so it adds minimal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Restart') and the resource ('a service (all its containers)'), and provides a concrete use case ('after changing its env vars'). This distinguishes it from sibling tools like restart_application, which targets applications rather than services.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a specific context for when to use the tool (after changing env vars) and explains the `latest` flag. However, it doesn't explicitly mention alternatives or when not to use it, such as comparing to restart_application. Still, the use case provides clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_envsCreate or update environment variablesA
Idempotent

Upsert one or many environment variables on an application or service in a single call: existing keys are updated, missing keys created, identical ones left alone. Returns per key created / updated / unchanged plus which fields changed — values are never echoed. Flags you omit keep their current value on update. For applications, the main and preview copies of a key are separate (use is_preview). Use dry_run to preview. Changes only take effect after restart_application / restart_service, or deploy for build-time variables.

ParametersJSON Schema
NameRequiredDescriptionDefault
envsYesVariables to upsert.
dry_runNoReport what would change without calling the mutating API. Allowed even in read-only mode.
resourceYesThe resource: its uuid, its exact name, or a unique part of its name or domain (e.g. "api" or "app.example.com").
resource_typeNoRestrict lookup to applications or services. Omit to search both.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (idempotent, non-destructive), the description discloses key behavioral traits: existing keys are updated, missing created, identical left alone (idempotency), values are never echoed, omitted flags keep current values, preview vs main separation, dry_run mode, and the requirement to restart or deploy for changes to take effect. This is rich behavioral context that significantly aids correct invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense sentence that front-loads the main purpose, then logically flows through key behaviors. Every clause adds necessary information without redundancy. It is appropriately concise for the complexity of the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with multiple parameters, flags, and side effects, the description covers all critical aspects: return format, value handling, flag semantics, preview vs main, dry_run, and the required follow-up actions (restart or deploy). No essential operational detail is missing, making it complete for correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so each parameter already has a description. The tool description adds semantic meaning beyond the schema by explaining that omitted flags retain their current values, that is_preview targets the preview copy, and that dry_run is allowed even in read-only mode. It clarifies the upsert behavior and effect of flags, which goes beyond the basic parameter definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Upsert') and resource ('environment variables on an application or service'), and clearly distinguishes it from siblings like list_envs and delete_env by defining its scope and behavior. It also specifies the return status per key, which removes ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool, including that it performs an upsert and that changes take effect only after a restart or deploy. It also explicitly suggests using dry_run to preview, which is a usage directive. However, it does not explicitly name alternative tools or state 'when not to use', though the context makes it evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_applicationStart applicationB

Start (deploy) a stopped application. force rebuilds without cache; instant_deploy skips the queue.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoForce rebuild without cache.
applicationYesApplication uuid, exact name, or a unique part of its name or domain.
instant_deployNoSkip the deployment queue.

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false, openWorldHint=true, and destructiveHint=false, covering the safety profile. The description adds no further behavioral context such as side effects, permissions, or asynchronous behavior. It only explains parameter effects, which are already in the schema, so the added behavioral value is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, with the main action front-loaded and flag semantics in the second sentence. Every word earns its place; there is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a start operation with two booleans and no output schema, the description covers the core action and flags. However, it omits information about return values, whether the operation is synchronous, or any prerequisites besides the application being stopped. Given the sibling set, some guidance on response format would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter already has a description. The tool description repeats these (e.g., 'force rebuilds without cache' matches the schema). It adds no new meaning beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Start (deploy) a stopped application.' It specifies the resource (application) and the state (stopped), which helps distinguish it from restart or deploy. However, it does not explicitly name sibling tools to differentiate, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: start a stopped application. It does not provide explicit guidance on when to prefer this over deploy or restart_application, nor does it list exclusions. The flag explanations give context but no alternatives, making the guidance implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stop_applicationStop applicationA
Destructive

Stop an application's containers (the site goes down until start_application or deploy). docker_cleanup (Coolify default true) prunes networks/volumes afterwards.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYesApplication uuid, exact name, or a unique part of its name or domain.
docker_cleanupNoPrune unused Docker networks/volumes after stopping (Coolify default: true).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds valuable context: the site goes down, and docker_cleanup prunes networks/volumes afterwards. It doesn't detail reversibility or permission requirements, but the core behavioral impact is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the most important consequence (site goes down), and the docker_cleanup note is concise. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive stop operation with annotations and full schema coverage, the description covers the key consequences and recovery path. It doesn't mention whether the operation is reversible or if there are prerequisites, but the essential information for an agent to decide and invoke is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters. The description adds the behavioral consequence of docker_cleanup (prunes networks/volumes) and the application parameter's fuzzy matching is already in the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool stops an application's containers and explicitly notes the site goes down until start_application or deploy. This distinguishes it from sibling tools like start_application, restart_application, and deploy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it (when you need to take an application down) and mentions the recovery path via start_application or deploy. It doesn't explicitly state when not to use it or name alternatives, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 18 tool updatesv0.1.1
    • First observeddelete_env
    • First observeddeploy
    • First observedget_application
    • First observedget_application_logs
    • First observedget_deployment
    • First observedget_version
    • First observedlist_applications
    • First observedlist_databases
    • First observedlist_deployments
    • First observedlist_envs
    • First observedlist_projects
    • First observedlist_servers
    • First observedlist_services
    • First observedrestart_application
    • First observedrestart_service
    • First observedset_envs
    • First observedstart_application
    • First observedstop_application

TDQS

A3.9/5.0

Scored across 18 tools

Disambiguation5/5

Each tool targets a distinct resource and action, with clear separation between list/get/set/delete and lifecycle actions. Potential overlaps like restart_application vs restart_service vs deploy are disambiguated by resource type and rebuild semantics.

Naming Consistency4/5

Tool names consistently use lower_snake_case with a verb_noun pattern (list_, get_, set_, delete_, start_, stop_, restart_). The only minor deviation is the bare 'deploy', but it remains an acceptable imperative verb in the same style.

Tool Count4/5

At 18 tools, the set is slightly above the ideal 3-15 range but not bloated, since each tool covers a distinct area of Coolify's domain such as resources, environment variables, deployments, and logs. The count is reasonable for the platform's breadth.

Completeness3/5

The toolset provides strong operational coverage: resource listing/status, env var management, start/stop/restart/deploy, deployment tracking, and logs. However, it lacks create/update/delete operations for projects, servers, databases, and applications, and has no get for services/databases, leaving notable lifecycle gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to interact with Coolify self-hosted instances for application deployment, management, and monitoring. Features 4 unified tools optimized for VS Code's limits, covering app management, environment configuration, system administration, and built-in documentation.
    4
    140 npm
    1
    MIT
  • A
    license
    B
    quality
    F
    maintenance
    Enables AI assistants to interact with Coolify for complete infrastructure management including applications, databases, servers, deployments, and team operations. Provides 100% API coverage with 64 tools for managing the entire Coolify ecosystem through natural language.
    18
    7 npm
    6
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to deploy and manage applications on Coolify through structured tools, supporting project management, app lifecycle control, pre-configured templates, and deployment monitoring with built-in safety guardrails.
    140 npm
    3
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables control and management of Coolify self-hosted PaaS instances, allowing you to deploy applications, manage databases, monitor servers, and execute operations directly from AI assistants.
    89
    11 npm
    29
    MIT