"""
Advanced example: Using multiple MCP servers together.

This example demonstrates how to:
1. Connect multiple MCP servers (Gmail + Filesystem) to openbrowser
2. Sign up for a new account on a website
3. Save registration details to a file
4. Retrieve the verification link from Gmail
5. Complete the verification process
"""

import asyncio
import os

from openbrowser import Agent, Tools
from openbrowser.llm.openai.chat import ChatOpenAI
from openbrowser.mcp.client import MCPClient


async def main():
	"""Sign up for account, save details, and verify via Gmail."""

	# Initialize tools
	tools = Tools()

	# Connect to Gmail MCP Server
	# Requires Gmail API credentials - see: https://github.com/GongRzhe/Gmail-MCP-Server#setup
	gmail_env = {}
	if client_id := os.getenv('GMAIL_CLIENT_ID'):
		gmail_env['GMAIL_CLIENT_ID'] = client_id
	if client_secret := os.getenv('GMAIL_CLIENT_SECRET'):
		gmail_env['GMAIL_CLIENT_SECRET'] = client_secret
	if refresh_token := os.getenv('GMAIL_REFRESH_TOKEN'):
		gmail_env['GMAIL_REFRESH_TOKEN'] = refresh_token

	gmail_client = MCPClient(server_name='gmail', command='npx', args=['gmail-mcp-server'], env=gmail_env)

	# Connect to Filesystem MCP Server for saving registration details
	filesystem_client = MCPClient(
		server_name='filesystem',
		command='npx',
		args=['-y', '@modelcontextprotocol/server-filesystem', os.path.expanduser('~/Desktop')],
	)

	# Connect and register tools from both servers
	print('Connecting to Gmail MCP server...')
	await gmail_client.connect()
	await gmail_client.register_to_tools(tools)

	print('Connecting to Filesystem MCP server...')
	await filesystem_client.connect()
	await filesystem_client.register_to_tools(tools)

	# Create agent with extended system prompt for using multiple MCP servers
	agent = Agent(
		task='Sign up for a new Anthropic account using the email example@gmail.com, save the registration details to a file',
		llm=ChatOpenAI(model='gpt-4.1-mini'),
		tools=tools,
		extend_system_message="""
You have access to both Gmail and Filesystem tools through MCP servers. When signing up for accounts:

1. Fill out registration forms with the provided email address
2. Use the filesystem tools to create a file called 'anthropic_registration.txt' on the Desktop containing:
   - Email used for registration
   - Timestamp of registration
   - Any username or account details
3. After submitting the registration, use the Gmail MCP tools to check for verification emails
4. Search for recent emails (within the last 5 minutes) from the service you're signing up for
5. Look for verification links or codes in those emails
6. Append the verification details to the registration file
7. Use any verification links or codes found to complete the account setup
8. Update the file with the final account status

Available tools include:
Gmail tools:
- search_emails: Search for emails by query (e.g., "from:noreply@anthropic.com")
- get_email: Get full email content by ID
- list_emails: List recent emails

Filesystem tools:
- read_file: Read content from a file
- write_file: Write content to a file
- list_directory: List files in a directory

Always wait a few seconds after submitting a form before checking Gmail to allow the email to arrive.
""",
	)

	# Run the agent
	result = await agent.run()

	print('\nTask completed!')
	print(f'Result: {result}')

	# Disconnect both MCP clients
	await gmail_client.disconnect()
	await filesystem_client.disconnect()


if __name__ == '__main__':
	# Prerequisites:
	# 1. Install both MCP servers:
	#    npm install -g gmail-mcp-server
	#    npm install -g @modelcontextprotocol/server-filesystem
	# 2. Set up Gmail API credentials following: https://github.com/GongRzhe/Gmail-MCP-Server#setup
	# 3. Set these environment variables:
	#    export GMAIL_CLIENT_ID="your-client-id"
	#    export GMAIL_CLIENT_SECRET="your-client-secret"
	#    export GMAIL_REFRESH_TOKEN="your-refresh-token"

	asyncio.run(main())
