Labby
UnexploredRust MCP gateway with Code Mode, authentication, setup, logs, CLI, HTTP API, and operator web UI.
Install
Terminal
$npx -y @dinglebear/labby mcpmcp_config.json
{
"mcpServers": {
"ai-dinglebear-labby": {
"env": {
"LABBY_LOG": "${LABBY_LOG}",
"LABBY_REPO": "${LABBY_REPO}",
"LABBY_VERSION": "${LABBY_VERSION}"
},
"args": [
"-y",
"@dinglebear/labby",
"mcp"
],
"command": "npx"
}
}
}Documentation
Labby
Rust MCP gateway with Code Mode, authentication, setup, logs, CLI, HTTP API, and operator web UI.
Canonical remote: git@github.com:dinglebear-ai/labby.git.
The root README is the public entrypoint. The topic docs in docs/ own the detailed contracts; when this file and a topic doc disagree, fix the topic doc first and then refresh this summary.
Contents
- What Labby Does
- Quick Start
- Core Workflows
- Runtime Surfaces
- Configuration
- Current Catalogs
- Architecture
- Development
- Documentation
What Labby Does
Labby is centered on the current gateway/operator surface:
- MCP gateway - connect HTTP and stdio upstream MCP servers, inspect their
tools/resources/prompts, apply exposure filters, publish protected MCP routes,
and optionally collapse the upstream catalog into Code Mode
searchandexecute. - Direct stdio proxy - launch one stdio MCP server with
labby proxy /path/to/dist.jsand expose its unmodified MCP surface over loopback or an owned Tailscale Serve HTTPS port with tailnet, bearer, OAuth, or explicit no-auth policy. - Authentication and protected routes - run bearer or OAuth authentication, manage route-scoped access, authorize upstream OAuth connections, and publish protected MCP endpoints.
- Code Mode snippets - author, store, and run reusable JavaScript snippets
against the upstream catalog, with artifacts persisted under
$LABBY_HOME. - Setup and doctor - bootstrap
~/.labby, provision the host service, and run a health audit across env, reachability, auth, and versions. - Filesystem service - scoped, path-safety-checked file operations exposed through the same action dispatch as every other service.
- Server logs - search and tail the local
labby servelog stream. - Incus and bare-metal setup - provision and operate a dedicated Labby gateway host without introducing a separate fleet or deployment product.
- Generated discovery - publish code-owned service, action, environment, proxy configuration, API route, OpenAPI, MCP help, CLI help, and feature-matrix artifacts under docs/generated.
Use the generated service, action, and CLI catalogs below for the complete
current product surface instead of copying inventories into hand-written
documentation. Standalone ACP chat, Marketplace/MCP Registry browser, Fleet,
Deploy, and the old Agent Artifact Manager (Stash) remain retired; current Linux principal-scoped File Stash is a separate contract. Bounded provider-backed discovery
through the artifacts control-plane service does not restore those products.
Quick Start
Install Labby
Download the reviewed installer snapshot over canonical HTTPS, then run it locally:
curl --proto '=https' --proto-redir '=https' --tlsv1.2 -fSLo labby-install.sh \
https://raw.githubusercontent.com/dinglebear-ai/labby/5ee609bb255bebfbd9eef4d805998ac1e084b878/scripts/install.sh
sh labby-install.sh
This initial script is trusted through canonical HTTPS delivery and the explicitly reviewed commit snapshot above; the download does not follow a mutable branch. Its reviewed, embedded SHA-256 pins authenticate the verifier bootstrap; the installer never downloads a replacement checksum to decide which verifier to trust. It uses an installed GitHub CLI 2.102.0 or newer, or downloads and verifies pinned 2.102.0 into a private temporary directory. It does not change your PATH or install that helper globally. Required system tools are curl, tar, and sha256sum or shasum; macOS bootstrap also uses unzip.
Labby release archives still require checksum and provenance verification against the exact repository, release workflow, immutable tag and hosted-runner policy. Releases with <archive>.sigstore.jsonl bundles need no GitHub account: verification runs without tokens and with an empty credential store. Older releases without bundles require your own GitHub authentication; the installer stops before downloading their archive if authentication is unavailable. No privileged credential is supplied or shared. Installing a binary does not establish complete onboarding; the subsequent product-owned setup checks remain required.
The recommended local setup uses a native service, loopback listener, generated protected credentials, and a short-lived browser handoff. In Settings, connect your Agent provider, choose a discovered model and complete a starter Agent test, register selected supported clients, then use Discover to add and verify an MCP server. Required failures remain visible and resumable; installation alone is not full readiness. No manual configuration-file edits are needed on this path.
Optional agent-assisted guidance
The checked-in install-labby skill helps with guided installation, advanced deployments, and repair. It is optional. To add it to a skill-aware agent:
npx skills add https://github.com/dinglebear-ai/labby --skill install-labby
$install-labby
The skill inspects the selected host, follows binary-owned setup operations, helps with explicitly requested advanced deployment choices, and verifies the same required first-use checks. Built-in Agent configuration and external-client registration are separate steps. Security-sensitive durable writes remain owned by the Labby binary.
See skills/install-labby/SKILL.md for the canonical APM orchestration skill and docs/adr/0001-install-labby-first-class-install-orchestrator.md for the architecture decision.
Install through APM
Teams that standardize on the Agent Package Manager get the skills and the MCP registration in one step:
apm install -g dinglebear-ai/labby
That deploys install-labby, using-labby, using-codemode, and using-snippets into
~/.claude/skills and ~/.agents/skills and registers the labby stdio MCP
server (npx -y @dinglebear/labby mcp) for Claude Code and Codex; apm.yml at
the repository root is the manifest and apm outdated -g reports new
releases. APM does not install the labby binary or provision a gateway host:
use the standalone installer above and labby setup for that. The optional
$install-labby skill can guide those steps.
Manual Verified Release
For independent verification of the installer itself, use GitHub CLI 2.102.0 or newer. Older versions are rejected by Labby's installer and release gates because they lack the corrected signer and source-ref verification policy. Public provenance bundles allow this verification without GitHub login; legacy attestation lookup requires your own gh auth login or GH_TOKEN.
Linux/macOS:
Release compatibility gate: select a release that publishes
labby-install.shand contains the documented first-runlabby setup --role ...interface. Confirm the selected tag exposes the installer and checksum before continuing; do not assume an older release matches the current setup contract.
version=vX.Y.Z
base="https://github.com/dinglebear-ai/labby/releases/download/$version"
curl -fSLO "$base/labby-install.sh"
curl -fSLO "$base/labby-install.sh.sha256"
# For releases publishing bundles; older releases require authenticated verification.
curl -fSLO "$base/labby-install.sh.sigstore.jsonl"
gh attestation verify labby-install.sh \
--bundle labby-install.sh.sigstore.jsonl \
--repo dinglebear-ai/labby \
--signer-workflow dinglebear-ai/labby/.github/workflows/release.yml \
--source-ref "refs/tags/$version" \
--deny-self-hosted-runners
shasum -a 256 -c labby-install.sh.sha256
LABBY_INSTALL_VERSION="$version" sh ./labby-install.sh
MCP clients that prefer npm launchers can run Labby through the Node wrapper:
npx -y @dinglebear/labby mcp
The npm launcher is a weaker trust path than the installer scripts. It
downloads the release archive for the current platform and verifies only the
.sha256 sidecar (or the SHA256SUMS manifest) published next to it on the
same release; it does not require gh and does not verify GitHub build
provenance. Use labby-install.sh on Linux or macOS when provenance
verification matters. Current releases do not publish Windows binaries or
installers. The Windows installer source uses the same reviewed verifier pins,
protected temporary extraction, and account-free bundle policy; Windows runtime
qualification is still required before a Windows release claim.
The separately downloaded and attested install scripts resolve an immutable GitHub Release containing the current
platform asset, prepare a verified GitHub CLI, verify the archive's attestation against the
Labby repository, release.yml, exact tag, and hosted-runner policy, verify its checksum, and install labby onto the
user PATH. The shell installer then runs labby setup, which
asks whether this machine should run a server or connect to an existing one.
Server setup configures authentication and a managed native service, or an Incus
container on supported Linux hosts. Client setup saves the explicit gateway URL
and configures browser sign-in or a bearer token. Desktop installation is optional
and off by default; if the published desktop package is unavailable, setup reports
that and still completes.
For Labby's supported ChatGPT web connection, configure the server in OAuth mode
and expose it through a publicly reachable HTTPS LABBY_PUBLIC_URL; bearer-only
mode is for local/CLI clients and is not the supported ChatGPT web path. The web
UI offers bearer token sign-in only over HTTPS or a direct loopback connection;
behind a TLS-terminating proxy, set LABBY_PUBLIC_URL=https://... to unlock it.
For unattended shell installs, set LABBY_SETUP_ROLE=server or client and the
corresponding LABBY_SETUP_* options. For a binary-only install, set
LABBY_INSTALL_NO_SETUP=1. Manual and automatic labby host update operations always
skip first-run setup. See the setup guide for examples.
Override install behavior with LABBY_INSTALL_DIR, LABBY_INSTALL_VERSION, or
LABBY_INSTALL_REPO. Source fallback is off by default. Opt in with
LABBY_ALLOW_SOURCE_FALLBACK=1; a pinned LABBY_INSTALL_VERSION is passed to
Cargo as the exact tag instead of silently building the default branch.
Each successful install retains the verified binary by SHA-256 plus an
owner-only receipt beneath <install-dir>/.labby-install/. At least the prior
verified artifact remains available when distribution is unavailable. Restore
it without downloading or changing $LABBY_HOME:
LABBY_INSTALL_ROLLBACK=1 sh ./labby-install.sh
Rollback switches only the installed executable and receipt. It does not
downgrade or delete configuration, credentials, databases, or other durable
state. Inspect the receipt at <install-dir>/.labby-install/receipt.
Release qualification can install an already-downloaded candidate without
network or source fallback by setting LABBY_INSTALL_LOCAL_BINARY and its exact
lowercase LABBY_INSTALL_LOCAL_SHA256. The installer copies that input once to
private staging, verifies the staged bytes, and activates those same bytes. It
also rehashes every existing cached artifact before reuse. Before changing the
binary or either receipt, the installer writes a recovery journal beneath
.labby-install/; a later invocation restores the complete pre-install
snapshot when it finds an interrupted activation. If restoration fails, the
installer stops and retains the journal for diagnosis.
All Unix installer entry points share a process-level transaction lock and
flush journal boundaries before advancing them. Successful activation retains
only the current artifact and the immediately previous artifact required for
offline rollback.
Automatic updates on macOS
For a persistent macOS server, enable daily updates in the existing server job:
LABBY_SERVICE_AUTO_UPDATE=1 bash scripts/install-macos-service.sh install
This runs labby serve --auto-update under launchd and removes the separate
updater job after the server passes its health check. See the
macOS setup instructions.
For an installation without a persistent server, use the standalone daily job:
labby host update auto enable
labby host update auto status
labby host update auto disable
Both modes require Apple Silicon. The installer uses a suitable existing GitHub
CLI or bootstraps its pinned verifier in a private temporary directory. They skip drafts, prereleases, missing platform assets, and versions
equal to or older than the installed binary. The installer verifies attestations
and checksums before atomic replacement. No separate language runtime is required.
Use labby host update --automatic --dry-run to check without installing.
Build From Source
Prerequisites:
- Rust 1.97.1 or newer. CI/release verifies with Rust 1.97.1.
justfor repo commands.cargo-nextestfor the main test suite.- Node.js 22.x and
pnpm 9.15.9to build the Labby web UI. The repo pins these in .mise.toml and apps/web/package.json. opensslif you want to generate a bearer token manually.
git clone git@github.com:dinglebear-ai/labby.git
cd labby
just install
labby serve --host 127.0.0.1 --port 8765
just install installs the locked frontend dependencies, builds and validates
the static web UI, then embeds it in the all-features release binary and installs
it at ~/.local/bin/labby. The normal build, run, and service-install recipes
also build the UI automatically before compiling Rust. Node.js and pnpm are
build-time tools only; prebuilt release binaries already include the UI.
On macOS, install the gateway as a persistent per-user service instead of
running labby serve in a terminal:
just macos-service-install
just macos-service-status
This installs a launchd LaunchAgent that keeps Labby listening on
127.0.0.1:8765, restarts it after login or exit, and uses the stable absolute
LABBY_HOME (default ~/.labby) as both working directory and durable
configuration root. It never persists the directory from which installation
was invoked. Logs default to the same root. Use just macos-service-restart
after changing service settings
or just macos-service-uninstall to remove it. The cross-platform
just service-install, just service-status, just service-restart, and
just service-uninstall bindings select launchd on macOS and systemd on
Linux. This is suitable for a Tailscale Serve/Funnel route whose OAuth
callback targets the local gateway.
When overriding the launchd paths, LABBY_SERVICE_BIN, LABBY_STATE_DIR, and
LABBY_HOME must all be absolute; relative paths fail before the plist or
service is changed.
First Run
For loopback development, labby serve can bootstrap a missing bearer token for
you. If LABBY_MCP_HTTP_TOKEN is absent and LABBY_AUTH_MODE is not oauth, it
generates a token, writes a minimal ~/.labby/.env, reloads it into the running
process, prints configuration guidance, and continues. The token itself is stored in
~/.labby/.env rather than printed.
Bootstrap writes these required setup keys if no env exists yet:
LABBY_MCP_HTTP_TOKEN(generated random 64-character hex token)LABBY_MCP_TRANSPORT=httpLABBY_MCP_HTTP_HOST=127.0.0.1LABBY_MCP_HTTP_PORT=8765LABBY_AUTH_MODE=bearer
It also enforces secure file creation via Labby's env_merge path (0600 perms on
Unix). This is a minimal loopback bootstrap, not the guided onboarding flow.
Run labby setup for interactive server/client configuration, or
labby setup state --json to inspect the snapshot without changing configuration. Ongoing configuration is available in the operator UI's Settings pages.
For explicit setup with a manually generated bearer token:
mkdir -p ~/.labby
printf 'LABBY_AUTH_MODE=bearer\nLABBY_MCP_HTTP_TOKEN=%s\n' "$(openssl rand -hex 32)" > ~/.labby/.env
chmod 600 ~/.labby/.env
labby setup
labby serve --host 127.0.0.1 --port 8765
Open http://127.0.0.1:8765/. Release binaries and normal source builds already
include the operator UI; no separate web-assets step is needed.
Self-Host The Gateway
The recommended self-hosted gateway substrate is an amd64 Ubuntu 26.04 Incus system container. Bare metal is the secondary supported shape for a dedicated gateway host or VM. Labby does not ship a Docker image or Compose deployment; stdio MCP servers and agent CLIs are installed and launched at runtime.
labby host incus setup --version vX.Y.Z
incus exec labby -- systemctl status labby --no-pager
incus exec labby -- curl -fsS http://127.0.0.1:8765/ready
See docs/runtime/INCUS.md for the full Incus
runbook, bare-metal variant, /dev/net/tun Tailscale passthrough, manual
claude/codex/gemini login checklist, and rollback commands.
Proxy One Stdio MCP Server
After installing Labby, configure proxy defaults once and launch a JavaScript stdio server without proxy flags:
labby config proxy set
labby doctor proxy
labby proxy /path/to/dist.js
The built-in zero-flag policy is Tailscale Serve plus tailnet authorization on a random high port. Child flags follow the first child token unchanged, and an explicit separator is available for unusual commands:
labby proxy /path/to/dist.js --workspace /srv/data --read-only
labby proxy -- npx -y @modelcontextprotocol/server-filesystem /srv/data
Use labby proxy --local --auth none ... for explicit loopback-only
development. Bearer and OAuth setup, exact-port resource audiences, safe Serve
ownership, configuration precedence, output modes, and recovery are covered in
the stdio MCP proxy guide.
Core Workflows
Start Labby
labby serve --host 127.0.0.1 --port 8765
labby mcp
labby serve starts the hosted HTTP runtime: /v1 product APIs, /mcp
streamable HTTP MCP, auth routes, OAuth relay endpoints, and static Labby web
assets when an export is available. labby mcp is the stdio MCP entrypoint for
local MCP clients. A client configured to launch labby mcp does not need an
HTTP URL: when a labby serve daemon is reachable, the stdio process becomes a
transparent bridge to that daemon and uses its gateway configuration, upstream
connections, and OAuth state. If no daemon is found and no explicit target is
set, it starts a standalone local gateway instead. See the
local bridge guide
for client configuration and LABBY_SERVER_URL fail-closed behavior.
Discover Commands
labby --help
labby help --all
labby help server --all
labby help --search oauth
labby help --all --json
Public command names use separate words without hyphens. Flags and resource names retain normal syntax. Help and completion work offline, even with broken configuration. See the CLI guide and [breaking migration map](./do
Sourced from the repository README.
More in Browser & Web
- browser-useControl a real Chrome browser to complete any task: fill forms, extract data, book flights.110,346
- Puppeteer MCP ServerEnables headless browser automation for scraping dynamic JS pages, taking full-page screenshots, clicking elements, and filling web forms.9,800
- Business Contact FinderCheck how to contact a business website, and whether that contact path actually works.7,331
- strataMCP server for progressive tool usage at any scale (see https://klavis.ai)5,807
- exaConnect AI agents to Exa for web search, content fetching, and multi-step research.5,096
- apify-mcp-serverExtract data from any website with thousands of scrapers, crawlers, and automations on Apify Store ⚡4,798