javascript
#!/usr/bin/env node
const http = require('http');
const PORT = 8743;
const HOST = 'localhost';
// JSON-RPC message handling
function readMessages() {
let buffer = '';
process.stdin.on('data', (chunk) => {
buffer += chunk.toString();
// Process complete messages
let newlineIndex;
while ((newlineIndex = buffer.indexOf('\n')) !== -1) {
const message = buffer.slice(0, newlineIndex);
buffer = buffer.slice(newlineIndex + 1);
if (message.trim()) {
handleMessage(message);
}
}
});
}
function handleMessage(message) {
try {
const request = JSON.parse(message);
// Forward to AltoIndex HTTP server
const options = {
hostname: HOST,
port: PORT,
path: '/',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(message)
}
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
// Send response back to Claude Desktop
if (data.trim()) {
process.stdout.write(data.trim() + '\n');
} else {
sendError(request.id, -32603, 'Empty response from server');
}
});
});
req.on('error', (error) => {
sendError(request.id, -32603, `Could not connect to AltoIndex. Make sure AltoIndex is running with MCP server started on port ${PORT}.`);
});
req.write(message);
req.end();
} catch (error) {
sendError(null, -32700, 'Parse error: ' + error.message);
}
}
function sendError(id, code, message) {
const errorResponse = {
jsonrpc: '2.0',
id: id || null,
error: {
code: code,
message: message
}
};
process.stdout.write(JSON.stringify(errorResponse) + '\n');
}
// Handle process termination gracefully
process.on('SIGINT', () => {
process.exit(0);
});
process.on('SIGTERM', () => {
process.exit(0);
});
// Start reading messages
readMessages();