MemorySync
MCP

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.

BASH
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"
}
}
}
Where each client keeps its MCP configuration
ClientFileTransport
Claude Code~/.claude.jsonDirect
Claude Desktopclaude_desktop_config.jsonmcp-remote bridge
Cursor~/.cursor/mcp.jsonDirect
VS Code.vscode/mcp.jsonDirect
Devin Desktop~/.config/devin/mcp_config.jsonDirect
Codex~/.codex/config.tomlDirect
OpenCode~/.config/opencode/opencode.jsonDirect

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.

BASH
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.