Files
qiming/qiming-run_code_rmcp/examples/mcp_client.js
2026-06-01 13:43:09 +08:00

151 lines
4.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// MCP客户端示例用于与script_runner交互
// 使用方法node mcp_client.js
const { spawn } = require('node:child_process');
const readline = require('node:readline');
// 启动script_runner进程
const scriptRunner = spawn('script_runner', ['--verbose']);
// 创建读取标准输入的接口
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 处理script_runner的输出
scriptRunner.stdout.on('data', (data) => {
console.log(`接收到MCP服务器响应: ${data}`);
try {
const response = JSON.parse(data);
console.log('解析后的响应:', JSON.stringify(response, null, 2));
} catch (e) {
console.log('无法解析为JSON显示原始输出');
}
});
// 处理script_runner的错误
scriptRunner.stderr.on('data', (data) => {
console.error(`MCP服务器错误: ${data}`);
});
// 处理script_runner进程结束
scriptRunner.on('close', (code) => {
console.log(`MCP服务器进程退出退出码: ${code}`);
rl.close();
});
// 初始化MCP连接
const initializeRequest = {
jsonrpc: '2.0',
id: 1,
method: 'initialize',
params: {
client_info: {
name: 'mcp_client_example'
}
}
};
// 发送初始化请求
console.log('发送初始化请求...');
scriptRunner.stdin.write(JSON.stringify(initializeRequest) + '\n');
// 等待初始化响应后,发送工具列表请求
setTimeout(() => {
const listToolsRequest = {
jsonrpc: '2.0',
id: 2,
method: 'listTools'
};
console.log('发送工具列表请求...');
scriptRunner.stdin.write(JSON.stringify(listToolsRequest) + '\n');
}, 1000);
// 等待工具列表响应后执行JavaScript代码
setTimeout(() => {
const callToolRequest = {
jsonrpc: '2.0',
id: 3,
method: 'callTool',
params: {
name: 'run_javascript',
arguments: {
code: 'console.log("Hello from JavaScript!"); return { message: "Hello, World!", value: 42 };'
}
}
};
console.log('发送JavaScript代码执行请求...');
scriptRunner.stdin.write(JSON.stringify(callToolRequest) + '\n');
}, 2000);
// 等待JavaScript执行响应后执行TypeScript代码
setTimeout(() => {
const callToolRequest = {
jsonrpc: '2.0',
id: 4,
method: 'callTool',
params: {
name: 'run_typescript',
arguments: {
code: 'const greeting: string = "Hello from TypeScript!"; console.log(greeting); return { message: greeting, timestamp: new Date().toISOString() };'
}
}
};
console.log('发送TypeScript代码执行请求...');
scriptRunner.stdin.write(JSON.stringify(callToolRequest) + '\n');
}, 3000);
// 等待TypeScript执行响应后执行Python代码
setTimeout(() => {
const callToolRequest = {
jsonrpc: '2.0',
id: 5,
method: 'callTool',
params: {
name: 'run_python',
arguments: {
code: 'import math\nprint("Hello from Python!")\nresult = math.sqrt(16)\nprint(f"Square root of 16 is {result}")\n{"message": "Hello from Python", "result": result}'
}
}
};
console.log('发送Python代码执行请求...');
scriptRunner.stdin.write(JSON.stringify(callToolRequest) + '\n');
}, 4000);
// 处理用户输入,允许用户发送自定义请求
rl.on('line', (input) => {
if (input.toLowerCase() === 'exit') {
console.log('退出程序...');
scriptRunner.kill();
rl.close();
return;
}
try {
// 尝试解析用户输入为JSON
const request = JSON.parse(input);
console.log('发送自定义请求:', JSON.stringify(request, null, 2));
scriptRunner.stdin.write(JSON.stringify(request) + '\n');
} catch (e) {
console.error('输入不是有效的JSON:', e.message);
}
});
// 显示帮助信息
console.log('\n=== MCP客户端示例 ===');
console.log('已自动发送初始化、工具列表和代码执行请求');
console.log('您可以输入自定义JSON请求或输入"exit"退出程序');
console.log('示例请求:');
console.log(JSON.stringify({
jsonrpc: '2.0',
id: 100,
method: 'callTool',
params: {
name: 'run_javascript',
arguments: {
code: 'return "Hello, " + new Date().toISOString();'
}
}
}, null, 2));
console.log('====================\n');