* feat: allow lowlevel servers to return a list of resources The resource/read message in MCP allows of multiple resources to be returned. However, in the SDK we do not allow this. This change is such that we allow returning multiple resource in the lowlevel API if needed. However in FastMCP we stick to one, since a FastMCP resource defines the mime_type in the decorator and hence a resource cannot dynamically return different mime_typed resources. It also is just the better default to only return one resource. However in the lowlevel API we will allow this. Strictly speaking this is not a BC break since the new return value is additive, but if people subclassed server, it will break them. * feat: lower the type requriements for call_tool to Iterable
This commit is contained in:
parent
2eb9d1786a
commit
c8ce49c92d
1 changed files with 62 additions and 32 deletions
|
|
@ -1,3 +1,4 @@
|
|||
from collections.abc import Iterable
|
||||
from pathlib import Path
|
||||
from tempfile import NamedTemporaryFile
|
||||
|
||||
|
|
@ -26,8 +27,8 @@ async def test_read_resource_text(temp_file: Path):
|
|||
server = Server("test")
|
||||
|
||||
@server.read_resource()
|
||||
async def read_resource(uri: AnyUrl) -> ReadResourceContents:
|
||||
return ReadResourceContents(content="Hello World", mime_type="text/plain")
|
||||
async def read_resource(uri: AnyUrl) -> Iterable[ReadResourceContents]:
|
||||
return [ReadResourceContents(content="Hello World", mime_type="text/plain")]
|
||||
|
||||
# Get the handler directly from the server
|
||||
handler = server.request_handlers[types.ReadResourceRequest]
|
||||
|
|
@ -54,10 +55,12 @@ async def test_read_resource_binary(temp_file: Path):
|
|||
server = Server("test")
|
||||
|
||||
@server.read_resource()
|
||||
async def read_resource(uri: AnyUrl) -> ReadResourceContents:
|
||||
return ReadResourceContents(
|
||||
content=b"Hello World", mime_type="application/octet-stream"
|
||||
)
|
||||
async def read_resource(uri: AnyUrl) -> Iterable[ReadResourceContents]:
|
||||
return [
|
||||
ReadResourceContents(
|
||||
content=b"Hello World", mime_type="application/octet-stream"
|
||||
)
|
||||
]
|
||||
|
||||
# Get the handler directly from the server
|
||||
handler = server.request_handlers[types.ReadResourceRequest]
|
||||
|
|
@ -83,11 +86,13 @@ async def test_read_resource_default_mime(temp_file: Path):
|
|||
server = Server("test")
|
||||
|
||||
@server.read_resource()
|
||||
async def read_resource(uri: AnyUrl) -> ReadResourceContents:
|
||||
return ReadResourceContents(
|
||||
content="Hello World",
|
||||
# No mime_type specified, should default to text/plain
|
||||
)
|
||||
async def read_resource(uri: AnyUrl) -> Iterable[ReadResourceContents]:
|
||||
return [
|
||||
ReadResourceContents(
|
||||
content="Hello World",
|
||||
# No mime_type specified, should default to text/plain
|
||||
)
|
||||
]
|
||||
|
||||
# Get the handler directly from the server
|
||||
handler = server.request_handlers[types.ReadResourceRequest]
|
||||
|
|
|
|||
Loading…
Reference in a new issue