[package]
name = "mcp-proxy"
version = "0.4.2"
edition = "2024"
rust-version = "1.90"
description = "Tower-native MCP gateway for aggregating backends with auth, resilience, and observability"
license = "MIT OR Apache-2.0"
repository = "https://github.com/joshrotenberg/mcp-proxy"
homepage = "https://github.com/joshrotenberg/mcp-proxy"
documentation = "https://docs.rs/mcp-proxy"
readme = "README.md"
keywords = ["mcp", "proxy", "tower", "json-rpc", "gateway"]
categories = ["network-programming", "command-line-utilities"]
[package.metadata.docs.rs]
all-features = true
[lib]
name = "mcp_proxy"
[[bin]]
name = "mcp-proxy"
path = "src/main.rs"
[features]
default = ["otel", "metrics", "oauth", "openapi", "websocket", "discovery", "yaml", "skills"]
otel = ["dep:opentelemetry", "dep:opentelemetry_sdk", "dep:opentelemetry-otlp", "dep:tracing-opentelemetry"]
metrics = ["dep:metrics", "dep:metrics-exporter-prometheus"]
oauth = ["tower-mcp/oauth", "tower-mcp/jwks", "dep:reqwest"]
openapi = ["dep:utoipa", "dep:utoipa-axum"]
websocket = ["dep:tokio-tungstenite", "dep:async-trait", "dep:futures-util"]
discovery = ["dep:jpx-engine"]
yaml = ["dep:serde_yaml"]
skills = []
redis-cache = ["dep:redis"]
sqlite-cache = ["dep:rusqlite"]
protocol-2026-07-28 = ["tower-mcp/protocol-2026-07-28"]
[dependencies]
tower-mcp = { version = "0.18.0", features = ["http", "http-client", "proxy"] }
tower-mcp-types = "0.18.0"
axum = "0.8"
tower = { version = "0.5", features = ["util", "timeout", "limit"] }
tower-resilience = { version = "0.10.1", default-features = false, features = ["circuitbreaker", "ratelimiter", "hedge", "retry"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
toml = "1"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
clap = { version = "4", features = ["derive"] }
anyhow = "1"
metrics = { version = "0.24.3", optional = true }
metrics-exporter-prometheus = { version = "0.18.1", optional = true }
opentelemetry = { version = "0.32", optional = true }
opentelemetry_sdk = { version = "0.32", features = ["rt-tokio"], optional = true }
opentelemetry-otlp = { version = "0.32", optional = true }
tracing-opentelemetry = { version = "0.33", optional = true }
chrono = { version = "0.4", features = ["serde"] }
schemars = "1"
moka = { version = "0.12.14", features = ["future"] }
notify = { version = "8", default-features = false, features = ["macos_fsevent"] }
glob-match = "0.2"
regex = "1"
notify-debouncer-mini = "0.7"
utoipa = { version = "5", features = ["chrono"], optional = true }
utoipa-axum = { version = "0.2", optional = true }
tokio-tungstenite = { version = "0.30", features = ["connect", "rustls-tls-webpki-roots"], optional = true }
async-trait = { version = "0.1", optional = true }
futures-util = { version = "0.3", optional = true }
jpx-engine = { version = "0.4.0", optional = true }
reqwest = { version = "0.13", features = ["json", "form"], optional = true }
serde_yaml = { version = "0.9", optional = true }
redis = { version = "1", features = ["tokio-comp"], optional = true }
rusqlite = { version = "0.40", features = ["bundled"], optional = true }
[dev-dependencies]
reqwest = { version = "0.13", features = ["json"] }
tokio-stream = "0.1"
tower-resilience-chaos = "0.10"
tower-mcp = { version = "0.18.0", features = ["http", "http-client", "proxy", "websocket"] }
futures-util = "0.3"
docker-wrapper = { version = "0.11.1", features = ["testing", "templates"] }
uuid = { version = "1", features = ["v4"] }
tempfile = "3"
criterion = { version = "0.8", features = ["async_tokio"] }
proptest = "1.11.0"
[[bench]]
name = "proxy_overhead"
harness = false
[profile.dist]
inherits = "release"
lto = "fat"
strip = true