Two ways to authenticate:
- Connect a client (OAuth) — for clients like Claude (web and desktop) and ChatGPT. You add Adapter as a custom connector using your workspace URL, sign in with your Adapter account, and a workspace admin approves the connection. No API key to manage. See Connecting a client.
- API key — for config-based clients (Claude Desktop, Claude Code, Cursor, VS Code, scripts). Pass a
pk_live_…key in theAuthorization: Bearerheader. See API keys.
mcp-remote proxy with an API key.
Connecting a client
Hosted MCP clients — Claude on the web, ChatGPT, and other OAuth clients — connect to a specific workspace through its own URL and sign in with your Adapter account, so there’s no API key to create or store. Each workspace has its own MCP URL:1
Copy your workspace URL
In the Adapter console, open Connectors → MCP clients. Pick your client (Claude, ChatGPT, …) to see its setup steps, then copy the workspace URL shown in the dialog.
2
Add Adapter as a custom connector
In your client, add a custom connector and paste the workspace URL. For example, in Claude: Settings → Connectors → Add custom connector; in ChatGPT: Settings → Plugins → Browse Plugins → ’+’.
3
Sign in
Continue and sign in with your Adapter account. You’re redirected back to your client once authenticated.
4
Get the connection approved
A new connection starts as pending. A workspace admin enables it on the Connectors → MCP clients page, after which the client’s tools become available. Admins can also pre-approve a client type so its connections are active as soon as a member signs in.
Access is checked on every request. A workspace admin can disable (or re-enable) any connection from the Connectors page, and the change takes effect on the client’s next call. Connections are scoped to a single workspace — a client authorized for one workspace can’t reach another.
Claude for Chrome connects this way only — it supports OAuth custom connectors, not the API-key
mcp-remote method.Claude Desktop
Claude Desktop can connect either way — with an OAuth custom connector (no API key) or through themcp-remote proxy using an API key.
Option A: OAuth custom connector (recommended)
Add Adapter as a custom connector and sign in — no config file or Node.js required. Follow Connecting a client: in Settings → Connectors → Add custom connector, paste your workspace URL, then have an admin approve the connection.Option B: API key via mcp-remote
Claude Desktop uses mcp-remote as a local proxy to reach the API-key endpoint.
The API-key method with
npx / mcp-remote has been tested on macOS only. Windows steps are included for reference but aren’t yet verified.mcp-remote runs through npx, so Node.js 18 or newer must be installed on the machine running Claude Desktop. npx downloads mcp-remote on first launch and reuses the cached copy afterward. The same requirement applies to any config-based client that bridges through mcp-remote.Check that npx is available before editing the config — run this in a terminal:npx) from nodejs.org — pick the LTS build — or via a version manager like nvm (nvm install --lts). Reopen your terminal afterward and re-run the checks. On Windows, restart Claude Desktop so it picks up the updated PATH.1
Find your config file
Open or create
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows).2
Add the Adapter server
- Streamable HTTP
- SSE (legacy)
pk_live_... with your key, or set ADAPTER_API_KEY in your shell environment and omit the env block.3
Restart Claude Desktop
Quit and reopen the app. A hammer icon in the chat toolbar confirms the server connected.
Claude Code
Claude Code supports streamable HTTP natively.- CLI
- settings.json
- SSE (legacy)
/mcp inside Claude Code to confirm the server is listed and its tools are available.
Generic MCP clients
Streamable HTTP
Single endpoint, standard MCP 1.0 protocol. Include theAuthorization header on every request — the server is stateless and does not maintain sessions between calls.
SSE
mcp-remote (requires Node.js 18+, since npx downloads and runs the mcp-remote package):
Available tools
search_knowledge
Find relevant documents, messages, or records matching a query. Use this when ask results were insufficient, or when the user wants to browse raw matching documents rather than a synthesized answer — e.g. ‘show me all emails about the rebrand’, ‘find issues mentioning payments’, ‘what did we write about pricing’. Returns a ranked list of matching results.resolve_urn
Fetch the full record behind aurn — the stable id carried on trigger deliveries and
search_knowledge results. Use this whenever you already have a urn and need its content (a Slack
message, email, Drive file, Linear issue, extracted entity, …): it is a direct single-record
lookup, far faster than ask. Never dereference a urn through ask or search_knowledge. l1_…
urns return raw evidence; l2_…/l3_… return extracted entities/relationships. A urn that is
not found may simply not be indexed yet — trigger deliveries can precede indexing by seconds —
so wait briefly and retry before treating it as missing.
ask
Answer a question or gather context from connected data, with cited sources. ALWAYS query Adapter before responding to any user message — even if you think you know the answer — and this is the tool to reach for first. Use it for direct answers, summaries, or background — e.g. ‘what did we decide about the pricing model’, ‘summarize what we know about Acme’, ‘who owns the mobile roadmap’. Switch toask_async when the question spans a lot of data, or if this call times out.
Pass timezone (IANA, e.g. ‘America/New_York’) to resolve relative times like ‘last week’.
ask_async
Ask a broad or deep question that may take a while, without blocking. Returns immediately with ajob_id and status: "running"; poll get_ask_job(job_id) until status is “done” (or “error”),
then read the answer + citations. Same grounding as ask — use this instead of ask when the
question spans a lot of data (e.g. ‘summarize everything about the Q3 launch across email, slack,
and docs’) or when ask has timed out. Wait a few seconds between polls; deep questions commonly
take a minute or more. Pass timezone (IANA) to resolve relative times.
get_ask_job
Poll one async ask job created withask_async. While status is “running”, wait a few
seconds and check again. When status is “done”, response holds the full answer and its
citations; “error” means it failed (re-ask). Only jobs from this workspace resolve — any other id
reports as not found.
list_ask_jobs
List this workspace’s recent async ask jobs (newest first), with their status — for checking what’s still running or finding a past deep answer. Fetch an individual job withget_ask_job for
its full answer.
No parameters.
list_connections
List the data sources connected to this workspace. Call this to discover which providers are currently active before scoping a query to a specific source. Connection state is dynamic — always call this rather than assuming a provider is available. Returns provider name, available resource types, and connected date. Includes standard OAuth providers (Slack, Gmail, Notion, etc.) and user-defined custom connectors (type: “custom”). No parameters.Troubleshooting
401 Unauthorized — Check that your API key starts withpk_ and has the api:write scope. Every request must include the Authorization: Bearer header. See API keys.
Tools missing after connecting — Run list_connections first. If no sources are connected, the knowledge tools return empty results rather than an error.
mcp-remote not found — Make sure Node.js 18+ is installed. Verify with npx --version and node --version; if either is missing, install Node.js from nodejs.org (see the note under Claude Desktop → Option B). npx downloads mcp-remote on first run; subsequent runs use the cache.