00DOCUMENTATION

Quickstart

UMB is a single Rust binary that speaks JSON-RPC 2.0 over stdio. Build it, point it at your MCP servers, and add it to your agent like any other stdio MCP server.

01Install

Install

Install Rust via rustup, then build UMB from source. A release build is optimized, LTO-linked, and stripped — typically 3–8 MB.

INSTALL RUST
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ source "$HOME/.cargo/env"
BUILD UMB
$ git clone https://github.com/david-burley/umb
$ cd umb
$ cargo build --release
# binary → target/release/umb

Prefer a prebuilt binary? Grab one from the download page (macOS, Linux, Windows) or the GitHub releases.

02Configure your servers

Configure your servers

UMB reads ~/.umb/servers.json. It uses the standard MCP server format — the same shape as .mcp.json or claude_desktop_config.json.

~/.umb/servers.json
{
  "servers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/home"]
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_TOKEN": "$GITHUB_TOKEN" }
    }
  }
}

Add as many servers as you like — there is no limit. Edit this file while UMB is running and changes hot-swap automatically, with no restart.

03Connect your agent

Connect your agent

UMB runs as an MCP server over stdio. Add it to your agent's MCP configuration the same way you would any stdio server — point the command at the umb binary.

AGENT MCP CONFIG (.mcp.json / claude_desktop_config.json)
{
  "mcpServers": {
    "umb": {
      "command": "/path/to/umb"
    }
  }
}

That's it. Your agent now sees three meta-tools instead of every tool from every server — and reaches all of them through UMB.

04Works with your agent stack

Works with your agent stack

UMB is a stdio MCP server, so any agent that can launch a local MCP binary can use it. Each harness below does the same thing — point its MCP config at the umb binary. What UMB then exposes is whatever you registered in ~/.umb/servers.json above.

Claude Code — add it from the CLI (user scope), or commit an .mcp.json for project scope.

CLAUDE CODE
$ claude mcp add umb -- /path/to/umb

# or project-scoped .mcp.json:
{ "mcpServers": { "umb": { "command": "/path/to/umb" } } }

opencode — under the mcp key, a local server takes a command array.

OPENCODE (opencode.json)
{
  "mcp": {
    "umb": { "type": "local", "command": ["umb"], "enabled": true }
  }
}

Cursor / Windsurf / generic — the portable mcpServers block works across most clients (Cursor ~/.cursor/mcp.json, Windsurf, Cline, Zed).

CURSOR / WINDSURF / GENERIC (mcp.json)
{
  "mcpServers": {
    "umb": { "command": "umb", "args": [] }
  }
}

Hermes Agent (Nous Research) — reads ~/.hermes/config.yaml under mcp_servers; stdio is supported, so UMB runs directly.

HERMES AGENT (~/.hermes/config.yaml)
mcp_servers:
  umb:
    command: "umb"
    args: []
    enabled: true

OpenClaw — add it with the CLI; definitions are stored under mcp.servers in ~/.openclaw/openclaw.json.

OPENCLAW
$ openclaw mcp add umb --command umb
$ openclaw mcp doctor umb --probe

UMB serves stdio only. The sse / http entry types in servers.json describe the backing servers UMB connects to — not a way to reach UMB itself. If a harness can only talk to remote MCP servers, run UMB behind an mcp-proxy-style stdio→HTTP adapter. Full per-harness detail lives in docs/INTEGRATIONS.md.

05The meta-tools

The meta-tools

UMB exposes a minimal API. The agent works through these instead of ingesting hundreds of raw tool definitions.

list_tools(query?)

Enumerate available tools. Pass an optional query for semantic or substring search; results are ranked deterministically and capped (default 10).

list_mcps()

List the connected MCP servers and how many tools each one exposes.

route_mcp_call(tool, args, server?)

Execute any tool on any backing server by name. Pass server to disambiguate when two servers export the same tool name.

get_tool_info(name)

Fetch the full definition and input schema for one chosen tool — the cheap, on-demand way to load detail only when needed.

Built-in file and shell tools are also provided directly by UMB. The protocol uses JSON-RPC 2.0; tools/list and tools/call are accepted as aliases.

06CLI reference

CLI reference

umb [OPTIONS]
--list-servers        List configured MCP servers and exit
-v, --verbose         Show startup banner and verbose output
--doctor              Scan for orphaned umb daemon processes
--clean               With --doctor: terminate orphaned daemons
--json                With --doctor: machine-readable JSON output
--yes                 With --doctor --clean: skip confirmation
--daemon              Run as a shared daemon backend (multi-client)
--daemon-port <PORT>  Daemon TCP listener port (default: 19384)
--proxy               Run as a proxy that connects to / starts a daemon
--search-threshold <N>  Min cosine similarity for semantic search (0.7)
--search-limit <N>      Max tools returned by list_tools (default: 10)
-h, --help            Print help
-V, --version         Print version
07Daemon & doctor

Daemon & doctor

Run one shared backend and connect lightweight proxies to it, so multiple agent sessions reuse a single warm process.

DAEMON / PROXY
# terminal 1 — start the shared daemon
$ umb --daemon

# each agent — connect via a lightweight proxy
$ umb --proxy

If a session ever leaves an orphaned daemon behind, umb doctor finds and cleans it up. It's pure local introspection — no network, no telemetry.

DOCTOR
$ umb --doctor            # read-only scan
$ umb --doctor --clean    # terminate orphans (prompts first)
$ umb --doctor --json     # machine-readable output

Looking for the full reference, protocol details, and cross-compilation notes? See the README on GitHub.