All your MCP servers behind one endpoint 127.0.0.1:4747/mcp

A native macOS menu bar app. Claude Code, Cursor and Claude Desktop share the same server processes, and one click swaps the whole tool set.

Build from source
  • macOS 15+
  • Apple silicon
  • Swift + Rust
  • MIT
AI clients
Claude CodeStreamable HTTP
CursorStreamable HTTP
Claude Desktopstdio · tulma connect
workspaceWork
:4747/mcp
MCP servers
githubstdio · npx
linearStreamable HTTP
postgresstdio · uvx
sentryStreamable HTTP
lastwaiting for tools/call…

Works with any MCP server, stdio or Streamable HTTP

githubgitlablinearjiraconfluencenotionslacksentryyoutrackasanatrelloclickupmondaytodoistairtablezendeskintercomhubspotsalesforcepocketalert
postgresmysqlsqlitesupabaseneonmongodbredisclickhousesnowflakebigqueryelasticsearchpineconeqdrantchromaprismafirebasecloudflarevercelawsazurekubernetesdockerterraformgrafanadatadog
filesystemmemorygitfetchpuppeteerplaywrightbrowserbasefirecrawlexabrave-searchtavilyperplexitycontext7sequential-thinkingfigmastripeshopifygoogle-drivegmailgoogle-calendarobsidianspotifyyoutubeopenpanel

3 clients × 4 servers = 12 processes

Three clients and four servers means twelve processes and three JSON files to keep in sync. Tulma runs each server once and serves it to everyone.

Server processes
12
Configs to edit
3
Switch tool set
edit 3 files
Claude Code~/.claude.json
Cursor.cursor/mcp.json
Claude Desktopclaude_desktop_config.json
Tulma
github×3
postgres×3
linear×3
filesystem×3

Switch tool sets from the menu bar

Group servers into “Work”, “Personal”, “Client X”. Only the active workspace runs. Connected clients get tools/list_changed and pick up the new tools without reconnecting.

Default

Active8 of 8 running

http://127.0.0.1:4747/mcp· 3 sessions Connect a client…
OverviewToolsLog
10 of 10 enabled

Click a workspace, a server or any switch. The demo runs by itself until you do.

What it does

Namespaced tools

Every tool is exposed as server__tool, 64 characters at most. Name collisions get a deterministic _2, _3 suffix.

Per-tool switches

Hide individual tools from clients without removing the server.

Secrets in the Keychain

Matching env vars and headers move to the macOS Keychain. config.json keeps only a reference.

Supervision

Crashed servers restart with backoff: 1, 2, 4, 8, 16 s, then they stay in the error state. On quit, each server's whole process group is killed, so npx grandchildren don't outlive it.

Import

Paste or drop configs from Claude Desktop, Cursor or VS Code. JSONC is fine. A preview marks each entry as new, duplicate or invalid.

Export

Download a workspace as mcpServers JSON. Secrets are left out unless you ask for them.

Logs you can read

Tool calls, lifecycle events and server stderr go to SQLite, with secret redaction and a retention limit.

Not just tools

Prompts and resources are proxied as well.

Connect your clients

Streamable HTTP for clients that support it, and a stdio bridge, tulma connect, for those that don't. Connect a client… in the window footer shows these snippets with the real paths filled in.

  • The port can be changed in Settings
  • tulma connect reads the URL from endpoint.json
  • Override it with --url

          
        
→ initialize · tools/list · 49 tools from 4 servers

SwiftUI app, Rust daemon

The app owns the UI only. The daemon is a child process that owns all state, the servers and the HTTP endpoint. They talk NDJSON JSON-RPC over stdin/stdout. Quit the app, stdin closes, and the daemon stops every server and exits.

HTTP · 127.0.0.1:4747 AI clients Claude Code · Cursor · Claude Desktop
SwiftUI Tulma.app DaemonClient actor · AppStore · views
Rust tulma daemon
  • gateway rmcp
  • http axum
  • supervisor
  • store +Keychain
  • logs SQLite
  • bridge stdio ↔ http
githubstdio · npx
postgresstdio · uvx
linearStreamable HTTP

Only reachable from your Mac

The endpoint listens on loopback only and refuses requests that carry a foreign Host or Origin, which blocks DNS-rebinding attacks from web pages.

01

Keychain only

Secret values leave the Keychain only to start a server, to show them in the server editor, or in an export with Include secrets on.

02

Redacted logs

Bearer tokens and token=, key=, password= style values are masked before they are stored.

03

Safe exports

By default, tokens in URLs and arguments (?token=…, --api-key …) become ***. The file is safe to share.

04

Your permissions

Servers run as your user, the same as when a client starts them. Only add servers you trust.

Build from source

There are no prebuilt binaries yet. Build from source with Xcode and Rust. A free Apple ID is enough to sign it, or sign ad-hoc.

  • macOS15+ · Apple silicon
  • Xcode27+
  • Rust1.98+ · rustup
  • XcodeGenbrew install xcodegen
zsh — tulma

Tulma is free and open source