|
31 | 31 | from mcp.server.lowlevel.server import LifespanResultT, Server |
32 | 32 | from mcp.server.lowlevel.server import lifespan as default_lifespan |
33 | 33 | from mcp.server.mcpserver.context import Context |
34 | | -from mcp.server.mcpserver.exceptions import ResourceError |
| 34 | +from mcp.server.mcpserver.exceptions import ResourceError, ResourceNotFoundError |
35 | 35 | from mcp.server.mcpserver.prompts import Prompt, PromptManager |
36 | 36 | from mcp.server.mcpserver.resources import FunctionResource, Resource, ResourceManager |
37 | 37 | from mcp.server.mcpserver.tools import Tool, ToolManager |
|
44 | 44 | from mcp.server.transport_security import TransportSecuritySettings |
45 | 45 | from mcp.shared.exceptions import MCPError |
46 | 46 | from mcp.types import ( |
| 47 | + INTERNAL_ERROR, |
| 48 | + INVALID_PARAMS, |
47 | 49 | Annotations, |
48 | 50 | BlobResourceContents, |
49 | 51 | CallToolRequestParams, |
@@ -341,7 +343,12 @@ async def _handle_read_resource( |
341 | 343 | self, ctx: ServerRequestContext[LifespanResultT], params: ReadResourceRequestParams |
342 | 344 | ) -> ReadResourceResult: |
343 | 345 | context = Context(request_context=ctx, mcp_server=self) |
344 | | - results = await self.read_resource(params.uri, context) |
| 346 | + try: |
| 347 | + results = await self.read_resource(params.uri, context) |
| 348 | + except ResourceNotFoundError as err: |
| 349 | + raise MCPError(code=INVALID_PARAMS, message=str(err), data={"uri": str(params.uri)}) |
| 350 | + except ResourceError as err: |
| 351 | + raise MCPError(code=INTERNAL_ERROR, message=str(err), data={"uri": str(params.uri)}) |
345 | 352 | contents: list[TextResourceContents | BlobResourceContents] = [] |
346 | 353 | for item in results: |
347 | 354 | if isinstance(item.content, bytes): |
@@ -442,13 +449,15 @@ async def list_resource_templates(self) -> list[MCPResourceTemplate]: |
442 | 449 | async def read_resource( |
443 | 450 | self, uri: AnyUrl | str, context: Context[LifespanResultT, Any] | None = None |
444 | 451 | ) -> Iterable[ReadResourceContents]: |
445 | | - """Read a resource by URI.""" |
| 452 | + """Read a resource by URI. |
| 453 | +
|
| 454 | + Raises: |
| 455 | + ResourceNotFoundError: If no resource or template matches the URI. |
| 456 | + ResourceError: If template creation or resource reading fails. |
| 457 | + """ |
446 | 458 | if context is None: |
447 | 459 | context = Context(mcp_server=self) |
448 | | - try: |
449 | | - resource = await self._resource_manager.get_resource(uri, context) |
450 | | - except ValueError as exc: |
451 | | - raise ResourceError(f"Unknown resource: {uri}") from exc |
| 460 | + resource = await self._resource_manager.get_resource(uri, context) |
452 | 461 |
|
453 | 462 | try: |
454 | 463 | content = await resource.read() |
|
0 commit comments