UpCloud MCP by usefulapi
Inspect servers, storage, networks, databases and billing, and start, stop or back up servers.
Should I use this
Quality & Safety
Findings (1)
- LOWin upcloud_list_kubernetes_clusters
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"upcloud": {
"url": "https://upcloud.usefulapi.io/mcp"
}
}
}Remote endpoints
https://upcloud.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (22)
🟢upcloud_get_account
The calling account: username, remaining credits and resource limits (cores, memory, storage per tier, IPs, networks, managed services). A cheap way to confirm the token works. UpCloud: GET /1.3/account.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_zones
Available zones (data centres) with id (e.g. fi-hel1, de-fra1, us-chi1), description and whether they are public or private-cloud. Zone ids are used by every other resource. UpCloud: GET /1.3/zone.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_plans
Fixed-price server plans: name (e.g. 2xCPU-4GB), cores, memory, included storage size/tier and transfer, plus GPU model/amount for GPU plans. UpCloud: GET /1.3/plan.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_prices
The price list per zone in the account's currency: per-hour prices for plans, cores, memory, storage tiers, backups, IPv4 addresses and traffic. UpCloud: GET /1.3/price.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_get_billing_summary(yearmonth, resource_id)
Billing summary for one month with per-resource details (servers, storages, managed databases, object storage, …: amount, hours, plan, zone, labels) and totals. Needs an account allowed to read billing. UpCloud: GET /1.3/account/billing/summary/{yearmonth}.
Input Schema
{
"type": "object",
"properties": {
"yearmonth": {
"type": "string",
"pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
"description": "The month, YYYY-MM, e.g. 2026-09."
},
"resource_id": {
"description": "Only this resource: its UUID, or for IP addresses the address itself.",
"type": "string",
"pattern": "^[0-9a-fA-F:.\\-]{2,64}$"
}
},
"required": [
"yearmonth"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_servers(state, search, tag, label, limit, ...)
Cloud servers on the account (summary: uuid, title, hostname, zone, plan, cores, memory, state, tags, labels). Filter by state, a free-text search (name, title, uuid, zone, IP, hostname, tag or template), tags or labels. Use upcloud_get_server for IPs and disks. UpCloud: GET /1.3/server.
Input Schema
{
"type": "object",
"properties": {
"state": {
"description": "Only servers in this state.",
"type": "string",
"enum": [
"started",
"stopped",
"maintenance",
"error"
]
},
"search": {
"description": "Match by name, title, uuid, zone, IP address, hostname, tag name or template name.",
"type": "string",
"maxLength": 255
},
"tag": {
"description": "Tag filter: `a,b` matches servers with ANY of the tags, `a:b` servers with ALL of them.",
"type": "string",
"maxLength": 255
},
"label": {
"description": "Label filters: a key (`env`) or key=value (`env=prod`). Several are ANDed. Keys match case-insensitively.",
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"limit": {
"description": "Max servers to return (use with offset to page).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"offset": {
"description": "Offset into the results (API default 0).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_get_server(server_uuid)
Full details of one server: state, plan, cores/memory, network interfaces and IP addresses, attached storage devices, firewall on/off, simple-backup schedule, labels, tags and remote-access settings. UpCloud: GET /1.3/server/{uuid}.
Input Schema
{
"type": "object",
"properties": {
"server_uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
"description": "The server UUID."
}
},
"required": [
"server_uuid"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_storages(kind, label)
Storage devices: disks, backups, CD-ROM images and OS templates (uuid, title, type, tier, size GB, state, zone, labels). Narrow by `kind`: private (yours), public (UpCloud-provided), normal (disks), backup, cdrom, template or favorite. UpCloud: GET /1.3/storage[/{kind}].
Input Schema
{
"type": "object",
"properties": {
"kind": {
"description": "Narrow the list. Omit for every accessible storage.",
"type": "string",
"enum": [
"private",
"public",
"normal",
"backup",
"cdrom",
"template",
"favorite"
]
},
"label": {
"description": "Label filters: a key (`env`) or key=value (`env=prod`). Several are ANDed. Keys match case-insensitively.",
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_get_storage(storage_uuid)
Details of one storage: size, tier, state (e.g. online, backuping), encryption, the servers it is attached to, its backups and backup_rule. Poll this to follow a backup started with upcloud_create_storage_backup. UpCloud: GET /1.3/storage/{uuid}.
Input Schema
{
"type": "object",
"properties": {
"storage_uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
"description": "The storage UUID."
}
},
"required": [
"storage_uuid"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_ip_addresses
Every IP address on the account: address, family (IPv4/IPv6), access (public/utility/private), the server it is assigned to, zone, PTR record, floating flag and release policy. UpCloud: GET /1.3/ip_address.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_firewall_rules(server_uuid)
The firewall rules of one server in evaluation order (position, direction, action, family, protocol, address and port ranges, comment). Whether the firewall is enabled at all is the `firewall` field of upcloud_get_server. UpCloud: GET /1.3/server/{uuid}/firewall_rule.
Input Schema
{
"type": "object",
"properties": {
"server_uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
"description": "The server UUID."
}
},
"required": [
"server_uuid"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_networks(zone, label)
Networks visible to the account — public, utility and private SDN networks — with their IP subnets, DHCP settings, routes, attached servers and peerings. Optionally only one zone. UpCloud: GET /1.3/network/.
Input Schema
{
"type": "object",
"properties": {
"zone": {
"description": "Only networks in this zone, e.g. fi-hel1.",
"type": "string",
"pattern": "^[a-z0-9-]{2,40}$"
},
"label": {
"description": "Label filters: a key (`env`) or key=value (`env=prod`). Several are ANDed. Keys match case-insensitively.",
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_databases(limit, offset, label)
Managed Database services (PostgreSQL, MySQL, Valkey, OpenSearch): uuid, title, type, plan, zone, state, component hosts/ports, backups and labels. Note the response can include connection URIs with credentials. UpCloud: GET /1.3/database.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Max entries to return, 0-100 (API default 10).",
"type": "integer",
"minimum": 0,
"maximum": 100
},
"offset": {
"description": "Offset into the results (API default 0).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"label": {
"description": "Label filters: a key (`env`) or key=value (`env=prod`). Several are ANDed. Keys match case-insensitively.",
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_load_balancers(limit, offset, label)
Managed Load Balancer services with their frontends, backends and members, networks, plan, zone, configured status and operational state. UpCloud: GET /1.3/load-balancer.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Max entries to return, 0-100 (API default 10).",
"type": "integer",
"minimum": 0,
"maximum": 100
},
"offset": {
"description": "Offset into the results (API default 0).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"label": {
"description": "Label filters: a key (`env`) or key=value (`env=prod`). Several are ANDed. Keys match case-insensitively.",
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_kubernetes_clusters
Managed Kubernetes clusters: name, uuid, zone, plan, state, network/CIDR, control-plane IP filter, labels and node groups (plan, count, state). UpCloud: GET /1.3/kubernetes.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_object_storages(limit, offset, sort)
Managed Object Storage (S3-compatible) services: uuid, name, region, configured status and operational state, public/private endpoints, custom domains and labels. UpCloud: GET /1.3/object-storage-2.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Max entries to return, 0-100 (API default 10).",
"type": "integer",
"minimum": 0,
"maximum": 100
},
"offset": {
"description": "Offset into the results (API default 0).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"sort": {
"description": "Order of results; prefix - for descending (API default -created_at).",
"type": "string",
"enum": [
"created_at",
"-created_at",
"service_name",
"-service_name",
"operational_state",
"-operational_state",
"region_name",
"-region_name"
]
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢upcloud_list_audit_logs(limit, offset, action, origin, resource_type, ...)
Security audit trail of the account (up to 180 days): who did what to which resource, when, from which IP and via API or Hub. Filter by action, origin, resource type, time window or a keyword (UUID, username or IP). Returns total_count for paging. UpCloud: GET /1.3/audit-logs.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Max entries to return, 0-200 (API default 50).",
"type": "integer",
"minimum": 0,
"maximum": 200
},
"offset": {
"description": "Offset into the results (API default 0).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"action": {
"description": "Only this action.",
"type": "string",
"enum": [
"create",
"read",
"update",
"delete",
"access-update",
"attach",
"detach",
"login",
"logout"
]
},
"origin": {
"description": "Only this origin.",
"type": "string",
"enum": [
"api",
"gui",
"upcloud_internal"
]
},
"resource_type": {
"description": "Only this resource type (uks = Kubernetes).",
"type": "string",
"enum": [
"account",
"auth",
"init-script",
"managed-database",
"managed-loadbalancer",
"managed-loadbalancer-certificate-bundle",
"managed-object-storage",
"server",
"ssh-key",
"storage",
"uks"
]
},
"created_after": {
"description": "ISO timestamp, e.g. 2026-09-01T00:00:00Z (inclusive). Default 180 days ago.",
"type": "string"
},
"created_before": {
"description": "ISO timestamp (inclusive). Default now.",
"type": "string"
},
"q": {
"description": "Keyword: a resource UUID, account username or IP address.",
"type": "string",
"maxLength": 255
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴upcloud_start_server(server_uuid, start_type)
Start a stopped server (billing for a started server resumes). Fails with 409 if it is not stopped. `async` returns immediately — poll upcloud_get_server for state=started. UpCloud: POST /1.3/server/{uuid}/start.
Input Schema
{
"type": "object",
"properties": {
"server_uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
"description": "The server UUID."
},
"start_type": {
"description": "sync (default) waits for the start; async returns at once.",
"type": "string",
"enum": [
"sync",
"async"
]
}
},
"required": [
"server_uuid"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴upcloud_stop_server(server_uuid, stop_type, timeout)
DISRUPTIVE: stop a running server — it goes offline until started again with upcloud_start_server. soft (default) sends an ACPI shutdown; with a timeout, a hard stop follows if it is still running. hard is like pulling the plug and can lose unsaved data. UpCloud: POST /1.3/server/{uuid}/stop.
Input Schema
{
"type": "object",
"properties": {
"server_uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
"description": "The server UUID."
},
"stop_type": {
"description": "soft = ACPI shutdown signal (default); hard = equivalent of pulling the power cable.",
"type": "string",
"enum": [
"soft",
"hard"
]
},
"timeout": {
"description": "Soft-stop timeout in seconds, 1-600.",
"type": "integer",
"minimum": 1,
"maximum": 600
}
},
"required": [
"server_uuid"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴upcloud_restart_server(server_uuid, stop_type, timeout, timeout_action)
DISRUPTIVE: stop and start a running server. soft (default) needs a timeout: after it, timeout_action=destroy hard-stops and restarts, ignore (API default) aborts and leaves the server running. hard power-cycles immediately. UpCloud: POST /1.3/server/{uuid}/restart.
Input Schema
{
"type": "object",
"properties": {
"server_uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
"description": "The server UUID."
},
"stop_type": {
"description": "soft = ACPI shutdown signal (default); hard = equivalent of pulling the power cable.",
"type": "string",
"enum": [
"soft",
"hard"
]
},
"timeout": {
"description": "Soft-stop timeout in seconds, 1-600. Required for a soft restart.",
"type": "integer",
"minimum": 1,
"maximum": 600
},
"timeout_action": {
"description": "What to do if the soft stop times out: destroy (hard stop, then start) or ignore (give up).",
"type": "string",
"enum": [
"destroy",
"ignore"
]
}
},
"required": [
"server_uuid"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴upcloud_create_storage_backup(storage_uuid, title)
Take an on-demand, point-in-time backup of a storage device. Additive (nothing is overwritten) but backups are billed per GB. Asynchronous: the storage goes to a backuping/maintenance state and back to online — poll upcloud_get_storage. UpCloud: POST /1.3/storage/{uuid}/backup.
Input Schema
{
"type": "object",
"properties": {
"storage_uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
"description": "The storage UUID."
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "A short description for the backup, 1-255 characters."
}
},
"required": [
"storage_uuid",
"title"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴upcloud_modify_server(server_uuid, title, hostname, simple_backup)
Change a server's title, hostname and/or simple-backup schedule. Only these reversible fields are exposed — no resizing or plan change (billing) and no firewall toggle. simple_backup is `HHMM,daily|dailies|weeklies|monthlies` (UTC time) or `no` to disable. UpCloud: PUT /1.3/server/{uuid}.
Input Schema
{
"type": "object",
"properties": {
"server_uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
"description": "The server UUID."
},
"title": {
"description": "A short informational description, 0-255 characters.",
"type": "string",
"maxLength": 255
},
"hostname": {
"description": "A valid hostname, e.g. web1.example.com (max 128).",
"type": "string",
"maxLength": 128,
"pattern": "^[A-Za-z0-9.-]+$"
},
"simple_backup": {
"description": "e.g. 0430,dailies — or `no` to turn simple backups off.",
"type": "string",
"pattern": "^(no|([01]\\d|2[0-3])[0-5]\\d,(daily|dailies|weeklies|monthlies))$"
}
},
"required": [
"server_uuid"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence