All services use a unified port scheme based on 4040 as the base port.
4040 = FORGE dev base (memorable, doesn't conflict with common ports)
| Port | Service | Description |
|---|---|---|
| 4040 | forge-ui | Vue.js chat interface |
| 4041 | forge-orchestrator | LLM agent loop (REST + SSE) |
| 4042 | forge-armory | MCP protocol gateway |
| 4043 | armory-admin-ui | Armory admin UI (Vite dev server) |
| 4044-4049 | reserved | Future core services |
| Port | Service | Description |
|---|---|---|
| 4050 | mcp-weather | Weather data (Open-Meteo API) |
| 4051 | mcp-web-search | Web search (Brave Search API) |
| 4052+ | available | Future MCP servers |
forge-ui (:4040)
│
▼
forge-orchestrator (:4041)
│
▼
armory-admin-ui ───► forge-armory (:4042)
(:4043) │
┌──────┴──────┐
▼ ▼
mcp-weather mcp-web-search
(:4050) (:4051)
Startup order: MCP servers → Armory → Admin UI / Orchestrator → UI
Each component has a .env.example file showing all available options.
The .env files are pre-configured for local development with the port scheme below.
ORCHESTRATOR_HOST=0.0.0.0
ORCHESTRATOR_PORT=4041
ORCHESTRATOR_ARMORY_URL=http://localhost:4042/mcp
# Required: Set your OpenRouter API key
OPENROUTER_API_KEY=sk-or-...
# Optional
ORCHESTRATOR_DEFAULT_MODEL=anthropic/claude-sonnet-4
ORCHESTRATOR_SHOW_THINKING=true
ORCHESTRATOR_CONVERSATIONS_DIR=~/.forge/conversationsARMORY_HOST=0.0.0.0
ARMORY_PORT=4042
ARMORY_DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/forge_armoryVITE_API_URL=http://localhost:4041MCP servers use command-line arguments (no .env files needed):
# mcp-weather
uv run python -m forge_mcp_weather.server --port 4050
# mcp-web-search (requires BRAVE_API_KEY)
BRAVE_API_KEY=... uv run python -m forge_mcp_web_search.server --port 4051- Assign the next available port (4052, 4053, etc.)
- Update this document
- Add the server to
dev-start.sh - Register the backend in Armory:
cd forge-armory uv run armory backend add <name> --url http://localhost:<port>/mcp