@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
|
+
[](https://www.npmjs.com/package/@masonator/coolify-mcp)
|
|
4
|
+
[](https://www.npmjs.com/package/@masonator/coolify-mcp)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
[](https://nodejs.org)
|
|
7
|
+
[](https://www.typescriptlang.org/)
|
|
8
|
+
[](https://github.com/StuMason/coolify-mcp/actions/workflows/ci.yml)
|
|
9
|
+
[](https://codecov.io/gh/StuMason/coolify-mcp)
|
|
3
10
|
[](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
|
|
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/
|
|
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(
|
|
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(
|
|
248
|
-
return this.request(`/projects/environments/${
|
|
247
|
+
async deleteProjectEnvironment(projectUuid, environmentNameOrUuid) {
|
|
248
|
+
return this.request(`/projects/${projectUuid}/environments/${environmentNameOrUuid}`, {
|
|
249
249
|
method: 'DELETE',
|
|
250
250
|
});
|
|
251
251
|
}
|
package/dist/lib/mcp-server.js
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
// =========================================================================
|