Skip to main content
Glama
ttpears

BookStack MCP Server

by ttpears

export_book

Export an entire book from BookStack in HTML, PDF, Markdown, plain text, or ZIP format using the book ID.

Instructions

Export an entire book in various formats

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesBook ID
formatYesExport format

Implementation Reference

  • Tool handler for 'export_book' that calls the BookStack client and formats the response.
    async (args) => {
      const content = await client.exportBook(args.id, args.format);
    
      if (typeof content === 'object' && content.download_url) {
        const format = args.format.toUpperCase();
        return {
          content: [{
            type: "text",
            text: `βœ… **${format} Book Export Ready**\n\n` +
                  `πŸ“š **Book:** ${content.book_name}\n` +
                  `πŸ“ **File:** ${content.filename}\n\n` +
                  `πŸš€ **Direct Download Link:**\n${content.download_url}\n\n` +
                  `ℹ️  **Note:** ${content.note}`
          }]
        };
      }
    
      const text = typeof content === 'string' ? content : JSON.stringify(content, null, 2);
      return {
        content: [{ type: "text", text }]
      };
  • src/index.ts:269-278 (registration)
    Registration of 'export_book' tool with its schema definition.
    server.registerTool(
      "export_book",
      {
        title: "Export Book",
        description: "Export an entire book in various formats",
        inputSchema: {
          id: z.coerce.number().min(1).describe("Book ID"),
          format: z.enum(["html", "pdf", "markdown", "plaintext", "zip"]).describe("Export format")
        }
      },
  • Implementation of exportBook logic in the BookStack client.
    async exportBook(id: number, format: 'html' | 'pdf' | 'markdown' | 'plaintext' | 'zip'): Promise<any> {
      // For binary formats (PDF, ZIP), return BookStack web URL using slug
      if (format === 'pdf' || format === 'zip') {
        // First fetch the book data to get slug
        const book = await this.getBook(id);
        
        // Construct the correct web URL with slug
        const directUrl = `${this.baseUrl}/books/${book.slug}/export/${format}`;
        const filename = `${book.slug}.${format}`;
        const contentType = format === 'pdf' ? 'application/pdf' : 'application/zip';
        
        return {
          format: format,
          filename: filename,
          download_url: directUrl,
          content_type: contentType,
          export_success: true,
          book_id: id,
          book_name: book.name,
          direct_download: true,
          note: "This is a direct link to BookStack's web export. You may need to be logged in to BookStack to access it."
        };
      }
      
      // For text formats, fetch the content via API
      const response = await this.client.get(`/books/${id}/export/${format}`);
      return response.data;
    }
    
    async exportChapter(id: number, format: 'html' | 'pdf' | 'markdown' | 'plaintext' | 'zip'): Promise<any> {
      // For binary formats (PDF, ZIP), return BookStack web URL using slugs
      if (format === 'pdf' || format === 'zip') {

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/ttpears/bookstack-mcp'

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