mcp-prompt-optimizer
Version:
Local MCP server for AI-Enhanced Prompt Optimizer API with context awareness and parameter preservation
205 lines (177 loc) ⢠6.16 kB
JavaScript
const MCPServer = require('./lib/mcp-protocol');
const Config = require('./lib/config');
const path = require('path');
async function setup() {
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
return new Promise((resolve) => {
console.log('š§ MCP Prompt Optimizer Setup');
console.log('Get your API key from: https://promptoptimizer-blog.vercel.app/dashboard\n');
rl.question('Enter your API key: ', (apiKey) => {
if (!apiKey || !apiKey.startsWith('sk-opt-')) {
console.error('ā Invalid API key format. Must start with "sk-opt-"');
process.exit(1);
}
const config = new Config();
if (config.setApiKey(apiKey)) {
console.log('ā
API key saved successfully');
console.log('\nš Add this to your Claude Desktop config:');
console.log('File location: ~/.claude/claude_desktop_config.json');
console.log(JSON.stringify({
"mcpServers": {
"prompt-optimizer": {
"command": "npx",
"args": ["mcp-prompt-optimizer"]
}
}
}, null, 2));
console.log('\nš Or for Cursor:');
console.log('File location: ~/.cursor/mcp.json');
console.log(JSON.stringify({
"mcpServers": {
"prompt-optimizer": {
"command": "npx",
"args": ["mcp-prompt-optimizer"]
}
}
}, null, 2));
console.log('\nš Or for Windsurf:');
console.log('Add via Windsurf settings or config file');
console.log(JSON.stringify({
"mcpServers": {
"prompt-optimizer": {
"command": "npx",
"args": ["mcp-prompt-optimizer"]
}
}
}, null, 2));
console.log('\nš Setup complete! Restart your MCP client to use the tool.');
console.log('š” Run "mcp-prompt-optimizer" to test the server manually.');
} else {
console.error('ā Failed to save configuration');
process.exit(1);
}
rl.close();
resolve();
});
});
}
async function startServer() {
const config = new Config();
const apiKey = config.getApiKey();
if (!apiKey) {
console.error('ā No API key found. Run: mcp-prompt-optimizer --setup');
process.exit(1);
}
const server = new MCPServer(apiKey);
if (!(await server.initialize())) {
console.error('š” If your API key is invalid, run: mcp-prompt-optimizer --setup');
process.exit(1);
}
// Handle STDIO communication (MCP protocol)
process.stdin.setEncoding('utf8');
let buffer = '';
process.stdin.on('data', async (chunk) => {
buffer += chunk;
// Process complete lines (JSON-RPC messages)
let lines = buffer.split('\n');
buffer = lines.pop(); // Keep incomplete line in buffer
for (const line of lines) {
if (line.trim()) {
try {
const message = JSON.parse(line);
const response = await server.handleMessage(message);
process.stdout.write(JSON.stringify(response) + '\n');
} catch (error) {
console.error('Protocol error:', error.message);
// Send proper JSON-RPC error response
const errorResponse = {
jsonrpc: "2.0",
id: null,
error: {
code: -32700,
message: 'Parse error'
}
};
process.stdout.write(JSON.stringify(errorResponse) + '\n');
}
}
}
});
process.stdin.on('end', () => {
console.error('š” MCP connection closed');
process.exit(0);
});
process.on('SIGINT', () => {
console.error('\nš MCP server shutting down...');
process.exit(0);
});
process.on('SIGTERM', () => {
console.error('\nš MCP server shutting down...');
process.exit(0);
});
console.error('š MCP Prompt Optimizer Server running...');
console.error('š” Use Ctrl+C to stop the server');
}
async function showHelp() {
console.log('MCP Prompt Optimizer - Local server for prompt optimization');
console.log('');
console.log('Usage:');
console.log(' mcp-prompt-optimizer Start the MCP server');
console.log(' mcp-prompt-optimizer --setup Configure API key');
console.log(' mcp-prompt-optimizer --help Show this help');
console.log(' mcp-prompt-optimizer --version Show version');
console.log('');
console.log('Configuration:');
console.log(' Config file: ~/.prompt-optimizer/config.json');
console.log(' API keys: Get from https://promptoptimizer-blog.vercel.app/dashboard');
console.log('');
console.log('Supported MCP clients:');
console.log(' - Claude Desktop');
console.log(' - Cursor IDE');
console.log(' - Windsurf IDE');
}
async function showVersion() {
try {
// Try multiple paths to find package.json when installed globally
let packageJson;
const possiblePaths = [
path.join(__dirname, 'package.json'), // Local development
path.join(__dirname, '..', 'package.json'), // When run from bin/
path.join(process.cwd(), 'package.json'), // Current directory
];
for (const packagePath of possiblePaths) {
try {
packageJson = require(packagePath);
break;
} catch (e) {
continue;
}
}
if (packageJson && packageJson.version) {
console.log(`mcp-prompt-optimizer v${packageJson.version}`);
} else {
console.log('mcp-prompt-optimizer v1.0.2 (version detection failed)');
}
} catch (error) {
console.log('mcp-prompt-optimizer v1.0.2 (version detection failed)');
}
}
// Main execution
if (require.main === module) {
const args = process.argv.slice(2);
if (args.includes('--setup')) {
setup();
} else if (args.includes('--help') || args.includes('-h')) {
showHelp();
} else if (args.includes('--version') || args.includes('-v')) {
showVersion();
} else {
startServer();
}
}
module.exports = MCPServer;