Skip to content

hsingjui/mcpdock

Repository files navigation

MCPDock

δΈ­ζ–‡

A lightweight, minimal desktop application for managing, monitoring, and exposing MCP (Model Context Protocol) servers. Built with Tauri 2 + Vue 3 + Rust β€” small footprint, fast startup, clean UI.


What is MCPDock?

MCP is an open protocol that standardizes how applications provide context to LLMs. MCPDock gives you a visual, desktop-native way to:

  • Manage all your MCP servers in one place
  • Run a local HTTP gateway that aggregates multiple servers into group endpoints
  • Discover tools, prompts, and resources automatically
  • Import, export, and organize server configurations

Instead of editing JSON files manually, you get a clean, clutter-free UI with system-tray integration, dark mode, and full bilingual support. Designed to stay out of your way.

Overview

MCPDock Overview


Screenshots

macOS

MCP Server Management

Register STDIO and Streamable HTTP servers, connect/disconnect individually, and monitor status in real time.

MCP Server Management on macOS

Group & Gateway Management

Create groups, assign servers, and expose them through dedicated Streamable HTTP endpoints with optional Bearer authentication.

Group Management on macOS

Settings

Configure the gateway port, language, tool-name separator, auth token, proxy, timeout, and keep-alive.

Settings on macOS

Windows

MCP Server Management on Windows

MCP Management on Windows


Highlights

  • πŸͺΆ Lightweight β€” Native desktop app with a tiny footprint thanks to Tauri 2 and Rust
  • ⚑ Fast β€” Near-instant cold start and smooth real-time status updates
  • 🧹 Clean UI β€” No distractions, no bloat. Everything is one click away
  • 🌐 Bilingual β€” Full Chinese and English support with auto-detection

Features

MCP Server Management

  • Add & Configure β€” Register MCP servers via two transport types:
    • STDIO β€” Launch a local child process (e.g., npx, python, uvx). Supports command arguments and environment variables.
    • Streamable HTTP β€” Connect to a remote MCP server over HTTP. Supports custom request headers.
  • Connect / Disconnect / Toggle β€” Start, stop, or enable/disable servers individually. Enabled servers auto-connect on application launch.
  • Capability Discovery β€” After connecting, the app automatically discovers and stores each server's capabilities:
    • Tools β€” invoke from the built-in tool runner
    • Prompts β€” view and call with arguments
    • Resources & Resource Templates β€” static URIs and parameterized URI templates
  • Import / Export β€” Batch import servers from JSON, or export your server list for backup and sharing.
  • Search & Filter β€” Search servers by name with real-time filtering.
  • Direct Tool Invocation β€” Call any discovered tool directly inside the app with a structured input form.

Streamable HTTP Gateway

  • Group-based endpoint routing β€” Each MCP group is exposed as a dedicated Streamable HTTP endpoint at http://localhost:{port}/mcp/{group_name}.
  • Optional Bearer Token authentication β€” Protect all gateway endpoints with a configurable auth token.
  • Tool name prefixing β€” Tools from different servers within a group are prefixed with the server name + configurable separator to avoid naming collisions (e.g., server__tool_name).
  • Configurable port β€” Choose any available port. Live reloads when settings change or groups are modified.
  • CORS support β€” Built-in cross-origin headers for browser-based clients.

Group Management

  • Multi-server aggregation β€” Create groups, assign member MCP servers, and all member tools/prompts/resources are available through the group endpoint.
  • Live reload β€” Gateway automatically restarts when groups are created, updated, or deleted.
  • Member toggle β€” Quickly add or remove servers from a group without re-creating it.

Settings

Setting Description Default
Language UI language (Chinese / English / System) System
Theme Light / Dark / System System
Gateway Port HTTP listen port for the gateway 3100
Separator Prefix separator for group tool names __
Auth Token Bearer token for gateway endpoints β€”
Request Timeout Connection / tool-call timeout 60 s
Keep-alive Interval Periodic ping to keep connections alive Disabled
HTTP Proxy Proxy for Streamable HTTP servers β€”
Auto Start Launch app on system boot Off
Show Window on Start Show or hide window after auto launch Off

