Quick Start Guide¶
This guide walks you through setting up the MCP Gateway & Registry using pre-built Docker images. For other deployment options, see the Installation Guide.
Prerequisites¶
Click to expand: Install Docker, Node.js, Python, and UV
**Install Docker and Docker Compose:**# Install Docker
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# Add Docker's official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Add Docker repository
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
# Install Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Add user to docker group (logout/login required, or use newgrp)
sudo usermod -aG docker $USER
newgrp docker
# Verify installation
docker --version
docker compose version
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
node --version # Should show v20.x.x
Step 1: Clone and Setup¶
git clone https://github.com/agentic-community/mcp-gateway-registry.git
cd mcp-gateway-registry
cp .env.example .env
# Setup Python virtual environment
uv sync
source .venv/bin/activate
Step 2: Download Embeddings Model¶
Download the required sentence-transformers model using the HuggingFace CLI:
# Install huggingface_hub if not already installed
uv pip install -U huggingface_hub
# Download the model
hf download sentence-transformers/all-MiniLM-L6-v2 --local-dir ${HOME}/mcp-gateway/models/all-MiniLM-L6-v2
Step 3: Configure Environment¶
Click to expand: Edit .env file with your settings
Edit the `.env` file with your preferred editor: **Required changes:**# Authentication provider (do not change)
AUTH_PROVIDER=keycloak
# Set secure passwords (CHANGE THESE!)
KEYCLOAK_ADMIN_PASSWORD=YourSecureAdminPassword123!
INITIAL_ADMIN_PASSWORD=YourSecureAdminPassword123! # MUST match KEYCLOAK_ADMIN_PASSWORD
KEYCLOAK_DB_PASSWORD=SecureKeycloakDB123!
# Session cookie security (CRITICAL for local development)
# For HTTP access (localhost): MUST be false
SESSION_COOKIE_SECURE=false
# For HTTPS access (production): set to true
# SESSION_COOKIE_SECURE=true
# Leave these as defaults
KEYCLOAK_URL=http://localhost:8080
KEYCLOAK_REALM=mcp-gateway
KEYCLOAK_CLIENT_ID=mcp-gateway-client
Set environment variables for deployment:
Step 4: Deploy with Pre-built Images¶
Port Differences: - Docker: Services run on privileged ports (
http://localhost,https://localhost) - Podman: Services run on non-privileged ports (http://localhost:8080,https://localhost:8443)
Once the build completes and you see the container logs streaming, you can press Ctrl+C to exit the log view and continue with the next steps. The containers will continue running in the background.
Wait for all services to start (2-3 minutes), then verify:
Step 5: Initialize MongoDB¶
Initialize the MongoDB database with required collections, indexes, and default scopes:
# Run the MongoDB initialization container
docker compose up mongodb-init
# Verify collections were created
docker exec mcp-mongodb mongosh --eval "use mcp_registry; show collections"
# Should show: mcp_servers_default, mcp_agents_default, mcp_scopes_default, etc.
# Restart auth-server to load the new scopes
docker compose restart auth-server
Step 6: Initialize Keycloak¶
Click to expand: Complete Keycloak setup instructions
**6a. Wait for Keycloak to be ready:**# Monitor logs until you see "Keycloak started"
docker compose logs -f keycloak
# Press Ctrl+C when you see "Keycloak 25.x.x started"
# Or check health endpoint
curl http://localhost:8080/realms/master
# Should return JSON with realm information
ADMIN_TOKEN=$(curl -s -X POST "http://localhost:8080/realms/master/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=${KEYCLOAK_ADMIN}" \
-d "password=${KEYCLOAK_ADMIN_PASSWORD}" \
-d "grant_type=password" \
-d "client_id=admin-cli" | \
jq -r '.access_token') && \
curl -X PUT "http://localhost:8080/admin/realms/master" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"sslRequired": "none"}'
ADMIN_TOKEN=$(curl -s -X POST "http://localhost:8080/realms/master/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=${KEYCLOAK_ADMIN}" \
-d "password=${KEYCLOAK_ADMIN_PASSWORD}" \
-d "grant_type=password" \
-d "client_id=admin-cli" | \
jq -r '.access_token') && \
curl -X PUT "http://localhost:8080/admin/realms/mcp-gateway" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"sslRequired": "none"}'
chmod +x keycloak/setup/get-all-client-credentials.sh
./keycloak/setup/get-all-client-credentials.sh
Step 7: Set Up Users and Service Accounts¶
This creates: - 3 groups: registry-users-lob1, registry-users-lob2, registry-admins - 6 users: - LOB1: lob1-bot (M2M) and lob1-user (human) - LOB2: lob2-bot (M2M) and lob2-user (human) - Admin: admin-bot (M2M) and admin-user (human)
All credentials are saved to .oauth-tokens/ directory.
Step 8: Create AI Agent Account (Optional)¶
Click to expand: Create additional agent accounts
chmod +x keycloak/setup/setup-agent-service-account.sh
# Create a test agent with full access
./keycloak/setup/setup-agent-service-account.sh \
--agent-id test-agent \
--group mcp-servers-unrestricted
# Create an agent for AI coding assistants
./keycloak/setup/setup-agent-service-account.sh \
--agent-id ai-coding-assistant \
--group mcp-servers-unrestricted
# Retrieve credentials for the new agents
./keycloak/setup/get-all-client-credentials.sh
Step 9: Access the Registry¶
Click to expand: Remote Access Options (EC2, Port Forwarding, etc.)
The method to access the web UI depends on where you're running the MCP Gateway: **Option A: Local Machine (Linux/macOS)** If you're running on your local machine, simply open a browser - you're already on localhost. **Option B: AWS EC2 with Port Forwarding** If you're running on EC2 and want to access from your local machine via SSH tunnels: **Option C: AWS EC2 with Remote Desktop (GUI Access)** If you prefer a full desktop environment on your EC2 instance: **AWS Security Group**: Add inbound rule for port 3389 (RDP) from your IP. **Connect**: Use Remote Desktop Connection (Windows) or Microsoft Remote Desktop (macOS) with `your-ec2-ip:3389`, username `ubuntu`. See [Remote Desktop Setup Guide](remote-desktop-setup.md) for detailed instructions.# On macOS:
open http://localhost:7860
# On Linux (install xdg-utils if xdg-open is not available):
# sudo apt install xdg-utils
xdg-open http://localhost:7860
# Or open http://localhost:7860 in your browser
Login with: - Username: admin (or any user created in Step 6) - Password: The KEYCLOAK_ADMIN_PASSWORD you set in Step 3
Step 10: Register Example Servers and Agents (Optional)¶
To register example MCP servers and A2A agents, first get a JWT token from the Registry UI:
- In the Registry UI, click the "Get JWT Token" button (top-left corner)
- In the popup, click "Copy JSON" to copy the full token JSON
- Save it to a
.tokenfile:
# Create .token file with the copied JSON
# Note: .token is already in .gitignore so it won't be committed to the repo
cat > .token << 'EOF'
<paste the copied JSON here>
EOF
Then register servers and agents using the Registry Management CLI:
Note: Registration includes automatic security scanning using Cisco AI Defense MCP Scanner for servers and Cisco AI Defense A2A Scanner for agents. Each registration may take a few seconds while the security scan completes.
# Register MCP servers
uv run python api/registry_management.py --registry-url http://localhost --token-file .token \
register --config cli/examples/mcpgw.json
uv run python api/registry_management.py --registry-url http://localhost --token-file .token \
register --config cli/examples/cloudflare-docs-server-config.json
uv run python api/registry_management.py --registry-url http://localhost --token-file .token \
register --config cli/examples/context7-server-config.json
uv run python api/registry_management.py --registry-url http://localhost --token-file .token \
register --config cli/examples/currenttime.json
# Register A2A agents
uv run python api/registry_management.py --registry-url http://localhost --token-file .token \
agent-register --config cli/examples/travel_assistant_agent_card.json
uv run python api/registry_management.py --registry-url http://localhost --token-file .token \
agent-register --config cli/examples/flight_booking_agent_card.json
# Verify registrations
uv run python api/registry_management.py --registry-url http://localhost --token-file .token list
uv run python api/registry_management.py --registry-url http://localhost --token-file .token agent-list
Servers and agents are registered as disabled by default. Refresh the Registry UI to see them, then enable them using the toggle controls on each server/agent card.
Step 11: Test the Setup¶
Test the registry using the Registry Management CLI:
# List registered servers
uv run python api/registry_management.py --registry-url http://localhost --token-file .token list
# List registered agents
uv run python api/registry_management.py --registry-url http://localhost --token-file .token agent-list
# Search for servers by natural language
uv run python api/registry_management.py --registry-url http://localhost --token-file .token \
server-search --query "documentation tools"
# Search for agents by natural language
uv run python api/registry_management.py --registry-url http://localhost --token-file .token \
agent-search --query "travel booking"
# Invoke a tool on an MCP server (e.g., get current time)
# This exercises the "Gateway" functionality - the request is routed through the
# MCP Gateway to the backend currenttime server, demonstrating centralized access
uv run python cli/mcp_client.py --url http://localhost/currenttime/mcp --token-file .token \
call --tool current_time_by_timezone --args '{"tz_name": "America/New_York"}'
Next Steps¶
- Authentication Setup - Configure OAuth and identity providers
- AI Coding Assistants Setup - Integrate with VS Code, Cursor, Claude Code
- Complete Installation Guide - Additional deployment options
- Configuration Reference - Environment variables and settings
Alternative Deployment Options¶
Podman (Rootless)¶
For macOS and rootless Linux environments, see the Installation Guide and macOS Setup Guide.
Build from Source¶
For customization or development, see the Complete Setup Guide.