UpCloud MCP by usefulapi

Inspect servers, storage, networks, databases and billing, and start, stop or back up servers.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
78%
Naming quality
79%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'upcloud_list_kubernetes_clusters' name length outside 3-30 rangein upcloud_list_kubernetes_clusters

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,523Tokens (tool definitions)
~1.2 KBTypical response size
Significant attention impact (3.53% of 128k context)

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-http

What it can do

Tool inventory

Tools (22)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded22 tools
verifiedversion not recorded22 tools