@knath2000/codebase-indexing-mcp
Version:
MCP server for codebase indexing with Voyage AI embeddings and Qdrant vector storage
90 lines (76 loc) • 2.19 kB
text/typescript
import axios from 'axios';
const RAILWAY_URL = 'https://codebase-indexing-production.up.railway.app';
interface JsonRpcRequest {
jsonrpc: string;
id: number | string;
method: string;
params?: any;
}
interface JsonRpcResponse {
jsonrpc: string;
id: number | string;
result?: any;
error?: any;
}
class RailwayMcpClient {
private async forwardRequest(request: JsonRpcRequest): Promise<JsonRpcResponse> {
try {
const response = await axios.post(`${RAILWAY_URL}/mcp`, request, {
headers: {
'Content-Type': 'application/json'
},
timeout: 30000
});
return response.data;
} catch (error: any) {
return {
jsonrpc: '2.0',
id: request.id,
error: {
code: -32000,
message: error.message || 'Connection failed'
}
};
}
}
async start() {
// Set up stdin/stdout communication for MCP
process.stdin.setEncoding('utf8');
let buffer = '';
process.stdin.on('data', async (chunk: string) => {
buffer += chunk;
// Process complete JSON-RPC messages (one per line)
const lines = buffer.split('\n');
buffer = lines.pop() || '';
for (const line of lines) {
if (line.trim()) {
try {
const request: JsonRpcRequest = JSON.parse(line);
const response = await this.forwardRequest(request);
process.stdout.write(JSON.stringify(response) + '\n');
} catch (error) {
const errorResponse: JsonRpcResponse = {
jsonrpc: '2.0',
id: 0,
error: {
code: -32700,
message: 'Parse error'
}
};
process.stdout.write(JSON.stringify(errorResponse) + '\n');
}
}
}
});
process.stdin.on('end', () => {
process.exit(0);
});
// Handle process termination
process.on('SIGINT', () => process.exit(0));
process.on('SIGTERM', () => process.exit(0));
}
}
// Start the client
const client = new RailwayMcpClient();
client.start().catch(console.error);