mod inspect_tool_calls;
mod inspect_usage_stats;
pub mod usage_tracker;
pub use inspect_tool_calls::InspectToolCallsTool;
pub use inspect_usage_stats::InspectUsageStatsTool;
pub async fn start_server(
addr: std::net::SocketAddr,
tls_cert: Option<std::path::PathBuf>,
tls_key: Option<std::path::PathBuf>,
) -> anyhow::Result<kodegen_server_http::ServerHandle> {
let listener = tokio::net::TcpListener::bind(addr).await
.map_err(|e| anyhow::anyhow!("Failed to bind to {}: {}", addr, e))?;
let tls_config = match (tls_cert, tls_key) {
(Some(cert), Some(key)) => Some((cert, key)),
_ => None,
};
start_server_with_listener(listener, tls_config).await
}
pub async fn start_server_with_listener(
listener: tokio::net::TcpListener,
tls_config: Option<(std::path::PathBuf, std::path::PathBuf)>,
) -> anyhow::Result<kodegen_server_http::ServerHandle> {
use kodegen_server_http::{ServerBuilder, Managers, RouterSet, register_tool};
use rmcp::handler::server::router::{prompt::PromptRouter, tool::ToolRouter};
let mut builder = ServerBuilder::new()
.category(kodegen_config::CATEGORY_INTROSPECTION)
.register_tools(|| async {
let mut tool_router = ToolRouter::new();
let mut prompt_router = PromptRouter::new();
let managers = Managers::new();
(tool_router, prompt_router) = register_tool(
tool_router,
prompt_router,
crate::InspectUsageStatsTool::new(),
);
(tool_router, prompt_router) = register_tool(
tool_router,
prompt_router,
crate::InspectToolCallsTool::new(),
);
Ok(RouterSet::new(tool_router, prompt_router, managers))
})
.with_listener(listener);
if let Some((cert, key)) = tls_config {
builder = builder.with_tls_config(cert, key);
}
builder.serve().await
}