Connect a Client
One command configures every MCP client on your machine, then you sign in through the browser. Manual configuration, API-key auth and the common failures are all covered here.
Set up every client at once
The installer detects every MCP client already configured on your machine and writes the MemorySync servers into each one. It never touches anything else in those files, and it copies each file to a timestamped backup before changing it.
npx -y memorysync-mcp-install
--list- Show which clients were detected and the exact path for each, then exit without changing anything.
--dry-run- Print the configuration that would be written, and write nothing.
--client cursor- Configure one client only. Accepts a comma-separated list.
--server memory- Install only the memory server. Use docs for only the documentation server; the default is both.
--remove- Remove the MemorySync entries again, leaving your other servers untouched.
Configure one client by hand
Pick your client and copy the block. The shapes are genuinely not interchangeable: a config written in another client's format usually parses without error and then never connects.
{"mcpServers": {"memorysync": {"type": "http","url": "https://mcp.memorysync.io/mcp"}}}
| Client | File | Transport |
|---|---|---|
| Claude Code | ~/.claude.json | Direct |
| Claude Desktop | claude_desktop_config.json | mcp-remote bridge |
| Cursor | ~/.cursor/mcp.json | Direct |
| VS Code | .vscode/mcp.json | Direct |
| Devin Desktop | ~/.config/devin/mcp_config.json | Direct |
| Codex | ~/.codex/config.toml | Direct |
| OpenCode | ~/.config/opencode/opencode.json | Direct |
To add the documentation server as well, repeat the block under a second key such as memorysync-docs pointing at https://docs.memorysync.io/mcp. It needs no authentication.
Signing in
The memory server is authenticated, so adding the URL is not enough on its own. It uses OAuth 2.1 with PKCE and you configure none of it: the client is given one URL, discovers the rest from the server, registers itself and opens a browser for you to approve. Approve once; the client stores the token and refreshes it as needed.
- 1. Unauthenticated call
- Your client calls the server with no token and receives 401 plus a WWW-Authenticate header naming where to look next.
- 2. Discovery
- The client reads the protected-resource metadata, learns which authorization server governs the endpoint, and reads that server’s metadata.
- 3. Registration
- The client registers itself and receives a client_id. No secret is issued; it is a public client and uses PKCE instead.
- 4. Consent
- Your browser opens on the MemorySync sign-in, then a consent screen naming the client and the scopes it asked for.
- 5. Token
- The client exchanges the authorization code for a short-lived access token.
Approving only mcp:read gives a read-only connection, and the write tools are then not advertised at all. See scopes and read-only access.
API key for headless clients
Browser sign-in needs a browser. In CI, a container or a server-side agent there is not one, so the server also accepts a MemorySync API key as a bearer token or in the X-API-Key header.
curl -X POST https://mcp.memorysync.io/mcp \-H "Content-Type: application/json" \-H "X-API-Key: $MEMORYSYNC_API_KEY" \-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Where a client supports it, reference the environment variable rather than pasting the key into a config file. Codex does this with bearer_token_env_var, and OpenCode with {env:MEMORYSYNC_API_KEY} inside a header value.
When it does not connect
Most MCP failures are a stale client config or an unfinished sign-in rather than a server problem. Pick the symptom your client is reporting.
The assistant has no MemorySync tools
- Cause
- The configuration was written but the client has not reloaded it. MCP config is read at startup.
- Fix
- Restart the client fully. If the tools are still missing, confirm you edited the file that client actually reads — the paths differ, and several clients have both a global and a workspace location.
A 405 on a GET request is expected and not a fault: neither server offers an event stream, so clients are told to use POST rather than being left holding an open connection.