One endpoint for all your MCP servers. endara.ai
Add MCP servers, manage OAuth, browse tools — without ever opening a terminal.
Works with Claude Desktop, ChatGPT, Cursor, Windsurf, VS Code, Zed, Continue, and any MCP-compatible client.
Endara Desktop is a lightweight system tray application that wraps the Endara Relay — an MCP (Model Context Protocol) relay server that aggregates multiple MCP tool servers behind a single endpoint.
Instead of running the relay manually from a terminal, Endara Desktop gives you a single install that manages everything. It bundles the relay binary as a Tauri sidecar, automatically starts it on launch, monitors its health, restarts it if it crashes, and kills it cleanly on quit.
The app provides a visual interface for everything the relay exposes: endpoint health at a glance, a searchable tool browser, real-time log output, and configuration inspection — all from a compact tray-app UI inspired by Tailscale.
brew install --cask endara-ai/tap/endara
This installs the latest signed & notarized DMG from the endara-ai/homebrew-tap tap and registers the app for brew upgrade. Tauri's built-in updater also continues to work, so you'll get new versions whichever way you prefer.
Or grab an installer directly from GitHub Releases — useful on Windows / Linux, or if you don't use Homebrew.
| Platform | Format | File |
|---|---|---|
| 🍎 macOS | DMG installer | Endara_x.x.x_aarch64.dmg |
| 🪟 Windows | Setup installer | Endara_x.x.x_x64-setup.exe |
| 🪟 Windows | MSI installer | Endara_x.x.x_x64_en-US.msi |
| 🐧 Linux | Debian package | endara_x.x.x_amd64.deb |
| 🐧 Linux | AppImage | Endara_x.x.x_amd64.AppImage |
Or build from source if you prefer.
127.0.0.1:9400.http://localhost:9400/mcp and your tools show up.| Shortcut | Action |
|---|---|
⌘K |
Open global search |
⌘, |
Open settings |
Esc |
Go back / close panel |
Endara Desktop is a Tauri 2 application with two layers:
┌─────────────────────────────────┐
│ SvelteKit Frontend │
│ (Svelte 5 + Tailwind CSS 4) │
│ │
│ Sidebar ←→ Detail Panel │
│ (endpoints) (tools/logs/cfg) │
└────────────┬────────────────────┘
│ Tauri IPC
┌────────────▼────────────────────┐
│ Tauri Backend (Rust) │
│ │
│ Commands: start / stop / │
│ restart / status │
│ │
│ Sidecar ──→ endara-relay │
│ (bundled binary) │
└─────────────────────────────────┘
Backend (Rust): Manages the relay as a sidecar process — spawning, monitoring stdout/stderr, handling crashes with auto-restart, and clean shutdown on exit. Exposes a set of Tauri commands grouped roughly into:
start_relay, stop_relay, restart_relay, relay_status, get_sidecar_status, get_buffered_relay_logs, get_relay_port, set_relay_port.mgmt_api_request proxies HTTP-shaped /api/* calls from the SvelteKit frontend over the relay's per-user Unix socket / Named Pipe; get_mgmt_api_socket_path exposes the socket path for diagnostics.get_endpoint_config, add_endpoint, update_endpoint, remove_endpoint, get_config_path_display, set_js_execution_mode.get_update_channel, set_update_channel, check_for_update, download_and_install_update, show_update_notification, get_autostart, set_autostart, get_build_info.Frontend (SvelteKit): Talks to the relay's management API to fetch endpoint status, tools, logs, and configuration. The UI is organized around a sidebar (endpoint list) + detail panel (per-endpoint tabs for tools, logs, config, auth) layout. Auxiliary components include onboarding, search palette, settings, an add-endpoint modal, and a unified tool catalog.
The Tauri webview runs under an explicit Content Security Policy (src-tauri/tauri.conf.json → app.security.csp) that restricts script, style, and connect sources to the app origin, IPC, and localhost endpoints. Management traffic from the SvelteKit frontend reaches the relay's /api/* through the mgmt_api_request Tauri command, which proxies HTTP semantics over the relay's per-user Unix-domain socket (Linux/macOS) or Named Pipe (Windows). MCP traffic flows over loopback TCP at the configured relay port.
In the standard desktop install, the desktop owns the relay. There is no separate background service — the relay's lifetime is bounded by the desktop's lifetime.
Endara Desktop (parent)
└── endara-relay (Tauri sidecar child)
└── listens on 127.0.0.1:9400 (prod) / 9500 (dev)
endara-relay binary as a Tauri sidecar child process. The desktop passes --port (and the data dir / config path) on the command line; in dev it uses 9500, in production it uses 9400 by default.127.0.0.1 only and accepts MCP traffic on the configured port. Other applications on the machine connect to it over loopback at that port.SIGTERM to the sidecar; on a hard exit (force-quit, crash, logout) the OS reaps it with SIGKILL. There is no graceful-shutdown line emitted by the relay in the latter case — the last log entry is whatever it was doing when the parent died.There are two ways to get a relay on your machine, and they are mutually exclusive on the same port:
| Install path | What it gives you | Relay lifecycle |
|---|---|---|
brew install --cask endara-ai/tap/endara (or the DMG / .msi / .deb / .AppImage) |
Full desktop GUI with the relay bundled inside the app bundle | Relay is a child of the desktop. Quitting the desktop kills the relay. |
brew install endara-ai/tap/endara-relay |
Headless CLI relay, no GUI | Standalone process you run yourself (or via your own launchd/systemd unit). |
Pick one. If both are installed and both try to bind 127.0.0.1:9400, the second one to start will fail with EADDRINUSE. The desktop's bundled relay does not read or coordinate with a brew-installed endara-relay — they are separate binaries with separate config paths.
/Applications/Endara Desktop.app/Contents/MacOS/endara-relay~/Library/LaunchAgents/Endara Desktop.plist (only present if "Launch at login" is enabled)~/Library/Logs/ai.endara.desktop/Endara Desktop.log~/.endara/logs/relay.log.<YYYY-MM-DD> (rotated daily)~/.endara/config.tomlOn Linux and Windows the same parent/child model applies; only the file paths differ (Tauri's standard log/config dirs for the ai.endara.desktop identifier, and no LaunchAgent — autostart uses the platform's native mechanism).
cargo install tauri-cli --version "^2"# Clone the repository
git clone https://github.com/endara-ai/endara-desktop.git
cd endara-desktop
# Install frontend dependencies
npm install
# Start the dev server with hot-reload
cargo tauri dev
Tauri expects the relay binary at src-tauri/binaries/endara-relay-{target-triple} (e.g., endara-relay-aarch64-apple-darwin). A helper script is provided:
# Copy a locally-built relay binary into the correct sidecar location
./scripts/copy-sidecar.sh /path/to/endara-relay
cargo tauri build
This produces platform-specific installers in src-tauri/target/release/bundle/:
.dmg in bundle/dmg/-setup.exe in bundle/nsis/, .msi in bundle/msi/.deb in bundle/deb/, .AppImage in bundle/appimage/packages/desktop/
├── src/
│ ├── routes/ # SvelteKit routes
│ │ ├── +layout.svelte # Root layout
│ │ └── +page.svelte # Main page
│ ├── lib/
│ │ ├── components/ # Svelte UI components (sidebar, detail panel, tabs, dialogs, modals, etc.)
│ │ ├── api.ts # API client for relay management
│ │ ├── stores.ts # Svelte stores for app state
│ │ ├── types.ts # TypeScript type definitions
│ │ └── mock.ts # Mock data for development
│ ├── app.css # Global styles (Tailwind)
│ └── app.html # HTML shell
├── src-tauri/
│ ├── src/
│ │ ├── lib.rs # Tauri commands + relay sidecar lifecycle
│ │ ├── main.rs # Entry point
│ │ ├── api_proxy.rs # HTTP-over-UDS / Named-Pipe client for the relay's /api
│ │ └── webview_recovery.rs # Webview crash detection + recovery
│ ├── tauri.conf.json # Tauri config (bundling, updater, sidecar)
│ ├── capabilities/default.json # Permissions (shell, updater)
│ ├── binaries/ # Relay sidecar binary (not committed)
│ └── icons/ # App icons for all platforms
├── scripts/
│ └── copy-sidecar.sh # Helper to copy relay binary for bundling
├── package.json
└── LICENSE # Apache-2.0
Releases are automated via GitHub Actions. The desktop release depends on Endara Relay — the relay must be released first so the desktop can download its binaries.
v0.1.0)git tag v0.1.0 && git push origin v0.1.0src-tauri/binaries/endara-relay-{target_triple}You can pin to a specific relay version by triggering the workflow manually with the relay_version input (defaults to latest).
On every push and PR, the CI workflow runs:
cargo check on the Tauri backend)Contributions are welcome! Here's how to get started:
git checkout -b feat/my-feature)cargo tauri devgit commit -m 'feat: add my feature')git push origin feat/my-feature)Please make sure npm run check passes before submitting.
Licensed under the Apache License, Version 2.0.
Copyright 2025–2026 Endara AI
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.