pub struct McpAdapter;
#[async_trait]
impl ProtocolAdapter for McpAdapter {
type Request = JsonRpcRequest;
type Response = JsonRpcResponse;
fn decode(&self, raw: &[u8]) -> Result<UnifiedRequest, ProtocolError> {
let json_rpc: JsonRpcRequest = serde_json::from_slice(raw)?;
let method = json_rpc.method.clone();
let params = json_rpc.params.clone();
let operation = match method.as_str() {
"analyze_complexity" => {
let p = serde_json::from_value(params.clone())?;
Operation::AnalyzeComplexity(p)
}
"analyze_satd" => {
let p = serde_json::from_value(params.clone())?;
Operation::AnalyzeSatd(p)
}
"analyze_dead_code" => {
let p = serde_json::from_value(params.clone())?;
Operation::AnalyzeDeadCode(p)
}
"generate_context" => {
let p = serde_json::from_value(params.clone())?;
Operation::GenerateContext(p)
}
"quality_gate" => {
let p = serde_json::from_value(params.clone())?;
Operation::QualityGate(p)
}
"quality_proxy" => {
let p = serde_json::from_value(params.clone())?;
Operation::QualityProxy(p)
}
"refactor_start" => {
let p = serde_json::from_value(params.clone())?;
Operation::RefactorStart(p)
}
"refactor_next" => {
let p = serde_json::from_value(params.clone())?;
Operation::RefactorNext(p)
}
"refactor_stop" => {
let p = serde_json::from_value(params.clone())?;
Operation::RefactorStop(p)
}
"scaffold_project" => {
let p = serde_json::from_value(params.clone())?;
Operation::ScaffoldProject(p)
}
"scaffold_agent" => {
let p = serde_json::from_value(params.clone())?;
Operation::ScaffoldAgent(p)
}
"pdmt_todos" => {
let p = serde_json::from_value(params.clone())?;
Operation::PdmtTodos(p)
}
_ => return Err(ProtocolError::UnknownMethod(method)),
};
Ok(UnifiedRequest {
operation,
params,
context: RequestContext::from_json_rpc(&json_rpc),
})
}
fn encode(&self, response: UnifiedResponse) -> Result<Vec<u8>, ProtocolError> {
let json_rpc = JsonRpcResponse {
jsonrpc: "2.0".to_string(),
result: response.result,
error: response.error.map(Into::into),
id: response.metadata.request_id.into(),
};
Ok(serde_json::to_vec(&json_rpc)?)
}
async fn handle(&self, request: Self::Request) -> Self::Response {
JsonRpcResponse {
jsonrpc: "2.0".to_string(),
result: Some(serde_json::json!({"status": "ok"})),
error: None,
id: request.id,
}
}
}