@masonator/coolify-mcp 0.2.15 → 0.2.17

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.
Files changed (31) hide show
  1. package/package.json +2 -2
  2. package/dist/__tests__/coolify-client.test.d.ts +0 -1
  3. package/dist/__tests__/coolify-client.test.js +0 -208
  4. package/dist/__tests__/mcp-server.test.d.ts +0 -1
  5. package/dist/__tests__/mcp-server.test.js +0 -282
  6. package/dist/__tests__/resources/application-resources.test.d.ts +0 -1
  7. package/dist/__tests__/resources/application-resources.test.js +0 -33
  8. package/dist/__tests__/resources/database-resources.test.d.ts +0 -1
  9. package/dist/__tests__/resources/database-resources.test.js +0 -68
  10. package/dist/__tests__/resources/deployment-resources.test.d.ts +0 -1
  11. package/dist/__tests__/resources/deployment-resources.test.js +0 -46
  12. package/dist/__tests__/resources/service-resources.test.d.ts +0 -1
  13. package/dist/__tests__/resources/service-resources.test.js +0 -76
  14. package/dist/lib/coolify-client.d.ts +0 -44
  15. package/dist/lib/coolify-client.js +0 -161
  16. package/dist/lib/mcp-server.d.ts +0 -56
  17. package/dist/lib/mcp-server.js +0 -423
  18. package/dist/lib/resource.d.ts +0 -13
  19. package/dist/lib/resource.js +0 -25
  20. package/dist/resources/application-resources.d.ts +0 -14
  21. package/dist/resources/application-resources.js +0 -55
  22. package/dist/resources/database-resources.d.ts +0 -17
  23. package/dist/resources/database-resources.js +0 -51
  24. package/dist/resources/deployment-resources.d.ts +0 -12
  25. package/dist/resources/deployment-resources.js +0 -44
  26. package/dist/resources/index.d.ts +0 -4
  27. package/dist/resources/index.js +0 -4
  28. package/dist/resources/service-resources.d.ts +0 -15
  29. package/dist/resources/service-resources.js +0 -51
  30. package/dist/types/coolify.d.ts +0 -228
  31. package/dist/types/coolify.js +0 -1
