UNPKG

@digitalsamba/embedded-api-mcp-server

Version:

Digital Samba Embedded API MCP Server - Model Context Protocol server for Digital Samba's Embedded API

166 lines 7.69 kB
/** * Session Resources Module * * This module provides read-only session resources for the Digital Samba MCP Server. * It implements resources for listing sessions, retrieving session details, * session participants, and session statistics. * * @module resources/sessions */ import { DigitalSambaApiClient } from "../../digital-samba-api.js"; import { getApiKeyFromRequest } from "../../auth.js"; import logger from "../../logger.js"; /** * Register all session resources * * @returns Array of MCP Resource definitions */ export function registerSessionResources() { return [ { uri: "digitalsamba://sessions", name: "sessions", description: '[Session Data] List all sessions across all rooms. Use to access: "show all sessions", "list meetings", "session history", "all past meetings", "meeting directory". Returns paginated list of session objects with room info, start/end times, and participant counts.', mimeType: "application/json", }, { uri: "digitalsamba://sessions/{sessionId}", name: "session", description: '[Session Data] Get comprehensive summary for a specific session. Use to access: "session details", "meeting summary", "what happened in session", "session report", "session overview". Requires sessionId. Returns detailed session data with duration, participants, and activity.', mimeType: "application/json", }, { uri: "digitalsamba://sessions/{sessionId}/participants", name: "session-participants", description: '[Session Data] List all participants in a session. Use to access: "who attended session", "session attendees", "participant list", "meeting participants", "session roster". Requires sessionId. Returns participant details with join/leave times and roles.', mimeType: "application/json", }, { uri: "digitalsamba://sessions/{sessionId}/statistics", name: "session-statistics", description: '[Session Data] Get detailed usage statistics for a session. Use to access: "session metrics", "session analytics", "participant statistics", "meeting usage data", "session performance". Requires sessionId. Returns participant count, duration, activity metrics.', mimeType: "application/json", }, { uri: "digitalsamba://rooms/{roomId}/sessions", name: "room-sessions", description: '[Session Data] List all sessions for a specific room. Use to access: "room meeting history", "sessions in room", "room session list", "meetings for this room", "room activity history". Requires roomId. Returns chronological list of sessions in that room.', mimeType: "application/json", }, ]; } /** * Handle session resource requests * * @param uri - The resource URI being requested * @param params - URL parameters from the URI * @param request - The MCP request object * @param options - Server options including API configuration * @returns The resource content */ export async function handleSessionResource(uri, params, request, options) { const { apiUrl, apiCache } = options; // Get API key from session context const apiKey = getApiKeyFromRequest(request); if (!apiKey) { throw new Error("No API key found. Please include an Authorization header with a Bearer token."); } // Create API client const client = new DigitalSambaApiClient(apiKey, apiUrl, apiCache); // Parse the URI to determine which resource is being requested const uriParts = uri.split("/"); try { // Handle different session resource types if (uri.includes("/rooms/") && uri.endsWith("/sessions")) { // Room sessions: digitalsamba://rooms/{roomId}/sessions const roomId = params.roomId || uriParts[3]; if (!roomId) { throw new Error("Room ID is required."); } logger.info("Fetching sessions for room", { roomId }); const response = await client.listRoomSessions(roomId); const sessions = response.data || []; // Format sessions as resource contents const contents = sessions.map((session) => ({ uri: `digitalsamba://sessions/${session.id}`, text: JSON.stringify(session, null, 2), mimeType: "application/json", })); return { contents }; } else if (uri.includes("/participants")) { // Session participants: digitalsamba://sessions/{sessionId}/participants const sessionId = params.sessionId || uriParts[3]; if (!sessionId) { throw new Error("Session ID is required."); } logger.info("Fetching participants for session", { sessionId }); const response = await client.listSessionParticipants(sessionId); const participants = response.data || []; // Format participants as resource contents const contents = participants.map((participant) => ({ uri: `digitalsamba://participants/${participant.id}`, text: JSON.stringify(participant, null, 2), mimeType: "application/json", })); return { contents }; } else if (uri.includes("/statistics")) { // Session statistics: digitalsamba://sessions/{sessionId}/statistics const sessionId = params.sessionId || uriParts[3]; if (!sessionId) { throw new Error("Session ID is required."); } logger.info("Fetching statistics for session", { sessionId }); const statistics = await client.getSessionStatistics(sessionId); return { contents: [ { uri: uri, text: JSON.stringify(statistics, null, 2), mimeType: "application/json", }, ], }; } else if (uriParts.length > 3 && uriParts[3] !== "") { // Specific session: digitalsamba://sessions/{sessionId} const sessionId = params.sessionId || uriParts[3]; if (!sessionId) { throw new Error("Session ID is required."); } logger.info("Fetching session summary", { sessionId }); const session = await client.getSessionSummary(sessionId); return { contents: [ { uri: uri, text: JSON.stringify(session, null, 2), mimeType: "application/json", }, ], }; } else { // List all sessions: digitalsamba://sessions logger.info("Fetching all sessions"); const response = await client.listSessions(); const sessions = response.data || []; // Format sessions as resource contents const contents = sessions.map((session) => ({ uri: `digitalsamba://sessions/${session.id}`, text: JSON.stringify(session, null, 2), mimeType: "application/json", })); return { contents }; } } catch (error) { logger.error("Error handling session resource", { uri, error: error instanceof Error ? error.message : String(error), }); throw error; } } //# sourceMappingURL=index.js.map