code-engine-mcp-server 1.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/LICENSE +21 -0
- package/README.md +387 -0
- package/build/client.d.ts +3 -0
- package/build/client.d.ts.map +1 -0
- package/build/client.js +194 -0
- package/build/client.js.map +1 -0
- package/build/context-discovery.d.ts +86 -0
- package/build/context-discovery.d.ts.map +1 -0
- package/build/context-discovery.js +291 -0
- package/build/context-discovery.js.map +1 -0
- package/build/deploy-tool-enhanced.d.ts +42 -0
- package/build/deploy-tool-enhanced.d.ts.map +1 -0
- package/build/deploy-tool-enhanced.js +323 -0
- package/build/deploy-tool-enhanced.js.map +1 -0
- package/build/deploy-tool.d.ts +27 -0
- package/build/deploy-tool.d.ts.map +1 -0
- package/build/deploy-tool.js +213 -0
- package/build/deploy-tool.js.map +1 -0
- package/build/index.d.ts +11 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +1117 -0
- package/build/index.js.map +1 -0
- package/build/simple-client.d.ts +3 -0
- package/build/simple-client.d.ts.map +1 -0
- package/build/simple-client.js +275 -0
- package/build/simple-client.js.map +1 -0
- package/build/test-all-tools.d.ts +3 -0
- package/build/test-all-tools.d.ts.map +1 -0
- package/build/test-all-tools.js +254 -0
- package/build/test-all-tools.js.map +1 -0
- package/build/test-integration.d.ts +3 -0
- package/build/test-integration.d.ts.map +1 -0
- package/build/test-integration.js +484 -0
- package/build/test-integration.js.map +1 -0
- package/docs/API_CALL_SCENARIOS.md +594 -0
- package/docs/CLIENT_README.md +310 -0
- package/docs/CLINE_CONFIG_EXAMPLE.json +14 -0
- package/docs/CODE_ENGINE_API_REFERENCE.md +764 -0
- package/docs/CODE_OF_CONDUCT.md +46 -0
- package/docs/CONTRIBUTING.md +38 -0
- package/docs/MAINTAINERS.md +15 -0
- package/docs/SETUP_INSTRUCTIONS.md +218 -0
- package/package.json +44 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Enhanced Code Engine Deployment Tool with Context Discovery
|
|
4
|
+
*
|
|
5
|
+
* This tool automatically discovers available projects and namespaces,
|
|
6
|
+
* then prompts the user to select deployment targets.
|
|
7
|
+
*
|
|
8
|
+
* Uses IBM Cloud REST API directly (no CLI required).
|
|
9
|
+
*
|
|
10
|
+
* Author: Markus van Kempen | markus.van.kempen@gmail.com
|
|
11
|
+
* Research | Floor 7½ š¢š¤
|
|
12
|
+
* "No bug too small, no syntax too weird."
|
|
13
|
+
*/
|
|
14
|
+
import { config } from 'dotenv';
|
|
15
|
+
import { exec } from 'child_process';
|
|
16
|
+
import { promisify } from 'util';
|
|
17
|
+
import axios from 'axios';
|
|
18
|
+
import * as readline from 'readline';
|
|
19
|
+
import { resolve } from 'path';
|
|
20
|
+
// Load environment variables from parent directory
|
|
21
|
+
config({ path: resolve(process.cwd(), '../.env') });
|
|
22
|
+
import { discoverContext, findProjectByName } from './context-discovery.js';
|
|
23
|
+
const execAsync = promisify(exec);
|
|
24
|
+
/**
|
|
25
|
+
* Prompt user for input
|
|
26
|
+
*/
|
|
27
|
+
async function promptUser(question) {
|
|
28
|
+
const rl = readline.createInterface({
|
|
29
|
+
input: process.stdin,
|
|
30
|
+
output: process.stdout
|
|
31
|
+
});
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
rl.question(question, (answer) => {
|
|
34
|
+
rl.close();
|
|
35
|
+
resolve(answer.trim());
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Interactive project selection
|
|
41
|
+
*/
|
|
42
|
+
async function selectProjectInteractive(projects) {
|
|
43
|
+
console.log('\nš Available Code Engine Projects:\n');
|
|
44
|
+
projects.forEach((project, index) => {
|
|
45
|
+
console.log(`${index + 1}. ${project.name}`);
|
|
46
|
+
console.log(` Region: ${project.region} | Status: ${project.status}`);
|
|
47
|
+
console.log(` ID: ${project.id}\n`);
|
|
48
|
+
});
|
|
49
|
+
const answer = await promptUser('Select project number (or enter project name): ');
|
|
50
|
+
// Check if it's a number
|
|
51
|
+
const num = parseInt(answer);
|
|
52
|
+
if (!isNaN(num) && num > 0 && num <= projects.length) {
|
|
53
|
+
return projects[num - 1];
|
|
54
|
+
}
|
|
55
|
+
// Try to find by name
|
|
56
|
+
const project = findProjectByName(projects, answer);
|
|
57
|
+
if (project) {
|
|
58
|
+
return project;
|
|
59
|
+
}
|
|
60
|
+
throw new Error(`Invalid selection: ${answer}`);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get IAM token
|
|
64
|
+
*/
|
|
65
|
+
async function getIAMToken(apiKey) {
|
|
66
|
+
const response = await axios.post('https://iam.cloud.ibm.com/identity/token', `grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=${apiKey}`, {
|
|
67
|
+
headers: {
|
|
68
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return response.data.access_token;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Detect container runtime (Docker or Podman)
|
|
75
|
+
*/
|
|
76
|
+
async function detectRuntime() {
|
|
77
|
+
try {
|
|
78
|
+
await execAsync('docker --version');
|
|
79
|
+
return 'docker';
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
try {
|
|
83
|
+
await execAsync('podman --version');
|
|
84
|
+
return 'podman';
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
throw new Error('Neither Docker nor Podman found. Please install one.');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Build container image
|
|
93
|
+
*/
|
|
94
|
+
async function buildImage(runtime, appDir, imageName, steps) {
|
|
95
|
+
steps.push(`Building image with ${runtime}...`);
|
|
96
|
+
const buildCmd = `${runtime} build --platform linux/amd64 -t ${imageName} ${appDir}`;
|
|
97
|
+
const { stdout, stderr } = await execAsync(buildCmd);
|
|
98
|
+
if (stderr && !stderr.includes('WARNING')) {
|
|
99
|
+
steps.push(`Build warnings: ${stderr}`);
|
|
100
|
+
}
|
|
101
|
+
steps.push('ā
Image built successfully');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Push image to registry
|
|
105
|
+
*/
|
|
106
|
+
async function pushImage(runtime, imageName, steps) {
|
|
107
|
+
steps.push('Pushing image to registry...');
|
|
108
|
+
const pushCmd = `${runtime} push ${imageName}`;
|
|
109
|
+
await execAsync(pushCmd);
|
|
110
|
+
steps.push('ā
Image pushed successfully');
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Deploy or update application
|
|
114
|
+
*/
|
|
115
|
+
async function deployApplication(token, region, projectId, appName, imageName, port, steps) {
|
|
116
|
+
const apiUrl = `https://api.${region}.codeengine.cloud.ibm.com/v2/projects/${projectId}/apps`;
|
|
117
|
+
// Check if app exists
|
|
118
|
+
let appExists = false;
|
|
119
|
+
try {
|
|
120
|
+
await axios.get(`${apiUrl}/${appName}`, {
|
|
121
|
+
headers: { 'Authorization': `Bearer ${token}` }
|
|
122
|
+
});
|
|
123
|
+
appExists = true;
|
|
124
|
+
steps.push(`Application '${appName}' exists, updating...`);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
steps.push(`Creating new application '${appName}'...`);
|
|
128
|
+
}
|
|
129
|
+
const appSpec = {
|
|
130
|
+
name: appName,
|
|
131
|
+
image_reference: imageName,
|
|
132
|
+
image_port: port,
|
|
133
|
+
scale_min_instances: 0,
|
|
134
|
+
scale_max_instances: 1,
|
|
135
|
+
scale_cpu_limit: '0.25',
|
|
136
|
+
scale_memory_limit: '0.5G'
|
|
137
|
+
};
|
|
138
|
+
if (appExists) {
|
|
139
|
+
// Update existing app
|
|
140
|
+
await axios.patch(`${apiUrl}/${appName}`, appSpec, {
|
|
141
|
+
headers: {
|
|
142
|
+
'Authorization': `Bearer ${token}`,
|
|
143
|
+
'Content-Type': 'application/merge-patch+json'
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
steps.push('ā
Application updated');
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// Create new app
|
|
150
|
+
await axios.post(apiUrl, appSpec, {
|
|
151
|
+
headers: {
|
|
152
|
+
'Authorization': `Bearer ${token}`,
|
|
153
|
+
'Content-Type': 'application/json'
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
steps.push('ā
Application created');
|
|
157
|
+
}
|
|
158
|
+
// Get application URL
|
|
159
|
+
const appResponse = await axios.get(`${apiUrl}/${appName}`, {
|
|
160
|
+
headers: { 'Authorization': `Bearer ${token}` }
|
|
161
|
+
});
|
|
162
|
+
return appResponse.data.status?.url || '';
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Enhanced deployment with context discovery
|
|
166
|
+
*/
|
|
167
|
+
export async function deployWithContext(spec) {
|
|
168
|
+
const steps = [];
|
|
169
|
+
const apiKey = process.env.IBMCLOUD_API_KEY || process.env.IBM_CLOUD_API_KEY;
|
|
170
|
+
const region = spec.region || 'us-south';
|
|
171
|
+
if (!apiKey) {
|
|
172
|
+
return {
|
|
173
|
+
success: false,
|
|
174
|
+
appName: spec.appName,
|
|
175
|
+
projectName: '',
|
|
176
|
+
projectId: '',
|
|
177
|
+
error: 'IBM_CLOUD_API_KEY environment variable not set',
|
|
178
|
+
steps
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
// Step 1: Discover deployment context
|
|
183
|
+
steps.push('š Discovering deployment context...');
|
|
184
|
+
const context = await discoverContext(apiKey, region);
|
|
185
|
+
steps.push(`ā
Found ${context.projects.length} project(s), ${context.applications.length} application(s)`);
|
|
186
|
+
// Step 2: Select project
|
|
187
|
+
let selectedProject;
|
|
188
|
+
if (spec.projectName) {
|
|
189
|
+
// Use specified project
|
|
190
|
+
const project = findProjectByName(context.projects, spec.projectName);
|
|
191
|
+
if (!project) {
|
|
192
|
+
throw new Error(`Project '${spec.projectName}' not found`);
|
|
193
|
+
}
|
|
194
|
+
selectedProject = project;
|
|
195
|
+
steps.push(`ā
Using project: ${selectedProject.name}`);
|
|
196
|
+
}
|
|
197
|
+
else if (spec.interactive && context.projects.length > 1) {
|
|
198
|
+
// Interactive selection
|
|
199
|
+
selectedProject = await selectProjectInteractive(context.projects);
|
|
200
|
+
steps.push(`ā
Selected project: ${selectedProject.name}`);
|
|
201
|
+
}
|
|
202
|
+
else if (context.projects.length === 1) {
|
|
203
|
+
// Auto-select if only one project
|
|
204
|
+
selectedProject = context.projects[0];
|
|
205
|
+
steps.push(`ā
Auto-selected project: ${selectedProject.name}`);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
throw new Error('Multiple projects found. Please specify projectName or use interactive mode.');
|
|
209
|
+
}
|
|
210
|
+
// Step 3: Get IAM token
|
|
211
|
+
steps.push('š Authenticating with IBM Cloud...');
|
|
212
|
+
const token = await getIAMToken(apiKey);
|
|
213
|
+
steps.push('ā
Authentication successful');
|
|
214
|
+
// Step 4: Detect container runtime
|
|
215
|
+
steps.push('š Detecting container runtime...');
|
|
216
|
+
const runtime = await detectRuntime();
|
|
217
|
+
steps.push(`ā
Using ${runtime}`);
|
|
218
|
+
// Step 5: Build image
|
|
219
|
+
const namespace = spec.namespace || 'mvk-namespace';
|
|
220
|
+
const imageName = `us.icr.io/${namespace}/${spec.appName}:latest`;
|
|
221
|
+
await buildImage(runtime, spec.appDir, imageName, steps);
|
|
222
|
+
// Step 6: Push image
|
|
223
|
+
await pushImage(runtime, imageName, steps);
|
|
224
|
+
// Step 7: Deploy application
|
|
225
|
+
const port = spec.port || 8080;
|
|
226
|
+
const url = await deployApplication(token, region, selectedProject.id, spec.appName, imageName, port, steps);
|
|
227
|
+
steps.push(`ā
Application deployed: ${url}`);
|
|
228
|
+
return {
|
|
229
|
+
success: true,
|
|
230
|
+
appName: spec.appName,
|
|
231
|
+
projectName: selectedProject.name,
|
|
232
|
+
projectId: selectedProject.id,
|
|
233
|
+
url,
|
|
234
|
+
imageTag: imageName,
|
|
235
|
+
steps,
|
|
236
|
+
context
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
steps.push(`ā Deployment failed: ${error.message}`);
|
|
241
|
+
return {
|
|
242
|
+
success: false,
|
|
243
|
+
appName: spec.appName,
|
|
244
|
+
projectName: spec.projectName || '',
|
|
245
|
+
projectId: '',
|
|
246
|
+
error: error.message,
|
|
247
|
+
steps
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// CLI interface
|
|
252
|
+
import { fileURLToPath } from 'url';
|
|
253
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
254
|
+
const isMainModule = process.argv[1] === __filename;
|
|
255
|
+
if (isMainModule) {
|
|
256
|
+
const args = process.argv.slice(2);
|
|
257
|
+
if (args.length < 2) {
|
|
258
|
+
console.log('Usage: npx tsx deploy-tool-enhanced.ts <app-name> <app-dir> [options]');
|
|
259
|
+
console.log('\nOptions:');
|
|
260
|
+
console.log(' --project <name> Project name (optional, will prompt if not provided)');
|
|
261
|
+
console.log(' --namespace <name> Registry namespace (default: mvk-namespace)');
|
|
262
|
+
console.log(' --port <number> Application port (default: 8080)');
|
|
263
|
+
console.log(' --region <region> IBM Cloud region (default: us-south)');
|
|
264
|
+
console.log(' --interactive Enable interactive mode');
|
|
265
|
+
process.exit(1);
|
|
266
|
+
}
|
|
267
|
+
const spec = {
|
|
268
|
+
appName: args[0],
|
|
269
|
+
appDir: args[1],
|
|
270
|
+
interactive: args.includes('--interactive')
|
|
271
|
+
};
|
|
272
|
+
// Parse options
|
|
273
|
+
for (let i = 2; i < args.length; i++) {
|
|
274
|
+
if (args[i] === '--project' && args[i + 1]) {
|
|
275
|
+
spec.projectName = args[i + 1];
|
|
276
|
+
i++;
|
|
277
|
+
}
|
|
278
|
+
else if (args[i] === '--namespace' && args[i + 1]) {
|
|
279
|
+
spec.namespace = args[i + 1];
|
|
280
|
+
i++;
|
|
281
|
+
}
|
|
282
|
+
else if (args[i] === '--port' && args[i + 1]) {
|
|
283
|
+
spec.port = parseInt(args[i + 1]);
|
|
284
|
+
i++;
|
|
285
|
+
}
|
|
286
|
+
else if (args[i] === '--region' && args[i + 1]) {
|
|
287
|
+
spec.region = args[i + 1];
|
|
288
|
+
i++;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
console.log('š Enhanced Code Engine Deployment\n');
|
|
292
|
+
console.log('Author: Markus van Kempen | markus.van.kempen@gmail.com');
|
|
293
|
+
console.log('Research | Floor 7½ š¢š¤\n');
|
|
294
|
+
deployWithContext(spec)
|
|
295
|
+
.then(result => {
|
|
296
|
+
console.log('\n' + '='.repeat(60));
|
|
297
|
+
console.log('DEPLOYMENT SUMMARY');
|
|
298
|
+
console.log('='.repeat(60));
|
|
299
|
+
result.steps.forEach(step => console.log(step));
|
|
300
|
+
if (result.success) {
|
|
301
|
+
console.log('\nā
Deployment successful!');
|
|
302
|
+
console.log(`\nApplication: ${result.appName}`);
|
|
303
|
+
console.log(`Project: ${result.projectName}`);
|
|
304
|
+
console.log(`URL: ${result.url}`);
|
|
305
|
+
console.log(`Image: ${result.imageTag}`);
|
|
306
|
+
if (result.context) {
|
|
307
|
+
console.log(`\nTotal projects: ${result.context.projects.length}`);
|
|
308
|
+
console.log(`Total applications: ${result.context.applications.length}`);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
console.log('\nā Deployment failed');
|
|
313
|
+
console.log(`Error: ${result.error}`);
|
|
314
|
+
process.exit(1);
|
|
315
|
+
}
|
|
316
|
+
})
|
|
317
|
+
.catch(error => {
|
|
318
|
+
console.error('\nā Unexpected error:', error.message);
|
|
319
|
+
process.exit(1);
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
// Made by MVK
|
|
323
|
+
//# sourceMappingURL=deploy-tool-enhanced.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-tool-enhanced.js","sourceRoot":"","sources":["../src/deploy-tool-enhanced.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Engine Automated Deployment Tool
|
|
3
|
+
*
|
|
4
|
+
* Author: Markus van Kempen | markus.van.kempen@gmail.com
|
|
5
|
+
* Research | Floor 7½ š¢š¤ | https://markusvankempen.github.io/
|
|
6
|
+
* No bug too small, no syntax too weird.
|
|
7
|
+
*/
|
|
8
|
+
interface DeploymentSpec {
|
|
9
|
+
appName: string;
|
|
10
|
+
appDir: string;
|
|
11
|
+
message?: string;
|
|
12
|
+
port?: number;
|
|
13
|
+
region?: string;
|
|
14
|
+
namespace?: string;
|
|
15
|
+
}
|
|
16
|
+
interface DeploymentResult {
|
|
17
|
+
success: boolean;
|
|
18
|
+
appName: string;
|
|
19
|
+
url?: string;
|
|
20
|
+
imageTag?: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
steps: string[];
|
|
23
|
+
logs?: string[];
|
|
24
|
+
}
|
|
25
|
+
export declare function deployToCodeEngine(spec: DeploymentSpec): Promise<DeploymentResult>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=deploy-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-tool.d.ts","sourceRoot":"","sources":["../src/deploy-tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AA6DD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwMxF"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Engine Automated Deployment Tool
|
|
3
|
+
*
|
|
4
|
+
* Author: Markus van Kempen | markus.van.kempen@gmail.com
|
|
5
|
+
* Research | Floor 7½ š¢š¤ | https://markusvankempen.github.io/
|
|
6
|
+
* No bug too small, no syntax too weird.
|
|
7
|
+
*/
|
|
8
|
+
import { exec } from 'child_process';
|
|
9
|
+
import { promisify } from 'util';
|
|
10
|
+
import axios from 'axios';
|
|
11
|
+
const execAsync = promisify(exec);
|
|
12
|
+
async function getApplicationLogs(projectId, appName, token, region) {
|
|
13
|
+
try {
|
|
14
|
+
// Get the application to find its instances
|
|
15
|
+
const appResponse = await axios.get(`https://api.${region}.codeengine.cloud.ibm.com/v2/projects/${projectId}/apps/${appName}`, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
16
|
+
// Get instances for the application
|
|
17
|
+
const instancesResponse = await axios.get(`https://api.${region}.codeengine.cloud.ibm.com/v2/projects/${projectId}/apps/${appName}/instances`, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
18
|
+
const logs = [];
|
|
19
|
+
if (instancesResponse.data.instances && instancesResponse.data.instances.length > 0) {
|
|
20
|
+
// Get logs from the first running instance
|
|
21
|
+
const instance = instancesResponse.data.instances[0];
|
|
22
|
+
logs.push(`\n=== Logs from instance: ${instance.name} ===`);
|
|
23
|
+
logs.push(`Status: ${instance.status}`);
|
|
24
|
+
logs.push(`Created: ${instance.created_at}`);
|
|
25
|
+
// Try to get logs via API (if available)
|
|
26
|
+
try {
|
|
27
|
+
const logsResponse = await axios.get(`https://api.${region}.codeengine.cloud.ibm.com/v2/projects/${projectId}/apps/${appName}/instances/${instance.name}/logs`, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
28
|
+
if (logsResponse.data.logs) {
|
|
29
|
+
logs.push('\n--- Application Logs ---');
|
|
30
|
+
logs.push(logsResponse.data.logs);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (logError) {
|
|
34
|
+
logs.push('\nNote: Real-time logs available via IBM Cloud Console or CLI');
|
|
35
|
+
logs.push(`View logs: ibmcloud ce app logs --name ${appName}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
logs.push('\nNo running instances found yet. Application may still be starting.');
|
|
40
|
+
logs.push(`Check status: ibmcloud ce app get --name ${appName}`);
|
|
41
|
+
logs.push(`View logs: ibmcloud ce app logs --name ${appName} --follow`);
|
|
42
|
+
}
|
|
43
|
+
return logs;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return [
|
|
47
|
+
'\nNote: Unable to fetch logs via API',
|
|
48
|
+
`View logs in IBM Cloud Console or use: ibmcloud ce app logs --name ${appName} --follow`,
|
|
49
|
+
`Error: ${error.message}`
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export async function deployToCodeEngine(spec) {
|
|
54
|
+
const steps = [];
|
|
55
|
+
const apiKey = process.env.IBMCLOUD_API_KEY;
|
|
56
|
+
const region = spec.region || 'us-south';
|
|
57
|
+
const namespace = spec.namespace || 'mvk-code-engine';
|
|
58
|
+
if (!apiKey) {
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
appName: spec.appName,
|
|
62
|
+
error: 'IBMCLOUD_API_KEY not found in environment',
|
|
63
|
+
steps
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
// Step 1: Detect container runtime
|
|
68
|
+
steps.push('Detecting container runtime...');
|
|
69
|
+
const { stdout: podmanCheck } = await execAsync('which podman').catch(() => ({ stdout: '' }));
|
|
70
|
+
const { stdout: dockerCheck } = await execAsync('which docker').catch(() => ({ stdout: '' }));
|
|
71
|
+
const runtime = podmanCheck ? 'podman' : dockerCheck ? 'docker' : null;
|
|
72
|
+
if (!runtime) {
|
|
73
|
+
throw new Error('No container runtime (docker or podman) found');
|
|
74
|
+
}
|
|
75
|
+
steps.push(`ā Using ${runtime}`);
|
|
76
|
+
// Step 2: Build image with correct architecture
|
|
77
|
+
const imageTag = `us.icr.io/${namespace}/${spec.appName}:latest`;
|
|
78
|
+
steps.push(`Building image: ${imageTag}`);
|
|
79
|
+
const buildCmd = `cd ${spec.appDir} && ${runtime} build --platform linux/amd64 -t ${imageTag} .`;
|
|
80
|
+
await execAsync(buildCmd);
|
|
81
|
+
steps.push('ā Image built successfully');
|
|
82
|
+
// Step 3: Login to IBM Container Registry
|
|
83
|
+
steps.push('Authenticating with IBM Container Registry...');
|
|
84
|
+
const loginCmd = `echo "${apiKey}" | ${runtime} login -u iamapikey --password-stdin us.icr.io`;
|
|
85
|
+
await execAsync(loginCmd);
|
|
86
|
+
steps.push('ā Authenticated');
|
|
87
|
+
// Step 4: Push image
|
|
88
|
+
steps.push('Pushing image to registry...');
|
|
89
|
+
await execAsync(`${runtime} push ${imageTag}`);
|
|
90
|
+
steps.push('ā Image pushed');
|
|
91
|
+
// Step 5: Get IAM token
|
|
92
|
+
steps.push('Getting IAM token...');
|
|
93
|
+
const tokenResponse = await axios.post('https://iam.cloud.ibm.com/identity/token', new URLSearchParams({
|
|
94
|
+
grant_type: 'urn:ibm:params:oauth:grant-type:apikey',
|
|
95
|
+
apikey: apiKey
|
|
96
|
+
}), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
|
|
97
|
+
const token = tokenResponse.data.access_token;
|
|
98
|
+
steps.push('ā Token obtained');
|
|
99
|
+
// Step 6: List projects and get first active one
|
|
100
|
+
steps.push('Finding Code Engine project...');
|
|
101
|
+
const projectsResponse = await axios.get(`https://api.${region}.codeengine.cloud.ibm.com/v2/projects`, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
102
|
+
const project = projectsResponse.data.projects?.find((p) => p.status === 'active') ||
|
|
103
|
+
projectsResponse.data.projects?.[0];
|
|
104
|
+
if (!project) {
|
|
105
|
+
throw new Error('No Code Engine projects found');
|
|
106
|
+
}
|
|
107
|
+
steps.push(`ā Using project: ${project.name}`);
|
|
108
|
+
// Step 7: Ensure registry secret exists
|
|
109
|
+
steps.push('Configuring registry access...');
|
|
110
|
+
try {
|
|
111
|
+
await axios.post(`https://api.${region}.codeengine.cloud.ibm.com/v2/projects/${project.id}/secrets`, {
|
|
112
|
+
name: 'icr-pull-secret',
|
|
113
|
+
format: 'registry',
|
|
114
|
+
data: {
|
|
115
|
+
username: 'iamapikey',
|
|
116
|
+
password: apiKey,
|
|
117
|
+
server: 'us.icr.io'
|
|
118
|
+
}
|
|
119
|
+
}, { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } });
|
|
120
|
+
steps.push('ā Registry secret created');
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (error.response?.status === 409) {
|
|
124
|
+
steps.push('ā Registry secret already exists');
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Step 8: Deploy or update application
|
|
131
|
+
steps.push('Deploying application...');
|
|
132
|
+
// Check if app exists
|
|
133
|
+
let appExists = false;
|
|
134
|
+
try {
|
|
135
|
+
await axios.get(`https://api.${region}.codeengine.cloud.ibm.com/v2/projects/${project.id}/apps/${spec.appName}`, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
136
|
+
appExists = true;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
if (error.response?.status !== 404) {
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
let appUrl;
|
|
144
|
+
if (appExists) {
|
|
145
|
+
// Update existing app
|
|
146
|
+
steps.push('Updating existing application...');
|
|
147
|
+
const getResponse = await axios.get(`https://api.${region}.codeengine.cloud.ibm.com/v2/projects/${project.id}/apps/${spec.appName}`, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
148
|
+
const updateResponse = await axios.patch(`https://api.${region}.codeengine.cloud.ibm.com/v2/projects/${project.id}/apps/${spec.appName}`, {
|
|
149
|
+
image_reference: imageTag,
|
|
150
|
+
run_env_variables: [
|
|
151
|
+
...getResponse.data.run_env_variables.filter((v) => v.name !== 'DEPLOY_TIME'),
|
|
152
|
+
{ type: 'literal', name: 'DEPLOY_TIME', value: new Date().toISOString() }
|
|
153
|
+
]
|
|
154
|
+
}, {
|
|
155
|
+
headers: {
|
|
156
|
+
'Authorization': `Bearer ${token}`,
|
|
157
|
+
'Content-Type': 'application/merge-patch+json',
|
|
158
|
+
'If-Match': getResponse.data.entity_tag
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
appUrl = updateResponse.data.endpoint;
|
|
162
|
+
steps.push('ā Application updated');
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
// Create new app
|
|
166
|
+
steps.push('Creating new application...');
|
|
167
|
+
const createResponse = await axios.post(`https://api.${region}.codeengine.cloud.ibm.com/v2/projects/${project.id}/apps`, {
|
|
168
|
+
name: spec.appName,
|
|
169
|
+
image_reference: imageTag,
|
|
170
|
+
image_secret: 'icr-pull-secret',
|
|
171
|
+
image_port: spec.port || 8000,
|
|
172
|
+
scale_min_instances: 0,
|
|
173
|
+
scale_max_instances: 2,
|
|
174
|
+
scale_cpu_limit: '0.25',
|
|
175
|
+
scale_memory_limit: '0.5G',
|
|
176
|
+
run_env_variables: spec.message ? [
|
|
177
|
+
{ type: 'literal', name: 'MESSAGE', value: spec.message },
|
|
178
|
+
{ type: 'literal', name: 'NODE_ENV', value: 'production' }
|
|
179
|
+
] : [
|
|
180
|
+
{ type: 'literal', name: 'NODE_ENV', value: 'production' }
|
|
181
|
+
]
|
|
182
|
+
}, { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } });
|
|
183
|
+
appUrl = createResponse.data.endpoint;
|
|
184
|
+
steps.push('ā Application created');
|
|
185
|
+
}
|
|
186
|
+
steps.push('ā Deployment complete!');
|
|
187
|
+
steps.push('\nFetching application logs...');
|
|
188
|
+
// Wait a moment for the app to start
|
|
189
|
+
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
190
|
+
// Get application logs
|
|
191
|
+
const logs = await getApplicationLogs(project.id, spec.appName, token, region);
|
|
192
|
+
steps.push('ā Logs retrieved');
|
|
193
|
+
return {
|
|
194
|
+
success: true,
|
|
195
|
+
appName: spec.appName,
|
|
196
|
+
url: appUrl,
|
|
197
|
+
imageTag,
|
|
198
|
+
steps,
|
|
199
|
+
logs
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
steps.push(`ā Error: ${error.message}`);
|
|
204
|
+
return {
|
|
205
|
+
success: false,
|
|
206
|
+
appName: spec.appName,
|
|
207
|
+
error: error.message,
|
|
208
|
+
steps
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Made by MVK
|
|
213
|
+
//# sourceMappingURL=deploy-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-tool.js","sourceRoot":"","sources":["../src/deploy-tool.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Code Engine MCP Server
|
|
4
|
+
* Model Context Protocol server for IBM Code Engine and Docker/Podman integration
|
|
5
|
+
*
|
|
6
|
+
* Author: Markus van Kempen | markus.van.kempen@gmail.com
|
|
7
|
+
* Research | Floor 7½ š¢š¤ | https://markusvankempen.github.io/
|
|
8
|
+
* No bug too small, no syntax too weird.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
|