René's URL Explorer Experiment


Title: `tools/call` with string `arguments` breaks mcp server until restart · Issue #820 · modelcontextprotocol/python-sdk · GitHub

Open Graph Title: `tools/call` with string `arguments` breaks mcp server until restart · Issue #820 · modelcontextprotocol/python-sdk

X Title: `tools/call` with string `arguments` breaks mcp server until restart · Issue #820 · modelcontextprotocol/python-sdk

Description: Describe the bug When making a tools/call JSON-RPC request to the mcp server, passing the arguments parameter as a string instead of an object causes the server to stop responding to all HTTP requests. The server does not return an infor...

Open Graph Description: Describe the bug When making a tools/call JSON-RPC request to the mcp server, passing the arguments parameter as a string instead of an object causes the server to stop responding to all HTTP reque...

X Description: Describe the bug When making a tools/call JSON-RPC request to the mcp server, passing the arguments parameter as a string instead of an object causes the server to stop responding to all HTTP reque...

Opengraph URL: https://github.com/modelcontextprotocol/python-sdk/issues/820

X: @github

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"`tools/call` with string `arguments` breaks mcp server until restart","articleBody":"**Describe the bug**\n\nWhen making a `tools/call` JSON-RPC request to the mcp server, passing the `arguments` parameter as a string instead of an object causes the server to stop responding to all HTTP requests. The server does not return an informative error, and requires a restart to recover.\n\n**This makes it possible for a single malformed client request to break the server for everyone.**\n\nSee the MRE at https://github.com/Sillocan/fastmcp-mre-breaking-task-group-with-invalid-arguments/blob/main/python_sdk/simple_echo_mre.py\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Run the following command in your shell:\n   ```sh\n   uv run --with=git+https://github.com/Sillocan/fastmcp-mre-breaking-task-group-with-invalid-arguments#subdirectory=python_sdk mre\n   ```\n2. Observe that a single malformed request (`arguments` is a string) returns 200, but further requests return 500 and the server must be restarted.\n3. See error output below.\n\n**Expected behavior**\n- The server should return a clear error response (such as HTTP 400) when a request has an invalid format—specifically, when `arguments` is a string instead of a dict/object.\n- The server should remain operational and handle all further requests correctly, even after processing an invalid or malformed request.\n\n\n**Logs**\n\n```sh\n$ uv run --with=git+https://github.com/Sillocan/fastmcp-mre-breaking-task-group-with-invalid-arguments#subdirectory=python_sdk mre\n      Built fastmcp-mre-breaking-task-group-with-invalid-arguments @ git+https://github.com/Sillocan/fastmcp-mre-breaking-task-group-with-invalid-arguments@3eeb959518a5eaa685c7619ebc7b20f5330f6235#subdirectory=python_sdk\nInstalled 32 packages in 5ms\n[05/27/25 12:40:16] DEBUG    Using selector: EpollSelector                                                                                                                                                              selector_events.py:64\nINFO:     Started server process [1783696]\nINFO:     Waiting for application startup.\n                    INFO     StreamableHTTP session manager started                                                                                                                                            streamable_http_manager.py:109\nINFO:     Application startup complete.\nINFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)\n[05/27/25 12:40:17] DEBUG    connect_tcp.started host='127.0.0.1' port=8000 local_address=None timeout=5.0 socket_options=None                                                                                                   _trace.py:87\n                    DEBUG    connect_tcp.complete return_value=\u003chttpcore._backends.anyio.AnyIOStream object at 0x7fcbb8fe4ec0\u003e                                                                                                   _trace.py:87\n                    DEBUG    send_request_headers.started request=\u003cRequest [b'POST']\u003e                                                                                                                                            _trace.py:87\n                    DEBUG    send_request_headers.complete                                                                                                                                                                       _trace.py:87\n                    DEBUG    send_request_body.started request=\u003cRequest [b'POST']\u003e                                                                                                                                               _trace.py:87\n                    DEBUG    send_request_body.complete                                                                                                                                                                          _trace.py:87\n                    DEBUG    receive_response_headers.started request=\u003cRequest [b'POST']\u003e                                                                                                                                        _trace.py:87\n                    DEBUG    Stateless mode: Creating new transport for this request                                                                                                                           streamable_http_manager.py:159\nINFO:     127.0.0.1:51112 - \"POST /mcp/ HTTP/1.1\" 200 OK\n                    DEBUG    receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'date', b'Tue, 27 May 2025 19:40:16 GMT'), (b'server', b'uvicorn'), (b'cache-control', b'no-cache, no-transform'),      _trace.py:87\n                             (b'connection', b'keep-alive'), (b'content-type', b'text/event-stream'), (b'x-accel-buffering', b'no'), (b'Transfer-Encoding', b'chunked')])                                                                    \n                    INFO     HTTP Request: POST http://127.0.0.1:8000/mcp/ \"HTTP/1.1 200 OK\"                                                                                                                                  _client.py:1740\n                    DEBUG    receive_response_body.started request=\u003cRequest [b'POST']\u003e                                                                                                                                           _trace.py:87\n                    DEBUG    Closing SSE writer                                                                                                                                                                        streamable_http.py:486\n                    INFO     StreamableHTTP session manager shutting down                                                                                                                                      streamable_http_manager.py:113\n                    DEBUG    Got event: http.disconnect. Stop streaming.                                                                                                                                                           sse.py:182\nERROR:      + Exception Group Traceback (most recent call last):\n  |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/starlette/routing.py\", line 692, in lifespan\n  |     async with self.lifespan_context(app) as maybe_state:\n  |                ~~~~~~~~~~~~~~~~~~~~~^^^^^\n  |   File \"${HOME}/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/contextlib.py\", line 235, in __aexit__\n  |     await self.gen.athrow(value)\n  |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/mcp/server/streamable_http_manager.py\", line 106, in run\n  |     async with anyio.create_task_group() as tg:\n  |                ~~~~~~~~~~~~~~~~~~~~~~~^^\n  |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/anyio/_backends/_asyncio.py\", line 772, in __aexit__\n  |     raise BaseExceptionGroup(\n  |         \"unhandled errors in a TaskGroup\", self._exceptions\n  |     ) from None\n  | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)\n  +-+---------------- 1 ----------------\n    | Exception Group Traceback (most recent call last):\n    |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/mcp/server/streamable_http_manager.py\", line 171, in run_stateless_server\n    |     async with http_transport.connect() as streams:\n    |                ~~~~~~~~~~~~~~~~~~~~~~^^\n    |   File \"${HOME}/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/contextlib.py\", line 235, in __aexit__\n    |     await self.gen.athrow(value)\n    |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/mcp/server/streamable_http.py\", line 843, in connect\n    |     async with anyio.create_task_group() as tg:\n    |                ~~~~~~~~~~~~~~~~~~~~~~~^^\n    |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/anyio/_backends/_asyncio.py\", line 772, in __aexit__\n    |     raise BaseExceptionGroup(\n    |         \"unhandled errors in a TaskGroup\", self._exceptions\n    |     ) from None\n    | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)\n    +-+---------------- 1 ----------------\n      | Exception Group Traceback (most recent call last):\n      |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/mcp/server/streamable_http.py\", line 916, in connect\n      |     yield read_stream, write_stream\n      |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/mcp/server/streamable_http_manager.py\", line 174, in run_stateless_server\n      |     await self.app.run(\n      |     ...\u003c4 lines\u003e...\n      |     )\n      |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/mcp/server/lowlevel/server.py\", line 495, in run\n      |     async with AsyncExitStack() as stack:\n      |                ~~~~~~~~~~~~~~^^\n      |   File \"${HOME}/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/contextlib.py\", line 768, in __aexit__\n      |     raise exc\n      |   File \"${HOME}/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/contextlib.py\", line 751, in __aexit__\n      |     cb_suppress = await cb(*exc_details)\n      |                   ^^^^^^^^^^^^^^^^^^^^^^\n      |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/mcp/shared/session.py\", line 220, in __aexit__\n      |     return await self._task_group.__aexit__(exc_type, exc_val, exc_tb)\n      |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n      |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/anyio/_backends/_asyncio.py\", line 772, in __aexit__\n      |     raise BaseExceptionGroup(\n      |         \"unhandled errors in a TaskGroup\", self._exceptions\n      |     ) from None\n      | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)\n      +-+---------------- 1 ----------------\n        | Traceback (most recent call last):\n        |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/mcp/server/session.py\", line 147, in _receive_loop\n        |     await super()._receive_loop()\n        |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/mcp/shared/session.py\", line 354, in _receive_loop\n        |     validated_request = self._receive_request_type.model_validate(\n        |         message.message.root.model_dump(\n        |             by_alias=True, mode=\"json\", exclude_none=True\n        |         )\n        |     )\n        |   File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/pydantic/main.py\", line 705, in model_validate\n        |     return cls.__pydantic_validator__.validate_python(\n        |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n        |         obj, strict=strict, from_attributes=from_attributes, context=context, by_alias=by_alias, by_name=by_name\n        |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n        |     )\n        |     ^\n        | pydantic_core._pydantic_core.ValidationError: 23 validation errors for ClientRequest\n        | PingRequest.method\n        |   Input should be 'ping' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        | InitializeRequest.method\n        |   Input should be 'initialize' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        | InitializeRequest.params.protocolVersion\n        |   Field required [type=missing, input_value={'name': 'echo', 'argumen...text\": \"imnestedtext\"}'}, input_type=dict]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/missing\n        | InitializeRequest.params.capabilities\n        |   Field required [type=missing, input_value={'name': 'echo', 'argumen...text\": \"imnestedtext\"}'}, input_type=dict]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/missing\n        | InitializeRequest.params.clientInfo\n        |   Field required [type=missing, input_value={'name': 'echo', 'argumen...text\": \"imnestedtext\"}'}, input_type=dict]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/missing\n        | CompleteRequest.method\n        |   Input should be 'completion/complete' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        | CompleteRequest.params.ref\n        |   Field required [type=missing, input_value={'name': 'echo', 'argumen...text\": \"imnestedtext\"}'}, input_type=dict]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/missing\n        | CompleteRequest.params.argument\n        |   Field required [type=missing, input_value={'name': 'echo', 'argumen...text\": \"imnestedtext\"}'}, input_type=dict]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/missing\n        | SetLevelRequest.method\n        |   Input should be 'logging/setLevel' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        | SetLevelRequest.params.level\n        |   Field required [type=missing, input_value={'name': 'echo', 'argumen...text\": \"imnestedtext\"}'}, input_type=dict]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/missing\n        | GetPromptRequest.method\n        |   Input should be 'prompts/get' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        | GetPromptRequest.params.arguments\n        |   Input should be a valid dictionary [type=dict_type, input_value='{\"text\": \"imnestedtext\"}', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/dict_type\n        | ListPromptsRequest.method\n        |   Input should be 'prompts/list' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        | ListResourcesRequest.method\n        |   Input should be 'resources/list' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        | ListResourceTemplatesRequest.method\n        |   Input should be 'resources/templates/list' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        | ReadResourceRequest.method\n        |   Input should be 'resources/read' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        | ReadResourceRequest.params.uri\n        |   Field required [type=missing, input_value={'name': 'echo', 'argumen...text\": \"imnestedtext\"}'}, input_type=dict]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/missing\n        | SubscribeRequest.method\n        |   Input should be 'resources/subscribe' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        | SubscribeRequest.params.uri\n        |   Field required [type=missing, input_value={'name': 'echo', 'argumen...text\": \"imnestedtext\"}'}, input_type=dict]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/missing\n        | UnsubscribeRequest.method\n        |   Input should be 'resources/unsubscribe' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        | UnsubscribeRequest.params.uri\n        |   Field required [type=missing, input_value={'name': 'echo', 'argumen...text\": \"imnestedtext\"}'}, input_type=dict]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/missing\n        | CallToolRequest.params.arguments\n        |   Input should be a valid dictionary [type=dict_type, input_value='{\"text\": \"imnestedtext\"}', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/dict_type\n        | ListToolsRequest.method\n        |   Input should be 'tools/list' [type=literal_error, input_value='tools/call', input_type=str]\n        |     For further information visit https://errors.pydantic.dev/2.11/v/literal_error\n        +------------------------------------\n\n                    DEBUG    receive_response_body.complete                                                                                                                                                                      _trace.py:87\n                    DEBUG    response_closed.started                                                                                                                                                                             _trace.py:87\n                    DEBUG    response_closed.complete                                                                                                                                                                            _trace.py:87\nbreaking_response.status_code=200 breaking_response.text=''\n                    DEBUG    send_request_headers.started request=\u003cRequest [b'GET']\u003e                                                                                                                                             _trace.py:87\n                    DEBUG    send_request_headers.complete                                                                                                                                                                       _trace.py:87\n                    DEBUG    send_request_body.started request=\u003cRequest [b'GET']\u003e                                                                                                                                                _trace.py:87\n                    DEBUG    send_request_body.complete                                                                                                                                                                          _trace.py:87\n                    DEBUG    receive_response_headers.started request=\u003cRequest [b'GET']\u003e                                                                                                                                         _trace.py:87\nINFO:     127.0.0.1:51112 - \"GET /mcp/ HTTP/1.1\" 500 Internal Server Error\nERROR:    Exception in ASGI application\nTraceback (most recent call last):\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/uvicorn/protocols/http/h11_impl.py\", line 403, in run_asgi\n    result = await app(  # type: ignore[func-returns-value]\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n        self.scope, self.receive, self.send\n        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n    )\n    ^\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/uvicorn/middleware/proxy_headers.py\", line 60, in __call__\n    return await self.app(scope, receive, send)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/starlette/applications.py\", line 112, in __call__\n    await self.middleware_stack(scope, receive, send)\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/starlette/middleware/errors.py\", line 187, in __call__\n    raise exc\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/starlette/middleware/errors.py\", line 165, in __call__\n    await self.app(scope, receive, _send)\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/starlette/middleware/exceptions.py\", line 62, in __call__\n    await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/starlette/_exception_handler.py\", line 53, in wrapped_app\n    raise exc\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/starlette/_exception_handler.py\", line 42, in wrapped_app\n    await app(scope, receive, sender)\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/starlette/routing.py\", line 714, in __call__\n    await self.middleware_stack(scope, receive, send)\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/starlette/routing.py\", line 734, in app\n    await route.handle(scope, receive, send)\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/starlette/routing.py\", line 460, in handle\n    await self.app(scope, receive, send)\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/mcp/server/fastmcp/server.py\", line 786, in handle_streamable_http\n    await self.session_manager.handle_request(scope, receive, send)\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/mcp/server/streamable_http_manager.py\", line 137, in handle_request\n    raise RuntimeError(\"Task group is not initialized. Make sure to use run().\")\nRuntimeError: Task group is not initialized. Make sure to use run().\n                    DEBUG    receive_response_headers.complete return_value=(b'HTTP/1.1', 500, b'Internal Server Error', [(b'date', b'Tue, 27 May 2025 19:40:16 GMT'), (b'server', b'uvicorn'), (b'content-length', b'21'),      _trace.py:87\n                             (b'content-type', b'text/plain; charset=utf-8')])                                                                                                                                                               \n                    INFO     HTTP Request: GET http://127.0.0.1:8000/mcp/ \"HTTP/1.1 500 Internal Server Error\"                                                                                                                _client.py:1740\n                    DEBUG    receive_response_body.started request=\u003cRequest [b'GET']\u003e                                                                                                                                            _trace.py:87\n                    DEBUG    receive_response_body.complete                                                                                                                                                                      _trace.py:87\n                    DEBUG    response_closed.started                                                                                                                                                                             _trace.py:87\n                    DEBUG    response_closed.complete                                                                                                                                                                            _trace.py:87\n                    DEBUG    close.started                                                                                                                                                                                       _trace.py:87\n                    DEBUG    close.complete                                                                                                                                                                                      _trace.py:87\nget_response.status_code=500 get_response.text='Internal Server Error'\nTraceback (most recent call last):\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/bin/mre\", line 12, in \u003cmodule\u003e\n    sys.exit(main())\n             ~~~~^^\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/simple_echo_mre.py\", line 69, in main\n    asyncio.run(run_and_break_the_mcp())\n    ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"${HOME}/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/asyncio/runners.py\", line 195, in run\n    return runner.run(main)\n           ~~~~~~~~~~^^^^^^\n  File \"${HOME}/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/asyncio/runners.py\", line 118, in run\n    return self._loop.run_until_complete(task)\n           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^\n  File \"${HOME}/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/asyncio/base_events.py\", line 725, in run_until_complete\n    return future.result()\n           ~~~~~~~~~~~~~^^\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/simple_echo_mre.py\", line 62, in run_and_break_the_mcp\n    await breakit()\n  File \"${HOME}/.cache/uv/archive-v0/WBNLPmHcXZu1RxZu0HKOl/lib/python3.13/site-packages/simple_echo_mre.py\", line 54, in breakit\n    assert get_response.status_code \u003c 300, \"MCP is fully broken\"\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: MCP is fully broken\n```\n\n**Desktop (please complete the following information):**\n - OS: Linux\n - Browser [e.g. chrome, safari]\n - Version: 1.9.1\n\n**Additional context**\n- [Related minimal reproduction repository and instructions](https://github.com/Sillocan/fastmcp-mre-breaking-task-group-with-invalid-arguments/tree/main/python_sdk)\n","author":{"url":"https://github.com/Sillocan","@type":"Person","name":"Sillocan"},"datePublished":"2025-05-27T19:51:14.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":4},"url":"https://github.com/820/python-sdk/issues/820"}

