VPS_attachPublicKeyV1
Attach existing public keys to a virtual machine to enable SSH key authentication. Use this endpoint to associate multiple keys with a single VPS instance.
Instructions
Attach existing public keys from your account to a specified virtual machine.
Multiple keys can be attached to a single virtual machine.
Use this endpoint to enable SSH key authentication for VPS instances.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| virtualMachineId | Yes | Virtual Machine ID | |
| ids | Yes | Public Key IDs to attach |
Implementation Reference
- src/core/tools/vps.js:788-820 (schema)The VPS_attachPublicKeyV1 tool schema definition in the auto-generated tool list. It defines the tool as a POST to /api/vps/v1/public-keys/attach/{virtualMachineId} with input parameters 'virtualMachineId' (integer, required) and 'ids' (array of integers, required).
{ "name": "VPS_attachPublicKeyV1", "description": "Attach existing public keys from your account to a specified virtual machine.\n\nMultiple keys can be attached to a single virtual machine.\n\nUse this endpoint to enable SSH key authentication for VPS instances.", "method": "POST", "path": "/api/vps/v1/public-keys/attach/{virtualMachineId}", "inputSchema": { "type": "object", "properties": { "virtualMachineId": { "type": "integer", "description": "Virtual Machine ID" }, "ids": { "type": "array", "description": "Public Key IDs to attach", "items": { "type": "integer", "description": "ids parameter" } } }, "required": [ "virtualMachineId", "ids" ] }, "security": [ { "apiToken": [] } ], "group": "vps" }, - src/core/tools/vps.ts:799-830 (schema)TypeScript-typed version of the VPS_attachPublicKeyV1 tool schema definition with the same POST path and input parameters.
"name": "VPS_attachPublicKeyV1", "description": "Attach existing public keys from your account to a specified virtual machine.\n\nMultiple keys can be attached to a single virtual machine.\n\nUse this endpoint to enable SSH key authentication for VPS instances.", "method": "POST", "path": "/api/vps/v1/public-keys/attach/{virtualMachineId}", "inputSchema": { "type": "object", "properties": { "virtualMachineId": { "type": "integer", "description": "Virtual Machine ID" }, "ids": { "type": "array", "description": "Public Key IDs to attach", "items": { "type": "integer", "description": "ids parameter" } } }, "required": [ "virtualMachineId", "ids" ] }, "security": [ { "apiToken": [] } ], "group": "vps" }, - src/core/runtime.js:86-98 (registration)The initializeTools() method that registers all tools (including VPS_attachPublicKeyV1) from the tool list into the internal tools Map for MCP capability listing.
initializeTools() { // Initialize each tool in the tools map for (const tool of this.toolList) { this.tools.set(tool.name, { name: tool.name, description: tool.description, inputSchema: tool.inputSchema, // Don't include security at the tool level }); } // Don't log here, we're not connected yet console.error(`Initialized ${this.tools.size} tools`); - src/core/runtime.js:1879-1966 (handler)The executeApiCall() method which handles the actual execution of non-custom tools like VPS_attachPublicKeyV1. It dynamically constructs and sends the API request based on the tool's method (POST), path, and parameters. Since VPS_attachPublicKeyV1 has custom: false/undefined, it is executed through this generic API call handler.
async executeApiCall(tool, params) { // Get method and path from tool const method = tool.method; let path = tool.path; // Clone params to avoid modifying the original const requestParams = { ...params }; // Replace path parameters with values from params Object.entries(requestParams).forEach(([key, value]) => { const placeholder = `{${key}}`; if (path.includes(placeholder)) { path = path.replace(placeholder, encodeURIComponent(String(value))); delete requestParams[key]; // Remove used parameter } }); // Build the full URL const baseUrl = this.baseUrl.endsWith("/") ? this.baseUrl : `${this.baseUrl}/`; const cleanPath = path.startsWith("/") ? path.slice(1) : path; const url = new URL(cleanPath, baseUrl).toString(); this.log('debug', `API Request: ${method} ${url}`); try { // Configure the request const config = { method: method.toLowerCase(), url, headers: { ...this.headers }, timeout: 60000, // 60s validateStatus: function (status) { return status < 500; // Resolve only if the status code is less than 500 } }; const bearerToken = process.env['API_TOKEN'] || process.env['APITOKEN']; // APITOKEN for backwards compatibility if (bearerToken) { config.headers['Authorization'] = `Bearer ${bearerToken}`; } else { this.log('error', `Bearer Token environment variable not found: API_TOKEN`); } // Add parameters based on request method if (["GET", "DELETE"].includes(method)) { // For GET/DELETE, send params as query string config.params = { ...(config.params || {}), ...requestParams }; } else { // For POST/PUT/PATCH, send params as JSON body config.data = requestParams; config.headers["Content-Type"] = "application/json"; } this.log('debug', "Request config:", { url: config.url, method: config.method, params: config.params, headers: Object.keys(config.headers) }); // Execute the request const response = await axios(config); this.log('debug', `Response status: ${response.status}`); return response.data; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); this.log('error', `API request failed: ${errorMessage}`); if (axios.isAxiosError(error)) { const responseData = error.response?.data; const responseStatus = error.response?.status; this.log('error', 'API Error Details:', { status: responseStatus, data: typeof responseData === 'object' ? JSON.stringify(responseData) : responseData }); // Rethrow with more context for better error handling const detailedError = new Error(`API request failed with status ${responseStatus}: ${errorMessage}`); detailedError.response = error.response; throw detailedError; } throw error; } } - src/servers/vps.js:1-7 (registration)Entry point file that imports the tools array and starts the MCP server with the VPS tools including VPS_attachPublicKeyV1.
#!/usr/bin/env node // Auto-generated entry for group: vps import { startServer } from '../core/runtime.js'; import tools from '../core/tools/vps.js'; startServer({ name: 'hostinger-vps-mcp', version: '0.1.41', tools });