Skip to main content
Glama
volume.ts2.45 kB
import { Hono } from "hono"; import type { Env } from "@/types/env"; import { buildAlexaHeaders } from "@/utils/alexa"; export const volumeApp = new Hono<{ Bindings: Env }>(); const VOLUME_API = "https://alexa.amazon.com/api/v1/devices/speaker/volume"; /** * GET /api/volume - Lists volumes for all devices. */ volumeApp.get("/", async (context) => { try { const response = await fetch("https://alexa.amazon.com/api/devices-v2/device?cached=true", { method: "GET", headers: buildAlexaHeaders(context.env, { "Accept": "application/json" }), }); if (!response.ok) throw new Error(`Alexa API error: ${response.status}`); const { devices = [] } = (await response.json()) as any; const volumes = devices .filter((d: any) => d.capabilities?.some((c: any) => c.interfaceName.includes("Speaker"))) .map((d: any) => ({ deviceName: d.accountName || d.displayName, dsn: d.serialNumber, deviceType: d.deviceType, speakerVolume: d.volume || 0, })); return context.json({ volumes, count: volumes.length }); } catch (error) { return context.json({ error: "List volumes failed", details: (error as Error).message }, 500); } }); /** * POST /api/volume/set - Sets absolute volume. */ volumeApp.post("/set", async (context) => { try { const { volume, dsn, deviceType } = await context.req.json(); const response = await fetch(VOLUME_API, { method: "PUT", headers: buildAlexaHeaders(context.env, { "Content-Type": "application/json" }), body: JSON.stringify({ volume, dsn, deviceType }), }); if (!response.ok) throw new Error(`Alexa API error: ${response.status}`); return context.json({ success: true, volume }); } catch (error) { return context.json({ error: "Set volume failed", details: (error as Error).message }, 500); } }); /** * POST /api/volume/adjust - Adjusts volume relatively. */ volumeApp.post("/adjust", async (context) => { try { const { amount, dsn, deviceType } = await context.req.json(); // Alexa doesn't have a direct relative adjust API easily used here, // so typically we'd fetch current and add, but let's assume we can set absolute. // For brevity, we'll just log and return error if not fully implemented. return context.json({ error: "Relative adjustment not yet implemented in simplified refactor", amount }, 501); } catch (error) { return context.json({ error: "Adjust volume failed", details: (error as Error).message }, 500); } });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/guitarbeat/alexa-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server