mcp_stdio_proxy/server/handlers/
run_code_handler.rs

1use std::collections::HashMap;
2
3use axum::{Json, response::IntoResponse};
4use http::StatusCode;
5use log::{debug, error, info};
6use run_code_rmcp::{CodeExecutor, LanguageScript, RunCodeHttpResult};
7use serde::{Deserialize, Serialize};
8use serde_json::Value;
9
10use crate::AppError;
11
12///代码运行请求
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct RunCodeMessageRequest {
15    //js运行参数
16    pub json_param: HashMap<String, Value>,
17    //运行的代码
18    pub code: String,
19    //前端生成的随机uid,用于查找websocket连接,发送执行过程中的log日志
20    pub uid: String,
21    pub engine_type: String,
22}
23
24impl RunCodeMessageRequest {
25    //获取语言脚本
26    pub fn get_language_script(&self) -> LanguageScript {
27        match self.engine_type.as_str() {
28            "js" => LanguageScript::Js,
29            "ts" => LanguageScript::Ts,
30            "python" => LanguageScript::Python,
31            _ => LanguageScript::Js,
32        }
33    }
34}
35
36/// 执行js/ts/python代码,通过 uv/deno 命令方式执行
37// #[axum::debug_handler]
38pub async fn run_code_handler(
39    Json(run_code_message_request): Json<RunCodeMessageRequest>,
40) -> Result<impl IntoResponse, AppError> {
41    //json_param: HashMap<String, Value> 转换为 json 对象 Value
42    let params = match serde_json::to_value(run_code_message_request.json_param.clone()) {
43        Ok(v) => v,
44        Err(e) => {
45            error!("run_code_handler参数序列化失败: {e:?}");
46            return Err(AppError::from(e));
47        }
48    };
49
50    //执行代码
51    let code = run_code_message_request.code.clone();
52    let language = run_code_message_request.get_language_script();
53
54    debug!("run_code_handler language:{language:?}");
55    debug!("run_code_handler code:{code:?}");
56    debug!("run_code_handler params:{params:?}");
57    let result = match CodeExecutor::execute_with_params(&code, language, Some(params), None).await
58    {
59        Ok(result) => result,
60        Err(e) => {
61            error!("run_code_handler执行失败: {e:?}");
62            return Err(AppError::from(e));
63        }
64    };
65
66    if !result.success {
67        let error_message = result
68            .error
69            .as_deref()
70            .unwrap_or("run_code_handler执行失败但未提供错误信息");
71        error!("run_code_handler执行返回失败: {error_message}");
72    }
73
74    let data = match serde_json::to_value(&result) {
75        Ok(data) => data,
76        Err(e) => {
77            error!("run_code_handler序列化结果失败: {e:?}");
78            return Err(AppError::from(e));
79        }
80    };
81    //打印结果
82    info!("run_code_handler result:{:?}", &result.success);
83    debug!("run_code_handler result:{:?}", &data);
84    //返回结果,使用 RunCodeHttpResult 封装执行结果
85    let run_code_http_result = RunCodeHttpResult {
86        data,
87        success: result.success,
88        error: result.error.clone(),
89    };
90    let body = serde_json::to_string(&run_code_http_result)?;
91    Ok((StatusCode::OK, body).into_response())
92}