From d96cfbdc6f6146791c13274ba1342e962d241e13 Mon Sep 17 00:00:00 2001 From: Sydney Runkle Date: Thu, 20 Aug 2026 16:31:46 -0700 Subject: [PATCH] fix(langchain): widen `langchain.mcp` client type to `Client[Any]` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `load_mcp_tools`, `convert_mcp_tool`, and `call_tool_with_elicitation` annotated their FastMCP client as `Client[ClientTransport]`. FastMCP's `Client` is invariant in its transport type parameter, so no concrete client a caller constructs (e.g. `Client(url)`, which infers a transport union) satisfies `Client[ClientTransport]` — every real caller hits a mypy arg-type error. Widen the annotation to `Client[Any]` and drop the now-unused `ClientTransport` import. Pure static-typing change; runtime behavior is unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) --- libs/langchain_v1/langchain/mcp/_elicitation.py | 3 +-- libs/langchain_v1/langchain/mcp/tools.py | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/libs/langchain_v1/langchain/mcp/_elicitation.py b/libs/langchain_v1/langchain/mcp/_elicitation.py index 1125a7de7a..6392bdc518 100644 --- a/libs/langchain_v1/langchain/mcp/_elicitation.py +++ b/libs/langchain_v1/langchain/mcp/_elicitation.py @@ -23,7 +23,6 @@ from typing_extensions import NotRequired, TypedDict if TYPE_CHECKING: from fastmcp import Client - from fastmcp.client.transports import ClientTransport from mcp.types import CallToolResult, InputResponses _VALID_ACTIONS = ("accept", "decline", "cancel") @@ -45,7 +44,7 @@ class MCPElicitation(TypedDict): async def call_tool_with_elicitation( - client: Client[ClientTransport], + client: Client[Any], name: str, arguments: dict[str, Any], ) -> CallToolResult: diff --git a/libs/langchain_v1/langchain/mcp/tools.py b/libs/langchain_v1/langchain/mcp/tools.py index 5b6eaf3bbf..e77baa1d72 100644 --- a/libs/langchain_v1/langchain/mcp/tools.py +++ b/libs/langchain_v1/langchain/mcp/tools.py @@ -26,7 +26,6 @@ if TYPE_CHECKING: from collections.abc import Sequence from fastmcp import Client - from fastmcp.client.transports import ClientTransport from langchain_core.tools import BaseTool from mcp.types import ContentBlock as MCPContentBlock from mcp.types import Tool as MCPTool @@ -51,7 +50,7 @@ class _ToolResult(Protocol): async def load_mcp_tools( - client: Client[ClientTransport], + client: Client[Any], *, elicitation: ElicitationMode | None = None, ) -> list[BaseTool]: @@ -79,7 +78,7 @@ async def load_mcp_tools( def convert_mcp_tool( tool: MCPTool, - client: Client[ClientTransport], + client: Client[Any], *, elicitation: ElicitationMode | None = None, ) -> BaseTool: