Skip to content

Mode matrix

Each server has a fixed set of supported modes. Pick based on your scenario; switching modes is supported but requires re-bootstrap of credentials.

Serverstdiolocal-relayremote-relayremote-oauthDefault
mcp-core(foundation library, not a server)
wet-mcpyesyesyeslocal-relay
mnemo-mcpyesyesyeslocal-relay
better-code-review-graphyesyesyeslocal-relay
imagine-mcpyesyesyeslocal-relay
better-telegram-mcpyesyesyesyesremote-relay
better-notion-mcpyesyesyesyesremote-oauth
better-email-mcpyesyesyesyesremote-relay
better-godot-mcpyesstdio

Server runs as a child of the MCP client over stdin/stdout. Credentials in client config (mcp.json env block). No daemon, no persistent storage. Simplest mode; no shared state.

Client spawns a local HTTP daemon. Daemon opens a browser at first run for credential entry. Credentials encrypted and persisted at ~/.config/<server>/config.enc. Subsequent client runs reuse the daemon if alive.

Same form/flow as local-relay but the HTTP server is your self-hosted deployment (e.g. Docker on a VM). Credentials scoped per JWT subject. One deploy serves N users.

Self-hosted server doubles as an OAuth 2.1 Authorization Server. Standard OAuth flow for client identity. User identity (sub) supplied by an upstream IdP (GitHub / Google). Credential storage still per-sub.

The default is what the plugin manifest sets in mcp.json when installed via marketplace. Override per-install if needed. Most servers default to local-relay (single-user with browser flow). better-godot-mcp defaults to stdio (no credentials needed). Notion/Email/Telegram default to remote because team-shared deploy is the common deployment pattern.

  • Mixing modes for the same server install — pick one and stick with it. Switching modes invalidates persisted credentials.
  • Sharing config.enc across machines — local-relay storage is single-user. Use remote-relay if you need team access.
  • Self-hosting remote-relay without a JWT issuer — every request gets the same sub and credentials silently overlap.