datarobot-genai 0.1.66__tar.gz → 0.1.67__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/PKG-INFO +1 -1
  2. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/pyproject.toml +1 -1
  3. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/agents/base.py +7 -0
  4. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/custom_model.py +5 -0
  5. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/mcp/common.py +34 -11
  6. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/crewai/base.py +1 -0
  7. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/crewai/mcp.py +5 -1
  8. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/langgraph/agent.py +2 -0
  9. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/langgraph/mcp.py +7 -1
  10. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/llama_index/base.py +1 -0
  11. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/llama_index/mcp.py +6 -1
  12. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/.gitignore +0 -0
  13. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/AUTHORS +0 -0
  14. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/LICENSE +0 -0
  15. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/README.md +0 -0
  16. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/__init__.py +0 -0
  17. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/__init__.py +0 -0
  18. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/agents/__init__.py +0 -0
  19. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/chat/__init__.py +0 -0
  20. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/chat/auth.py +0 -0
  21. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/chat/client.py +0 -0
  22. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/chat/responses.py +0 -0
  23. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/cli/__init__.py +0 -0
  24. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/cli/agent_environment.py +0 -0
  25. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/cli/agent_kernel.py +0 -0
  26. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/mcp/__init__.py +0 -0
  27. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/telemetry_agent.py +0 -0
  28. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/utils/__init__.py +0 -0
  29. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/utils/auth.py +0 -0
  30. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/core/utils/urls.py +0 -0
  31. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/crewai/__init__.py +0 -0
  32. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/crewai/agent.py +0 -0
  33. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/crewai/events.py +0 -0
  34. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/__init__.py +0 -0
  35. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/__init__.py +0 -0
  36. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/auth.py +0 -0
  37. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/clients.py +0 -0
  38. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/config.py +0 -0
  39. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/config_utils.py +0 -0
  40. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/constants.py +0 -0
  41. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/credentials.py +0 -0
  42. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dr_mcp_server.py +0 -0
  43. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dr_mcp_server_logo.py +0 -0
  44. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_prompts/__init__.py +0 -0
  45. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_prompts/controllers.py +0 -0
  46. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_prompts/dr_lib.py +0 -0
  47. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_prompts/register.py +0 -0
  48. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_prompts/utils.py +0 -0
  49. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/__init__.py +0 -0
  50. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/__init__.py +0 -0
  51. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/__init__.py +0 -0
  52. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/base.py +0 -0
  53. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/default.py +0 -0
  54. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/drum.py +0 -0
  55. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/config.py +0 -0
  56. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/controllers.py +0 -0
  57. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/metadata.py +0 -0
  58. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/register.py +0 -0
  59. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_agentic_fallback_schema.json +0 -0
  60. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_prediction_fallback_schema.json +0 -0
  61. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/register.py +0 -0
  62. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/dynamic_tools/schema.py +0 -0
  63. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/exceptions.py +0 -0
  64. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/logging.py +0 -0
  65. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/mcp_instance.py +0 -0
  66. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/mcp_server_tools.py +0 -0
  67. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/memory_management/__init__.py +0 -0
  68. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/memory_management/manager.py +0 -0
  69. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/memory_management/memory_tools.py +0 -0
  70. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/routes.py +0 -0
  71. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/routes_utils.py +0 -0
  72. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/server_life_cycle.py +0 -0
  73. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/telemetry.py +0 -0
  74. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/tool_filter.py +0 -0
  75. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/core/utils.py +0 -0
  76. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/server.py +0 -0
  77. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/test_utils/__init__.py +0 -0
  78. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/test_utils/integration_mcp_server.py +0 -0
  79. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/test_utils/mcp_utils_ete.py +0 -0
  80. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/test_utils/mcp_utils_integration.py +0 -0
  81. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/test_utils/openai_llm_mcp_client.py +0 -0
  82. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/test_utils/tool_base_ete.py +0 -0
  83. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/test_utils/utils.py +0 -0
  84. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/tools/__init__.py +0 -0
  85. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/tools/predictive/__init__.py +0 -0
  86. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/tools/predictive/data.py +0 -0
  87. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/tools/predictive/deployment.py +0 -0
  88. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/tools/predictive/deployment_info.py +0 -0
  89. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/tools/predictive/model.py +0 -0
  90. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/tools/predictive/predict.py +0 -0
  91. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/tools/predictive/predict_realtime.py +0 -0
  92. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/tools/predictive/project.py +0 -0
  93. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/drmcp/tools/predictive/training.py +0 -0
  94. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/langgraph/__init__.py +0 -0
  95. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/llama_index/__init__.py +0 -0
  96. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/llama_index/agent.py +0 -0
  97. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/nat/__init__.py +0 -0
  98. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/nat/agent.py +0 -0
  99. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/nat/datarobot_llm_clients.py +0 -0
  100. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/nat/datarobot_llm_providers.py +0 -0
  101. {datarobot_genai-0.1.66 → datarobot_genai-0.1.67}/src/datarobot_genai/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datarobot-genai
