SAP CC Compute (Nova)
MCP Tools
Read Tools
| Tool |
Purpose |
Key Parameters |
nova_list_servers |
List instances with filtering |
status, name (regex), limit |
nova_get_server |
Full detail by UUID: addresses, flavor, image, host_id, metadata |
server_id |
nova_list_flavors |
Available instance types with vCPUs, RAM, disk |
— |
nova_list_keypairs |
List SSH keypairs for current user |
— |
nova_list_availability_zones |
List AZs and their state |
— |
nova_get_quotas |
Compute quota usage and limits |
project_id (optional) |
nova_list_instance_actions |
Action history for a server (start, stop, reboot, etc.) |
server_id |
nova_list_server_groups |
List server groups (anti-affinity, affinity policies) |
— |
nova_list_volume_attachments |
List volumes attached to a server |
server_id |
Write Tools (requires MCP_READ_ONLY=false)
| Tool |
Purpose |
Key Parameters |
nova_server_action |
Lifecycle actions: start, stop, reboot, pause, unpause, suspend, resume |
server_id, action, type (for reboot) |
nova_create_server |
Create a new server instance |
name, flavor, image, network |
Admin Tools (requires MCP_ADMIN_TOOLS=true)
| Tool |
Purpose |
Key Parameters |
nova_list_hypervisors |
List all hypervisors in the deployment |
— |
nova_get_hypervisor |
Detail for a specific hypervisor (capacity, VMs) |
hypervisor_id |
nova_list_services |
List Nova services (compute, scheduler, conductor) and state |
— |
nova_list_aggregates |
List host aggregates and their metadata |
— |
Gotchas
Check quota before creating. Nova returns generic 403 or 409 when quota is exhausted — no helpful message. Always call `limes_get_project_quota` for `compute` resources (instances, cores, ram) before any create/resize operation. The error "Quota exceeded" is often not in the Nova response at all.
SHUTOFF still consumes quota. A stopped server (`SHUTOFF` status) continues to consume `instances` and `cores` quota. Only `DELETED` servers release quota. Users who "stopped" servers expecting freed capacity will be confused — clarify this distinction.
Ports are not in the Nova response. The `addresses` field on a server shows IP addresses grouped by network name, but does NOT include port UUIDs, MAC addresses, or security group assignments. To get port details, call `neutron_list_ports` with `device_id=`. This is the only way to find which security groups apply to a server.
SAP CC flavor naming conventions. Flavors follow the pattern `_` (e.g., `m2_xlarge`). Families: `m` = general purpose, `r` = memory-optimized, `c` = compute-optimized. Generations increment (1, 2, 3...). See `references/flavor-families.md` for the full matrix. Do not guess flavor names — always call `nova_list_flavors` to confirm availability in the current region.
Server actions are asynchronous. Calling `nova_server_action` returns 202 immediately. The server transitions through intermediate states (e.g., `REBOOT` → `ACTIVE`). You must poll with `nova_get_server` to confirm the action completed. Typical transitions take 5-30 seconds but can take minutes for large instances.
HARD reboot is destructive. A `HARD` reboot is equivalent to pulling the power cord — in-flight I/O is lost, filesystems may corrupt. Always attempt `SOFT` reboot first (sends ACPI shutdown signal). Only escalate to `HARD` if the guest OS is unresponsive. Confirm with the user before issuing HARD reboot.
ERROR state requires admin intervention. Servers in `ERROR` status cannot be recovered via `nova_server_action`. Common causes: host failure, scheduler error, failed live-migration. The user must contact their cloud admin or file a support ticket. Do not attempt repeated actions on ERROR servers.
Addresses field structure varies by network. The `addresses` response is keyed by network name, with each entry containing `addr` (IP), `version` (4/6), and `OS-EXT-IPS:type` (`fixed` or `floating`). Multiple networks produce multiple keys. Do not assume a single-network structure.
Server metadata is not automatically populated. Nova metadata is user-supplied key-value pairs. Do not expect metadata to contain project info, cost center, or ownership unless the user's automation sets it. The `host_id` is an opaque hash — it identifies co-location but is not a hostname.
Name filter is not exact match. `nova_list_servers` with a `name` filter uses regex-style matching. Searching for `name=web` returns `web-1`, `web-prod`, `my-web-server`, etc. For exact matches, filter results client-side after retrieval.
Common Workflows
List and Inspect Servers
1. nova_list_servers (optionally filter by status or name)
2. For each server needing detail: nova_get_server with its UUID
3. For network info: neutron_list_ports with device_id=<server-uuid>
Get Full Server + Network Picture
1. nova_get_server → note addresses (IPs) and server UUID
2. neutron_list_ports with device_id=<server-uuid> → port UUIDs, MAC, security groups
3. For each security group ID: neutron_list_security_groups for rules
This gives the complete picture: server → IPs → ports → security groups → rules.
Debug: Server Won't Start
1. nova_get_server → check current status
- SHUTOFF: try nova_server_action start
- ERROR: inform user, admin required
- BUILD: still provisioning, wait
- PAUSED/SUSPENDED: unpause/resume first
2. If start fails with 409: limes_get_project_quota → check compute quota
3. If quota ok: hermes_list_events with target.id=<server-uuid> → recent errors
4. If no audit clues: maia_query for host-level issues
Perform Server Action Safely
1. nova_get_server → confirm current status allows the action
Valid transitions:
- start: SHUTOFF → ACTIVE
- stop: ACTIVE → SHUTOFF
- reboot (SOFT): ACTIVE → ACTIVE (via REBOOT)
- reboot (HARD): any running state → ACTIVE (destructive)
- pause: ACTIVE → PAUSED
- unpause: PAUSED → ACTIVE
- suspend: ACTIVE → SUSPENDED
- resume: SUSPENDED → ACTIVE
2. For destructive actions (stop, HARD reboot): confirm with user
3. nova_server_action with action and server_id
4. Poll nova_get_server until status reaches target (or timeout after 2 min)
Select a Flavor
1. nova_list_flavors → get available flavors in region
2. Match requirements to flavor family:
- Balanced workload → m-series (general purpose)
- Database/cache → r-series (memory-optimized)
- Batch/CI → c-series (compute-optimized)
3. Check limes_get_project_quota to ensure cores/ram headroom
4. If flavor not found: may not be available in this region or project
Troubleshooting
Stuck in BUILD
Server has been in `BUILD` status for >10 minutes.
- Typical cause: Scheduler couldn't place it (no host with capacity), or image download is slow.
- Diagnostic: `hermes_list_events` filtered to `target.id=` — look for `compute/server/create` with outcome `pending` or `failure`.
- Resolution: If no events after 15 min, likely a scheduler issue — admin intervention required. Do not delete-and-retry without checking quota first.
ERROR After Resize
Server entered ERROR after a resize or migrate operation.
- Typical cause: Target host ran out of disk during resize, or live-migration timed out.
- Diagnostic: `hermes_list_events` for recent `compute/server/resize` or `compute/server/migrate` events. Check outcome field.
- Resolution: Admin must reset the server state. User cannot self-service from ERROR.
Can't Reach Server via Network
Server is ACTIVE but unreachable.
- Diagnostic steps:
- `nova_get_server` → confirm status is ACTIVE (not PAUSED/SUSPENDED)
- Check addresses: does it have a floating IP? Fixed IPs are only reachable from within the VPC/network.
- `neutron_list_ports` with `device_id` → check port `status` (should be `ACTIVE`, not `DOWN` or `BUILD`)
- Check security groups on the port → ensure ingress rules allow the traffic (SSH=22, ICMP, etc.)
- If port is DOWN: may be a binding failure — check `hermes_list_events` for port-related events
Security Considerations
- Confirm destructive actions: Always ask user confirmation before `stop`, `HARD reboot`, or any action that interrupts service. State what will happen: "This will immediately power off the instance, dropping all connections."
- Metadata visibility: Server metadata is visible to anyone with `compute:server:show` permission in the project. Do not store secrets, credentials, or PII in metadata.
- Host ID is semi-sensitive: While opaque, `host_id` reveals co-location (same hash = same hypervisor). Avoid exposing it in shared contexts without need.
- Audit trail: All server actions generate Hermes events. Inform users that actions are logged with their credential identity.
- Cross-project access: Nova operations are scoped to the authenticated project. You cannot see or act on servers in other projects without re-scoping credentials.
Cross-Service References
| Need |
Service |
Tool |
| Network interfaces for a server |
Neutron |
neutron_list_ports(device_id=<server_uuid>) |
| Attached volumes |
Cinder |
cinder_list_volumes → filter by attachments[].server_id |
| Quota before creating |
Limes |
limes_get_project_quota(service=compute) |
| Who modified this server |
Hermes |
hermes_list_events(target_type=compute/server, target_id=<uuid>) |
| CPU/memory metrics |
Maia |
maia_query with vm_cpu_seconds_total, vm_memory_usage_bytes |
| Security groups on ports |
Neutron |
neutron_list_ports → then neutron_list_security_groups |
Routing
| User need |
Action |
| Flavor naming and selection |
Read flavor-families.md |
1---2name: sapcc-compute3description: Manage compute instances on SAP Converged Cloud. Covers server lifecycle, flavor selection, status transitions, and cross-service correlation with networking and storage. Use when: listing VMs, checking server status, debugging instance issues, performing server actions (start/stop/reboot), selecting flavors, or investigating why a server won't start. NOT for container workloads (use sapcc-registry) or bare metal.4---56# SAP CC Compute (Nova)78## MCP Tools910### Read Tools11| Tool | Purpose | Key Parameters |12|------|---------|----------------|13| `nova_list_servers` | List instances with filtering | `status`, `name` (regex), `limit` |14| `nova_get_server` | Full detail by UUID: addresses, flavor, image, host_id, metadata | `server_id` |15| `nova_list_flavors` | Available instance types with vCPUs, RAM, disk | — |16| `nova_list_keypairs` | List SSH keypairs for current user | — |17| `nova_list_availability_zones` | List AZs and their state | — |18| `nova_get_quotas` | Compute quota usage and limits | `project_id` (optional) |19| `nova_list_instance_actions` | Action history for a server (start, stop, reboot, etc.) | `server_id` |20| `nova_list_server_groups` | List server groups (anti-affinity, affinity policies) | — |21| `nova_list_volume_attachments` | List volumes attached to a server | `server_id` |2223### Write Tools (requires MCP_READ_ONLY=false)24| Tool | Purpose | Key Parameters |25|------|---------|----------------|26| `nova_server_action` | Lifecycle actions: start, stop, reboot, pause, unpause, suspend, resume | `server_id`, `action`, `type` (for reboot) |27| `nova_create_server` | Create a new server instance | `name`, `flavor`, `image`, `network` |2829### Admin Tools (requires MCP_ADMIN_TOOLS=true)30| Tool | Purpose | Key Parameters |31|------|---------|----------------|32| `nova_list_hypervisors` | List all hypervisors in the deployment | — |33| `nova_get_hypervisor` | Detail for a specific hypervisor (capacity, VMs) | `hypervisor_id` |34| `nova_list_services` | List Nova services (compute, scheduler, conductor) and state | — |35| `nova_list_aggregates` | List host aggregates and their metadata | — |3637## Gotchas38391. **Check quota before creating.** Nova returns generic 403 or 409 when quota is exhausted — no helpful message. Always call \`limes_get_project_quota\` for \`compute\` resources (instances, cores, ram) before any create/resize operation. The error "Quota exceeded" is often not in the Nova response at all.40412. **SHUTOFF still consumes quota.** A stopped server (\`SHUTOFF\` status) continues to consume \`instances\` and \`cores\` quota. Only \`DELETED\` servers release quota. Users who "stopped" servers expecting freed capacity will be confused — clarify this distinction.42433. **Ports are not in the Nova response.** The \`addresses\` field on a server shows IP addresses grouped by network name, but does NOT include port UUIDs, MAC addresses, or security group assignments. To get port details, call \`neutron_list_ports\` with \`device_id=<server-uuid>\`. This is the only way to find which security groups apply to a server.44454. **SAP CC flavor naming conventions.** Flavors follow the pattern \`<family><generation>_<size>\` (e.g., \`m2_xlarge\`). Families: \`m\` = general purpose, \`r\` = memory-optimized, \`c\` = compute-optimized. Generations increment (1, 2, 3...). See \`references/flavor-families.md\` for the full matrix. Do not guess flavor names — always call \`nova_list_flavors\` to confirm availability in the current region.46475. **Server actions are asynchronous.** Calling \`nova_server_action\` returns 202 immediately. The server transitions through intermediate states (e.g., \`REBOOT\` → \`ACTIVE\`). You must poll with \`nova_get_server\` to confirm the action completed. Typical transitions take 5-30 seconds but can take minutes for large instances.48496. **HARD reboot is destructive.** A \`HARD\` reboot is equivalent to pulling the power cord — in-flight I/O is lost, filesystems may corrupt. Always attempt \`SOFT\` reboot first (sends ACPI shutdown signal). Only escalate to \`HARD\` if the guest OS is unresponsive. Confirm with the user before issuing HARD reboot.50517. **ERROR state requires admin intervention.** Servers in \`ERROR\` status cannot be recovered via \`nova_server_action\`. Common causes: host failure, scheduler error, failed live-migration. The user must contact their cloud admin or file a support ticket. Do not attempt repeated actions on ERROR servers.52538. **Addresses field structure varies by network.** The \`addresses\` response is keyed by network name, with each entry containing \`addr\` (IP), \`version\` (4/6), and \`OS-EXT-IPS:type\` (\`fixed\` or \`floating\`). Multiple networks produce multiple keys. Do not assume a single-network structure.54559. **Server metadata is not automatically populated.** Nova metadata is user-supplied key-value pairs. Do not expect metadata to contain project info, cost center, or ownership unless the user's automation sets it. The \`host_id\` is an opaque hash — it identifies co-location but is not a hostname.565710. **Name filter is not exact match.** \`nova_list_servers\` with a \`name\` filter uses regex-style matching. Searching for \`name=web\` returns \`web-1\`, \`web-prod\`, \`my-web-server\`, etc. For exact matches, filter results client-side after retrieval.5859## Common Workflows6061### List and Inspect Servers6263```641. nova_list_servers (optionally filter by status or name)652. For each server needing detail: nova_get_server with its UUID663. For network info: neutron_list_ports with device_id=<server-uuid>67```6869### Get Full Server + Network Picture7071```721. nova_get_server → note addresses (IPs) and server UUID732. neutron_list_ports with device_id=<server-uuid> → port UUIDs, MAC, security groups743. For each security group ID: neutron_list_security_groups for rules75```7677This gives the complete picture: server → IPs → ports → security groups → rules.7879### Debug: Server Won't Start8081```821. nova_get_server → check current status83 - SHUTOFF: try nova_server_action start84 - ERROR: inform user, admin required85 - BUILD: still provisioning, wait86 - PAUSED/SUSPENDED: unpause/resume first872. If start fails with 409: limes_get_project_quota → check compute quota883. If quota ok: hermes_list_events with target.id=<server-uuid> → recent errors894. If no audit clues: maia_query for host-level issues90```9192### Perform Server Action Safely9394```951. nova_get_server → confirm current status allows the action96 Valid transitions:97 - start: SHUTOFF → ACTIVE98 - stop: ACTIVE → SHUTOFF99 - reboot (SOFT): ACTIVE → ACTIVE (via REBOOT)100 - reboot (HARD): any running state → ACTIVE (destructive)101 - pause: ACTIVE → PAUSED102 - unpause: PAUSED → ACTIVE103 - suspend: ACTIVE → SUSPENDED104 - resume: SUSPENDED → ACTIVE1052. For destructive actions (stop, HARD reboot): confirm with user1063. nova_server_action with action and server_id1074. Poll nova_get_server until status reaches target (or timeout after 2 min)108```109110### Select a Flavor111112```1131. nova_list_flavors → get available flavors in region1142. Match requirements to flavor family:115 - Balanced workload → m-series (general purpose)116 - Database/cache → r-series (memory-optimized)117 - Batch/CI → c-series (compute-optimized)1183. Check limes_get_project_quota to ensure cores/ram headroom1194. If flavor not found: may not be available in this region or project120```121122## Troubleshooting123124### Stuck in BUILD125126Server has been in \`BUILD\` status for >10 minutes.127128- **Typical cause**: Scheduler couldn't place it (no host with capacity), or image download is slow.129- **Diagnostic**: \`hermes_list_events\` filtered to \`target.id=<server-uuid>\` — look for \`compute/server/create\` with outcome \`pending\` or \`failure\`.130- **Resolution**: If no events after 15 min, likely a scheduler issue — admin intervention required. Do not delete-and-retry without checking quota first.131132### ERROR After Resize133134Server entered ERROR after a resize or migrate operation.135136- **Typical cause**: Target host ran out of disk during resize, or live-migration timed out.137- **Diagnostic**: \`hermes_list_events\` for recent \`compute/server/resize\` or \`compute/server/migrate\` events. Check outcome field.138- **Resolution**: Admin must reset the server state. User cannot self-service from ERROR.139140### Can't Reach Server via Network141142Server is ACTIVE but unreachable.143144- **Diagnostic steps**:145 1. \`nova_get_server\` → confirm status is ACTIVE (not PAUSED/SUSPENDED)146 2. Check addresses: does it have a floating IP? Fixed IPs are only reachable from within the VPC/network.147 3. \`neutron_list_ports\` with \`device_id\` → check port \`status\` (should be \`ACTIVE\`, not \`DOWN\` or \`BUILD\`)148 4. Check security groups on the port → ensure ingress rules allow the traffic (SSH=22, ICMP, etc.)149 5. If port is DOWN: may be a binding failure — check \`hermes_list_events\` for port-related events150151## Security Considerations152153- **Confirm destructive actions**: Always ask user confirmation before \`stop\`, \`HARD reboot\`, or any action that interrupts service. State what will happen: "This will immediately power off the instance, dropping all connections."154- **Metadata visibility**: Server metadata is visible to anyone with \`compute:server:show\` permission in the project. Do not store secrets, credentials, or PII in metadata.155- **Host ID is semi-sensitive**: While opaque, \`host_id\` reveals co-location (same hash = same hypervisor). Avoid exposing it in shared contexts without need.156- **Audit trail**: All server actions generate Hermes events. Inform users that actions are logged with their credential identity.157- **Cross-project access**: Nova operations are scoped to the authenticated project. You cannot see or act on servers in other projects without re-scoping credentials.158159## Cross-Service References160161| Need | Service | Tool |162|------|---------|------|163| Network interfaces for a server | Neutron | `neutron_list_ports(device_id=<server_uuid>)` |164| Attached volumes | Cinder | `cinder_list_volumes` → filter by attachments[].server_id |165| Quota before creating | Limes | `limes_get_project_quota(service=compute)` |166| Who modified this server | Hermes | `hermes_list_events(target_type=compute/server, target_id=<uuid>)` |167| CPU/memory metrics | Maia | `maia_query` with `vm_cpu_seconds_total`, `vm_memory_usage_bytes` |168| Security groups on ports | Neutron | `neutron_list_ports` → then `neutron_list_security_groups` |169170## Routing171172| User need | Action |173|-----------|--------|174| Flavor naming and selection | Read [flavor-families.md](references/flavor-families.md) |