10 -- Discovery: Docker
Prerequisite: 01 -- HTTP GatewayYou will need: Running Hangar, Docker or Podman Time: 10 minutes Adds: Auto-discover MCP providers from Docker container labels
The Problem
You have MCP providers running as Docker containers. You don't want to manually update config.yaml every time a container starts or stops. You want Hangar to detect them automatically.
The Config
# config.yaml -- Recipe 10: Docker Discovery
discovery: # NEW: discovery configuration
enabled: true # NEW: enable auto-discovery
refresh_interval_s: 30 # NEW: scan every 30 seconds
auto_register: false # NEW: require manual approval
sources: # NEW: discovery sources
- type: docker # NEW: Docker source
mode: additive # NEW: only add, never removeTry It
Start an MCP provider container with labels:
bashdocker run -d --name my-provider \ -l mcp.hangar.enabled=true \ -l mcp.hangar.name=docker-math \ -l mcp.hangar.mode=http \ -l mcp.hangar.port=8080 \ my-mcp-server:latestStart Hangar:
bashmcp-hangar serve --http --port 8000Trigger a discovery scan:
bashcurl -X POST http://localhost:8000/api/discovery/sourcesCheck pending providers:
bashcurl http://localhost:8000/api/discovery/pendingjson{"pending": [{"name": "docker-math", "source": "docker", "mode": "remote"}]}Approve the provider:
bashcurl -X POST http://localhost:8000/api/discovery/approve/docker-mathVerify it's registered:
bashmcp-hangar statusdocker-math remote cold source=docker:auto-discovery
What Just Happened
The Docker discovery source connects to the Docker socket and lists containers with mcp.hangar.enabled=true labels. In additive mode, it only adds new providers -- never removes existing ones. With auto_register: false, discovered providers go to a pending queue for manual approval.
Set auto_register: true if you trust all labeled containers and want zero-touch registration.
Key Config Reference
| Key | Type | Default | Description |
|---|---|---|---|
discovery.enabled | bool | false | Enable auto-discovery |
discovery.refresh_interval_s | int | 30 | Seconds between scans |
discovery.auto_register | bool | false | Register without approval |
discovery.sources[].type | string | -- | docker, filesystem, kubernetes, entrypoint |
discovery.sources[].mode | string | -- | additive (add only) or authoritative (add and remove) |
Docker Labels
| Label | Required | Default | Description |
|---|---|---|---|
mcp.hangar.enabled | Yes | -- | Must be "true" |
mcp.hangar.name | No | Container name | Provider name |
mcp.hangar.mode | No | http | Provider mode |
mcp.hangar.port | No | 8080 | Provider port |
mcp.hangar.group | No | -- | Auto-add to group |
What's Next
Docker discovery works for local and CI environments. For Kubernetes, you need annotation-based discovery.