From 14b8f9cfceaade114bd554ccddc68270264b0b0e Mon Sep 17 00:00:00 2001 From: Younghwan Jang Date: Wed, 2 Apr 2025 11:56:54 -0700 Subject: [PATCH 1/4] Disabling SSL verification for testing --- src/mcp/client/__main__.py | 12 +++++++++--- src/mcp/client/sse.py | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/mcp/client/__main__.py b/src/mcp/client/__main__.py index 39b4f45c1..9d9b1dcf4 100644 --- a/src/mcp/client/__main__.py +++ b/src/mcp/client/__main__.py @@ -47,12 +47,12 @@ async def run_session( logger.info("Initialized") -async def main(command_or_url: str, args: list[str], env: list[tuple[str, str]]): +async def main(command_or_url: str, args: list[str], env: list[tuple[str, str]], disable_ssl_verification: bool): env_dict = dict(env) if urlparse(command_or_url).scheme in ("http", "https"): # Use SSE client for HTTP(S) URLs - async with sse_client(command_or_url) as streams: + async with sse_client(command_or_url, verify_ssl=not disable_ssl_verification) as streams: await run_session(*streams) else: # Use stdio client for commands @@ -76,9 +76,15 @@ def cli(): help="Environment variables to set. Can be used multiple times.", default=[], ) + parser.add_argument( + "--disable-ssl-verification", + nargs="+", + default=[], + help="Disable SSL verification when using HTTPS. SSL verification is enabled by default.", + ) args = parser.parse_args() - anyio.run(partial(main, args.command_or_url, args.args, args.env), backend="trio") + anyio.run(partial(main, args.command_or_url, args.args, args.env, args.disable_ssl_verification if len(args.disable_ssl_verification) > 0 else False), backend="trio") if __name__ == "__main__": diff --git a/src/mcp/client/sse.py b/src/mcp/client/sse.py index 4f6241a72..6dade1bb9 100644 --- a/src/mcp/client/sse.py +++ b/src/mcp/client/sse.py @@ -24,6 +24,7 @@ async def sse_client( headers: dict[str, Any] | None = None, timeout: float = 5, sse_read_timeout: float = 60 * 5, + verify_ssl: bool = True, ): """ Client transport for SSE. @@ -43,7 +44,7 @@ async def sse_client( async with anyio.create_task_group() as tg: try: logger.info(f"Connecting to SSE endpoint: {remove_request_params(url)}") - async with httpx.AsyncClient(headers=headers) as client: + async with httpx.AsyncClient(headers=headers, verify=verify_ssl) as client: async with aconnect_sse( client, "GET", From e11ce706286aa8c057fcb0664b20521733c781c4 Mon Sep 17 00:00:00 2001 From: Younghwan Jang Date: Wed, 2 Apr 2025 13:34:16 -0700 Subject: [PATCH 2/4] Fixing argument parsing --- src/mcp/client/__main__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/mcp/client/__main__.py b/src/mcp/client/__main__.py index 9d9b1dcf4..af1b4a8f6 100644 --- a/src/mcp/client/__main__.py +++ b/src/mcp/client/__main__.py @@ -78,13 +78,12 @@ def cli(): ) parser.add_argument( "--disable-ssl-verification", - nargs="+", - default=[], + action='store_true', help="Disable SSL verification when using HTTPS. SSL verification is enabled by default.", ) args = parser.parse_args() - anyio.run(partial(main, args.command_or_url, args.args, args.env, args.disable_ssl_verification if len(args.disable_ssl_verification) > 0 else False), backend="trio") + anyio.run(partial(main, args.command_or_url, args.args, args.env, args.disable_ssl_verification), backend="trio") if __name__ == "__main__": From 271e77daaf346ad65dd9580fbcb8d0d6b9ed5ae7 Mon Sep 17 00:00:00 2001 From: Younghwan Jang Date: Wed, 2 Apr 2025 13:46:41 -0700 Subject: [PATCH 3/4] Fixing argument parsing and formatting --- src/mcp/client/__main__.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/mcp/client/__main__.py b/src/mcp/client/__main__.py index af1b4a8f6..88d8eb39f 100644 --- a/src/mcp/client/__main__.py +++ b/src/mcp/client/__main__.py @@ -47,12 +47,12 @@ async def run_session( logger.info("Initialized") -async def main(command_or_url: str, args: list[str], env: list[tuple[str, str]], disable_ssl_verification: bool): +async def main(command_or_url: str, args: list[str], env: list[tuple[str, str]], verify_ssl: bool): env_dict = dict(env) if urlparse(command_or_url).scheme in ("http", "https"): # Use SSE client for HTTP(S) URLs - async with sse_client(command_or_url, verify_ssl=not disable_ssl_verification) as streams: + async with sse_client(command_or_url, verify_ssl=verify_ssl) as streams: await run_session(*streams) else: # Use stdio client for commands @@ -79,11 +79,15 @@ def cli(): parser.add_argument( "--disable-ssl-verification", action='store_true', - help="Disable SSL verification when using HTTPS. SSL verification is enabled by default.", + default=False, + help="Disable SSL verification on HTTPS. SSL verification by default.", ) args = parser.parse_args() - anyio.run(partial(main, args.command_or_url, args.args, args.env, args.disable_ssl_verification), backend="trio") + anyio.run( + partial(main, args.command_or_url, args.args, args.env, not args.disable_ssl_verification), + backend="trio", + ) if __name__ == "__main__": From d187908eaf2159c831f69b6562e806e48c2c1983 Mon Sep 17 00:00:00 2001 From: Younghwan Jang Date: Wed, 2 Apr 2025 13:48:25 -0700 Subject: [PATCH 4/4] Formatting --- src/mcp/client/__main__.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/mcp/client/__main__.py b/src/mcp/client/__main__.py index 88d8eb39f..3332e34ac 100644 --- a/src/mcp/client/__main__.py +++ b/src/mcp/client/__main__.py @@ -47,7 +47,12 @@ async def run_session( logger.info("Initialized") -async def main(command_or_url: str, args: list[str], env: list[tuple[str, str]], verify_ssl: bool): +async def main( + command_or_url: str, + args: list[str], + env: list[tuple[str, str]], + verify_ssl: bool, +): env_dict = dict(env) if urlparse(command_or_url).scheme in ("http", "https"): @@ -85,7 +90,13 @@ def cli(): args = parser.parse_args() anyio.run( - partial(main, args.command_or_url, args.args, args.env, not args.disable_ssl_verification), + partial( + main, + args.command_or_url, + args.args, + args.env, + not args.disable_ssl_verification, + ), backend="trio", )