From 68c4475e2418fecce70ccd03ea245ebb585294a4 Mon Sep 17 00:00:00 2001 From: Nik <84yk8btb9f@privaterelay.appleid.com> Date: Wed, 21 Oct 2026 07:33:44 +0300 Subject: [PATCH] fix(prompts): await awaitable result returned by sync prompt callback (#3709) Closes #3709. --- src/mcp/server/mcpserver/prompts/base.py | 4 ++++ tests/server/mcpserver/prompts/test_base.py | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/mcp/server/mcpserver/prompts/base.py b/src/mcp/server/mcpserver/prompts/base.py index 32372a527a..c7b7c302b3 100644 --- a/src/mcp/server/mcpserver/prompts/base.py +++ b/src/mcp/server/mcpserver/prompts/base.py @@ -3,6 +3,7 @@ from __future__ import annotations import functools +import inspect from collections.abc import Awaitable, Callable, Sequence from typing import TYPE_CHECKING, Annotated, Any, Literal @@ -188,6 +189,9 @@ async def render( else: result = await anyio.to_thread.run_sync(functools.partial(self.fn, **call_args)) + if inspect.isawaitable(result): + result = await result + if isinstance(result, InputRequiredResult): return result diff --git a/tests/server/mcpserver/prompts/test_base.py b/tests/server/mcpserver/prompts/test_base.py index 1136cc19cb..2afb1cc4c4 100644 --- a/tests/server/mcpserver/prompts/test_base.py +++ b/tests/server/mcpserver/prompts/test_base.py @@ -1,4 +1,5 @@ import threading +from collections.abc import Awaitable from pathlib import Path from typing import Any @@ -332,3 +333,20 @@ def fn() -> Image: with pytest.raises(ValueError): await Prompt.from_function(fn).render(None, Context()) + + +@pytest.mark.anyio +async def test_prompt_render_awaits_awaitable_returned_by_sync_callback(): + async def resolve() -> list[str]: + return [] + + coroutine = resolve() + + def prompt() -> Awaitable[list[str]]: + return coroutine + + try: + messages = await Prompt.from_function(prompt).render(None, Context()) + finally: + coroutine.close() + assert messages == []