Skip to content
This repository was archived by the owner on Jan 30, 2026. It is now read-only.

Commit 2e390a3

Browse files
author
luoshasha
committed
feat: add [--host] parameter for streamable-http mode.
1 parent 5ee2eea commit 2e390a3

3 files changed

Lines changed: 26 additions & 10 deletions

File tree

mcp_run_python/_cli.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ def cli_logic(args_list: Sequence[str] | None = None) -> int:
2020
description=f'mcp-run-python CLI v{__version__}\n\nMCP server for running untrusted Python code.\n',
2121
formatter_class=argparse.RawTextHelpFormatter,
2222
)
23-
23+
parser.add_argument('--host', type=str, default='127.0.0.1',
24+
help='Host to bind the HTTP server to (default: 127.0.0.1). Use 0.0.0.0 to bind to all interfaces, e.g. when using Docker.')
2425
parser.add_argument('--port', type=int, help='Port to run the server on, default 3001.')
2526
parser.add_argument('--deps', '--dependencies', help='Comma separated list of dependencies to install')
2627
parser.add_argument(
@@ -51,6 +52,7 @@ def cli_logic(args_list: Sequence[str] | None = None) -> int:
5152
args.mode.replace('-', '_'),
5253
allow_networking=not args.disable_networking,
5354
http_port=args.port,
55+
http_host=args.host,
5456
dependencies=deps,
5557
deps_log_handler=deps_log_handler,
5658
verbose=bool(args.verbose),

mcp_run_python/deno/src/main.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,13 @@ export async function main() {
3030
return
3131
} else if (args[0] === 'streamable_http') {
3232
const port = parseInt(flags.port)
33-
runStreamableHttp(port, deps, flags['return-mode'], false)
33+
const host = flags.host
34+
runStreamableHttp(port, host, deps, flags['return-mode'], false)
3435
return
3536
} else if (args[0] === 'streamable_http_stateless') {
3637
const port = parseInt(flags.port)
37-
runStreamableHttp(port, deps, flags['return-mode'], true)
38+
const host = flags.host
39+
runStreamableHttp(port, host, deps, flags['return-mode'], true)
3840
return
3941
} else if (args[0] === 'example') {
4042
await example(deps)
@@ -52,6 +54,7 @@ Usage: deno ... deno/main.ts [stdio|streamable_http|streamable_http_stateless|ex
5254
5355
options:
5456
--port <port> Port to run the HTTP server on (default: 3001)
57+
--host <host> Host to run the HTTP server on (default: 127.0.0.1)
5558
--deps <deps> Comma separated list of dependencies to install
5659
--return-mode <xml/json> Return mode for output data (default: xml)`,
5760
)
@@ -171,9 +174,9 @@ function httpSetJsonResponse(res: http.ServerResponse, status: number, text: str
171174
/*
172175
* Run the MCP server using the Streamable HTTP transport
173176
*/
174-
function runStreamableHttp(port: number, deps: string[], returnMode: string, stateless: boolean): void {
177+
function runStreamableHttp(port: number, host:string, deps: string[], returnMode: string, stateless: boolean): void {
175178
const server = (stateless ? createStatelessHttpServer : createStatefulHttpServer)(deps, returnMode)
176-
server.listen(port, () => {
179+
server.listen(port, host, () => {
177180
console.log(`Listening on port ${port}`)
178181
})
179182
}
@@ -353,4 +356,4 @@ const LogLevels: LoggingLevel[] = [
353356
'emergency',
354357
]
355358

356-
await main()
359+
await main()

mcp_run_python/main.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def run_mcp_server(
2323
mode: Mode,
2424
*,
2525
http_port: int | None = None,
26+
http_host: str | None = None,
2627
dependencies: list[str] | None = None,
2728
return_mode: Literal['json', 'xml'] = 'xml',
2829
deps_log_handler: LogHandler | None = None,
@@ -34,6 +35,7 @@ def run_mcp_server(
3435
Args:
3536
mode: The mode to run the server in.
3637
http_port: The port to run the server on if mode is `streamable_http`.
38+
http_host: The host to run the server on if mode is `streamable_http`.
3739
dependencies: The dependencies to install.
3840
return_mode: The mode to return tool results in.
3941
deps_log_handler: Optional function to receive logs emitted while installing dependencies.
@@ -49,6 +51,7 @@ def run_mcp_server(
4951
mode,
5052
dependencies=dependencies,
5153
http_port=http_port,
54+
http_host=http_host,
5255
return_mode=return_mode,
5356
deps_log_handler=deps_log_handler,
5457
allow_networking=allow_networking,
@@ -78,6 +81,7 @@ def prepare_deno_env(
7881
mode: Mode,
7982
*,
8083
http_port: int | None = None,
84+
http_host: str | None = None,
8185
dependencies: list[str] | None = None,
8286
return_mode: Literal['json', 'xml'] = 'xml',
8387
deps_log_handler: LogHandler | None = None,
@@ -92,6 +96,7 @@ def prepare_deno_env(
9296
Args:
9397
mode: The mode to run the server in.
9498
http_port: The port to run the server on if mode is `streamable_http`.
99+
http_host: The host to run the server on if mode is `streamable_http`.
95100
dependencies: The dependencies to install.
96101
return_mode: The mode to return tool results in.
97102
deps_log_handler: Optional function to receive logs emitted while installing dependencies.
@@ -126,6 +131,7 @@ def prepare_deno_env(
126131
args = _deno_run_args(
127132
mode,
128133
http_port=http_port,
134+
http_host=http_host,
129135
dependencies=dependencies,
130136
return_mode=return_mode,
131137
allow_networking=allow_networking,
@@ -141,6 +147,7 @@ async def async_prepare_deno_env(
141147
mode: Mode,
142148
*,
143149
http_port: int | None = None,
150+
http_host: str | None = None,
144151
dependencies: list[str] | None = None,
145152
return_mode: Literal['json', 'xml'] = 'xml',
146153
deps_log_handler: LogHandler | None = None,
@@ -151,6 +158,7 @@ async def async_prepare_deno_env(
151158
prepare_deno_env,
152159
mode,
153160
http_port=http_port,
161+
http_host=http_host,
154162
dependencies=dependencies,
155163
return_mode=return_mode,
156164
deps_log_handler=deps_log_handler,
@@ -181,6 +189,7 @@ def _deno_run_args(
181189
mode: Mode,
182190
*,
183191
http_port: int | None = None,
192+
http_host: str | None = None,
184193
dependencies: list[str] | None = None,
185194
return_mode: Literal['json', 'xml'] = 'xml',
186195
allow_networking: bool = True,
@@ -197,11 +206,13 @@ def _deno_run_args(
197206
]
198207
if dependencies is not None:
199208
args.append(f'--deps={",".join(dependencies)}')
200-
if http_port is not None:
201-
if mode in ('streamable_http', 'streamable_http_stateless'):
209+
if mode in ('streamable_http', 'streamable_http_stateless'):
210+
if http_port is not None:
202211
args.append(f'--port={http_port}')
203-
else:
204-
raise ValueError('Port is only supported for `streamable_http` modes')
212+
if http_host is not None:
213+
args.append(f'--host={http_host}')
214+
elif http_port is not None or http_host is not None:
215+
raise ValueError('Port and host are only supported for `streamable_http` mode')
205216
return args
206217

207218

0 commit comments

Comments
 (0)