Python service · Robyn · MCP

PDF reports as a service.

An asynchronous microservice that turns JSON or .toon payloads into print-ready PDFs — with hierarchical layouts, MCP tools and OpenAPI docs. The rendering pipeline runs on isis-report-lib.

  • Python
  • Robyn
  • MCP
  • OpenAPI
  • MIT

View on GitHub Explore the library

What it does

The HTTP and MCP layer over the report pipeline.

  • Async by design

    Built on Robyn, with non-blocking endpoints for report generation and a health check for your platform.

  • JSON endpoint

    POST /app/tabular-json accepts meta, layout (optional) and data.

  • .toon endpoint

    POST /app/tabular-toon takes the compact indented notation and parses it into the same payload.

  • MCP tools

    A native MCP server at POST /mcp exposes report generation to AI assistants over JSON-RPC 2.0.

  • OpenAPI + Swagger

    The schema lives at /openapi.json; the Swagger UI is served at /docs.

  • Shared rendering

    Jinja2 and Playwright live in isis-report-lib, the same library published on PyPI.

Architecture

Client → Robyn API → report service → Jinja2/Playwright → PDF.

Pipeline diagram: JSON, .toon or MCP client to the Robyn API, then BaseReportService, Jinja2 and Playwright, producing a PDF

Quick start

Clone, install dependencies, run on port 5000.

git clone https://github.com/thepaneb/isis_report.git
cd isis_report

# Installs dependencies and Playwright
./dev/dependencies.sh

python app/run.py

The server listens on http://localhost:5000. Swagger UI: /docs · OpenAPI schema: /openapi.json.

curl -X POST http://localhost:5000/app/tabular-json \
  -H "Content-Type: application/json" \
  -d '{
    "meta": {"title": "Sales Order", "sub_title": "2024", "mode": "exact"},
    "layout": {
      "company": {"label": "Company", "format_mask": "str", "alignment": "left"},
      "orders": {
        "order": {"label": "Code", "format_mask": "int", "alignment": "right"},
        "total": {"label": "Total", "format_mask": "float", "alignment": "right"}
      }
    },
    "data": [
      {"company": "ACME", "orders": [{"order": 750, "total": 4000}]}
    ]
  }' \
  -o report.pdf

Endpoints

Everything the service exposes.

MethodPathWhat it does
POST/app/tabular-jsonPDF from a JSON payload.
POST/app/tabular-toonPDF from .toon text.
GET/app/statusHealth check with uptime.
POST/mcpMCP server (JSON-RPC 2.0) with report tools.
GET/docs · /openapi.jsonSwagger UI and OpenAPI schema.

The service is the HTTP/MCP layer over the library: it parses the payload, delegates rendering to isis-report-lib and streams the PDF back.