Skip to main content
Glama

BraveMCP — Your Browser Memory, Accessible by Claude

MIT License Version Local First MCP Compliant

BraveMCP is a local-first browser extension + MCP server that captures everything you browse — pages, bookmarks, highlights, notes — and makes it searchable by Claude Desktop as a personal "second brain."

Everything stays on your machine. No cloud. No tracking. Just your own memory, given to Claude.


Demo

BraveMCP — Claude retrieving a forgotten page from local browser memory

Claude answers a vague "do you remember…" question by searching your local browser memory — fully offline. A real screen-recorded GIF can replace this mockup; see docs/RECORDING.md.


Related MCP server: cc-channel-mem

What It Does

Without BraveMCP

With BraveMCP

"I don't have access to your history"

Claude searches your browsing history directly

You copy-paste URLs manually

Extension auto-captures pages as you browse

Forgotten tabs lost forever

Time-decay search resurfaces what you forgot

Manual research summaries

Claude synthesizes your sessions automatically

Example

You: "Do you remember that article about MCP security I read last week?"

Claude: (calls find_forgotten_content) → "Yes — you visited MCP Security Guidelines 4 days ago, 3 times. It covers sandbox credential handling and shell injection prevention. Want a summary?"


How It Works

Brave Browser
    ↓ (tab visits, bookmarks, highlights)
Extension (Manifest V3)
    ↓ POST /api/...
HTTP Bridge (Express :3747)
    ↓
MCP Server ←→ SQLite + ChromaDB
    ↓ stdio JSON-RPC
Claude Desktop
  • Extension — Manifest V3. Auto-captures tab changes, bookmarks, and context-menu text highlights.

  • HTTP Bridge — Express server on port 3747, runs inside the MCP server process to receive extension payloads.

  • Storage — SQLite (FTS5 full-text search) + ChromaDB (local vector embeddings). Nothing leaves your machine.

  • AI Pipeline — Ollama (llama3.2 / nomic-embed-text) for local summarization and embeddings, with Anthropic API as fallback.

  • MCP Server — Exposes 16 tools to Claude Desktop over stdio.


Quick Start

Prerequisites

  • Node.js v18+

  • Brave or Chrome browser

  • Claude Desktop

  • (Optional) Ollama for local AI — ollama pull llama3.2 && ollama pull nomic-embed-text

  • (Optional) Python 3.10+ for ChromaDB vector search — pip install chromadb

Install

git clone https://github.com/glatinone/BraveMCP.git
cd BraveMCP
npm run setup

npm run setup handles everything: installs dependencies, builds TypeScript, and checks ports.

Connect to Claude Desktop

Add this to %APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "brave-memory": {
      "command": "node",
      "args": ["/absolute/path/to/BraveMCP/mcp-server/dist/index.js"]
    }
  }
}

Restart Claude Desktop.

Load the Browser Extension

  1. Open brave://extensions (or chrome://extensions)

  2. Enable Developer mode

  3. Click Load unpacked → select the /extension folder

pip install chromadb
chroma run --path ./storage/chroma

ChromaDB runs at http://localhost:8000. Without it, BraveMCP falls back to SQLite keyword search — still works great.


Configuration

npm run setup creates a .env file at the project root from .env.example. The MCP server reads it from there (not from mcp-server/.env), and re-reads it on every AI call so changes take effect without a restart.

Variable

Default

Purpose

AI_PROVIDER

ollama

ollama for local summarization/embeddings, or anthropic to use the Anthropic API instead

OLLAMA_URL

http://localhost:11434

Where the server looks for a running Ollama instance

ANTHROPIC_API_KEY

Required only if AI_PROVIDER=anthropic, or as a fallback when Ollama is unreachable

Without Ollama or an Anthropic key, the AI pipeline falls back to genuine extractive summaries built from real data (domain grouping, source listings) instead of failing outright.


Available MCP Tools

Once connected, Claude can call any of these 16 tools:

Tool

What it does

get_open_tabs

Get your currently open browser tabs

get_active_tab

Get the tab you're looking at right now

get_bookmarks

Retrieve your saved bookmarks

search_memory

Keyword + semantic search across your history

find_related_content

Find pages related to a search query

find_forgotten_content

Resurface old content using time-decay + visit scoring

capture_current_page

Save the active page's content to memory

save_note

Save a freeform note

save_bookmark

Save a bookmark with a folder

summarize_open_tabs

Synthesize what you're currently researching

summarize_research_topic

Deep-dive summary on a specific topic from your history

get_research_sessions

Auto-clustered browsing sessions by domain/topic

generate_weekly_digest

Weekly summary of your browsing and research gaps

suggest_tab_cleanup

Recommends tabs to close, archive, or keep

get_all_open_tabs

Get the live, id-tagged array of every open tab — call first when organizing tabs

apply_tab_grouping

Apply semantic tab groups to the browser, validated by a critic engine (min score 90/100) before staging


Page Capture Flow

The extension auto-syncs tab visits in the background. For full page content (text body + AI summary), click "Capture Content" in the extension popup. This sends the page body to the MCP server, which stores it in SQLite and generates an AI summary and vector embedding.

Claude can also save a page directly: capture_current_page(url, title, content, summary).


Security

The HTTP bridge listens on localhost:3747 for the extension only — but a plain localhost server is reachable by any browser tab's JavaScript, not just the extension, and by any other installed browser extension, not just this one. The bridge enforces an Origin allowlist so that only an extension origin (chrome-extension://… / moz-extension://…) or a same-machine, non-browser client (no Origin header, e.g. a CLI script) can call it. An ordinary website has no way to spoof its Origin header, so it cannot reach /api/capture, /api/note, /api/stage-groups, etc. — closing off a memory-poisoning path where a malicious page could otherwise plant content into the local database that Claude later treats as trusted research.

