run_code_rmcp 0.2.8

云函数服务,执行JS/TS/Python语言代码,脚本必须有约定的函数名称(handler/main),会调用约定的函数名称结果和日志返回.
Documentation
// 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');