History Sync
FreeNot checkedChrome extension + MCP server: ask Claude, Cursor, or any MCP-capable agent what you've been reading. Hosted or self-host.
About
Chrome extension + MCP server: ask Claude, Cursor, or any MCP-capable agent what you've been reading. Hosted or self-host.
README
A Chrome extension + small server that turns your browsing history into something your AI agents can query.
You install the extension. It captures pages you dwell on for 10+ seconds. Captured pages land on a server you trust (hosted or your own). Then you point Claude, Cursor, Claude Desktop, or any other MCP-capable client at that server and ask what you've been reading.
Status: friends-and-family alpha. Submitted to the Chrome Web Store; review pending. Until it's approved, install in developer mode (below).
Two ways to run it
| Hosted | Self-host | |
|---|---|---|
| Where data lives | history-sync.vercel.app (single operator's Vercel + Neon Postgres) |
Your machine or your server |
| Sign in | Google OAuth | Google OAuth (your own client) |
| MCP auth | OAuth via Stytch — the client does a consent screen | A long-lived bearer token you paste into your client |
| Setup time | < 1 min — install extension, sign in | ~30 min — see docs/SELF_HOSTING.md |
| Best for | Trying it out; you trust the operator with the same data Chrome already has | Anything you wouldn't put in someone else's database |
⚠ Data is stored in plaintext at rest. No end-to-end encryption yet (v2 territory). On the hosted version, the operator can see your captures the same way they can see anything on their own Postgres. If your browsing includes things you wouldn't share with a single trusted operator, self-host. Even self-hosted, data is plaintext in your Postgres — keep that server private.
What never gets captured, in either mode: incognito tabs, chrome:// pages, extension internals, form contents, passwords, cookies, page-body text beyond title + meta tags, sites matching your disallow list.
The full privacy policy is at history-sync.vercel.app/privacy.
Install the extension (developer mode)
Until the Web Store approval lands, install from source:
git clone https://github.com/bradthebeeble/history-sync
cd history-sync
pnpm install
pnpm --filter @history-sync/extension build
Then in Chrome (or any Chromium browser — Comet, Brave, etc.):
- Open
chrome://extensions - Toggle Developer mode on (top-right)
- Click Load unpacked
- Pick
apps/extension/.output/chrome-mv3/ - The History Sync icon appears in your toolbar — pin it for convenience
Note for self-hosters: if you also want the extension to talk to your own Google OAuth client (instead of the bake-time hosted one), rebuild with your client ID:
VITE_GOOGLE_CLIENT_ID=<your-client-id>.apps.googleusercontent.com \ VITE_SERVER_URL=https://<your-server> \ pnpm --filter @history-sync/extension buildThen add
https://<extension-id>.chromiumapp.org/as an authorized redirect URI on that Google OAuth client (the extension shows you the exact ID and URL on first sign-in attempt).
Connect the extension
Open the popup, click Sign in with Google, finish the consent flow.
- Hosted users: that's it — the extension is now syncing to
history-sync.vercel.app. - Self-hosters: expand the Server chip at the top of the popup, paste your server URL (e.g.
http://localhost:3000), save (the popup will sign you out), then sign in again — this time against your server.
The popup shows queue depth and last-sync timestamp so you can see capture working.
Connect your AI agent
The extension is the data pipe in. The MCP server is the data pipe out — for any agent that speaks Model Context Protocol over Streamable HTTP. Five tools are exposed:
| Tool | What it does |
|---|---|
ping |
Liveness check + identity echo |
search_history |
Full-text search by title + URL |
list_visits_by_date |
List visits in a date range, paginated |
count_by_domain |
Group visits by host, return top N |
get_page_metadata |
Look up the most recent visit for a specific URL |
Endpoint URLs
| Mode | URL |
|---|---|
| Hosted | https://history-sync.vercel.app/api/mcp/mcp |
| Self-host | https://<your-server>/api/mcp/mcp (or http://localhost:3000/api/mcp/mcp in dev) |
Authentication
Hosted (Stytch OAuth): the MCP client does the dance for you — it'll register itself via Dynamic Client Registration, open a consent screen in your browser, and store the resulting OAuth tokens. Most modern clients (Claude.ai, Claude Desktop, Cursor, MCP Inspector) handle this transparently when you just give them the URL.
Self-host (static token): sign in to your /grants page, click Generate token, give it a label like "Claude Desktop", copy the raw value (shown once). Then configure your client to send it as Authorization: Bearer <token>.
Client-specific setup
Claude.ai / Claude Desktop
In Claude's settings → Connectors (or MCP servers, depending on version):
- Name:
history-sync - URL: the endpoint URL above
- Auth: for hosted, leave on OAuth — Claude will prompt for sign-in. For self-host, choose Bearer / API key and paste your token.
Cursor
Settings → MCP → Add new MCP server → HTTP.
- Name:
history-sync - URL: the endpoint URL above
- Headers (self-host only):
Authorization: Bearer <your token>
Cursor handles OAuth in the hosted case the same way Claude does.
MCP Inspector (visual debugger)
npx -y @modelcontextprotocol/inspector
Opens a UI at http://localhost:6274.
- Transport Type: Streamable HTTP
- URL: the endpoint URL above
- Authentication (self-host): Bearer Token + paste your token
Connect, then explore the tools list and try calls interactively.
Anything else (raw curl)
The endpoint speaks MCP 2024-11-05 JSON-RPC over Streamable HTTP:
curl -s "$URL" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
Responses are SSE-framed when they cross transport-buffering boundaries; parse data: … lines.
Try it
Once your client is connected, just ask:
What blog posts did I read about Rust this week?
Top 10 domains I visited yesterday?
What was that LangChain GitHub issue I had open on Tuesday?
Disallow rules
Anything you don't want captured or stored — add a pattern:
- Web app:
/disallow—*.bank.com,mail.google.com,secret-project.notion.so - Extension popup: same — and a one-click "Block this site" button for the current tab
Pattern matches are retroactive: adding *.bank.com deletes any prior matching entries from the server, not just future ones.
Build it yourself / contribute
pnpm install
pnpm db:up # Postgres 16 in Docker
pnpm -r typecheck # workspace-wide tsc
| Path | What's there |
|---|---|
apps/server/ |
Next.js 15 app — /api/sync (extension), /api/mcp/mcp (agents), web dashboard (/grants, /history, /disallow, /privacy), Auth.js v5 + Prisma |
apps/extension/ |
Chrome MV3 extension — service worker, dwell tracker, sync queue, popup UI, content script for page metadata |
packages/shared-types/ |
Wire-format types shared between extension and server |
Useful scripts:
| Command | What |
|---|---|
pnpm db:up / db:down / db:logs |
Local Postgres lifecycle |
pnpm --filter @history-sync/server dev |
Run the server on :3000 |
pnpm --filter @history-sync/server prisma:migrate:deploy |
Apply migrations |
pnpm --filter @history-sync/extension dev |
Live-reload extension build |
pnpm --filter @history-sync/extension test |
Vitest |
pnpm typecheck |
Workspace-wide type check |
Default local Postgres URL (matches docker-compose.yml):
postgresql://history_sync:history_sync_dev@localhost:5432/history_sync
Docs
- Self-hosting guide — docs/SELF_HOSTING.md
- Privacy policy — history-sync.vercel.app/privacy
- Deployment notes (Vercel + Neon) — docs/deployment.md
License
MIT.
Installing History Sync
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/bradthebeeble/history-syncFAQ
Is History Sync MCP free?
Yes, History Sync MCP is free — one-click install via Unyly at no cost.
Does History Sync need an API key?
No, History Sync runs without API keys or environment variables.
Is History Sync hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install History Sync in Claude Desktop, Claude Code or Cursor?
Open History Sync on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
Playwright
Browser automation, scraping, screenshots
by MicrosoftPuppeteer
Browser automation and web scraping.
by modelcontextprotocolopentabs-dev/opentabs
Plugin-based MCP server + Chrome extension that gives AI agents access to web applications through the user's authenticated browser session. 100+ plugins with a
by opentabs-devrobhunter/agentdeals
1,500+ developer infrastructure deals, free tiers, and startup programs across 54 categories. Search deals, compare vendors, plan stacks, and track pricing chan
by robhunterhlydecker/ucsc-genome-mcp
MCP server to interact with the UCSC Genome Browser API, letting you find genomes, chromosomes, and more.
by hlydecker34892002/bilibili-mcp-js
A MCP server that supports searching for Bilibili content. Provides LangChain integration examples and test scripts.
by 34892002achiya-automation/safari-mcp
Native Safari browser automation for AI agents with 80+ tools. No Chrome dependency, optimized for Apple Silicon with 60% less CPU overhead.
by achiya-automationagent-infra/mcp-server-browser
Browser automation capabilities using Puppeteer, both support local and remote browser connection.
by bytedanceaparajithn/agent-scraper-mcp
Web scraping MCP server for AI agents. 6 tools: clean content extraction, structured scraping with CSS selectors, full-page screenshots via Playwright, link ext
by aparajithnapireno/DOMShell
Browse the web using filesystem commands (ls, cd, grep, click). 38 MCP tools map Chrome's Accessibility Tree to a virtual filesystem via a Chrome Extension.
by apirenoCompare History Sync with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All browse MCPs
