Skip to content

Commit 4784bfa

Browse files
committed
refactor(server): keep ResourceNotFoundError out of top-level mcpserver exports
Per review, MCPServer's top-level __all__ doesn't expose exception types. Template handlers that want to signal SEP-2164 not-found should import ResourceNotFoundError from mcp.server.mcpserver.exceptions (alongside ToolError). The template pass-through and behaviour are unchanged. Also clarifies the ResourceNotFoundError docstring to describe the template-handler contract.
1 parent cb93651 commit 4784bfa

4 files changed

Lines changed: 10 additions & 6 deletions

File tree

docs/migration.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ The internal layers (`ToolManager.call_tool`, `Tool.run`, `Prompt.render`, `Reso
345345

346346
### `ResourceManager.get_resource()` and `ResourceTemplate.create_resource()` raise typed exceptions
347347

348-
`ResourceManager.get_resource()` now raises `ResourceNotFoundError` (instead of `ValueError`) when no resource or template matches the URI. `ResourceTemplate.create_resource()` now raises `ResourceError` (instead of `ValueError`) when the template function fails. Neither subclasses `ValueError`, so callers catching `ValueError` should switch to `ResourceNotFoundError` / `ResourceError` (both importable from `mcp.server.mcpserver`). `MCPServer.read_resource()` continues to raise `ResourceError` and is unaffected.
348+
`ResourceManager.get_resource()` now raises `ResourceNotFoundError` (instead of `ValueError`) when no resource or template matches the URI. `ResourceTemplate.create_resource()` now raises `ResourceError` (instead of `ValueError`) when the template function fails. Neither subclasses `ValueError`, so callers catching `ValueError` should switch to `ResourceNotFoundError` / `ResourceError` (both importable from `mcp.server.mcpserver.exceptions`). `MCPServer.read_resource()` continues to raise `ResourceError` and is unaffected.
349349

350350
### Replace `RootModel` by union types with `TypeAdapter` validation
351351

src/mcp/server/mcpserver/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
from mcp.types import Icon
44

55
from .context import Context
6-
from .exceptions import ResourceError, ResourceNotFoundError
76
from .server import MCPServer
87
from .utilities.types import Audio, Image
98

10-
__all__ = ["MCPServer", "Context", "Image", "Audio", "Icon", "ResourceError", "ResourceNotFoundError"]
9+
__all__ = ["MCPServer", "Context", "Image", "Audio", "Icon"]

src/mcp/server/mcpserver/exceptions.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@ class ResourceError(MCPServerError):
1414

1515

1616
class ResourceNotFoundError(ResourceError):
17-
"""Resource does not exist."""
17+
"""Resource does not exist.
18+
19+
Raise this from a resource template handler to signal that the requested
20+
instance does not exist; clients receive ``-32602`` (invalid params) per
21+
SEP-2164.
22+
"""
1823

1924

2025
class ToolError(MCPServerError):

tests/server/mcpserver/test_server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
from mcp.client import Client
1313
from mcp.server.context import ServerRequestContext
1414
from mcp.server.experimental.request_context import Experimental
15-
from mcp.server.mcpserver import Context, MCPServer, ResourceNotFoundError
16-
from mcp.server.mcpserver.exceptions import ToolError
15+
from mcp.server.mcpserver import Context, MCPServer
16+
from mcp.server.mcpserver.exceptions import ResourceNotFoundError, ToolError
1717
from mcp.server.mcpserver.prompts.base import Message, UserMessage
1818
from mcp.server.mcpserver.resources import FileResource, FunctionResource
1919
from mcp.server.mcpserver.utilities.types import Audio, Image

0 commit comments

Comments
 (0)