McpError is not pickle-safe and fails to unpickle
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 74/100
Rechercherichtung
Beginnen Sie bei McpError in mcp.shared.exceptions und reproduzieren Sie den Fehler mit dem bereitgestellten cloudpickle-Beispiel. Prüfen Sie, wie Exception.args die Exception beim Unpickling rekonstruiert, und verifizieren Sie anschließend, dass ein McpError-Round-Trip seine Nachricht und seine Fehler-Payload beibehält oder ohne Auslösen einer Exception degradiert.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Initial Checks
- I confirm that I'm using the latest version of MCP Python SDK
- I confirm that I searched for my issue in https://github.com/modelcontextprotocol/python-sdk/issues before opening this issue
Description
Summary
mcp.shared.exceptions.McpError does not survive a normal cloudpickle.dumps() / cloudpickle.loads() round-trip.
The failure appears to come from McpError.__init__ expecting an ErrorData object, while exception unpickling reconstructs it with a plain string from Exception.args.
This is surfacing for us through background task execution, but the bug reproduces without Docket/FastMCP task machinery.
Actual behavior
Unpickling fails with:
AttributeError: 'str' object has no attribute 'message'
Traceback points at McpError.__init__:
class McpError(Exception):
error: ErrorData
def __init__(self, error: ErrorData):
super().__init__(error.message)
self.error = error
Expected behavior
McpError(ErrorData(...)) should round-trip through pickle/cloudpickle without crashing.
At minimum, this should work:
- serialize
McpError - deserialize
McpError - preserve the message
- preserve the
errorpayload, or at least degrade safely without raising during unpickle
Suspected root cause
McpError stores error.message in Exception.args via super().__init__(error.message).
On unpickle, exception reconstruction uses args, so McpError is effectively reconstructed as:
McpError("Authentication Required")
But McpError.__init__ assumes error is always an ErrorData, so it does:
error.message
which crashes for str.
Suggested fix
McpError likely needs to be pickle-safe by design. Any of these would probably fix it:
- Make
__init__accept bothErrorDataandstr, normalizingstrinto anErrorData. - Implement
__reduce__so pickle reconstructs using the fullErrorData. - Ensure constructor args and exception state are aligned with standard exception pickling behavior.
A robust version would probably do both __reduce__ and tolerant initialization.
Notes
This bug is easy to misattribute to cloudpickle or task runners, but the reproducer above shows it is local to McpError itself.
Example Code
from importlib.metadata import version
import cloudpickle
from mcp.shared.exceptions import McpError
from mcp.types import ErrorData
print("Versions:")
print(f" mcp={version('mcp')}")
print(f" cloudpickle={version('cloudpickle')}")
original = McpError(ErrorData(code=-32600, message="Authentication Required"))
print("\nOriginal exception:")
print(f" type={type(original).__name__}")
print(f" str={str(original)!r}")
print(f" error_type={type(original.error).__name__}")
print(f" error_message={original.error.message!r}")
payload = cloudpickle.dumps(original)
print("\nUnpickling:")
restored = cloudpickle.loads(payload)
print(f" restored_type={type(restored).__name__}")
print(f" restored_args={restored.args!r}")
print(f" restored_error={getattr(restored, 'error', None)!r}")
Python & MCP Python SDK
- `mcp==1.26.0`
- `fastmcp==3.2.3`
- `cloudpickle==3.1.2`
- Python 3.13
- Vorherrschende Sprache
- Python
- Sterne
- 24.3k
- Forks
- 4k
- Ø Merge
- 1 T. 19 Min.
- Gemergte PRs (30 T.)
- 29
Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus modelcontextprotocol/python-sdk
-
v1 v2
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
modelcontextprotocol/python-sdk#3546 · 5 Kommentare ·
-
v1 v2
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
modelcontextprotocol/python-sdk#3545 · 1 Kommentar ·
-
v1 v2
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 91/100
modelcontextprotocol/python-sdk#3508 · 2 Kommentare ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 64/100
modelcontextprotocol/python-sdk#3504 ·
-
v1 v2
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
modelcontextprotocol/python-sdk#3492 · 1 Kommentar ·
Alle Issues in modelcontextprotocol/python-sdk
Ähnliche Issues
-
documentation help wanted
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 90/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 90/100
simonw/sqlite-utils#872 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100