3
- Version: 0.1.66
3
+ Version: 0.1.67
4
4
  Summary: Generic helpers for GenAI
5
5
  Project-URL: Homepage, https://github.com/datarobot-oss/datarobot-genai
6
6
  Author: DataRobot, Inc.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "datarobot-genai"
7
- version = "0.1.66"
7
+ version = "0.1.67"
8
8
  description = "Generic helpers for GenAI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10, <3.13"
@@ -52,6 +52,7 @@ class BaseAgent(Generic[TTool], abc.ABC):
52
52
  verbose: bool | str | None = True,
53
53
  timeout: int | None = 90,
54
54
  authorization_context: dict[str, Any] | None = None,
55
+ forwarded_headers: dict[str, str] | None = None,
55
56
  **_: Any,
56
57
  ) -> None:
57
58
  self.api_key = api_key or os.environ.get("DATAROBOT_API_TOKEN")
@@ -68,6 +69,7 @@ class BaseAgent(Generic[TTool], abc.ABC):
68
69
  self.verbose = bool(verbose)
69
70
  self._mcp_tools: list[TTool] = []
70
71
  self._authorization_context = authorization_context or {}
72
+ self._forwarded_headers: dict[str, str] = forwarded_headers or {}
71
73
 
72
74
  def set_mcp_tools(self, tools: list[TTool]) -> None:
73
75
  self._mcp_tools = tools
@@ -86,6 +88,11 @@ class BaseAgent(Generic[TTool], abc.ABC):
86
88
  """Return the authorization context for this agent."""
87
89
  return self._authorization_context
88
90
 
91
+ @property
92
+ def forwarded_headers(self) -> dict[str, str]:
93
+ """Return the forwarded headers for this agent."""
94
+ return self._forwarded_headers
95
+
89
96
  def litellm_api_base(self, deployment_id: str | None) -> str:
90
97
  return get_api_base(self.api_base, deployment_id)
91
98
 
