---
title: "Browser Agent MCP"
description: "Give your ZeroTime agents eyes — web data extraction, page automation, CRM lead enrichment, competitor monitoring, and memory enrichment via MCP server."
canonical: "https://docs.ainative.studio/docs/business-ops/browser-agent"
last-updated: "2026-10-03T21:47:10.764Z"
---

# Browser Agent MCP

Source: https://docs.ainative.studio/docs/business-ops/browser-agent

> Give your ZeroTime agents eyes — web data extraction, page automation, CRM lead enrichment, competitor monitoring, and memory enrichment via MCP server.

## Browser Agent MCP

**Package:** `@ainative/browser-mcp`  
**Install:** `npx @ainative/browser-mcp`  
**npm:** [npmjs.com/package/@ainative/browser-mcp](https://www.npmjs.com/package/@ainative/browser-mcp)  
**Version:** 1.1.0  
**Backend:** `https://api.ainative.studio/api/v1/public/browser`

The Browser Agent MCP server gives your AI agents the ability to see and interact with the web. Extract structured data from any page, automate multi-step browser workflows, enrich CRM contacts, monitor competitors, and store insights directly into ZeroMemory — all from a single `npx` command.

It auto-detects [ZeroLocal](https://zerodb.ainative.studio) running on `localhost:8000` and uses it automatically. Otherwise it connects to AINative Cloud.

:::tip Quick Start
```bash
npx @ainative/browser-mcp
```
Set `AINATIVE_API_KEY=ak_your_key` in your shell or `.env` file. Get a key at [ainative.studio/dashboard](https://ainative.studio/dashboard).
:::

---

## Install & Configure

### Option 1 — npx (recommended)

```bash
npx @ainative/browser-mcp
```

No global install needed. Always runs the latest version.

### Option 2 — Global install

```bash
npm install -g @ainative/browser-mcp
ainative-browser-mcp
```

### Configure in Claude Code

Add to your `.claude/mcp.json` (or `claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "browser": {
      "command": "npx",
      "args": ["@ainative/browser-mcp"],
      "env": {
        "AINATIVE_API_KEY": "ak_your_key_here"
      }
    }
  }
}
```

### Configure in Cursor / Windsurf

```json
{
  "mcpServers": {
    "ainative-browser": {
      "command": "npx",
      "args": ["@ainative/browser-mcp"],
      "env": {
        "AINATIVE_API_KEY": "ak_your_key_here"
      }
    }
  }
}
```

---

## Authentication

Set **one** of the following environment variables:

| Variable | Description |
|----------|-------------|
| `AINATIVE_API_KEY` | API key (recommended) — `ak_...` prefix |
| `AINATIVE_USERNAME` + `AINATIVE_PASSWORD` | Email + password login |

Get your API key from [ainative.studio/dashboard](https://ainative.studio/dashboard).

---

## Tools

Eight tools are available. Each call costs credits from your AINative balance.

| Tool | Description | Credits |
|------|-------------|---------|
| `browser_act` | Perform an action on a page (click, type, navigate, scroll) | 50 |
| `browser_extract` | Extract structured data from a page | 75 |
| `browser_validate` | Validate content or state on a page | 25 |
| `browser_task` | Run a multi-step automation task | 200 |
| `browser_extract_to_table` | Extract data and write directly to a ZeroDB table | 100 |
| `browser_enrich_memory` | Extract content and store in ZeroMemory agent memory | 100 |
| `browser_batch_extract` | Extract data from up to 10 URLs in one call and store rows in ZeroDB | 75/URL |
| `browser_enrich_memory_async` | Queue a background memory enrichment task; returns `task_id` immediately | 100 |

---

## Tool Reference

### `browser_act`

Perform an action on a web page — navigate, click, type, scroll, submit a form.

**Input schema:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `url` | string | yes | Page URL to act on |
| `instruction` | string | yes | Natural language action to perform |
| `max_steps` | integer | no | Max steps to take (default: 5) |

**Example:**

```json
{
  "tool": "browser_act",
  "arguments": {
    "url": "https://example.com/login",
    "instruction": "Click the 'Sign in with Google' button",
    "max_steps": 3
  }
}
```

---

### `browser_extract`

Extract structured data from any page. Returns JSON matching your requested schema or goal.

**Input schema:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `url` | string | yes | Page URL to extract from |
| `extract_goal` | string | yes | What to extract (natural language) |
| `schema` | object | no | Optional JSON schema to shape the output |

**Example — extract pricing:**

```json
{
  "tool": "browser_extract",
  "arguments": {
    "url": "https://competitor.com/pricing",
    "extract_goal": "Extract all plan names, prices, and features"
  }
}
```

**Example — with schema:**

```json
{
  "tool": "browser_extract",
  "arguments": {
    "url": "https://linkedin.com/company/acme-corp",
    "extract_goal": "Extract company details for CRM",
    "schema": {
      "type": "object",
      "properties": {
        "company_name": {"type": "string"},
        "industry": {"type": "string"},
        "employee_count": {"type": "string"},
        "website": {"type": "string"},
        "description": {"type": "string"}
      }
    }
  }
}
```

---

### `browser_validate`

Check that expected content exists on a page. Useful for monitoring, testing, and QA automation.

**Input schema:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `url` | string | yes | Page URL to validate |
| `assertion` | string | yes | What to check (natural language) |

**Example:**

```json
{
  "tool": "browser_validate",
  "arguments": {
    "url": "https://your-app.com/dashboard",
    "assertion": "The page shows a welcome message and user account balance"
  }
}
```

Returns `{"valid": true, "details": "..."}` or `{"valid": false, "reason": "..."}`.

---

### `browser_task`

Run a full multi-step browser automation task. The agent navigates across pages, fills forms, clicks, and returns a structured result.

**Input schema:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `task` | string | yes | Full task description (natural language) |
| `start_url` | string | yes | URL to start the task on |
| `max_steps` | integer | no | Max steps (default: 20) |

**Example:**

```json
{
  "tool": "browser_task",
  "arguments": {
    "task": "Go to the product catalog, find all products in the 'Electronics' category, and return a list of names and prices",
    "start_url": "https://shop.example.com",
    "max_steps": 15
  }
}
```

---

### `browser_extract_to_table`

Extract data from a page and write it directly into a ZeroDB table. No intermediate steps — the agent scrapes and stores in one call.

**Input schema:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `url` | string | yes | Page URL to extract from |
| `extract_goal` | string | yes | What to extract |
| `table_name` | string | yes | ZeroDB table to write to |
| `project_id` | string | yes | Your ZeroDB project ID |

**Example — competitor price monitoring:**

```json
{
  "tool": "browser_extract_to_table",
  "arguments": {
    "url": "https://competitor.com/products",
    "extract_goal": "Extract product name, SKU, and price for all products",
    "table_name": "competitor_prices",
    "project_id": "proj_abc123"
  }
}
```

---

### `browser_enrich_memory`

Extract content from a page and store it in ZeroMemory as agent memory. Useful for research, lead enrichment, and building agent context over time.

**Input schema:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `url` | string | yes | Page URL to extract from |
| `extract_goal` | string | yes | What to extract and remember |
| `memory_type` | string | no | `semantic` (default) or `episodic` |
| `project_id` | string | yes | Your ZeroDB project ID |

**Example — CRM lead enrichment:**

```json
{
  "tool": "browser_enrich_memory",
  "arguments": {
    "url": "https://acme-corp.com/about",
    "extract_goal": "Extract company overview, products, team size, and recent news",
    "memory_type": "semantic",
    "project_id": "proj_abc123"
  }
}
```

---

### `browser_batch_extract`

Extract structured data from up to 10 URLs in a single MCP call and store each result as a row in a ZeroDB table. Ideal for bulk lead enrichment or competitor snapshots without looping individual calls.

**Input schema:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `urls` | array of strings | yes | URLs to extract from (max 10) |
| `extract_goal` | string | yes | What to extract from each page |
| `table_name` | string | yes | ZeroDB table to write rows into |
| `project_id` | string | yes | Your ZeroDB project ID |

**Example — bulk competitor research:**

```json
{
  "tool": "browser_batch_extract",
  "arguments": {
    "urls": [
      "https://competitor-a.com/about",
      "https://competitor-b.com/about",
      "https://competitor-c.com/about"
    ],
    "extract_goal": "Company name, employee count, product focus, pricing model",
    "table_name": "competitor_profiles",
    "project_id": "proj_abc123"
  }
}
```

Credits are charged per URL (75 credits each). A batch of 10 URLs costs 750 credits.

---

### `browser_enrich_memory_async`

Queue an async background task to visit a URL and store extracted content in ZeroMemory. Returns a `task_id` immediately — the browser work happens in the background via Celery. Use this when you don't want to block on enrichment (e.g., enriching many contacts in parallel).

**Input schema:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `url` | string | yes | URL to visit and extract from |
| `project_id` | string | yes | Your ZeroDB project ID |
| `extract_goal` | string | no | What to extract (default: extract key facts) |
| `memory_type` | string | no | `semantic` (default), `episodic`, or `procedural` |

**Example:**

```json
{
  "tool": "browser_enrich_memory_async",
  "arguments": {
    "url": "https://prospect-company.com/blog/latest",
    "extract_goal": "Key product updates, pricing changes, and strategic direction",
    "memory_type": "semantic",
    "project_id": "proj_abc123"
  }
}
```

**Response:**

```json
{
  "task_id": "celery-task-uuid",
  "status": "queued",
  "message": "Memory enrichment task queued successfully"
}
```

Use the `task_id` to poll task status via the AINative backend if needed.

---

## ZeroTime Use Cases

The Browser Agent is the 5th app in the [ZeroTime business operations suite](/docs/business-ops/overview). Each use case connects a ZeroTime app to live web data.

### ZeroPipeline — CRM Lead Enrichment

Before a sales call, enrich a CRM contact from their company website:

```javascript
// In your agent or Claude Code session
await browser_enrich_memory({
  url: "https://prospect-company.com",
  extract_goal: "Company size, product offering, recent funding, key executives",
  memory_type: "semantic",
  project_id: "proj_abc123"
});

// Memory is now available in subsequent ZeroPipeline CRM calls
await zeropipeline_update_contact({
  contact_id: "con_456",
  enriched: true
});
```

### ZeroCommerce — Competitor Price Monitoring

Schedule daily competitor price checks and store results in ZeroDB:

```javascript
// Extract competitor pricing
const prices = await browser_extract({
  url: "https://competitor.com/pricing",
  extract_goal: "All plan names, monthly prices, and included features"
});

// Write to ZeroDB table for tracking
await browser_extract_to_table({
  url: "https://competitor.com/pricing",
  extract_goal: "Plan name, monthly price, annual price, features",
  table_name: "competitor_pricing_snapshots",
  project_id: "proj_abc123"
});
```

### ZeroInvoice — Invoice Portal Extraction

Extract invoice data from a client vendor portal when they don't have an API:

```javascript
const invoiceData = await browser_extract({
  url: "https://vendor-portal.com/invoices",
  extract_goal: "All unpaid invoices — invoice number, amount, due date, status",
  schema: {
    type: "array",
    items: {
      type: "object",
      properties: {
        invoice_number: { type: "string" },
        amount: { type: "number" },
        due_date: { type: "string" },
        status: { type: "string" }
      }
    }
  }
});
```

### OpenCapStack — Investor Research

Enrich investor profiles before a fundraise:

```javascript
await browser_enrich_memory({
  url: "https://vc-firm.com/team/partner-name",
  extract_goal: "Investment thesis, portfolio companies, check size, contact info",
  memory_type: "semantic",
  project_id: "proj_abc123"
});
```

---

## Async Pipeline (Batch Mode)

For enriching many URLs at once, use the AINative backend batch endpoint directly instead of looping individual MCP calls.

### `POST /api/v1/public/browser/batch-extract`

Extract structured data from multiple URLs in one request (max 10 URLs, 75 credits each).

```bash
curl -X POST https://api.ainative.studio/api/v1/public/browser/batch-extract \
  -H "X-API-Key: ak_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "urls": [
      "https://company1.com/about",
      "https://company2.com/about"
    ],
    "extract_goal": "Company name, industry, employee count, products"
  }'
```

**Response:**

```json
{
  "results": [
    {
      "url": "https://company1.com/about",
      "status": "success",
      "data": { "company_name": "Acme Corp", "industry": "SaaS", ... }
    },
    {
      "url": "https://company2.com/about",
      "status": "success",
      "data": { ... }
    }
  ],
  "total": 2,
  "succeeded": 2,
  "failed": 0,
  "credits_used": 150
}
```

### `POST /api/v1/public/browser/enrich-memory-async`

Dispatch an async Celery task to enrich memory from a URL. Returns immediately with a `task_id`.

```bash
curl -X POST https://api.ainative.studio/api/v1/public/browser/enrich-memory-async \
  -H "X-API-Key: ak_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://company.com/blog/latest-post",
    "extract_goal": "Key insights and takeaways",
    "memory_type": "semantic",
    "project_id": "proj_abc123"
  }'
```

**Response (202 Accepted):**

```json
{
  "task_id": "celery-task-uuid",
  "status": "queued",
  "message": "Memory enrichment task queued successfully"
}
```

---

## Scheduled Enrichment

Create scheduled browser enrichment jobs that run on a cron schedule.

### `POST /api/v1/public/browser/schedules`

```bash
curl -X POST https://api.ainative.studio/api/v1/public/browser/schedules \
  -H "X-API-Key: ak_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Daily competitor price check",
    "urls": ["https://competitor.com/pricing"],
    "cron_expr": "0 9 * * *",
    "memory_type": "semantic",
    "project_id": "proj_abc123"
  }'
```

**Cron expression format:** Standard 5-field cron — `minute hour dom month dow`

| Example | Meaning |
|---------|---------|
| `0 9 * * *` | Every day at 9am UTC |
| `0 */6 * * *` | Every 6 hours |
| `0 9 * * 1` | Every Monday at 9am |
| `*/30 * * * *` | Every 30 minutes |

### `GET /api/v1/public/browser/schedules`

List all your schedules.

### `DELETE /api/v1/public/browser/schedules/{schedule_id}`

Delete a schedule.

---

## ZeroLocal (Local-First Mode)

The server auto-detects [ZeroLocal](https://zerodb.ainative.studio) running on `localhost:8000`. If detected, all requests go to your local instance — no cloud calls, no data leaves your machine.

```bash
## Start ZeroLocal
pip install zerodb-local
zerodb serve

## Then in another terminal — browser-mcp auto-connects to localhost:8000
npx @ainative/browser-mcp
```

---

## Pricing

| Plan | Price | Daily limit | Monthly limit |
|------|-------|-------------|---------------|
| Free | $0 | 5 tool calls/day | 50 tool calls/mo |
| Pro | $49/mo | 50 tool calls/day | 1,000 tool calls/mo |
| Enterprise | Custom | Unlimited | Unlimited |

Credits are consumed per tool call (see [Tools table](#tools) above). Upgrade at [ainative.studio/dashboard](https://ainative.studio/dashboard).

---

## Rate Limits

All plans enforce per-day and per-month limits. When a limit is exceeded the API returns:

```json
{
  "error": "rate_limit_exceeded",
  "message": "Daily browser tool call limit reached (5/5). Resets at midnight UTC.",
  "limit": 5,
  "used": 5,
  "resets_at": "2026-05-20T00:00:00Z"
}
```

---

## Error Reference

| HTTP Code | Error | Description |
|-----------|-------|-------------|
| 400 | `invalid_url` | URL is not reachable or malformed |
| 401 | `unauthorized` | Missing or invalid API key |
| 402 | `insufficient_credits` | Not enough credits for this operation |
| 422 | `validation_error` | Missing required fields |
| 429 | `rate_limit_exceeded` | Daily or monthly limit reached |
| 500 | `extraction_failed` | Browser automation failed on the target page |
| 503 | `browser_unavailable` | Browser service temporarily unavailable |

---

## Links

- [ainative.studio/products/zerotime/browser](https://ainative.studio/products/zerotime/browser) — use case landing page
- [ainative.studio/dashboard](https://ainative.studio/dashboard) — get API key, view usage
- [npmjs.com/package/@ainative/browser-mcp](https://www.npmjs.com/package/@ainative/browser-mcp) — npm package
- [GitHub Issues](https://github.com/AINative-Studio/core/issues) — report bugs
