Skip to main content
Glama

appbyggaren-mcp

An MCP server that lets an agent publish small static web apps: source into Gitea, build and TLS via Coolify. Five verbs, hard boundaries.

Built to give a household assistant a "mini Lovable" — "build me a page that counts down to the summer holidays" — without giving it the keys to the PaaS.

Why it exists

Coolify's own MCP server is read-only, and its API tokens are instance-wide capabilities (read / write / deploy / root) with no per-project scoping. Handing that token to a model means handing it every application on the instance, including the ones you care about.

This server sits in between. It holds the write credentials; the model gets five verbs that cannot express anything outside the configured project, organisation and domain. The asymmetry is the whole design.

Related MCP server: coolify-mcp

Tools

Tool

Does

list_apps

Apps published by this server, with status and URL

get_app

Status, URL and repository for one app

create_app

Create repo, push files, create the Coolify app, deploy

update_app

Replace files and redeploy

get_deploy_logs

Last deployment log — for when a build fails

delete_app

Remove the app; keeps the repo unless asked otherwise

Apps are static sites served by nginx: HTML, CSS and client-side JS. No server-side runtime, no database.

Boundaries

Enforced in guards.py, on every mutating call:

  • Project — an application's project UUID is re-checked against the configured one before it can be touched. The UUID is the only thing the caller supplies, so it is never trusted.

  • Domain — publishing is limited to <name>.<APPBYGGAREN_DOMAIN_SUFFIX>. An app re-pointed elsewhere in the Coolify UI drops out of scope and becomes immutable here.

  • Organisation — repositories are only created under GITEA_ORG.

  • Names^[a-z0-9][a-z0-9-]{0,30}[a-z0-9]$, with a reserved list. The slug becomes a DNS label, a repo name and a container name, so it must survive all three.

  • Payload — max 40 files, 2 MB total, index.html required, and paths are normalised to reject traversal. Gitea's contents API takes the path verbatim, so ../ would otherwise escape the repository.

Configuration

All via environment variables — see .env.example. The Coolify, Gitea and domain settings are required; everything else is optional.

Nothing about a particular deployment is baked into the source. Which hostnames are already taken, which domains count as internal, and which names are worth flagging are all properties of your installation — hard-coding them here would publish your DNS layout to anyone reading the repository.

Variable

Effect when unset

APPBYGGAREN_RESERVED_NAMES

Only the generic baseline is reserved

APPBYGGAREN_INTERNAL_DOMAINS

The internal-hostname check does not run

APPBYGGAREN_PII_NAMES

No names are flagged

CLOUDFLARE_ACCESS_TOKEN + CLOUDFLARE_ACCOUNT_ID

publish_app refuses, with a message saying why

The content scan is a filter, not a judgement

publish_app refuses when it finds personal numbers, email addresses, phone numbers, private IPs, secrets, or anything you listed above. It will not notice that "countdown to our holiday, 14 July" says when a house will be empty. Read what the app actually says before publishing it.

Install

uv venv .venv && uv pip install --python .venv/bin/python .
.venv/bin/appbyggaren-mcp          # stdio transport

Register with an MCP client (example: Hermes Agent):

hermes mcp add appbyggaren --command /opt/appbyggaren-mcp/.venv/bin/appbyggaren-mcp

If your client passes no environment to stdio children, reference the variables as ${VAR} placeholders in its config rather than inlining secrets.

Known Coolify quirks

/applications/public truncates the git URL. It stores only owner/repo and leaves git_full_url, source_type and source_id null, assuming a hosted provider. A self-hosted Gitea URL then never clones — and the failure is silent: HTTP 201, no deployment recorded, no container, status exited:unhealthy, no error anywhere. This server issues a PATCH with the full .git URL immediately after creation and refuses to deploy if the stored value still looks truncated.

Certificates lag the deploy. Traefik requests the certificate when the router appears, so the first seconds after publishing serve TRAEFIK DEFAULT CERT. That is not a failure; it resolves on its own.

Development

uv pip install --python .venv/bin/python -e ".[dev]"
.venv/bin/pytest
.venv/bin/ruff check .

Licence

MIT

Available Tools

8 tools
create_appA

Publish a new static web app and return its generated name and URL.

files is a list of {"path": "index.html", "content": "<!doctype html>…"}; an index.html at the root is required.

The name is assigned by this server, not by you. It becomes a DNS label in a zone that hosts real services, so it is generated here — you cannot request one. Use description for the human-readable purpose; report the returned name and URL back to the user verbatim.

The build is a static site served by nginx — HTML, CSS and client-side JS. There is no server-side runtime and no database.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYes
descriptionNo
requested_byNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the burden of behavioral disclosure. It clearly explains that the name is server-generated and cannot be chosen, that files must include index.html, and that the app is served as static content by nginx. It omits details like error conditions or side effects beyond publication, but the core behavior is well covered.

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 well-structured and front-loaded, with the primary purpose in the first sentence. Each paragraph adds meaningful detail—file format, naming constraints, and deployment environment—without redundancy. It is appropriately sized for the tool's complexity.

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 is quite complete for a creation tool with an output schema: it covers the required file structure, naming behavior, and deployment constraints. The main gap is the missing explanation of the requested_by parameter, and it doesn't mention potential error cases, but overall it informs the agent sufficiently 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?

Schema description coverage is 0%, so the description must compensate. It provides a precise format for the files parameter and explains the purpose of description, but requested_by is not mentioned. This leaves one parameter semantically undocumented, making the compensation incomplete.

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 tool creates and publishes a new static web app and returns its generated name and URL. It is specific about the resource (static web app) and action (create/publish), but it does not explicitly differentiate from the sibling tool publish_app, which could overlap in meaning.

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: for creating a new static site, requiring an index.html, and it explicitly states the limitation of no server-side runtime or database. It does not name alternative tools directly, but the requirements and exclusions give practical guidance.

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

delete_appA

Delete an app. The source repository is kept unless delete_repository is true.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
delete_repositoryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the burden of disclosing behavior. It transparently reveals a key nuance: the source repository is kept unless 'delete_repository' is true. This is valuable behavioral context beyond the schema. It does not mention irreversibility or side effects, but the key conditional behavior is clear.

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, front-loaded with the core action and immediately followed by the clarifying detail. Every word earns its place, with no fluff.

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 delete operation, the description covers the primary action and the important conditional behavior. It does not detail return values or side effects, but an output schema is present and the operation is straightforward. It is sufficient for safe 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 description directly explains the 'delete_repository' parameter, which is the non-obvious one, by stating that the repository is kept unless it is true. The 'name' parameter is not explicitly described, but it is self-evident from the tool name and context. With 0% schema coverage, this description compensates well for the critical parameter.

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: 'Delete an app.' It uses a specific verb and resource, and the added nuance about the repository distinguishes it from sibling tools like unpublish_app or update_app.

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 deleting apps, and the repository caveat gives some conditional guidance. However, it does not explicitly state when to choose this over alternatives (e.g., unpublish_app for temporary removal) or mention any prerequisites or exclusions.

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

get_appA

Get status, URL and repository for one app.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description must bear the full burden. The verb 'Get' suggests a read-only operation, and the description lists return fields, but it does not disclose error behavior, authentication needs, or rate limits. This is acceptable for a simple read but lacks explicit safety confirmation.

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 that is front-loaded and free of fluff. It directly states the tool's purpose and output.

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?

With a single parameter and an output schema present, the description provides sufficient context for an agent to invoke the tool. It lists the returned fields, and the simplicity of the operation means extensive explanation is unnecessary. However, it lacks error-case or alternative guidance, so not a 5.

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 schema has 0% description coverage for the single 'name' parameter. The description clarifies that the operation is for 'one app', implicitly linking the name to an app identifier, but does not explain the expected format or constraints. It adds some meaning beyond the schema but not comprehensive.

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 verb 'Get' with a specific resource 'app' and lists the return data (status, URL, repository), distinguishing it from sibling tools like list_apps (list) and delete_app (delete).

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 single-app lookup but does not explicitly state when to prefer this over list_apps or other alternatives. No when-not-to-use guidance is provided.

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

