2828from ..run_context import RunContextWrapper
2929from ..tool import ToolErrorFunction
3030from ..util ._types import MaybeAwaitable
31- from .util import HttpClientFactory , ToolFilter , ToolFilterContext , ToolFilterStatic
31+ from .util import (
32+ HttpClientFactory ,
33+ MCPToolMetaResolver ,
34+ ToolFilter ,
35+ ToolFilterContext ,
36+ ToolFilterStatic ,
37+ )
3238
3339
3440class RequireApprovalToolList (TypedDict , total = False ):
@@ -68,6 +74,7 @@ def __init__(
6874 use_structured_content : bool = False ,
6975 require_approval : RequireApprovalSetting = None ,
7076 failure_error_function : ToolErrorFunction | None | _UnsetType = _UNSET ,
77+ tool_meta_resolver : MCPToolMetaResolver | None = None ,
7178 ):
7279 """
7380 Args:
@@ -83,12 +90,15 @@ def __init__(
8390 a model-visible error message. If explicitly set to None, tool errors will be
8491 raised instead of converted. If left unset, the agent-level configuration (or
8592 SDK default) will be used.
93+ tool_meta_resolver: Optional callable that produces MCP request metadata (`_meta`) for
94+ tool calls. It is invoked by the Agents SDK before calling `call_tool`.
8695 """
8796 self .use_structured_content = use_structured_content
8897 self ._needs_approval_policy = self ._normalize_needs_approval (
8998 require_approval = require_approval
9099 )
91100 self ._failure_error_function = failure_error_function
101+ self .tool_meta_resolver = tool_meta_resolver
92102
93103 @abc .abstractmethod
94104 async def connect (self ):
@@ -121,7 +131,12 @@ async def list_tools(
121131 pass
122132
123133 @abc .abstractmethod
124- async def call_tool (self , tool_name : str , arguments : dict [str , Any ] | None ) -> CallToolResult :
134+ async def call_tool (
135+ self ,
136+ tool_name : str ,
137+ arguments : dict [str , Any ] | None ,
138+ meta : dict [str , Any ] | None = None ,
139+ ) -> CallToolResult :
125140 """Invoke a tool on the server."""
126141 pass
127142
@@ -258,6 +273,7 @@ def __init__(
258273 message_handler : MessageHandlerFnT | None = None ,
259274 require_approval : RequireApprovalSetting = None ,
260275 failure_error_function : ToolErrorFunction | None | _UnsetType = _UNSET ,
276+ tool_meta_resolver : MCPToolMetaResolver | None = None ,
261277 ):
262278 """
263279 Args:
@@ -288,11 +304,14 @@ def __init__(
288304 a model-visible error message. If explicitly set to None, tool errors will be
289305 raised instead of converted. If left unset, the agent-level configuration (or
290306 SDK default) will be used.
307+ tool_meta_resolver: Optional callable that produces MCP request metadata (`_meta`) for
308+ tool calls. It is invoked by the Agents SDK before calling `call_tool`.
291309 """
292310 super ().__init__ (
293311 use_structured_content = use_structured_content ,
294312 require_approval = require_approval ,
295313 failure_error_function = failure_error_function ,
314+ tool_meta_resolver = tool_meta_resolver ,
296315 )
297316 self .session : ClientSession | None = None
298317 self .exit_stack : AsyncExitStack = AsyncExitStack ()
@@ -561,15 +580,24 @@ async def list_tools(
561580 f"The server may have disconnected."
562581 ) from e
563582
564- async def call_tool (self , tool_name : str , arguments : dict [str , Any ] | None ) -> CallToolResult :
583+ async def call_tool (
584+ self ,
585+ tool_name : str ,
586+ arguments : dict [str , Any ] | None ,
587+ meta : dict [str , Any ] | None = None ,
588+ ) -> CallToolResult :
565589 """Invoke a tool on the server."""
566590 if not self .session :
567591 raise UserError ("Server not initialized. Make sure you call `connect()` first." )
568592 session = self .session
569593 assert session is not None
570594
571595 try :
572- return await self ._run_with_retries (lambda : session .call_tool (tool_name , arguments ))
596+ if meta is None :
597+ return await self ._run_with_retries (lambda : session .call_tool (tool_name , arguments ))
598+ return await self ._run_with_retries (
599+ lambda : session .call_tool (tool_name , arguments , meta = meta )
600+ )
573601 except httpx .HTTPStatusError as e :
574602 status_code = e .response .status_code
575603 raise UserError (
@@ -725,6 +753,7 @@ def __init__(
725753 message_handler : MessageHandlerFnT | None = None ,
726754 require_approval : RequireApprovalSetting = None ,
727755 failure_error_function : ToolErrorFunction | None | _UnsetType = _UNSET ,
756+ tool_meta_resolver : MCPToolMetaResolver | None = None ,
728757 ):
729758 """Create a new MCP server based on the stdio transport.
730759
@@ -760,17 +789,20 @@ def __init__(
760789 a model-visible error message. If explicitly set to None, tool errors will be
761790 raised instead of converted. If left unset, the agent-level configuration (or
762791 SDK default) will be used.
792+ tool_meta_resolver: Optional callable that produces MCP request metadata (`_meta`) for
793+ tool calls. It is invoked by the Agents SDK before calling `call_tool`.
763794 """
764795 super ().__init__ (
765- cache_tools_list ,
766- client_session_timeout_seconds ,
767- tool_filter ,
768- use_structured_content ,
769- max_retry_attempts ,
770- retry_backoff_seconds_base ,
796+ cache_tools_list = cache_tools_list ,
797+ client_session_timeout_seconds = client_session_timeout_seconds ,
798+ tool_filter = tool_filter ,
799+ use_structured_content = use_structured_content ,
800+ max_retry_attempts = max_retry_attempts ,
801+ retry_backoff_seconds_base = retry_backoff_seconds_base ,
771802 message_handler = message_handler ,
772803 require_approval = require_approval ,
773804 failure_error_function = failure_error_function ,
805+ tool_meta_resolver = tool_meta_resolver ,
774806 )
775807
776808 self .params = StdioServerParameters (
@@ -837,6 +869,7 @@ def __init__(
837869 message_handler : MessageHandlerFnT | None = None ,
838870 require_approval : RequireApprovalSetting = None ,
839871 failure_error_function : ToolErrorFunction | None | _UnsetType = _UNSET ,
872+ tool_meta_resolver : MCPToolMetaResolver | None = None ,
840873 ):
841874 """Create a new MCP server based on the HTTP with SSE transport.
842875
@@ -874,17 +907,20 @@ def __init__(
874907 a model-visible error message. If explicitly set to None, tool errors will be
875908 raised instead of converted. If left unset, the agent-level configuration (or
876909 SDK default) will be used.
910+ tool_meta_resolver: Optional callable that produces MCP request metadata (`_meta`) for
911+ tool calls. It is invoked by the Agents SDK before calling `call_tool`.
877912 """
878913 super ().__init__ (
879- cache_tools_list ,
880- client_session_timeout_seconds ,
881- tool_filter ,
882- use_structured_content ,
883- max_retry_attempts ,
884- retry_backoff_seconds_base ,
914+ cache_tools_list = cache_tools_list ,
915+ client_session_timeout_seconds = client_session_timeout_seconds ,
916+ tool_filter = tool_filter ,
917+ use_structured_content = use_structured_content ,
918+ max_retry_attempts = max_retry_attempts ,
919+ retry_backoff_seconds_base = retry_backoff_seconds_base ,
885920 message_handler = message_handler ,
886921 require_approval = require_approval ,
887922 failure_error_function = failure_error_function ,
923+ tool_meta_resolver = tool_meta_resolver ,
888924 )
889925
890926 self .params = params
@@ -954,6 +990,7 @@ def __init__(
954990 message_handler : MessageHandlerFnT | None = None ,
955991 require_approval : RequireApprovalSetting = None ,
956992 failure_error_function : ToolErrorFunction | None | _UnsetType = _UNSET ,
993+ tool_meta_resolver : MCPToolMetaResolver | None = None ,
957994 ):
958995 """Create a new MCP server based on the Streamable HTTP transport.
959996
@@ -992,17 +1029,20 @@ def __init__(
9921029 a model-visible error message. If explicitly set to None, tool errors will be
9931030 raised instead of converted. If left unset, the agent-level configuration (or
9941031 SDK default) will be used.
1032+ tool_meta_resolver: Optional callable that produces MCP request metadata (`_meta`) for
1033+ tool calls. It is invoked by the Agents SDK before calling `call_tool`.
9951034 """
9961035 super ().__init__ (
997- cache_tools_list ,
998- client_session_timeout_seconds ,
999- tool_filter ,
1000- use_structured_content ,
1001- max_retry_attempts ,
1002- retry_backoff_seconds_base ,
1036+ cache_tools_list = cache_tools_list ,
1037+ client_session_timeout_seconds = client_session_timeout_seconds ,
1038+ tool_filter = tool_filter ,
1039+ use_structured_content = use_structured_content ,
1040+ max_retry_attempts = max_retry_attempts ,
1041+ retry_backoff_seconds_base = retry_backoff_seconds_base ,
10031042 message_handler = message_handler ,
10041043 require_approval = require_approval ,
10051044 failure_error_function = failure_error_function ,
1045+ tool_meta_resolver = tool_meta_resolver ,
10061046 )
10071047
10081048 self .params = params
0 commit comments