Expand description
§mcpr-proxy
Proxy engine for mcpr: request routing, upstream forwarding, SSE streaming, and widget CSP rewriting.
This crate sits between MCP clients and upstream MCP servers. It classifies requests, forwards them over HTTP, relays SSE streams, and rewrites widget CSP metadata on the way back.
§Responsibilities
-
Request routing (
router): Classify incoming HTTP requests into typed variants — MCP JSON-RPC POST, MCP SSE GET, widget HTML, widget assets, OAuth callbacks, or passthrough. -
Upstream forwarding (
forwarding): HTTP client with connection pooling, semaphore-based concurrency limiting, configurable timeouts, and header forwarding (auth, content-type, MCP session ID). -
SSE handling (
sse): Extract JSON from SSE-wrapped responses, re-wrap JSON as SSE, and split upstream URLs into (base, path) components. -
Widget CSP (
csp,rewrite): Declarative CSP config with per-directive modes and widget-scoped overrides.csp::effective_domainscomputes the final domain list for one directive;rewrite::rewrite_responseapplies that to every CSP array in a JSON-RPC response. -
Proxy state (
state): Shared runtime state tracking MCP upstream health, tunnel status, widget discovery, cloud sync, and request counters.
§Module layout
proxy/
├── router.rs ClassifiedRequest, classify()
├── forwarding.rs UpstreamClient, forward_request()
├── sse.rs SSE extract/wrap helpers
├── csp.rs CspConfig, DirectivePolicy, WidgetScoped, effective_domains
├── rewrite.rs RewriteConfig, rewrite_response()
└── state.rs ProxyState, ConnectionStatus, SharedProxyStateRe-exports§
pub use csp::CspConfig;pub use csp::Directive;pub use csp::DirectivePolicy;pub use csp::Mode;pub use csp::WidgetScoped;pub use csp::effective_domains;pub use csp::glob_match;pub use rewrite::RewriteConfig;pub use rewrite::rewrite_response;pub use state::ConnectionStatus;pub use state::ProxyState;pub use state::lock_state;