@cequenceai/mcp-cli
Version:
Cequence MCP CLI - Command-line tool for setting up Cequence MCP servers with AI clients
112 lines (92 loc) • 2.97 kB
text/typescript
import { spawn } from 'child_process';
import { McpServerConfig, SetupResult } from '../types';
import { sanitizeServerName } from '../utils/validation';
/**
* Checks if the Claude CLI is available in PATH
*/
async function isClaudeCliAvailable(): Promise<boolean> {
return new Promise((resolve) => {
const process = spawn('claude', ['--version'], {
stdio: 'pipe',
shell: true
});
process.on('close', (code) => {
resolve(code === 0);
});
process.on('error', () => {
resolve(false);
});
});
}
/**
* Executes the claude mcp add command
*/
async function executeClaudeMcpAdd(
serverName: string,
url: string,
transport: 'http' | 'sse' = 'http'
): Promise<{ success: boolean; output: string; error?: string }> {
return new Promise((resolve) => {
const args = ['mcp', 'add', '--transport', transport, serverName, url];
const process = spawn('claude', args, {
stdio: 'pipe',
shell: true
});
let stdout = '';
let stderr = '';
process.stdout?.on('data', (data) => {
stdout += data.toString();
});
process.stderr?.on('data', (data) => {
stderr += data.toString();
});
process.on('close', (code) => {
if (code === 0) {
resolve({ success: true, output: stdout });
} else {
resolve({ success: false, output: stdout, error: stderr || 'Command failed' });
}
});
process.on('error', (error) => {
resolve({ success: false, output: '', error: error.message });
});
});
}
/**
* Sets up Cequence MCP server configuration for Claude Code
*/
export async function setupClaudeCode(
config: McpServerConfig,
transport: 'http' | 'sse' = 'http'
): Promise<SetupResult> {
try {
// Check if Claude CLI is available
const cliAvailable = await isClaudeCliAvailable();
if (!cliAvailable) {
return {
success: false,
message: 'Claude CLI is not installed or not in PATH. Please install Claude Code first: https://claude.ai/code'
};
}
// Sanitize the server name for use as an identifier
const serverName = sanitizeServerName(config.name).toLowerCase().replace(/\s+/g, '-');
// Execute the claude mcp add command
const result = await executeClaudeMcpAdd(serverName, config.url, transport);
if (result.success) {
return {
success: true,
message: `Cequence MCP server "${config.name}" configured successfully for Claude Code using ${transport.toUpperCase()} transport`
};
} else {
return {
success: false,
message: `Failed to configure Cequence MCP server for Claude Code: ${result.error || 'Unknown error'}`
};
}
} catch (error) {
return {
success: false,
message: `Failed to configure Cequence MCP server for Claude Code: ${error instanceof Error ? error.message : String(error)}`
};
}
}