liara-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/LICENSE +22 -0
- package/README.md +353 -0
- package/dist/api/client.d.ts +49 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +145 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/types.d.ts +256 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +25 -0
- package/dist/api/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3102 -0
- package/dist/index.js.map +1 -0
- package/dist/services/apps.d.ts +39 -0
- package/dist/services/apps.d.ts.map +1 -0
- package/dist/services/apps.js +83 -0
- package/dist/services/apps.js.map +1 -0
- package/dist/services/databases.d.ts +74 -0
- package/dist/services/databases.d.ts.map +1 -0
- package/dist/services/databases.js +120 -0
- package/dist/services/databases.js.map +1 -0
- package/dist/services/deployment.d.ts +57 -0
- package/dist/services/deployment.d.ts.map +1 -0
- package/dist/services/deployment.js +70 -0
- package/dist/services/deployment.js.map +1 -0
- package/dist/services/disks.d.ts +35 -0
- package/dist/services/disks.d.ts.map +1 -0
- package/dist/services/disks.js +88 -0
- package/dist/services/disks.js.map +1 -0
- package/dist/services/dns.d.ts +43 -0
- package/dist/services/dns.d.ts.map +1 -0
- package/dist/services/dns.js +80 -0
- package/dist/services/dns.js.map +1 -0
- package/dist/services/domains.d.ts +23 -0
- package/dist/services/domains.d.ts.map +1 -0
- package/dist/services/domains.js +42 -0
- package/dist/services/domains.js.map +1 -0
- package/dist/services/environment.d.ts +31 -0
- package/dist/services/environment.d.ts.map +1 -0
- package/dist/services/environment.js +59 -0
- package/dist/services/environment.js.map +1 -0
- package/dist/services/iaas.d.ts +80 -0
- package/dist/services/iaas.d.ts.map +1 -0
- package/dist/services/iaas.js +161 -0
- package/dist/services/iaas.js.map +1 -0
- package/dist/services/mail.d.ts +38 -0
- package/dist/services/mail.d.ts.map +1 -0
- package/dist/services/mail.js +65 -0
- package/dist/services/mail.js.map +1 -0
- package/dist/services/network.d.ts +19 -0
- package/dist/services/network.d.ts.map +1 -0
- package/dist/services/network.js +35 -0
- package/dist/services/network.js.map +1 -0
- package/dist/services/observability.d.ts +24 -0
- package/dist/services/observability.d.ts.map +1 -0
- package/dist/services/observability.js +41 -0
- package/dist/services/observability.js.map +1 -0
- package/dist/services/plans.d.ts +12 -0
- package/dist/services/plans.d.ts.map +1 -0
- package/dist/services/plans.js +17 -0
- package/dist/services/plans.js.map +1 -0
- package/dist/services/settings.d.ts +28 -0
- package/dist/services/settings.d.ts.map +1 -0
- package/dist/services/settings.js +37 -0
- package/dist/services/settings.js.map +1 -0
- package/dist/services/storage.d.ts +60 -0
- package/dist/services/storage.d.ts.map +1 -0
- package/dist/services/storage.js +96 -0
- package/dist/services/storage.js.map +1 -0
- package/dist/services/user.d.ts +32 -0
- package/dist/services/user.d.ts.map +1 -0
- package/dist/services/user.js +16 -0
- package/dist/services/user.js.map +1 -0
- package/dist/utils/errors.d.ts +30 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +63 -0
- package/dist/utils/errors.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { paginationToParams, } from '../api/types.js';
|
|
2
|
+
import { validateRequired } from '../utils/errors.js';
|
|
3
|
+
import { createReadStream } from 'fs';
|
|
4
|
+
import FormData from 'form-data';
|
|
5
|
+
/**
|
|
6
|
+
* List all buckets
|
|
7
|
+
*/
|
|
8
|
+
export async function listBuckets(client, pagination) {
|
|
9
|
+
const params = paginationToParams(pagination);
|
|
10
|
+
return await client.get('/v1/buckets', params);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get details of a specific bucket
|
|
14
|
+
*/
|
|
15
|
+
export async function getBucket(client, name) {
|
|
16
|
+
validateRequired(name, 'Bucket name');
|
|
17
|
+
return await client.get(`/v1/buckets/${name}`);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a new bucket
|
|
21
|
+
*/
|
|
22
|
+
export async function createBucket(client, request) {
|
|
23
|
+
validateRequired(request.name, 'Bucket name');
|
|
24
|
+
return await client.post('/v1/buckets', request);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Delete a bucket
|
|
28
|
+
*/
|
|
29
|
+
export async function deleteBucket(client, name) {
|
|
30
|
+
validateRequired(name, 'Bucket name');
|
|
31
|
+
await client.delete(`/v1/buckets/${name}`);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get bucket credentials (S3-compatible access keys)
|
|
35
|
+
*/
|
|
36
|
+
export async function getBucketCredentials(client, name) {
|
|
37
|
+
validateRequired(name, 'Bucket name');
|
|
38
|
+
return await client.get(`/v1/buckets/${name}/credentials`);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* List objects in a bucket
|
|
42
|
+
*/
|
|
43
|
+
export async function listObjects(client, bucketName, prefix, maxKeys) {
|
|
44
|
+
validateRequired(bucketName, 'Bucket name');
|
|
45
|
+
const params = {};
|
|
46
|
+
if (prefix)
|
|
47
|
+
params.prefix = prefix;
|
|
48
|
+
if (maxKeys)
|
|
49
|
+
params.maxKeys = maxKeys;
|
|
50
|
+
return await client.get(`/v1/buckets/${bucketName}/objects`, params);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Upload an object to a bucket
|
|
54
|
+
*/
|
|
55
|
+
export async function uploadObject(client, bucketName, objectKey, filePath) {
|
|
56
|
+
validateRequired(bucketName, 'Bucket name');
|
|
57
|
+
validateRequired(objectKey, 'Object key');
|
|
58
|
+
validateRequired(filePath, 'File path');
|
|
59
|
+
// Note: This would typically use multipart/form-data or direct file upload
|
|
60
|
+
// For now, we'll use a generic POST endpoint
|
|
61
|
+
const formData = new FormData();
|
|
62
|
+
const fileName = filePath.split('/').pop() || objectKey;
|
|
63
|
+
formData.append('file', createReadStream(filePath), {
|
|
64
|
+
filename: fileName,
|
|
65
|
+
});
|
|
66
|
+
formData.append('key', objectKey);
|
|
67
|
+
return await client.postFormData(`/v1/buckets/${bucketName}/objects`, formData);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get download URL for an object
|
|
71
|
+
*/
|
|
72
|
+
export async function getObjectDownloadUrl(client, bucketName, objectKey, expiresIn) {
|
|
73
|
+
validateRequired(bucketName, 'Bucket name');
|
|
74
|
+
validateRequired(objectKey, 'Object key');
|
|
75
|
+
const params = {};
|
|
76
|
+
if (expiresIn)
|
|
77
|
+
params.expiresIn = expiresIn;
|
|
78
|
+
return await client.get(`/v1/buckets/${bucketName}/objects/${encodeURIComponent(objectKey)}/download`, params);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Delete an object from a bucket
|
|
82
|
+
*/
|
|
83
|
+
export async function deleteObject(client, bucketName, objectKey) {
|
|
84
|
+
validateRequired(bucketName, 'Bucket name');
|
|
85
|
+
validateRequired(objectKey, 'Object key');
|
|
86
|
+
await client.delete(`/v1/buckets/${bucketName}/objects/${encodeURIComponent(objectKey)}`);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get object metadata
|
|
90
|
+
*/
|
|
91
|
+
export async function getObjectMetadata(client, bucketName, objectKey) {
|
|
92
|
+
validateRequired(bucketName, 'Bucket name');
|
|
93
|
+
validateRequired(objectKey, 'Object key');
|
|
94
|
+
return await client.get(`/v1/buckets/${bucketName}/objects/${encodeURIComponent(objectKey)}/metadata`);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/services/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { LiaraClient } from '../api/client.js';
|
|
2
|
+
/**
|
|
3
|
+
* User information response
|
|
4
|
+
*/
|
|
5
|
+
export interface UserInfo {
|
|
6
|
+
_id: string;
|
|
7
|
+
email: string;
|
|
8
|
+
username?: string;
|
|
9
|
+
firstName?: string;
|
|
10
|
+
lastName?: string;
|
|
11
|
+
phone?: string;
|
|
12
|
+
plans?: {
|
|
13
|
+
app?: any[];
|
|
14
|
+
database?: any[];
|
|
15
|
+
vm?: any[];
|
|
16
|
+
};
|
|
17
|
+
teams?: Array<{
|
|
18
|
+
_id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
}>;
|
|
21
|
+
createdAt: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get comprehensive user information
|
|
25
|
+
* This endpoint returns user account details, available plans, and database versions
|
|
26
|
+
*/
|
|
27
|
+
export declare function getUserInfo(client: LiaraClient): Promise<UserInfo>;
|
|
28
|
+
/**
|
|
29
|
+
* List user accounts (for multi-account support)
|
|
30
|
+
*/
|
|
31
|
+
export declare function listAccounts(client: LiaraClient): Promise<UserInfo[]>;
|
|
32
|
+
//# sourceMappingURL=user.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/services/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,QAAQ;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE;QACJ,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;QACZ,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;KACd,CAAC;IACF,KAAK,CAAC,EAAE,KAAK,CAAC;QACV,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAExE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAI3E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get comprehensive user information
|
|
3
|
+
* This endpoint returns user account details, available plans, and database versions
|
|
4
|
+
*/
|
|
5
|
+
export async function getUserInfo(client) {
|
|
6
|
+
return await client.get('/v1/me');
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* List user accounts (for multi-account support)
|
|
10
|
+
*/
|
|
11
|
+
export async function listAccounts(client) {
|
|
12
|
+
// This might be a different endpoint, but for now we return the current user
|
|
13
|
+
const userInfo = await getUserInfo(client);
|
|
14
|
+
return [userInfo];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/services/user.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAmB;IACjD,OAAO,MAAM,MAAM,CAAC,GAAG,CAAW,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAmB;IAClD,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,QAAQ,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error class for Liara MCP operations
|
|
3
|
+
*/
|
|
4
|
+
export declare class LiaraMcpError extends Error {
|
|
5
|
+
code?: string | undefined;
|
|
6
|
+
details?: any | undefined;
|
|
7
|
+
constructor(message: string, code?: string | undefined, details?: any | undefined);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Format error for MCP response
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatErrorForMcp(error: unknown): string;
|
|
13
|
+
/**
|
|
14
|
+
* Validate that a value is not empty
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateRequired(value: any, fieldName: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Validate app name format
|
|
19
|
+
* Must be lowercase alphanumeric with hyphens, 3-32 characters
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateAppName(name: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Validate domain name format
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateDomainName(domain: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Validate environment variable key
|
|
28
|
+
*/
|
|
29
|
+
export declare function validateEnvKey(key: string): void;
|
|
30
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;IAGzB,IAAI,CAAC,EAAE,MAAM;IACb,OAAO,CAAC,EAAE,GAAG;gBAFpB,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,OAAO,CAAC,EAAE,GAAG,YAAA;CAK3B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAIpE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAYlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAOvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQhD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error class for Liara MCP operations
|
|
3
|
+
*/
|
|
4
|
+
export class LiaraMcpError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
details;
|
|
7
|
+
constructor(message, code, details) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.details = details;
|
|
11
|
+
this.name = 'LiaraMcpError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Format error for MCP response
|
|
16
|
+
*/
|
|
17
|
+
export function formatErrorForMcp(error) {
|
|
18
|
+
if (error instanceof Error) {
|
|
19
|
+
return error.message;
|
|
20
|
+
}
|
|
21
|
+
return String(error);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Validate that a value is not empty
|
|
25
|
+
*/
|
|
26
|
+
export function validateRequired(value, fieldName) {
|
|
27
|
+
if (value === undefined || value === null || value === '') {
|
|
28
|
+
throw new LiaraMcpError(`${fieldName} is required`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Validate app name format
|
|
33
|
+
* Must be lowercase alphanumeric with hyphens, 3-32 characters
|
|
34
|
+
*/
|
|
35
|
+
export function validateAppName(name) {
|
|
36
|
+
validateRequired(name, 'App name');
|
|
37
|
+
if (!/^[a-z0-9-]{3,32}$/.test(name)) {
|
|
38
|
+
throw new LiaraMcpError('App name must be 3-32 characters long and contain only lowercase letters, numbers, and hyphens');
|
|
39
|
+
}
|
|
40
|
+
if (name.startsWith('-') || name.endsWith('-')) {
|
|
41
|
+
throw new LiaraMcpError('App name cannot start or end with a hyphen');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Validate domain name format
|
|
46
|
+
*/
|
|
47
|
+
export function validateDomainName(domain) {
|
|
48
|
+
validateRequired(domain, 'Domain name');
|
|
49
|
+
const domainRegex = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i;
|
|
50
|
+
if (!domainRegex.test(domain)) {
|
|
51
|
+
throw new LiaraMcpError('Invalid domain name format');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Validate environment variable key
|
|
56
|
+
*/
|
|
57
|
+
export function validateEnvKey(key) {
|
|
58
|
+
validateRequired(key, 'Environment variable key');
|
|
59
|
+
if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) {
|
|
60
|
+
throw new LiaraMcpError('Environment variable key must start with a letter or underscore and contain only uppercase letters, numbers, and underscores');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGzB;IACA;IAHX,YACI,OAAe,EACR,IAAa,EACb,OAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAS;QACb,YAAO,GAAP,OAAO,CAAM;QAGpB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAChC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAU,EAAE,SAAiB;IAC1D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,aAAa,CAAC,GAAG,SAAS,cAAc,CAAC,CAAC;IACxD,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IACxC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEnC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,aAAa,CACnB,gGAAgG,CACnG,CAAC;IACN,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,aAAa,CAAC,4CAA4C,CAAC,CAAC;IAC1E,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC7C,gBAAgB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAExC,MAAM,WAAW,GAAG,yCAAyC,CAAC;IAC9D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,aAAa,CAAC,4BAA4B,CAAC,CAAC;IAC1D,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACtC,gBAAgB,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;IAElD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,aAAa,CACnB,8HAA8H,CACjI,CAAC;IACN,CAAC;AACL,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "liara-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for Liara cloud platform - deploy and manage apps, databases, and infrastructure",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"liara-mcp": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"start": "node dist/index.js",
|
|
18
|
+
"dev": "tsc --watch",
|
|
19
|
+
"type-check": "tsc --noEmit",
|
|
20
|
+
"clean": "rm -rf dist",
|
|
21
|
+
"prepublishOnly": "npm run build",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest",
|
|
24
|
+
"test:coverage": "vitest run --coverage"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"mcp",
|
|
28
|
+
"model-context-protocol",
|
|
29
|
+
"liara",
|
|
30
|
+
"cloud",
|
|
31
|
+
"deployment",
|
|
32
|
+
"paas",
|
|
33
|
+
"dbaas",
|
|
34
|
+
"iaas",
|
|
35
|
+
"iran",
|
|
36
|
+
"persian",
|
|
37
|
+
"farsi"
|
|
38
|
+
],
|
|
39
|
+
"author": "",
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/YOUR_USERNAME/liara-mcp.git"
|
|
44
|
+
},
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/YOUR_USERNAME/liara-mcp/issues"
|
|
47
|
+
},
|
|
48
|
+
"homepage": "https://github.com/YOUR_USERNAME/liara-mcp#readme",
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"@modelcontextprotocol/sdk": "^0.5.0",
|
|
51
|
+
"@types/form-data": "^2.2.1",
|
|
52
|
+
"axios": "^1.6.0",
|
|
53
|
+
"form-data": "^4.0.5",
|
|
54
|
+
"ws": "^8.16.0",
|
|
55
|
+
"zod": "^3.22.4"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/node": "^20.0.0",
|
|
59
|
+
"@types/ws": "^8.5.10",
|
|
60
|
+
"@vitest/coverage-v8": "^1.0.0",
|
|
61
|
+
"typescript": "^5.3.0",
|
|
62
|
+
"vitest": "^1.0.0"
|
|
63
|
+
},
|
|
64
|
+
"engines": {
|
|
65
|
+
"node": ">=18.0.0"
|
|
66
|
+
}
|
|
67
|
+
}
|