feat(mcp): add --host flag for MCP HTTP transport bind address (#254)
Add a --host CLI flag to 'obscura mcp --http' so the server can bind to addresses other than 127.0.0.1 (e.g. 0.0.0.0 for Docker Compose sidecar deployments). The default remains 127.0.0.1 for security. Closes #253
This commit is contained in:
1 parent
94bd2cce42
commit
6edf111753
3 files changed
+9
-6
No files matched your search
@@ -150,6 +150,9 @@ enum Command {
|
|||||||
#[arg(long)]
|
#[arg(long)]
|
||||||
http: bool,
|
http: bool,
|
||||||
|
|
||||||
|
#[arg(long, default_value = "127.0.0.1")]
|
||||||
|
host: String,
|
||||||
|
|
||||||
#[arg(long, default_value_t = 3000)]
|
#[arg(long, default_value_t = 3000)]
|
||||||
port: u16,
|
port: u16,
|
||||||
|
|
||||||
@@ -318,10 +321,10 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
Some(Command::Scrape { urls, eval, concurrency, format, timeout, quiet }) => {
|
Some(Command::Scrape { urls, eval, concurrency, format, timeout, quiet }) => {
|
||||||
run_parallel_scrape(urls, eval, concurrency.get(), &format, timeout, quiet, global_proxy).await?;
|
run_parallel_scrape(urls, eval, concurrency.get(), &format, timeout, quiet, global_proxy).await?;
|
||||||
}
|
}
|
||||||
Some(Command::Mcp { http, port, proxy, user_agent, stealth }) => {
|
Some(Command::Mcp { http, host, port, proxy, user_agent, stealth }) => {
|
||||||
let mcp_proxy = merge_proxy(global_proxy.clone(), proxy);
|
let mcp_proxy = merge_proxy(global_proxy.clone(), proxy);
|
||||||
if http {
|
if http {
|
||||||
obscura_mcp::http::run(port, mcp_proxy, user_agent, stealth).await?;
|
obscura_mcp::http::run(host, port, mcp_proxy, user_agent, stealth).await?;
|
||||||
} else {
|
} else {
|
||||||
obscura_mcp::run(mcp_proxy, user_agent, stealth).await?;
|
obscura_mcp::run(mcp_proxy, user_agent, stealth).await?;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,10 +10,10 @@ use crate::{dispatch, BrowserState};
|
|||||||
/// Connections are handled sequentially on the current thread — the browser
|
/// Connections are handled sequentially on the current thread — the browser
|
||||||
/// session (including the V8 runtime) is single-threaded and `!Send`, so we
|
/// session (including the V8 runtime) is single-threaded and `!Send`, so we
|
||||||
/// never need to move state across threads.
|
/// never need to move state across threads.
|
||||||
pub async fn run(port: u16, proxy: Option<String>, user_agent: Option<String>, stealth: bool) -> Result<()> {
|
pub async fn run(host: String, port: u16, proxy: Option<String>, user_agent: Option<String>, stealth: bool) -> Result<()> {
|
||||||
let addr = std::net::SocketAddr::from(([127, 0, 0, 1], port));
|
let addr: std::net::SocketAddr = format!("{}:{}", host, port).parse()?;
|
||||||
let listener = TcpListener::bind(&addr).await?;
|
let listener = TcpListener::bind(&addr).await?;
|
||||||
tracing::info!("MCP HTTP server on http://127.0.0.1:{}/mcp", port);
|
tracing::info!("MCP HTTP server on http://{}:{}/mcp", host, port);
|
||||||
|
|
||||||
let mut state = BrowserState::new(proxy, user_agent, stealth);
|
let mut state = BrowserState::new(proxy, user_agent, stealth);
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ async fn options_preflight_lists_required_browser_headers() {
|
|||||||
// end of the test. `current_thread` + LocalSet is required because the
|
// end of the test. `current_thread` + LocalSet is required because the
|
||||||
// browser state is `!Send` (Page holds V8 handles).
|
// browser state is `!Send` (Page holds V8 handles).
|
||||||
let server = local.spawn_local(async move {
|
let server = local.spawn_local(async move {
|
||||||
let _ = obscura_mcp::http::run(port, None, None, false).await;
|
let _ = obscura_mcp::http::run("127.0.0.1".to_string(), port, None, None, false).await;
|
||||||
});
|
});
|
||||||
|
|
||||||
local.run_until(async {
|
local.run_until(async {
|
||||||
|
|||||||
Reference in new issue
Block a user