UNPKG

@digitalsamba/embedded-api-mcp-server

Version:

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

270 lines 12.7 kB
/** * Export Tools Module * * Provides tool equivalents for export resources to ensure compatibility with AI assistants * that can only access tools, not resources. * * @module tools/export-tools */ import { getApiKeyFromRequest } from "../../auth.js"; import { DigitalSambaApiClient } from "../../digital-samba-api.js"; import logger from "../../logger.js"; import { ExportResources } from "../../resources/exports/index.js"; /** * Execute export tool function */ export async function executeExportTool(toolName, params, request, options) { try { logger.info(`Executing export tool: ${toolName}`, { params, toolName }); const apiKey = getApiKeyFromRequest(request) || process.env.DIGITAL_SAMBA_DEVELOPER_KEY; if (!apiKey) { return { content: [ { type: "text", text: "No API key found. Please include an Authorization header with a Bearer token.", }, ], isError: true, }; } const apiUrl = options.apiUrl || process.env.DIGITAL_SAMBA_API_URL; const api = new DigitalSambaApiClient(apiKey, apiUrl); const exportResources = new ExportResources(api); switch (toolName) { case "export-chat-messages": return await handleExportChatMessages(params, exportResources); case "export-qa-data": return await handleExportQA(params, exportResources); case "export-session-transcripts": return await handleExportTranscripts(params, exportResources); case "export-poll-results": return await handleExportPolls(params, exportResources); case "export-recording-metadata": return await handleExportRecordingMetadata(params, exportResources); case "export-session-summary": return await handleExportSessionSummary(params, exportResources); case "export-session-metadata": return await handleExportSessionMetadata(params, exportResources); default: logger.error(`Unknown export tool in switch statement`, { toolName, validTools: [ "export-chat-messages", "export-qa-data", "export-session-transcripts", "export-poll-results", "export-recording-metadata", "export-session-summary", "export-session-metadata" ] }); throw new Error(`Unknown export tool: ${toolName}`); } } catch (error) { logger.error(`Error executing export tool ${toolName}`, { error: error instanceof Error ? error.message : String(error), }); return { content: [ { type: "text", text: `Error: ${error instanceof Error ? error.message : String(error)}`, }, ], isError: true, }; } } /** * Handler functions for each export tool */ async function handleExportChatMessages(params, exportResources) { const uri = `digitalsamba://exports/communications/${params.roomId}/chat${params.format || params.sessionId ? `?${new URLSearchParams({ ...(params.format && { format: params.format }), ...(params.sessionId && { session_id: params.sessionId }), }).toString()}` : ""}`; const result = await exportResources.handleResourceRequest(uri); return { content: result.contents }; } async function handleExportQA(params, exportResources) { const uri = `digitalsamba://exports/communications/${params.roomId}/qa${params.format || params.sessionId ? `?${new URLSearchParams({ ...(params.format && { format: params.format }), ...(params.sessionId && { session_id: params.sessionId }), }).toString()}` : ""}`; const result = await exportResources.handleResourceRequest(uri); return { content: result.contents }; } async function handleExportTranscripts(params, exportResources) { const uri = `digitalsamba://exports/communications/${params.sessionId}/transcripts${params.format ? `?format=${params.format}` : ""}`; const result = await exportResources.handleResourceRequest(uri); return { content: result.contents }; } async function handleExportPolls(params, exportResources) { const uri = `digitalsamba://exports/polls/${params.roomId}${params.format || params.sessionId ? `?${new URLSearchParams({ ...(params.format && { format: params.format }), ...(params.sessionId && { session_id: params.sessionId }), }).toString()}` : ""}`; const result = await exportResources.handleResourceRequest(uri); return { content: result.contents }; } async function handleExportRecordingMetadata(params, exportResources) { const uri = `digitalsamba://exports/recordings/${params.recordingId}`; const result = await exportResources.handleResourceRequest(uri); return { content: result.contents }; } async function handleExportSessionSummary(params, exportResources) { const uri = `digitalsamba://exports/sessions/${params.sessionId}/summary`; const result = await exportResources.handleResourceRequest(uri); return { content: result.contents }; } async function handleExportSessionMetadata(params, exportResources) { const uri = `digitalsamba://exports/sessions/${params.sessionId}/metadata`; const result = await exportResources.handleResourceRequest(uri); return { content: result.contents }; } /** * Register export tools with the MCP server */ export function registerExportTools() { return [ { name: "export-chat-messages", description: "[Export Tools] Export chat messages from a room. Use when users say: \"export chat\", \"download chat messages\", \"export room chat\", \"get chat history\", \"save chat messages\". Mirrors digitalsamba://exports/communications/{roomId}/chat resource for AI assistant compatibility. Requires roomId. Supports format (txt/json) and optional sessionId for specific sessions.", inputSchema: { type: "object", properties: { roomId: { type: "string", description: "Room ID to export chat messages from", }, format: { type: "string", enum: ["txt", "json"], description: "Export format (default: json)", }, sessionId: { type: "string", description: "Optional session ID to filter messages", }, }, required: ["roomId"], }, }, { name: "export-qa-data", description: "[Export Tools] Export questions and answers from a room. Use when users say: \"export Q&A\", \"download questions\", \"export Q&A data\", \"get question history\", \"save Q&A session\". Mirrors digitalsamba://exports/communications/{roomId}/qa resource for AI assistant compatibility. Requires roomId. Supports format and optional sessionId.", inputSchema: { type: "object", properties: { roomId: { type: "string", description: "Room ID to export Q&A from", }, format: { type: "string", enum: ["txt", "json"], description: "Export format (default: json)", }, sessionId: { type: "string", description: "Optional session ID to filter Q&A", }, }, required: ["roomId"], }, }, { name: "export-session-transcripts", description: "[Export Tools] Export transcription data from a session. Use when users say: \"export transcript\", \"download transcripts\", \"export transcription\", \"get transcript\", \"save meeting transcript\". Mirrors digitalsamba://exports/communications/{sessionId}/transcripts resource for AI assistant compatibility. Requires sessionId.", inputSchema: { type: "object", properties: { sessionId: { type: "string", description: "Session ID to export transcripts from", }, format: { type: "string", enum: ["txt", "json"], description: "Export format (default: json)", }, }, required: ["sessionId"], }, }, { name: "export-poll-results", description: "[Export Tools] Export poll questions, options, and results from a room. Use when users say: \"export polls\", \"download poll results\", \"export poll data\", \"get poll results\", \"save poll information\". Mirrors digitalsamba://exports/polls/{roomId} resource for AI assistant compatibility. Requires roomId.", inputSchema: { type: "object", properties: { roomId: { type: "string", description: "Room ID to export polls from", }, format: { type: "string", enum: ["txt", "json"], description: "Export format (default: json)", }, sessionId: { type: "string", description: "Optional session ID to filter polls", }, }, required: ["roomId"], }, }, { name: "export-recording-metadata", description: "[Export Tools] Get recording metadata and download information. Use when users say: \"export recording info\", \"get recording metadata\", \"recording export details\", \"recording information\", \"download recording details\". Mirrors digitalsamba://exports/recordings/{recordingId} resource for AI assistant compatibility. Requires recordingId.", inputSchema: { type: "object", properties: { recordingId: { type: "string", description: "Recording ID to export metadata for", }, }, required: ["recordingId"], }, }, { name: "export-session-summary", description: "[Export Tools] Export comprehensive session summary with key metrics. Use when users say: \"export session summary\", \"get meeting report\", \"session overview\", \"meeting summary\", \"export session report\". Mirrors digitalsamba://exports/sessions/{sessionId}/summary resource for AI assistant compatibility. Requires sessionId.", inputSchema: { type: "object", properties: { sessionId: { type: "string", description: "Session ID to export summary for", }, }, required: ["sessionId"], }, }, { name: "export-session-metadata", description: "[Export Tools] Export complete session metadata in JSON format. Use when users say: \"export session metadata\", \"get full session data\", \"complete session info\", \"session raw data\", \"export technical session data\". Mirrors digitalsamba://exports/sessions/{sessionId}/metadata resource for AI assistant compatibility. Requires sessionId.", inputSchema: { type: "object", properties: { sessionId: { type: "string", description: "Session ID to export metadata for", }, }, required: ["sessionId"], }, }, ]; } //# sourceMappingURL=index.js.map