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
Domain: github.com
{"@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-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:27cba754-9860-db8a-82f1-4817d580e18d |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 9780:3778F5:438E77F:5EAA489:6A5FB0A5 |
| html-safe-nonce | 46863bc4e760db0c819644733e2ee5126db289ce5aac13760efef8ce9dd14219 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5NzgwOjM3NzhGNTo0MzhFNzdGOjVFQUE0ODk6NkE1RkIwQTUiLCJ2aXNpdG9yX2lkIjoiNDY0NTg1MzUzNzMxODcxMTQ2MSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | c12789768c21dc30d9000d2bcdf5c56f678201f9d86e6f08e5bf4a5f01ad4d7b |
| hovercard-subject-tag | issue:3095022738 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/modelcontextprotocol/python-sdk/820/issue_layout |
| twitter:image | https://opengraph.githubassets.com/e6c42c6ecc1b513192f85966d6262e78adf5a8487372fe0e87b53e8ba04732ea/modelcontextprotocol/python-sdk/issues/820 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/e6c42c6ecc1b513192f85966d6262e78adf5a8487372fe0e87b53e8ba04732ea/modelcontextprotocol/python-sdk/issues/820 |
| og:image:alt | 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... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | Sillocan |
| hostname | github.com |
| expected-hostname | github.com |
| None | 1ec7085bd7214c509393537f93bc21c48856549e31538b70bdb3cc4df7eb5f70 |
| turbo-cache-control | no-preview |
| go-import | github.com/modelcontextprotocol/python-sdk git https://github.com/modelcontextprotocol/python-sdk.git |
| octolytics-dimension-user_id | 182288589 |
| octolytics-dimension-user_login | modelcontextprotocol |
| octolytics-dimension-repository_id | 862584018 |
| octolytics-dimension-repository_nwo | modelcontextprotocol/python-sdk |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 862584018 |
| octolytics-dimension-repository_network_root_nwo | modelcontextprotocol/python-sdk |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | b0ff0ab699186747983f122c82d4ebc71a1c22b4 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width