Как дать Claude Desktop «память» всего, что вы читаете в браузере

Claude Desktop умеет читать файлы, терминал и экран, но не помнит, какие страницы вы открывали вчера. Разрыв закрывает BraveMCP через Model Context Protocol: расширение индексирует просмотры на вашей машине, а агент обращается к ним через MCP-инструменты — без облака и трекинга.
Разрыв между агентом и браузером, который закрывает MCP
Разработчик kielltampubolon описывает BraveMCP как локальный «second brain» для Claude Desktop: всё остаётся на машине пользователя — «No cloud, no tracking». Расширение на Manifest V3 собирает историю просмотров, закладки, выделения через контекстное меню и заметки; конкретный браузер в материале не назван — речь только о «browser extension» в песочнице.
Для агента это не абстрактная «память», а индексированные события. Claude обращается к ним через MCP и не отправляет данные в облако.
stdio против HTTP: почему понадобился мост на порту 3747
Архитектурное ограничение задало форму всей связки. MCP-серверы общаются с Claude Desktop по stdio — JSON-RPC на stdin и stdout. Расширение в sandbox может делать исходящие HTTP-запросы, но по stdio говорить не может: две половины системы напрямую не свяжутся.
Решение — HTTP-мост. Express-сервер на порту 3747 живёт в том же процессе, что и MCP-сервер. Расширение POST-ит события просмотра; при вызове инструментов Claude сервер читает из общей базы. К Desktop транспорт остаётся stdio, как требует MCP.
Сервер экспонирует 13 MCP tools. Названы пять: search_memory, find_forgotten_content, summarize_research_topic, generate_weekly_digest, suggest_tab_cleanup — и другие.
Локальный гибридный поиск: SQLite FTS5 и ChromaDB
Поиск по «памяти» — гибрид двух слоёв. SQLite + FTS5 даёт BM25 keyword ranking по заголовкам, summary, заметкам и выделениям. ChromaDB — cosine vector similarity: в примере из поста запрос «MCP security» находит страницу «Claude agent hardening».
Совпадения из обоих источников сливаются в Map; если id есть в обоих — relevance умножается на 1.1. Если ChromaDB не запущен, сервер переходит на FTS5-only без падения — local-first подразумевает работу с тем, что реально поднято на машине.
Ollama, Anthropic и extractive-режим без LLM
При захвате страницы BraveMCP генерирует summary и embedding. Сначала — Ollama локально: llama3.2 для summaries, nomic-embed-text для embeddings. Затем fallback на Anthropic API.
Ранняя версия без LLM возвращала шаблонные строки; автор переписал fallback на extractive-режим — реальные сниппеты из SQLite с группировкой по домену. При синтезе темы без модели возвращаются «genuine sources»: разный вход даёт разный выход.
Инструмент find_forgotten_content комбинирует hybrid search с re-rank по времени и визитам:
timeDecay = max(0.5, exp(-0.01 * daysElapsed))
visitBoost = 1 + 0.2 * log(visitCount)
adjusted = min(0.99, relevance * timeDecay * visitBoost)
Страница, открытая трижды на прошлой неделе, может обойти однократный визит сегодня — логика «забытого», но важного контекста для агента.
Два бага, которые ломали JSON-RPC и состояние
Практика MCP добавила уроки, не видные в схеме на бумаге. dotenv v17 печатал статусную строку в stdout и ломал JSON-RPC — Claude Desktop отвечал Unexpected token; фикс — pin dotenv@16.
Второй сбой — dual-process state: Claude Desktop и dev-клиент порождают отдельные копии MCP-сервера, и только экземпляр на порту 3747 получает данные расширения. Выход — SQLite как source of truth вместо in-memory state.
Проект open source под лицензией MIT; репозиторий — github.com/glatinone/BraveMCP. Есть test suite на Node built-in runner, подключённый к CI. Что касается шифрования at-rest, retention и аудита доступа MCP-tools к истории — в исходном посте этого нет; утверждать без дополнительного источника нельзя.
Источники
- I gave Claude a memory of everything I browse — here's the architecture — kielltampubolon, dev.to, 2026-06-15
- BraveMCP — репозиторий проекта (MIT)