From 06e692ba5ca00f19b61029218af5ccc037eaa63b Mon Sep 17 00:00:00 2001 From: David Soria Parra Date: Tue, 11 Mar 2025 10:26:38 +0000 Subject: [PATCH 1/3] fix: fix the name of the env variable --- examples/clients/simple-chatbot/mcp_simple_chatbot/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/clients/simple-chatbot/mcp_simple_chatbot/main.py b/examples/clients/simple-chatbot/mcp_simple_chatbot/main.py index 3892e49..30bca72 100644 --- a/examples/clients/simple-chatbot/mcp_simple_chatbot/main.py +++ b/examples/clients/simple-chatbot/mcp_simple_chatbot/main.py @@ -23,7 +23,7 @@ class Configuration: def __init__(self) -> None: """Initialize configuration with environment variables.""" self.load_env() - self.api_key = os.getenv("GROQ_API_KEY") + self.api_key = os.getenv("LLM_API_KEY") @staticmethod def load_env() -> None: From 5cbea24ecb7fef2422be5b7bd82a654fb301c199 Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Tue, 11 Mar 2025 14:15:07 +0100 Subject: [PATCH 2/3] Use proper generic for Context (#245) --- src/mcp/server/fastmcp/server.py | 10 +++++----- src/mcp/shared/context.py | 8 +++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/mcp/server/fastmcp/server.py b/src/mcp/server/fastmcp/server.py index 122aceb..ae3434b 100644 --- a/src/mcp/server/fastmcp/server.py +++ b/src/mcp/server/fastmcp/server.py @@ -37,7 +37,7 @@ from mcp.server.lowlevel.server import ( from mcp.server.session import ServerSession from mcp.server.sse import SseServerTransport from mcp.server.stdio import stdio_server -from mcp.shared.context import RequestContext +from mcp.shared.context import LifespanContextT, RequestContext from mcp.types import ( AnyFunction, EmbeddedResource, @@ -564,7 +564,7 @@ def _convert_to_content( return [TextContent(type="text", text=result)] -class Context(BaseModel): +class Context(BaseModel, Generic[LifespanContextT]): """Context object providing access to MCP capabilities. This provides a cleaner interface to MCP's RequestContext functionality. @@ -598,13 +598,13 @@ class Context(BaseModel): The context is optional - tools that don't need it can omit the parameter. """ - _request_context: RequestContext[ServerSession, Any] | None + _request_context: RequestContext[ServerSession, LifespanContextT] | None _fastmcp: FastMCP | None def __init__( self, *, - request_context: RequestContext | None = None, + request_context: RequestContext[ServerSession, LifespanContextT] | None = None, fastmcp: FastMCP | None = None, **kwargs: Any, ): @@ -620,7 +620,7 @@ class Context(BaseModel): return self._fastmcp @property - def request_context(self) -> RequestContext: + def request_context(self) -> RequestContext[ServerSession, LifespanContextT]: """Access to the underlying request context.""" if self._request_context is None: raise ValueError("Context is not available outside of a request") diff --git a/src/mcp/shared/context.py b/src/mcp/shared/context.py index a45fdac..63759ca 100644 --- a/src/mcp/shared/context.py +++ b/src/mcp/shared/context.py @@ -1,11 +1,13 @@ from dataclasses import dataclass -from typing import Generic, TypeVar +from typing import Any, Generic + +from typing_extensions import TypeVar from mcp.shared.session import BaseSession from mcp.types import RequestId, RequestParams -SessionT = TypeVar("SessionT", bound=BaseSession) -LifespanContextT = TypeVar("LifespanContextT") +SessionT = TypeVar("SessionT", bound=BaseSession[Any, Any, Any, Any, Any]) +LifespanContextT = TypeVar("LifespanContextT", default=None) @dataclass From 3e0ab1e7ee77c65fee8dc06bfd4e0d2bd7eb8b31 Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Tue, 11 Mar 2025 14:17:15 +0100 Subject: [PATCH 3/3] Drop AbstractAsyncContextManager for proper type hints (#257) --- src/mcp/shared/session.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mcp/shared/session.py b/src/mcp/shared/session.py index 3d3988c..da826d6 100644 --- a/src/mcp/shared/session.py +++ b/src/mcp/shared/session.py @@ -8,6 +8,7 @@ import anyio.lowlevel import httpx from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream from pydantic import BaseModel +from typing_extensions import Self from mcp.shared.exceptions import McpError from mcp.types import ( @@ -60,7 +61,7 @@ class RequestResponder(Generic[ReceiveRequestT, SendResultT]): request_id: RequestId, request_meta: RequestParams.Meta | None, request: ReceiveRequestT, - session: "BaseSession", + session: "BaseSession[SendRequestT, SendNotificationT, SendResultT, ReceiveRequestT, ReceiveNotificationT]", on_complete: Callable[["RequestResponder[ReceiveRequestT, SendResultT]"], Any], ) -> None: self.request_id = request_id @@ -134,7 +135,6 @@ class RequestResponder(Generic[ReceiveRequestT, SendResultT]): class BaseSession( - AbstractAsyncContextManager, Generic[ SendRequestT, SendNotificationT, @@ -183,7 +183,7 @@ class BaseSession( ]() ) - async def __aenter__(self): + async def __aenter__(self) -> Self: self._task_group = anyio.create_task_group() await self._task_group.__aenter__() self._task_group.start_soon(self._receive_loop)