index.ts•2.31 kB
#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { Logger } from "./logger.js";
import { AuthManager } from "./auth.js";
import { SpotifyClient } from "./spotify-client.js";
import { registerAllTools } from "./tools/declarations/index.js";
import { registerAllPrompts } from "./prompts/declarations/index.js";
// Global instances
let logger: Logger;
let authManager: AuthManager;
let spotifyClient: SpotifyClient;
const SPOTIFY_CLIENT_ID = process.env.SPOTIFY_CLIENT_ID;
const SPOTIFY_CLIENT_SECRET = process.env.SPOTIFY_CLIENT_SECRET;
const SPOTIFY_REDIRECT_URI =
process.env.SPOTIFY_REDIRECT_URI || "http://127.0.0.1:15732/callback";
if (!SPOTIFY_CLIENT_ID) {
console.error("Error: SPOTIFY_CLIENT_ID environment variable is required");
process.exit(1);
}
if (!SPOTIFY_CLIENT_SECRET) {
console.error("Error: SPOTIFY_CLIENT_SECRET environment variable is required");
process.exit(1);
}
// Create server instance
const server = new McpServer({
name: "mcp-spotify",
version: "1.0.0",
});
// Start the server
async function main() {
// Initialize logger
logger = await Logger.create();
await logger.info("Spotify MCP Server starting...");
// Initialize auth manager (both CLIENT_ID and CLIENT_SECRET are checked above)
authManager = new AuthManager(
SPOTIFY_CLIENT_ID!,
SPOTIFY_CLIENT_SECRET!,
SPOTIFY_REDIRECT_URI,
logger
);
await authManager.initialize();
// Check if authorization is needed
if (!authManager.hasValidToken()) {
await logger.info("No valid token found. Starting authorization flow...");
await authManager.authorize();
}
// Initialize Spotify client
spotifyClient = new SpotifyClient(authManager, logger);
// Register all tools and prompts
registerAllTools(server, spotifyClient);
registerAllPrompts(server);
// Start MCP server
const transport = new StdioServerTransport();
await server.connect(transport);
await logger.info("Spotify MCP Server running on stdio");
}
main().catch(async (error) => {
if (logger) {
await logger.error(`Fatal error in main(): ${error.message}`);
} else {
console.error("Fatal error in main():", error);
}
process.exit(1);
});