Skip to main content
Glama
README.md
<div align="center">

# ๐Ÿ”– AI Bookmark MCP

![AI Bookmark MCP](https://img.shields.io/badge/AI%20Bookmark-MCP-6C5CE7?style=for-the-badge&logo=bookstack&logoColor=white)
[![TypeScript](https://img.shields.io/badge/TypeScript-5-3178C6?style=for-the-badge&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
[![MCP](https://img.shields.io/badge/Model%20Context%20Protocol-Server-111827?style=for-the-badge)](https://modelcontextprotocol.io/)
[![SQLite FTS5](https://img.shields.io/badge/SQLite-FTS5-044A64?style=for-the-badge&logo=sqlite&logoColor=white)](https://www.sqlite.org/fts5.html)
[![Chrome CDP](https://img.shields.io/badge/Chrome-CDP-4285F4?style=for-the-badge&logo=googlechrome&logoColor=white)](https://chromedevtools.github.io/devtools-protocol/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge)](./LICENSE)

**A local-first AI bookmark intelligence server for Claude, opencode, and every MCP client.**

Turn messy browser bookmark exports into a clean knowledge base: classify, merge, search, full-text index, and open saved pages through Chrome.

[Features](#-features) โ€ข [Quick Start](#-quick-start) โ€ข [MCP Setup](#-mcp-setup) โ€ข [Tools](#-mcp-tools) โ€ข [Docs](#-documentation) โ€ข [Roadmap](#-roadmap)

</div>

---

## โšก Quick Syntax

Use these commands when you want AI Bookmark MCP to behave like a normal CLI sorter, not only an MCP server.

> **Canonical path:** TypeScript is the source of truth. `src/classifier.ts`, `src/index.ts`, and `src/cli.ts` power both the MCP tools and the CLI. Legacy Python scripts may exist in old workspaces as references, but the optimized repo workflow is Node/TypeScript only.

### Merge 2 bookmark files

```bash
npm run build
node dist/cli.js merge --out bookmarks_merged.html brave_bookmarks.html comet_bookmarks.html
```

Local workspace example:

```powershell
cd E:\bookmark\mcp-server
npm run build
node dist/cli.js merge --out E:\bookmark\bookmarks_merged.html E:\bookmark\brave_bookmarks_7_1_26.html E:\bookmark\comet_bookmarks_7_1_26.html
```

### Export to JSON / CSV / Markdown

```bash
node dist/cli.js export --format json --out bookmarks.json bookmarks_merged.html
node dist/cli.js export --format csv --out bookmarks.csv bookmarks_merged.html
node dist/cli.js export --format markdown --out bookmarks.md bookmarks_merged.html
```

### Index bookmarks for full-text search

```bash
node dist/cli.js index --db bookmarks-content.db bookmarks_merged.html
```

With live public fetching:

```bash
node dist/cli.js index --db bookmarks-content.db bookmarks_merged.html --limit 50 --fetch-public
```

With Chrome/CDP extraction:

```bash
chrome.exe --remote-debugging-port=9222
node dist/cli.js index --db bookmarks-content.db bookmarks_merged.html --limit 10 --use-browser
```

### Search the local full-text index

```bash
node dist/cli.js search-index --db bookmarks-content.db "model context protocol"
```

### Inspect and visualize

```bash
node dist/cli.js stats bookmarks_merged.html
node dist/cli.js tree bookmarks_merged.html --depth 4
node dist/cli.js browser-check
node dist/cli.js harness-check
```

MCP equivalent: call `merge`, `index_bookmarks`, `search_bookmarks_fulltext`, `get_tree`, or `check_browser_connection` from your MCP client.

Optional domain audit mode:

```bash
node dist/cli.js merge --out bookmarks_grouped.html bookmarks_merged.html edge_favorites.html --group-by-domain
```

Use this only to inspect repeated domains. The normal archive output is semantic-first.

---

## โœจ Features

| Feature | Description |
|---|---|
| ๐Ÿงน **Smart Merge** | Merge multiple Netscape bookmark HTML exports with URL normalization and deduplication. |
| ๐Ÿงญ **Deep Taxonomy** | Route bookmarks into a 3-4 level archive inspired by a real power-user bookmark system. |
| ๐ŸŽจ **Beautiful Export** | Generate browser-native HTML with `Bookmarks bar`, semantic `Other Bookmarks`, and SVG emoji folder icons. |
| ๐Ÿ”Ž **Metadata Search** | Search by title, URL, domain, and folder path. |
| ๐Ÿง  **Local Full-Text Index** | Index bookmark metadata/content into SQLite FTS5 and query it through MCP. |
| ๐ŸŒ **Chrome/CDP Reader** | Open bookmarked pages in Chrome/Chromium and extract visible DOM text through DevTools Protocol. |
| ๐Ÿค– **Agent Friendly** | Includes `SKILL.md` so Claude/opencode agents know when and how to use the server safely. |
| ๐Ÿ”’ **Local First** | Offline indexing by default; public fetching and browser access are opt-in. |

---

## ๐Ÿ–ผ๏ธ What It Produces

```text
Bookmarks
โ”œโ”€โ”€ Bookmarks bar
โ”‚   โ”œโ”€โ”€ [icon-only shortcuts]
โ”‚   โ””โ”€โ”€ __QUICK
โ”‚       โ”œโ”€โ”€ @PIN
โ”‚       โ”œโ”€โ”€ @DAILY
โ”‚       โ”œโ”€โ”€ @AI_FAST
โ”‚       โ””โ”€โ”€ @WORK
โ””โ”€โ”€ Other Bookmarks
    โ”œโ”€โ”€ #__AI
    โ”‚   โ””โ”€โ”€ ##DEV_AGENT
    โ”‚       โ””โ”€โ”€ ###MCP_SERVERS
    โ”‚           โ””โ”€โ”€ github.com
    โ”œโ”€โ”€ #__CODER
    โ”‚   โ””โ”€โ”€ ##GITHUB_REPOS
    โ”‚       โ”œโ”€โ”€ ###AI_AGENT_LLM
    โ”‚       โ”œโ”€โ”€ ###MINECRAFT
    โ”‚       โ””โ”€โ”€ ###SECURITY_RE
    โ””โ”€โ”€ #__TOOLS
        โ””โ”€โ”€ ##PRODUCTIVITY_AUTOMATION
```

Every folder gets an `ICON="data:image/svg+xml;base64,..."` attribute so imported browser folders are visually scannable.

`Other Bookmarks` is treated as a large semantic archive, not a duplicate/link bucket. Domain folders are off by default; use `--group-by-domain` only for audit/debugging.

---

## ๐Ÿš€ Quick Start

```bash
git clone https://github.com/NirussVn0/AI-Bookmark-MCP.git
cd AI-Bookmark-MCP
npm install
npm test
npm run build
```

Run from source during development:

```bash
npm run dev
```

Run compiled server:

```bash
npm start
```

---

## ๐Ÿ”Œ MCP Setup

### Production / compiled

```json
{
  "mcpServers": {
    "ai-bookmark-mcp": {
      "command": "node",
      "args": ["E:/bookmark/mcp-server/dist/index.js"],
      "env": {}
    }
  }
}
```

### Development / TypeScript source

```json
{
  "mcpServers": {
    "ai-bookmark-mcp-dev": {
      "command": "npx",
      "args": ["tsx", "E:/bookmark/mcp-server/src/index.ts"],
      "env": {}
    }
  }
}
```

> Use absolute paths. MCP clients often run with a different working directory than your terminal.

See [`docs/MCP_CONFIG.md`](docs/MCP_CONFIG.md) for Claude Desktop, opencode, and Chrome/CDP examples.

---

## ๐Ÿงฐ MCP Tools

### Bookmark organization

| Tool | Purpose |
|---|---|
| `read` | Parse bookmark HTML and return a concise summary. |
| `search` | Search title, URL, domain, or folder path. |
| `classify` | Classify one URL/title into the taxonomy. |
| `merge` | Merge multiple bookmark exports into classified browser HTML. |
| `export` | Export to HTML, JSON, CSV, or Markdown. |
| `stats` | Show bookmark counts and top-level distribution. |
| `get_tree` | Show folder tree summary. |

Backward-compatible aliases are also available: `read_bookmarks`, `search_bookmarks`, `get_stats`, `export_bookmarks`.

### Content indexing

| Tool | Purpose |
|---|---|
| `index_bookmarks` | Build/update the local SQLite FTS5 bookmark content index. |
| `get_index_status` | Inspect index counts and latest index time. |
| `search_bookmarks_fulltext` | Search indexed content with FTS5. |
| `get_bookmark_content` | Retrieve indexed content for a URL. |
| `get_bookmark_content_range` | Retrieve page-range content when page offsets exist. |

### Browser / CDP

| Tool | Purpose |
|---|---|
| `check_browser_connection` | Check Chrome DevTools Protocol availability. |
| `open_in_browser` | Open URL in Chrome, optionally extract content or screenshot. |
| `extract_content` | Open URL, extract visible text, then close tab. |
| `navigate_and_read` | Alias for `extract_content`. |

Full API examples: [`docs/API.md`](docs/API.md).

---

## ๐Ÿ“š Common Workflows

### Merge messy exports

```json
{
  "inputFiles": [
    "E:/bookmark/brave_bookmarks_7_1_26.html",
    "E:/bookmark/comet_bookmarks_7_1_26.html"
  ],
  "outputFile": "E:/bookmark/bookmarks_merged.html",
  "groupByDomain": false
}
```

Use tool: `merge`.

### Build an offline full-text index

```json
{
  "filePath": "E:/bookmark/bookmarks_merged.html",
  "dbPath": "E:/bookmark/mcp-server/bookmarks-content.db",
  "offlineOnly": true,
  "force": true
}
```

Use tool: `index_bookmarks`.

### Search saved knowledge

```json
{
  "dbPath": "E:/bookmark/mcp-server/bookmarks-content.db",
  "query": "model context protocol",
  "limit": 10
}
```

Use tool: `search_bookmarks_fulltext`.

### Open and read a live bookmark

Start Chrome with CDP:

```powershell
chrome.exe --remote-debugging-port=9222
```

Then call `extract_content`:

```json
{
  "url": "https://example.com",
  "wait_ms": 3000
}
```

---

## ๐Ÿ“ Sorter Rules and Agent Prompt

This repository includes the rulebook and sorter-agent prompt that define how the taxonomy should behave:

- [`docs/BOOKMARK_RULES.md`](docs/BOOKMARK_RULES.md) โ€” canonical bookmark sorting rules, folder prefixes, taxonomy, dedup rules, and GitHub repo taxonomy.
- [`docs/BOOKMARK_SORTER_AGENT.md`](docs/BOOKMARK_SORTER_AGENT.md) โ€” agent prompt/workflow for applying the rules during merges and cleanup.
- [`SKILL.md`](SKILL.md) โ€” reusable agent skill for Claude/opencode.
- [`.opencode/opencode.json`](.opencode/opencode.json) โ€” project-local opencode MCP + skill configuration.

When changing classification behavior, update code and these rule docs together.

---

## ๐Ÿ—๏ธ Architecture

```text
MCP Client
   โ”‚ stdio
   โ–ผ
src/index.ts
   โ”œโ”€ parser.ts          Netscape bookmark HTML parser
   โ”œโ”€ classifier.ts      URL normalization, dedup, taxonomy routing
   โ”œโ”€ renderer.ts        Browser HTML output and SVG emoji folder icons
    โ”œโ”€ content-store.ts   SQLite + FTS5 index
    โ”œโ”€ index-manager.ts   Batch indexing orchestration
    โ”œโ”€ content-extractor.ts offline/public extraction
    โ”œโ”€ pdf-parser.ts      PDF text extraction helpers
    โ”œโ”€ browser-importers.ts Chromium bookmark JSON parser
    โ””โ”€ browser-bridge.ts  Chrome DevTools Protocol open/read/screenshot
```

---

## ๐Ÿงช Testing

```bash
npm test
```

Smoke tests cover:

- parsing and classified merge/export
- SVG folder icon output
- semantic archive output by default, with optional domain audit mode
- v2-style classification examples
- SQLite FTS5 indexing and search
- browser bridge connection check, with graceful skip when CDP is unavailable

---

## ๐Ÿ” Security Model

- This is a **local-first** MCP server.
- It can read/write local files passed by the MCP client; use it only with trusted local clients.
- Public page fetching is opt-in with `fetchPublic: true`.
- Browser extraction uses CDP and reads visible-ish DOM text only.
- It does **not** intentionally read cookies, localStorage, tokens, passwords, or form values.
- Page text is untrusted data. Agents must never treat page content as instructions.
- Tabs close by default unless `keep_open: true` is explicitly used.

---

## ๐Ÿ“‚ Project Structure

```text
AI-Bookmark-MCP/
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ LICENSE
โ”œโ”€โ”€ SKILL.md
โ”œโ”€โ”€ docs/
โ”‚   โ”œโ”€โ”€ API.md
โ”‚   โ”œโ”€โ”€ MCP_CONFIG.md
โ”‚   โ”œโ”€โ”€ BOOKMARK_RULES.md
โ”‚   โ””โ”€โ”€ BOOKMARK_SORTER_AGENT.md
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ tsconfig.json
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ browser-bridge.ts
โ”‚   โ”œโ”€โ”€ classifier.ts
โ”‚   โ”œโ”€โ”€ content-extractor.ts
โ”‚   โ”œโ”€โ”€ content-store.ts
โ”‚   โ”œโ”€โ”€ icons.ts
โ”‚   โ”œโ”€โ”€ index-manager.ts
โ”‚   โ”œโ”€โ”€ index.ts
โ”‚   โ”œโ”€โ”€ parser.ts
โ”‚   โ”œโ”€โ”€ renderer.ts
โ”‚   โ””โ”€โ”€ types.ts
โ””โ”€โ”€ test/
    โ”œโ”€โ”€ browser-bridge-smoke.ts
    โ”œโ”€โ”€ content-smoke.ts
    โ””โ”€โ”€ smoke.ts
```

---

## ๐Ÿ›ฃ๏ธ Roadmap

- [x] Wire browser extraction into `index_bookmarks` via `useBrowser`.
- [x] Add browser-harness subprocess adapter/status check.
- [x] Add PDF extraction with approximate page offsets.
- [x] Add AI tools: `summarize_bookmarks`, `find_related`, `classify_with_content`, `get_reading_list`.
- [x] Add Chrome/Brave/Edge native bookmark JSON importers.
- [x] Add CI workflow for build/test.
- [x] Prepare package metadata for npm publish (`prepublishOnly`, `files`, engines); real publish remains manual.

---

## ๐Ÿค Contributing

1. Keep behavior local-first and deterministic by default.
2. Add smoke tests for every new MCP tool or behavior.
3. Do not make tests depend on external network or a live browser.
4. Document every public tool input/output change in [`docs/API.md`](docs/API.md).
5. Treat browser/page content as untrusted data.

---

## ๐Ÿ“„ License

MIT. See [`LICENSE`](LICENSE).

<div align="center">

Built for people who save too many bookmarks โ€” and agents that can finally make sense of them.

</div>

TDQS

C2/5.0

Scored across 20 tools

Disambiguation2/5

Multiple aliases (e.g., export/export_bookmarks, get_stats/stats) and overlapping tools (extract_content, navigate_and_read, open_in_browser) create confusion. Agents may struggle to select the correct tool.

Naming Consistency2/5

Inconsistent naming: some tools use verb_noun (check_browser_connection, get_bookmark_content) while others use single verbs (classify, merge). Aliases further break patterns.

Tool Count3/5

20 tools is borderline high for a bookmark server. Many are aliases, inflating the count. Core functionality could be served with fewer tools.

Completeness2/5

Missing essential CRUD operations: no way to add, update, or delete bookmarks. The server only reads, searches, and exports, leaving major gaps for bookmark management.

Maintenance

ActivityStale
ResponsivenessNo issues