Spaces:
Sleeping
Sleeping
# coding: utf-8 | |
# Copyright (c) 2025 inclusionAI. | |
import asyncio | |
from typing import Any, Dict, List, Optional | |
from mcp.types import CallToolResult, Tool as MCPTool | |
from aworld.core.common import ActionResult | |
from aworld.logs.util import logger | |
from aworld.mcp_client.server import MCPServer | |
from aworld.tools.function_tools import get_function_tools, FunctionToolsAdapter as BaseAdapter | |
class FunctionToolsMCPAdapter(MCPServer): | |
"""Adapter for FunctionTools to MCPServer interface | |
This adapter allows FunctionTools to be used like a standard MCPServer, | |
supporting list_tools and call_tool methods. | |
""" | |
def __init__(self, name: str): | |
"""Initialize the adapter | |
Args: | |
name: Function tool server name | |
""" | |
self._adapter = BaseAdapter(name) | |
self._name = self._adapter.name | |
self._connected = False | |
def name(self) -> str: | |
"""Server name""" | |
return self._name | |
async def connect(self): | |
"""Connect to the server | |
For FunctionTools, this is a no-op since no actual connection is needed. | |
""" | |
self._connected = True | |
async def cleanup(self): | |
"""Clean up server resources | |
For FunctionTools, this is a no-op since there are no resources to clean up. | |
""" | |
self._connected = False | |
async def list_tools(self) -> List[MCPTool]: | |
"""List all tools and their descriptions | |
Returns: | |
List of tools | |
""" | |
if not self._connected: | |
await self.connect() | |
# Directly return the tool list from FunctionTools, which now returns MCPTool objects | |
return await self._adapter.list_tools() | |
async def call_tool(self, tool_name: str, arguments: Optional[Dict[str, Any]] = None) -> CallToolResult: | |
"""Call the specified tool function | |
Args: | |
tool_name: Tool name | |
arguments: Tool parameters | |
Returns: | |
Tool call result | |
""" | |
if not self._connected: | |
await self.connect() | |
# Use async method to call the tool | |
return await self._adapter.call_tool(tool_name, arguments) | |
def get_function_tools_mcp_adapter(name: str) -> FunctionToolsMCPAdapter: | |
"""Get MCP adapter for FunctionTools | |
Args: | |
name: Function tool server name | |
Returns: | |
MCPServer adapter | |
Raises: | |
ValueError: When the function tool server with the specified name does not exist | |
""" | |
function_tools = get_function_tools(name) | |
if not function_tools: | |
raise ValueError(f"FunctionTools '{name}' not found") | |
return FunctionToolsMCPAdapter(name) |