Mcp Aoai Web Browsing

by kimtth

34 stars
488 downloads
Not rated
GitHub

About

A minimal Model Context Protocol 🖥️ server/client🧑‍💻with OpenAI and 🌐 web browser control via Playwright.

Details

Author
kimtth
GitHub stars
34
Downloads
488
Categories
Automation

- Built with FastMCP and Playwright for web automation
- Converts MCP tools to OpenAI function calling format
- Supports both Azure OpenAI and standard OpenAI providers
- Works in-process or via external stdio MCP server connections
- Reusable by different clients (Claude Desktop, VS Code, custom scripts)
- Exposes direct tool metadata and execution for custom LLM loops

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Mcp Aoai Web Browsing
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Configure a .env file with your Azure OpenAI endpoint, API key, deployment model, and API version. Install uv, run uv sync to install dependencies, then execute python chatgui.py to launch the chat interface. For external clients (Claude Desktop, VS Code, Claude Code), add a mcp.json configuration pointing to the server script.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "mcp aoai web browsing": {
            "mcp-aoai-web-browsing": {
                "command": "uv",
                "args": [
                    "sync"
                ]
            }
        }
    }
}

McpServers

{
    "mcp-aoai-web-browsing": {
        "command": "uv",
        "args": [
            "sync"
        ]
    }
}

MCP Server & Client w/ Azure OpenAI & OpenAI

- A minimal server/client application implementation utilizing the Model Context Protocol (MCP) and Azure OpenAI.

1. The MCP server is built with FastMCP.
2. Playwright is an an open source, end to end testing framework by Microsoft for testing your modern web applications.
3. The MCP response about tools will be converted to the OpenAI function calling format.
4. The bridge that converts the MCP server response to the OpenAI function calling format customises the MCP-LLM Bridge implementation.
5. To ensure a stable connection, the server object is passed directly into the bridge.
6. The client_bridge supports both in-process and external (stdio) MCP server connections, enabling reuse by different clients (e.g., Claude Code, VS Code, custom scripts).

Model Context Protocol (MCP)

Model Context Protocol (MCP) MCP (Model Context Protocol) is an open protocol that enables secure, controlled interactions between AI applications and local or remote resources.

Official Repositories

- MCP Python SDK
- Create Python Server
- MCP Servers

Community Resources

- Awesome MCP Servers
- MCP on Reddit

Related Projects

- FastMCP: The fast, Pythonic way to build MCP servers.
- Chat MCP: MCP client
- MCP-LLM Bridge: MCP implementation that enables communication between MCP servers and OpenAI-compatible LLMs

MCP Playwright

- MCP Playwright server
- Microsoft Playwright for Python

Configuration

During the development phase in December 2024, the Python project should be initiated with 'uv'. Other dependency management libraries, such as 'pip' and 'poetry', are not yet fully supported by the MCP CLI.

1. Rename .env.template to .env, then fill in the values in .env for Azure OpenAI:

    AZURE_OPEN_AI_ENDPOINT=
    AZURE_OPEN_AI_API_KEY=
    AZURE_OPEN_AI_DEPLOYMENT_MODEL=
    AZURE_OPEN_AI_API_VERSION=
    

1. Install uv for python library management

    pip install uv
    uv sync
    

1. Execute python chatgui.py

- The sample screen shows the client launching a browser to navigate to the URL.

chatgui

Using with External Clients

The MCP server can be used by external clients (Claude Desktop, VS Code, Claude Code, etc.) via mcp.json configuration.

Claude Desktop / Claude Code

Add to your claude_desktop_config.json (Claude Desktop) or .claude/mcp.json (Claude Code):

{
  "mcpServers": {
    "browser-navigator": {
      "command": "uv",
      "args": ["run", "fastmcp", "run", "./server/browser_navigator_server.py:app"],
      "cwd": "/path/to/mcp-aoai-web-browsing",
      "env": {
        "AZURE_OPEN_AI_ENDPOINT": "...",
        "AZURE_OPEN_AI_API_KEY": "...",
        "AZURE_OPEN_AI_DEPLOYMENT_MODEL": "...",
        "AZURE_OPEN_AI_API_VERSION": "..."
      }
    }
  }
}

VS Code

Add to .vscode/mcp.json in your workspace:

{
  "servers": {
    "browser-navigator": {
      "command": "uv",
      "args": ["run", "fastmcp", "run", "./server/browser_navigator_server.py:app"],
      "cwd": "${workspaceFolder}",
      "env": {
        "AZURE_OPEN_AI_ENDPOINT": "...",
        "AZURE_OPEN_AI_API_KEY": "...",
        "AZURE_OPEN_AI_DEPLOYMENT_MODEL": "...",
        "AZURE_OPEN_AI_API_VERSION": "..."
      }
    }
  }
}

Using the Bridge Programmatically (stdio)

The client_bridge also supports connecting to external MCP servers via stdio from Python:

from client_bridge import BridgeConfig, MCPServerConfig, BridgeManager
from client_bridge.llm_config import get_default_llm_config

config = BridgeConfig(
server_config=MCPServerConfig(
command="uv",
args=["run", "fastmcp", "run", "./server/browser_navigator_server.py:app"],
),
llm_config=get_default_llm_config(),
system_prompt="You are a helpful assistant.",
)

async with BridgeManager(config) as bridge:
response = await bridge.process_message("Navigate to https://example.com")

Using Standard OpenAI (non-Azure)

from client_bridge.llm_config import get_openai_llm_config

config = BridgeConfig(
mcp=server,
llm_config=get_openai_llm_config(),
)

Set environment variables:

OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-...

Direct Tool Execution

For clients that manage their own LLM loop, the bridge exposes tool metadata and direct execution:

async with BridgeManager(config) as bridge:
    tools = bridge.get_tools()  # OpenAI function calling format
    result = await bridge.execute_tool("playwright_navigate", {"url": "https://example.com"})

w.r.t. 'stdio'

stdio is a transport layer (raw data flow), while JSON-RPC is an application protocol (structured communication). They are distinct but often used interchangeably, e.g., "JSON-RPC over stdio" in protocols.

Tool description

@self.mcp.tool()
async def playwright_navigate(url: str, timeout=30000, wait_until="load"):
    """Navigate to a URL.""" -> This comment provides a description, which may be used in a mechanism similar to function calling in LLMs.

Output

Tool(name='playwright_navigate', description='Navigate to a URL.', inputSchema={'properties': {'url': {'title': 'Url', 'type': 'string'}, 'timeout': {'default': 30000, 'title': 'timeout', 'type': 'string'}

Tip: uv

- features

uv run: Run a script.
uv venv: Create a new virtual environment. By default, '.venv'.
uv add: Add a dependency to a script
uv remove: Remove a dependency from a script
uv sync: Sync (Install) the project's dependencies with the environment.

Tip

- taskkill command for python.exe

taskkill /IM python.exe /F
- Visual Code: Python Debugger: Debugging with launch.json will start the debugger using the configuration from .vscode/launch.json.

<!-- ### Sample query

Navigate to website http://eaapp.somee.com and click the login link. In the login page, enter the username and password as "admin" and "password" respectively and perform login. Then click the Employee List page and click "Create New" button and enter realistic employee details to create for Name, Salary, DurationWorked, Select dropdown for Grade as CLevel and Email. -->

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.