System Tray

  • Close the window to hide to the system tray rather than exiting.
  • Left-click the tray icon or use the tray menu to restore the window.
  • macOS: Dock icon hides when window is hidden (Accessory mode).
  • Windows: Supports both light and dark tray menu themes.

Single Instance

  • Only one application instance runs at a time. Launching again brings the existing window to the foreground.

Internationalization

  • Full Chinese (zh-CN) and English (en) UI support via vue-i18n.
  • Language auto-detects from the OS or can be switched manually.

Appearance

  • Light / Dark / System theme support with Tailwind CSS 4.
  • Native title bar on macOS; custom title-less frame on Windows for a cleaner look.

Tech Stack

Layer Technology
Desktop Framework Tauri 2
Backend Rust, axum, tokio, rmcp
Database SQLite (rusqlite, bundled)
Frontend Vue 3, TypeScript
UI Components naive-ui
Styling Tailwind CSS 4
State Management Pinia
Linting / Formatting Biome
Package Manager pnpm

Prerequisites

  • Rust (latest stable)
  • Node.js β‰₯ 18
  • pnpm β‰₯ 8
  • Platform-specific Tauri prerequisites:
    • macOS β€” Xcode Command Line Tools
    • Windows β€” Visual Studio Build Tools or C++ Build Tools

Quick Start

# Clone and enter the project
git clone <repo-url> && cd mcpdock

# Install dependencies
pnpm install

# Run in development mode (with hot-reload)
pnpm tauri dev

# Build for production
pnpm tauri build

# Format / lint
pnpm format
pnpm lint

Installation

macOS (Homebrew)

brew install --cask hsingjui/tap/mcpdock

macOS Note: MCPDock is not currently signed with an Apple Developer certificate. After downloading and moving MCPDock.app to /Applications, run the following command in Terminal to remove the quarantine attribute:

xattr -rd com.apple.quarantine /Applications/MCPDock.app

Architecture

