The Goal

By the end of this blueprint, you will have a working MCP server that:

  • Saves bookmarks with titles, URLs, tags, and notes
  • Searches your collection by keyword, tag, or domain
  • Organizes with tags — add, remove, and filter by tags
  • Exposes your collection as resources Claude can browse
  • Runs locally and connects to Claude Desktop or Claude Code

You will open Claude and say things like:

"Save this article: https://example.com/great-post — tag it with 'AI' and 'research'"

"What bookmarks do I have about machine learning?"

"Show me everything I saved this week"

...and Claude will execute these against your local bookmark database.

Why This Stack

ChoiceWhy
Node.js + TypeScriptThe MCP SDK is most mature in TypeScript. Most developers already know JS.
STDIO transportThe simplest transport — no HTTP server, no ports, no auth. Claude Desktop launches your server as a subprocess.
SQLite (via better-sqlite3)Zero-config database. No external services. Your data stays on your machine.
Official MCP SDK@modelcontextprotocol/sdk — the reference implementation maintained by Anthropic.

How MCP Works (30-Second Version)

MCP defines three primitives your server can expose:

  • Tools — Actions Claude can take (save a bookmark, search, tag)
  • Resources — Data Claude can read (your bookmark collection, tag list)
  • Prompts — Reusable templates (weekly digest, tag cleanup)

Claude discovers these capabilities automatically when it connects to your server.

Project Structure

Here is what we will build:

bookmark-mcp/
├── src/
│   ├── index.ts          # Server entry point
│   ├── db.ts             # SQLite database setup and queries
│   ├── tools.ts          # MCP tool definitions
│   ├── resources.ts      # MCP resource definitions
│   └── prompts.ts        # MCP prompt templates
├── package.json
├── tsconfig.json
└── bookmarks.db          # Created automatically at runtime

Let's start building.