get_product_info
Retrieve detailed information about Sakura Cloud product offerings such as servers, disks, internet, or licenses using the MCP server interface for effective infrastructure management.
Instructions
Get detailed information about specific product offerings
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| productType | Yes | The type of product to retrieve (server, disk, internet, license) |
Implementation Reference
- src/server.ts:2011-2038 (handler)The execution handler for the 'get_product_info' tool within the CallToolRequestSchema. It validates the productType parameter, fetches data from the Sakura Cloud API endpoint `/product/${productType}`, and returns the JSON response.} else if (request.params.name === 'get_product_info') { try { validateCredentials(); const productType = request.params.arguments?.productType as string; if (!productType) { throw new Error('Product type is required'); } // Validate product type if (!['server', 'disk', 'internet', 'license'].includes(productType)) { throw new Error('Invalid product type. Must be one of: server, disk, internet, license'); } const productInfo = await fetchFromSakuraCloud(`/product/${productType}`); return { content: [ { type: 'text', text: JSON.stringify(productInfo, null, 2) } ] }; } catch (error) { console.error('Error calling tool:', error); throw error; }
- src/server.ts:1093-1106 (registration)Registration of the 'get_product_info' tool in the ListToolsRequestSchema response, defining its name, description, and input schema.name: 'get_product_info', description: 'Get detailed information about specific product offerings', inputSchema: { type: 'object', properties: { productType: { type: 'string', description: 'The type of product to retrieve (server, disk, internet, license)', enum: ['server', 'disk', 'internet', 'license'] } }, required: ['productType'] } },
- src/server.ts:20-72 (helper)Helper function fetchFromSakuraCloud used by the tool handler to make authenticated HTTPS requests to the Sakura Cloud API.async function fetchFromSakuraCloud(path: string, isPublicAPI: boolean = false, zone: string = DEFAULT_ZONE, method: string = 'GET', bodyData?: any): Promise<any> { return new Promise((resolve, reject) => { const basePath = isPublicAPI ? '/cloud/api/cloud/1.1' : `/cloud/zone/${zone}/api/cloud/1.1`; const options = { hostname: 'secure.sakura.ad.jp', port: 443, path: `${basePath}${path}`, method: method, headers: { 'Accept': 'application/json', 'Authorization': '', 'Content-Type': 'application/json' } }; // Add authorization for non-public APIs if (!isPublicAPI) { options.headers['Authorization'] = `Basic ${Buffer.from(`${SACLOUD_API_TOKEN}:${SACLOUD_API_SECRET}`).toString('base64')}`; } const req = https.request(options, (res) => { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { try { if (data) { const parsedData = JSON.parse(data); resolve(parsedData); } else { resolve({}); } } catch (err) { reject(new Error(`Failed to parse response: ${err}`)); } }); }); req.on('error', (error) => { reject(error); }); if (bodyData && (method === 'POST' || method === 'PUT')) { req.write(JSON.stringify(bodyData)); } req.end(); }); }