Linkwise - Save, annotate, chat with everything you've read. | Product Hunt
Model Context Protocol

MCP server

Your library as a set of tools an assistant can use. Ask Claude what you saved about a topic and it searches your links, reads the article text and answers from it, instead of guessing.

What it is

A Model Context Protocol server sitting in front of the same API the rest of these pages document. An MCP client connects to one URL, asks what tools are available, and calls them on your behalf. There is nothing to install and nothing to run locally.

  • 17 tools, generated from the same OpenAPI document as the API reference and the CLI, so they cannot drift from the endpoints they call.
  • Authenticated with a normal key. The same lw_pat_ token you would use from a script, carrying whatever scopes you gave it.
  • Scoped to the key, not to the assistant. A read-only key makes every write tool fail, whatever the model decides to call.
Endpoint
https://linkwise.app/mcp

Transport   Streamable HTTP (POST)
Auth        Authorization: Bearer lw_pat_...
Tools       17

Connect

Two things: the server URL and a key. Create the key first, from the developer dashboard, with the narrowest scopes that do what you want.

Server URL

https://linkwise.app/mcp

The server is POST-only over Streamable HTTP. A GET returns 405 by design: it never sends unsolicited messages, so there is no stream to open.

Verify
curl -s -X POST "https://linkwise.app/mcp" \
  -H "Authorization: Bearer $LINKWISE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list"
  }'

Claude Desktop

Add Linkwise as a connector under Settings, or edit the config file directly with the block beside this. Restart the app afterwards, then ask it something only your library would know.

The config file lives at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS and %APPDATA%\Claude\ on Windows.

claude_desktop_config.json
{
  "mcpServers": {
    "linkwise": {
      "type": "http",
      "url": "https://linkwise.app/mcp",
      "headers": {
        "Authorization": "Bearer lw_pat_..."
      }
    }
  }
}

Claude Code

One command. Scope it to a project or to your user, the way you would any other MCP server.

Terminal
claude mcp add linkwise \
  --transport http \
  --header "Authorization: Bearer lw_pat_..." \
  https://linkwise.app/mcp

claude mcp list

Other clients

Anything that speaks Streamable HTTP works. Point it at https://linkwise.app/mcp and send the key as an Authorization header. There is no OAuth dance and no client registration.

The server is a proxy in front of a Supabase edge function. The function keeps working on its own URL, so anything already configured against that address stays configured.

What it can reach

Exactly what the key allows, and nothing else. Of the 17 tools, 5 can change something in your library; the rest only read. A key created with read scopes leaves those 5 failing with forbidden, which is the right default for an assistant you are still getting to know.

Give it a key of its own
Not the one your scripts use. Separate keys mean you can revoke the assistant's access without breaking anything else, and the dashboard shows you which key made which call.

Tools

Grouped the way the API reference is grouped. Each one links to the endpoint it calls, where the parameters are documented in full.

Collections

list_collectionscollections:readGET /v1/collections

List the user's collections, with how many links each one holds.

create_collectioncollections:writePOST /v1/collections

Create a new collection to group links under.

name, description?, color_tag?, icon_name?

Tags

list_tagstags:readGET /v1/tags

List the user's tags with usage counts. Useful before tagging, so you reuse an existing tag rather than inventing a near-duplicate.

cursor?, limit?, q?

Highlights

list_highlightshighlights:readGET /v1/highlights

List passages the user highlighted while reading, newest first. Filterable to one link.

cursor?, limit?, link_id?, sort_by?, sort_order?

Discover

discover_feeddiscover:readGET /v1/discover

Get recommended articles the user has not saved yet, drawn from their interests.

cursor?, limit?, seed?, categories?, kinds?

Feeds

list_feedsfeeds:readGET /v1/feeds

List the RSS feeds the user subscribes to.

cursor?, limit?

Account

get_accountprofile:readGET /v1/me

Get the signed-in user's profile: name, username, plan and time zone. Use when you need to know who you are acting for.