frappe-mcp-server
Version:
Enhanced Model Context Protocol server for Frappe Framework with comprehensive API instructions and helper tools
98 lines (88 loc) • 2.63 kB
JavaScript
import { spawn } from 'child_process';
import { createInterface } from 'readline';
// Start the MCP server as a child process
const server = spawn('node', ['build/index.js'], {
env: {
...process.env,
FRAPPE_URL: process.env.FRAPPE_URL || 'http://localhost:8000',
FRAPPE_API_KEY: process.env.FRAPPE_API_KEY,
FRAPPE_API_SECRET: process.env.FRAPPE_API_SECRET,
},
stdio: ['pipe', 'pipe', process.stderr],
});
// Create readline interface for user input
const rl = createInterface({
input: process.stdin,
output: process.stdout,
prompt: 'MCP Test> ',
});
// Handle server output
server.stdout.on('data', (data) => {
try {
const response = JSON.parse(data.toString());
console.log('\nServer Response:');
console.log(JSON.stringify(response, null, 2));
rl.prompt();
} catch (error) {
console.error('\nError parsing server response:', error);
console.log('Raw response:', data.toString());
rl.prompt();
}
});
// Handle server errors
server.on('error', (error) => {
console.error('Server error:', error);
rl.close();
process.exit(1);
});
// Handle server exit
server.on('exit', (code) => {
console.log(`Server exited with code ${code}`);
rl.close();
process.exit(code);
});
// Print instructions
console.log('Frappe MCP Server Test Client');
console.log('----------------------------');
console.log('Enter JSON requests to send to the server.');
console.log('Example: { "jsonrpc": "2.0", "id": "1", "method": "tools/list", "params": {} }');
console.log('Type "exit" to quit.');
console.log('');
// Handle user input
rl.prompt();
rl.on('line', (line) => {
const input = line.trim();
if (input.toLowerCase() === 'exit') {
console.log('Exiting...');
server.kill();
rl.close();
process.exit(0);
}
try {
// Parse the JSON request from input
const userRequest = JSON.parse(input);
// Construct a JSON-RPC 2.0 request
const request = {
jsonrpc: "2.0",
id: String(Date.now()), // Use timestamp as request ID
method: userRequest.method, // Extract method from user input
params: userRequest.params || {} // Extract params or default to empty object
};
server.stdin.write(JSON.stringify(request) + '\n');
} catch (error) {
console.error('Error parsing input:', error.message);
rl.prompt();
}
}).on('close', () => {
console.log('Test client closed');
server.kill();
process.exit(0);
});
// Handle process termination
process.on('SIGINT', () => {
console.log('\nReceived SIGINT. Shutting down...');
server.kill();
rl.close();
process.exit(0);
});