@boltic/cli 1.0.26 → 1.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ⚡ Boltic CLI
2
2
 
3
- > **Professional CLI tool for creating, managing, and publishing Boltic Workflow integrations with enterprise-grade features and seamless developer experience.**
3
+ > **Professional CLI for interacting with the Boltic platform — create, manage, and publish integrations, workflows, MCPs, and more with enterprise-grade features and a seamless developer experience.**
4
4
 
5
5
  [![NPM Version](https://img.shields.io/npm/v/@boltic/cli)](https://www.npmjs.com/package/@boltic/cli)
6
6
  [![GitHub Repo](https://img.shields.io/badge/GitHub-Repo-blue?logo=github)](https://github.com/bolticio/cli)
@@ -13,7 +13,7 @@
13
13
 
14
14
  ![Boltic CLI](https://img.shields.io/badge/Boltic-CLI-00D4AA?style=for-the-badge&logo=node.js&logoColor=white)
15
15
 
16
- **Streamline your integration development workflow with Boltic CLI**
16
+ **Streamline your developer workflow on the Boltic platform**
17
17
 
18
18
  [Features](#-features) • [Installation](#-installation) • [Quick Start](#-quick-start) • [Documentation](#-documentation) • [Contributing](#-contributing)
19
19
 
@@ -28,6 +28,7 @@
28
28
  - [📦 Installation](#-installation)
29
29
  - [🔐 Authentication](#-authentication)
30
30
  - [🧩 Integration Management](#-integration-management)
31
+ - [🧠 MCP](#-mcp-model-context-protocol)
31
32
  - [📚 Command Reference](#-command-reference)
32
33
  - [🛠️ Development Workflow](#️-development-workflow)
33
34
  - [🔧 Configuration](#-configuration)
@@ -42,12 +43,12 @@
42
43
  ## ✨ Features
43
44
 
44
45
  - 🔐 **Secure Authentication** - Enterprise-grade token management with secure storage
45
- - 🚀 **Rapid Integration Development** - Create integrations in minutes, not hours
46
+ - 🚀 **Rapid Development** - Create workflows, integrations, and more in minutes, not hours
46
47
  - 📦 **Smart Project Management** - Automated folder structure and configuration
47
48
  - 🔄 **Real-time Synchronization** - Instant sync with Boltic Cloud platform
48
49
  - 🎯 **Type-safe Development** - Support for Workflow Activities and Triggers
49
50
  - 🎨 **Rich Interactive UI** - Beautiful command-line interface with progress indicators
50
- - 📊 **Comprehensive Validation** - Built-in validation for all integration components
51
+ - 📊 **Comprehensive Validation** - Built-in validation for platform resources and components
51
52
  - 🔧 **Developer Experience** - Hot reload, debugging tools, and comprehensive error handling
52
53
  - 🌐 **Multi-platform Support** - Works seamlessly on Windows, macOS, and Linux
53
54
  - 📈 **Version Control Integration** - Git-friendly workflow with proper ignore patterns
@@ -62,7 +63,7 @@ Get up and running with Boltic CLI in under 2 minutes:
62
63
  # Install Boltic CLI globally
63
64
  npm install -g @boltic/cli
64
65
 
65
- # Authenticate with your Boltic account
66
+ # Authenticate with your Boltic account (if required for commands)
66
67
  boltic login
67
68
 
68
69
  # Create your first integration
@@ -274,6 +275,26 @@ boltic integration submit
274
275
 
275
276
  ---
276
277
 
278
+ ## 🔌 MCP Management
279
+
280
+ The CLI includes utilities to set up MCP connections for popular clients. This helps your AI tools connect to Boltic services via STDIO or Streamable HTTP.
281
+
282
+ ### Usage
283
+
284
+ ```bash
285
+ # Basic: configure MCP for Claude Desktop (default client)
286
+ boltic mcp setup https://mcp.boltic.io/sse
287
+
288
+ # Specify client and a friendly name
289
+ boltic mcp setup https://mcp.boltic.io/sse my-boltic --client claude
290
+
291
+ # Supported clients (examples):
292
+ # claude, cline, roocode, windsurf, cursor, vscode, vscode-insiders,
293
+ # witsy, enconvo, boltai, amazon-bedrock, amazonq, librechat, gemini-cli
294
+ ```
295
+
296
+ ---
297
+
277
298
  ## 📚 Command Reference
278
299
 
279
300
  ### Core Commands
@@ -297,6 +318,13 @@ boltic integration submit
297
318
  | `boltic integration status` | Check integration status | Interactive selection |
298
319
  | `boltic integration help` | Show integration help | |
299
320
 
321
+ ### MCP Commands
322
+
323
+ | Command | Description | Options |
324
+ | ------------------ | -------------------------------------------- | --------------------------------- |
325
+ | `boltic mcp help` | Show help for MCP sub-commands | |
326
+ | `boltic mcp setup` | Configure an MCP server for a specific client| `--client <name>` `--name <alias>`|
327
+
300
328
  ### Help and Documentation
301
329
 
302
330
  ```bash
package/cli.js CHANGED
@@ -4,6 +4,7 @@ import path from "path";
4
4
  import { fileURLToPath } from "url";
5
5
  import EnvironmentCommands from "./commands/env.js";
6
6
  import IntegrationCommands from "./commands/integration.js";
7
+ import McpCommands from "./commands/mcp.js";
7
8
  import AuthCommands from "./commands/login.js";
8
9
 
9
10
  // Create a CLI module with functional approach
@@ -22,6 +23,10 @@ const createCLI = (consoleUrl, apiUrl, serviceName, env) => {
22
23
  description: "Manage integrations (create, list)",
23
24
  action: (args) => handleIntegration(args),
24
25
  },
26
+ mcp: {
27
+ description: "Manage MCPs clients and servers",
28
+ action: (args) => handleMcp(args),
29
+ },
25
30
  logout: {
26
31
  description: "Logout and clear access token",
27
32
  action: AuthCommands.handleLogout,
@@ -157,6 +162,10 @@ async function handleEnvironment(args) {
157
162
  await EnvironmentCommands.execute(args);
158
163
  }
159
164
 
165
+ async function handleMcp(args) {
166
+ await McpCommands.execute(args);
167
+ }
168
+
160
169
  async function showVersion() {
161
170
  let version = "1.0.0";
162
171
  try {
@@ -0,0 +1,374 @@
1
+ import chalk from "chalk";
2
+ import fs from "fs";
3
+ import os from "os";
4
+ import path from "path";
5
+ import yaml from "js-yaml";
6
+ import { execFileSync } from "child_process";
7
+
8
+ // Types removed for CommonJS conversion
9
+
10
+ const commands = {
11
+ setup: {
12
+ description: "Setup command for various MCP Clients",
13
+ action: handleSetup,
14
+ },
15
+ help: {
16
+ description: "Show help for mcp commands",
17
+ action: showHelp,
18
+ },
19
+ };
20
+
21
+ // Execute the MCP command
22
+ const execute = async (args) => {
23
+ const subCommand = args[0];
24
+
25
+ if (!subCommand) {
26
+ showHelp();
27
+ return;
28
+ }
29
+
30
+ if (!commands[subCommand]) {
31
+ console.log(chalk.red("Unknown or missing mcp sub-command.\n"));
32
+ showHelp();
33
+ return;
34
+ }
35
+
36
+ const commandObj = commands[subCommand];
37
+ await commandObj.action(args.slice(1));
38
+ };
39
+
40
+ function showHelp() {
41
+ console.log(chalk.cyan("\nMCP Commands:\n"));
42
+ Object.entries(commands).forEach(([cmd, details]) => {
43
+ console.log(chalk.bold(`${cmd}`) + ` - ${details.description}`);
44
+ });
45
+ }
46
+
47
+ // Handle setup subcommand: setup <url> [name] --client <client>
48
+ async function handleSetup(args) {
49
+ // Parse positional args
50
+ const url = args[0];
51
+ let name = args[1] && !args[1].startsWith("--") ? args[1] : undefined;
52
+
53
+ // Parse flags: --client, --name
54
+ let client = "claude";
55
+ for (let i = 0; i < args.length; i++) {
56
+ const token = args[i];
57
+ if (
58
+ token === "--client" &&
59
+ args[i + 1] &&
60
+ !args[i + 1].startsWith("--")
61
+ ) {
62
+ client = args[i + 1];
63
+ i++;
64
+ } else if (token.startsWith("--client=")) {
65
+ client = token.split("=")[1];
66
+ } else if (
67
+ token === "--name" &&
68
+ args[i + 1] &&
69
+ !args[i + 1].startsWith("--")
70
+ ) {
71
+ name = args[i + 1];
72
+ i++;
73
+ } else if (token.startsWith("--name=")) {
74
+ name = token.split("=")[1];
75
+ }
76
+ }
77
+
78
+ if (!url) {
79
+ console.log(
80
+ chalk.red(
81
+ "❌ URL is required. Usage: boltic mcp setup <url> [name] --client <client>"
82
+ )
83
+ );
84
+ return;
85
+ }
86
+
87
+ const newKey =
88
+ name || url.split("/").slice(3).join("/").replace(/\//g, "-");
89
+
90
+ try {
91
+ console.log(chalk.cyan("📝 Configuration Details:"));
92
+ console.log(` URL: ${chalk.green(url)}`);
93
+ console.log(` Client: ${chalk.green(client)}`);
94
+ console.log(` Name: ${chalk.green(newKey)}\n`);
95
+
96
+ const mcpUrl = url;
97
+ const command = `composio --sse "${mcpUrl}"`;
98
+
99
+ console.log(chalk.cyan("💾 Saving configurations..."));
100
+
101
+ saveMcpConfig(url, client, newKey, mcpUrl, command);
102
+
103
+ console.log(
104
+ chalk.cyan(
105
+ `\n🚀 All done! Please restart ${client} for changes to take effect\n`
106
+ )
107
+ );
108
+ } catch (error) {
109
+ console.log(chalk.red("\n❌ Error occurred while setting up MCP:"));
110
+ console.log(
111
+ chalk.red(
112
+ ` ${error && error.message ? error.message : String(error)}`
113
+ )
114
+ );
115
+ console.log(
116
+ chalk.yellow(
117
+ "\nPlease try again or contact support if the issue persists.\n"
118
+ )
119
+ );
120
+ }
121
+ }
122
+
123
+ function saveMcpConfig(url, clientType, name, mcpUrl, command) {
124
+ const config = {
125
+ command: "npx",
126
+ args: ["-y", "mcp-remote", mcpUrl],
127
+ env: {
128
+ npm_config_yes: "true",
129
+ },
130
+ };
131
+
132
+ const sseConfig = {
133
+ url: mcpUrl,
134
+ };
135
+
136
+ const homeDir = os.homedir();
137
+
138
+ const platformPaths = {
139
+ win32: {
140
+ baseDir:
141
+ process.env.APPDATA || path.join(homeDir, "AppData", "Roaming"),
142
+ vscodePath: path.join("Code", "User", "globalStorage"),
143
+ },
144
+ darwin: {
145
+ baseDir: path.join(homeDir, "Library", "Application Support"),
146
+ vscodePath: path.join("Code", "User", "globalStorage"),
147
+ },
148
+ linux: {
149
+ baseDir:
150
+ process.env.XDG_CONFIG_HOME || path.join(homeDir, ".config"),
151
+ vscodePath: path.join("Code/User/globalStorage"),
152
+ },
153
+ };
154
+
155
+ const platform = process.platform;
156
+
157
+ // Check if platform is supported
158
+ if (!platformPaths[platform]) {
159
+ console.log(chalk.red(`\n❌ Platform ${platform} is not supported.`));
160
+ process.exit(1);
161
+ }
162
+
163
+ const { baseDir } = platformPaths[platform];
164
+
165
+ const defaultClaudePath = path.join(
166
+ baseDir,
167
+ "Claude",
168
+ "claude_desktop_config.json"
169
+ );
170
+
171
+ // Define client paths using the platform-specific base directories
172
+ const clientPaths = {
173
+ claude: {
174
+ type: "file",
175
+ path: defaultClaudePath,
176
+ },
177
+ cline: {
178
+ type: "file",
179
+ path: path.join(
180
+ baseDir,
181
+ platformPaths[platform].vscodePath,
182
+ "saoudrizwan.claude-dev",
183
+ "settings",
184
+ "cline_mcp_settings.json"
185
+ ),
186
+ },
187
+ roocode: {
188
+ type: "file",
189
+ path: path.join(
190
+ baseDir,
191
+ platformPaths[platform].vscodePath,
192
+ "rooveterinaryinc.roo-cline",
193
+ "settings",
194
+ "mcp_settings.json"
195
+ ),
196
+ },
197
+ windsurf: {
198
+ type: "file",
199
+ path: path.join(homeDir, ".codeium", "windsurf", "mcp_config.json"),
200
+ },
201
+ witsy: {
202
+ type: "file",
203
+ path: path.join(baseDir, "Witsy", "settings.json"),
204
+ },
205
+ enconvo: {
206
+ type: "file",
207
+ path: path.join(homeDir, ".config", "enconvo", "mcp_config.json"),
208
+ },
209
+ cursor: {
210
+ type: "file",
211
+ path: path.join(homeDir, ".cursor", "mcp.json"),
212
+ },
213
+ vscode: {
214
+ type: "command",
215
+ command: process.platform === "win32" ? "code.cmd" : "code",
216
+ },
217
+ "vscode-insiders": {
218
+ type: "command",
219
+ command:
220
+ process.platform === "win32"
221
+ ? "code-insiders.cmd"
222
+ : "code-insiders",
223
+ },
224
+ boltai: {
225
+ type: "file",
226
+ path: path.join(homeDir, ".boltai", "mcp.json"),
227
+ },
228
+ "amazon-bedrock": {
229
+ type: "file",
230
+ path: path.join(
231
+ homeDir,
232
+ "Amazon Bedrock Client",
233
+ "mcp_config.json"
234
+ ),
235
+ },
236
+ amazonq: {
237
+ type: "file",
238
+ path: path.join(homeDir, ".aws", "amazonq", "mcp.json"),
239
+ },
240
+ librechat: {
241
+ type: "yaml",
242
+ path: path.join(homeDir, "LibreChat", "librechat.yaml"),
243
+ },
244
+ "gemini-cli": {
245
+ type: "file",
246
+ path: path.join(homeDir, ".gemini", "settings.json"),
247
+ },
248
+ };
249
+ if (!clientPaths[clientType]) {
250
+ console.log(chalk.red(`\n❌ Client ${clientType} is not supported.`));
251
+ process.exit(1);
252
+ }
253
+
254
+ const clientConfig = clientPaths[clientType];
255
+ const newKey =
256
+ name || url.split("/").slice(3).join("/").replace(/\//g, "-");
257
+
258
+ if (clientConfig.type === "command") {
259
+ handleCommandClient(clientConfig, newKey, config);
260
+ } else if (clientConfig.type === "yaml") {
261
+ handleYamlClient(clientConfig, newKey, config);
262
+ } else {
263
+ handleFileClient(clientConfig, newKey, config, mcpUrl);
264
+ }
265
+ }
266
+
267
+ function handleCommandClient(clientConfig, serverName, config) {
268
+ if (!clientConfig.command) {
269
+ throw new Error("Command not specified for command-type client");
270
+ }
271
+
272
+ const args = [];
273
+ args.push("--add-mcp", JSON.stringify({ ...config, name: serverName }));
274
+
275
+ try {
276
+ const output = execFileSync(clientConfig.command, args);
277
+ console.log(
278
+ chalk.green(
279
+ `✅ Configuration added via ${clientConfig.command}: ${output.toString()}`
280
+ )
281
+ );
282
+ } catch (error) {
283
+ if (error && error.code === "ENOENT") {
284
+ throw new Error(
285
+ `Command '${clientConfig.command}' not found. Make sure ${clientConfig.command} is installed and on your PATH`
286
+ );
287
+ }
288
+ throw error;
289
+ }
290
+ }
291
+
292
+ function handleYamlClient(clientConfig, serverName, config) {
293
+ if (!clientConfig.path) {
294
+ throw new Error("Path not specified for YAML client");
295
+ }
296
+
297
+ const configDir = path.dirname(clientConfig.path);
298
+ if (!fs.existsSync(configDir)) {
299
+ fs.mkdirSync(configDir, { recursive: true });
300
+ }
301
+
302
+ let existingYaml = {};
303
+
304
+ try {
305
+ if (fs.existsSync(clientConfig.path)) {
306
+ const originalContent = fs.readFileSync(clientConfig.path, "utf8");
307
+ existingYaml = yaml.load(originalContent) || {};
308
+ }
309
+ } catch (error) {
310
+ console.log(chalk.yellow("⚠️ Creating new YAML config file"));
311
+ }
312
+
313
+ // Initialize mcpServers if it doesn't exist
314
+ if (!existingYaml.mcpServers) {
315
+ existingYaml.mcpServers = {};
316
+ }
317
+
318
+ // Add the new server
319
+ existingYaml.mcpServers[serverName] = config;
320
+
321
+ // Write the updated YAML
322
+ const yamlContent = yaml.dump(existingYaml, {
323
+ indent: 2,
324
+ lineWidth: -1,
325
+ noRefs: true,
326
+ });
327
+
328
+ fs.writeFileSync(clientConfig.path, yamlContent);
329
+ console.log(chalk.green(`✅ Configuration saved to: ${clientConfig.path}`));
330
+ }
331
+
332
+ function handleFileClient(clientConfig, serverName, config, mcpUrl) {
333
+ if (!clientConfig.path) {
334
+ throw new Error("Path not specified for file client");
335
+ }
336
+
337
+ const configDir = path.dirname(clientConfig.path);
338
+ if (!fs.existsSync(configDir)) {
339
+ fs.mkdirSync(configDir, { recursive: true });
340
+ }
341
+
342
+ let existingConfig = { mcpServers: {} };
343
+
344
+ try {
345
+ if (fs.existsSync(clientConfig.path)) {
346
+ existingConfig = JSON.parse(
347
+ fs.readFileSync(clientConfig.path, "utf8")
348
+ );
349
+ }
350
+ } catch (error) {
351
+ console.log(chalk.yellow("⚠️ Creating new config file"));
352
+ }
353
+
354
+ // Ensure mcpServers exists
355
+ if (!existingConfig.mcpServers) existingConfig.mcpServers = {};
356
+
357
+ // Special handling for Cursor which uses SSE configuration
358
+ if (clientConfig.path?.includes(".cursor")) {
359
+ const sseConfig = {
360
+ url: mcpUrl,
361
+ };
362
+ existingConfig.mcpServers[serverName] = sseConfig;
363
+ } else {
364
+ existingConfig.mcpServers[serverName] = config;
365
+ }
366
+
367
+ fs.writeFileSync(
368
+ clientConfig.path,
369
+ JSON.stringify(existingConfig, null, 2)
370
+ );
371
+ console.log(chalk.green(`✅ Configuration saved to: ${clientConfig.path}`));
372
+ }
373
+
374
+ export default { execute };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boltic/cli",
3
- "version": "1.0.26",
3
+ "version": "1.0.27",
4
4
  "description": "A powerful CLI tool for managing Boltic Workflow integrations - create, sync, test, and publish integrations with ease",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -107,6 +107,7 @@
107
107
  "@inquirer/prompts": "^7.8.0",
108
108
  "axios": "^1.11.0",
109
109
  "chalk": "^5.5.0",
110
+ "js-yaml": "^4.1.0",
110
111
  "keytar": "^7.9.0",
111
112
  "lodash.isempty": "^4.4.0",
112
113
  "open": "^10.2.0",