Skip to main content
Glama

getCardContent

Retrieve content from Heptabase cards in raw, markdown, or JSON format by specifying the card ID through the Heptabase MCP server.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
cardIdYes
formatNomarkdown

Implementation Reference

  • Core handler function that implements the getCardContent tool logic: fetches card by ID, formats content in specified format (raw/markdown/json), and returns as MCP resource to bypass text limits.
    export async function getCardContentHandler( params: z.infer<typeof getCardContentSchema>, dataService: HeptabaseDataService ) { const result = await dataService.getCard(params.cardId); const card = result.card; if (!card) { throw new Error('Card not found'); } let content: string; let mimeType: string = 'text/plain'; switch (params.format) { case 'raw': content = card.content; mimeType = 'text/plain'; break; case 'json': const cardData = { id: card.id, title: card.title, content: JSON.parse(card.content), createdTime: card.createdTime, lastEditedTime: card.lastEditedTime, instances: result.instances.length }; content = JSON.stringify(cardData, null, 2); mimeType = 'application/json'; break; case 'markdown': default: content = `# ${card.title || 'Untitled'}\n\n`; content += parseHeptabaseContentToMarkdown(card.content); content += `\n\n---\n`; content += `Created: ${card.createdTime}\n`; content += `Last edited: ${card.lastEditedTime}\n`; content += `Card ID: ${card.id}\n`; if (result.instances.length > 0) { content += `\nAppears on ${result.instances.length} whiteboard(s)\n`; } mimeType = 'text/markdown'; break; } return { content: [{ type: 'resource', resource: { uri: `heptabase://card/${card.id}`, mimeType, text: content } }] }; }
  • Zod input schema for the getCardContent tool defining cardId (required) and format (optional: raw/markdown/json, defaults to markdown).
    export const getCardContentSchema = z.object({ cardId: z.string(), format: z.enum(['raw', 'markdown', 'json']).default('markdown') });
  • src/server.ts:587-616 (registration)
    Tool registration in MCP server: defines schema (duplicate), wrapper handler that dynamically imports and calls the core handler from src/tools/getCardContent.ts, stores in this.tools.getCardContent, and registers with this.server.tool.
    // getCardContent - returns full card content as resource to bypass text limits const getCardContentSchema = z.object({ cardId: z.string(), format: z.enum(['raw', 'markdown', 'json']).default('markdown') }); this.tools.getCardContent = { inputSchema: getCardContentSchema, handler: async (params) => { try { await this.ensureDataServiceInitialized(); const handler = await import('./tools/getCardContent'); return handler.getCardContentHandler(params, this.dataService!); } catch (error) { console.error('Error in getCardContent:', error); const errorMessage = error instanceof Error ? error.message : 'Unknown error'; return { content: [{ type: 'text', text: `Error: ${errorMessage}` }] }; } } }; this.server.tool('getCardContent', getCardContentSchema.shape, async (params) => { return this.tools.getCardContent.handler(params); });
  • Duplicate Zod schema definition used for registration in server.ts.
    const getCardContentSchema = z.object({ cardId: z.string(), format: z.enum(['raw', 'markdown', 'json']).default('markdown') });

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/LarryStanley/heptabase-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server