Random error thrown on response
Describe the bug Sometimes, I see a stacktrace printed in the logs of my mcp server. Claude eventually succeeds to response but I think its good to investigate it.
To Reproduce Its hard to reproduce as it does not always happen. The code in my codebase that caused it to happen is this one:
def run_tool(self, args: dict) -> Sequence[TextContent | ImageContent | EmbeddedResource]:
user_id = args.get(toolhandler.USER_ID_ARG)
if not user_id:
raise RuntimeError(f"Missing required argument: {toolhandler.USER_ID_ARG}")
gmail_service = gmail.GmailService(user_id=user_id)
query = args.get('query')
max_results = args.get('max_results', 100)
emails = gmail_service.query_emails(query=query, max_results=max_results)
return [
TextContent(
type="text",
text=json.dumps(emails, indent=2)
)
]
Called in this context
@app.call_tool()
async def call_tool(name: str, arguments: Any) -> Sequence[TextContent | ImageContent | EmbeddedResource]:
"""Handle tool calls for command line run."""
if not isinstance(arguments, dict):
raise RuntimeError("arguments must be dictionary")
if toolhandler.USER_ID_ARG not in arguments:
raise RuntimeError("user_id argument is missing in dictionary.")
setup_oauth2(user_id=arguments.get(toolhandler.USER_ID_ARG, ""))
tool_handler = get_tool_handler(name)
if not tool_handler:
raise ValueError(f"Unknown tool: {name}")
try:
return tool_handler.run_tool(arguments)
except Exception as e:
logger.error(str(e))
raise RuntimeError(f"Caught Exception. Error: {str(e)}")
The RunTime Error is NOT thrown
Expected behavior No stacktrace?
Desktop (please complete the following information):
- MAC OSX
- Python 3.13
- mcp 1.1.0
Additional context
Here is a full log
+ Exception Group Traceback (most recent call last):
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/server/stdio.py", line 83, in stdio_server
| yield read_stream, write_stream
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/src/mcp_gsuite/server.py", line 161, in main
| await app.run(
| ...<3 lines>...
| )
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/server/__init__.py", line 423, in run
| async with ServerSession(
| ~~~~~~~~~~~~~^
| read_stream, write_stream, initialization_options
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| ) as session:
| ^
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/shared/session.py", line 122, in __aexit__
| return await self._task_group.__aexit__(exc_type, exc_val, exc_tb)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 763, in __aexit__
| raise BaseExceptionGroup(
| "unhandled errors in a TaskGroup", self._exceptions
| )
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/shared/session.py", line 235, in _receive_loop
| notification = self._receive_notification_type.model_validate(
| message.root.model_dump(
| by_alias=True, mode="json", exclude_none=True
| )
| )
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/pydantic/main.py", line 627, in model_validate
| return cls.__pydantic_validator__.validate_python(
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
| obj, strict=strict, from_attributes=from_attributes, context=context
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| )
| ^
| pydantic_core._pydantic_core.ValidationError: 5 validation errors for ClientNotification
| ProgressNotification.method
| Input should be 'notifications/progress' [type=literal_error, input_value='cancelled', input_type=str]
| For further information visit https://errors.pydantic.dev/2.10/v/literal_error
| ProgressNotification.params.progressToken
| Field required [type=missing, input_value={'requestId': 20, 'reason... -2: Request timed out'}, input_type=dict]
| For further information visit https://errors.pydantic.dev/2.10/v/missing
| ProgressNotification.params.progress
| Field required [type=missing, input_value={'requestId': 20, 'reason... -2: Request timed out'}, input_type=dict]
| For further information visit https://errors.pydantic.dev/2.10/v/missing
| InitializedNotification.method
| Input should be 'notifications/initialized' [type=literal_error, input_value='cancelled', input_type=str]
| For further information visit https://errors.pydantic.dev/2.10/v/literal_error
| RootsListChangedNotification.method
| Input should be 'notifications/roots/list_changed' [type=literal_error, input_value='cancelled', input_type=str]
| For further information visit https://errors.pydantic.dev/2.10/v/literal_error
+------------------------------------
During handling of the above exception, another exception occurred:
+ Exception Group Traceback (most recent call last):
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/bin/mcp-gsuite", line 8, in <module>
| sys.exit(main())
| ~~~~^^
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/src/mcp_gsuite/__init__.py", line 6, in main
| asyncio.run(server.main())
| ~~~~~~~~~~~^^^^^^^^^^^^^^^
| File "/opt/homebrew/Cellar/[email protected]/3.13.0_1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/runners.py", line 194, in run
| return runner.run(main)
| ~~~~~~~~~~^^^^^^
| File "/opt/homebrew/Cellar/[email protected]/3.13.0_1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/runners.py", line 118, in run
| return self._loop.run_until_complete(task)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
| File "/opt/homebrew/Cellar/[email protected]/3.13.0_1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py", line 721, in run_until_complete
| return future.result()
| ~~~~~~~~~~~~~^^
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/src/mcp_gsuite/server.py", line 160, in main
| async with stdio_server() as (read_stream, write_stream):
| ~~~~~~~~~~~~^^
| File "/opt/homebrew/Cellar/[email protected]/3.13.0_1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py", line 235, in __aexit__
| await self.gen.athrow(value)
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/server/stdio.py", line 80, in stdio_server
| async with anyio.create_task_group() as tg:
| ~~~~~~~~~~~~~~~~~~~~~~~^^
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 763, in __aexit__
| raise BaseExceptionGroup(
| "unhandled errors in a TaskGroup", self._exceptions
| )
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/anyio/streams/memory.py", line 242, in send
| self.send_nowait(item)
| ~~~~~~~~~~~~~~~~^^^^^^
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/anyio/streams/memory.py", line 225, in send_nowait
| raise WouldBlock
| anyio.WouldBlock
|
| During handling of the above exception, another exception occurred:
|
| Traceback (most recent call last):
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/server/__init__.py", line 467, in run
| await message.respond(
| ...<4 lines>...
| )
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/shared/session.py", line 58, in respond
| await self._session._send_response(
| request_id=self.request_id, response=response
| )
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/shared/session.py", line 196, in _send_response
| await self._write_stream.send(JSONRPCMessage(jsonrpc_error))
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/anyio/streams/memory.py", line 248, in send
| await send_event.wait()
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 1747, in wait
| await self._event.wait()
| File "/opt/homebrew/Cellar/[email protected]/3.13.0_1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/locks.py", line 213, in wait
| await fut
| asyncio.exceptions.CancelledError: Cancelled by cancel scope 1040d7c50
|
| During handling of the above exception, another exception occurred:
|
| Exception Group Traceback (most recent call last):
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/server/stdio.py", line 83, in stdio_server
| yield read_stream, write_stream
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/src/mcp_gsuite/server.py", line 161, in main
| await app.run(
| ...<3 lines>...
| )
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/server/__init__.py", line 423, in run
| async with ServerSession(
| ~~~~~~~~~~~~~^
| read_stream, write_stream, initialization_options
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| ) as session:
| ^
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/shared/session.py", line 122, in __aexit__
| return await self._task_group.__aexit__(exc_type, exc_val, exc_tb)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 763, in __aexit__
| raise BaseExceptionGroup(
| "unhandled errors in a TaskGroup", self._exceptions
| )
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/mcp/shared/session.py", line 235, in _receive_loop
| notification = self._receive_notification_type.model_validate(
| message.root.model_dump(
| by_alias=True, mode="json", exclude_none=True
| )
| )
| File "/Users/markus/experiments/claude-mvp/mcp-gsuite/.venv/lib/python3.13/site-packages/pydantic/main.py", line 627, in model_validate
| return cls.__pydantic_validator__.validate_python(
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
| obj, strict=strict, from_attributes=from_attributes, context=context
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| )
| ^
| pydantic_core._pydantic_core.ValidationError: 5 validation errors for ClientNotification
| ProgressNotification.method
| Input should be 'notifications/progress' [type=literal_error, input_value='cancelled', input_type=str]
| For further information visit https://errors.pydantic.dev/2.10/v/literal_error
| ProgressNotification.params.progressToken
| Field required [type=missing, input_value={'requestId': 20, 'reason... -2: Request timed out'}, input_type=dict]
| For further information visit https://errors.pydantic.dev/2.10/v/missing
| ProgressNotification.params.progress
| Field required [type=missing, input_value={'requestId': 20, 'reason... -2: Request timed out'}, input_type=dict]
| For further information visit https://errors.pydantic.dev/2.10/v/missing
| InitializedNotification.method
| Input should be 'notifications/initialized' [type=literal_error, input_value='cancelled', input_type=str]
| For further information visit https://errors.pydantic.dev/2.10/v/literal_error
| RootsListChangedNotification.method
| Input should be 'notifications/roots/list_changed' [type=literal_error, input_value='cancelled', input_type=str]
| For further information visit https://errors.pydantic.dev/2.10/v/literal_error
Got the same on Windows:
During handling of the above exception, another exception occurred:
+ Exception Group Traceback (most recent call last):
| File "C:\Dev\mcp\servers\src\test-server\src\test_server\server.py", line 78, in <module>
| asyncio.run(serve())
| File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 194, in run
| return runner.run(main)
| ^^^^^^^^^^^^^^^^
| File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 118, in run
| return self._loop.run_until_complete(task)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\asyncio\base_events.py", line 687, in run_until_complete
| return future.result()
| ^^^^^^^^^^^^^^^
| File "C:\Dev\mcp\servers\src\test-server\src\test_server\server.py", line 72, in serve
| async with stdio_server() as (read_stream, write_stream):
| ^^^^^^^^^^^^^^
| File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 231, in __aexit__
| await self.gen.athrow(value)
| File "C:\Dev\mcp\servers\src\git\.venv\Lib\site-packages\mcp\server\stdio.py", line 80, in stdio_server
| async with anyio.create_task_group() as tg:
| ^^^^^^^^^^^^^^^^^^^^^^^^^
| File "C:\Dev\mcp\servers\src\git\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 763, in __aexit__
| raise BaseExceptionGroup(
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Exception Group Traceback (most recent call last):
| File "C:\Dev\mcp\servers\src\git\.venv\Lib\site-packages\mcp\server\stdio.py", line 83, in stdio_server
| yield read_stream, write_stream
| File "C:\Dev\mcp\servers\src\test-server\src\test_server\server.py", line 73, in serve
| await server.run(read_stream, write_stream, options, raise_exceptions=True)
| File "C:\Dev\mcp\servers\src\git\.venv\Lib\site-packages\mcp\server\__init__.py", line 404, in run
| async with ServerSession(
| ^^^^^^^^^^^^^^
| File "C:\Dev\mcp\servers\src\git\.venv\Lib\site-packages\mcp\shared\session.py", line 122, in __aexit__
| return await self._task_group.__aexit__(exc_type, exc_val, exc_tb)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "C:\Dev\mcp\servers\src\git\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 763, in __aexit__
| raise BaseExceptionGroup(
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "C:\Dev\mcp\servers\src\git\.venv\Lib\site-packages\mcp\shared\session.py", line 235, in _receive_loop
| notification = self._receive_notification_type.model_validate(
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "C:\Dev\mcp\servers\src\git\.venv\Lib\site-packages\pydantic\main.py", line 627, in model_validate
| return cls.__pydantic_validator__.validate_python(
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| pydantic_core._pydantic_core.ValidationError: 5 validation errors for ClientNotification
ProgressNotification.method
Input should be 'notifications/progress' [type=literal_error, input_value='cancelled', input_type=str]
For further information visit https://errors.pydantic.dev/2.10/v/literal_error
ProgressNotification.params.progressToken
Field required [type=missing, input_value={'requestId': 25, 'reason... -2: Request timed out'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.10/v/missing
ProgressNotification.params.progress
Field required [type=missing, input_value={'requestId': 25, 'reason... -2: Request timed out'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.10/v/missing
InitializedNotification.method
Input should be 'notifications/initialized' [type=literal_error, input_value='cancelled', input_type=str]
For further information visit https://errors.pydantic.dev/2.10/v/literal_error
RootsListChangedNotification.method
Input should be 'notifications/roots/list_changed' [type=literal_error, input_value='cancelled', input_type=str]
For further information visit https://errors.pydantic.dev/2.10/v/literal_error
+------------------------------------
Hey team,
I am encountering the same error. When the server-side response is delayed due to an extended process (>10 seconds), the error occurs. Although the server successfully returns the results, it crashes afterward, blocking the next requests. Is there any way to fix it? I am on a Mac, using Claude Desktop as a client.
I've investigated the issue reported by @MarkusPfundstein in the mcp-obsidian project (https://github.com/MarkusPfundstein/mcp-obsidian/issues/3).
I was able to reproduce this issue with a minimal MCP server implementation that simply waits for a specified number of seconds:
- https://github.com/7shi/mcp-wait/blob/main/py/server.py
The behavior varies depending on the client:
With MCP Inspector (10-second timeout):
- Server crashes after sending results if processing takes 8-10 seconds or longer
- The crash occurs regardless of the timeout setting
- After crashing, the server stops responding to all requests
With Claude Desktop app (1-minute timeout):
- Same behavior: server crashes after long-running operations (8-10 seconds or more)
- The crash appears to be related to the processing duration rather than the timeout settings
This issue seems to be specific to the Python implementation of MCP servers. For comparison, I also implemented the same functionality in TypeScript, which continues to operate normally even after timeout events.
- https://github.com/7shi/mcp-wait/blob/main/ts/src/index.ts
The crash occurs at the point where the server tries to send results back to the client after a long-running operation, making it particularly problematic for operations that involve external API calls or other time-consuming tasks.
Steps to reproduce:
- Start MCP Inspector with the server:
npx @modelcontextprotocol/inspector uv run python server.py - Call
wait_secondswith seconds=11- The request will timeout
- Try to call
wait_secondsagain- The server has crashed and won't accept any further requests
The key characteristic of this issue is that the server successfully returns results for long-running operations, but crashes afterwards, preventing it from accepting any subsequent requests. This makes it particularly problematic for scenarios involving external API calls or other time-consuming tasks, as the server becomes unusable after the first long operation.
@7shi I am facing the same errors. Have you fixed them in some way? Have you tried using SSE?
@lgesuellip I don't know how to fix it. I have not tried SSE.
Thank you for the repro. That is very useful. That is helpful. I'll take a look. Can't promise any dates.
Same here, I had been investigating this over a month. Thought my code and implementation was erroring. No, the MCP SDK is sending timeout and cancel on long tasks. It will crash the MCP client. The issue seem when you close long running tasks, despite I tried everything but there is a cancel getting from the SDK handling anyio when we get beyon the 10S. Most mcp are not doing long tasks, but this is a major issue.
2025-01-19 23:22:43 + Exception Group Traceback (most recent call last):
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/server/stdio.py", line 83, in stdio_server
2025-01-19 23:22:43 | yield read_stream, write_stream
2025-01-19 23:22:43 | File "/app/src/mcp_project_manager/__main__.py", line 21, in amain
2025-01-19 23:22:43 | await server.run(read_stream, write_stream, server.create_initialization_options())
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/server/lowlevel/server.py", line 424, in run
2025-01-19 23:22:43 | async with ServerSession(
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/shared/session.py", line 122, in __aexit__
2025-01-19 23:22:43 | return await self._task_group.__aexit__(exc_type, exc_val, exc_tb)
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 767, in __aexit__
2025-01-19 23:22:43 | raise BaseExceptionGroup(
2025-01-19 23:22:43 | exceptiongroup.ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
2025-01-19 23:22:43 +-+---------------- 1 ----------------
2025-01-19 23:22:43 | Traceback (most recent call last):
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/shared/session.py", line 235, in _receive_loop
2025-01-19 23:22:43 | notification = self._receive_notification_type.model_validate(
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/pydantic/main.py", line 627, in model_validate
2025-01-19 23:22:43 | return cls.__pydantic_validator__.validate_python(
2025-01-19 23:22:43 | pydantic_core._pydantic_core.ValidationError: 5 validation errors for ClientNotification
2025-01-19 23:22:43 | ProgressNotification.method
2025-01-19 23:22:43 | Input should be 'notifications/progress' [type=literal_error, input_value='cancelled', input_type=str]
2025-01-19 23:22:43 | For further information visit https://errors.pydantic.dev/2.10/v/literal_error
2025-01-19 23:22:43 | ProgressNotification.params.progressToken
2025-01-19 23:22:43 | Field required [type=missing, input_value={'requestId': 7, 'reason'... -2: Request timed out'}, input_type=dict]
2025-01-19 23:22:43 | For further information visit https://errors.pydantic.dev/2.10/v/missing
2025-01-19 23:22:43 | ProgressNotification.params.progress
2025-01-19 23:22:43 | Field required [type=missing, input_value={'requestId': 7, 'reason'... -2: Request timed out'}, input_type=dict]
2025-01-19 23:22:43 | For further information visit https://errors.pydantic.dev/2.10/v/missing
2025-01-19 23:22:43 | InitializedNotification.method
2025-01-19 23:22:43 | Input should be 'notifications/initialized' [type=literal_error, input_value='cancelled', input_type=str]
2025-01-19 23:22:43 | For further information visit https://errors.pydantic.dev/2.10/v/literal_error
2025-01-19 23:22:43 | RootsListChangedNotification.method
2025-01-19 23:22:43 | Input should be 'notifications/roots/list_changed' [type=literal_error, input_value='cancelled', input_type=str]
2025-01-19 23:22:43 | For further information visit https://errors.pydantic.dev/2.10/v/literal_error
2025-01-19 23:22:43 +------------------------------------
2025-01-19 23:22:43
2025-01-19 23:22:43 During handling of the above exception, another exception occurred:
2025-01-19 23:22:43
2025-01-19 23:22:43 + Exception Group Traceback (most recent call last):
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/runpy.py", line 196, in _run_module_as_main
2025-01-19 23:22:43 | return _run_code(code, main_globals, None,
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/runpy.py", line 86, in _run_code
2025-01-19 23:22:43 | exec(code, run_globals)
2025-01-19 23:22:43 | File "/app/src/mcp_project_manager/__main__.py", line 30, in <module>
2025-01-19 23:22:43 | main()
2025-01-19 23:22:43 | File "/app/src/mcp_project_manager/__main__.py", line 26, in main
2025-01-19 23:22:43 | asyncio.run(amain())
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
2025-01-19 23:22:43 | return loop.run_until_complete(main)
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
2025-01-19 23:22:43 | return future.result()
2025-01-19 23:22:43 | File "/app/src/mcp_project_manager/__main__.py", line 20, in amain
2025-01-19 23:22:43 | async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/contextlib.py", line 217, in __aexit__
2025-01-19 23:22:43 | await self.gen.athrow(typ, value, traceback)
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/server/stdio.py", line 80, in stdio_server
2025-01-19 23:22:43 | async with anyio.create_task_group() as tg:
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 767, in __aexit__
2025-01-19 23:22:43 | raise BaseExceptionGroup(
2025-01-19 23:22:43 | exceptiongroup.ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
2025-01-19 23:22:43 +-+---------------- 1 ----------------
2025-01-19 23:22:43 | Traceback (most recent call last):
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/anyio/streams/memory.py", line 242, in send
2025-01-19 23:22:43 | self.send_nowait(item)
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/anyio/streams/memory.py", line 225, in send_nowait
2025-01-19 23:22:43 | raise WouldBlock
2025-01-19 23:22:43 | anyio.WouldBlock
2025-01-19 23:22:43 |
2025-01-19 23:22:43 | During handling of the above exception, another exception occurred:
2025-01-19 23:22:43 |
2025-01-19 23:22:43 | Traceback (most recent call last):
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/server/lowlevel/server.py", line 468, in run
2025-01-19 23:22:43 | await message.respond(
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/shared/session.py", line 58, in respond
2025-01-19 23:22:43 | await self._session._send_response(
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/shared/session.py", line 196, in _send_response
2025-01-19 23:22:43 | await self._write_stream.send(JSONRPCMessage(jsonrpc_error))
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/anyio/streams/memory.py", line 248, in send
2025-01-19 23:22:43 | await send_event.wait()
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/asyncio/locks.py", line 214, in wait
2025-01-19 23:22:43 | await fut
2025-01-19 23:22:43 | asyncio.exceptions.CancelledError: Cancelled by cancel scope 7fd2b175fd00
2025-01-19 23:22:43 |
2025-01-19 23:22:43 | During handling of the above exception, another exception occurred:
2025-01-19 23:22:43 |
2025-01-19 23:22:43 | Exception Group Traceback (most recent call last):
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/server/stdio.py", line 83, in stdio_server
2025-01-19 23:22:43 | yield read_stream, write_stream
2025-01-19 23:22:43 | File "/app/src/mcp_project_manager/__main__.py", line 21, in amain
2025-01-19 23:22:43 | await server.run(read_stream, write_stream, server.create_initialization_options())
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/server/lowlevel/server.py", line 424, in run
2025-01-19 23:22:43 | async with ServerSession(
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/shared/session.py", line 122, in __aexit__
2025-01-19 23:22:43 | return await self._task_group.__aexit__(exc_type, exc_val, exc_tb)
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 767, in __aexit__
2025-01-19 23:22:43 | raise BaseExceptionGroup(
2025-01-19 23:22:43 | exceptiongroup.ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
2025-01-19 23:22:43 +-+---------------- 1 ----------------
2025-01-19 23:22:43 | Traceback (most recent call last):
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/mcp/shared/session.py", line 235, in _receive_loop
2025-01-19 23:22:43 | notification = self._receive_notification_type.model_validate(
2025-01-19 23:22:43 | File "/usr/local/lib/python3.10/site-packages/pydantic/main.py", line 627, in model_validate
2025-01-19 23:22:43 | return cls.__pydantic_validator__.validate_python(
2025-01-19 23:22:43 | pydantic_core._pydantic_core.ValidationError: 5 validation errors for ClientNotification
2025-01-19 23:22:43 | ProgressNotification.method
2025-01-19 23:22:43 | Input should be 'notifications/progress' [type=literal_error, input_value='cancelled', input_type=str]
2025-01-19 23:22:43 | For further information visit https://errors.pydantic.dev/2.10/v/literal_error
2025-01-19 23:22:43 | ProgressNotification.params.progressToken
2025-01-19 23:22:43 | Field required [type=missing, input_value={'requestId': 7, 'reason'... -2: Request timed out'}, input_type=dict]
2025-01-19 23:22:43 | For further information visit https://errors.pydantic.dev/2.10/v/missing
2025-01-19 23:22:43 | ProgressNotification.params.progress
2025-01-19 23:22:43 | Field required [type=missing, input_value={'requestId': 7, 'reason'... -2: Request timed out'}, input_type=dict]
2025-01-19 23:22:43 | For further information visit https://errors.pydantic.dev/2.10/v/missing
2025-01-19 23:22:43 | InitializedNotification.method
2025-01-19 23:22:43 | Input should be 'notifications/initialized' [type=literal_error, input_value='cancelled', input_type=str]
2025-01-19 23:22:43 | For further information visit https://errors.pydantic.dev/2.10/v/literal_error
2025-01-19 23:22:43 | RootsListChangedNotification.method
2025-01-19 23:22:43 | Input should be 'notifications/roots/list_changed' [type=literal_error, input_value='cancelled', input_type=str]
2025-01-19 23:22:43 | For further information visit https://errors.pydantic.dev/2.10/v/literal_error
2025-01-19 23:22:43 +------------------------------------
I add a PR. With PR a server continues to respond in inspector after the timeouts. I have to yet test with Claude Desktop.
I ended up patching the MCP SDK And working with a local copy as it was not sustainable. It was crashing all long requests. And in stdio total pain.
I thought that SDK 1.3.0 fixed this but I was totally wrong. And this is breaking one key tool I used: EXECUTOR. This is absolut pain, as the issue is reported since month's. Last time made some custom patch. I can't tell how this is blocking. MCP beyond 10s can't work.
Issue #144 similar. We need a solution and this is major issue for long running tasks.