get_deploy_logsA

Return the most recent deployment log for an app — use when a build fails.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses the read-only nature via 'Return' and the 'most recent' scoping, which are important traits. However, it omits details about error behavior, auth requirements, or what happens when no logs exist, leaving some behavioral gaps.

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 leads with the verb and resource, then supplies the use case. Every word earns its place, with no filler or redundancy.

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 simple (one required parameter) and has an output schema, so the description need not detail return values. It covers the core use case, the 'most recent' limitation, and the trigger scenario. Minor edge-case omissions are not critical given the low complexity.

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 0%, but the description's phrase 'for an app' implies that the single 'name' parameter refers to the app whose deployment log is needed. This provides essential semantic context that the schema's bare 'name' string lacks, compensating well for the low coverage.

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 ('Return'), the resource ('deployment log'), the scope ('most recent'), and the target ('for an app'). It distinguishes itself from sibling app management tools by focusing on log retrieval, making it unmistakable.

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 provides a when-to-use trigger: 'use when a build fails.' It does not mention alternatives or exclusions, but no sibling tool serves the same log-retrieval purpose, so the guidance is clear.

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

list_appsA

List the apps published by this server, with status and URL.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It accurately describes the main behavior (listing apps) and implies a read-only operation, but it does not mention authentication requirements, rate limits, pagination, or potential errors. For a simple list operation, this is adequate but not exhaustive.

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 is front-loaded with the action and resource, containing no fluff or redundant information. It is maximally concise while conveying the essential purpose and output.

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 the tool's simplicity (no parameters), the presence of an output schema, and the straightforward purpose, the description is complete. It states what the tool does and the key fields returned, needing no further elaboration for an agent to select and invoke it correctly.

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 is empty, so the description need not explain parameter syntax. The baseline for zero parameters is 4, and the description does not need to add anything beyond what it includes.

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 apps published by this server, with a specific verb ('list'), resource ('apps'), and scope ('published by this server'). It also mentions the output fields (status and URL), distinguishing it from siblings like get_app (single app) and create/update/delete mutations.

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 when you need an overview of all apps on the server, but it does not explicitly state when to use this tool over alternatives like get_app for a single app. There are no direct exclusions or alternative tool mentions, leaving the usage context partially implicit.

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

publish_appA

Make an app reachable from outside without a login.

Scans the repository first and refuses if it finds personal data, internal hostnames or secrets — a published app is readable by anyone.

The scan is a pattern filter, not a judgement. It cannot tell that "countdown to our holiday" reveals when the house is empty. Read what the app actually says before asking for this.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

With no annotations, the description fully carries behavioral disclosure. It reveals the repository scan, refusal on sensitive data, public readability of the result, and the pattern-filter limitation. This is rich, safety-relevant context that goes beyond simple intent.

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 four sentences, each adding distinct value: purpose, automatic scan/refusal, limitation of the scan, and a practical caution. It is front-loaded with the intended action and avoids fluff.

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 security-sensitive publish operation with an output schema, the description covers the core action, safety checks, behavioral limitation, and user guidance. It does not describe return values, but the output schema exists, so no major contextual gap is evident.

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

Parameters2/5

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

The input schema has one required string parameter, 'name', with no description. The tool description never mentions this parameter, and with 0% schema coverage it does not compensate; an agent must infer that 'name' refers to the app to publish.

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 opens with a specific verb+resource+outcome: 'Make an app reachable from outside without a login.' This clearly distinguishes publish_app from siblings like unpublish_app, list_apps, and delete_app.

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 context for when to use the tool: to expose an app publicly without login. It also warns to read the app's content before requesting publication, but does not explicitly name alternatives or provide a direct 'when not to use' statement.

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

unpublish_appB

Put an app back behind the login.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose behavioral traits. It implies a state change but does not mention whether it is reversible, requires specific permissions, or has side effects on app accessibility. Given it is a mutation tool, this gap is significant.

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, clear sentence with no filler. It is appropriately sized for the tool's simplicity and front-loads the core action.

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?

The tool is simple (one parameter) and has an output schema, so the description does not need to explain return values. However, it lacks context about prerequisites (e.g., app must exist and be published), reversibility, and side effects, making it only partially complete.

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

Parameters2/5

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

The schema has a single 'name' parameter with 0% coverage, and the description does not add any information about it. While it is reasonably inferable that 'name' refers to the app name, the description fails to explicitly state this or provide format/validation context.

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 'Put an app back behind the login' clearly communicates that this tool reverts an app to a private, login-protected state. The verb 'put back' combined with the resource 'app' distinguishes it from siblings like publish_app, delete_app, and update_app.

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?

The description provides no explicit when-to-use or alternative guidance. The word 'back' implies the app was previously published, but there is no mention of prerequisites, exclusions, or when to choose this over publish_app or delete_app.

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

update_appA

Replace files in an existing app and redeploy it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
filesYes
messageNoupdate

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the core mutation (replace files) and the side effect of redeployment, which is good. However, it omits details such as whether existing files are permanently overwritten, any permission requirements, or what happens if the app does not exist. The description is adequate but not rich.

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, focused sentence that conveys the essential action in under ten words. Every word earns its place, and there is no redundancy or extraneous information.

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

Completeness2/5

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

The tool has an output schema, so return values need not be explained, but the description is minimal for a mutation tool with no annotations and 0% schema coverage. It does not address prerequisites (e.g., app must exist), destructive implications beyond 'replace', or deployment process details. The tool has multiple parameters and side effects, yet the description covers only a fraction of the operational context.

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

Parameters2/5

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

The schema has 0% description coverage, so the description must compensate by explaining the parameters. It only hints at the 'files' parameter by saying 'Replace files', but it does not explain 'name' (which app to update) or 'message' (commit message). The file structure is also left undefined. The description adds marginal value but fails to meaningfully clarify the parameters.

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 and specifically states the tool's function: replacing files in an existing app and redeploying it. The verb 'replace' and resource 'existing app' clearly distinguish this from siblings like create_app (new app), delete_app (remove), and publish/unpublish (deploy state changes).

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 conveys clear context for use: it targets an existing app ('in an existing app'), which implies it is for updates rather than creation or deletion. However, it does not explicitly exclude alternatives or provide explicit when/when-not guidance beyond that, so it gets 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.

Tool Schema Changelog

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

  1. 8 tool updatesv0.1.0
    • First observedcreate_app
    • First observeddelete_app
    • First observedget_app
    • First observedget_deploy_logs
    • First observedlist_apps
    • First observedpublish_app
    • First observedunpublish_app
    • First observedupdate_app

TDQS

A4/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct operation: CRUD for apps (create, get, list, update, delete), visibility control (publish/unpublish), and log retrieval. No overlapping purposes; get/list and publish/unpublish are clearly differentiated.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case (delete_app, get_deploy_logs, list_apps, create_app, update_app, publish_app, unpublish_app). Verbs clearly indicate the action, and nouns stay within the app domain.

Tool Count5/5

8 tools is well-scoped for a static web app management server, covering create, read, update, delete, publish/unpublish, and logs without redundancy or bloat.

Completeness4/5

Core lifecycle is fully covered (create, get, list, update, delete) plus visibility toggles and deployment logs. Minor gaps: only the most recent deploy log is available, and there is no tool to update app metadata like description.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for Coolify infrastructure management, providing 45 tools for servers, applications, databases, deployments, and diagnostics via natural language.
    7 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for self-hosted static site publishing on Cloudflare Workers. Enables AI coding agents to deploy pages with a single 'publish' tool and get live URLs, with support for atomic updates, versioning, and per-site passwords.
    0
    MIT