Skip to content

Commit 3cdc906

Browse files
committed
feat: Adding apollo-mcp-proxy crate and adding a set of proxy config values for it
1 parent d860e7e commit 3cdc906

File tree

11 files changed

+907
-173
lines changed

11 files changed

+907
-173
lines changed

Cargo.lock

Lines changed: 417 additions & 161 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ members = [
44
"crates/apollo-mcp-server",
55
"crates/apollo-mcp-registry",
66
"crates/apollo-schema-index",
7+
"crates/apollo-mcp-proxy",
78
]
89

910
[workspace.package]
@@ -13,6 +14,7 @@ version = "0.7.3"
1314
[workspace.dependencies]
1415
apollo-compiler = "1.27.0"
1516
apollo-federation = "2.1.3"
17+
axum = "0.8.4"
1618
futures = { version = "0.3.31", features = ["thread-pool"] }
1719
insta = { version = "1.43.1", features = [
1820
"json",
@@ -25,6 +27,12 @@ reqwest = { version = "0.12.15", default-features = false, features = [
2527
"json",
2628
"native-tls-vendored",
2729
] }
30+
rmcp = { version = "0.2", features = [
31+
"server",
32+
"transport-io",
33+
"transport-sse-server",
34+
"transport-streamable-http-server",
35+
] }
2836
rstest = "0.25.0"
2937
secrecy = { version = "0.10.3", features = ["serde"] }
3038
serde = { version = "1.0.219", features = ["derive"] }

crates/apollo-mcp-proxy/Cargo.toml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
[package]
2+
name = "apollo-mcp-proxy"
3+
edition = "2024"
4+
authors.workspace = true
5+
version.workspace = true
6+
7+
[dependencies]
8+
axum.workspace = true
9+
clap = { version = "4.5.40", features = ["derive"] }
10+
tokio.workspace = true
11+
rmcp = { workspace = true, features = [
12+
"client",
13+
"reqwest",
14+
"transport-streamable-http-client",
15+
]}
16+
tracing.workspace = true
17+
tracing-appender = "0.2.3"
18+
tracing-subscriber.workspace = true
19+
20+
[lints]
21+
workspace = true
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use crate::server::ProxyServer;
2+
use rmcp::transport::stdio;
3+
use rmcp::{
4+
ServiceExt,
5+
model::{ClientCapabilities, ClientInfo, Implementation},
6+
transport::StreamableHttpClientTransport,
7+
};
8+
use std::error::Error;
9+
use tracing::{debug, error, info};
10+
11+
pub async fn start_proxy_client(url: &str) -> Result<(), Box<dyn Error>> {
12+
let transport = StreamableHttpClientTransport::from_uri(url);
13+
let client_info = ClientInfo {
14+
protocol_version: Default::default(),
15+
capabilities: ClientCapabilities::default(),
16+
client_info: Implementation {
17+
name: "mcp remote rust client".to_string(),
18+
version: env!("CARGO_PKG_VERSION").to_string(),
19+
},
20+
};
21+
22+
let client = match client_info.serve(transport).await.inspect_err(|e| {
23+
error!("[Proxy] client error: {:?}", e);
24+
}) {
25+
Ok(client) => client,
26+
Err(e) => {
27+
error!("[Proxy] client startup error: {:?}", e);
28+
return Err(e.into());
29+
}
30+
};
31+
32+
let server_info = client.peer_info();
33+
info!("[Proxy] Connected to server");
34+
debug!("{server_info:#?}");
35+
36+
let proxy_server = ProxyServer::new(client.peer().clone(), client.peer_info());
37+
let stdio_transport = stdio();
38+
let server = proxy_server.serve(stdio_transport).await?;
39+
40+
server.waiting().await?;
41+
Ok(())
42+
}

crates/apollo-mcp-proxy/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub mod client;
2+
3+
pub mod server;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use clap::Parser;
2+
use apollo_mcp_proxy::client::start_proxy_client;
3+
use std::error::Error;
4+
use tracing_appender::rolling::{RollingFileAppender, Rotation};
5+
use tracing_subscriber::layer::SubscriberExt;
6+
use tracing_subscriber::util::SubscriberInitExt;
7+
8+
#[derive(Parser)]
9+
struct Args {
10+
#[arg(short, long)]
11+
url: String,
12+
}
13+
14+
#[tokio::main]
15+
async fn main() -> Result<(), Box<dyn Error>> {
16+
// Initialize logging
17+
let file_appender = RollingFileAppender::builder()
18+
.rotation(Rotation::NEVER)
19+
.filename_prefix("apollo_mcp_proxy")
20+
.filename_suffix("log")
21+
.build("./logs")?;
22+
23+
let (non_blocking_writer, _guard) = tracing_appender::non_blocking(file_appender);
24+
25+
tracing_subscriber::registry()
26+
.with(tracing_subscriber::fmt::layer().with_writer(non_blocking_writer))
27+
.init();
28+
29+
let args = Args::parse();
30+
31+
let _ = start_proxy_client(&args.url).await;
32+
33+
Ok(())
34+
}

0 commit comments

Comments
 (0)