@masonator/coolify-mcp 0.1.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 +375 -0
- package/dist/__tests__/coolify-client.test.d.ts +1 -0
- package/dist/__tests__/coolify-client.test.js +325 -0
- package/dist/__tests__/mcp-server.test.d.ts +1 -0
- package/dist/__tests__/mcp-server.test.js +209 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/dist/lib/coolify-client.d.ts +32 -0
- package/dist/lib/coolify-client.js +113 -0
- package/dist/lib/mcp-server.d.ts +42 -0
- package/dist/lib/mcp-server.js +362 -0
- package/dist/types/coolify.d.ts +69 -0
- package/dist/types/coolify.js +2 -0
- package/package.json +56 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CoolifyMcpServer = void 0;
|
|
4
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
5
|
+
const coolify_client_js_1 = require("./coolify-client.js");
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
class CoolifyMcpServer {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.server = new mcp_js_1.McpServer({
|
|
10
|
+
name: 'coolify',
|
|
11
|
+
version: '0.1.0',
|
|
12
|
+
});
|
|
13
|
+
this.client = new coolify_client_js_1.CoolifyClient(config);
|
|
14
|
+
this.setupTools();
|
|
15
|
+
}
|
|
16
|
+
setupTools() {
|
|
17
|
+
this.server.tool('list_servers', 'List all Coolify servers', {}, async () => {
|
|
18
|
+
try {
|
|
19
|
+
const servers = await this.client.listServers();
|
|
20
|
+
return {
|
|
21
|
+
content: [{ type: 'text', text: JSON.stringify(servers) }],
|
|
22
|
+
isError: false,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
29
|
+
isError: true,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
this.server.tool('get_server', 'Get details about a specific Coolify server', { uuid: zod_1.z.string().describe('UUID of the server to get details for') }, async (params) => {
|
|
34
|
+
try {
|
|
35
|
+
const server = await this.client.getServer(params.uuid);
|
|
36
|
+
return {
|
|
37
|
+
content: [{ type: 'text', text: JSON.stringify(server) }],
|
|
38
|
+
isError: false,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
43
|
+
return {
|
|
44
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
45
|
+
isError: true,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
this.server.tool('get_server_resources', 'Get the current resources running on a specific Coolify server', { uuid: zod_1.z.string().describe('UUID of the server to get resources for') }, async (params) => {
|
|
50
|
+
try {
|
|
51
|
+
const resources = await this.client.getServerResources(params.uuid);
|
|
52
|
+
return {
|
|
53
|
+
content: [{ type: 'text', text: JSON.stringify(resources) }],
|
|
54
|
+
isError: false,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
59
|
+
return {
|
|
60
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
61
|
+
isError: true,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
this.server.tool('get_server_domains', 'Get the domains associated with a specific Coolify server', { uuid: zod_1.z.string().describe('UUID of the server to get domains for') }, async (params) => {
|
|
66
|
+
try {
|
|
67
|
+
const domains = await this.client.getServerDomains(params.uuid);
|
|
68
|
+
return {
|
|
69
|
+
content: [{ type: 'text', text: JSON.stringify(domains) }],
|
|
70
|
+
isError: false,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
75
|
+
return {
|
|
76
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
77
|
+
isError: true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
this.server.tool('validate_server', 'Validate the connection to a specific Coolify server', { uuid: zod_1.z.string().describe('UUID of the server to validate') }, async (params) => {
|
|
82
|
+
try {
|
|
83
|
+
const result = await this.client.validateServer(params.uuid);
|
|
84
|
+
return {
|
|
85
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
86
|
+
isError: false,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
91
|
+
return {
|
|
92
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
93
|
+
isError: true,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
this.server.tool('list_projects', 'List all Coolify projects', {}, async () => {
|
|
98
|
+
try {
|
|
99
|
+
const projects = await this.client.listProjects();
|
|
100
|
+
return {
|
|
101
|
+
content: [{ type: 'text', text: JSON.stringify(projects) }],
|
|
102
|
+
isError: false,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
107
|
+
return {
|
|
108
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
109
|
+
isError: true,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
this.server.tool('get_project', 'Get details about a specific Coolify project', { uuid: zod_1.z.string().describe('UUID of the project to get details for') }, async (params) => {
|
|
114
|
+
try {
|
|
115
|
+
const project = await this.client.getProject(params.uuid);
|
|
116
|
+
return {
|
|
117
|
+
content: [{ type: 'text', text: JSON.stringify(project) }],
|
|
118
|
+
isError: false,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
123
|
+
return {
|
|
124
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
125
|
+
isError: true,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
this.server.tool('create_project', 'Create a new Coolify project', {
|
|
130
|
+
name: zod_1.z.string().describe('Name of the project'),
|
|
131
|
+
description: zod_1.z.string().optional().describe('Optional description of the project'),
|
|
132
|
+
}, async (params) => {
|
|
133
|
+
try {
|
|
134
|
+
const result = await this.client.createProject(params);
|
|
135
|
+
return {
|
|
136
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
137
|
+
isError: false,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
142
|
+
return {
|
|
143
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
144
|
+
isError: true,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
this.server.tool('update_project', 'Update an existing Coolify project', {
|
|
149
|
+
uuid: zod_1.z.string().describe('UUID of the project to update'),
|
|
150
|
+
name: zod_1.z.string().optional().describe('New name for the project'),
|
|
151
|
+
description: zod_1.z.string().optional().describe('New description for the project'),
|
|
152
|
+
}, async (params) => {
|
|
153
|
+
try {
|
|
154
|
+
const { uuid, ...updateData } = params;
|
|
155
|
+
const result = await this.client.updateProject(uuid, updateData);
|
|
156
|
+
return {
|
|
157
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
158
|
+
isError: false,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
163
|
+
return {
|
|
164
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
165
|
+
isError: true,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
this.server.tool('delete_project', 'Delete a Coolify project', { uuid: zod_1.z.string().describe('UUID of the project to delete') }, async (params) => {
|
|
170
|
+
try {
|
|
171
|
+
const result = await this.client.deleteProject(params.uuid);
|
|
172
|
+
return {
|
|
173
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
174
|
+
isError: false,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
179
|
+
return {
|
|
180
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
181
|
+
isError: true,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
this.server.tool('get_project_environment', 'Get details about a specific environment in a project', {
|
|
186
|
+
project_uuid: zod_1.z.string().describe('UUID of the project'),
|
|
187
|
+
environment_name_or_uuid: zod_1.z.string().describe('Name or UUID of the environment'),
|
|
188
|
+
}, async (params) => {
|
|
189
|
+
try {
|
|
190
|
+
const environment = await this.client.getProjectEnvironment(params.project_uuid, params.environment_name_or_uuid);
|
|
191
|
+
return {
|
|
192
|
+
content: [{ type: 'text', text: JSON.stringify(environment) }],
|
|
193
|
+
isError: false,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
198
|
+
return {
|
|
199
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
200
|
+
isError: true,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
this.server.tool('list_environments', 'List all environments or environments for a specific project', {
|
|
205
|
+
project_uuid: zod_1.z
|
|
206
|
+
.string()
|
|
207
|
+
.optional()
|
|
208
|
+
.describe('Optional UUID of the project to list environments for'),
|
|
209
|
+
}, async (params) => {
|
|
210
|
+
try {
|
|
211
|
+
const environments = await this.client.listEnvironments(params.project_uuid);
|
|
212
|
+
return {
|
|
213
|
+
content: [{ type: 'text', text: JSON.stringify(environments) }],
|
|
214
|
+
isError: false,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
219
|
+
return {
|
|
220
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
221
|
+
isError: true,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
this.server.tool('get_environment', 'Get details about a specific environment', {
|
|
226
|
+
uuid: zod_1.z.string().describe('UUID of the environment to get details for'),
|
|
227
|
+
}, async (params) => {
|
|
228
|
+
try {
|
|
229
|
+
const environment = await this.client.getEnvironment(params.uuid);
|
|
230
|
+
return {
|
|
231
|
+
content: [{ type: 'text', text: JSON.stringify(environment) }],
|
|
232
|
+
isError: false,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
237
|
+
return {
|
|
238
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
239
|
+
isError: true,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
this.server.tool('create_environment', 'Create a new environment', {
|
|
244
|
+
name: zod_1.z.string().describe('Name of the environment'),
|
|
245
|
+
project_uuid: zod_1.z.string().describe('UUID of the project to create the environment in'),
|
|
246
|
+
variables: zod_1.z.record(zod_1.z.string()).optional().describe('Optional environment variables'),
|
|
247
|
+
}, async (params) => {
|
|
248
|
+
try {
|
|
249
|
+
const result = await this.client.createEnvironment(params);
|
|
250
|
+
return {
|
|
251
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
252
|
+
isError: false,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
257
|
+
return {
|
|
258
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
259
|
+
isError: true,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
this.server.tool('update_environment_variables', 'Update variables for a specific environment', {
|
|
264
|
+
uuid: zod_1.z.string().describe('UUID of the environment to update'),
|
|
265
|
+
variables: zod_1.z.record(zod_1.z.string()).describe('New environment variables'),
|
|
266
|
+
}, async (params) => {
|
|
267
|
+
try {
|
|
268
|
+
const result = await this.client.updateEnvironmentVariables(params.uuid, {
|
|
269
|
+
variables: params.variables,
|
|
270
|
+
});
|
|
271
|
+
return {
|
|
272
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
273
|
+
isError: false,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
278
|
+
return {
|
|
279
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
280
|
+
isError: true,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
this.server.tool('delete_environment', 'Delete an environment', {
|
|
285
|
+
uuid: zod_1.z.string().describe('UUID of the environment to delete'),
|
|
286
|
+
}, async (params) => {
|
|
287
|
+
try {
|
|
288
|
+
const result = await this.client.deleteEnvironment(params.uuid);
|
|
289
|
+
return {
|
|
290
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
291
|
+
isError: false,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
296
|
+
return {
|
|
297
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
298
|
+
isError: true,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
async start(transport) {
|
|
304
|
+
try {
|
|
305
|
+
await this.client.validateConnection();
|
|
306
|
+
await this.server.connect(transport);
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
310
|
+
throw new Error(`Failed to start MCP server: ${errorMessage}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
async list_servers() {
|
|
314
|
+
return this.client.listServers();
|
|
315
|
+
}
|
|
316
|
+
async get_server(uuid) {
|
|
317
|
+
return this.client.getServer(uuid);
|
|
318
|
+
}
|
|
319
|
+
async get_server_resources(uuid) {
|
|
320
|
+
return this.client.getServerResources(uuid);
|
|
321
|
+
}
|
|
322
|
+
async get_server_domains(uuid) {
|
|
323
|
+
return this.client.getServerDomains(uuid);
|
|
324
|
+
}
|
|
325
|
+
async validate_server(uuid) {
|
|
326
|
+
return this.client.validateServer(uuid);
|
|
327
|
+
}
|
|
328
|
+
async list_projects() {
|
|
329
|
+
return this.client.listProjects();
|
|
330
|
+
}
|
|
331
|
+
async get_project(uuid) {
|
|
332
|
+
return this.client.getProject(uuid);
|
|
333
|
+
}
|
|
334
|
+
async create_project(project) {
|
|
335
|
+
return this.client.createProject(project);
|
|
336
|
+
}
|
|
337
|
+
async update_project(uuid, project) {
|
|
338
|
+
return this.client.updateProject(uuid, project);
|
|
339
|
+
}
|
|
340
|
+
async delete_project(uuid) {
|
|
341
|
+
return this.client.deleteProject(uuid);
|
|
342
|
+
}
|
|
343
|
+
async get_project_environment(projectUuid, environmentNameOrUuid) {
|
|
344
|
+
return this.client.getProjectEnvironment(projectUuid, environmentNameOrUuid);
|
|
345
|
+
}
|
|
346
|
+
async list_environments(params) {
|
|
347
|
+
return this.client.listEnvironments(params.project_uuid);
|
|
348
|
+
}
|
|
349
|
+
async get_environment(params) {
|
|
350
|
+
return this.client.getEnvironment(params.uuid);
|
|
351
|
+
}
|
|
352
|
+
async create_environment(params) {
|
|
353
|
+
return this.client.createEnvironment(params);
|
|
354
|
+
}
|
|
355
|
+
async update_environment_variables(params) {
|
|
356
|
+
return this.client.updateEnvironmentVariables(params.uuid, { variables: params.variables });
|
|
357
|
+
}
|
|
358
|
+
async delete_environment(params) {
|
|
359
|
+
return this.client.deleteEnvironment(params.uuid);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
exports.CoolifyMcpServer = CoolifyMcpServer;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export interface CoolifyConfig {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
accessToken: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ServerInfo {
|
|
6
|
+
uuid: string;
|
|
7
|
+
name: string;
|
|
8
|
+
status: 'running' | 'stopped' | 'error';
|
|
9
|
+
version: string;
|
|
10
|
+
resources: {
|
|
11
|
+
cpu: number;
|
|
12
|
+
memory: number;
|
|
13
|
+
disk: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface ResourceStatus {
|
|
17
|
+
id: number;
|
|
18
|
+
uuid: string;
|
|
19
|
+
name: string;
|
|
20
|
+
type: string;
|
|
21
|
+
created_at: string;
|
|
22
|
+
updated_at: string;
|
|
23
|
+
status: string;
|
|
24
|
+
}
|
|
25
|
+
export type ServerResources = ResourceStatus[];
|
|
26
|
+
export interface ErrorResponse {
|
|
27
|
+
error: string;
|
|
28
|
+
status: number;
|
|
29
|
+
message: string;
|
|
30
|
+
}
|
|
31
|
+
export interface ServerDomain {
|
|
32
|
+
ip: string;
|
|
33
|
+
domains: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface ValidationResponse {
|
|
36
|
+
message: string;
|
|
37
|
+
}
|
|
38
|
+
export interface Environment {
|
|
39
|
+
id: number;
|
|
40
|
+
uuid: string;
|
|
41
|
+
name: string;
|
|
42
|
+
project_uuid: string;
|
|
43
|
+
variables?: Record<string, string>;
|
|
44
|
+
created_at: string;
|
|
45
|
+
updated_at: string;
|
|
46
|
+
}
|
|
47
|
+
export interface Project {
|
|
48
|
+
id: number;
|
|
49
|
+
uuid: string;
|
|
50
|
+
name: string;
|
|
51
|
+
description?: string;
|
|
52
|
+
environments?: Environment[];
|
|
53
|
+
}
|
|
54
|
+
export interface CreateProjectRequest {
|
|
55
|
+
name: string;
|
|
56
|
+
description?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface UpdateProjectRequest {
|
|
59
|
+
name?: string;
|
|
60
|
+
description?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface CreateEnvironmentRequest {
|
|
63
|
+
name: string;
|
|
64
|
+
project_uuid: string;
|
|
65
|
+
variables?: Record<string, string>;
|
|
66
|
+
}
|
|
67
|
+
export interface UpdateEnvironmentVariablesRequest {
|
|
68
|
+
variables: Record<string, string>;
|
|
69
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@masonator/coolify-mcp",
|
|
3
|
+
"scope": "@masonator",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "MCP server implementation for Coolify",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"coolify-mcp": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"test": "jest",
|
|
18
|
+
"test:watch": "jest --watch",
|
|
19
|
+
"test:coverage": "jest --coverage",
|
|
20
|
+
"lint": "eslint . --ext .ts",
|
|
21
|
+
"lint:fix": "eslint . --ext .ts --fix",
|
|
22
|
+
"format": "prettier --write .",
|
|
23
|
+
"prepare": "husky",
|
|
24
|
+
"prepublishOnly": "npm test && npm run lint",
|
|
25
|
+
"start": "node dist/index.js"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"coolify",
|
|
29
|
+
"mcp",
|
|
30
|
+
"model-context-protocol"
|
|
31
|
+
],
|
|
32
|
+
"author": "Stuart Mason",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@modelcontextprotocol/sdk": "^1.6.1",
|
|
36
|
+
"zod": "^3.24.2"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/jest": "^29.5.14",
|
|
40
|
+
"@types/node": "^20.17.23",
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
42
|
+
"@typescript-eslint/parser": "^7.18.0",
|
|
43
|
+
"eslint": "^8.56.0",
|
|
44
|
+
"eslint-config-prettier": "^9.1.0",
|
|
45
|
+
"husky": "^9.0.11",
|
|
46
|
+
"jest": "^29.7.0",
|
|
47
|
+
"lint-staged": "^15.2.2",
|
|
48
|
+
"markdownlint-cli2": "^0.12.1",
|
|
49
|
+
"prettier": "^3.5.3",
|
|
50
|
+
"ts-jest": "^29.2.6",
|
|
51
|
+
"typescript": "^5.8.2"
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=18"
|
|
55
|
+
}
|
|
56
|
+
}
|