get_meeting_details
Retrieve detailed meeting information including notes, transcripts, and organization data from Granola.ai meeting intelligence platform using a meeting ID.
Instructions
Get detailed information about a specific meeting
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | Yes | Meeting ID to retrieve details for |
Implementation Reference
- src/server.ts:195-233 (handler)Complete implementation of get_meeting_details tool including schema registration (name, description, parameters) and execute handler function that retrieves meeting details from cache and formats them// Tool: get_meeting_details server.addTool({ name: 'get_meeting_details', description: 'Get detailed information about a specific meeting', parameters: z.object({ meeting_id: z.string().describe('Meeting ID to retrieve details for') }), execute: async ({ meeting_id }) => { await ensureDataLoaded(); const doc = documentsCache.get(meeting_id); if (!doc) { return `Meeting '${meeting_id}' not found`; } const details: string[] = [ `# Meeting Details: ${getTitle(doc)}\n`, `**ID:** ${doc.id}`, `**Date:** ${formatDate(doc.created_at)}`, `**Updated:** ${formatDate(doc.updated_at)}` ]; if (doc.workspace_name) { details.push(`**Workspace:** ${doc.workspace_name}`); } if (doc.folders && doc.folders.length > 0) { const folderNames = doc.folders.map(f => f.name).join(', '); details.push(`**Folders:** ${folderNames}`); } if (doc.people && doc.people.length > 0) { const people = doc.people.map(p => p.name).join(', '); details.push(`**Participants:** ${people}`); } return details.join('\n'); } });
- src/server.ts:199-201 (schema)Input parameter schema definition using Zod - requires a meeting_id string parameterparameters: z.object({ meeting_id: z.string().describe('Meeting ID to retrieve details for') }),
- src/types.ts:69-80 (schema)GranolaDocument interface type definition that defines the structure of meeting data retrieved and displayed by get_meeting_detailsexport interface GranolaDocument { id: string; title: string; created_at: string; updated_at: string; workspace_id?: string; workspace_name?: string; folders?: FolderInfo[]; last_viewed_panel?: DocumentPanel; people?: Array<{ name: string }>; [key: string]: any; }
- src/server.ts:30-60 (helper)ensureDataLoaded and loadData helper functions that populate the documentsCache with meeting data before the tool executesasync function ensureDataLoaded() { const now = Date.now(); if (documentsCache.size === 0 || (now - lastFetchTime) > CACHE_TTL) { await loadData(); } } /** * Load data from Granola API */ async function loadData() { console.error('Fetching data from Granola API...'); const data = await apiClient.getAllDocumentsWithMetadata(); if (!data) { console.error('Failed to fetch data from API'); return; } // Update caches documentsCache.clear(); for (const doc of data.documents) { documentsCache.set(doc.id, doc); } workspacesCache = data.workspaces; foldersCache = data.documentLists; lastFetchTime = Date.now(); console.error(`Loaded ${documentsCache.size} documents from API`); }
- src/server.ts:62-94 (helper)Helper functions formatDate and getTitle used by get_meeting_details to format meeting dates and extract titles safely/** * Format date in local timezone */ function formatDate(dateStr: string | null | undefined): string { if (!dateStr) return 'Unknown date'; try { const date = new Date(dateStr); return date.toLocaleString('en-US', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false }); } catch { return dateStr; } } /** * Safe string for searching (handles null/undefined) */ function safeString(str: string | null | undefined): string { return str || ''; } /** * Get document title safely */ function getTitle(doc: GranolaDocument): string { return doc.title || 'Untitled Meeting'; }