codex-cli-architect-mcp
Version:
MCP server for OpenAI Codex CLI - Enable AI-powered coding assistance through Model Context Protocol
79 lines • 2.64 kB
JavaScript
import { spawn } from 'node:child_process';
import { EXECUTION_TIMEOUT, OPENAI_API_KEY } from '../constants.js';
import logger from './logger.js';
export async function executeCodexCommand(prompt, options = {}) {
const { model, timeout = EXECUTION_TIMEOUT } = options;
// Build command arguments
const args = ['exec'];
if (model) {
args.push('--model', model);
}
// Use read-only sandbox for MCP to only allow reading files
args.push('--sandbox', 'read-only');
// Run in full auto mode to prevent interactive prompts
args.push('--full-auto');
// Add the prompt as the last argument
args.push(prompt);
logger.info('Executing Codex command', {
model,
prompt: `${prompt.substring(0, 100)}...`,
usingApiKey: !!OPENAI_API_KEY,
});
return new Promise((resolve) => {
let output = '';
let errorOutput = '';
let timedOut = false;
// Prepare environment variables
const env = { ...process.env };
if (OPENAI_API_KEY) {
env.OPENAI_API_KEY = OPENAI_API_KEY;
}
const codexProcess = spawn('codex', args, {
env,
});
const timeoutId = setTimeout(() => {
timedOut = true;
codexProcess.kill('SIGTERM');
}, timeout);
codexProcess.stdout.on('data', (data) => {
output += data.toString();
});
codexProcess.stderr.on('data', (data) => {
errorOutput += data.toString();
});
codexProcess.on('close', (code) => {
clearTimeout(timeoutId);
if (timedOut) {
resolve({
success: false,
error: 'Command execution timed out',
output: output.trim(),
});
return;
}
if (code !== 0) {
resolve({
success: false,
error: errorOutput.trim() || 'Codex command failed',
output: output.trim(),
exitCode: code || undefined,
});
return;
}
resolve({
success: true,
output: output.trim(),
exitCode: 0,
});
});
codexProcess.on('error', (error) => {
clearTimeout(timeoutId);
logger.error('Codex process error:', error);
resolve({
success: false,
error: error.message,
});
});
});
}
//# sourceMappingURL=codexExecutor.js.map