From fdfa1fe1084f5c47056d8887d63f4d9a6a0a7441 Mon Sep 17 00:00:00 2001 From: Jeremiah Lowin <153965+jlowin@users.noreply.github.com> Date: Sat, 31 May 2025 18:12:17 -0400 Subject: [PATCH] Use anyio.event --- src/fastmcp/client/client.py | 4 ++-- src/fastmcp/client/transports.py | 9 +++++---- tests/server/test_logging.py | 7 ++++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/fastmcp/client/client.py b/src/fastmcp/client/client.py index 15e72c7f1..cc82c6eb3 100644 --- a/src/fastmcp/client/client.py +++ b/src/fastmcp/client/client.py @@ -196,8 +196,8 @@ class Client(Generic[ClientTransportT]): self._nesting_counter: int = 0 self._context_lock = anyio.Lock() self._session_task: asyncio.Task | None = None - self._ready_event = asyncio.Event() - self._stop_event = asyncio.Event() + self._ready_event = anyio.Event() + self._stop_event = anyio.Event() @property def session(self) -> ClientSession: diff --git a/src/fastmcp/client/transports.py b/src/fastmcp/client/transports.py index 42b524485..cafe9588c 100644 --- a/src/fastmcp/client/transports.py +++ b/src/fastmcp/client/transports.py @@ -18,6 +18,7 @@ from typing import ( overload, ) +import anyio import httpx from mcp import ClientSession, StdioServerParameters from mcp.client.session import ( @@ -327,8 +328,8 @@ class StdioTransport(ClientTransport): self._session: ClientSession | None = None self._connect_task: asyncio.Task | None = None - self._ready_event = asyncio.Event() - self._stop_event = asyncio.Event() + self._ready_event = anyio.Event() + self._stop_event = anyio.Event() @contextlib.asynccontextmanager async def connect_session( @@ -391,8 +392,8 @@ class StdioTransport(ClientTransport): # reset variables and events for potential future reconnects self._connect_task = None - self._stop_event = asyncio.Event() - self._ready_event = asyncio.Event() + self._stop_event = anyio.Event() + self._ready_event = anyio.Event() async def close(self): await self.disconnect() diff --git a/tests/server/test_logging.py b/tests/server/test_logging.py index ea827c7f0..1a3c09a63 100644 --- a/tests/server/test_logging.py +++ b/tests/server/test_logging.py @@ -2,6 +2,7 @@ import asyncio import logging from unittest.mock import AsyncMock, Mock, patch +import anyio import pytest from fastmcp.server.server import FastMCP @@ -27,7 +28,7 @@ async def test_uvicorn_logging_default_level( """Tests that FastMCP passes log_level to uvicorn.Config if no log_config is given.""" mock_server_instance = AsyncMock() mock_uvicorn_server_constructor.return_value = mock_server_instance - serve_finished_event = asyncio.Event() + serve_finished_event = anyio.Event() mock_server_instance.serve.side_effect = serve_finished_event.wait test_log_level = "warning" @@ -63,7 +64,7 @@ async def test_uvicorn_logging_with_custom_log_config( """Tests that FastMCP passes log_config to uvicorn.Config and not log_level.""" mock_server_instance = AsyncMock() mock_uvicorn_server_constructor.return_value = mock_server_instance - serve_finished_event = asyncio.Event() + serve_finished_event = anyio.Event() mock_server_instance.serve.side_effect = serve_finished_event.wait sample_log_config = { @@ -123,7 +124,7 @@ async def test_uvicorn_logging_custom_log_config_overrides_log_level_param( """Tests log_config precedence if log_level is also passed to run_http_async.""" mock_server_instance = AsyncMock() mock_uvicorn_server_constructor.return_value = mock_server_instance - serve_finished_event = asyncio.Event() + serve_finished_event = anyio.Event() mock_server_instance.serve.side_effect = serve_finished_event.wait sample_log_config = {