MCP

One remote MCP server for every AI app, and the same server locally through the CLI. Sign-in is OAuth: the app registers itself, the person approves once.

The server

Server URL
https://mcp.sixteenbridges.com/mcp
TransportStreamable HTTP, stateless: one JSON response per request, no sessions.
Protocol2025-11-25
Sign-inOAuth 2.1 with PKCE and dynamic client registration (below).
Toolslist, read, search, save, update, delete (to the trash), list the trash, restore, share, list shares.

Connect an app

Terminal agents add it with one command; their first use opens the browser to sign in.

Claude Code

Terminal
claude mcp add --transport http sixteen-bridges https://mcp.sixteenbridges.com/mcp
  1. In Claude Code, run /mcp, pick sixteen-bridges and sign in. Allow it on sixteenbridges.com.

Codex

Terminal
codex mcp add sixteen-bridges --url https://mcp.sixteenbridges.com/mcp
codex mcp login sixteen-bridges
  1. The login opens your browser: Allow it on sixteenbridges.com.

Gemini CLI

Terminal
gemini mcp add --transport http sixteen-bridges https://mcp.sixteenbridges.com/mcp
  1. In Gemini CLI, run /mcp auth sixteen-bridges. Allow it on sixteenbridges.com.

Chat apps add it in their settings. Each app decides which of its plans can add a custom connector.

Claude (claude.ai, Desktop)

  1. Open Settings → Connectors and choose Add custom connector.
  2. Name it Sixteen Bridges and paste the URL: https://mcp.sixteenbridges.com/mcp
  3. Choose Connect, then Allow on sixteenbridges.com.

Free plans can add one custom connector.

ChatGPT

  1. Turn on Developer mode: Settings → Apps (or Connectors) → Advanced settings.
  2. Create an app or connector named Sixteen Bridges with the URL https://mcp.sixteenbridges.com/mcp and OAuth sign-in.
  3. Allow it on sixteenbridges.com, then turn it on in the chat.

Developer mode is on paid plans, and saving or editing bubbles from ChatGPT may need a Business or Enterprise plan. Workspace admins may need to allow custom apps first.

Gemini (gemini.google.com)

  1. On a computer, open gemini.google.com → Settings → Connected Apps. If it isn't there, open Personal Intelligence first.
  2. Under Custom apps, choose Add a custom app.
  3. Paste the URL https://mcp.sixteenbridges.com/mcp and choose Next. Leave Advanced features empty: it signs in by itself.
  4. Follow the prompts (name it Sixteen Bridges if asked), then Allow on sixteenbridges.com.
  5. In a chat, type @ and pick Sixteen Bridges.

Custom apps are only for people 18 or over in the US, on a personal Google account (not work or school), in English, with Keep Activity on. Added on the web, they then work in the Gemini app too.

Grok

  1. Open grok.com/connectors, choose New Connector, then Custom.
  2. Paste the URL: https://mcp.sixteenbridges.com/mcp
  3. Allow it on sixteenbridges.com.

Custom connectors are on paid Grok plans.

Perplexity

  1. Open Settings → Connectors and choose Custom connector, Remote.
  2. Name it Sixteen Bridges, paste the URL https://mcp.sixteenbridges.com/mcp, and choose OAuth.
  3. Allow it on sixteenbridges.com, then turn it on under a thread's sources.

Custom connectors are on Pro, Max and Enterprise plans, and are added on the web.

MCP, locally

Desktop apps that start local MCP servers can run the CLI as one: the same tools, on the computer's own sign-in, with no connector and no paid plan. Sign in once first:

Terminal
npx sixteenbridges login

Claude Desktop

Settings → Developer → Edit Config (claude_desktop_config.json)
{
  "mcpServers": {
    "sixteen-bridges": {
      "command": "npx",
      "args": [
        "-y",
        "sixteenbridges",
        "mcp"
      ]
    }
  }
}
  1. First, sign this computer in once: npx sixteenbridges login
  2. Add this to the config file, save, and restart Claude Desktop.

On Windows, if it doesn't start, use "command": "cmd" with "args": ["/c", "npx", "-y", "sixteenbridges", "mcp"].

Cursor

~/.cursor/mcp.json
{
  "mcpServers": {
    "sixteen-bridges": {
      "command": "npx",
      "args": [
        "-y",
        "sixteenbridges",
        "mcp"
      ]
    }
  }
}
  1. First, sign this computer in once: npx sixteenbridges login
  2. Add this to ~/.cursor/mcp.json (or Settings → MCP → Add), then reload.

VS Code

.vscode/mcp.json
{
  "servers": {
    "sixteen-bridges": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "sixteenbridges",
        "mcp"
      ]
    }
  }
}
  1. First, sign this computer in once: npx sixteenbridges login
  2. Add this to .vscode/mcp.json in your project (or your user MCP settings), then start the server.

Windsurf

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "sixteen-bridges": {
      "command": "npx",
      "args": [
        "-y",
        "sixteenbridges",
        "mcp"
      ]
    }
  }
}
  1. First, sign this computer in once: npx sixteenbridges login
  2. Add this to ~/.codeium/windsurf/mcp_config.json, then refresh its MCP servers.

