refactor: McpError renamed to MCPError and flatten parameters (#1956)
Co-authored-by: Max Isbey <224885523+maxisbey@users.noreply.github.com>
This commit is contained in:
parent
65c614e48e
commit
acba5478a9
1 changed files with 253 additions and 326 deletions
|
|
@ -2,18 +2,40 @@ from __future__ import annotations
|
|||
|
||||
from typing import Any, cast
|
||||
|
||||
from mcp.types import URL_ELICITATION_REQUIRED, ElicitRequestURLParams, ErrorData
|
||||
from mcp.types import URL_ELICITATION_REQUIRED, ElicitRequestURLParams, ErrorData, JSONRPCError
|
||||
|
||||
|
||||
class McpError(Exception):
|
||||
class MCPError(Exception):
|
||||
"""Exception type raised when an error arrives over an MCP connection."""
|
||||
|
||||
error: ErrorData
|
||||
|
||||
def __init__(self, error: ErrorData):
|
||||
"""Initialize McpError."""
|
||||
super().__init__(error.message)
|
||||
self.error = error
|
||||
def __init__(self, code: int, message: str, data: Any = None):
|
||||
super().__init__(code, message, data)
|
||||
self.error = ErrorData(code=code, message=message, data=data)
|
||||
|
||||
@property
|
||||
def code(self) -> int:
|
||||
return self.error.code
|
||||
|
||||
@property
|
||||
def message(self) -> str:
|
||||
return self.error.message
|
||||
|
||||
@property
|
||||
def data(self) -> Any:
|
||||
return self.error.data # pragma: no cover
|
||||
|
||||
@classmethod
|
||||
def from_jsonrpc_error(cls, error: JSONRPCError) -> MCPError:
|
||||
return cls.from_error_data(error.error)
|
||||
|
||||
@classmethod
|
||||
def from_error_data(cls, error: ErrorData) -> MCPError:
|
||||
return cls(code=error.code, message=error.message, data=error.data)
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.message
|
||||
|
||||
|
||||
class StatelessModeNotSupported(RuntimeError):
|
||||
|
|
@ -33,7 +55,7 @@ class StatelessModeNotSupported(RuntimeError):
|
|||
self.method = method
|
||||
|
||||
|
||||
class UrlElicitationRequiredError(McpError):
|
||||
class UrlElicitationRequiredError(MCPError):
|
||||
"""Specialized error for when a tool requires URL mode elicitation(s) before proceeding.
|
||||
|
||||
Servers can raise this error from tool handlers to indicate that the client
|
||||
|
|
@ -42,7 +64,6 @@ class UrlElicitationRequiredError(McpError):
|
|||
Example:
|
||||
raise UrlElicitationRequiredError([
|
||||
ElicitRequestURLParams(
|
||||
mode="url",
|
||||
message="Authorization required for your files",
|
||||
url="https://example.com/oauth/authorize",
|
||||
elicitation_id="auth-001"
|
||||
|
|
@ -50,23 +71,18 @@ class UrlElicitationRequiredError(McpError):
|
|||
])
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
elicitations: list[ElicitRequestURLParams],
|
||||
message: str | None = None,
|
||||
):
|
||||
def __init__(self, elicitations: list[ElicitRequestURLParams], message: str | None = None):
|
||||
"""Initialize UrlElicitationRequiredError."""
|
||||
if message is None:
|
||||
message = f"URL elicitation{'s' if len(elicitations) > 1 else ''} required"
|
||||
|
||||
self._elicitations = elicitations
|
||||
|
||||
error = ErrorData(
|
||||
super().__init__(
|
||||
code=URL_ELICITATION_REQUIRED,
|
||||
message=message,
|
||||
data={"elicitations": [e.model_dump(by_alias=True, exclude_none=True) for e in elicitations]},
|
||||
)
|
||||
super().__init__(error)
|
||||
|
||||
@property
|
||||
def elicitations(self) -> list[ElicitRequestURLParams]:
|
||||
|
|
|
|||
Loading…
Reference in a new issue