Change middleware return types from list to Sequence

This fixes covariance issues in middleware method signatures by using
Sequence instead of list for return type annotations. Lists are invariant
while Sequences are covariant, allowing middleware subclasses to properly
type their return values.

Fixes #2055

Co-authored-by: William Easton <strawgate@users.noreply.github.com>
This commit is contained in:
claude[bot] 2025-10-10 23:59:57 +00:00
commit e196384a6a

View file

@ -1,7 +1,7 @@
from __future__ import annotations
import logging
from collections.abc import Awaitable
from collections.abc import Awaitable, Sequence
from dataclasses import dataclass, field, replace
from datetime import datetime, timezone
from functools import partial
@ -164,8 +164,10 @@ class Middleware:
async def on_read_resource(
self,
context: MiddlewareContext[mt.ReadResourceRequestParams],
call_next: CallNext[mt.ReadResourceRequestParams, list[ReadResourceContents]],
) -> list[ReadResourceContents]:
call_next: CallNext[
mt.ReadResourceRequestParams, Sequence[ReadResourceContents]
],
) -> Sequence[ReadResourceContents]:
return await call_next(context)
async def on_get_prompt(
@ -178,27 +180,29 @@ class Middleware:
async def on_list_tools(
self,
context: MiddlewareContext[mt.ListToolsRequest],
call_next: CallNext[mt.ListToolsRequest, list[Tool]],
) -> list[Tool]:
call_next: CallNext[mt.ListToolsRequest, Sequence[Tool]],
) -> Sequence[Tool]:
return await call_next(context)
async def on_list_resources(
self,
context: MiddlewareContext[mt.ListResourcesRequest],
call_next: CallNext[mt.ListResourcesRequest, list[Resource]],
) -> list[Resource]:
call_next: CallNext[mt.ListResourcesRequest, Sequence[Resource]],
) -> Sequence[Resource]:
return await call_next(context)
async def on_list_resource_templates(
self,
context: MiddlewareContext[mt.ListResourceTemplatesRequest],
call_next: CallNext[mt.ListResourceTemplatesRequest, list[ResourceTemplate]],
) -> list[ResourceTemplate]:
call_next: CallNext[
mt.ListResourceTemplatesRequest, Sequence[ResourceTemplate]
],
) -> Sequence[ResourceTemplate]:
return await call_next(context)
async def on_list_prompts(
self,
context: MiddlewareContext[mt.ListPromptsRequest],
call_next: CallNext[mt.ListPromptsRequest, list[Prompt]],
) -> list[Prompt]:
call_next: CallNext[mt.ListPromptsRequest, Sequence[Prompt]],
) -> Sequence[Prompt]:
return await call_next(context)