refactor: replace lowlevel Server decorators with on_* constructor kwargs (#1985)
This commit is contained in:
parent
d6d3ad9a7c
commit
0a22a9dc33
1 changed files with 3563 additions and 5481 deletions
|
|
@ -11,7 +11,7 @@ from inline_snapshot import snapshot
|
|||
from mcp import types
|
||||
from mcp.client._memory import InMemoryTransport
|
||||
from mcp.client.client import Client
|
||||
from mcp.server import Server
|
||||
from mcp.server import Server, ServerRequestContext
|
||||
from mcp.server.mcpserver import MCPServer
|
||||
from mcp.types import (
|
||||
CallToolResult,
|
||||
|
|
@ -41,33 +41,36 @@ pytestmark = pytest.mark.anyio
|
|||
@pytest.fixture
|
||||
def simple_server() -> Server:
|
||||
"""Create a simple MCP server for testing."""
|
||||
server = Server(name="test_server")
|
||||
|
||||
@server.list_resources()
|
||||
async def handle_list_resources():
|
||||
return [Resource(uri="memory://test", name="Test Resource", description="A test resource")]
|
||||
async def handle_list_resources(
|
||||
ctx: ServerRequestContext, params: types.PaginatedRequestParams | None
|
||||
) -> ListResourcesResult:
|
||||
return ListResourcesResult(
|
||||
resources=[Resource(uri="memory://test", name="Test Resource", description="A test resource")]
|
||||
)
|
||||
|
||||
@server.subscribe_resource()
|
||||
async def handle_subscribe_resource(uri: str):
|
||||
pass
|
||||
async def handle_subscribe_resource(ctx: ServerRequestContext, params: types.SubscribeRequestParams) -> EmptyResult:
|
||||
return EmptyResult()
|
||||
|
||||
@server.unsubscribe_resource()
|
||||
async def handle_unsubscribe_resource(uri: str):
|
||||
pass
|
||||
async def handle_unsubscribe_resource(
|
||||
ctx: ServerRequestContext, params: types.UnsubscribeRequestParams
|
||||
) -> EmptyResult:
|
||||
return EmptyResult()
|
||||
|
||||
@server.set_logging_level()
|
||||
async def handle_set_logging_level(level: str):
|
||||
pass
|
||||
async def handle_set_logging_level(ctx: ServerRequestContext, params: types.SetLevelRequestParams) -> EmptyResult:
|
||||
return EmptyResult()
|
||||
|
||||
@server.completion()
|
||||
async def handle_completion(
|
||||
ref: types.PromptReference | types.ResourceTemplateReference,
|
||||
argument: types.CompletionArgument,
|
||||
context: types.CompletionContext | None,
|
||||
) -> types.Completion | None:
|
||||
return types.Completion(values=[])
|
||||
async def handle_completion(ctx: ServerRequestContext, params: types.CompleteRequestParams) -> types.CompleteResult:
|
||||
return types.CompleteResult(completion=types.Completion(values=[]))
|
||||
|
||||
return server
|
||||
return Server(
|
||||
name="test_server",
|
||||
on_list_resources=handle_list_resources,
|
||||
on_subscribe_resource=handle_subscribe_resource,
|
||||
on_unsubscribe_resource=handle_unsubscribe_resource,
|
||||
on_set_logging_level=handle_set_logging_level,
|
||||
on_completion=handle_completion,
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
|
@ -202,19 +205,14 @@ async def test_client_send_progress_notification():
|
|||
"""Test sending progress notification."""
|
||||
received_from_client = None
|
||||
event = anyio.Event()
|
||||
server = Server(name="test_server")
|
||||
|
||||
@server.progress_notification()
|
||||
async def handle_progress_notification(
|
||||
progress_token: str | int,
|
||||
progress: float = 0.0,
|
||||
total: float | None = None,
|
||||
message: str | None = None,
|
||||
) -> None:
|
||||
async def handle_progress(ctx: ServerRequestContext, params: types.ProgressNotificationParams) -> None:
|
||||
nonlocal received_from_client
|
||||
received_from_client = {"progress_token": progress_token, "progress": progress}
|
||||
received_from_client = {"progress_token": params.progress_token, "progress": params.progress}
|
||||
event.set()
|
||||
|
||||
server = Server(name="test_server", on_progress=handle_progress)
|
||||
|
||||
async with Client(server) as client:
|
||||
await client.send_progress_notification(progress_token="token123", progress=50.0)
|
||||
await event.wait()
|
||||
|
|
|
|||
Loading…
Reference in a new issue