awesome-llm-apps/mcp_ai_agents/enterprise_orchestrator_team/agent.py
Shubhamsaboo 53dfb652bf feat: add AI Real Estate Agent Team and Enterprise MCP AI Agent Team
- Introduced a new AI Real Estate Agent Team with multi-agent capabilities for property search, market analysis, and valuation.
- Added comprehensive README documentation detailing features, setup instructions, and API requirements.
- Implemented the Enterprise MCP AI Agent Team for orchestrating knowledge management across local files and SaaS platforms, including specialized agents for Notion, GitHub, and Figma.
- Enhanced the overall architecture with intelligent routing and task delegation using the Model Context Protocol (MCP).
- Included necessary requirements for both teams to ensure proper functionality.
2025-08-03 18:01:01 -05:00

413 lines
No EOL
16 KiB
Python

import os
import asyncio
import logging
from typing import Dict, List, Optional, Any
from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, StdioServerParameters, SseServerParams
# Load environment variables
load_dotenv()
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Environment variable configuration
MCP_FILESYSTEM_PATH = os.getenv("MCP_FILESYSTEM_PATH", "~/Documents")
NOTION_API_KEY = os.getenv("NOTION_API_KEY")
GITHUB_API_KEY = os.getenv("GITHUB_API_KEY")
FIGMA_API_KEY = os.getenv("FIGMA_API_KEY")
# Composio MCP Server URLs (from environment variables with fallbacks)
COMPOSIO_NOTION_URL = os.getenv("COMPOSIO_NOTION_URL")
COMPOSIO_GITHUB_URL = os.getenv("COMPOSIO_GITHUB_URL")
COMPOSIO_FIGMA_URL = os.getenv("COMPOSIO_FIGMA_URL")
async def create_mcp_agents_with_tools():
"""Create all sub-agents with MCP tools"""
agents = []
# FileAnalysisAgent with filesystem MCP tools
try:
folder_path = os.path.expanduser(MCP_FILESYSTEM_PATH)
folder_path = os.path.abspath(folder_path)
if not os.path.exists(folder_path):
os.makedirs(folder_path, exist_ok=True)
logger.info(f"Created directory: {folder_path}")
logger.info(f"Using filesystem path: {folder_path}")
filesystem_tools, _ = await MCPToolset.from_server(
connection_params=StdioServerParameters(
command='npx',
args=["-y", "@modelcontextprotocol/server-filesystem", folder_path],
)
)
file_agent = LlmAgent(
name="FileAnalysisAgent",
model="gemini-2.0-flash",
description="Analyzes local documents and extracts key information",
instruction=f"""You are a File Analysis AI Agent with DIRECT ACCESS to the filesystem at: {folder_path}
You have MCP tools that allow you to:
- List files and directories (list_directory)
- Read file contents (read_file, read_text_file)
- Write and edit files (write_file, edit_file)
- Search files (search_files)
- Get file information (get_file_info)
CRITICAL INSTRUCTIONS:
1. You have REAL filesystem access through MCP tools
2. When users ask about files, USE YOUR TOOLS to access them directly
3. Do NOT ask users to provide files - you can access them yourself
4. Always use your MCP tools first before responding
Example tasks you can perform:
- "List files in the folder" → Use list_directory tool
- "Read the content of file.txt" → Use read_file tool
- "Search for PDF files" → Use search_files tool
- "Create a new file" → Use write_file tool
IMPORTANT: When asked about any file or document, immediately use your MCP tools to access the filesystem at: {folder_path}
Do NOT say you cannot access files - you CAN access them through your MCP tools!""",
tools=filesystem_tools
)
agents.append(file_agent)
logger.info("✅ FileAnalysisAgent with MCP tools created")
except Exception as e:
logger.error(f"❌ Failed to create FileAnalysisAgent with MCP tools: {str(e)}")
file_agent = LlmAgent(
name="FileAnalysisAgent",
model="gemini-2.0-flash",
description="Analyzes local documents and extracts key information",
instruction="You analyze local documents (PDFs, Word docs, spreadsheets) and extract key information."
)
agents.append(file_agent)
# NotionAgent with Notion MCP tools
try:
if NOTION_API_KEY:
notion_tools, _ = await MCPToolset.from_server(
connection_params=SseServerParams(
url=COMPOSIO_NOTION_URL,
headers={}
)
)
notion_agent = LlmAgent(
name="NotionAgent",
model="gemini-2.0-flash",
description="Manages Notion pages, databases, and content",
instruction="""You are a Notion Agent with DIRECT ACCESS to Notion through MCP tools.
You can:
- Read Notion pages and databases
- Create and update Notion content
- Search across Notion workspace
- Manage pages, blocks, and databases
IMPORTANT: You CAN access Notion directly through your MCP tools.
When asked to read, write, or search Notion content, USE YOUR MCP TOOLS.
Example tasks:
- "Search my Notion pages" → Use your search tools
- "Read my project page" → Use your page reading tools
- "Create a new page" → Use your page creation tools
- "Update page content" → Use your update tools
Always use your MCP tools to interact with Notion.""",
tools=notion_tools
)
agents.append(notion_agent)
logger.info("✅ NotionAgent with MCP tools created")
else:
raise Exception("NOTION_API_KEY not found")
except Exception as e:
logger.error(f"❌ Failed to create NotionAgent with MCP tools: {str(e)}")
notion_agent = LlmAgent(
name="NotionAgent",
model="gemini-2.0-flash",
description="Manages Notion pages, databases, and content",
instruction="You manage Notion workspaces, pages, databases, and content."
)
agents.append(notion_agent)
logger.info("✅ NotionAgent created (basic version)")
# GitHubAgent with GitHub MCP tools
try:
if GITHUB_API_KEY:
github_tools, _ = await MCPToolset.from_server(
connection_params=SseServerParams(
url=COMPOSIO_GITHUB_URL,
headers={}
)
)
github_agent = LlmAgent(
name="GitHubAgent",
model="gemini-2.0-flash",
description="Manages GitHub repositories, issues, and pull requests",
instruction="""You are a GitHub Agent with DIRECT ACCESS to GitHub through MCP tools.
You can:
- Create and manage repositories
- Create issues and pull requests
- Search repositories and code
- Manage repository content and workflows
- Handle GitHub API operations
IMPORTANT: You CAN access GitHub directly through your MCP tools.
When asked to perform GitHub operations, USE YOUR MCP TOOLS.
Example tasks:
- "Create a new repository" → Use your repository creation tools
- "Search for issues" → Use your search tools
- "Create a pull request" → Use your PR creation tools
- "List my repositories" → Use your repository listing tools
Always use your MCP tools to interact with GitHub.""",
tools=github_tools
)
agents.append(github_agent)
logger.info("✅ GitHubAgent with MCP tools created")
else:
raise Exception("GITHUB_API_KEY not found")
except Exception as e:
logger.error(f"❌ Failed to create GitHubAgent with MCP tools: {str(e)}")
github_agent = LlmAgent(
name="GitHubAgent",
model="gemini-2.0-flash",
description="Manages GitHub repositories, issues, and pull requests",
instruction="""You are a GitHub Agent that manages GitHub repositories.
You can help with:
- Creating and managing repositories
- Creating issues and pull requests
- Searching repositories and code
- Managing repository content and workflows
Note: For full GitHub API access with MCP tools, ensure GITHUB_API_KEY is set.
Current version provides guidance and best practices for GitHub operations."""
)
agents.append(github_agent)
logger.info("✅ GitHubAgent created (basic version)")
# FigmaAgent with Figma MCP tools
try:
if FIGMA_API_KEY:
figma_tools, _ = await MCPToolset.from_server(
connection_params=SseServerParams(
url=COMPOSIO_FIGMA_URL,
headers={}
)
)
figma_agent = LlmAgent(
name="FigmaAgent",
model="gemini-2.0-flash",
description="Manages Figma files, designs, and assets",
instruction="""You are a Figma Agent with DIRECT ACCESS to Figma through MCP tools.
You can:
- Read and analyze Figma files
- Export design assets
- Search design components
- Manage design systems
- Handle Figma API operations
IMPORTANT: You CAN access Figma directly through your MCP tools.
When asked to perform Figma operations, USE YOUR MCP TOOLS.
Example tasks:
- "Export design assets" → Use your export tools
- "Search for components" → Use your search tools
- "Read file information" → Use your file reading tools
- "List project files" → Use your file listing tools
Always use your MCP tools to interact with Figma.""",
tools=figma_tools
)
agents.append(figma_agent)
logger.info("✅ FigmaAgent with MCP tools created")
else:
raise Exception("FIGMA_API_KEY not found")
except Exception as e:
logger.error(f"❌ Failed to create FigmaAgent with MCP tools: {str(e)}")
figma_agent = LlmAgent(
name="FigmaAgent",
model="gemini-2.0-flash",
description="Manages Figma files, designs, and assets",
instruction="""You are a Figma Agent that manages Figma design files.
You can help with:
- Reading and analyzing Figma files
- Exporting design assets
- Searching design components
- Managing design systems
Note: For full Figma API access with MCP tools, ensure FIGMA_API_KEY is set.
Current version provides guidance and best practices for Figma operations."""
)
agents.append(figma_agent)
logger.info("✅ FigmaAgent created (basic version)")
return agents
class EnterpriseMCPAIAgentTeam:
"""Enterprise MCP AI Agent Team - Multi-Agent System with MCP Tools"""
def __init__(self):
"""Initialize the orchestrator"""
self.root_agent = None
self._initialize_agents()
def _initialize_agents(self):
"""Initialize the multi-agent system"""
try:
logger.info("🔧 Creating complete multi-agent system with MCP tools...")
# Create all sub-agents with MCP tools using async
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
sub_agents = loop.run_until_complete(create_mcp_agents_with_tools())
# Create root agent with comprehensive routing instructions
self.root_agent = LlmAgent(
name="EnterpriseMCPAIAgentTeam",
model="gemini-2.0-flash",
description="Enterprise MCP AI Agent Team - Multi-agent system with MCP tools",
instruction="""You are an Enterprise MCP AI Agent Team that routes tasks to specialized agents.
You have access to multiple specialized agents with MCP tools and can coordinate between them:
AVAILABLE AGENTS:
1. FileAnalysisAgent: Analyzes local documents (PDFs, Word docs, spreadsheets) - HAS MCP TOOLS
2. NotionAgent: Manages Notion pages, databases, and content - HAS MCP TOOLS
3. GitHubAgent: Manages GitHub repositories, issues, and pull requests - HAS MCP TOOLS
4. FigmaAgent: Manages Figma files, designs, and assets - HAS MCP TOOLS
ROUTING LOGIC:
- File/document tasks → FileAnalysisAgent
- Notion-related tasks → NotionAgent
- GitHub-related tasks → GitHubAgent
- Figma/design tasks → FigmaAgent
- Multi-platform tasks → Coordinate between relevant agents
You can:
1. Transfer tasks to specialized agents using transfer_to_agent()
2. Coordinate multi-step workflows
3. Share context between agents through session state
4. Provide comprehensive results and recommendations
EXAMPLES:
- "List files in Documents" → FileAnalysisAgent (with real file system access)
- "Search my Notion pages" → NotionAgent (with real Notion API access)
- "Create a GitHub repo" → GitHubAgent (with real GitHub API access)
- "Export Figma designs" → FigmaAgent (with real Figma API access)
IMPORTANT: Use transfer_to_agent() to delegate to the most appropriate agent for each task.
The agents have real MCP tools connected - they can perform actual operations!""",
sub_agents=sub_agents
)
logger.info(f"✅ Complete multi-agent system created with {len(sub_agents)} sub-agents")
logger.info(f"✅ Sub-agents: {[agent.name for agent in sub_agents]}")
except Exception as e:
logger.error(f"❌ Failed to create complete multi-agent system: {str(e)}")
logger.info("🔄 Falling back to basic multi-agent system...")
self._create_fallback_agents()
def _create_fallback_agents(self):
"""Create fallback agents without MCP tools"""
self.root_agent = LlmAgent(
name="EnterpriseMCPAIAgentTeam",
model="gemini-2.0-flash",
description="Enterprise MCP AI Agent Team - Multi-agent system",
instruction="""You are an Enterprise MCP AI Agent Team that routes tasks to specialized agents.
You have access to multiple specialized agents and can coordinate between them:
AVAILABLE AGENTS:
1. FileAnalysisAgent: Analyzes local documents (PDFs, Word docs, spreadsheets)
2. NotionAgent: Manages Notion pages, databases, and content
3. GitHubAgent: Manages GitHub repositories, issues, and pull requests
4. FigmaAgent: Manages Figma files, designs, and assets
ROUTING LOGIC:
- File/document tasks → FileAnalysisAgent
- Notion-related tasks → NotionAgent
- GitHub-related tasks → GitHubAgent
- Figma/design tasks → FigmaAgent
- Multi-platform tasks → Coordinate between relevant agents
You can:
1. Transfer tasks to specialized agents using transfer_to_agent()
2. Coordinate multi-step workflows
3. Share context between agents through session state
4. Provide comprehensive results and recommendations
EXAMPLES:
- "List files in Documents" → FileAnalysisAgent
- "Search my Notion pages" → NotionAgent
- "Create a GitHub repo" → GitHubAgent
- "Export Figma designs" → FigmaAgent
IMPORTANT: Use transfer_to_agent() to delegate to the most appropriate agent for each task.
For full MCP tool functionality, ensure all environment variables are set correctly:
- MCP_FILESYSTEM_PATH: Path to your filesystem folder
- NOTION_API_KEY: Your Notion API key
- GITHUB_API_KEY: Your GitHub API key
- FIGMA_API_KEY: Your Figma API key""",
sub_agents=[
LlmAgent(
name="FileAnalysisAgent",
model="gemini-2.0-flash",
description="Analyzes local documents and extracts key information",
instruction="You analyze local documents (PDFs, Word docs, spreadsheets) and extract key information, summaries, and action items."
),
LlmAgent(
name="NotionAgent",
model="gemini-2.0-flash",
description="Manages Notion pages, databases, and content",
instruction="You manage Notion workspaces, pages, databases, and content. You can read, write, search, and organize Notion content."
),
LlmAgent(
name="GitHubAgent",
model="gemini-2.0-flash",
description="Manages GitHub repositories, issues, and pull requests",
instruction="You manage GitHub repositories, create issues and pull requests, search code, and handle repository operations."
),
LlmAgent(
name="FigmaAgent",
model="gemini-2.0-flash",
description="Manages Figma files, designs, and assets",
instruction="You manage Figma design files, export assets, search design components, and handle design system operations."
)
]
)
# Create root_agent for ADK Web compatibility
try:
orchestrator = EnterpriseMCPAIAgentTeam()
root_agent = orchestrator.root_agent
logger.info("✅ EnterpriseMCPAIAgentTeam class and root_agent created successfully")
except Exception as e:
logger.error(f"❌ Failed to create EnterpriseMCPAIAgentTeam: {str(e)}")
# Fallback: create basic root_agent
root_agent = LlmAgent(
name="EnterpriseMCPAIAgentTeam",
model="gemini-2.0-flash",
description="Enterprise MCP AI Agent Team - Basic multi-agent system",
instruction="You are an Enterprise MCP AI Agent Team that routes tasks to specialized agents.",
sub_agents=[]
)