fix: update FreeCAD MCP URL and ports for consistency and add new backend configurations in Titania

This commit is contained in:
2026-03-28 22:32:17 +00:00
parent 45db26040e
commit 56d7fdb9cf
6 changed files with 134 additions and 74 deletions

View File

@@ -55,7 +55,7 @@ neo4j_mcp_url: http://circe.helu.ca:22034/mcp
nike_mcp_url: http://puck.incus:22031/mcp nike_mcp_url: http://puck.incus:22031/mcp
korax_mcp_url: http://korax.helu.ca:22021/mcp korax_mcp_url: http://korax.helu.ca:22021/mcp
rommie_mcp_url: https://rommie.ouranos.helu.ca/mcp rommie_mcp_url: https://rommie.ouranos.helu.ca/mcp
freecad_mcp_url: http://caliban.incus:22032/mcp freecad_mcp_url: https://freecad-mcp.ouranos.helu.ca/mcp
# Monitoring and Logging (internal endpoints on Prospero) # Monitoring and Logging (internal endpoints on Prospero)
loki_url: http://prospero.incus:3100/loki/api/v1/push loki_url: http://prospero.incus:3100/loki/api/v1/push

View File

@@ -19,7 +19,7 @@ principal_uid: 1000
alloy_log_level: "warn" alloy_log_level: "warn"
# Rommie MCP Server Configuration (Agent S GUI Automation) # Rommie MCP Server Configuration (Agent S GUI Automation)
rommie_port: 22031 rommie_port: 22061
rommie_host: "0.0.0.0" rommie_host: "0.0.0.0"
rommie_display: ":10" rommie_display: ":10"
rommie_allowed_hosts: "caliban.incus,rommie.ouranos.helu.ca" rommie_allowed_hosts: "caliban.incus,rommie.ouranos.helu.ca"
@@ -42,7 +42,7 @@ freecad_mcp_port: 22032
kernos_user: harper kernos_user: harper
kernos_group: harper kernos_group: harper
kernos_directory: /srv/kernos kernos_directory: /srv/kernos
kernos_port: 22021 kernos_port: 20201
kernos_host: "0.0.0.0" kernos_host: "0.0.0.0"
kernos_log_level: INFO kernos_log_level: INFO
kernos_log_format: json kernos_log_format: json

View File

@@ -166,6 +166,16 @@ haproxy_backends:
backend_port: 22781 backend_port: 22781
health_path: "/ready/" health_path: "/ready/"
- subdomain: "nike"
backend_host: "puck.incus"
backend_port: 20681
health_path: "/ready/"
- subdomain: "periplus"
backend_host: "puck.incus"
backend_port: 20581
health_path: "/ready/"
- subdomain: "spelunker" - subdomain: "spelunker"
backend_host: "puck.incus" backend_host: "puck.incus"
backend_port: 22881 backend_port: 22881
@@ -188,6 +198,12 @@ haproxy_backends:
health_path: "/api/" health_path: "/api/"
timeout_server: 300s # WebSocket support for HA frontend timeout_server: 300s # WebSocket support for HA frontend
- subdomain: "freecad-mcp"
backend_host: "caliban.incus"
backend_port: 22032
health_path: "/mcp"
timeout_server: 300s # SSE streaming support for MCP
- subdomain: "rommie" - subdomain: "rommie"
backend_host: "caliban.incus" backend_host: "caliban.incus"
backend_port: 22031 backend_port: 22031

View File

@@ -690,6 +690,40 @@ See [docs/COMPARISON.md](docs/COMPARISON.md) for a detailed analysis of these im
--- ---
## Ouranos Deployment
The FreeCAD Robust MCP Server runs on `caliban.incus` and is exposed via Titania's HAProxy with TLS termination.
### Architecture
```
External Agent (e.g., Claude Desktop / MCP Switchboard)
│ MCP Protocol (Streamable HTTP, TLS)
│ https://freecad-mcp.ouranos.helu.ca/mcp
Titania HAProxy (TLS termination, wildcard cert)
│ http://caliban.incus:22032/mcp
FreeCAD Robust MCP Server (HTTP transport mode)
│ XML-RPC (localhost:9875)
FreeCAD (GUI or headless)
```
### Integration
The MCP URL is registered in `group_vars/all/vars.yml`:
```yaml
freecad_mcp_url: https://freecad-mcp.ouranos.helu.ca/mcp
```
The route is served via Titania's HAProxy using the existing `*.ouranos.helu.ca` Let's Encrypt wildcard certificate.
**To deploy:** `ansible-playbook ansible/haproxy/configure.yml`
---
## License ## License
MIT License - see [LICENSE](LICENSE) for details. MIT License - see [LICENSE](LICENSE) for details.