route-pattern/_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format)
route-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:27cba754-9860-db8a-82f1-4817d580e18d
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-id9780:3778F5:438E77F:5EAA489:6A5FB0A5
html-safe-nonce46863bc4e760db0c819644733e2ee5126db289ce5aac13760efef8ce9dd14219
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5NzgwOjM3NzhGNTo0MzhFNzdGOjVFQUE0ODk6NkE1RkIwQTUiLCJ2aXNpdG9yX2lkIjoiNDY0NTg1MzUzNzMxODcxMTQ2MSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacc12789768c21dc30d9000d2bcdf5c56f678201f9d86e6f08e5bf4a5f01ad4d7b
hovercard-subject-tagissue:3095022738
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/modelcontextprotocol/python-sdk/820/issue_layout
twitter:imagehttps://opengraph.githubassets.com/e6c42c6ecc1b513192f85966d6262e78adf5a8487372fe0e87b53e8ba04732ea/modelcontextprotocol/python-sdk/issues/820
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/e6c42c6ecc1b513192f85966d6262e78adf5a8487372fe0e87b53e8ba04732ea/modelcontextprotocol/python-sdk/issues/820
og:image:altDescribe the bug When making a tools/call JSON-RPC request to the mcp server, passing the arguments parameter as a string instead of an object causes the server to stop responding to all HTTP reque...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernameSillocan
hostnamegithub.com
expected-hostnamegithub.com
None1ec7085bd7214c509393537f93bc21c48856549e31538b70bdb3cc4df7eb5f70
turbo-cache-controlno-preview
go-importgithub.com/modelcontextprotocol/python-sdk git https://github.com/modelcontextprotocol/python-sdk.git
octolytics-dimension-user_id182288589
octolytics-dimension-user_loginmodelcontextprotocol
octolytics-dimension-repository_id862584018
octolytics-dimension-repository_nwomodelcontextprotocol/python-sdk
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id862584018
octolytics-dimension-repository_network_root_nwomodelcontextprotocol/python-sdk
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
releaseb0ff0ab699186747983f122c82d4ebc71a1c22b4
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/modelcontextprotocol/python-sdk/issues/820#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmodelcontextprotocol%2Fpython-sdk%2Fissues%2F820
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
Code QualityEnforce quality at mergehttps://github.com/features/code-quality
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmodelcontextprotocol%2Fpython-sdk%2Fissues%2F820
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=modelcontextprotocol%2Fpython-sdk
Reloadhttps://github.com/modelcontextprotocol/python-sdk/issues/820
Reloadhttps://github.com/modelcontextprotocol/python-sdk/issues/820
Reloadhttps://github.com/modelcontextprotocol/python-sdk/issues/820
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/issues/820
modelcontextprotocol https://github.com/modelcontextprotocol
python-sdkhttps://github.com/modelcontextprotocol/python-sdk
Notifications https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk
Fork 3.7k https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk
Star 23.7k https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk
Code https://github.com/modelcontextprotocol/python-sdk
Issues 265 https://github.com/modelcontextprotocol/python-sdk/issues
Pull requests 311 https://github.com/modelcontextprotocol/python-sdk/pulls
Actions https://github.com/modelcontextprotocol/python-sdk/actions
Projects https://github.com/modelcontextprotocol/python-sdk/projects
Models https://github.com/modelcontextprotocol/python-sdk/models
Security and quality 6 https://github.com/modelcontextprotocol/python-sdk/security
Insights https://github.com/modelcontextprotocol/python-sdk/pulse
Code https://github.com/modelcontextprotocol/python-sdk
Issues https://github.com/modelcontextprotocol/python-sdk/issues
Pull requests https://github.com/modelcontextprotocol/python-sdk/pulls
Actions https://github.com/modelcontextprotocol/python-sdk/actions
Projects https://github.com/modelcontextprotocol/python-sdk/projects
Models https://github.com/modelcontextprotocol/python-sdk/models
Security and quality https://github.com/modelcontextprotocol/python-sdk/security
Insights https://github.com/modelcontextprotocol/python-sdk/pulse
tools/call with string arguments breaks mcp server until restarthttps://github.com/modelcontextprotocol/python-sdk/issues/820#top
https://github.com/Sillocan
Sillocanhttps://github.com/Sillocan
on May 27, 2025https://github.com/modelcontextprotocol/python-sdk/issues/820#issue-3095022738
https://github.com/Sillocan/fastmcp-mre-breaking-task-group-with-invalid-arguments/blob/main/python_sdk/simple_echo_mre.pyhttps://github.com/Sillocan/fastmcp-mre-breaking-task-group-with-invalid-arguments/blob/main/python_sdk/simple_echo_mre.py
Related minimal reproduction repository and instructionshttps://github.com/Sillocan/fastmcp-mre-breaking-task-group-with-invalid-arguments/tree/main/python_sdk
🐛 🛠https://github.com/orgs/modelcontextprotocol/projects/4
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.