@masonator/coolify-mcp 1.1.1 → 1.5.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 CHANGED
@@ -1,7 +1,16 @@
1
1
  # Coolify MCP Server
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@masonator/coolify-mcp.svg)](https://www.npmjs.com/package/@masonator/coolify-mcp)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@masonator/coolify-mcp.svg)](https://www.npmjs.com/package/@masonator/coolify-mcp)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Node.js Version](https://img.shields.io/node/v/@masonator/coolify-mcp.svg)](https://nodejs.org)
7
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.8-blue.svg)](https://www.typescriptlang.org/)
8
+ [![CI](https://github.com/StuMason/coolify-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/StuMason/coolify-mcp/actions/workflows/ci.yml)
9
+ [![codecov](https://codecov.io/gh/StuMason/coolify-mcp/branch/main/graph/badge.svg)](https://codecov.io/gh/StuMason/coolify-mcp)
3
10
  [![MseeP.ai Security Assessment Badge](https://mseep.net/pr/stumason-coolify-mcp-badge.png)](https://mseep.ai/app/stumason-coolify-mcp)
4
11
 
12
+ > **The most comprehensive MCP server for Coolify** - 67 tools, 7 workflow prompts, smart diagnostics, and batch operations for managing your self-hosted PaaS through AI assistants.
13
+
5
14
  A Model Context Protocol (MCP) server for [Coolify](https://coolify.io/), enabling AI assistants to manage and debug your Coolify instances through natural language.
6
15
 
7
16
  ## Features
@@ -297,15 +306,36 @@ Power user tools for operating on multiple resources at once:
297
306
  - `stop_all_apps` - Emergency stop all running applications (requires confirmation)
298
307
  - `redeploy_project` - Redeploy all applications in a project with force rebuild
299
308
 
309
+ ## Why Coolify MCP?
310
+
311
+ - **Context-Optimized**: Responses are 90-99% smaller than raw API, preventing context window exhaustion
312
+ - **Smart Lookup**: Find apps by domain (`stuartmason.co.uk`), servers by IP, not just UUIDs
313
+ - **Batch Operations**: Restart entire projects, bulk update env vars, emergency stop all apps
314
+ - **Workflow Prompts**: Pre-built guided workflows for common tasks
315
+ - **Production Ready**: 98%+ test coverage, TypeScript strict mode, comprehensive error handling
316
+ - **Always Current**: Weekly OpenAPI drift detection ensures we stay in sync with Coolify
317
+
318
+ ## Related Links
319
+
320
+ - [Coolify](https://coolify.io/) - The open-source & self-hostable Heroku/Netlify/Vercel alternative
321
+ - [Model Context Protocol](https://modelcontextprotocol.io/) - The protocol powering AI tool integrations
322
+ - [MCP Server Registry](https://github.com/modelcontextprotocol/servers) - Official MCP server directory
323
+
300
324
  ## Contributing
301
325
 
302
- Contributions welcome! Please open an issue first to discuss major changes.
326
+ Contributions welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
303
327
 
304
328
  ## License
305
329
 
306
- MIT
330
+ MIT - see [LICENSE](LICENSE) for details.
307
331
 
308
332
  ## Support
309
333
 
310
- - [GitHub Issues](https://github.com/stumason/coolify-mcp/issues)
334
+ - [GitHub Issues](https://github.com/StuMason/coolify-mcp/issues)
311
335
  - [Coolify Community](https://coolify.io/docs/contact)
336
+
337
+ ---
338
+
339
+ <p align="center">
340
+ <strong>If you find this useful, please ⭐ star the repo!</strong>
341
+ </p>
@@ -495,9 +495,9 @@ describe('CoolifyClient', () => {
495
495
  });
496
496
  it('should delete a project environment', async () => {
497
497
  mockFetch.mockResolvedValueOnce(mockResponse({ message: 'Deleted' }));
498
- const result = await client.deleteProjectEnvironment('env-uuid');
498
+ const result = await client.deleteProjectEnvironment('project-uuid', 'env-uuid');
499
499
  expect(result).toEqual({ message: 'Deleted' });
500
- expect(mockFetch).toHaveBeenCalledWith('http://localhost:3000/api/v1/projects/environments/env-uuid', expect.objectContaining({ method: 'DELETE' }));
500
+ expect(mockFetch).toHaveBeenCalledWith('http://localhost:3000/api/v1/projects/project-uuid/environments/env-uuid', expect.objectContaining({ method: 'DELETE' }));
501
501
  });
502
502
  });
503
503
  // =========================================================================
@@ -82,7 +82,7 @@ export declare class CoolifyClient {
82
82
  listProjectEnvironments(projectUuid: string): Promise<Environment[]>;
83
83
  getProjectEnvironment(projectUuid: string, environmentNameOrUuid: string): Promise<Environment>;
84
84
  createProjectEnvironment(projectUuid: string, data: CreateEnvironmentRequest): Promise<UuidResponse>;
85
- deleteProjectEnvironment(environmentUuid: string): Promise<MessageResponse>;
85
+ deleteProjectEnvironment(projectUuid: string, environmentNameOrUuid: string): Promise<MessageResponse>;
86
86
  listApplications(options?: ListOptions): Promise<Application[] | ApplicationSummary[]>;
87
87
  getApplication(uuid: string): Promise<Application>;
88
88
  createApplicationPublic(data: CreateApplicationPublicRequest): Promise<UuidResponse>;
@@ -244,8 +244,8 @@ export class CoolifyClient {
244
244
  body: JSON.stringify(data),
245
245
  });
246
246
  }
247
- async deleteProjectEnvironment(environmentUuid) {
248
- return this.request(`/projects/environments/${environmentUuid}`, {
247
+ async deleteProjectEnvironment(projectUuid, environmentNameOrUuid) {
248
+ return this.request(`/projects/${projectUuid}/environments/${environmentNameOrUuid}`, {
249
249
  method: 'DELETE',
250
250
  });
251
251
  }
@@ -20,7 +20,7 @@
20
20
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
21
21
  import { z } from 'zod';
22
22
  import { CoolifyClient, } from './coolify-client.js';
23
- const VERSION = '1.1.1';
23
+ const VERSION = '1.5.0';
24
24
  /** Wrap tool handler with consistent error handling */
25
25
  function wrapHandler(fn) {
26
26
  return fn()
@@ -146,7 +146,10 @@ export class CoolifyMcpServer extends McpServer {
146
146
  name: z.string().describe('Environment name'),
147
147
  description: z.string().optional().describe('Description'),
148
148
  }, async ({ project_uuid, ...data }) => wrapHandler(() => this.client.createProjectEnvironment(project_uuid, data)));
149
- this.tool('delete_environment', 'Delete an environment', { environment_uuid: z.string().describe('Environment UUID') }, async ({ environment_uuid }) => wrapHandler(() => this.client.deleteProjectEnvironment(environment_uuid)));
149
+ this.tool('delete_environment', 'Delete an environment. Environment must be empty (no resources).', {
150
+ project_uuid: z.string().describe('Project UUID'),
151
+ environment_name_or_uuid: z.string().describe('Environment name or UUID'),
152
+ }, async ({ project_uuid, environment_name_or_uuid }) => wrapHandler(() => this.client.deleteProjectEnvironment(project_uuid, environment_name_or_uuid)));
150
153
  // =========================================================================
151
154
  // Applications (15 tools)
152
155
  // =========================================================================
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@masonator/coolify-mcp",
3
3
  "scope": "@masonator",
4
- "version": "1.1.1",
4
+ "version": "1.5.0",
5
5
  "description": "MCP server implementation for Coolify",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",