View File

@@ -2,15 +2,6 @@
HTTP-enabled MCP shell server using FastMCP. Wraps the existing `mcp-shell-server` execution logic with FastMCP's HTTP transport for remote AI agent access. HTTP-enabled MCP shell server using FastMCP. Wraps the existing `mcp-shell-server` execution logic with FastMCP's HTTP transport for remote AI agent access.
## Overview
| Property | Value |
|----------|-------|
| **Host** | caliban.incus |
| **Port** | 22021 |
| **Service Type** | Systemd service (non-Docker) |
| **Repository** | `ssh://robert@clio.helu.ca:18677/mnt/dev/kernos` |
## Features ## Features
- **HTTP Transport**: Accessible via URL instead of stdio - **HTTP Transport**: Accessible via URL instead of stdio
@@ -60,17 +51,17 @@ Deploys Kernos to caliban.incus:
### Host Variables (`ansible/inventory/host_vars/caliban.incus.yml`) ### Host Variables (`ansible/inventory/host_vars/caliban.incus.yml`)
| Variable | Default | Description | | Variable | Description |
|----------|---------|-------------| |----------|-------------|
| `kernos_user` | `kernos` | System user for the service | | `kernos_user`| System user for the service |
| `kernos_group` | `kernos` | System group for the service | | `kernos_group` | System group for the service |
| `kernos_directory` | `/srv/kernos` | Installation directory | | `kernos_directory` | Installation directory |
| `kernos_port` | `22021` | HTTP server port | | `kernos_port` | HTTP server port |
| `kernos_host` | `0.0.0.0` | Server bind address | | `kernos_host` | Server bind address |
| `kernos_log_level` | `INFO` | Python log level | | `kernos_log_level` | Python log level |
| `kernos_log_format` | `json` | Log format (`json` or `text`) | | `kernos_log_format` | Log format (`json` or `text`) |
| `kernos_environment` | `production` | Environment name for logging | | `kernos_environment` | Environment name for logging |
| `kernos_allow_commands` | (see below) | Comma-separated command whitelist | | `kernos_allow_commands` |Comma-separated command whitelist |
### Global Variables (`ansible/inventory/group_vars/all/vars.yml`) ### Global Variables (`ansible/inventory/group_vars/all/vars.yml`)
@@ -110,12 +101,11 @@ The systemd service includes additional hardening:
### Testing Health Endpoints ### Testing Health Endpoints
```bash /health
curl http://caliban.incus:22021/health /ready
curl http://caliban.incus:22021/ready /live
curl http://caliban.incus:22021/live /metrics
curl -H "Accept: text/plain" http://caliban.incus:22021/metrics
```
### MCP Client Connection ### MCP Client Connection
@@ -174,10 +164,10 @@ The `/metrics` endpoint exposes Prometheus-compatible metrics. Add to your Prome
```bash ```bash
# Check service status # Check service status
ssh caliban.incus sudo systemctl status kernos sudo systemctl status kernos
# View logs # View logs
ssh caliban.incus sudo journalctl -u kernos -f sudo journalctl -u kernos -f
``` ```
## Troubleshooting ## Troubleshooting
@@ -192,7 +182,7 @@ ssh caliban.incus sudo journalctl -u kernos -f
### Health Check Failures ### Health Check Failures
1. Verify the service is running: `systemctl status kernos` 1. Verify the service is running: `systemctl status kernos`
2. Check if port 22021 is accessible 2. Check if port is accessible
3. Review logs for startup errors 3. Review logs for startup errors
### Command Execution Denied ### Command Execution Denied

View File