A scheme check alone isn't enough, though: every installed extension gets an equally legitimate chrome-extension://<its-own-id> origin, so it would let a malicious or compromised neighbor extension talk to the bridge exactly as freely as BraveMCP's own extension. The bridge closes this by pinning the specific extension origin it sees on first contact (trust-on-first-use, the same model SSH uses for host keys — storage/trusted-origin.json) and rejecting every other extension origin afterward, with zero configuration. If you ever need to re-pin (moved the repo to a new path, so the unpacked extension gets a new ID), delete storage/trusted-origin.json and restart the MCP server.

See mcp-server/src/security/origin.ts.

See SECURITY.md for the full threat model and how to report a vulnerability.


Troubleshooting

Claude Desktop doesn't show the tools / "server disconnected" Use an absolute path to mcp-server/dist/index.js in claude_desktop_config.json — a relative path fails silently. Run npm run build first so dist/ actually exists, then fully quit and reopen Claude Desktop (a config reload isn't enough).

Port 3747 already in use Another BraveMCP instance (or a previous one that didn't shut down cleanly) is holding the HTTP bridge port. Find and stop it (netstat -ano | findstr 3747 on Windows, then taskkill /PID <pid> /F), or restart your machine if unsure what's holding it.

Semantic search feels weak / falls back to keyword search That means ChromaDB isn't reachable at http://localhost:8000. Run chroma run --path ./storage/chroma in a separate terminal and keep it running. This is optional — keyword search over SQLite still works without it.

Summaries look generic / templated No Ollama and no ANTHROPIC_API_KEY were found, so the pipeline is using its extractive fallback (real data, no LLM). Either run ollama pull llama3.2 && ollama pull nomic-embed-text and start Ollama, or set AI_PROVIDER=anthropic and ANTHROPIC_API_KEY in .env (see Configuration).

Extension isn't capturing pages Confirm it's loaded at brave://extensions with Developer mode on, and that you clicked Load unpacked on the /extension folder specifically (not the repo root). After pulling new commits, click the extension's reload icon — Manifest V3 service workers don't hot-reload.

A request to /api/... gets a 403 That's expected outside the extension — the HTTP bridge only accepts chrome-extension:///moz-extension:// origins (see Security). Calling it from curl or a browser tab's console will always 403.

Extension worked before, now every request 403s ("Origin not allowed") The bridge pins the extension's origin on first contact and only trusts that exact origin afterward (see Security). If you moved/re-cloned the repo (the unpacked extension gets a new ID at a new path) or loaded a second copy of the extension, the pinned origin no longer matches. Delete storage/trusted-origin.json and restart the MCP server to re-pin against whichever extension talks to it next.


Project Structure

BraveMCP/
├── extension/              # Manifest V3 browser extension
│   ├── background.js       # Service worker: tab sync, bookmarks
│   ├── content.js          # DOM extraction for page capture
│   ├── manifest.json
│   └── popup/              # Extension UI
├── mcp-server/             # Node.js MCP server
│   ├── src/
│   │   ├── index.ts        # MCP tools + Express HTTP bridge
│   │   ├── storage/
│   │   │   ├── database.ts # SQLite schema, FTS5, migrations
│   │   │   └── chroma.ts   # ChromaDB client
│   │   └── ai/
│   │       └── pipeline.ts # Embeddings + summarization pipeline
│   └── tsconfig.json
├── scripts/
│   └── setup.js            # One-command setup script
├── storage/                # SQLite DB + trusted-origin.json (git-ignored)
└── package.json            # Root: runs setup script

Roadmap

  • Phase 1 — MCP server scaffold

  • Phase 2 — SQLite storage layer (FTS5, migrations)

  • Phase 3 — Browser extension (Manifest V3)

  • Phase 4 — Vector search + AI pipeline (Ollama / Anthropic fallback)

  • Phase 5 — Advanced tools (digest, sessions, forgotten content, tab cleanup)

  • Phase 6 — Polish + public release (v0.2.0: tests, CI, lint, security hardening)

  • Phase 7 — Origin-trust hardening (v0.3.0: extension-origin pinning via trust-on-first-use)


Contributing

See CONTRIBUTING.md for guidelines.

License

MIT — built by Yehezkiel Tampubolon

A
license - permissive license
-
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
1wRelease cycle
2Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Persistent memory for Claude Code. Automatically indexes every conversation and provides production-grade hybrid search (BM25 + vectors + reranker) via MCP tools. 100% local, zero config, zero API keys, zero invoice.
    Last updated
    16
    43
    7
    MIT
  • A
    license
    -
    quality
    D
    maintenance
    An MCP server and background daemon that captures Discord and Telegram conversations locally to provide persistent memory for Claude Code sessions. It enables hybrid search and automatic context injection of chat history to maintain continuity across development sessions.
    Last updated
    8
    22
    MIT

View all related MCP servers

Related MCP Connectors

  • User-owned memory for AI agents, Copilot, Claude, IDEs, CLIs, and chat apps over remote MCP.

  • One memory, every AI: Claude, ChatGPT, Perplexity, Gemini, Cursor, OpenClaw, Hermes, any MCP client.

  • Cross-AI personal memory. Save once in ChatGPT, recall in Claude, Mistral, Grok, or any MCP client.

View all MCP Connectors

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/glatinone/BraveMCP'

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