@selfhost.dev/mcp-server 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +123 -22
- package/dist/index.js +31 -3
- package/dist/index.js.map +1 -1
- package/dist/tools/auth.js +0 -11
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/deployment-domains.d.ts +2 -0
- package/dist/tools/deployment-domains.js +128 -0
- package/dist/tools/deployment-domains.js.map +1 -0
- package/dist/tools/deployment-notifications.d.ts +2 -0
- package/dist/tools/deployment-notifications.js +74 -0
- package/dist/tools/deployment-notifications.js.map +1 -0
- package/dist/tools/deployments.d.ts +2 -0
- package/dist/tools/deployments.js +302 -0
- package/dist/tools/deployments.js.map +1 -0
- package/dist/tools/env-vars.d.ts +2 -0
- package/dist/tools/env-vars.js +121 -0
- package/dist/tools/env-vars.js.map +1 -0
- package/dist/tools/github.d.ts +2 -0
- package/dist/tools/github.js +106 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/hetzner.d.ts +2 -0
- package/dist/tools/hetzner.js +263 -0
- package/dist/tools/hetzner.js.map +1 -0
- package/dist/tools/instances.js +1 -1
- package/dist/tools/project-databases.d.ts +2 -0
- package/dist/tools/project-databases.js +169 -0
- package/dist/tools/project-databases.js.map +1 -0
- package/dist/tools/project-services.d.ts +2 -0
- package/dist/tools/project-services.js +94 -0
- package/dist/tools/project-services.js.map +1 -0
- package/dist/tools/projects.d.ts +2 -0
- package/dist/tools/projects.js +141 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/types/tiers.js +37 -1
- package/dist/types/tiers.js.map +1 -1
- package/package.json +10 -3
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { apiRequest } from "../client.js";
|
|
3
|
+
import { session } from "../session.js";
|
|
4
|
+
/**
|
|
5
|
+
* Projects (CoolifyProject) - the per-app container: a provisioned server +
|
|
6
|
+
* Coolify install + wildcard DNS that deployments and project databases attach
|
|
7
|
+
* to. Mounted on Rails as `resources :projects, controller: "coolify_projects"`
|
|
8
|
+
* so the URL path is `/projects` (NOT `/coolify_projects`).
|
|
9
|
+
*
|
|
10
|
+
* Endpoints:
|
|
11
|
+
* - GET /api/v1/platform/projects
|
|
12
|
+
* - GET /api/v1/platform/projects/:pid
|
|
13
|
+
* - POST /api/v1/platform/projects (202 - async provisioning)
|
|
14
|
+
* - PATCH /api/v1/platform/projects/:pid
|
|
15
|
+
* - DELETE /api/v1/platform/projects/:pid (202 - async tear-down)
|
|
16
|
+
* - GET /api/v1/platform/projects/:pid/metrics
|
|
17
|
+
*
|
|
18
|
+
* `organization_id` is required on every call and is auto-injected from the
|
|
19
|
+
* active org by the HTTP client (query for GET, body for POST/PATCH/DELETE).
|
|
20
|
+
*/
|
|
21
|
+
const PROJECTS_BASE = "/api/v1/platform/projects";
|
|
22
|
+
const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
23
|
+
function requireOrg() {
|
|
24
|
+
return session.getActiveOrgId();
|
|
25
|
+
}
|
|
26
|
+
const NO_ORG = "No active organization. Call `list_organizations` then `select_organization` first.";
|
|
27
|
+
export function registerProjectTools(server) {
|
|
28
|
+
server.tool("list_projects", "List PaaS projects (app containers) in the active organization. Each project is a provisioned server + Coolify install that deployments and project databases attach to. Returns pid, name, status (pending | provisioning | active | failed - note `deleting`/`terminated` are filtered out server-side), public_ip, instance_domain, and timestamps. A project must reach status `active` before you can create a deployment in it.", {}, async () => {
|
|
29
|
+
if (!requireOrg())
|
|
30
|
+
return { content: [{ type: "text", text: NO_ORG }] };
|
|
31
|
+
const result = await apiRequest(PROJECTS_BASE, {
|
|
32
|
+
toolName: "list_projects",
|
|
33
|
+
});
|
|
34
|
+
if (!result.success) {
|
|
35
|
+
return { content: [{ type: "text", text: `Failed to list projects (${result.statusCode}): ${result.message}` }] };
|
|
36
|
+
}
|
|
37
|
+
return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
|
|
38
|
+
});
|
|
39
|
+
server.tool("get_project", "Get one project by pid. Use this to POLL provisioning progress after `create_project`: re-call every ~5-10s until `status` becomes `active` (ready for deployments) or `failed` (provisioning errored). `status` of `deleting` or a 404 means it has been/ is being torn down. `public_ip` and `instance_domain` populate during provisioning.", {
|
|
40
|
+
project_pid: z.string().min(1).describe("Project pid, e.g. prj_01h..."),
|
|
41
|
+
}, async ({ project_pid }) => {
|
|
42
|
+
if (!requireOrg())
|
|
43
|
+
return { content: [{ type: "text", text: NO_ORG }] };
|
|
44
|
+
const result = await apiRequest(`${PROJECTS_BASE}/${project_pid}`, {
|
|
45
|
+
toolName: "get_project",
|
|
46
|
+
});
|
|
47
|
+
if (!result.success) {
|
|
48
|
+
return { content: [{ type: "text", text: `Failed to get project (${result.statusCode}): ${result.message}` }] };
|
|
49
|
+
}
|
|
50
|
+
return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
|
|
51
|
+
});
|
|
52
|
+
server.tool("create_project", "Create a new PaaS project and start async server provisioning. Returns immediately (HTTP 202) with the project in status `pending` - actual provisioning (server → Coolify → DNS) takes ~2-5 minutes. Poll `get_project` until status is `active` before creating a deployment in it. Name must be unique within the org (excluding failed/terminated projects). May return 422 if the platform is at capacity for new servers - retry later.", {
|
|
53
|
+
name: z.string().min(1).max(255).describe("Project name; unique per org, <=255 chars"),
|
|
54
|
+
description: z.string().optional().describe("Optional free-text description"),
|
|
55
|
+
}, async ({ name, description }) => {
|
|
56
|
+
if (!requireOrg())
|
|
57
|
+
return { content: [{ type: "text", text: NO_ORG }] };
|
|
58
|
+
const project = { name };
|
|
59
|
+
if (description !== undefined && description !== "")
|
|
60
|
+
project.description = description;
|
|
61
|
+
const result = await apiRequest(PROJECTS_BASE, {
|
|
62
|
+
method: "POST",
|
|
63
|
+
body: { project },
|
|
64
|
+
toolName: "create_project",
|
|
65
|
+
});
|
|
66
|
+
if (!result.success) {
|
|
67
|
+
return { content: [{ type: "text", text: `Failed to create project (${result.statusCode}): ${result.message}` }] };
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
content: [
|
|
71
|
+
{ type: "text", text: `Project \`${name}\` created and provisioning started (status: pending). This takes ~2-5 min - poll \`get_project\` until status is \`active\` before deploying.` },
|
|
72
|
+
{ type: "text", text: JSON.stringify(result.data, null, 2) },
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
server.tool("update_project", "Update a project's name and/or description. Only these two fields are editable - status, IPs, and domain are server-managed. Name must remain unique within the org.", {
|
|
77
|
+
project_pid: z.string().min(1),
|
|
78
|
+
name: z.string().min(1).max(255).describe("New name (required by the backend even if unchanged)"),
|
|
79
|
+
description: z.string().nullable().optional().describe("New description; pass null to clear"),
|
|
80
|
+
}, async ({ project_pid, name, description }) => {
|
|
81
|
+
if (!requireOrg())
|
|
82
|
+
return { content: [{ type: "text", text: NO_ORG }] };
|
|
83
|
+
const project = { name };
|
|
84
|
+
if (description !== undefined)
|
|
85
|
+
project.description = description;
|
|
86
|
+
const result = await apiRequest(`${PROJECTS_BASE}/${project_pid}`, {
|
|
87
|
+
method: "PATCH",
|
|
88
|
+
body: { project },
|
|
89
|
+
toolName: "update_project",
|
|
90
|
+
});
|
|
91
|
+
if (!result.success) {
|
|
92
|
+
return { content: [{ type: "text", text: `Failed to update project (${result.statusCode}): ${result.message}` }] };
|
|
93
|
+
}
|
|
94
|
+
return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
|
|
95
|
+
});
|
|
96
|
+
server.tool("delete_project", "Delete a project - tears down its provisioned server, Coolify install, DNS, and all attached deployments/databases/services. This is irreversible. Returns 202 (async tear-down; status moves to `deleting` then `terminated`). Blocked with 409 if the project is still `pending`/`provisioning`/`deleting`, or if it has an active deployment with a running container - pause active deployments first.", {
|
|
97
|
+
project_pid: z.string().min(1),
|
|
98
|
+
name: z.string().optional().describe("Project name for the confirmation message (cosmetic)"),
|
|
99
|
+
confirm: z.boolean().describe("Must be true. Permanently destroys the server and everything in the project."),
|
|
100
|
+
}, async ({ project_pid, name, confirm }) => {
|
|
101
|
+
if (!requireOrg())
|
|
102
|
+
return { content: [{ type: "text", text: NO_ORG }] };
|
|
103
|
+
if (!confirm) {
|
|
104
|
+
const label = name ? `\`${name}\` (${project_pid})` : project_pid;
|
|
105
|
+
return {
|
|
106
|
+
content: [{
|
|
107
|
+
type: "text",
|
|
108
|
+
text: `⚠️ About to DELETE project ${label}. This destroys the provisioned server and ALL deployments, databases, and services inside it. There is no undo.\n\nPause any active deployments first, then call again with confirm=true.`,
|
|
109
|
+
}],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const result = await apiRequest(`${PROJECTS_BASE}/${project_pid}`, {
|
|
113
|
+
method: "DELETE",
|
|
114
|
+
toolName: "delete_project",
|
|
115
|
+
});
|
|
116
|
+
if (!result.success) {
|
|
117
|
+
return { content: [{ type: "text", text: `Failed to delete project (${result.statusCode}): ${result.message}` }] };
|
|
118
|
+
}
|
|
119
|
+
return { content: [{ type: "text", text: "Project deletion started - status will move to `deleting` then disappear once tear-down completes." }] };
|
|
120
|
+
});
|
|
121
|
+
server.tool("get_project_metrics", "Get time-series infrastructure metrics for a project (server CPU/memory/disk/network, plus per-database and per-deployment container metrics) sourced from the project's monitoring agent heartbeats. Returns `agent_status`, `last_seen_at`, and a `batches` array. Each batch has `timestamp_ms` and `metric_sets`; a metric set with no `resource` belongs to the server, otherwise `resource.pid` identifies the database/service/deployment it describes. For a 'current' snapshot use a narrow window and read the newest batch. Heartbeats land ~every 25s, so poll no faster than ~30s.", {
|
|
122
|
+
project_pid: z.string().min(1),
|
|
123
|
+
start_date: z.string().regex(DATE_RE, "YYYY-MM-DD").optional().describe("Inclusive start date YYYY-MM-DD (default: 24h ago)"),
|
|
124
|
+
end_date: z.string().regex(DATE_RE, "YYYY-MM-DD").optional().describe("Inclusive end date YYYY-MM-DD (default: today)"),
|
|
125
|
+
}, async ({ project_pid, start_date, end_date }) => {
|
|
126
|
+
if (!requireOrg())
|
|
127
|
+
return { content: [{ type: "text", text: NO_ORG }] };
|
|
128
|
+
if (start_date && end_date && start_date > end_date) {
|
|
129
|
+
return { content: [{ type: "text", text: "Invalid date range: start_date must be on or before end_date." }] };
|
|
130
|
+
}
|
|
131
|
+
const result = await apiRequest(`${PROJECTS_BASE}/${project_pid}/metrics`, {
|
|
132
|
+
query: { start_date, end_date },
|
|
133
|
+
toolName: "get_project_metrics",
|
|
134
|
+
});
|
|
135
|
+
if (!result.success) {
|
|
136
|
+
return { content: [{ type: "text", text: `Failed to get project metrics (${result.statusCode}): ${result.message}` }] };
|
|
137
|
+
}
|
|
138
|
+
return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
|
package/dist/types/tiers.js
CHANGED
|
@@ -24,6 +24,10 @@ export const EXEMPT_TOOLS = new Set([
|
|
|
24
24
|
"list_regions",
|
|
25
25
|
"get_instance_types_for_region",
|
|
26
26
|
"list_storage_types",
|
|
27
|
+
// Provider / Hetzner reference data - static, no BE call
|
|
28
|
+
"list_cloud_providers",
|
|
29
|
+
"list_hetzner_locations",
|
|
30
|
+
"list_hetzner_server_types",
|
|
27
31
|
]);
|
|
28
32
|
export const WRITE_TOOLS = new Set([
|
|
29
33
|
"create_or_login_user",
|
|
@@ -93,14 +97,46 @@ export const WRITE_TOOLS = new Set([
|
|
|
93
97
|
"cancel_subscription",
|
|
94
98
|
"link_billing_payment_method",
|
|
95
99
|
"update_billing_contact",
|
|
100
|
+
// Hetzner (Module 14)
|
|
101
|
+
"create_hetzner_instance",
|
|
102
|
+
"delete_hetzner_instance",
|
|
96
103
|
"create_webhook",
|
|
97
104
|
"update_webhook",
|
|
98
105
|
"delete_webhook",
|
|
99
106
|
"create_agent_token",
|
|
100
107
|
"delete_agent_token",
|
|
101
|
-
"admin_approve_waitlist",
|
|
102
108
|
"admin_revoke_invitation",
|
|
103
109
|
"admin_grant_credits",
|
|
110
|
+
// PaaS - Projects (Module 15)
|
|
111
|
+
"create_project",
|
|
112
|
+
"update_project",
|
|
113
|
+
"delete_project",
|
|
114
|
+
// PaaS - Deployments (Module 16)
|
|
115
|
+
"create_deployment",
|
|
116
|
+
"update_deployment",
|
|
117
|
+
"update_deployment_build_config",
|
|
118
|
+
"delete_deployment",
|
|
119
|
+
"trigger_deploy",
|
|
120
|
+
"redeploy_run",
|
|
121
|
+
"rollback_run",
|
|
122
|
+
// PaaS - Custom domains (Module 17)
|
|
123
|
+
"sync_deployment_domains",
|
|
124
|
+
"add_deployment_domain",
|
|
125
|
+
"remove_deployment_domain",
|
|
126
|
+
"verify_custom_domain",
|
|
127
|
+
// PaaS - Environment variables (Module 18)
|
|
128
|
+
"set_env_vars",
|
|
129
|
+
"merge_env_vars",
|
|
130
|
+
"delete_env_var",
|
|
131
|
+
// PaaS - Project databases (Module 20)
|
|
132
|
+
"create_project_database",
|
|
133
|
+
"delete_project_database",
|
|
134
|
+
// PaaS - Project services (Module 21)
|
|
135
|
+
"create_project_service",
|
|
136
|
+
"delete_project_service",
|
|
137
|
+
// PaaS - Deployment notifications (Module 22)
|
|
138
|
+
"bind_deployment_notification_channel",
|
|
139
|
+
"unbind_deployment_notification_channel",
|
|
104
140
|
]);
|
|
105
141
|
export function categorizeOperation(toolName) {
|
|
106
142
|
if (EXEMPT_TOOLS.has(toolName))
|
package/dist/types/tiers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tiers.js","sourceRoot":"","sources":["../../src/types/tiers.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,YAAY,GAAmD;IAC1E,IAAI,EAAE;QACJ,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE;QAC3C,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;QAC/C,aAAa,EAAE,CAAC;KACjB;IACD,OAAO,EAAE;QACP,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE;QAC7C,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;QAC/C,aAAa,EAAE,CAAC;KACjB;IACD,GAAG,EAAE;QACH,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE;QAC3C,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE;QAC5C,aAAa,EAAE,EAAE;KAClB;IACD,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE;QAC7C,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE;QAC5C,aAAa,EAAE,QAAQ;KACxB;CACF,CAAC;AAIF,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAClC,cAAc;IACd,+BAA+B;IAC/B,oBAAoB;
|
|
1
|
+
{"version":3,"file":"tiers.js","sourceRoot":"","sources":["../../src/types/tiers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@selfhost.dev/mcp-server",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP server for SelfHost.dev
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "MCP server for SelfHost.dev - provision managed databases and deploy apps (PaaS) via natural language",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -24,7 +24,14 @@
|
|
|
24
24
|
"cheap managed databases",
|
|
25
25
|
"cost efficient managed databases",
|
|
26
26
|
"SelfHost",
|
|
27
|
-
"cloudSql"
|
|
27
|
+
"cloudSql",
|
|
28
|
+
"paas",
|
|
29
|
+
"deploy",
|
|
30
|
+
"deployment",
|
|
31
|
+
"github",
|
|
32
|
+
"app hosting",
|
|
33
|
+
"deploy app",
|
|
34
|
+
"coolify"
|
|
28
35
|
],
|
|
29
36
|
"license": "MIT",
|
|
30
37
|
"engines": {
|