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
https://mcp.sixteenbridges.com/mcp| Transport | Streamable HTTP, stateless: one JSON response per request, no sessions. |
| Protocol | 2025-11-25 |
| Sign-in | OAuth 2.1 with PKCE and dynamic client registration (below). |
| Tools | list, 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
claude mcp add --transport http sixteen-bridges https://mcp.sixteenbridges.com/mcp- In Claude Code, run /mcp, pick sixteen-bridges and sign in. Allow it on sixteenbridges.com.
Codex
codex mcp add sixteen-bridges --url https://mcp.sixteenbridges.com/mcp
codex mcp login sixteen-bridges- The login opens your browser: Allow it on sixteenbridges.com.
Gemini CLI
gemini mcp add --transport http sixteen-bridges https://mcp.sixteenbridges.com/mcp- 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)
- Open Settings → Connectors and choose Add custom connector.
- Name it Sixteen Bridges and paste the URL: https://mcp.sixteenbridges.com/mcp
- Choose Connect, then Allow on sixteenbridges.com.
Free plans can add one custom connector.
ChatGPT
- Turn on Developer mode: Settings → Apps (or Connectors) → Advanced settings.
- Create an app or connector named Sixteen Bridges with the URL https://mcp.sixteenbridges.com/mcp and OAuth sign-in.
- 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)
- On a computer, open gemini.google.com → Settings → Connected Apps. If it isn't there, open Personal Intelligence first.
- Under Custom apps, choose Add a custom app.
- Paste the URL https://mcp.sixteenbridges.com/mcp and choose Next. Leave Advanced features empty: it signs in by itself.
- Follow the prompts (name it Sixteen Bridges if asked), then Allow on sixteenbridges.com.
- 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
- Open grok.com/connectors, choose New Connector, then Custom.
- Paste the URL: https://mcp.sixteenbridges.com/mcp
- Allow it on sixteenbridges.com.
Custom connectors are on paid Grok plans.
Perplexity
- Open Settings → Connectors and choose Custom connector, Remote.
- Name it Sixteen Bridges, paste the URL https://mcp.sixteenbridges.com/mcp, and choose OAuth.
- 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:
npx sixteenbridges loginClaude Desktop
{
"mcpServers": {
"sixteen-bridges": {
"command": "npx",
"args": [
"-y",
"sixteenbridges",
"mcp"
]
}
}
}- First, sign this computer in once: npx sixteenbridges login
- 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
{
"mcpServers": {
"sixteen-bridges": {
"command": "npx",
"args": [
"-y",
"sixteenbridges",
"mcp"
]
}
}
}- First, sign this computer in once: npx sixteenbridges login
- Add this to ~/.cursor/mcp.json (or Settings → MCP → Add), then reload.
VS Code
{
"servers": {
"sixteen-bridges": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"sixteenbridges",
"mcp"
]
}
}
}- First, sign this computer in once: npx sixteenbridges login
- Add this to .vscode/mcp.json in your project (or your user MCP settings), then start the server.
Windsurf
{
"mcpServers": {
"sixteen-bridges": {
"command": "npx",
"args": [
"-y",
"sixteenbridges",
"mcp"
]
}
}
}- First, sign this computer in once: npx sixteenbridges login
- 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.
The server says where to sign in
A request without a token gets 401, naming the resource's metadata (RFC 9728):
HTTPPOST /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"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-serverResponse{ "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"] }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?
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.
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.
querystring | Words to search for in titles and contents (2–100 characters). |
|---|---|
limitinteger | How many, 1–50 (default 20). |
cursorstring | The 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.
idstring · required | From list_bubbles. |
|---|---|
offsetinteger | The character to start from (default 0). |
max_charsinteger | Characters per page, 1,000–100,000 (default 30,000). |
save_bubblewrites
Saves new context as a bubble and answers with its id.
titlestring · required | Short and specific, up to 120 characters. |
|---|---|
contentstring · required | Markdown. |
sourcestring | The app saving it: claude, chatgpt, gemini, grok, perplexity, api or other (default api). |
labelstring | Where 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.
idstring · required | From list_bubbles. |
|---|---|
titlestring | A new title. |
contentstring | New content, replacing all of it. |
appendstring | Text 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.
idstring · required | From 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.
idstring · required | From list_deleted_bubbles. |
|---|
Resources and prompts
bubble://{id}resource | A bubble as Markdown, listed and readable, for apps that attach resources (@-mentions). |
|---|---|
use_bubbleprompt | Brings 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 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}}}'{
"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."
}]
}
}