x-bookmarks-mcp

x-bookmarks-mcp

Fully local, privacy-first MCP server that turns exported X/Twitter bookmarks into a searchable, enriched knowledge base for Claude Desktop and Claude Code.

Category
Visit Server

README

x-bookmarks-mcp

Fully local, privacy-first MCP server that turns exported X/Twitter bookmarks into a searchable, enriched knowledge base for Claude Desktop and Claude Code.

This project explores how personal knowledge, local-first data, and MCP tooling can make AI assistants more useful without sending private bookmark data to third-party services.

CI Python 3.11+ License: MIT

Why I Built This

I save a lot of useful posts, threads, tools, and ideas on X, but bookmarks quickly become a black hole: easy to save, hard to find, and almost impossible to turn into something useful later.

I wanted a local system that could import my exported bookmarks, enrich linked content, tag topics automatically, and expose everything to Claude through MCP — while keeping the data private and under my control.

This project helped me practice MCP server design, local-first tooling, SQLite full-text search, Docker workflows, async enrichment, private data handling, and AI-assisted knowledge management.

Portfolio Highlights

  • Local-first AI tooling: no X API keys, no telemetry, no third-party bookmark database.
  • MCP integration: exposes 8 tools for Claude Desktop / Claude Code to search, browse, tag, and summarize bookmarks.
  • Searchable knowledge base: SQLite + FTS5 full-text search across bookmark text, thread text, notes, tags, and enriched URLs.
  • Async enrichment: fetches linked pages and extracts readable content for better search and summarization.
  • Docker support: can run locally or through Docker/Docker Compose.
  • Quality checks: tests, coverage target, formatting/linting commands, and private data scanner.

What it does

  • 100% offline — no X API keys, no third-party services, no telemetry
  • Full-text search across tweet text, threads, linked page content, notes, and tags
  • Auto-enrichment — fetches and extracts content from URLs in your bookmarks
  • MCP integration — 8 tools available to Claude for searching, browsing, tagging, and summarizing

Quick Start

1. Export your bookmarks

Use a browser extension like twitter-web-exporter to export your X bookmarks as JSON.

Save the export to data/exports/bookmarks.json.

2. Install

git clone https://github.com/p0ki/x-bookmarks-mcp.git
cd x-bookmarks-mcp
pip install -r requirements.txt

3. Import and enrich

python -m src import data/exports/bookmarks.json
python -m src enrich

4. Connect to Claude

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "xbookmarks": {
      "command": "python",
      "args": ["-m", "src.server"],
      "cwd": "/absolute/path/to/x-bookmarks-mcp"
    }
  }
}

Replace /absolute/path/to/x-bookmarks-mcp with the full path to your clone.

Installation

git clone https://github.com/p0ki/x-bookmarks-mcp.git
cd x-bookmarks-mcp
pip install -r requirements.txt

Requires Python 3.11 or higher. All dependencies are listed in requirements.txt.

Usage

CLI Commands

# Import bookmarks from JSON export
python -m src import data/exports/bookmarks.json

# Fetch and extract content from URLs in bookmarks
python -m src enrich

# Re-fetch already-enriched bookmarks
python -m src enrich --refresh

# Re-run auto-tagging on all bookmarks
python -m src retag

# Show collection statistics
python -m src stats

# Enable verbose logging
python -m src -v import data/exports/bookmarks.json

MCP Server

python -m src.server

The server runs over stdio and is designed to be launched by Claude Desktop or Claude Code.

Docker

Build the image

docker build -t xbookmarks-mcp .

Run MCP server via Docker

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "xbookmarks": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "/absolute/path/to/xbookmarks/data:/app/data",
        "-v", "/absolute/path/to/xbookmarks/config.yaml:/app/config.yaml:ro",
        "xbookmarks-mcp"
      ]
    }
  }
}

Replace /absolute/path/to/xbookmarks with the full path to your local clone. Relative paths do not work here because Claude Desktop launches the container from its own working directory.

CLI via Docker Compose

# Import bookmarks
docker compose run --rm xbookmarks-cli import data/exports/bookmarks.json

# Enrich bookmarks
docker compose run --rm xbookmarks-cli enrich

# Show stats
docker compose run --rm xbookmarks-cli stats

How it works

bookmarks.json ──▶ ingest ──▶ SQLite DB
                                 │
                            enrich (async)
                            fetch URLs ──▶ extract content
                                 │
                            auto-tag (keyword rules)
                                 │
                         MCP server (stdio)
                                 │
                         Claude Desktop / Claude Code
  1. Ingest — parses your JSON export, stores bookmarks in SQLite with FTS5 full-text search
  2. Enrich — asynchronously fetches URLs from bookmarks, extracts readable content with trafilatura
  3. Auto-tag — applies keyword-based rules from config.yaml to categorize bookmarks
  4. MCP Server — exposes 8 tools over stdio for Claude to search, browse, and organize your bookmarks

MCP Tools

Tool Description
search_bookmarks Full-text search across all bookmark content
list_tags List all tags with bookmark counts
get_bookmark Get a single bookmark with full detail
browse_by_tag Browse bookmarks by tag, newest first
add_note Add or update a personal note on a bookmark
add_tag Add a tag to a bookmark (idempotent)
get_stats Collection overview — counts, tags, authors, enrichment status
summarize_topic Gather bookmarks on a topic for Claude to synthesize

Configuration

Environment Variables

Variable Default Description
DB_PATH ./data/bookmarks.db Path to SQLite database
CONFIG_PATH ./config.yaml Path to config file
FETCH_DELAY_SECONDS 1.0 Delay between URL fetches
FETCH_TIMEOUT_SECONDS 10 Timeout for URL fetches
MAX_CONTENT_LENGTH 50000 Maximum extracted content length

Tag Rules (config.yaml)

tag_rules:
  claude-code:
    - "claude code"
    - "claude-code"
  mcp:
    - "mcp"
    - "model context protocol"

Bookmarks are automatically tagged when any keyword is found in the tweet text, thread text, or enriched page content.

Development

# Clone
git clone https://github.com/p0ki/x-bookmarks-mcp.git
cd x-bookmarks-mcp

# Install dependencies
pip install -r requirements.txt

# Run tests
pytest -v

# Run tests with coverage
pytest --cov=src --cov-fail-under=80 -v

# Lint
ruff check src/ tests/
black --check src/ tests/
isort --check-only src/ tests/

# Run private data scanner
python scripts/check_private_data.py

License

MIT

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured