playback-tool.ts•2.07 kB
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { SpotifyClient } from "../../spotify-client.js";
import {
controlPlayback,
getPlaybackState,
formatPlaybackState,
} from "../playback.js";
export function registerPlaybackTools(server: McpServer, spotifyClient: SpotifyClient) {
// Playback Control Tool
server.tool(
"control_playback",
"Control Spotify playback (play, pause, next, previous, seek)",
{
action: z
.enum(["play", "pause", "next", "previous", "seek"])
.describe("Playback action to perform"),
uri: z
.string()
.optional()
.describe("Spotify URI to play (for 'play' action)"),
position_ms: z
.number()
.optional()
.describe("Position in milliseconds (for 'seek' action)"),
},
async ({ action, uri, position_ms }) => {
try {
const result = await controlPlayback(spotifyClient, {
action,
uri,
position_ms,
});
return {
content: [{ type: "text", text: result }],
};
} catch (error) {
const errorMessage =
error instanceof Error ? error.message : "Unknown error";
return {
content: [{ type: "text", text: `Error controlling playback: ${errorMessage}` }],
isError: true,
};
}
}
);
// Get Playback State Tool
server.tool(
"get_playback_state",
"Get current Spotify playback state and now playing information",
{},
async () => {
try {
const state = await getPlaybackState(spotifyClient);
const formatted = formatPlaybackState(state);
return {
content: [{ type: "text", text: formatted }],
};
} catch (error) {
const errorMessage =
error instanceof Error ? error.message : "Unknown error";
return {
content: [{ type: "text", text: `Error getting playback state: ${errorMessage}` }],
isError: true,
};
}
}
);
}