Skip to content

Commit 30f4e7f

Browse files
committed
Cleanup MCP error naming and usage.
1 parent 3000511 commit 30f4e7f

File tree

3 files changed

+22
-21
lines changed

3 files changed

+22
-21
lines changed

pydantic_ai_slim/pydantic_ai/exceptions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
'UsageLimitExceeded',
2525
'ModelHTTPError',
2626
'MCPError',
27-
'ServerCapabilitiesError',
27+
'MCPServerCapabilitiesError',
2828
'MCPServerError',
2929
'FallbackExceptionGroup',
3030
)
@@ -175,7 +175,7 @@ def __str__(self) -> str:
175175
return self.message
176176

177177

178-
class ServerCapabilitiesError(MCPError):
178+
class MCPServerCapabilitiesError(MCPError):
179179
"""Raised when attempting to access server capabilities that aren't present."""
180180

181181

pydantic_ai_slim/pydantic_ai/mcp.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
from mcp.client.sse import sse_client
3232
from mcp.client.stdio import StdioServerParameters, stdio_client
3333
from mcp.client.streamable_http import GetSessionIdCallback, streamablehttp_client
34+
from mcp.shared import exceptions as mcp_exceptions
3435
from mcp.shared.context import RequestContext
35-
from mcp.shared.exceptions import McpError
3636
from mcp.shared.message import SessionMessage
3737
except ImportError as _import_error:
3838
raise ImportError(
@@ -42,6 +42,7 @@
4242

4343
# after mcp imports so any import error maps to this file, not _mcp.py
4444
from . import _mcp, _utils, exceptions, messages, models
45+
from .exceptions import MCPServerCapabilitiesError, MCPServerError
4546

4647
__all__ = 'MCPServer', 'MCPServerStdio', 'MCPServerHTTP', 'MCPServerSSE', 'MCPServerStreamableHTTP', 'load_mcp_servers'
4748

@@ -246,7 +247,7 @@ async def direct_call_tool(
246247
),
247248
mcp_types.CallToolResult,
248249
)
249-
except McpError as e:
250+
except mcp_exceptions.McpError as e:
250251
raise exceptions.ModelRetry(e.error.message)
251252

252253
if result.isError:
@@ -321,32 +322,32 @@ async def list_resources(self) -> list[_mcp.Resource]:
321322
- We also don't subscribe to resource changes to avoid complexity.
322323
323324
Raises:
324-
ServerCapabilitiesError: If the server does not support resources.
325+
MCPServerCapabilitiesError: If the server does not support resources.
325326
MCPServerError: If the server returns an error.
326327
"""
327328
async with self: # Ensure server is running
328329
if not self.capabilities.resources:
329-
raise exceptions.ServerCapabilitiesError('Server does not support resources capability')
330+
raise MCPServerCapabilitiesError('Server does not support resources capability')
330331
try:
331332
result = await self._client.list_resources()
332-
except McpError as e:
333-
raise exceptions.MCPServerError.from_mcp_sdk_error(e) from e
333+
except mcp_exceptions.McpError as e:
334+
raise MCPServerError.from_mcp_sdk_error(e) from e
334335
return [_mcp.map_from_mcp_resource(r) for r in result.resources]
335336

336337
async def list_resource_templates(self) -> list[_mcp.ResourceTemplate]:
337338
"""Retrieve resource templates that are currently present on the server.
338339
339340
Raises:
340-
ServerCapabilitiesError: If the server does not support resources.
341+
MCPServerCapabilitiesError: If the server does not support resources.
341342
MCPServerError: If the server returns an error.
342343
"""
343344
async with self: # Ensure server is running
344345
if not self.capabilities.resources:
345-
raise exceptions.ServerCapabilitiesError('Server does not support resources capability')
346+
raise MCPServerCapabilitiesError('Server does not support resources capability')
346347
try:
347348
result = await self._client.list_resource_templates()
348-
except McpError as e:
349-
raise exceptions.MCPServerError.from_mcp_sdk_error(e) from e
349+
except mcp_exceptions.McpError as e:
350+
raise MCPServerError.from_mcp_sdk_error(e) from e
350351
return [_mcp.map_from_mcp_resource_template(t) for t in result.resourceTemplates]
351352

352353
@overload
@@ -370,17 +371,17 @@ async def read_resource(
370371
If the resource has multiple content items, returns a list of items.
371372
372373
Raises:
373-
ServerCapabilitiesError: If the server does not support resources.
374+
MCPServerCapabilitiesError: If the server does not support resources.
374375
MCPServerError: If the server returns an error (e.g., resource not found).
375376
"""
376377
resource_uri = uri if isinstance(uri, str) else uri.uri
377378
async with self: # Ensure server is running
378379
if not self.capabilities.resources:
379-
raise exceptions.ServerCapabilitiesError('Server does not support resources capability')
380+
raise MCPServerCapabilitiesError('Server does not support resources capability')
380381
try:
381382
result = await self._client.read_resource(AnyUrl(resource_uri))
382-
except McpError as e:
383-
raise exceptions.MCPServerError.from_mcp_sdk_error(e) from e
383+
except mcp_exceptions.McpError as e:
384+
raise MCPServerError.from_mcp_sdk_error(e) from e
384385
return (
385386
self._get_content(result.contents[0])
386387
if len(result.contents) == 1

tests/test_mcp.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
from pydantic_ai._mcp import Resource, ServerCapabilities
2727
from pydantic_ai.agent import Agent
2828
from pydantic_ai.exceptions import (
29+
MCPServerCapabilitiesError,
2930
MCPServerError,
3031
ModelRetry,
31-
ServerCapabilitiesError,
3232
UnexpectedModelBehavior,
3333
UserError,
3434
)
@@ -1603,16 +1603,16 @@ async def test_capabilities(mcp_server: MCPServerStdio) -> None:
16031603

16041604

16051605
async def test_resource_methods_without_capability(mcp_server: MCPServerStdio) -> None:
1606-
"""Test that resource methods raise ServerCapabilitiesError when resources capability is not available."""
1606+
"""Test that resource methods raise MCPServerCapabilitiesError when resources capability is not available."""
16071607
async with mcp_server:
16081608
# Mock the capabilities to not support resources
16091609
mock_capabilities = ServerCapabilities(resources=False)
16101610
with patch.object(mcp_server, '_server_capabilities', mock_capabilities):
1611-
with pytest.raises(ServerCapabilitiesError, match='Server does not support resources capability'):
1611+
with pytest.raises(MCPServerCapabilitiesError, match='Server does not support resources capability'):
16121612
await mcp_server.list_resources()
16131613

1614-
with pytest.raises(ServerCapabilitiesError, match='Server does not support resources capability'):
1614+
with pytest.raises(MCPServerCapabilitiesError, match='Server does not support resources capability'):
16151615
await mcp_server.list_resource_templates()
16161616

1617-
with pytest.raises(ServerCapabilitiesError, match='Server does not support resources capability'):
1617+
with pytest.raises(MCPServerCapabilitiesError, match='Server does not support resources capability'):
16181618
await mcp_server.read_resource('resource://test')

0 commit comments

Comments
 (0)