@saplo/cli 0.2.1 → 2.0.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/bin/mcp.js +11 -0
- package/dist/commands/mcp/serve.d.ts +10 -0
- package/dist/commands/mcp/serve.d.ts.map +1 -0
- package/dist/commands/mcp/serve.js +26 -0
- package/dist/commands/mcp/serve.js.map +1 -0
- package/dist/lib/api.d.ts +56 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +23 -1
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +20 -13
- package/dist/lib/config.js.map +1 -1
- package/dist/mcp/resources.d.ts +9 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +91 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +96 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +8 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +212 -0
- package/dist/mcp/tools.js.map +1 -0
- package/package.json +16 -5
package/bin/mcp.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Direct MCP entry point - alias for `saplo mcp serve`.
|
|
3
|
+
// Allows: `claude mcp add saplo -- saplo-mcp` (back-compat z PyPI version).
|
|
4
|
+
// Token auth: SAPLO_API_TOKEN env LUB ~/.saplo/config.json (z `saplo login`).
|
|
5
|
+
import {startMcpServer} from '../dist/mcp/server.js'
|
|
6
|
+
|
|
7
|
+
startMcpServer().catch((err) => {
|
|
8
|
+
// stderr - stdout zarezerwowane dla JSON-RPC MCP framing.
|
|
9
|
+
console.error('[saplo-mcp] Fatal error:', err?.message ?? err)
|
|
10
|
+
process.exit(1)
|
|
11
|
+
})
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,aAAa,CAAA;AAGnC,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,OAAgB,WAAW,SACgF;IAE3G,OAAgB,QAAQ;;;QAavB;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAM3B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import { startMcpServer } from '../../mcp/server.js';
|
|
3
|
+
export default class McpServe extends Command {
|
|
4
|
+
static description = 'Start the Saplo MCP server (stdio transport). Use this in Claude Code / Desktop / Cursor configuration.';
|
|
5
|
+
static examples = [
|
|
6
|
+
{
|
|
7
|
+
description: 'Add to Claude Code:',
|
|
8
|
+
command: 'claude mcp add saplo -- saplo mcp serve',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
description: 'Add to Claude Desktop (~/.config/Claude/claude_desktop_config.json):',
|
|
12
|
+
command: '"saplo": {"command": "saplo", "args": ["mcp", "serve"]}',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
description: 'Test locally (server reads JSON-RPC from stdin):',
|
|
16
|
+
command: 'saplo mcp serve',
|
|
17
|
+
},
|
|
18
|
+
];
|
|
19
|
+
async run() {
|
|
20
|
+
// Token validation NIE robimy tutaj - serwer i tak rzuci 401 przy
|
|
21
|
+
// pierwszym wywolaniu, a sam start MCP nie wymaga tokenu (resource
|
|
22
|
+
// saplo://docs/manifest jest publiczne).
|
|
23
|
+
await startMcpServer();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/mcp/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,aAAa,CAAA;AACnC,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAA;AAElD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,MAAM,CAAU,WAAW,GACzB,yGAAyG,CAAA;IAE3G,MAAM,CAAU,QAAQ,GAAG;QACzB;YACE,WAAW,EAAE,qBAAqB;YAClC,OAAO,EAAE,yCAAyC;SACnD;QACD;YACE,WAAW,EAAE,sEAAsE;YACnF,OAAO,EAAE,yDAAyD;SACnE;QACD;YACE,WAAW,EAAE,kDAAkD;YAC/D,OAAO,EAAE,iBAAiB;SAC3B;KACF,CAAA;IAED,KAAK,CAAC,GAAG;QACP,kEAAkE;QAClE,mEAAmE;QACnE,yCAAyC;QACzC,MAAM,cAAc,EAAE,CAAA;IACxB,CAAC"}
|
package/dist/lib/api.d.ts
CHANGED
|
@@ -64,5 +64,61 @@ export declare const api: {
|
|
|
64
64
|
rollback(appId: number, deploymentId?: number): Promise<{
|
|
65
65
|
now_live: number;
|
|
66
66
|
}>;
|
|
67
|
+
restart(appId: number): Promise<{
|
|
68
|
+
status: string;
|
|
69
|
+
}>;
|
|
70
|
+
validateManifest(manifestYaml: string): Promise<ValidateManifestResponse>;
|
|
71
|
+
manifestSchema(): Promise<unknown>;
|
|
72
|
+
scaffoldManifest(stack: string, name: string): Promise<ScaffoldManifestResponse>;
|
|
73
|
+
listPlans(): Promise<{
|
|
74
|
+
plans: HostingPlan[];
|
|
75
|
+
}>;
|
|
67
76
|
};
|
|
77
|
+
export interface ManifestError {
|
|
78
|
+
path: string;
|
|
79
|
+
line: number | null;
|
|
80
|
+
col: number | null;
|
|
81
|
+
message: string;
|
|
82
|
+
hint: string;
|
|
83
|
+
}
|
|
84
|
+
export interface ManifestWarning {
|
|
85
|
+
path: string;
|
|
86
|
+
message: string;
|
|
87
|
+
}
|
|
88
|
+
export interface ValidateManifestResponse {
|
|
89
|
+
valid: boolean;
|
|
90
|
+
errors: ManifestError[];
|
|
91
|
+
warnings: ManifestWarning[];
|
|
92
|
+
normalized: Record<string, unknown> | null;
|
|
93
|
+
}
|
|
94
|
+
export interface ScaffoldManifestResponse {
|
|
95
|
+
manifest: string;
|
|
96
|
+
saploignore: string;
|
|
97
|
+
filename: string;
|
|
98
|
+
stack: string;
|
|
99
|
+
name: string;
|
|
100
|
+
}
|
|
101
|
+
export interface HostingPlan {
|
|
102
|
+
slug: string;
|
|
103
|
+
name: string;
|
|
104
|
+
price_per_year_pln: number;
|
|
105
|
+
price_per_month_pln: number | null;
|
|
106
|
+
description: string;
|
|
107
|
+
limits: {
|
|
108
|
+
max_apps: number;
|
|
109
|
+
ssd_gb_per_app: number;
|
|
110
|
+
ram_mb_per_app: number;
|
|
111
|
+
cpu_per_app: number;
|
|
112
|
+
max_custom_domains: number;
|
|
113
|
+
additional_ports: number;
|
|
114
|
+
backup_limit: number;
|
|
115
|
+
max_mailboxes: number;
|
|
116
|
+
mail_storage_gb: number;
|
|
117
|
+
};
|
|
118
|
+
features: {
|
|
119
|
+
sftp_access: boolean;
|
|
120
|
+
ssh_access: boolean;
|
|
121
|
+
additional: string[];
|
|
122
|
+
};
|
|
123
|
+
}
|
|
68
124
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/lib/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAc,EAAC,aAAa,EAAa,MAAM,OAAO,CAAA;AACtD,OAAO,KAAK,QAAQ,MAAM,WAAW,CAAA;AAGrC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAID,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAqD7D;AAED,wBAAgB,SAAS,IAAI,aAAa,CAKzC;AAED,eAAO,MAAM,GAAG;mBACC,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;wBAK3B,OAAO,CAAC,WAAW,EAAE,CAAC;uBAIvB,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;4BAIxB;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,OAAO,CAAC,WAAW,CAAC;4BAIzE,MAAM,YAAY,QAAQ,iBAAiB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/api.js
CHANGED
|
@@ -72,7 +72,8 @@ export const api = {
|
|
|
72
72
|
return getClient()
|
|
73
73
|
.post(`/api/v1/applications/${appId}/deployments/`, formData, {
|
|
74
74
|
headers: { 'Content-Type': 'multipart/form-data', ...extraHeaders },
|
|
75
|
-
|
|
75
|
+
// 30 min - upload paczki bywa duzy (projekty z mediami w public/).
|
|
76
|
+
timeout: 1_800_000,
|
|
76
77
|
maxBodyLength: Infinity,
|
|
77
78
|
maxContentLength: Infinity,
|
|
78
79
|
})
|
|
@@ -124,5 +125,26 @@ export const api = {
|
|
|
124
125
|
const data = deploymentId ? { deployment_id: deploymentId } : {};
|
|
125
126
|
return getClient().post(`/api/v1/applications/${appId}/rollback/`, data).then((r) => r.data);
|
|
126
127
|
},
|
|
128
|
+
restart(appId) {
|
|
129
|
+
return getClient().post(`/api/v1/applications/${appId}/restart/`).then((r) => r.data);
|
|
130
|
+
},
|
|
131
|
+
// ---- MCP v2 faza A: manifest copilot + plans ----
|
|
132
|
+
validateManifest(manifestYaml) {
|
|
133
|
+
return getClient()
|
|
134
|
+
.post('/api/v1/manifest/validate', { manifest: manifestYaml })
|
|
135
|
+
.then((r) => r.data);
|
|
136
|
+
},
|
|
137
|
+
manifestSchema() {
|
|
138
|
+
// Endpoint publiczny - bez auth tez dziala, ale getClient() i tak doda token.
|
|
139
|
+
return getClient().get('/api/v1/manifest/schema').then((r) => r.data);
|
|
140
|
+
},
|
|
141
|
+
scaffoldManifest(stack, name) {
|
|
142
|
+
return getClient()
|
|
143
|
+
.get('/api/v1/manifest/scaffold', { params: { stack, name } })
|
|
144
|
+
.then((r) => r.data);
|
|
145
|
+
},
|
|
146
|
+
listPlans() {
|
|
147
|
+
return getClient().get('/api/v1/plans/').then((r) => r.data);
|
|
148
|
+
},
|
|
127
149
|
};
|
|
128
150
|
//# sourceMappingURL=api.js.map
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAQD,wBAAgB,eAAe,IAAI,YAAY,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAQD,wBAAgB,eAAe,IAAI,YAAY,CAwB9C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAQpE;AAED,wBAAgB,UAAU,IAAI,IAAI,CAIjC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,aAAa,GAAG,IAAI,CASlF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAE,MAAsB,GAAG,IAAI,CAO1F;AAED,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAED,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAsB,GAAG,aAAa,CAM/E"}
|
package/dist/lib/config.js
CHANGED
|
@@ -7,21 +7,28 @@ const DEFAULT_API_URL = 'https://api.saplo.pl';
|
|
|
7
7
|
// Old default that used to be stored in config files - treat as stale
|
|
8
8
|
const LEGACY_API_URL = 'https://panel.saplo.pl';
|
|
9
9
|
export function getGlobalConfig() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
10
|
+
// Env vars maja pierwszenstwo - tak MCP server (Claude Code / Desktop)
|
|
11
|
+
// przekazuje konfiguracje, bo nie ma dostepu do ~/.saplo/config.json
|
|
12
|
+
// (instalowany przez `npm i -g` moze nie miec mojego HOME).
|
|
13
|
+
const envToken = process.env.SAPLO_API_TOKEN;
|
|
14
|
+
const envUrl = process.env.SAPLO_API_URL;
|
|
15
|
+
let stored = { api_url: DEFAULT_API_URL };
|
|
16
|
+
if (existsSync(GLOBAL_CONFIG_PATH)) {
|
|
17
|
+
try {
|
|
18
|
+
const raw = readFileSync(GLOBAL_CONFIG_PATH, 'utf-8');
|
|
19
|
+
stored = JSON.parse(raw);
|
|
20
|
+
if (!stored.api_url || stored.api_url === LEGACY_API_URL) {
|
|
21
|
+
stored.api_url = DEFAULT_API_URL;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Plik zepsuty - traktuj jakby go nie bylo, env vars i tak moga zadzialac
|
|
19
26
|
}
|
|
20
|
-
return stored;
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
return { api_url: DEFAULT_API_URL };
|
|
24
27
|
}
|
|
28
|
+
return {
|
|
29
|
+
token: envToken ?? stored.token,
|
|
30
|
+
api_url: envUrl ?? stored.api_url,
|
|
31
|
+
};
|
|
25
32
|
}
|
|
26
33
|
export function saveGlobalConfig(config) {
|
|
27
34
|
if (!existsSync(SAPLO_DIR)) {
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAC,MAAM,SAAS,CAAA;AACrF,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAY9B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAA;AAC3C,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;AACzD,MAAM,eAAe,GAAG,sBAAsB,CAAA;AAC9C,sEAAsE;AACtE,MAAM,cAAc,GAAG,wBAAwB,CAAA;AAE/C,MAAM,UAAU,eAAe;IAC7B,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/mcp/resources.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACvC;AAED,wBAAgB,iBAAiB,IAAI,WAAW,EAAE,CAkDjD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// MCP resources dla Saplo - kontekst przegladalny przez Claude/Cursor.
|
|
2
|
+
// Zwracane jako markdown (lepiej parsuje sie przez LLM) z wyjatkiem schema.
|
|
3
|
+
import { api } from '../lib/api.js';
|
|
4
|
+
export function registerResources() {
|
|
5
|
+
return [
|
|
6
|
+
{
|
|
7
|
+
uri: 'saplo://apps',
|
|
8
|
+
name: 'saplo_apps',
|
|
9
|
+
description: 'List of all your Saplo applications',
|
|
10
|
+
read: async () => {
|
|
11
|
+
const apps = await api.listApplications();
|
|
12
|
+
return appsMarkdown(apps);
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
uri: 'saplo://app/{app_id}',
|
|
17
|
+
name: 'saplo_app_detail',
|
|
18
|
+
description: 'Details for a specific Saplo application (use with app id from saplo://apps)',
|
|
19
|
+
read: async (uri) => {
|
|
20
|
+
const appId = Number(uri.split('/').pop());
|
|
21
|
+
if (!Number.isFinite(appId)) {
|
|
22
|
+
throw new Error(`Invalid app id in URI: ${uri}`);
|
|
23
|
+
}
|
|
24
|
+
const app = await api.getApplication(appId);
|
|
25
|
+
return appMarkdown(app);
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
uri: 'saplo://plans',
|
|
30
|
+
name: 'saplo_plans',
|
|
31
|
+
description: 'Saplo hosting plans matrix - RAM, SSD, CPU, SSH, mail, prices',
|
|
32
|
+
read: async () => {
|
|
33
|
+
const data = await api.listPlans();
|
|
34
|
+
return plansMarkdown(data.plans);
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
uri: 'saplo://docs/manifest',
|
|
39
|
+
name: 'saplo_docs_manifest',
|
|
40
|
+
description: 'Full JSON Schema for saplo.yaml - reference when authoring or editing manifests',
|
|
41
|
+
read: async () => {
|
|
42
|
+
const schema = await api.manifestSchema();
|
|
43
|
+
return ('# saplo.yaml JSON Schema (draft-07)\n\n' +
|
|
44
|
+
'Use this schema to write and validate `saplo.yaml`. Call `saplo_init_scaffold` ' +
|
|
45
|
+
'for a ready template, then `saplo_validate_manifest` before deploying.\n\n' +
|
|
46
|
+
'```json\n' +
|
|
47
|
+
JSON.stringify(schema, null, 2) +
|
|
48
|
+
'\n```\n');
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
function appsMarkdown(apps) {
|
|
54
|
+
if (!apps || apps.length === 0) {
|
|
55
|
+
return 'No applications found. Create one with the `saplo_create_app` tool.';
|
|
56
|
+
}
|
|
57
|
+
const lines = ['# Your Saplo Applications\n'];
|
|
58
|
+
for (const app of apps) {
|
|
59
|
+
const url = app.url ?? '-';
|
|
60
|
+
lines.push(`- **${app.name}** (id=${app.id}) | stack=${app.stack} | status=${app.status} | ${url}`);
|
|
61
|
+
}
|
|
62
|
+
return lines.join('\n');
|
|
63
|
+
}
|
|
64
|
+
function appMarkdown(app) {
|
|
65
|
+
return [
|
|
66
|
+
`# Application: ${app.name} (id=${app.id})`,
|
|
67
|
+
`**Stack:** ${app.stack}`,
|
|
68
|
+
`**Status:** ${app.status}`,
|
|
69
|
+
`**URL:** ${app.url ?? '-'}`,
|
|
70
|
+
`**Domains:** ${(app.domains ?? []).join(', ') || '(none custom)'}`,
|
|
71
|
+
].join('\n');
|
|
72
|
+
}
|
|
73
|
+
function plansMarkdown(plans) {
|
|
74
|
+
if (!plans || plans.length === 0) {
|
|
75
|
+
return 'No plans available.';
|
|
76
|
+
}
|
|
77
|
+
const lines = ['# Saplo Hosting Plans\n'];
|
|
78
|
+
for (const p of plans) {
|
|
79
|
+
lines.push(`## ${p.name} (\`${p.slug}\`) - ${p.price_per_year_pln} PLN/year`);
|
|
80
|
+
lines.push(`- RAM: ${p.limits.ram_mb_per_app} MB`);
|
|
81
|
+
lines.push(`- SSD: ${p.limits.ssd_gb_per_app} GB`);
|
|
82
|
+
lines.push(`- CPU: ${p.limits.cpu_per_app} cores`);
|
|
83
|
+
lines.push(`- Apps: ${p.limits.max_apps}`);
|
|
84
|
+
lines.push(`- Custom domains: ${p.limits.max_custom_domains}`);
|
|
85
|
+
lines.push(`- SSH: ${p.features.ssh_access ? 'yes' : 'no'}`);
|
|
86
|
+
lines.push(`- Mailboxes: ${p.limits.max_mailboxes}`);
|
|
87
|
+
lines.push('');
|
|
88
|
+
}
|
|
89
|
+
return lines.join('\n');
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/mcp/resources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAsBA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAmFpD"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Saplo MCP server - integracja z Claude Code / Desktop / Cursor.
|
|
2
|
+
//
|
|
3
|
+
// Token: SAPLO_API_TOKEN env LUB ~/.saplo/config.json (`saplo login`).
|
|
4
|
+
// URL: SAPLO_API_URL env LUB config (domyslnie https://api.saplo.pl).
|
|
5
|
+
//
|
|
6
|
+
// Uruchamiany przez `saplo mcp serve`, `saplo-mcp` (bin alias) lub bezposrednio
|
|
7
|
+
// przez startMcpServer() z innego kodu. Transport: stdio (FastMCP-style).
|
|
8
|
+
//
|
|
9
|
+
// stdout zarezerwowane dla JSON-RPC MCP framing - cale logowanie na stderr.
|
|
10
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
11
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
12
|
+
import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
13
|
+
import { registerTools } from './tools.js';
|
|
14
|
+
import { registerResources } from './resources.js';
|
|
15
|
+
export async function startMcpServer() {
|
|
16
|
+
const server = new Server({
|
|
17
|
+
name: 'saplo',
|
|
18
|
+
version: '2.0.0',
|
|
19
|
+
}, {
|
|
20
|
+
capabilities: {
|
|
21
|
+
tools: {},
|
|
22
|
+
resources: {},
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
// Rejestracja tools (handler dla list + call)
|
|
26
|
+
const tools = registerTools();
|
|
27
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
28
|
+
tools: tools.map((t) => ({
|
|
29
|
+
name: t.name,
|
|
30
|
+
description: t.description,
|
|
31
|
+
inputSchema: t.inputSchema,
|
|
32
|
+
})),
|
|
33
|
+
}));
|
|
34
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
35
|
+
const { name, arguments: args } = request.params;
|
|
36
|
+
const tool = tools.find((t) => t.name === name);
|
|
37
|
+
if (!tool) {
|
|
38
|
+
return {
|
|
39
|
+
isError: true,
|
|
40
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const result = await tool.handler(args ?? {});
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: 'text', text: typeof result === 'string' ? result : JSON.stringify(result, null, 2) }],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
const message = err.message ?? String(err);
|
|
51
|
+
return {
|
|
52
|
+
isError: true,
|
|
53
|
+
content: [{ type: 'text', text: `Error in ${name}: ${message}` }],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// Rejestracja resources (handler dla list + read)
|
|
58
|
+
const resources = registerResources();
|
|
59
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
60
|
+
resources: resources.map((r) => ({
|
|
61
|
+
uri: r.uri,
|
|
62
|
+
name: r.name,
|
|
63
|
+
description: r.description,
|
|
64
|
+
mimeType: r.mimeType ?? 'text/markdown',
|
|
65
|
+
})),
|
|
66
|
+
}));
|
|
67
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
68
|
+
const { uri } = request.params;
|
|
69
|
+
const resource = resources.find((r) => r.uri === uri || matchTemplate(r.uri, uri));
|
|
70
|
+
if (!resource) {
|
|
71
|
+
throw new Error(`Unknown resource: ${uri}`);
|
|
72
|
+
}
|
|
73
|
+
const text = await resource.read(uri);
|
|
74
|
+
return {
|
|
75
|
+
contents: [
|
|
76
|
+
{
|
|
77
|
+
uri,
|
|
78
|
+
mimeType: resource.mimeType ?? 'text/markdown',
|
|
79
|
+
text,
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
// Stdio transport - czyta JSON-RPC ze stdin, pisze odpowiedzi na stdout.
|
|
85
|
+
const transport = new StdioServerTransport();
|
|
86
|
+
await server.connect(transport);
|
|
87
|
+
// Po connect proces zyje az do EOF na stdin (klient odlaczy).
|
|
88
|
+
console.error('[saplo-mcp] Server started on stdio transport. Ready for MCP requests.');
|
|
89
|
+
}
|
|
90
|
+
// Bardzo prosty matcher dla URI z template-ami typu "saplo://app/{id}".
|
|
91
|
+
// Dopasowuje "saplo://app/123" do template "saplo://app/{id}".
|
|
92
|
+
function matchTemplate(template, uri) {
|
|
93
|
+
const regex = new RegExp('^' + template.replace(/\{[^}]+\}/g, '[^/]+') + '$');
|
|
94
|
+
return regex.test(uri);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC7D;AAMD,wBAAgB,aAAa,IAAI,OAAO,EAAE,CA2MzC"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
// MCP tools dla Saplo - 13 narzedzi v2.0 faza A.
|
|
2
|
+
//
|
|
3
|
+
// Kazdy tool: name, description (widoczne dla LLM), inputSchema (JSON Schema -
|
|
4
|
+
// wymagane przez MCP spec), handler (async function args -> result).
|
|
5
|
+
//
|
|
6
|
+
// Style: cienkie wrappery na axios `api` - cala logika serwerowa zostaje
|
|
7
|
+
// w backendzie Django. Walidacja args na poziomie inputSchema (MCP klient
|
|
8
|
+
// odrzuca zle parametry przed dotarciem do nas).
|
|
9
|
+
import { api } from '../lib/api.js';
|
|
10
|
+
// Allowed stacks - jeden source of truth, uzywany w description (LLM widzi)
|
|
11
|
+
// i jako enum w inputSchema (klient waliduje).
|
|
12
|
+
const STACKS = ['nextjs', 'react', 'vue', 'nuxt', 'sveltekit', 'angular', 'django', 'static', 'docker', 'node', 'astro'];
|
|
13
|
+
export function registerTools() {
|
|
14
|
+
return [
|
|
15
|
+
// ---- Apps ----
|
|
16
|
+
{
|
|
17
|
+
name: 'saplo_list_apps',
|
|
18
|
+
description: 'List all applications in your Saplo account. Returns id, name, stack, status, url.',
|
|
19
|
+
inputSchema: { type: 'object', properties: {}, additionalProperties: false },
|
|
20
|
+
handler: async () => api.listApplications(),
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'saplo_get_app',
|
|
24
|
+
description: 'Get details for a specific application including its current deployment, env count, and domains.',
|
|
25
|
+
inputSchema: {
|
|
26
|
+
type: 'object',
|
|
27
|
+
properties: { app_id: { type: 'integer', description: 'Application ID (use saplo_list_apps to find).' } },
|
|
28
|
+
required: ['app_id'],
|
|
29
|
+
additionalProperties: false,
|
|
30
|
+
},
|
|
31
|
+
handler: async (args) => api.getApplication(args.app_id),
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'saplo_create_app',
|
|
35
|
+
description: `Create a new Saplo application. Returns app id, url and access credentials. Allowed stacks: ${STACKS.join(', ')}.`,
|
|
36
|
+
inputSchema: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
name: { type: 'string', description: 'App slug (lowercase, digits, hyphens). Example: "my-portfolio".' },
|
|
40
|
+
stack: { type: 'string', enum: STACKS, description: 'Technology stack.' },
|
|
41
|
+
izolbox_id: { type: 'integer', description: 'Optional Box ID. Defaults to first active Box of the user.' },
|
|
42
|
+
},
|
|
43
|
+
required: ['name', 'stack'],
|
|
44
|
+
additionalProperties: false,
|
|
45
|
+
},
|
|
46
|
+
handler: async (args) => api.createApplication({
|
|
47
|
+
name: args.name,
|
|
48
|
+
stack: args.stack,
|
|
49
|
+
izolbox_id: args.izolbox_id,
|
|
50
|
+
}),
|
|
51
|
+
},
|
|
52
|
+
// ---- Deploy ----
|
|
53
|
+
{
|
|
54
|
+
name: 'saplo_deployment_status',
|
|
55
|
+
description: 'Get the current status of a deployment (queued, building, releasing, running, failed, cancelled, rolled_back).',
|
|
56
|
+
inputSchema: {
|
|
57
|
+
type: 'object',
|
|
58
|
+
properties: { deployment_id: { type: 'integer' } },
|
|
59
|
+
required: ['deployment_id'],
|
|
60
|
+
additionalProperties: false,
|
|
61
|
+
},
|
|
62
|
+
handler: async (args) => api.getDeployment(args.deployment_id),
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'saplo_logs',
|
|
66
|
+
description: 'Get the most recent build/runtime log lines for a deployment. HTTP polling - for live streaming use WebSocket (coming in v2.3).',
|
|
67
|
+
inputSchema: {
|
|
68
|
+
type: 'object',
|
|
69
|
+
properties: {
|
|
70
|
+
deployment_id: { type: 'integer' },
|
|
71
|
+
since: { type: 'string', description: 'ISO timestamp - return only logs after this time. Optional.' },
|
|
72
|
+
},
|
|
73
|
+
required: ['deployment_id'],
|
|
74
|
+
additionalProperties: false,
|
|
75
|
+
},
|
|
76
|
+
handler: async (args) => api.getLogs(args.deployment_id, args.since),
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'saplo_rollback',
|
|
80
|
+
description: 'Roll back to a previous deployment (or the last stable one if deployment_id omitted). Returns the now-live deployment id. Destructive - confirm with user first.',
|
|
81
|
+
inputSchema: {
|
|
82
|
+
type: 'object',
|
|
83
|
+
properties: {
|
|
84
|
+
app_id: { type: 'integer' },
|
|
85
|
+
deployment_id: { type: 'integer', description: 'Optional - specific deployment to roll back to.' },
|
|
86
|
+
},
|
|
87
|
+
required: ['app_id'],
|
|
88
|
+
additionalProperties: false,
|
|
89
|
+
},
|
|
90
|
+
handler: async (args) => api.rollback(args.app_id, args.deployment_id),
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: 'saplo_restart',
|
|
94
|
+
description: 'Restart the live deployment of an application (no rebuild). Destructive - confirm with user first.',
|
|
95
|
+
inputSchema: {
|
|
96
|
+
type: 'object',
|
|
97
|
+
properties: { app_id: { type: 'integer' } },
|
|
98
|
+
required: ['app_id'],
|
|
99
|
+
additionalProperties: false,
|
|
100
|
+
},
|
|
101
|
+
handler: async (args) => api.restart(args.app_id),
|
|
102
|
+
},
|
|
103
|
+
// ---- Env vars ----
|
|
104
|
+
{
|
|
105
|
+
name: 'saplo_env_get',
|
|
106
|
+
description: 'List environment variables for an application. Secret values are hidden, only keys returned.',
|
|
107
|
+
inputSchema: {
|
|
108
|
+
type: 'object',
|
|
109
|
+
properties: { app_id: { type: 'integer' } },
|
|
110
|
+
required: ['app_id'],
|
|
111
|
+
additionalProperties: false,
|
|
112
|
+
},
|
|
113
|
+
handler: async (args) => api.getEnvVars(args.app_id),
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'saplo_env_set',
|
|
117
|
+
description: 'Create or update environment variables for an application. Pass {KEY: "value"} pairs. Triggers redeploy on next app boot. Destructive - confirm with user.',
|
|
118
|
+
inputSchema: {
|
|
119
|
+
type: 'object',
|
|
120
|
+
properties: {
|
|
121
|
+
app_id: { type: 'integer' },
|
|
122
|
+
vars: {
|
|
123
|
+
type: 'object',
|
|
124
|
+
additionalProperties: { type: 'string' },
|
|
125
|
+
description: 'Key-value map. Prefix value with "@secret:" to reference a stored secret instead of plaintext.',
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
required: ['app_id', 'vars'],
|
|
129
|
+
additionalProperties: false,
|
|
130
|
+
},
|
|
131
|
+
handler: async (args) => api.setEnvVars(args.app_id, args.vars),
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: 'saplo_env_unset',
|
|
135
|
+
description: 'Delete a single environment variable by key. Destructive - confirm with user first.',
|
|
136
|
+
inputSchema: {
|
|
137
|
+
type: 'object',
|
|
138
|
+
properties: {
|
|
139
|
+
app_id: { type: 'integer' },
|
|
140
|
+
key: { type: 'string' },
|
|
141
|
+
},
|
|
142
|
+
required: ['app_id', 'key'],
|
|
143
|
+
additionalProperties: false,
|
|
144
|
+
},
|
|
145
|
+
handler: async (args) => {
|
|
146
|
+
await api.deleteEnvVar(args.app_id, args.key);
|
|
147
|
+
return { deleted: args.key };
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
// ---- Domains ----
|
|
151
|
+
{
|
|
152
|
+
name: 'saplo_domain_list',
|
|
153
|
+
description: 'List all custom domains attached to an application with their verification status.',
|
|
154
|
+
inputSchema: {
|
|
155
|
+
type: 'object',
|
|
156
|
+
properties: { app_id: { type: 'integer' } },
|
|
157
|
+
required: ['app_id'],
|
|
158
|
+
additionalProperties: false,
|
|
159
|
+
},
|
|
160
|
+
handler: async (args) => api.listDomains(args.app_id),
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
name: 'saplo_domain_add',
|
|
164
|
+
description: 'Add a custom domain to an application. Returns DNS records (A/CNAME) the user needs to set at their registrar. SSL via Let\'s Encrypt is provisioned automatically.',
|
|
165
|
+
inputSchema: {
|
|
166
|
+
type: 'object',
|
|
167
|
+
properties: {
|
|
168
|
+
app_id: { type: 'integer' },
|
|
169
|
+
domain: { type: 'string', description: 'Fully qualified domain. Example: "example.com" or "www.example.com".' },
|
|
170
|
+
},
|
|
171
|
+
required: ['app_id', 'domain'],
|
|
172
|
+
additionalProperties: false,
|
|
173
|
+
},
|
|
174
|
+
handler: async (args) => api.addDomain(args.app_id, args.domain),
|
|
175
|
+
},
|
|
176
|
+
// ---- MCP v2 faza A: manifest copilot + plans ----
|
|
177
|
+
{
|
|
178
|
+
name: 'saplo_validate_manifest',
|
|
179
|
+
description: 'Validate a saplo.yaml manifest. Returns ALL errors with path and actionable hints (not just first). Call BEFORE saplo_deploy to catch problems early. Empty errors list means the manifest is valid.',
|
|
180
|
+
inputSchema: {
|
|
181
|
+
type: 'object',
|
|
182
|
+
properties: {
|
|
183
|
+
manifest: { type: 'string', description: 'Full YAML source of saplo.yaml as a string.' },
|
|
184
|
+
},
|
|
185
|
+
required: ['manifest'],
|
|
186
|
+
additionalProperties: false,
|
|
187
|
+
},
|
|
188
|
+
handler: async (args) => api.validateManifest(args.manifest),
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: 'saplo_init_scaffold',
|
|
192
|
+
description: `Generate a ready-to-edit saplo.yaml manifest + .saploignore for the given stack. The manifest contains inline comments to guide further edits. Use this when starting a new app. Allowed stacks: ${STACKS.join(', ')}.`,
|
|
193
|
+
inputSchema: {
|
|
194
|
+
type: 'object',
|
|
195
|
+
properties: {
|
|
196
|
+
stack: { type: 'string', enum: STACKS },
|
|
197
|
+
name: { type: 'string', description: 'App slug (lowercase letters, digits, hyphens).' },
|
|
198
|
+
},
|
|
199
|
+
required: ['stack', 'name'],
|
|
200
|
+
additionalProperties: false,
|
|
201
|
+
},
|
|
202
|
+
handler: async (args) => api.scaffoldManifest(args.stack, args.name),
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
name: 'saplo_list_plans',
|
|
206
|
+
description: 'List available Saplo hosting plans with prices (PLN/year), RAM/SSD/CPU limits, and feature flags (ssh, mail, backups). Public data - useful BEFORE saplo_create_app to pick the right plan.',
|
|
207
|
+
inputSchema: { type: 'object', properties: {}, additionalProperties: false },
|
|
208
|
+
handler: async () => api.listPlans(),
|
|
209
|
+
},
|
|
210
|
+
];
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@saplo/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Official CLI for Saplo hosting platform",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Official CLI + MCP server for Saplo hosting platform - deploy apps from terminal or AI assistants (Claude, Cursor)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"saplo",
|
|
7
7
|
"hosting",
|
|
8
8
|
"cli",
|
|
9
|
-
"deploy"
|
|
9
|
+
"deploy",
|
|
10
|
+
"mcp",
|
|
11
|
+
"claude",
|
|
12
|
+
"claude-code",
|
|
13
|
+
"cursor",
|
|
14
|
+
"model-context-protocol"
|
|
10
15
|
],
|
|
11
16
|
"homepage": "https://saplo.pl/docs/cli/",
|
|
12
17
|
"repository": {
|
|
@@ -21,7 +26,8 @@
|
|
|
21
26
|
"access": "public"
|
|
22
27
|
},
|
|
23
28
|
"bin": {
|
|
24
|
-
"saplo": "./bin/run.js"
|
|
29
|
+
"saplo": "./bin/run.js",
|
|
30
|
+
"saplo-mcp": "./bin/mcp.js"
|
|
25
31
|
},
|
|
26
32
|
"main": "./dist/index.js",
|
|
27
33
|
"exports": "./dist/index.js",
|
|
@@ -40,6 +46,7 @@
|
|
|
40
46
|
"readme": "oclif readme"
|
|
41
47
|
},
|
|
42
48
|
"dependencies": {
|
|
49
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
43
50
|
"@oclif/core": "^3.27.0",
|
|
44
51
|
"axios": "^1.7.9",
|
|
45
52
|
"chalk": "^5.3.0",
|
|
@@ -47,7 +54,8 @@
|
|
|
47
54
|
"ora": "^8.1.1",
|
|
48
55
|
"tar": "^7.4.3",
|
|
49
56
|
"ws": "^8.18.0",
|
|
50
|
-
"yaml": "^2.7.0"
|
|
57
|
+
"yaml": "^2.7.0",
|
|
58
|
+
"zod": "^3.25.76"
|
|
51
59
|
},
|
|
52
60
|
"devDependencies": {
|
|
53
61
|
"@types/form-data": "^2.2.1",
|
|
@@ -74,6 +82,9 @@
|
|
|
74
82
|
},
|
|
75
83
|
"domain": {
|
|
76
84
|
"description": "Manage custom domains for your application"
|
|
85
|
+
},
|
|
86
|
+
"mcp": {
|
|
87
|
+
"description": "MCP server - integration with Claude Code / Desktop / Cursor"
|
|
77
88
|
}
|
|
78
89
|
}
|
|
79
90
|
}
|