modelcontextprotocol / modelcontextprotocol/python-sdk
Lazy HTTP connections seem to make error handling difficult.
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 24.3k
- Forks
- 4k
- Merge moyen
- 1 j 1 h
- PR mergées (30 j)
- 31
Description
Question
When using streamablehttp_client, since HTTP connections are initialized with anyio.create_task_group, if the server is unreachable, an error will occur unexpectedly at some point later. Is this the intended behavior? If the connection is impossible, I want to wait and handle the error. However, the current behavior executes the code after the initialization and then throws an error at some point. If the error had occurred earlier, the code below it wouldn't have needed to execute. I consider this excessive optimization. Is there a reason for this design?
Additional Context
import asyncio
from langchain_mcp_adapters.tools import load_mcp_tools
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def _init_and_load(session: ClientSession):
try:
async with asyncio.timeout(10): # << I cannot access the server and will time out.
await session.initialize()
return await load_mcp_tools(session)
except Exception as e:
return []
async def main():
async with streamablehttp_client(url="https://some.unreachable.domain") as client:
async with ClientSession(client[0], client[1]) as session:
tools = await _init_and_load(session)
await asyncio.sleep(100) # << A httpx.ConnectTimeout exception occurred while performing the following operation!!
import asyncio
from langchain_mcp_adapters.tools import load_mcp_tools
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def _init_and_load(session: ClientSession):
try:
await session.initialize()
return await load_mcp_tools(session)
except Exception as e: # << Since the error is caused by tg, this cannot handle the error too!!
return []
async def main():
async with streamablehttp_client(url="https://some.unreachable.domain", timeout=10) as client:
async with ClientSession(client[0], client[1]) as session:
tools = await _init_and_load(session)
await asyncio.sleep(100)
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par le point d’entrée streamablehttp_client et sa configuration de anyio.create_task_group ; reproduisez les exemples de domaines inaccessibles avec asyncio.timeout et timeout=10. Suivez le moment où httpx.ConnectTimeout est propagé par rapport à session.initialize() et au gestionnaire de contexte environnant, puis définissez l’achèvement comme le moment de l’erreur corrigée ou documentée pour les cas présentés.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- networking
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- À clarifier
- Accessibilité débutants
- 30/100