feat: v3.7.0 — Coolify MCP plugin (30 tools)
New plugin: Coolify deployment management (applications, deployments, servers). 10 plugins, 596 tools, 686 tests passing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
162
plugins/coolify/handlers/deployments.py
Normal file
162
plugins/coolify/handlers/deployments.py
Normal file
@@ -0,0 +1,162 @@
|
||||
"""Deployment Handler — manages Coolify deployments."""
|
||||
|
||||
import json
|
||||
from typing import Any
|
||||
|
||||
from plugins.coolify.client import CoolifyClient
|
||||
|
||||
|
||||
def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
"""Return tool specifications for ToolGenerator."""
|
||||
return [
|
||||
{
|
||||
"name": "list_deployments",
|
||||
"method_name": "list_deployments",
|
||||
"description": "List all running deployments on the Coolify instance.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {},
|
||||
},
|
||||
"scope": "read",
|
||||
},
|
||||
{
|
||||
"name": "get_deployment",
|
||||
"method_name": "get_deployment",
|
||||
"description": "Get details of a specific deployment by UUID.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"uuid": {
|
||||
"type": "string",
|
||||
"description": "Deployment UUID",
|
||||
"minLength": 1,
|
||||
},
|
||||
},
|
||||
"required": ["uuid"],
|
||||
},
|
||||
"scope": "read",
|
||||
},
|
||||
{
|
||||
"name": "cancel_deployment",
|
||||
"method_name": "cancel_deployment",
|
||||
"description": "Cancel a running deployment.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"uuid": {
|
||||
"type": "string",
|
||||
"description": "Deployment UUID",
|
||||
"minLength": 1,
|
||||
},
|
||||
},
|
||||
"required": ["uuid"],
|
||||
},
|
||||
"scope": "write",
|
||||
},
|
||||
{
|
||||
"name": "deploy",
|
||||
"method_name": "deploy",
|
||||
"description": (
|
||||
"Trigger deployment by tag name or resource UUID. "
|
||||
"Can deploy multiple resources at once using comma-separated values."
|
||||
),
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"tag": {
|
||||
"anyOf": [{"type": "string"}, {"type": "null"}],
|
||||
"description": "Tag name(s), comma-separated",
|
||||
},
|
||||
"uuid": {
|
||||
"anyOf": [{"type": "string"}, {"type": "null"}],
|
||||
"description": "Resource UUID(s), comma-separated",
|
||||
},
|
||||
"force": {
|
||||
"type": "boolean",
|
||||
"description": "Force rebuild without cache",
|
||||
"default": False,
|
||||
},
|
||||
},
|
||||
},
|
||||
"scope": "write",
|
||||
},
|
||||
{
|
||||
"name": "list_app_deployments",
|
||||
"method_name": "list_app_deployments",
|
||||
"description": "List deployment history for a specific application.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"uuid": {
|
||||
"type": "string",
|
||||
"description": "Application UUID",
|
||||
"minLength": 1,
|
||||
},
|
||||
"skip": {
|
||||
"type": "integer",
|
||||
"description": "Number of deployments to skip",
|
||||
"default": 0,
|
||||
"minimum": 0,
|
||||
},
|
||||
"take": {
|
||||
"type": "integer",
|
||||
"description": "Number of deployments to return",
|
||||
"default": 10,
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
},
|
||||
},
|
||||
"required": ["uuid"],
|
||||
},
|
||||
"scope": "read",
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
# --- Handler Functions ---
|
||||
|
||||
|
||||
async def list_deployments(client: CoolifyClient) -> str:
|
||||
"""List running deployments."""
|
||||
deployments = await client.list_deployments()
|
||||
result = {"success": True, "count": len(deployments), "deployments": deployments}
|
||||
return json.dumps(result, indent=2, ensure_ascii=False)
|
||||
|
||||
|
||||
async def get_deployment(client: CoolifyClient, uuid: str) -> str:
|
||||
"""Get deployment details."""
|
||||
deployment = await client.get_deployment(uuid)
|
||||
result = {"success": True, "deployment": deployment}
|
||||
return json.dumps(result, indent=2, ensure_ascii=False)
|
||||
|
||||
|
||||
async def cancel_deployment(client: CoolifyClient, uuid: str) -> str:
|
||||
"""Cancel a deployment."""
|
||||
result_data = await client.cancel_deployment(uuid)
|
||||
result = {
|
||||
"success": True,
|
||||
"message": f"Deployment '{uuid}' cancelled",
|
||||
"data": result_data,
|
||||
}
|
||||
return json.dumps(result, indent=2, ensure_ascii=False)
|
||||
|
||||
|
||||
async def deploy(
|
||||
client: CoolifyClient,
|
||||
tag: str | None = None,
|
||||
uuid: str | None = None,
|
||||
force: bool = False,
|
||||
) -> str:
|
||||
"""Deploy by tag or UUID."""
|
||||
result_data = await client.deploy(tag=tag, uuid=uuid, force=force)
|
||||
result = {"success": True, "message": "Deployment triggered", "data": result_data}
|
||||
return json.dumps(result, indent=2, ensure_ascii=False)
|
||||
|
||||
|
||||
async def list_app_deployments(
|
||||
client: CoolifyClient, uuid: str, skip: int = 0, take: int = 10
|
||||
) -> str:
|
||||
"""List deployment history for an application."""
|
||||
deployments = await client.list_app_deployments(uuid, skip=skip, take=take)
|
||||
result = {"success": True, "count": len(deployments), "deployments": deployments}
|
||||
return json.dumps(result, indent=2, ensure_ascii=False)
|
||||
Reference in New Issue
Block a user