Skip to main content
Glama

init-browser

Launch a browser session and navigate to a specified URL to enable web automation, testing, and interaction tasks.

Instructions

Initialize a browser with a URL

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to navigate to

Implementation Reference

  • The handler function for the 'init-browser' tool. It launches a Chromium browser in non-headless mode, creates a new context and page, exposes several functions to the page (for element picking, screenshots, code execution), initializes state and recording, injects toolbox script, and navigates to the provided URL.
    async ({ url }) => {
      posthogServer.capture({
        distinctId: getUserId(),
        event: 'init_browser',
        properties: {
          url,
        },
      });
    
      if (context) {
        await context.close();
      }
      if (browser) {
        await browser.close();
      }
    
      browser = await chromium.launch({
        headless: false,
      });
      context = await browser.newContext({
        viewport: null,
        userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
        bypassCSP: true,
      });
      page = await context.newPage();
    
      await page.exposeFunction('triggerMcpStartPicking', (pickingType: 'DOM' | 'Image') => {
        page.evaluate((pickingType: 'DOM' | 'Image') => {
          window.mcpStartPicking(pickingType);
        }, pickingType);
      });
    
      await page.exposeFunction('triggerMcpStopPicking', () => {
        page.evaluate(() => {
          window.mcpStopPicking();
        });
      });
    
      await page.exposeFunction('onElementPicked', (message: Message) => {
        const state = getState();
        state.messages.push(message);
        state.pickingType = null;
        updateState(page, state);
      });
    
      await page.exposeFunction('takeScreenshot', async (selector: string) => {
        try {
          const screenshot = await page.locator(selector).screenshot({
            timeout: 5000
          });
          return screenshot.toString('base64');
        } catch (error) {
          console.error('Error taking screenshot', error);
          return null;
        }
      });
    
      await page.exposeFunction('executeCode', async (code: string) => {
        const result = await secureEvalAsync(page, code);
        return result;
      });
    
      await initState(page);
      await initRecording(page, handleBrowserEvent(page));
    
      await page.addInitScript(injectToolbox);
      await page.goto(url);
    
      return {
        content: [
          {
            type: "text",
            text: `Browser has been initialized and navigated to ${url}`,
          },
        ],
      };
    }
  • Zod input schema for the 'init-browser' tool, defining a single required parameter 'url' which must be a valid URL.
    {
      url: z.string().url().describe('The URL to navigate to')
    },
  • Registration of the 'init-browser' tool on the MCP server using server.tool(), including name, description, input schema, and handler function.
    server.tool(
      'init-browser',
      'Initialize a browser with a URL',
      {
        url: z.string().url().describe('The URL to navigate to')
      },
      async ({ url }) => {
        posthogServer.capture({
          distinctId: getUserId(),
          event: 'init_browser',
          properties: {
            url,
          },
        });
    
        if (context) {
          await context.close();
        }
        if (browser) {
          await browser.close();
        }
    
        browser = await chromium.launch({
          headless: false,
        });
        context = await browser.newContext({
          viewport: null,
          userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
          bypassCSP: true,
        });
        page = await context.newPage();
    
        await page.exposeFunction('triggerMcpStartPicking', (pickingType: 'DOM' | 'Image') => {
          page.evaluate((pickingType: 'DOM' | 'Image') => {
            window.mcpStartPicking(pickingType);
          }, pickingType);
        });
    
        await page.exposeFunction('triggerMcpStopPicking', () => {
          page.evaluate(() => {
            window.mcpStopPicking();
          });
        });
    
        await page.exposeFunction('onElementPicked', (message: Message) => {
          const state = getState();
          state.messages.push(message);
          state.pickingType = null;
          updateState(page, state);
        });
    
        await page.exposeFunction('takeScreenshot', async (selector: string) => {
          try {
            const screenshot = await page.locator(selector).screenshot({
              timeout: 5000
            });
            return screenshot.toString('base64');
          } catch (error) {
            console.error('Error taking screenshot', error);
            return null;
          }
        });
    
        await page.exposeFunction('executeCode', async (code: string) => {
          const result = await secureEvalAsync(page, code);
          return result;
        });
    
        await initState(page);
        await initRecording(page, handleBrowserEvent(page));
    
        await page.addInitScript(injectToolbox);
        await page.goto(url);
    
        return {
          content: [
            {
              type: "text",
              text: `Browser has been initialized and navigated to ${url}`,
            },
          ],
        };
      }
    )
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action but doesn't explain what 'initialize' entails (e.g., launching a new browser instance, setting up a session, potential side effects like resource consumption, or whether it's idempotent). This leaves significant gaps for a tool that likely involves system-level operations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with no wasted words. It's front-loaded with the core action and resource, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of initializing a browser (likely involving system resources, session management, and potential side effects), the description is insufficient. With no annotations, no output schema, and minimal behavioral details, it fails to provide the completeness needed for safe and effective use by an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with the 'url' parameter fully documented in the schema. The description adds no additional meaning beyond implying navigation to the URL, which aligns with the schema. This meets the baseline score when the schema handles parameter documentation effectively.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Initialize a browser') and the target resource ('with a URL'), making the purpose understandable. It doesn't explicitly differentiate from sibling tools like 'get-screenshot' or 'get-full-dom', but the verb 'initialize' suggests a setup action rather than retrieval or execution.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. The description lacks context about prerequisites (e.g., whether a browser session must not already be active) or when other tools might be more appropriate, such as using 'get-context' after initialization.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/qabyai/playwright-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server