A thin proxy that puts my Memos notebook behind the Model Context Protocol — so Claude can read and write my notes from anywhere.
Memos ships its own built-in MCP server. memos-mcp sits in front of it as a thin proxy: it re-exports the upstream tools, stamps a #bot tag on anything Claude writes, and blocks the destructive tools (no deleting memos). It runs as a Docker sidecar on my home server and is published through a Cloudflare Tunnel.
It speaks two transports from one codebase — stdio for Claude Code on my dev box, and Streamable HTTP (this host) for the claude.ai connector.
Settings → Connectors → Add custom connector. URL: https://mcp.yuuma.dev/mcp — keep the /mcp at the end.
No Client ID or Secret. The server registers Claude automatically via Dynamic Client Registration.
Claude opens a login page. Paste the server token (the one in my password manager) to approve the connection.
| Method | Path | What | Auth |
|---|---|---|---|
| POST | /mcp | MCP over Streamable HTTP (initialize + tool calls) | Bearer |
| GET | /healthz | Liveness check for the tunnel & monitoring | none |
| GET | /.well-known/oauth-protected-resource | OAuth resource metadata (RFC 9728) | none |
| GET | /.well-known/oauth-authorization-server | OAuth server metadata (RFC 8414) | none |
| POST | /register | Dynamic client registration (RFC 7591) | none |
| GET POST | /authorize | Login form → single-use authorization code | token |
| POST | /token | Exchange code / refresh, with PKCE | PKCE |
claude.ai's connector UI only speaks OAuth, so the server runs a minimal OAuth 2.1 flow — but there is no user directory. The whole handshake gates on a single server token used as a login password. The access token Claude receives is a fresh, revocable value, never the underlying secret.