@@ -139,6 +139,11 @@ def chat_entrypoint(
139
139
  completion_create_params["authorization_context"] = resolve_authorization_context(
140
140
  completion_create_params, **kwargs
141
141
  )
142
+ # Keep only allowed headers from the forwarded_headers.
143
+ incoming_headers = kwargs.get("headers", {}) or {}
144
+ allowed_headers = {"x-datarobot-api-token", "x-datarobot-api-key"}
145
+ forwarded_headers = {k: v for k, v in incoming_headers.items() if k.lower() in allowed_headers}
146
+ completion_create_params["forwarded_headers"] = forwarded_headers
142
147
 
143
148
  # Instantiate user agent with all supplied completion params including auth context
144
149
  agent = agent_cls(**completion_create_params)
@@ -16,6 +16,7 @@ import json
16
16
  import re
17
17
  from typing import Any
18
18
  from typing import Literal
19
+ from urllib.parse import urlparse
19
20
 
20
21
  from datarobot.core.config import DataRobotAppFrameworkBaseSettings
21
22
  from pydantic import field_validator
@@ -37,6 +38,7 @@ class MCPConfig(DataRobotAppFrameworkBaseSettings):
37
38
  datarobot_endpoint: str | None = None
38
39
  datarobot_api_token: str | None = None
39
40
  authorization_context: dict[str, Any] | None = None
41
+ forwarded_headers: dict[str, str] | None = None
40
42
 
41
43
  _auth_context_handler: AuthContextHeaderHandler | None = None
42
44
  _server_config: dict[str, Any] | None = None
@@ -121,18 +123,33 @@ class MCPConfig(DataRobotAppFrameworkBaseSettings):
121
123
  """
122
124
  if self.external_mcp_url:
123
125
  # External MCP URL - no authentication needed
126
+ headers: dict[str, str] = {}
127
+
128
+ # Forward headers for localhost connections
129
+ if self.forwarded_headers:
130
+ try:
131
+ parsed_url = urlparse(self.external_mcp_url)
132
+ hostname = parsed_url.hostname or ""
133
+ # Check if hostname is localhost or 127.0.0.1
134
+ if hostname in ("localhost", "127.0.0.1", "::1"):
135
+ headers.update(self.forwarded_headers)
136
+ except Exception:
137
+ # If URL parsing fails, fall back to simple string check
138
+ if "localhost" in self.external_mcp_url or "127.0.0.1" in self.external_mcp_url:
139
+ headers.update(self.forwarded_headers)
140
+
141
+ # Merge external headers if provided
124
142
  if self.external_mcp_headers:
125
- headers = json.loads(self.external_mcp_headers)
126
- else:
127
- headers = {}
143
+ external_headers = json.loads(self.external_mcp_headers)
144
+ headers.update(external_headers)
128
145
 
129
- config = {
146
+ return {
130
147
  "url": self.external_mcp_url.rstrip("/"),
131
148
  "transport": self.external_mcp_transport,
132
149
  "headers": headers,
133
150
  }
134
- return config
135
- elif self.mcp_deployment_id:
151
+
152
+ if self.mcp_deployment_id:
136
153
  # DataRobot deployment ID - requires authentication
137
154
  if self.datarobot_endpoint is None:
138
155
  raise ValueError(
@@ -142,15 +159,21 @@ class MCPConfig(DataRobotAppFrameworkBaseSettings):
142
159
  raise ValueError(
143
160
  "When using a DataRobot hosted MCP deployment, datarobot_api_token must be set."
144
161
  )
162
+
145
163
  base_url = self.datarobot_endpoint.rstrip("/")
146
164
  if not base_url.endswith("/api/v2"):
147
- base_url = base_url + "/api/v2"
165
+ base_url = f"{base_url}/api/v2"
166
+
148
167
  url = f"{base_url}/deployments/{self.mcp_deployment_id}/directAccess/mcp"
149
168
 
150
- headers = {
151
- **self._authorization_bearer_header(),
152
- **self._authorization_context_header(),
153
- }
169
+ # Start with forwarded headers if available
170
+ headers = {}
171
+ if self.forwarded_headers:
172
+ headers.update(self.forwarded_headers)
173
+
174
+ # Add authentication headers
175
+ headers.update(self._authorization_bearer_header())
176
+ headers.update(self._authorization_context_header())
154
177
 
155
178
  return {
156
179
  "url": url,
@@ -93,6 +93,7 @@ class CrewAIAgent(BaseAgent[BaseTool], abc.ABC):
93
93
  # Use MCP context manager to handle connection lifecycle
94
94
  with mcp_tools_context(
95
95
  authorization_context=self._authorization_context,
96
+ forwarded_headers=self.forwarded_headers,
96
97
  ) as mcp_tools:
97
98
  # Set MCP tools for all agents if MCP is not configured this is effectively a no-op
98
99
  self.set_mcp_tools(mcp_tools)
@@ -30,9 +30,13 @@ from datarobot_genai.core.mcp.common import MCPConfig
30
30
  @contextmanager
31
31
  def mcp_tools_context(
32
32
  authorization_context: dict[str, Any] | None = None,
33
+ forwarded_headers: dict[str, str] | None = None,
33
34
  ) -> Generator[list[Any], None, None]:
34
35
  """Context manager for MCP tools that handles connection lifecycle."""
35
- config = MCPConfig(authorization_context=authorization_context)
36
+ config = MCPConfig(
37
+ authorization_context=authorization_context,
38
+ forwarded_headers=forwarded_headers,
39
+ )
36
40
  # If no MCP server configured, return empty tools list
37
41
  if not config.server_config:
38
42
  print("No MCP server configured, using empty tools list", flush=True)
@@ -86,6 +86,7 @@ class LangGraphAgent(BaseAgent[BaseTool], abc.ABC):
86
86
  ]:
87
87
  async with mcp_tools_context(
88
88
  authorization_context=self._authorization_context,
89
+ forwarded_headers=self.forwarded_headers,
89
90
  ) as mcp_tools:
90
91
  self.set_mcp_tools(mcp_tools)
91
92
  result = await self._invoke(completion_create_params)
@@ -104,6 +105,7 @@ class LangGraphAgent(BaseAgent[BaseTool], abc.ABC):
104
105
  # For non-streaming, use async with directly
105
106
  async with mcp_tools_context(
106
107
  authorization_context=self._authorization_context,
108
+ forwarded_headers=self.forwarded_headers,
107
109
  ) as mcp_tools:
108
110
  self.set_mcp_tools(mcp_tools)
109
111
  result = await self._invoke(completion_create_params)
@@ -28,6 +28,7 @@ from datarobot_genai.core.mcp.common import MCPConfig
28
28
  @asynccontextmanager
29
29
  async def mcp_tools_context(
30
30
  authorization_context: dict[str, Any] | None = None,
31
+ forwarded_headers: dict[str, str] | None = None,
31
32
  ) -> AsyncGenerator[list[BaseTool], None]:
32
33
  """Yield a list of LangChain BaseTool instances loaded via MCP.
33
34
 
@@ -37,8 +38,13 @@ async def mcp_tools_context(
37
38
  ----------
38
39
  authorization_context : dict[str, Any] | None
39
40
  Authorization context to use for MCP connections
41
+ forwarded_headers : dict[str, str] | None
42
+ Forwarded headers, e.g. x-datarobot-api-key to use for MCP authentication
40
43
  """
41
- mcp_config = MCPConfig(authorization_context=authorization_context)
44
+ mcp_config = MCPConfig(
45
+ authorization_context=authorization_context,
46
+ forwarded_headers=forwarded_headers,
47
+ )
42
48
  server_config = mcp_config.server_config
43
49
 
44
50
  if not server_config:
@@ -84,6 +84,7 @@ class LlamaIndexAgent(BaseAgent[BaseTool], abc.ABC):
84
84
  # Load MCP tools (if configured) asynchronously before building workflow
85
85
  mcp_tools = await load_mcp_tools(
86
86
  authorization_context=self._authorization_context,
87
+ forwarded_headers=self.forwarded_headers,
87
88
  )
88
89
  self.set_mcp_tools(mcp_tools)
89
90
 
@@ -30,18 +30,23 @@ from datarobot_genai.core.mcp.common import MCPConfig
30
30
 
31
31
  async def load_mcp_tools(
32
32
  authorization_context: dict[str, Any] | None = None,
33
+ forwarded_headers: dict[str, str] | None = None,
33
34
  ) -> list[Any]:
34
35
  """
35
36
  Asynchronously load MCP tools for LlamaIndex.
36
37
 
37
38
  Args:
38
39
  authorization_context: Optional authorization context for MCP connections
40
+ forwarded_headers: Optional forwarded headers, e.g. x-datarobot-api-key for MCP auth
39
41
 
40
42
  Returns
41
43
  -------
42
44
  List of MCP tools, or empty list if no MCP configuration is present.
43
45
  """
44
- config = MCPConfig(authorization_context=authorization_context)
46
+ config = MCPConfig(
47
+ authorization_context=authorization_context,
48
+ forwarded_headers=forwarded_headers,
49
+ )
45
50
  server_params = config.server_config
46
51
 
47
52
  if not server_params: