library_mode/
library-mode.rs1use anyhow::Result;
16use axum::routing::get;
17use axum::{Json, Router};
18use clap::Parser;
19use std::path::PathBuf;
20
21#[derive(Parser)]
22#[command(name = "library-mode-example")]
23struct Cli {
24 #[arg(short, long, default_value = "proxy.toml")]
25 config: PathBuf,
26}
27
28#[tokio::main]
29async fn main() -> Result<()> {
30 tracing_subscriber::fmt()
31 .with_env_filter("tower_mcp=info,mcp_proxy=info")
32 .init();
33
34 let cli = Cli::parse();
35
36 let mut config = mcp_proxy::ProxyConfig::load(&cli.config)?;
38 config.resolve_env_vars();
39
40 let addr = format!("{}:{}", config.proxy.listen.host, config.proxy.listen.port);
41
42 let proxy = mcp_proxy::Proxy::from_config(config).await?;
44
45 let (proxy_router, _session_handle) = proxy.into_router();
47
48 let app_routes = Router::new().route("/app/status", get(app_status));
50
51 let app = proxy_router.merge(app_routes);
53
54 tracing::info!(listen = %addr, "Library mode example ready");
55
56 let listener = tokio::net::TcpListener::bind(&addr).await?;
57 axum::serve(listener, app).await?;
58
59 Ok(())
60}
61
62async fn app_status() -> Json<serde_json::Value> {
63 Json(serde_json::json!({
64 "app": "my-application",
65 "status": "running",
66 }))
67}