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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +387 -0
  3. package/build/client.d.ts +3 -0
  4. package/build/client.d.ts.map +1 -0
  5. package/build/client.js +194 -0
  6. package/build/client.js.map +1 -0
  7. package/build/context-discovery.d.ts +86 -0
  8. package/build/context-discovery.d.ts.map +1 -0
  9. package/build/context-discovery.js +291 -0
  10. package/build/context-discovery.js.map +1 -0
  11. package/build/deploy-tool-enhanced.d.ts +42 -0
  12. package/build/deploy-tool-enhanced.d.ts.map +1 -0
  13. package/build/deploy-tool-enhanced.js +323 -0
  14. package/build/deploy-tool-enhanced.js.map +1 -0
  15. package/build/deploy-tool.d.ts +27 -0
  16. package/build/deploy-tool.d.ts.map +1 -0
  17. package/build/deploy-tool.js +213 -0
  18. package/build/deploy-tool.js.map +1 -0
  19. package/build/index.d.ts +11 -0
  20. package/build/index.d.ts.map +1 -0
  21. package/build/index.js +1117 -0
  22. package/build/index.js.map +1 -0
  23. package/build/simple-client.d.ts +3 -0
  24. package/build/simple-client.d.ts.map +1 -0
  25. package/build/simple-client.js +275 -0
  26. package/build/simple-client.js.map +1 -0
  27. package/build/test-all-tools.d.ts +3 -0
  28. package/build/test-all-tools.d.ts.map +1 -0
  29. package/build/test-all-tools.js +254 -0
  30. package/build/test-all-tools.js.map +1 -0
  31. package/build/test-integration.d.ts +3 -0
  32. package/build/test-integration.d.ts.map +1 -0
  33. package/build/test-integration.js +484 -0
  34. package/build/test-integration.js.map +1 -0
  35. package/docs/API_CALL_SCENARIOS.md +594 -0
  36. package/docs/CLIENT_README.md +310 -0
  37. package/docs/CLINE_CONFIG_EXAMPLE.json +14 -0
  38. package/docs/CODE_ENGINE_API_REFERENCE.md +764 -0
  39. package/docs/CODE_OF_CONDUCT.md +46 -0
  40. package/docs/CONTRIBUTING.md +38 -0
  41. package/docs/MAINTAINERS.md +15 -0
  42. package/docs/SETUP_INSTRUCTIONS.md +218 -0
  43. 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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"}
@@ -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"}