Your library, inside your agents.

bookmark++ is a remote MCP server. Point any MCP client at one URL with your key and everything you saved — every video watched, every carousel read, every thread kept — becomes tools the agent can call. Nothing to install, nothing to clone, nothing running on your machine.

Set up in a minute

  1. Get a key. Open the app → Settings → MCP and copy the command for your app: your key is already inside. Free on every plan.
  2. Add the server with the command for your client below. Replace bmk_YOUR_KEY.
  3. Ask. “What was that video about running subagents?” The agent calls ask_library and cites the exact save.
Connected before November 2026? Reconnect your client (in Claude Code: /mcp) so it loads the new tools: get_saves, save_id on ask_library, and the search filters.

Claude Code

terminal
claude mcp add -s user --transport http bookmarkpp https://api.bookmarkpp.com/mcp \
  --header "Authorization: Bearer bmk_YOUR_KEY"

-s user makes it available in every project.

Cursor

Fastest: the app's Install in Cursor button fills in your key. By hand:

.cursor/mcp.json (project) or ~/.cursor/mcp.json (global)
{
  "mcpServers": {
    "bookmarkpp": {
      "url": "https://api.bookmarkpp.com/mcp",
      "headers": { "Authorization": "Bearer bmk_YOUR_KEY" }
    }
  }
}

Codex CLI

terminal
export BOOKMARKPP_KEY=bmk_YOUR_KEY
codex mcp add bookmarkpp --url https://api.bookmarkpp.com/mcp \
  --bearer-token-env-var BOOKMARKPP_KEY

Gemini CLI

terminal
gemini mcp add --transport http bookmarkpp https://api.bookmarkpp.com/mcp --header "Authorization: Bearer bmk_YOUR_KEY"

VS Code

terminal
code --add-mcp '{"name":"bookmarkpp","type":"http","url":"https://api.bookmarkpp.com/mcp","headers":{"Authorization":"Bearer bmk_YOUR_KEY"}}'

Or use the one-click Install in VS Code button in the app, which fills in your key.

Windsurf

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "bookmarkpp": {
      "serverUrl": "https://api.bookmarkpp.com/mcp",
      "headers": { "Authorization": "Bearer bmk_YOUR_KEY" }
    }
  }
}

Claude Desktop

claude_desktop_config.json (Settings → Developer). Needs Node.
{
  "mcpServers": {
    "bookmarkpp": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.bookmarkpp.com/mcp", "--header", "Authorization: Bearer bmk_YOUR_KEY"]
    }
  }
}
claude.ai’s web connectors need OAuth rather than a key header, so they can’t connect yet. Claude Code, Claude Desktop, Cursor, Codex and any MCP client that accepts headers work today.

The tools

Every save is already watched or read: the caption, the full transcript, every line of text shown on screen or on the slides, a summary, the key points, and the exact things it points to (a repo, a site, an app, an @handle, a promo code). The tools hand all of that to your agent.

ask_library

A plain-language question, answered with the saves it came from. Pass save_id to ask about one save only: it is read in full, and if it doesn’t have the answer the rest of your library is searched and the reply says so.

Same answers as the app’s Ask. One small model call, a few seconds. Counts against your monthly questions and shows up in the app’s chats.
search_saves

Keyword search over titles, gists, refs, names, key points, captions, on-screen text and transcripts. Each row shows a match line (where the words were found) and what full text get_save can return. Filter by collection, platform, kind, form or the last N days; page with cursor. Omit the query to list your newest saves.

Free: no model call. Use it to list, or when the words are known.
get_save

Everything stored about one save: the exact repos, links, sites, handles and codes it points to; gist, summary, your note, key points, names, specifics, quote, tags; the caption, the full transcript and every line of on-screen text; what couldn’t be read; whether the video itself was watched; whether the post is gone at the source.

The tool for exact names, links, repos, lists and steps.
get_saves

get_save for up to 10 saves in one call, in the order given.

save_link

Add a public TikTok, Instagram, X, LinkedIn or web URL. It’s fetched, read and filed in the background and becomes askable within a minute or two.

Counts against your monthly saves.
list_collections

Your collections with a description and the number of saves in each.

The raw API

The same endpoint speaks plain JSON-RPC, so a Shortcut, a Raycast script or a cron job can use it without an MCP client.

ask a question
curl -s https://api.bookmarkpp.com/mcp \
  -H "Authorization: Bearer bmk_YOUR_KEY" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"ask_library","arguments":{"question":"that dictation app for mac"}}}'
everything about one save
curl -s https://api.bookmarkpp.com/mcp \
  -H "Authorization: Bearer bmk_YOUR_KEY" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
       "params":{"name":"get_save","arguments":{"id":"SAVE_ID"}}}'
save a link (the plain POST /api/save route)
curl -s https://api.bookmarkpp.com/api/save \
  -H "Authorization: Bearer bmk_YOUR_KEY" -H "Content-Type: application/json" \
  -d '{"url":"https://www.tiktok.com/@…/video/…"}'

Transport: stateless Streamable HTTP. POST /mcp with a JSON-RPC request returns one JSON response; notifications return 202; no SSE stream, no session id. Protocol versions 2025-06-18 back to 2024-11-05.

Keys and safety

Connect your AI apps