|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""MCP Multi-Agent System Example |
|
|
|
This example demonstrates how to use MCP (Model Context Protocol) with CAMEL agents |
|
for advanced information retrieval and processing tasks. |
|
|
|
Environment Setup: |
|
1. Configure the required dependencies of owl library |
|
Refer to: https://github.com/camel-ai/owl for installation guide |
|
|
|
2. MCP Server Setup: |
|
|
|
|
|
2.1 MCP Playwright Service: |
|
```bash |
|
# Install MCP service |
|
npm install -g @executeautomation/playwright-mcp-server |
|
npx playwright install-deps |
|
|
|
# Configure in mcp_servers_config.json: |
|
{ |
|
"mcpServers": { |
|
"playwright": { |
|
"command": "npx", |
|
"args": ["-y", "@executeautomation/playwright-mcp-server"] |
|
} |
|
} |
|
} |
|
``` |
|
|
|
2.2 MCP Fetch Service (Optional - for better retrieval): |
|
```bash |
|
# Install MCP service |
|
pip install mcp-server-fetch |
|
|
|
# Configure in mcp_servers_config.json: |
|
{ |
|
"mcpServers": { |
|
"fetch": { |
|
"command": "python", |
|
"args": ["-m", "mcp_server_fetch"] |
|
} |
|
} |
|
} |
|
``` |
|
|
|
Usage: |
|
1. Ensure all MCP servers are properly configured in mcp_servers_config.json |
|
2. Run this script to create a multi-agent system that can: |
|
- Access and manipulate files through MCP Desktop Commander |
|
- Perform web automation tasks using Playwright |
|
- Process and generate information using GPT-4o |
|
- Fetch web content (if fetch service is configured) |
|
3. The system will execute the specified task while maintaining security through |
|
controlled access |
|
|
|
Note: |
|
- All file operations are restricted to configured directories |
|
- System uses GPT-4o for both user and assistant roles |
|
- Supports asynchronous operations for efficient processing |
|
""" |
|
|
|
import asyncio |
|
import sys |
|
from pathlib import Path |
|
from typing import List |
|
|
|
from dotenv import load_dotenv |
|
|
|
from camel.models import ModelFactory |
|
from camel.toolkits import FunctionTool |
|
from camel.types import ModelPlatformType, ModelType |
|
from camel.logger import set_log_level |
|
from camel.toolkits import MCPToolkit |
|
|
|
from owl.utils.enhanced_role_playing import OwlRolePlaying, arun_society |
|
|
|
import pathlib |
|
|
|
base_dir = pathlib.Path(__file__).parent.parent |
|
env_path = base_dir / "owl" / ".env" |
|
load_dotenv(dotenv_path=str(env_path)) |
|
|
|
set_log_level(level="DEBUG") |
|
|
|
|
|
async def construct_society( |
|
question: str, |
|
tools: List[FunctionTool], |
|
) -> OwlRolePlaying: |
|
r"""build a multi-agent OwlRolePlaying instance. |
|
|
|
Args: |
|
question (str): The question to ask. |
|
tools (List[FunctionTool]): The MCP tools to use. |
|
""" |
|
models = { |
|
"user": ModelFactory.create( |
|
model_platform=ModelPlatformType.OPENAI, |
|
model_type=ModelType.GPT_4O, |
|
model_config_dict={"temperature": 0}, |
|
), |
|
"assistant": ModelFactory.create( |
|
model_platform=ModelPlatformType.OPENAI, |
|
model_type=ModelType.GPT_4O, |
|
model_config_dict={"temperature": 0}, |
|
), |
|
} |
|
|
|
user_agent_kwargs = {"model": models["user"]} |
|
assistant_agent_kwargs = { |
|
"model": models["assistant"], |
|
"tools": tools, |
|
} |
|
|
|
task_kwargs = { |
|
"task_prompt": question, |
|
"with_task_specify": False, |
|
} |
|
|
|
society = OwlRolePlaying( |
|
**task_kwargs, |
|
user_role_name="user", |
|
user_agent_kwargs=user_agent_kwargs, |
|
assistant_role_name="assistant", |
|
assistant_agent_kwargs=assistant_agent_kwargs, |
|
) |
|
return society |
|
|
|
|
|
async def main(): |
|
config_path = Path(__file__).parent / "mcp_servers_config.json" |
|
mcp_toolkit = MCPToolkit(config_path=str(config_path)) |
|
|
|
try: |
|
await mcp_toolkit.connect() |
|
|
|
|
|
default_task = ( |
|
"I'd like a academic report about Andrew Ng, including " |
|
"his research direction, published papers (At least 3)," |
|
" institutions, etc. " |
|
) |
|
|
|
|
|
task = sys.argv[1] if len(sys.argv) > 1 else default_task |
|
|
|
|
|
tools = [*mcp_toolkit.get_tools()] |
|
society = await construct_society(task, tools) |
|
answer, chat_history, token_count = await arun_society(society) |
|
print(f"\033[94mAnswer: {answer}\033[0m") |
|
|
|
finally: |
|
|
|
try: |
|
await mcp_toolkit.disconnect() |
|
except Exception: |
|
print("Disconnect failed") |
|
|
|
|
|
if __name__ == "__main__": |
|
asyncio.run(main()) |
|
|