summarizeWhiteboard
Generate concise summaries of Heptabase whiteboards in text or structured formats, optionally including statistics, to streamline information extraction and analysis.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | text | |
| includeStatistics | No | ||
| whiteboardId | Yes |
Implementation Reference
- src/tools/export.ts:60-83 (handler)Main handler function for the summarizeWhiteboard tool. Fetches whiteboard data and generates summary based on format.export async function summarizeWhiteboard( dataService: HeptabaseDataService, params: z.infer<typeof summarizeWhiteboardSchema> ) { const data = await dataService.getWhiteboard(params.whiteboardId, { includeCards: true, includeConnections: true }); let summary = ''; if (params.format === 'text') { summary = await generateTextSummary(data, params); } else { summary = await generateStructuredSummary(data, params); } return { content: [{ type: 'text', text: summary }] }; }
- src/tools/export.ts:15-19 (schema)Zod schema defining input parameters for the summarizeWhiteboard tool.export const summarizeWhiteboardSchema = z.object({ whiteboardId: z.string(), format: z.enum(['text', 'structured']).optional().default('text'), includeStatistics: z.boolean().optional().default(false) });
- src/server.ts:684-694 (registration)Registers the summarizeWhiteboard tool with the MCP server, including schema and wrapper handler that ensures data service initialization.this.tools.summarizeWhiteboard = { inputSchema: summarizeWhiteboardSchema, handler: async (params) => { await this.ensureDataServiceInitialized(); return summarizeWhiteboard(this.dataService, params); } }; this.server.tool('summarizeWhiteboard', summarizeWhiteboardSchema.shape, async (params: z.infer<typeof summarizeWhiteboardSchema>) => { return this.tools.summarizeWhiteboard.handler(params); });
- src/tools/export.ts:83-165 (helper)Helper function to generate text summary of whiteboard, used by the main handler.} async function generateMarkdownExport(data: any, params: any): Promise<string> { const lines: string[] = []; lines.push(`# ${data.whiteboard.name}`); lines.push(''); if (params.includeMetadata) { lines.push('## Metadata'); lines.push(`- Created: ${data.whiteboard.createdTime}`); lines.push(`- Last Modified: ${data.whiteboard.lastEditedTime}`); lines.push(`- Created By: ${data.whiteboard.createdBy}`); lines.push(''); } if (data.cards?.length > 0) { lines.push('## Cards'); lines.push(''); for (const card of data.cards) { lines.push(`### ${card.title}`); const content = JSON.parse(card.content); const text = extractTextFromContent(content); lines.push(text); lines.push(''); } } if (data.connections?.length > 0) { lines.push('## Connections'); lines.push(''); for (const connection of data.connections) { lines.push(`- ${connection.beginId} → ${connection.endId}`); } lines.push(''); } return lines.join('\n'); } async function generateHtmlExport(data: any, params: any): Promise<string> { const lines: string[] = []; lines.push('<!DOCTYPE html>'); lines.push('<html>'); lines.push('<head>'); lines.push(`<title>${data.whiteboard.name}</title>`); lines.push('</head>'); lines.push('<body>'); lines.push(`<h1>${data.whiteboard.name}</h1>`); if (params.includeMetadata) { lines.push('<div class="metadata">'); lines.push(`<p>Created: ${data.whiteboard.createdTime}</p>`); lines.push(`<p>Last Modified: ${data.whiteboard.lastEditedTime}</p>`); lines.push(`<p>Created By: ${data.whiteboard.createdBy}</p>`); lines.push('</div>'); } if (data.cards?.length > 0) { lines.push('<h2>Cards</h2>'); for (const card of data.cards) { lines.push(`<div class="card">`); lines.push(`<h3>${card.title}</h3>`); const content = JSON.parse(card.content); const text = extractTextFromContent(content); lines.push(`<p>${text}</p>`); lines.push('</div>'); } } lines.push('</body>'); lines.push('</html>'); return lines.join('\n'); } async function generateTextSummary(data: any, params: any): Promise<string> {
- src/tools/export.ts:255-272 (helper)Utility function to extract text from Heptabase card content structures, used in summary generation.function extractTextFromContent(content: any): string { if (typeof content === 'string') { return content; } if (content.text) { return content.text; } if (content.content && Array.isArray(content.content)) { return content.content .map((item: any) => extractTextFromContent(item)) .filter(Boolean) .join(' '); } return ''; }