OVH Cloud, redesigned: region-first, live pricing, no dead ends
OVH Cloud has been a supported provider in Servonaut for a while, but the create flow always felt like the awkward middle child — pick a flavor, pick a region, get a 400 because the flavor doesn't ship in that region, retry. In the latest release we flipped the picker order, wired in live catalog pricing, and gave the provider its own per-screen Manager surface. This post walks through what changed and why.
The old flow, briefly
The old wizard had you pick a flavor first (server type), then a region, then an image. The trouble: OVH's catalog isn't fully cartesian. Region X might not have flavor Y this week, even though both exist. The wizard would let you pick anyway, then OVH would 400 on submit. Sometimes the error message named the missing combination; sometimes it just said "no offers available."
This dead-end pattern shows up in a lot of cloud UIs. Hetzner has the same trap; AWS hides it behind so much option-grouping that you never see it. We picked a different fix: re-order the picker so you can never construct an invalid combination.
Region-first, with API-backed filtering
The new flow:
- Region first. The picker shows region code (
GRA11,SBG5, …) and human datacentre name (Gravelines,Strasbourg, …) side by side. Empty regions — ones with no deployable offers right now — are hidden entirely. - Flavor picker, scoped to that region. Live pricing per flavor, fetched from OVH's catalog API. Flavors with no offers in your chosen region don't appear.
- Image picker, scoped to that flavor. Some images don't ship on every flavor — these are filtered out too.
- SSH key picker reads from the project-level SSH key registry (more on this below). The wizard nudges you with a clear "no keys yet — add one first?" hint if your project has none registered.
Each step refilters from the live catalog. You can't construct a 400. The state-management is a single Textual reactive that recomputes downstream pickers when an upstream picker changes — same primitive that drives the Hetzner wizard.
Live pricing in the picker
Each flavor row shows the hourly EUR price next to the spec line:
flex-2vcpu-4gb-50ssd 2 vCPU · 4 GB · 50 GB SSD €0.014 / hour
flex-4vcpu-8gb-100ssd 4 vCPU · 8 GB · 100 GB SSD €0.028 / hour
The numbers come from /me/order/cart/... — OVH's own catalog endpoint, the same one their dashboard uses. If pricing changes, the wizard reflects it on next refresh. No hardcoded price tables to drift.
Project-level SSH keys (not /me/sshKey)
Subtle but important: the SSH-keys screen now manages keys at the Public Cloud project level, not at the account-wide /me/sshKey level. Why: account-wide keys are used by OVH dedicated and bare-metal flows; Public Cloud reads from the project-level registry on instance creation. Using the wrong endpoint meant the create wizard showed keys that the create call wouldn't actually inject. Surprise.
So we switched. The 🔑 SSH Keys screen under OVH → ⚙ Manage now talks to the project-level API. New keys you register show up in the create wizard's picker; old account-wide keys (if you have any) are unaffected and still work for dedicated.
The Manager screen
OVH → ⚙ Manage is a per-provider table that mirrors the Hetzner one. State-aware lifecycle toolbar:
- Create — opens the redesigned wizard.
- Start / Stop / Reboot — buttons enable based on the selected row's state, and route to the correct OVH API automatically (Public Cloud uses one endpoint, VPS uses another, dedicated uses a third). You don't have to know which.
- Delete — typed-name confirmation; permanent.
This makes OVH feel like a peer to AWS / Hetzner / custom in the sidebar, instead of a "scroll past it to find the EC2 list" afterthought.
13 OVH MCP tools
The catalog grew from 8 inspection-only tools to 13 (5 lifecycle + 8 inspection):
- Lifecycle (5):
ovh_create_instance,ovh_delete_instance,ovh_start_instance,ovh_stop_instance,ovh_reboot_instance. Alldangerousguard, all gated by theovh_mcp_operationsentitlement. - Read-only (8):
ovh_monitoring,ovh_list_ips,ovh_firewall_rules,ovh_ssh_keys,ovh_snapshots,ovh_dns_records,ovh_billing,ovh_invoices. Allreadonly.
A typical agent session: "List my OVH instances, find the ones with CPU > 80%, and show me their IP firewall rules." That's list_instances (filter by provider:ovh) → ovh_monitoring (per instance) → ovh_firewall_rules (per IP). Three tool calls, no SSH round-trips.
What didn't change
- Auth. Both 3-key and OAuth2 flows still work. The setup wizard (
servonaut --setup-ovh) is unchanged. - DNS / Billing screens. Existing tools, polished a bit but no behaviour changes.
- Custom servers. Adding raw SSH hosts via
custom_serversinconfig.jsonis independent of the OVH path and works the same as before.
Trying it
servonaut --update to grab the latest release. Open the TUI, hit the OVH sidebar tab, watch the create wizard fill itself in step by step. Full reference at /docs/ovh — covers the auth flows, the Manager screen, all 13 MCP tools, and the troubleshooting tips for the three or four ways an OVH consumer key can disappoint you.
Comments 0
No comments yet. Be the first to comment!
Edit Comment