@@ -32,15 +32,39 @@ All containers are named after moons of Uranus and resolved via the `.incus` DNS
| **sycorax** | language_models | Arke LLM Proxy | ✔ | | **sycorax** | language_models | Arke LLM Proxy | ✔ |
| **titania** | proxy_sso | HAProxy TLS termination + Casdoor SSO | ✔ | | **titania** | proxy_sso | HAProxy TLS termination + Casdoor SSO | ✔ |
### oberon — Container Orchestration ### puck — Project Application Runtime
Shape-shifting trickster embodying Python's versatility.
This is the host that runs Python projects in the Ouranos sandbox.
It has an RDP server and is generally where application development happens.
Each project has a number that is used to determine port numbers.
- Docker engine
- JupyterLab (port 22071 via OAuth2-Proxy)
- Gitea Runner (CI/CD agent)
- Django Projects: Zelus (221), Angelia (222), Athena (224), Kairos (225), Icarlos (226), MCP Switchboard (227), Spelunker (228), Peitho (229), Mnemosyne (230)
- FastAgent Projects: Pallas (240)
- FastAPI Projects: Daedalus (200), Arke (201) Kernos (202), Stentor (203), Orpheus (204), Periplus (205), Nike (206)
### caliban — Agent Automation
Autonomous computer agent learning through environmental interaction.
- Docker engine
- Agent S MCP Server (MATE desktop, AT-SPI automation)
- Kernos MCP Shell Server (port 22062)
- Rommie MCP Server (port 22061) — agent-to-agent GUI automation via Agent S
- FreeCAD Robust MCP Server (port 22063) — CAD automation via FreeCAD XML-RPC
- GPU passthrough
- RDP access (port 25521)
### oberon — Container Orchestration & Dockerized Shared Services
King of the Fairies orchestrating containers and managing MCP infrastructure. King of the Fairies orchestrating containers and managing MCP infrastructure.
- Docker engine - Docker engine
- MCP Switchboard (port 22785) — Django app routing MCP tool calls - MCP Switchboard (port 22781) — Django app routing MCP tool calls
- RabbitMQ message queue - RabbitMQ message queue
- Open WebUI LLM interface (port 22088, PostgreSQL backend on Portia)
- SearXNG privacy search (port 22083, behind OAuth2-Proxy)
- smtp4dev SMTP test server (port 22025) - smtp4dev SMTP test server (port 22025)
### portia — Relational Database ### portia — Relational Database
@@ -58,15 +82,16 @@ Air spirit — ethereal, interconnected nature mirroring graph relationships.
- HTTP API: port 25584 - HTTP API: port 25584
- Bolt: port 25554 - Bolt: port 25554
### puck — Application Runtime ### miranda — MCP Docker Host
Shape-shifting trickster embodying Python's versatility. Curious bridge between worlds — hosting MCP server containers.
- Docker engine - Docker engine (API exposed on port 2375 for MCP Switchboard)
- JupyterLab (port 22071 via OAuth2-Proxy) - MCPO OpenAI-compatible MCP proxy 22071
- Gitea Runner (CI/CD agent) - Argos MCP Server — web search via SearXNG (port 22062)
- Home Assistant (port 8123) - Grafana MCP Server (port 22063)
- Django applications: Angelia (22281), Athena (22481), Kairos (22581), Icarlos (22681), Spelunker (22881), Peitho (22981) - Neo4j MCP Server (port 22064)
- Gitea MCP Server (port 22065)
### prospero — Observability Stack ### prospero — Observability Stack
@@ -79,16 +104,18 @@ Master magician observing all events.
- Loki log aggregation via Alloy (all hosts) - Loki log aggregation via Alloy (all hosts)
- Grafana dashboard suite with Casdoor SSO integration - Grafana dashboard suite with Casdoor SSO integration
### mirandaMCP Docker Host ### rosalind — Third Party Applications for testing and evaluation
Curious bridge between worlds — hosting MCP server containers. Witty and resourceful moon for PHP, Go, and Node.js runtimes.
- Docker engine (API exposed on port 2375 for MCP Switchboard) - SearXNG privacy search (port 22083, behind OAuth2-Proxy)
- MCPO OpenAI-compatible MCP proxy - Gitea self-hosted Git (port 22082, SSH on 22022)
- Grafana MCP Server (port 25533) - LobeChat AI chat interface (port 22081)
- Gitea MCP Server (port 25535) - Nextcloud file sharing and collaboration (port 22083)
- Neo4j MCP Server - AnythingLLM document AI workspace (port 22084)
- Argos MCP Server — web search via SearXNG (port 25534) - Nextcloud data on dedicated Incus storage volume
- Open WebUI LLM interface (port 22088, PostgreSQL backend on Portia
- Home Assistant (port 8123)
### sycorax — Language Models ### sycorax — Language Models
@@ -99,28 +126,6 @@ Original magical power wielding language magic.
- Session management with Memcached - Session management with Memcached
- Database backend on Portia - Database backend on Portia
### caliban — Agent Automation
Autonomous computer agent learning through environmental interaction.
- Docker engine
- Agent S MCP Server (MATE desktop, AT-SPI automation)
- Kernos MCP Shell Server (port 22021)
- Rommie MCP Server (port 22031) — agent-to-agent GUI automation via Agent S
- FreeCAD Robust MCP Server (port 22032) — CAD automation via FreeCAD XML-RPC
- GPU passthrough for vision tasks
- RDP access (port 25521)
### rosalind — Collaboration Services
Witty and resourceful moon for PHP, Go, and Node.js runtimes.
- Gitea self-hosted Git (port 22082, SSH on 22022)
- LobeChat AI chat interface (port 22081)
- Nextcloud file sharing and collaboration (port 22083)
- AnythingLLM document AI workspace (port 22084)
- Nextcloud data on dedicated Incus storage volume
### titania — Proxy & SSO Services ### titania — Proxy & SSO Services
Queen of the Fairies managing access control and authentication. Queen of the Fairies managing access control and authentication.
@@ -134,6 +139,21 @@ Queen of the Fairies managing access control and authentication.
--- ---
## Port Numbering
Well-known ports running as a service may be used: Postgresql 5432, Prometheus Metrics 9100.
However inside a docker project, the number plan needs to be followed to avoid port conflicts and confusion:
XXXYZ
XXX Project Number or 220 for external project
Y Service: 0 reserved, 1-4 flexible, 5 database, 6 MCP, 7 API, 8 Web App, 9 Prometheus metrics
Z Instance: The running instance of this app on the same host, starting at 1. May also be used to handle exceptions.
255 Incus port forwarding: Ports in ths range are forwarded from the Incus host to Incus containers (defined in Terraform)
514ZZ is the syslog port. Docker containers send their syslog to an Alloy syslog collector port. ZZ is the application instance, they just need to be different on the same host and increment from 01.
## External Access via HAProxy ## External Access via HAProxy
Titania provides TLS termination and reverse proxy for all services. Titania provides TLS termination and reverse proxy for all services.
@@ -162,7 +182,7 @@ Titania provides TLS termination and reverse proxy for all services.
| `kairos.ouranos.helu.ca` | puck.incus:22581 | Kairos (Django) | | `kairos.ouranos.helu.ca` | puck.incus:22581 | Kairos (Django) |
| `lobechat.ouranos.helu.ca` | rosalind.incus:22081 | LobeChat | | `lobechat.ouranos.helu.ca` | rosalind.incus:22081 | LobeChat |
| `loki.ouranos.helu.ca` | prospero.incus:443 (SSL) | Loki | | `loki.ouranos.helu.ca` | prospero.incus:443 (SSL) | Loki |
| `mcp-switchboard.ouranos.helu.ca` | oberon.incus:22785 | MCP Switchboard | | `mcp-switchboard.ouranos.helu.ca` | oberon.incus:22781 | MCP Switchboard |
| `nextcloud.ouranos.helu.ca` | rosalind.incus:22083 | Nextcloud | | `nextcloud.ouranos.helu.ca` | rosalind.incus:22083 | Nextcloud |
| `openwebui.ouranos.helu.ca` | oberon.incus:22088 | Open WebUI | | `openwebui.ouranos.helu.ca` | oberon.incus:22088 | Open WebUI |
| `peitho.ouranos.helu.ca` | puck.incus:22981 | Peitho (Django) | | `peitho.ouranos.helu.ca` | puck.incus:22981 | Peitho (Django) |