mcpdock
β”œβ”€β”€ src/                        # Vue 3 frontend
β”‚   β”œβ”€β”€ components/             # Page & layout components
β”‚   β”‚   β”œβ”€β”€ AppSidebar.vue      # Navigation sidebar
β”‚   β”‚   β”œβ”€β”€ PageHeader.vue      # Page header with title & description
β”‚   β”‚   β”œβ”€β”€ GatewayStatus.vue   # Gateway status indicator
β”‚   β”‚   β”œβ”€β”€ McpManagement.vue   # Main MCP server list & management
β”‚   β”‚   β”œβ”€β”€ GroupManagement.vue # MCP group management
β”‚   β”‚   β”œβ”€β”€ SettingsPage.vue    # Application settings
β”‚   β”‚   β”œβ”€β”€ mcp/                # MCP-related sub-components
β”‚   β”‚   β”‚   β”œβ”€β”€ McpServerList.vue    # Server list with status dots
β”‚   β”‚   β”‚   β”œβ”€β”€ McpServerForm.vue    # Add/edit server form
β”‚   β”‚   β”‚   β”œβ”€β”€ McpImportView.vue    # JSON import/export
β”‚   β”‚   β”‚   └── McpToolRunner.vue    # Direct tool invocation UI
β”‚   β”‚   └── group/              # Group-related sub-components
β”‚   β”œβ”€β”€ stores/                 # Pinia stores
β”‚   β”‚   β”œβ”€β”€ mcp.ts              # MCP server state & IPC calls
β”‚   β”‚   β”œβ”€β”€ group.ts            # Group state & IPC calls
β”‚   β”‚   └── settings.ts         # Settings state & IPC calls
β”‚   β”œβ”€β”€ types/                  # TypeScript type definitions
β”‚   β”œβ”€β”€ i18n/                   # i18n setup
β”‚   └── locales/                # Language packs (zh-CN, en)
β”œβ”€β”€ src-tauri/                  # Rust backend
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ main.rs             # Entry point
β”‚   β”‚   β”œβ”€β”€ lib.rs              # Tauri builder: setup, tray, single-instance, gateway & MCP initialization
β”‚   β”‚   β”œβ”€β”€ state.rs            # Global application state (DB, runtimes, clients, settings, gateway)
β”‚   β”‚   β”œβ”€β”€ commands/           # Tauri IPC command handlers
β”‚   β”‚   β”‚   β”œβ”€β”€ mcp.rs          # Server CRUD, connect/disconnect, tool call
β”‚   β”‚   β”‚   β”œβ”€β”€ group.rs        # Group CRUD + gateway restart
β”‚   β”‚   β”‚   β”œβ”€β”€ settings.rs     # Settings read/write + gateway restart
β”‚   β”‚   β”‚   β”œβ”€β”€ gateway.rs      # Gateway status query & restart
β”‚   β”‚   β”‚   └── capability.rs   # Capability listing
β”‚   β”‚   β”œβ”€β”€ mcp/                # MCP client management
β”‚   β”‚   β”‚   β”œβ”€β”€ runtime.rs      # Runtime state & client holder types
β”‚   β”‚   β”‚   └── manager/        # Connection lifecycle, discovery, transport
β”‚   β”‚   β”‚       β”œβ”€β”€ mod.rs      # connect, disconnect, refresh, call_tool
β”‚   β”‚   β”‚       β”œβ”€β”€ transport.rs # STDIO and Streamable HTTP client creation
β”‚   β”‚   β”‚       β”œβ”€β”€ discovery.rs # Tool/prompt/resource discovery
β”‚   β”‚   β”‚       └── runtime_state.rs # Runtime state helpers & event emission
β”‚   β”‚   β”œβ”€β”€ gateway/            # Streamable HTTP gateway
β”‚   β”‚   β”‚   β”œβ”€β”€ server.rs       # Axum server: routes per group, auth middleware, CORS
β”‚   β”‚   β”‚   └── handler/        # GroupHandler: tools, prompts, resources dispatch
β”‚   β”‚   └── db/                 # SQLite database layer
β”‚   β”‚       β”œβ”€β”€ mod.rs          # Schema initialization
β”‚   β”‚       β”œβ”€β”€ mcp_server.rs   # MCP server CRUD
β”‚   β”‚       β”œβ”€β”€ mcp_group.rs    # MCP group CRUD
β”‚   β”‚       β”œβ”€β”€ mcp_capability.rs # Discovered capabilities storage
β”‚   β”‚       └── app_settings.rs # Settings key-value store
β”‚   β”œβ”€β”€ icons/                  # App icons (macOS, Windows, tray)
β”‚   └── tauri.conf.json         # Tauri configuration
β”œβ”€β”€ biome.json                  # Biome linter & formatter config
└── package.json                # Node.js project manifest

Data Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Frontend (Vue 3)                       β”‚
β”‚  McpManagement ──→ Pinia stores ──→ Tauri IPC invoke()   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚ ipc
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                Backend (Rust / Tauri)                     β”‚
β”‚  commands/*.rs ──→ mcp/manager ──→ rmcp client          β”‚
β”‚                 ──→ gateway/server (axum)                 β”‚
β”‚                 ──→ db/* (rusqlite)                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Gateway Request Flow

Client β†’ POST http://localhost:3100/mcp/my-group (Streamable HTTP)
    β†’ Axum router
    β†’ Auth middleware (Bearer token check)
    β†’ GroupHandler::call_tool
        β†’ Parse prefixed tool name β†’ resolve server
        β†’ Get or connect upstream MCP client
        β†’ Forward call β†’ return result

Community

linux.do


License

MIT

About

MCP server management and aggregation gateway on your desktop.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors