CLI Reference
MCP Hangar provides a comprehensive command-line interface for managing MCP servers.
Installation
pip install mcp-hangar
# or
uv pip install mcp-hangar
Synopsis
mcp-hangar [OPTIONS] COMMAND [ARGS]...
Global Options
These options are available for all commands:
| Option | Short | Type | Default | Env Variable | Description |
|---|---|---|---|---|---|
--config | -c | PATH | - | MCP_CONFIG | Path to config.yaml file |
--verbose | -v | FLAG | false | - | Show verbose output including debug information |
--quiet | -q | FLAG | false | - | Suppress non-essential output |
--json | - | FLAG | false | - | Output in JSON format for scripting |
--version | -V | FLAG | - | - | Show version and exit |
--help | - | FLAG | - | - | Show help message and exit |
Commands
| Command | Description |
|---|---|
init | Interactive setup wizard |
status | Show MCP server health dashboard |
add | Add MCP server from registry |
remove | Remove MCP server from configuration |
serve | Start the MCP server |
completion | Generate shell completion scripts |
auth | Manage authentication (bootstrap the initial admin) |
config | Validate config.yaml without starting a gateway |
init
Interactive setup wizard for MCP Hangar. Guides you through MCP server selection and configuration in under 5 minutes.
Synopsis
mcp-hangar init [OPTIONS]
Options
| Option | Short | Type | Default | Description |
|---|---|---|---|---|
--non-interactive | -y | FLAG | false | Run without prompts, using defaults |
--bundle | -b | TEXT | - | MCP Server bundle to install |
--mcp_servers | - | TEXT | - | Comma-separated list of MCP servers |
--config-path | - | PATH | - | Custom path for config file |
--claude-config | - | PATH | - | Custom path to Claude Desktop config |
--skip-claude | - | FLAG | false | Skip Claude Desktop config modification |
--skip-test | - | FLAG | false | Skip smoke test after configuration |
--reset | - | FLAG | false | Reset existing configuration |
MCP Server Bundles
| Bundle | MCP servers | Use Case |
|---|---|---|
starter | filesystem, fetch, memory | General use, getting started |
developer | filesystem, fetch, memory, github, git | Software development |
data | filesystem, fetch, memory, sqlite, postgres | Data analysis |
Examples
# Interactive setup
mcp-hangar init
# Install starter bundle
mcp-hangar init --bundle starter
# Install specific mcp_servers
mcp-hangar init --mcp_servers filesystem,github,sqlite
# Non-interactive with developer bundle
mcp-hangar init -y --bundle developer
# Custom config location
mcp-hangar init --config-path ~/my-config.yaml
# Skip Claude Desktop integration
mcp-hangar init --skip-claude
What It Does
- Detects Claude Desktop installation
- Presents MCP server categories for selection
- Collects required configuration (API keys, paths)
- Generates
config.yamlfile - Updates Claude Desktop configuration
- Shows next steps
status
Display health dashboard of all configured MCP servers with real-time updates.
Synopsis
mcp-hangar status [OPTIONS] [MCP_SERVER]
Arguments
| Argument | Required | Description |
|---|---|---|
MCP_SERVER | No | Show detailed status for specific MCP server |
Options
| Option | Short | Type | Default | Description |
|---|---|---|---|---|
--watch | -w | FLAG | false | Continuously update the display |
--interval | -i | FLOAT | 2.0 | Update interval in seconds (with --watch) |
--details | -d | FLAG | false | Show additional columns (mode, memory, uptime) |
MCP Server States
| State | Indicator | Description |
|---|---|---|
| READY | OK (green) | MCP Server is running and healthy |
| COLD | -- (dim) | MCP Server not started |
| INITIALIZING | .. (cyan) | MCP Server starting up |
| DEGRADED | !! (yellow) | MCP Server has issues |
| DEAD | XX (red) | MCP Server failed/crashed |
Examples
# Show all mcp_servers
mcp-hangar status
# Watch mode with live updates
mcp-hangar status --watch
# Faster refresh rate
mcp-hangar status -w -i 0.5
# Show detailed information
mcp-hangar status --details
# Single mcp_server details
mcp-hangar status github
# JSON output for scripting
mcp-hangar --json status
Output Columns
Standard view:
- MCP Server name
- State indicator
- Tools count
Detailed view (--details):
- MCP Server name
- State indicator
- Mode (subprocess/docker/remote)
- Tools count
- Memory usage
- Uptime
add
Add a MCP server from the MCP Registry to your configuration.
Synopsis
mcp-hangar add [OPTIONS] NAME
Arguments
| Argument | Required | Description |
|---|---|---|
NAME | Yes | MCP Server name or search query |
Options
| Option | Short | Type | Default | Description |
|---|---|---|---|---|
--search | -s | FLAG | false | Search registry instead of exact match |
--yes | -y | FLAG | false | Skip confirmation prompts |
--no-reload | - | FLAG | false | Don't hot-reload running server |
Available MCP servers
| MCP Server | Description | Requires Config |
|---|---|---|
filesystem | File system access | Yes (allowed paths) |
fetch | HTTP requests | No |
memory | Key-value storage | No |
github | GitHub API | Yes (token) |
git | Git operations | No |
sqlite | SQLite databases | Yes (database path) |
postgres | PostgreSQL databases | Yes (connection string) |
brave-search | Brave Search API | Yes (API key) |
puppeteer | Browser automation | No |
slack | Slack integration | Yes (token) |
google-maps | Google Maps API | Yes (API key) |
The registry is a fixed list of these eleven. google-drive, sentry,
raygun, everart and sequential-thinking were listed here and are not in
it -- mcp-hangar add sentry answers Did you mean: sqlite, slack? and
installs nothing. For anything outside the list, add the server to
config.yaml yourself.
Examples
# Add by exact name
mcp-hangar add github
# Search for mcp_servers
mcp-hangar add --search database
# Skip confirmation
mcp-hangar add filesystem -y
# Add without hot-reload
mcp-hangar add postgres --no-reload
Configuration Prompts
When adding a MCP server that requires configuration, you'll be prompted for:
- Secrets (API keys, tokens): Hidden input, stored securely
- Paths (directories, files): Path validation
- Text (URLs, names): Standard input
Environment variables are detected automatically. If GITHUB_TOKEN is set, you'll be asked whether to use it.
remove
Remove a MCP server from your configuration.
Synopsis
mcp-hangar remove [OPTIONS] NAME
Arguments
| Argument | Required | Description |
|---|---|---|
NAME | Yes | MCP Server name to remove |
Options
| Option | Short | Type | Default | Description |
|---|---|---|---|---|
--yes | -y | FLAG | false | Skip confirmation prompt |
--keep-running | - | FLAG | false | Don't stop running MCP server instance |
Examples
# Remove with confirmation
mcp-hangar remove github
# Remove without confirmation
mcp-hangar remove filesystem -y
# Remove from config but keep running
mcp-hangar remove postgres --keep-running
Behavior
- Validates MCP server exists in configuration
- Prompts for confirmation (unless
-y) - Stops running instance (unless
--keep-running) - Removes from config.yaml
- Attempts hot-reload of server
serve
Start the MCP Hangar server. This is the default command when no subcommand is specified.
Synopsis
mcp-hangar serve [OPTIONS]
# or simply:
mcp-hangar [OPTIONS]
Options
| Option | Short | Type | Default | Env Variable | Description |
|---|---|---|---|---|---|
--http | - | FLAG | false | MCP_MODE=http | Run in HTTP mode |
--host | - | TEXT | 0.0.0.0 | MCP_HTTP_HOST | HTTP server host |
--port | -p | INT | 8000 | MCP_HTTP_PORT | HTTP server port |
--log-file | - | PATH | - | - | Path to log file |
--log-level | - | TEXT | INFO | MCP_LOG_LEVEL | Log level |
--json-logs | - | FLAG | false | MCP_JSON_LOGS | Format logs as JSON |
--unsafe-no-auth | - | FLAG | false | - | Allow non-loopback HTTP binding without authentication (unsafe) |
Transport Modes
stdio (default)
JSON-RPC over stdin/stdout. Used by Claude Desktop and similar clients.
mcp-hangar serve
mcp-hangar --config config.yaml serve
HTTP
HTTP server with Streamable HTTP transport. Used by LM Studio and web clients.
mcp-hangar serve --http
mcp-hangar serve --http --port 9000
mcp-hangar serve --http --host 127.0.0.1 --port 8080
Binding a non-loopback host requires authentication. When
--hostis anything other than a loopback address (e.g. the default0.0.0.0), Hangar refuses to start unless authentication is configured (auth) or the--unsafe-no-authflag is passed to explicitly accept an unauthenticated listener. A loopback bind (--host 127.0.0.1) is exempt. This prevents accidentally exposing an unauthenticated gateway on a routable interface.
HTTP Endpoints
When running in HTTP mode:
| Endpoint | Method | Description |
|---|---|---|
/mcp | POST/GET | MCP protocol endpoint |
/health/live | GET | Liveness probe |
/health/ready | GET | Readiness probe |
/health/startup | GET | Startup probe |
/metrics | GET | Prometheus metrics |
Log Levels
DEBUG- Detailed debugging informationINFO- General operational information (default)WARNING- Warning messagesERROR- Error messages onlyCRITICAL- Critical errors only
Examples
# stdio mode (for Claude Desktop)
mcp-hangar serve
# HTTP mode on default port
mcp-hangar serve --http
# HTTP mode with custom port
mcp-hangar serve --http -p 9000
# With debug logging
mcp-hangar serve --log-level DEBUG
# With log file
mcp-hangar serve --log-file /var/log/mcp-hangar.log
# JSON logs for log aggregation
mcp-hangar serve --json-logs
# Full production setup
mcp-hangar serve --http --host 0.0.0.0 --port 8000 \
--log-level INFO --json-logs --log-file /var/log/mcp.log
completion
Generate shell completion scripts for tab-completion support.
Synopsis
mcp-hangar completion COMMAND
Subcommands
| Command | Description |
|---|---|
bash | Generate bash completion script |
zsh | Generate zsh completion script |
fish | Generate fish completion script |
install | Auto-install completion for detected shell |
Installation
Bash
# System-wide
mcp-hangar completion bash | sudo tee /etc/bash_completion.d/mcp-hangar
# User-only
mcp-hangar completion bash >> ~/.bashrc
Zsh
# Add to fpath
mcp-hangar completion zsh > ~/.zfunc/_mcp-hangar
# Add to .zshrc if not already present:
# fpath=(~/.zfunc $fpath)
# autoload -Uz compinit && compinit
Fish
mcp-hangar completion fish > ~/.config/fish/completions/mcp-hangar.fish
Auto-install
# Detect shell and install
mcp-hangar completion install
# Specify shell
mcp-hangar completion install zsh
auth
Authentication management. Currently exposes a one-time administrator bootstrap.
auth bootstrap-admin
Grant the one-time global admin role to an existing principal, using the
server's own durable auth backend. Solves the chicken-and-egg problem where a
fresh durable auth store with anonymous access disabled cannot create its first
administrator through the protected API. Added in 1.5.0.
The claim also mints an API key for that principal. Whether its secret is
printed is --show-key's decision, and the claim succeeds exactly once, so it
is a decision to make before running the command rather than after.
Synopsis
mcp-hangar auth bootstrap-admin --config PATH --principal PRINCIPAL [OPTIONS]
Options
| Option | Description |
|---|---|
--config PATH | Path to the server config.yaml whose durable auth backend to bootstrap. |
--principal PRINCIPAL | Existing external principal to grant global admin (e.g. user:admin). |
--key-name NAME | Human-readable label recorded for the bootstrap claim. |
--show-key | Print the minted API key's secret. Required when API keys are the only authenticator. Off by default. Since 2.5.0. |
Behavior
- Uses the same durable backend the server uses (never an in-memory store); the claim is a single atomic operation.
- Fails closed when
auth.enabledis false,allow_anonymousis true, or the storage driver is non-durable (memory/event_sourcing). - A second run is refused without mutating storage — exactly one bootstrap succeeds.
- Grants a global
adminrole to the principal, and mints an API key for it as part of the same claim. The key is stored hashed; its secret is printed only with--show-key, and is not recoverable afterwards. The grant is auditable. - Since 2.5.0: omitting
--show-keyis refused when no OIDC issuer is configured, before the claim is spent. API keys are then the only way in, so a run that withheld the secret would leave an admin nobody could present and a claim that cannot be made again. The refusal names the flag while re-running still works. - Since 2.5.0: a configuration with no authenticator at all — API keys disabled and no trusted issuer — is refused on the same grounds.
Example
An OIDC deployment: the principal authenticates on its own identity, so no secret is needed.
mcp-hangar auth bootstrap-admin --config /etc/mcp-hangar/config.yaml --principal user:alice@example.com
A deployment authenticated by API keys. Capture the secret from this run — there is no second one:
mcp-hangar auth bootstrap-admin --config /etc/mcp-hangar/config.yaml \
--principal service:my-app --show-key
config
Answer "is this configuration valid" without starting a gateway.
config check
mcp-hangar config check [PATH]
Reports every key that Hangar does not read. A key it does not read is kept and ignored, so the setting simply does not apply -- which is why a misspelling surfaces as a server that will not start, or as authentication that is quietly off, rather than as a configuration error.
PATH defaults to $MCP_CONFIG, then ./config.yaml.
| exit code | meaning |
|---|---|
0 | every key is one Hangar reads |
1 | at least one key is not |
2 | the file is missing, or is not YAML |
$ mcp-hangar config check config.yaml
FAIL config.yaml: 2 key(s) nothing reads:
auth has unknown key(s) ['enabledd']; allowed keys: ['allow_anonymous',
'api_key', 'enabled', 'oidc', 'opa', 'rate_limit', 'role_assignments', 'storage']
mcp_servers.math has unknown key(s) ['commandd']; allowed keys: [...]
The command is always strict. Loading a config only warns about an unknown key today -- see Unknown keys for what changes in 3.0.0 -- but this command exists to be asked the question directly, so it answers it. That makes it the thing to run in CI, and before a rollout.
Checked: top-level section names, the direct keys of each section, and the keys
of an mcp_servers.<id> spec. Not checked: anything deeper.
Configuration File
Default Locations
The CLI searches for configuration in this order:
--configoptionMCP_CONFIGenvironment variable~/.config/mcp-hangar/config.yaml./config.yaml(current directory)
Example Configuration
mcp_servers:
filesystem:
mode: subprocess
command:
- npx
- -y
- "@modelcontextprotocol/server-filesystem"
- "/home/user/documents"
github:
mode: subprocess
command:
- npx
- -y
- "@modelcontextprotocol/server-github"
env:
GITHUB_TOKEN: ${GITHUB_TOKEN}
my-api:
mode: remote
endpoint: https://api.example.com/mcp
logging:
level: INFO
json_format: false
event_store:
enabled: true
driver: sqlite
path: data/events.db
Environment Variables
| Variable | Description | Default |
|---|---|---|
MCP_CONFIG | Path to configuration file | - |
MCP_MODE | Server mode (stdio or http) | stdio |
MCP_HTTP_HOST | HTTP server host | 0.0.0.0 |
MCP_HTTP_PORT | HTTP server port | 8000 |
MCP_LOG_LEVEL | Log level | INFO |
MCP_JSON_LOGS | Enable JSON logging | false |
Exit Codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | User error (invalid input, missing file, permission denied) |
| 2 | System error (network failure, MCP server crash) |
| 130 | Interrupted by user (Ctrl+C) |