use std::io::{BufRead, Write};
fn slice_after<'a>(s: &'a str, key: &str) -> Option<&'a str> {
s.find(key).map(|i| &s[i + key.len()..])
}
fn extract_id(line: &str) -> String {
match slice_after(line, "\"id\":") {
Some(rest) => rest
.split([',', '}'])
.next()
.unwrap_or("null")
.trim()
.to_string(),
None => "null".to_string(),
}
}
fn extract_text(line: &str) -> String {
match slice_after(line, "\"text\":\"") {
Some(rest) => rest.split('"').next().unwrap_or("").to_string(),
None => String::new(),
}
}
fn main() {
let stdin = std::io::stdin();
let mut stdout = std::io::stdout();
for line in stdin.lock().lines() {
let Ok(line) = line else { break };
if line.trim().is_empty() {
continue;
}
let id = extract_id(&line);
let resp = if line.contains("\"method\":\"initialize\"") {
format!(
"{{\"jsonrpc\":\"2.0\",\"id\":{id},\"result\":{{\"protocolVersion\":\"2025-06-18\",\"capabilities\":{{}},\"serverInfo\":{{\"name\":\"echo-stub\",\"version\":\"0.1.0\"}}}}}}"
)
} else if line.contains("\"method\":\"tools/call\"") {
let text = extract_text(&line);
let peer = std::env::var("MCPMESH_PEER_NAME").unwrap_or_default();
let user = std::env::var("MCPMESH_PEER_USER").unwrap_or_default();
let groups = std::env::var("MCPMESH_PEER_GROUPS").unwrap_or_default();
format!(
"{{\"jsonrpc\":\"2.0\",\"id\":{id},\"result\":{{\"content\":[{{\"type\":\"text\",\"text\":\"{text}\"}}],\"peer_name\":\"{peer}\",\"peer_user\":\"{user}\",\"peer_groups\":\"{groups}\"}}}}"
)
} else {
continue;
};
if writeln!(stdout, "{resp}").is_err() || stdout.flush().is_err() {
break;
}
}
}