Skip to content

Commit d119632

Browse files
authored
Merge pull request #1395 from Krashnicov/feat/settings-extensible-mcp-header-hook
feat: add @extensible to set_settings + resolve_mcp_server_headers hook in mcp_handler
2 parents 9390ba9 + 4e78190 commit d119632

2 files changed

Lines changed: 28 additions & 2 deletions

File tree

helpers/mcp_handler.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
from helpers import dirty_json
4343
from helpers.print_style import PrintStyle
4444
from helpers.tool import Tool, Response
45+
from helpers.extension import call_extensions_async
4546

4647

4748
def normalize_name(name: str) -> str:
@@ -1105,10 +1106,21 @@ async def _create_stdio_transport(
11051106
# Check if this is a streaming HTTP type
11061107
if _is_streaming_http_type(server.type):
11071108
# Use streamable HTTP client
1109+
# Before passing headers to httpx, allow extensions to resolve placeholders
1110+
resolved_headers = await call_extensions_async(
1111+
"resolve_mcp_server_headers",
1112+
agent=None,
1113+
server_name=server.name,
1114+
headers=dict(server.headers or {}),
1115+
)
1116+
if resolved_headers is not None:
1117+
headers_to_use = resolved_headers
1118+
else:
1119+
headers_to_use = server.headers
11081120
transport_result = await current_exit_stack.enter_async_context(
11091121
streamablehttp_client(
11101122
url=server.url,
1111-
headers=server.headers,
1123+
headers=headers_to_use,
11121124
timeout=timedelta(seconds=init_timeout),
11131125
sse_read_timeout=timedelta(seconds=tool_timeout),
11141126
httpx_client_factory=client_factory,
@@ -1123,10 +1135,21 @@ async def _create_stdio_transport(
11231135
return read_stream, write_stream
11241136
else:
11251137
# Use traditional SSE client (default behavior)
1138+
# Before passing headers to httpx, allow extensions to resolve placeholders
1139+
resolved_headers = await call_extensions_async(
1140+
"resolve_mcp_server_headers",
1141+
agent=None,
1142+
server_name=server.name,
1143+
headers=dict(server.headers or {}),
1144+
)
1145+
if resolved_headers is not None:
1146+
headers_to_use = resolved_headers
1147+
else:
1148+
headers_to_use = server.headers
11261149
stdio_transport = await current_exit_stack.enter_async_context(
11271150
sse_client(
11281151
url=server.url,
1129-
headers=server.headers,
1152+
headers=headers_to_use,
11301153
timeout=init_timeout,
11311154
sse_read_timeout=tool_timeout,
11321155
httpx_client_factory=client_factory,

helpers/settings.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from helpers.secrets import get_default_secrets_manager
1515
from helpers import dirty_json
1616
from helpers.notification import NotificationManager, NotificationType, NotificationPriority
17+
from helpers.extension import extensible
1718

1819

1920
T = TypeVar('T')
@@ -312,6 +313,7 @@ def set_runtime_settings_snapshot(settings: Settings) -> None:
312313
_runtime_settings_snapshot = settings.copy()
313314

314315

316+
@extensible
315317
def set_settings(settings: Settings, apply: bool = True):
316318
global _settings
317319
previous = _settings
@@ -322,6 +324,7 @@ def set_settings(settings: Settings, apply: bool = True):
322324
return reload_settings()
323325

324326

327+
@extensible
325328
def set_settings_delta(delta: dict, apply: bool = True):
326329
current = get_settings()
327330
new = {**current, **delta}

0 commit comments

Comments
 (0)