@@ -1,76 +0,0 @@
1
- import { ServiceResources } from '../../resources/service-resources.js';
2
- import { jest } from '@jest/globals';
3
- jest.mock('../../lib/coolify-client.js');
4
- describe('ServiceResources', () => {
5
- let mockClient;
6
- let resources;
7
- const mockService = {
8
- id: 1,
9
- uuid: 'test-uuid',
10
- name: 'test-service',
11
- description: 'test description',
12
- type: 'code-server',
13
- status: 'running',
14
- created_at: '2024-01-01',
15
- updated_at: '2024-01-01',
16
- project_uuid: 'project-uuid',
17
- environment_name: 'test-env',
18
- environment_uuid: 'env-uuid',
19
- server_uuid: 'server-uuid',
20
- domains: ['test.com'],
21
- };
22
- beforeEach(() => {
23
- mockClient = {
24
- listServices: jest.fn(),
25
- getService: jest.fn(),
26
- createService: jest.fn(),
27
- deleteService: jest.fn(),
28
- };
29
- resources = new ServiceResources(mockClient);
30
- });
31
- describe('listServices', () => {
32
- it('should return a list of services', async () => {
33
- mockClient.listServices.mockResolvedValue([mockService]);
34
- const result = await resources.listServices();
35
- expect(result).toEqual([mockService]);
36
- expect(mockClient.listServices).toHaveBeenCalled();
37
- });
38
- });
39
- describe('getService', () => {
40
- it('should return a service by uuid', async () => {
41
- mockClient.getService.mockResolvedValue(mockService);
42
- const result = await resources.getService('test-uuid');
43
- expect(result).toEqual(mockService);
44
- expect(mockClient.getService).toHaveBeenCalledWith('test-uuid');
45
- });
46
- });
47
- describe('createService', () => {
48
- it('should create a new service', async () => {
49
- const createData = {
50
- name: 'new-service',
51
- type: 'code-server',
52
- project_uuid: 'project-uuid',
53
- environment_name: 'test-env',
54
- environment_uuid: 'env-uuid',
55
- server_uuid: 'server-uuid',
56
- };
57
- const mockResponse = {
58
- uuid: 'new-uuid',
59
- domains: ['new-service.test.com'],
60
- };
61
- mockClient.createService.mockResolvedValue(mockResponse);
62
- const result = await resources.createService(createData);
63
- expect(result).toEqual(mockResponse);
64
- expect(mockClient.createService).toHaveBeenCalledWith(createData);
65
- });
66
- });
67
- describe('deleteService', () => {
68
- it('should delete a service', async () => {
69
- const mockResponse = { message: 'Service deleted' };
70
- mockClient.deleteService.mockResolvedValue(mockResponse);
71
- const result = await resources.deleteService('test-uuid');
72
- expect(result).toEqual(mockResponse);
73
- expect(mockClient.deleteService).toHaveBeenCalledWith('test-uuid', undefined);
74
- });
75
- });
76
- });
@@ -1,44 +0,0 @@
1
- import { CoolifyConfig, ServerInfo, ServerResources, ServerDomain, ValidationResponse, Project, CreateProjectRequest, UpdateProjectRequest, Environment, Deployment, Database, DatabaseUpdateRequest, Service, CreateServiceRequest, DeleteServiceOptions } from '../types/coolify.js';
2
- export declare class CoolifyClient {
3
- private baseUrl;
4
- private accessToken;
5
- constructor(config: CoolifyConfig);
6
- private request;
7
- listServers(): Promise<ServerInfo[]>;
8
- getServer(uuid: string): Promise<ServerInfo>;
9
- getServerResources(uuid: string): Promise<ServerResources>;
10
- getServerDomains(uuid: string): Promise<ServerDomain[]>;
11
- validateServer(uuid: string): Promise<ValidationResponse>;
12
- validateConnection(): Promise<void>;
13
- listProjects(): Promise<Project[]>;
14
- getProject(uuid: string): Promise<Project>;
15
- createProject(project: CreateProjectRequest): Promise<{
16
- uuid: string;
17
- }>;
18
- updateProject(uuid: string, project: UpdateProjectRequest): Promise<Project>;
19
- deleteProject(uuid: string): Promise<{
20
- message: string;
21
- }>;
22
- getProjectEnvironment(projectUuid: string, environmentNameOrUuid: string): Promise<Environment>;
23
- deployApplication(uuid: string): Promise<Deployment>;
24
- listDatabases(): Promise<Database[]>;
25
- getDatabase(uuid: string): Promise<Database>;
26
- updateDatabase(uuid: string, data: DatabaseUpdateRequest): Promise<Database>;
27
- deleteDatabase(uuid: string, options?: {
28
- deleteConfigurations?: boolean;
29
- deleteVolumes?: boolean;
30
- dockerCleanup?: boolean;
31
- deleteConnectedNetworks?: boolean;
32
- }): Promise<{
33
- message: string;
34
- }>;
35
- listServices(): Promise<Service[]>;
36
- getService(uuid: string): Promise<Service>;
37
- createService(data: CreateServiceRequest): Promise<{
38
- uuid: string;
39
- domains: string[];
40
- }>;
41
- deleteService(uuid: string, options?: DeleteServiceOptions): Promise<{
42
- message: string;
43
- }>;
44
- }
@@ -1,161 +0,0 @@
1
- export class CoolifyClient {
2
- baseUrl;
3
- accessToken;
4
- constructor(config) {
5
- if (!config.baseUrl) {
6
- throw new Error('Coolify base URL is required');
7
- }
8
- if (!config.accessToken) {
9
- throw new Error('Coolify access token is required');
10
- }
11
- this.baseUrl = config.baseUrl.replace(/\/$/, '');
12
- this.accessToken = config.accessToken;
13
- }
14
- async request(path, options = {}) {
15
- try {
16
- const url = `${this.baseUrl}/api/v1${path}`;
17
- const response = await fetch(url, {
18
- headers: {
19
- 'Content-Type': 'application/json',
20
- Authorization: `Bearer ${this.accessToken}`,
21
- },
22
- ...options,
23
- });
24
- const data = await response.json();
25
- if (!response.ok) {
26
- const error = data;
27
- throw new Error(error.message || `HTTP ${response.status}: ${response.statusText}`);
28
- }
29
- return data;
30
- }
31
- catch (error) {
32
- if (error instanceof TypeError && error.message.includes('fetch')) {
33
- throw new Error(`Failed to connect to Coolify server at ${this.baseUrl}. Please check if the server is running and the URL is correct.`);
34
- }
35
- throw error;
36
- }
37
- }
38
- async listServers() {
39
- return this.request('/servers');
40
- }
41
- async getServer(uuid) {
42
- return this.request(`/servers/${uuid}`);
43
- }
44
- async getServerResources(uuid) {
45
- return this.request(`/servers/${uuid}/resources`);
46
- }
47
- async getServerDomains(uuid) {
48
- return this.request(`/servers/${uuid}/domains`);
49
- }
50
- async validateServer(uuid) {
51
- return this.request(`/servers/${uuid}/validate`);
52
- }
53
- async validateConnection() {
54
- try {
55
- await this.listServers();
56
- }
57
- catch (error) {
58
- throw new Error(`Failed to connect to Coolify server: ${error instanceof Error ? error.message : 'Unknown error'}`);
59
- }
60
- }
61
- async listProjects() {
62
- return this.request('/projects');
63
- }
64
- async getProject(uuid) {
65
- return this.request(`/projects/${uuid}`);
66
- }
67
- async createProject(project) {
68
- return this.request('/projects', {
69
- method: 'POST',
70
- body: JSON.stringify(project),
71
- });
72
- }
73
- async updateProject(uuid, project) {
74
- return this.request(`/projects/${uuid}`, {
75
- method: 'PATCH',
76
- body: JSON.stringify(project),
77
- });
78
- }
79
- async deleteProject(uuid) {
80
- return this.request(`/projects/${uuid}`, {
81
- method: 'DELETE',
82
- });
83
- }
84
- async getProjectEnvironment(projectUuid, environmentNameOrUuid) {
85
- return this.request(`/projects/${projectUuid}/${environmentNameOrUuid}`);
86
- }
87
- async deployApplication(uuid) {
88
- const response = await this.request(`/applications/${uuid}/deploy`, {
89
- method: 'POST',
90
- });
91
- return response;
92
- }
93
- async listDatabases() {
94
- return this.request('/databases');
95
- }
96
- async getDatabase(uuid) {
97
- return this.request(`/databases/${uuid}`);
98
- }
99
- async updateDatabase(uuid, data) {
100
- return this.request(`/databases/${uuid}`, {
101
- method: 'PATCH',
102
- body: JSON.stringify(data),
103
- });
104
- }
105
- async deleteDatabase(uuid, options) {
106
- const queryParams = new URLSearchParams();
107
- if (options) {
108
- if (options.deleteConfigurations !== undefined) {
109
- queryParams.set('delete_configurations', options.deleteConfigurations.toString());
110
- }
111
- if (options.deleteVolumes !== undefined) {
112
- queryParams.set('delete_volumes', options.deleteVolumes.toString());
113
- }
114
- if (options.dockerCleanup !== undefined) {
115
- queryParams.set('docker_cleanup', options.dockerCleanup.toString());
116
- }
117
- if (options.deleteConnectedNetworks !== undefined) {
118
- queryParams.set('delete_connected_networks', options.deleteConnectedNetworks.toString());
119
- }
120
- }
121
- const queryString = queryParams.toString();
122
- const url = queryString ? `/databases/${uuid}?${queryString}` : `/databases/${uuid}`;
123
- return this.request(url, {
124
- method: 'DELETE',
125
- });
126
- }
127
- async listServices() {
128
- return this.request('/services');
129
- }
130
- async getService(uuid) {
131
- return this.request(`/services/${uuid}`);
132
- }
133
- async createService(data) {
134
- return this.request('/services', {
135
- method: 'POST',
136
- body: JSON.stringify(data),
137
- });
138
- }
139
- async deleteService(uuid, options) {
140
- const queryParams = new URLSearchParams();
141
- if (options) {
142
- if (options.deleteConfigurations !== undefined) {
143
- queryParams.set('delete_configurations', options.deleteConfigurations.toString());
144
- }
145
- if (options.deleteVolumes !== undefined) {
146
- queryParams.set('delete_volumes', options.deleteVolumes.toString());
147
- }
148
- if (options.dockerCleanup !== undefined) {
149
- queryParams.set('docker_cleanup', options.dockerCleanup.toString());
150
- }
151
- if (options.deleteConnectedNetworks !== undefined) {
152
- queryParams.set('delete_connected_networks', options.deleteConnectedNetworks.toString());
153
- }
154
- }
155
- const queryString = queryParams.toString();
156
- const url = queryString ? `/services/${uuid}?${queryString}` : `/services/${uuid}`;
157
- return this.request(url, {
158
- method: 'DELETE',
159
- });
160
- }
161
- }
@@ -1,56 +0,0 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
3
- import type { ServerInfo, ServerResources, ServerDomain, ValidationResponse, Project, CreateProjectRequest, UpdateProjectRequest, Environment, Deployment, Database, DatabaseUpdateRequest, Service, CreateServiceRequest, DeleteServiceOptions } from '../types/coolify.js';
4
- export declare class CoolifyMcpServer extends McpServer {
5
- private client;
6
- constructor(config: {
7
- baseUrl: string;
8
- accessToken: string;
9
- });
10
- private setupTools;
11
- connect(transport: Transport): Promise<void>;
12
- list_servers(): Promise<ServerInfo[]>;
13
- get_server(uuid: string): Promise<ServerInfo>;
14
- get_server_resources(uuid: string): Promise<ServerResources>;
15
- get_server_domains(uuid: string): Promise<ServerDomain[]>;
16
- validate_server(uuid: string): Promise<ValidationResponse>;
17
- list_projects(): Promise<Project[]>;
18
- get_project(uuid: string): Promise<Project>;
19
- create_project(project: CreateProjectRequest): Promise<{
20
- uuid: string;
21
- }>;
22
- update_project(uuid: string, project: UpdateProjectRequest): Promise<Project>;
23
- delete_project(uuid: string): Promise<{
24
- message: string;
25
- }>;
26
- get_project_environment(projectUuid: string, environmentNameOrUuid: string): Promise<Environment>;
27
- deploy_application(params: {
28
- uuid: string;
29
- }): Promise<Deployment>;
30
- list_databases(): Promise<Database[]>;
31
- get_database(uuid: string): Promise<Database>;
32
- update_database(uuid: string, data: DatabaseUpdateRequest): Promise<Database>;
33
- delete_database(uuid: string, options?: {
34
- deleteConfigurations?: boolean;
35
- deleteVolumes?: boolean;
36
- dockerCleanup?: boolean;
37
- deleteConnectedNetworks?: boolean;
38
- }): Promise<{
39
- message: string;
40
- }>;
41
- list_services(): Promise<Service[]>;
42
- get_service(uuid: string): Promise<Service>;
43
- create_service(data: CreateServiceRequest): Promise<{
44
- uuid: string;
45
- domains: string[];
46
- }>;
47
- delete_service(uuid: string, options?: DeleteServiceOptions): Promise<{
48
- message: string;
49
- }>;
50
- resources_list(): Promise<{
51
- resources: string[];
52
- }>;
53
- prompts_list(): Promise<{
54
- prompts: string[];
55
- }>;
56
- }