alita-sdk 0.3.430__py3-none-any.whl → 0.3.431__py3-none-any.whl
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.
Potentially problematic release.
This version of alita-sdk might be problematic. Click here for more details.
- alita_sdk/runtime/toolkits/mcp.py +73 -88
- alita_sdk/runtime/toolkits/tools.py +11 -1
- {alita_sdk-0.3.430.dist-info → alita_sdk-0.3.431.dist-info}/METADATA +1 -1
- {alita_sdk-0.3.430.dist-info → alita_sdk-0.3.431.dist-info}/RECORD +7 -7
- {alita_sdk-0.3.430.dist-info → alita_sdk-0.3.431.dist-info}/WHEEL +0 -0
- {alita_sdk-0.3.430.dist-info → alita_sdk-0.3.431.dist-info}/licenses/LICENSE +0 -0
- {alita_sdk-0.3.430.dist-info → alita_sdk-0.3.431.dist-info}/top_level.txt +0 -0
|
@@ -28,7 +28,7 @@ class McpToolkit(BaseToolkit):
|
|
|
28
28
|
"""
|
|
29
29
|
|
|
30
30
|
tools: List[BaseTool] = []
|
|
31
|
-
|
|
31
|
+
toolkit_name: Optional[str] = None
|
|
32
32
|
|
|
33
33
|
# Class variable (not Pydantic field) for tool name length limit
|
|
34
34
|
toolkit_max_length: ClassVar[int] = 0 # No limit for MCP tool names
|
|
@@ -63,15 +63,6 @@ class McpToolkit(BaseToolkit):
|
|
|
63
63
|
|
|
64
64
|
return create_model(
|
|
65
65
|
'mcp',
|
|
66
|
-
server_name=(
|
|
67
|
-
str,
|
|
68
|
-
Field(
|
|
69
|
-
description="MCP server name/identifier",
|
|
70
|
-
json_schema_extra={
|
|
71
|
-
'tooltip': 'Unique identifier for this MCP server'
|
|
72
|
-
}
|
|
73
|
-
)
|
|
74
|
-
),
|
|
75
66
|
url=(
|
|
76
67
|
str,
|
|
77
68
|
Field(
|
|
@@ -160,7 +151,6 @@ class McpToolkit(BaseToolkit):
|
|
|
160
151
|
@classmethod
|
|
161
152
|
def get_toolkit(
|
|
162
153
|
cls,
|
|
163
|
-
server_name: str,
|
|
164
154
|
url: str,
|
|
165
155
|
headers: Optional[Dict[str, str]] = None,
|
|
166
156
|
timeout: int = 60,
|
|
@@ -169,7 +159,7 @@ class McpToolkit(BaseToolkit):
|
|
|
169
159
|
selected_tools: List[str] = None,
|
|
170
160
|
enable_caching: bool = True,
|
|
171
161
|
cache_ttl: int = 300,
|
|
172
|
-
toolkit_name:
|
|
162
|
+
toolkit_name: str = None,
|
|
173
163
|
client = None,
|
|
174
164
|
**kwargs
|
|
175
165
|
) -> 'McpToolkit':
|
|
@@ -183,7 +173,6 @@ class McpToolkit(BaseToolkit):
|
|
|
183
173
|
4. Return all tools via get_tools() method
|
|
184
174
|
|
|
185
175
|
Args:
|
|
186
|
-
server_name: MCP server name/identifier
|
|
187
176
|
url: MCP server HTTP URL
|
|
188
177
|
headers: HTTP headers for authentication
|
|
189
178
|
timeout: Request timeout in seconds
|
|
@@ -192,7 +181,7 @@ class McpToolkit(BaseToolkit):
|
|
|
192
181
|
selected_tools: List of specific tools to enable (empty = all tools)
|
|
193
182
|
enable_caching: Whether to enable caching
|
|
194
183
|
cache_ttl: Cache TTL in seconds
|
|
195
|
-
toolkit_name:
|
|
184
|
+
toolkit_name: Toolkit name/identifier and prefix for tools
|
|
196
185
|
client: Alita client for MCP communication
|
|
197
186
|
**kwargs: Additional configuration options
|
|
198
187
|
|
|
@@ -201,8 +190,11 @@ class McpToolkit(BaseToolkit):
|
|
|
201
190
|
"""
|
|
202
191
|
if selected_tools is None:
|
|
203
192
|
selected_tools = []
|
|
193
|
+
|
|
194
|
+
if not toolkit_name:
|
|
195
|
+
raise ValueError("toolkit_name is required")
|
|
204
196
|
|
|
205
|
-
logger.info(f"Creating MCP toolkit
|
|
197
|
+
logger.info(f"Creating MCP toolkit: {toolkit_name}")
|
|
206
198
|
|
|
207
199
|
# Parse headers if they're provided as a JSON string
|
|
208
200
|
parsed_headers = headers
|
|
@@ -232,15 +224,14 @@ class McpToolkit(BaseToolkit):
|
|
|
232
224
|
raise ValueError(f"Invalid MCP connection configuration: {e}")
|
|
233
225
|
|
|
234
226
|
# Create toolkit instance
|
|
235
|
-
toolkit = cls(
|
|
227
|
+
toolkit = cls(toolkit_name=toolkit_name)
|
|
236
228
|
|
|
237
229
|
# Generate tools from the MCP server
|
|
238
230
|
toolkit.tools = cls._create_tools_from_server(
|
|
239
|
-
|
|
231
|
+
toolkit_name=toolkit_name,
|
|
240
232
|
connection_config=connection_config,
|
|
241
233
|
timeout=timeout,
|
|
242
234
|
selected_tools=selected_tools,
|
|
243
|
-
toolkit_name=toolkit_name,
|
|
244
235
|
client=client,
|
|
245
236
|
discovery_mode=discovery_mode
|
|
246
237
|
)
|
|
@@ -250,11 +241,10 @@ class McpToolkit(BaseToolkit):
|
|
|
250
241
|
@classmethod
|
|
251
242
|
def _create_tools_from_server(
|
|
252
243
|
cls,
|
|
253
|
-
|
|
244
|
+
toolkit_name: str,
|
|
254
245
|
connection_config: McpConnectionConfig,
|
|
255
246
|
timeout: int,
|
|
256
247
|
selected_tools: List[str],
|
|
257
|
-
toolkit_name: Optional[str],
|
|
258
248
|
client,
|
|
259
249
|
discovery_mode: str = "dynamic"
|
|
260
250
|
) -> List[BaseTool]:
|
|
@@ -265,11 +255,11 @@ class McpToolkit(BaseToolkit):
|
|
|
265
255
|
|
|
266
256
|
# First, try direct HTTP discovery since we have valid connection config
|
|
267
257
|
try:
|
|
268
|
-
logger.info(f"Discovering tools from MCP
|
|
258
|
+
logger.info(f"Discovering tools from MCP toolkit '{toolkit_name}' at {connection_config.url}")
|
|
269
259
|
|
|
270
260
|
# Use synchronous HTTP discovery for toolkit initialization
|
|
271
261
|
tool_metadata_list = cls._discover_tools_sync(
|
|
272
|
-
|
|
262
|
+
toolkit_name=toolkit_name,
|
|
273
263
|
connection_config=connection_config,
|
|
274
264
|
timeout=timeout
|
|
275
265
|
)
|
|
@@ -286,8 +276,7 @@ class McpToolkit(BaseToolkit):
|
|
|
286
276
|
for tool_metadata in tool_metadata_list:
|
|
287
277
|
server_tool = cls._create_tool_from_dict(
|
|
288
278
|
tool_dict=tool_metadata,
|
|
289
|
-
|
|
290
|
-
toolkit_name=toolkit_name or server_name,
|
|
279
|
+
toolkit_name=toolkit_name,
|
|
291
280
|
timeout=timeout,
|
|
292
281
|
client=client
|
|
293
282
|
)
|
|
@@ -295,34 +284,33 @@ class McpToolkit(BaseToolkit):
|
|
|
295
284
|
if server_tool:
|
|
296
285
|
tools.append(server_tool)
|
|
297
286
|
|
|
298
|
-
logger.info(f"Successfully created {len(tools)} MCP tools from
|
|
287
|
+
logger.info(f"Successfully created {len(tools)} MCP tools from toolkit '{toolkit_name}' via direct discovery")
|
|
299
288
|
|
|
300
289
|
except Exception as e:
|
|
301
|
-
logger.error(f"Direct discovery failed for MCP
|
|
290
|
+
logger.error(f"Direct discovery failed for MCP toolkit '{toolkit_name}': {e}")
|
|
302
291
|
|
|
303
292
|
# Fallback to static mode if available and not already static
|
|
304
293
|
if client and discovery_mode != "static":
|
|
305
|
-
logger.info(f"Falling back to static discovery for
|
|
306
|
-
tools = cls._create_tools_static(
|
|
294
|
+
logger.info(f"Falling back to static discovery for toolkit '{toolkit_name}'")
|
|
295
|
+
tools = cls._create_tools_static(toolkit_name, selected_tools, timeout, client)
|
|
307
296
|
else:
|
|
308
|
-
logger.warning(f"No fallback available for
|
|
297
|
+
logger.warning(f"No fallback available for toolkit '{toolkit_name}' - returning empty tools list")
|
|
309
298
|
|
|
310
299
|
# Always add the inspection tool (not subject to selected_tools filtering)
|
|
311
300
|
inspection_tool = cls._create_inspection_tool(
|
|
312
|
-
|
|
313
|
-
connection_config=connection_config
|
|
314
|
-
toolkit_name=toolkit_name or server_name
|
|
301
|
+
toolkit_name=toolkit_name,
|
|
302
|
+
connection_config=connection_config
|
|
315
303
|
)
|
|
316
304
|
if inspection_tool:
|
|
317
305
|
tools.append(inspection_tool)
|
|
318
|
-
logger.info(f"Added MCP inspection tool for
|
|
306
|
+
logger.info(f"Added MCP inspection tool for toolkit '{toolkit_name}'")
|
|
319
307
|
|
|
320
308
|
return tools
|
|
321
309
|
|
|
322
310
|
@classmethod
|
|
323
311
|
def _discover_tools_sync(
|
|
324
312
|
cls,
|
|
325
|
-
|
|
313
|
+
toolkit_name: str,
|
|
326
314
|
connection_config: McpConnectionConfig,
|
|
327
315
|
timeout: int
|
|
328
316
|
) -> List[Dict[str, Any]]:
|
|
@@ -340,7 +328,10 @@ class McpToolkit(BaseToolkit):
|
|
|
340
328
|
"params": {}
|
|
341
329
|
}
|
|
342
330
|
|
|
343
|
-
headers = {
|
|
331
|
+
headers = {
|
|
332
|
+
"Content-Type": "application/json",
|
|
333
|
+
"Accept": "application/json, text/event-stream"
|
|
334
|
+
}
|
|
344
335
|
if connection_config.headers:
|
|
345
336
|
headers.update(connection_config.headers)
|
|
346
337
|
|
|
@@ -362,19 +353,18 @@ class McpToolkit(BaseToolkit):
|
|
|
362
353
|
|
|
363
354
|
# Parse MCP response and extract tools
|
|
364
355
|
tools_data = data.get("result", {}).get("tools", [])
|
|
365
|
-
logger.info(f"Discovered {len(tools_data)} tools from MCP
|
|
356
|
+
logger.info(f"Discovered {len(tools_data)} tools from MCP toolkit '{toolkit_name}'")
|
|
366
357
|
|
|
367
358
|
return tools_data
|
|
368
359
|
|
|
369
360
|
except Exception as e:
|
|
370
|
-
logger.error(f"Failed to discover tools from MCP
|
|
361
|
+
logger.error(f"Failed to discover tools from MCP toolkit '{toolkit_name}': {e}")
|
|
371
362
|
raise
|
|
372
363
|
|
|
373
364
|
@classmethod
|
|
374
365
|
def _create_tool_from_dict(
|
|
375
366
|
cls,
|
|
376
367
|
tool_dict: Dict[str, Any],
|
|
377
|
-
server_name: str,
|
|
378
368
|
toolkit_name: str,
|
|
379
369
|
timeout: int,
|
|
380
370
|
client
|
|
@@ -384,31 +374,30 @@ class McpToolkit(BaseToolkit):
|
|
|
384
374
|
# Store toolkit_max_length in local variable to avoid contextual access issues
|
|
385
375
|
max_length_value = cls.toolkit_max_length
|
|
386
376
|
|
|
387
|
-
# Clean
|
|
388
|
-
clean_prefix = clean_string(
|
|
377
|
+
# Clean toolkit name for prefixing
|
|
378
|
+
clean_prefix = clean_string(toolkit_name, max_length_value)
|
|
389
379
|
|
|
390
380
|
full_tool_name = f'{clean_prefix}{TOOLKIT_SPLITTER}{tool_dict.get("name", "unknown")}'
|
|
391
381
|
|
|
392
382
|
return McpServerTool(
|
|
393
383
|
name=full_tool_name,
|
|
394
|
-
description=f"MCP tool '{tool_dict.get('name')}' from
|
|
384
|
+
description=f"MCP tool '{tool_dict.get('name')}' from toolkit '{toolkit_name}': {tool_dict.get('description', '')}",
|
|
395
385
|
args_schema=McpServerTool.create_pydantic_model_from_schema(
|
|
396
386
|
tool_dict.get("inputSchema", {})
|
|
397
387
|
),
|
|
398
388
|
client=client,
|
|
399
|
-
server=
|
|
389
|
+
server=toolkit_name,
|
|
400
390
|
tool_timeout_sec=timeout
|
|
401
391
|
)
|
|
402
392
|
except Exception as e:
|
|
403
|
-
logger.error(f"Failed to create MCP tool '{tool_dict.get('name')}' from
|
|
393
|
+
logger.error(f"Failed to create MCP tool '{tool_dict.get('name')}' from toolkit '{toolkit_name}': {e}")
|
|
404
394
|
return None
|
|
405
395
|
|
|
406
396
|
@classmethod
|
|
407
397
|
def _create_tools_static(
|
|
408
398
|
cls,
|
|
409
|
-
|
|
399
|
+
toolkit_name: str,
|
|
410
400
|
selected_tools: List[str],
|
|
411
|
-
toolkit_name: Optional[str],
|
|
412
401
|
timeout: int,
|
|
413
402
|
client
|
|
414
403
|
) -> List[BaseTool]:
|
|
@@ -421,10 +410,10 @@ class McpToolkit(BaseToolkit):
|
|
|
421
410
|
|
|
422
411
|
try:
|
|
423
412
|
all_toolkits = client.get_mcp_toolkits()
|
|
424
|
-
server_toolkit = next((tk for tk in all_toolkits if tk.get('name') ==
|
|
413
|
+
server_toolkit = next((tk for tk in all_toolkits if tk.get('name') == toolkit_name), None)
|
|
425
414
|
|
|
426
415
|
if not server_toolkit:
|
|
427
|
-
logger.warning(f"MCP
|
|
416
|
+
logger.warning(f"MCP toolkit '{toolkit_name}' not found in available toolkits")
|
|
428
417
|
return tools
|
|
429
418
|
|
|
430
419
|
# Extract tools from the toolkit
|
|
@@ -440,8 +429,7 @@ class McpToolkit(BaseToolkit):
|
|
|
440
429
|
|
|
441
430
|
# Create the tool
|
|
442
431
|
server_tool = cls._create_single_tool(
|
|
443
|
-
|
|
444
|
-
toolkit_name=toolkit_name or server_name,
|
|
432
|
+
toolkit_name=toolkit_name,
|
|
445
433
|
available_tool=available_tool,
|
|
446
434
|
timeout=timeout,
|
|
447
435
|
client=client
|
|
@@ -450,7 +438,7 @@ class McpToolkit(BaseToolkit):
|
|
|
450
438
|
if server_tool:
|
|
451
439
|
tools.append(server_tool)
|
|
452
440
|
|
|
453
|
-
logger.info(f"Successfully created {len(tools)} MCP tools from
|
|
441
|
+
logger.info(f"Successfully created {len(tools)} MCP tools from toolkit '{toolkit_name}' using static mode")
|
|
454
442
|
|
|
455
443
|
except Exception as e:
|
|
456
444
|
logger.error(f"Error in static tool creation: {e}")
|
|
@@ -461,15 +449,15 @@ class McpToolkit(BaseToolkit):
|
|
|
461
449
|
# We don't have full connection config in static mode, so create a basic one
|
|
462
450
|
# The inspection tool will work as long as the server is accessible
|
|
463
451
|
inspection_tool = McpInspectTool(
|
|
464
|
-
name=f"{clean_string(
|
|
465
|
-
server_name=
|
|
452
|
+
name=f"{clean_string(toolkit_name, 50)}{TOOLKIT_SPLITTER}mcp_inspect",
|
|
453
|
+
server_name=toolkit_name,
|
|
466
454
|
server_url="", # Will be populated by the client if available
|
|
467
|
-
description=f"Inspect available tools, prompts, and resources from MCP
|
|
455
|
+
description=f"Inspect available tools, prompts, and resources from MCP toolkit '{toolkit_name}'"
|
|
468
456
|
)
|
|
469
457
|
tools.append(inspection_tool)
|
|
470
|
-
logger.info(f"Added MCP inspection tool for
|
|
458
|
+
logger.info(f"Added MCP inspection tool for toolkit '{toolkit_name}' (static mode)")
|
|
471
459
|
except Exception as e:
|
|
472
|
-
logger.warning(f"Failed to create inspection tool for {
|
|
460
|
+
logger.warning(f"Failed to create inspection tool for {toolkit_name}: {e}")
|
|
473
461
|
|
|
474
462
|
return tools
|
|
475
463
|
|
|
@@ -505,7 +493,6 @@ class McpToolkit(BaseToolkit):
|
|
|
505
493
|
@classmethod
|
|
506
494
|
def _create_single_tool(
|
|
507
495
|
cls,
|
|
508
|
-
server_name: str,
|
|
509
496
|
toolkit_name: str,
|
|
510
497
|
available_tool: Dict[str, Any],
|
|
511
498
|
timeout: int,
|
|
@@ -516,51 +503,50 @@ class McpToolkit(BaseToolkit):
|
|
|
516
503
|
# Store toolkit_max_length in local variable to avoid contextual access issues
|
|
517
504
|
max_length_value = cls.toolkit_max_length
|
|
518
505
|
|
|
519
|
-
# Clean
|
|
520
|
-
clean_prefix = clean_string(
|
|
506
|
+
# Clean toolkit name for prefixing
|
|
507
|
+
clean_prefix = clean_string(toolkit_name, max_length_value)
|
|
521
508
|
|
|
522
509
|
full_tool_name = f'{clean_prefix}{TOOLKIT_SPLITTER}{available_tool["name"]}'
|
|
523
510
|
|
|
524
511
|
return McpServerTool(
|
|
525
512
|
name=full_tool_name,
|
|
526
|
-
description=f"MCP tool '{available_tool['name']}' from
|
|
513
|
+
description=f"MCP tool '{available_tool['name']}' from toolkit '{toolkit_name}': {available_tool.get('description', '')}",
|
|
527
514
|
args_schema=McpServerTool.create_pydantic_model_from_schema(
|
|
528
515
|
available_tool.get("inputSchema", {})
|
|
529
516
|
),
|
|
530
517
|
client=client,
|
|
531
|
-
server=
|
|
518
|
+
server=toolkit_name,
|
|
532
519
|
tool_timeout_sec=timeout
|
|
533
520
|
)
|
|
534
521
|
except Exception as e:
|
|
535
|
-
logger.error(f"Failed to create MCP tool '{available_tool.get('name')}' from
|
|
522
|
+
logger.error(f"Failed to create MCP tool '{available_tool.get('name')}' from toolkit '{toolkit_name}': {e}")
|
|
536
523
|
return None
|
|
537
524
|
|
|
538
525
|
@classmethod
|
|
539
526
|
def _create_inspection_tool(
|
|
540
527
|
cls,
|
|
541
|
-
|
|
542
|
-
connection_config: McpConnectionConfig
|
|
543
|
-
toolkit_name: str
|
|
528
|
+
toolkit_name: str,
|
|
529
|
+
connection_config: McpConnectionConfig
|
|
544
530
|
) -> Optional[BaseTool]:
|
|
545
|
-
"""Create the inspection tool for the MCP
|
|
531
|
+
"""Create the inspection tool for the MCP toolkit."""
|
|
546
532
|
try:
|
|
547
533
|
# Store toolkit_max_length in local variable to avoid contextual access issues
|
|
548
534
|
max_length_value = cls.toolkit_max_length
|
|
549
535
|
|
|
550
|
-
# Clean
|
|
551
|
-
clean_prefix = clean_string(
|
|
536
|
+
# Clean toolkit name for prefixing
|
|
537
|
+
clean_prefix = clean_string(toolkit_name, max_length_value)
|
|
552
538
|
|
|
553
539
|
full_tool_name = f'{clean_prefix}{TOOLKIT_SPLITTER}mcp_inspect'
|
|
554
540
|
|
|
555
541
|
return McpInspectTool(
|
|
556
542
|
name=full_tool_name,
|
|
557
|
-
server_name=
|
|
543
|
+
server_name=toolkit_name,
|
|
558
544
|
server_url=connection_config.url,
|
|
559
545
|
server_headers=connection_config.headers,
|
|
560
|
-
description=f"Inspect available tools, prompts, and resources from MCP
|
|
546
|
+
description=f"Inspect available tools, prompts, and resources from MCP toolkit '{toolkit_name}'"
|
|
561
547
|
)
|
|
562
548
|
except Exception as e:
|
|
563
|
-
logger.error(f"Failed to create MCP inspection tool for
|
|
549
|
+
logger.error(f"Failed to create MCP inspection tool for toolkit '{toolkit_name}': {e}")
|
|
564
550
|
return None
|
|
565
551
|
|
|
566
552
|
def get_tools(self) -> List[BaseTool]:
|
|
@@ -568,31 +554,31 @@ class McpToolkit(BaseToolkit):
|
|
|
568
554
|
return self.tools
|
|
569
555
|
|
|
570
556
|
async def refresh_tools(self):
|
|
571
|
-
"""Manually refresh tools from the MCP
|
|
572
|
-
if not self.
|
|
573
|
-
logger.warning("Cannot refresh tools:
|
|
557
|
+
"""Manually refresh tools from the MCP toolkit."""
|
|
558
|
+
if not self.toolkit_name:
|
|
559
|
+
logger.warning("Cannot refresh tools: toolkit_name not set")
|
|
574
560
|
return
|
|
575
561
|
|
|
576
562
|
try:
|
|
577
563
|
from ..clients.mcp_manager import get_mcp_manager
|
|
578
564
|
manager = get_mcp_manager()
|
|
579
|
-
await manager.refresh_server(self.
|
|
580
|
-
logger.info(f"Successfully refreshed tools for
|
|
565
|
+
await manager.refresh_server(self.toolkit_name)
|
|
566
|
+
logger.info(f"Successfully refreshed tools for toolkit {self.toolkit_name}")
|
|
581
567
|
except Exception as e:
|
|
582
|
-
logger.error(f"Failed to refresh tools for
|
|
568
|
+
logger.error(f"Failed to refresh tools for toolkit {self.toolkit_name}: {e}")
|
|
583
569
|
|
|
584
570
|
async def get_server_health(self) -> Dict[str, Any]:
|
|
585
|
-
"""Get health status of the configured MCP
|
|
586
|
-
if not self.
|
|
571
|
+
"""Get health status of the configured MCP toolkit."""
|
|
572
|
+
if not self.toolkit_name:
|
|
587
573
|
return {"status": "not_configured"}
|
|
588
574
|
|
|
589
575
|
try:
|
|
590
576
|
from ..clients.mcp_manager import get_mcp_manager
|
|
591
577
|
manager = get_mcp_manager()
|
|
592
|
-
health_info = await manager.get_server_health(self.
|
|
578
|
+
health_info = await manager.get_server_health(self.toolkit_name)
|
|
593
579
|
return health_info
|
|
594
580
|
except Exception as e:
|
|
595
|
-
logger.error(f"Failed to get server health for {self.
|
|
581
|
+
logger.error(f"Failed to get server health for {self.toolkit_name}: {e}")
|
|
596
582
|
return {"status": "error", "error": str(e)}
|
|
597
583
|
|
|
598
584
|
|
|
@@ -611,14 +597,14 @@ def get_tools(tool_config: dict, alita_client, llm=None, memory_store=None) -> L
|
|
|
611
597
|
List of configured MCP tools
|
|
612
598
|
"""
|
|
613
599
|
settings = tool_config.get('settings', {})
|
|
600
|
+
toolkit_name = tool_config.get('toolkit_name')
|
|
614
601
|
|
|
615
602
|
# Extract required fields
|
|
616
|
-
server_name = settings.get('server_name')
|
|
617
603
|
url = settings.get('url')
|
|
618
604
|
headers = settings.get('headers')
|
|
619
605
|
|
|
620
|
-
if not
|
|
621
|
-
logger.error("MCP toolkit configuration missing required '
|
|
606
|
+
if not toolkit_name:
|
|
607
|
+
logger.error("MCP toolkit configuration missing required 'toolkit_name'")
|
|
622
608
|
return []
|
|
623
609
|
|
|
624
610
|
if not url:
|
|
@@ -626,16 +612,15 @@ def get_tools(tool_config: dict, alita_client, llm=None, memory_store=None) -> L
|
|
|
626
612
|
return []
|
|
627
613
|
|
|
628
614
|
return McpToolkit.get_toolkit(
|
|
629
|
-
server_name=server_name,
|
|
630
615
|
url=url,
|
|
631
616
|
headers=headers,
|
|
632
617
|
timeout=settings.get('timeout', 60),
|
|
633
|
-
discovery_mode=settings.get('discovery_mode', '
|
|
618
|
+
discovery_mode=settings.get('discovery_mode', 'dynamic'),
|
|
634
619
|
discovery_interval=settings.get('discovery_interval', 300),
|
|
635
620
|
selected_tools=settings.get('selected_tools', []),
|
|
636
621
|
enable_caching=settings.get('enable_caching', True),
|
|
637
622
|
cache_ttl=settings.get('cache_ttl', 300),
|
|
638
|
-
toolkit_name=
|
|
623
|
+
toolkit_name=toolkit_name,
|
|
639
624
|
client=alita_client
|
|
640
625
|
).get_tools()
|
|
641
626
|
|
|
@@ -653,11 +638,11 @@ async def stop_global_discovery():
|
|
|
653
638
|
await shutdown_discovery_service()
|
|
654
639
|
|
|
655
640
|
|
|
656
|
-
async def register_mcp_server_for_discovery(
|
|
641
|
+
async def register_mcp_server_for_discovery(toolkit_name: str, connection_config):
|
|
657
642
|
"""Register an MCP server for global discovery."""
|
|
658
643
|
from ..clients.mcp_discovery import get_discovery_service
|
|
659
644
|
service = get_discovery_service()
|
|
660
|
-
await service.register_server(
|
|
645
|
+
await service.register_server(toolkit_name, connection_config)
|
|
661
646
|
|
|
662
647
|
|
|
663
648
|
def get_all_discovered_servers():
|
|
@@ -128,7 +128,8 @@ def get_tools(tools_list: list, alita_client, llm, memory_store: BaseStore = Non
|
|
|
128
128
|
tools += community_tools(tools_list, alita_client, llm)
|
|
129
129
|
# Add alita tools
|
|
130
130
|
tools += alita_tools(tools_list, alita_client, llm, memory_store)
|
|
131
|
-
# Add MCP tools
|
|
131
|
+
# Add MCP tools registered via alita-mcp CLI (static registry)
|
|
132
|
+
# Note: Tools with type='mcp' are already handled in main loop above
|
|
132
133
|
tools += _mcp_tools(tools_list, alita_client)
|
|
133
134
|
|
|
134
135
|
# Sanitize tool names to meet OpenAI's function naming requirements
|
|
@@ -183,6 +184,10 @@ def _sanitize_tool_names(tools: list) -> list:
|
|
|
183
184
|
|
|
184
185
|
|
|
185
186
|
def _mcp_tools(tools_list, alita):
|
|
187
|
+
"""
|
|
188
|
+
Handle MCP tools registered via alita-mcp CLI (static registry).
|
|
189
|
+
Skips tools with type='mcp' as those are handled by dynamic discovery.
|
|
190
|
+
"""
|
|
186
191
|
try:
|
|
187
192
|
all_available_toolkits = alita.get_mcp_toolkits()
|
|
188
193
|
toolkit_lookup = {tk["name"]: tk for tk in all_available_toolkits}
|
|
@@ -190,6 +195,11 @@ def _mcp_tools(tools_list, alita):
|
|
|
190
195
|
#
|
|
191
196
|
for selected_toolkit in tools_list:
|
|
192
197
|
server_toolkit_name = selected_toolkit['type']
|
|
198
|
+
|
|
199
|
+
# Skip tools with type='mcp' - they're handled by dynamic discovery
|
|
200
|
+
if server_toolkit_name == 'mcp':
|
|
201
|
+
continue
|
|
202
|
+
|
|
193
203
|
toolkit_conf = toolkit_lookup.get(server_toolkit_name)
|
|
194
204
|
#
|
|
195
205
|
if not toolkit_conf:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alita_sdk
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.431
|
|
4
4
|
Summary: SDK for building langchain agents using resources from Alita
|
|
5
5
|
Author-email: Artem Rozumenko <artyom.rozumenko@gmail.com>, Mikalai Biazruchka <mikalai_biazruchka@epam.com>, Roman Mitusov <roman_mitusov@epam.com>, Ivan Krakhmaliuk <lifedj27@gmail.com>, Artem Dubrovskiy <ad13box@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -103,10 +103,10 @@ alita_sdk/runtime/toolkits/application.py,sha256=HHAKgwKOckxc7EQG-AV7rz4POOzQJKF
|
|
|
103
103
|
alita_sdk/runtime/toolkits/artifact.py,sha256=YChNCX4QhVpaQG7Jk4TS-Wl0Aruc4slQ2K21zh9nNO0,3176
|
|
104
104
|
alita_sdk/runtime/toolkits/configurations.py,sha256=kIDAlnryPQfbZyFxV-9SzN2-Vefzx06TX1BBdIIpN90,141
|
|
105
105
|
alita_sdk/runtime/toolkits/datasource.py,sha256=qk78OdPoReYPCWwahfkKLbKc4pfsu-061oXRryFLP6I,2498
|
|
106
|
-
alita_sdk/runtime/toolkits/mcp.py,sha256=
|
|
106
|
+
alita_sdk/runtime/toolkits/mcp.py,sha256=BcXNhsAs92lgu-ApMu__C6COc60CR9OqkuAviPTPVCw,25256
|
|
107
107
|
alita_sdk/runtime/toolkits/prompt.py,sha256=WIpTkkVYWqIqOWR_LlSWz3ug8uO9tm5jJ7aZYdiGRn0,1192
|
|
108
108
|
alita_sdk/runtime/toolkits/subgraph.py,sha256=wwUK8JjPXkGzyVZ3tAukmvST6eGbqx_U11rpnmbrvtg,2105
|
|
109
|
-
alita_sdk/runtime/toolkits/tools.py,sha256=
|
|
109
|
+
alita_sdk/runtime/toolkits/tools.py,sha256=YCTjrTJuwj2V2C8ZQqXhFvUbVr7NQcUHZlCQLLvoeGA,10946
|
|
110
110
|
alita_sdk/runtime/toolkits/vectorstore.py,sha256=BGppQADa1ZiLO17fC0uCACTTEvPHlodEDYEzUcBRbAA,2901
|
|
111
111
|
alita_sdk/runtime/tools/__init__.py,sha256=Fx7iHqkzA90-KfjdcUUzMUI_7kDarjuTsSpSzOW2pN0,568
|
|
112
112
|
alita_sdk/runtime/tools/agent.py,sha256=m98QxOHwnCRTT9j18Olbb5UPS8-ZGeQaGiUyZJSyFck,3162
|
|
@@ -358,8 +358,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kT0TbmMvuKhDUZc0i7KO18O38JM9S
|
|
|
358
358
|
alita_sdk/tools/zephyr_squad/__init__.py,sha256=0ne8XLJEQSLOWfzd2HdnqOYmQlUliKHbBED5kW_Vias,2895
|
|
359
359
|
alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
|
|
360
360
|
alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
|
|
361
|
-
alita_sdk-0.3.
|
|
362
|
-
alita_sdk-0.3.
|
|
363
|
-
alita_sdk-0.3.
|
|
364
|
-
alita_sdk-0.3.
|
|
365
|
-
alita_sdk-0.3.
|
|
361
|
+
alita_sdk-0.3.431.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
362
|
+
alita_sdk-0.3.431.dist-info/METADATA,sha256=x-p6VpEH5cOUrBEOW-cES2TON6nVbBSuQny5aBsWTAQ,19071
|
|
363
|
+
alita_sdk-0.3.431.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
364
|
+
alita_sdk-0.3.431.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
|
|
365
|
+
alita_sdk-0.3.431.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|