structure saas with tools
This commit is contained in:
parent
013641f0ec
commit
18a0676af1
@ -1,115 +0,0 @@
|
|||||||
import asyncio
|
|
||||||
import logging
|
|
||||||
from contextlib import AsyncExitStack
|
|
||||||
from typing import Dict, List, Optional, Tuple
|
|
||||||
from google.adk.tools.mcp_tool.mcp_toolset import (
|
|
||||||
MCPToolset,
|
|
||||||
StdioServerParameters,
|
|
||||||
SseServerParams,
|
|
||||||
)
|
|
||||||
from google.adk.tools import BaseTool
|
|
||||||
|
|
||||||
# Configuração do logger
|
|
||||||
logging.basicConfig(level=logging.INFO)
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class MCPBuilder:
|
|
||||||
def __init__(self, mcp_config: Dict):
|
|
||||||
"""
|
|
||||||
Inicializa o MCPBuilder com a configuração dos servidores MCP.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
mcp_config (Dict): Configuração dos servidores MCP no formato:
|
|
||||||
{
|
|
||||||
"mcpServers": {
|
|
||||||
"server_name": {
|
|
||||||
"command": "npx",
|
|
||||||
"args": ["-y", "@modelcontextprotocol/server-name"],
|
|
||||||
"env": {"API_KEY": "value"},
|
|
||||||
"url": "https://server-url/sse",
|
|
||||||
"headers": {"Authorization": "Bearer token"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
self.mcp_config = mcp_config
|
|
||||||
self.tools: List[BaseTool] = []
|
|
||||||
self.exit_stack = AsyncExitStack()
|
|
||||||
|
|
||||||
async def connect_to_mcp_server(self, server_name: str, server_config: Dict) -> Tuple[List[BaseTool], Optional[AsyncExitStack]]:
|
|
||||||
"""
|
|
||||||
Conecta a um servidor MCP específico e retorna suas ferramentas.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
server_name (str): Nome do servidor MCP
|
|
||||||
server_config (Dict): Configuração do servidor
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Tuple[List[BaseTool], Optional[AsyncExitStack]]: Lista de ferramentas e stack de saída
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
# Configura variáveis de ambiente se especificadas
|
|
||||||
if "env" in server_config:
|
|
||||||
for key, value in server_config["env"].items():
|
|
||||||
import os
|
|
||||||
os.environ[key] = value
|
|
||||||
|
|
||||||
# Determina os parâmetros de conexão baseado na configuração
|
|
||||||
if "url" in server_config:
|
|
||||||
connection_params = SseServerParams(
|
|
||||||
url=server_config["url"],
|
|
||||||
headers=server_config.get("headers", {})
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
connection_params = StdioServerParameters(
|
|
||||||
command=server_config["command"],
|
|
||||||
args=server_config["args"]
|
|
||||||
)
|
|
||||||
|
|
||||||
logger.info(f"Conectando ao servidor MCP: {server_name}")
|
|
||||||
tools, exit_stack = await MCPToolset.from_server(
|
|
||||||
connection_params=connection_params
|
|
||||||
)
|
|
||||||
return tools, exit_stack
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Erro ao conectar ao servidor MCP {server_name}: {str(e)}")
|
|
||||||
return [], None
|
|
||||||
|
|
||||||
async def build(self) -> Tuple[List[BaseTool], AsyncExitStack]:
|
|
||||||
"""
|
|
||||||
Constrói a lista de ferramentas MCP a partir da configuração.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Tuple[List[BaseTool], AsyncExitStack]: Lista de ferramentas e stack de saída
|
|
||||||
"""
|
|
||||||
self.tools = []
|
|
||||||
self.exit_stack = AsyncExitStack()
|
|
||||||
|
|
||||||
if "mcpServers" not in self.mcp_config:
|
|
||||||
logger.warning("Nenhuma configuração de servidor MCP encontrada")
|
|
||||||
return [], self.exit_stack
|
|
||||||
|
|
||||||
for server_name, server_config in self.mcp_config["mcpServers"].items():
|
|
||||||
try:
|
|
||||||
tools, exit_stack = await self.connect_to_mcp_server(server_name, server_config)
|
|
||||||
|
|
||||||
if tools and exit_stack:
|
|
||||||
# Filtrar ferramentas incompatíveis antes de adicionar
|
|
||||||
filtered_tools = self.filter_incompatible_tools(tools)
|
|
||||||
self.tools.extend(filtered_tools)
|
|
||||||
|
|
||||||
# Registrar o exit_stack com o AsyncExitStack
|
|
||||||
await self.exit_stack.enter_async_context(exit_stack)
|
|
||||||
logger.info(
|
|
||||||
f"Conectado com sucesso ao servidor {server_name}. "
|
|
||||||
f"Adicionadas {len(filtered_tools)} de {len(tools)} ferramentas."
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
logger.warning(f"Falha na conexão ou nenhuma ferramenta disponível para o servidor {server_name}")
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Erro ao conectar ao servidor MCP {server_name}: {str(e)}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
logger.info(f"MCP Toolset criado com sucesso. Total de {len(self.tools)} ferramentas.")
|
|
||||||
return self.tools, self.exit_stack
|
|
Loading…
Reference in New Issue
Block a user