How clients sign in

MCP clients do all of this by themselves; it is here for anyone building one, and to show what happens.

  1. The server says where to sign in

    A request without a token gets 401, naming the resource's metadata (RFC 9728):

    HTTP
    POST /mcp HTTP/1.1
    Host: mcp.sixteenbridges.com
    
    HTTP/2 401
    www-authenticate: Bearer resource_metadata="https://mcp.sixteenbridges.com/.well-known/oauth-protected-resource/mcp"
  2. The metadata names the authorization server

    curl https://api.sixteenbridges.com/.well-known/oauth-protected-resource
    # → "authorization_servers": ["https://lhoaehepgmmqlltutgos.supabase.co/auth/v1"]
    
    curl https://lhoaehepgmmqlltutgos.supabase.co/auth/v1/.well-known/oauth-authorization-server
    Response
    {
      "issuer": "https://lhoaehepgmmqlltutgos.supabase.co/auth/v1",
      "authorization_endpoint": "https://lhoaehepgmmqlltutgos.supabase.co/auth/v1/oauth/authorize",
      "token_endpoint": "https://lhoaehepgmmqlltutgos.supabase.co/auth/v1/oauth/token",
      "registration_endpoint": "https://lhoaehepgmmqlltutgos.supabase.co/auth/v1/oauth/clients/register",
      "code_challenge_methods_supported": ["S256", "plain"],
      "grant_types_supported": ["authorization_code", "refresh_token"]
    }
  3. The client registers, the person approves, the code becomes tokens

    Dynamic client registration, then the authorization code flow with PKCE (S256), exactly as in the REST API's sign-in. The person sees one question on sixteenbridges.com: allow this app to use your bubbles?

  4. Every request carries the token

    Authorization: Bearer <access token>. Only tokens issued to an app this way are accepted, not a website session. When it expires, the client renews it with the refresh token.

Disconnecting an app on the account page ends its access within a minute. Its next request gets 401, and it has to ask the person again.

Tools

Results are compact text written for a model: ids, titles, sources, sizes, dates, one-line previews.

list_bubblesread-only

The bubbles, newest first: id, title, source, size, date and a one-line preview, plus how much of the allowance is used.

Parameters
querystringWords to search for in titles and contents (2–100 characters).
limitintegerHow many, 1–50 (default 20).
cursorstringThe next page, from the reply's More: line.

get_bubbleread-only

One bubble: a short header, then its Markdown. Long ones come in pages of 30,000 characters; the reply ends with the offset to read next.

Parameters
idstring · requiredFrom list_bubbles.
offsetintegerThe character to start from (default 0).
max_charsintegerCharacters per page, 1,000–100,000 (default 30,000).

save_bubblewrites

Saves new context as a bubble and answers with its id.

Parameters
titlestring · requiredShort and specific, up to 120 characters.
contentstring · requiredMarkdown.
sourcestringThe app saving it: claude, chatgpt, gemini, grok, perplexity, api or other (default api).
labelstringWhere it came from, e.g. the chat's name.

update_bubblewrites

Renames a bubble, replaces its content, or adds to its end without sending it all again.

Parameters
idstring · requiredFrom list_bubbles.
titlestringA new title.
contentstringNew content, replacing all of it.
appendstringText to add at the end, after a blank line.

delete_bubbledestructive

Moves a bubble to the trash: restorable for 7 days, then deleted for good.

Parameters
idstring · requiredFrom list_bubbles.

list_deleted_bubblesread-only

What is in the trash, and until when each can be restored.

restore_bubblewrites

Brings a bubble back from the trash.

Parameters
idstring · requiredFrom list_deleted_bubbles.

share_bubblessends to someone

Sends copies of bubbles to another Sixteen Bridges account, by email. All arrive or none do; a full account is refused.

Parameters
emailstring · requiredThe receiver's email, exactly as the user gave it.
bubble_idsstring[] · required1–20 ids, from list_bubbles.

list_sharesread-only

What was shared and received, newest first: with whom, which bubbles (with ids), and which received ones are new.

Parameters
directionstringsent or received (default both).
cursorstringThe next page, from the reply's More: line.

Resources and prompts

Resources and prompts
bubble://{id}resourceA bubble as Markdown, listed and readable, for apps that attach resources (@-mentions).
use_bubblepromptBrings a bubble into the chat as context: give an id or words from its title.

Calling it directly

It is plain JSON-RPC over HTTP, with a token from the sign-in above:

curl
curl https://mcp.sixteenbridges.com/mcp \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_bubbles","arguments":{"limit":5}}}'
Response
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [{
      "type": "text",
      "text": "1 of 20 bubbles used, up to 512 KB each.\n1. [bub_0195f3a2-…] Lisbon trip · Claude · Trip chat · 27 B · 2026-10-27\n   # Day 1 Trams, then Sintra."
    }]
  }
}